summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS6
-rw-r--r--COPYING479
-rw-r--r--INSTALL27
-rw-r--r--MAINTAINERS3
-rw-r--r--Makefile742
-rw-r--r--NEWS595
-rw-r--r--README61
-rw-r--r--THANKS191
-rw-r--r--apport/shotwell.py7
-rwxr-xr-xchkver119
-rwxr-xr-xconfigure201
-rw-r--r--help/C/edit-adjustments.page51
-rw-r--r--help/C/edit-crop.page46
-rw-r--r--help/C/edit-enhance.page17
-rw-r--r--help/C/edit-external.page54
-rw-r--r--help/C/edit-nondestructive.page22
-rw-r--r--help/C/edit-redeye.page26
-rw-r--r--help/C/edit-rotate.page27
-rw-r--r--help/C/edit-straighten.page28
-rw-r--r--help/C/edit-time-date.page21
-rw-r--r--help/C/edit-undo.page22
-rwxr-xr-xhelp/C/figures/crop_thirds.jpgbin0 -> 10579 bytes
-rw-r--r--help/C/figures/edit_toolbar.pngbin0 -> 6786 bytes
-rw-r--r--help/C/figures/editing_overview.pngbin0 -> 183110 bytes
-rw-r--r--help/C/figures/shotwell_logo.pngbin0 -> 3658 bytes
-rw-r--r--help/C/figures/trash_process.pngbin0 -> 38417 bytes
-rwxr-xr-xhelp/C/formats.page35
-rw-r--r--help/C/import-camera.page33
-rw-r--r--help/C/import-f-spot.page22
-rw-r--r--help/C/import-file.page24
-rw-r--r--help/C/import-memorycard.page32
-rw-r--r--help/C/index.page48
-rw-r--r--help/C/organize-event.page60
-rw-r--r--help/C/organize-flag.page35
-rw-r--r--help/C/organize-rating.page30
-rw-r--r--help/C/organize-remove.page45
-rw-r--r--help/C/organize-search.page63
-rw-r--r--help/C/organize-tag.page94
-rw-r--r--help/C/organize-title.page20
-rw-r--r--help/C/other-files.page146
-rw-r--r--help/C/other-missing.page23
-rw-r--r--help/C/other-multiple.page23
-rw-r--r--help/C/other-plugins.page29
-rw-r--r--help/C/raw.page46
-rw-r--r--help/C/running.page29
-rw-r--r--help/C/share-background.page23
-rw-r--r--help/C/share-export.page45
-rw-r--r--help/C/share-print.page24
-rw-r--r--help/C/share-send.page25
-rw-r--r--help/C/share-slideshow.page23
-rw-r--r--help/C/share-upload.page38
-rw-r--r--help/C/view-displaying.page28
-rw-r--r--help/C/view-information.page19
-rw-r--r--help/C/view-sidebar.page36
-rw-r--r--help/Makefile.am53
-rw-r--r--help/el/el.po2973
-rw-r--r--help/es/es.po2203
-rw-r--r--icons/all-rejected.pngbin0 -> 1993 bytes
-rw-r--r--icons/crop-pivot-reticle.pngbin0 -> 3301 bytes
-rw-r--r--icons/crop.svg57
-rw-r--r--icons/drag_nub.pngbin0 -> 261 bytes
-rw-r--r--icons/enhance.pngbin0 -> 9612 bytes
-rwxr-xr-xicons/filter-flagged.pngbin0 -> 3179 bytes
-rw-r--r--icons/filter-photos.pngbin0 -> 3176 bytes
-rw-r--r--icons/filter-raw.pngbin0 -> 4265 bytes
-rwxr-xr-xicons/filter-videos.pngbin0 -> 3627 bytes
-rw-r--r--icons/five-star-filter.svg432
-rw-r--r--icons/five-stars.svg314
-rw-r--r--icons/flag-page.pngbin0 -> 556 bytes
-rw-r--r--icons/flag-trinket.pngbin0 -> 578 bytes
-rw-r--r--icons/four-star-filter-plus.svg404
-rw-r--r--icons/four-stars.svg274
-rw-r--r--icons/generic-plugin.pngbin0 -> 3451 bytes
-rw-r--r--icons/image-adjust.svg369
-rw-r--r--icons/import-all.pngbin0 -> 6571 bytes
-rw-r--r--icons/import.svg55
-rw-r--r--icons/make-primary.svg13
-rw-r--r--icons/merge.svg33
-rw-r--r--icons/multiple-events.pngbin0 -> 3035 bytes
-rw-r--r--icons/multiple-tags.pngbin0 -> 3425 bytes
-rw-r--r--icons/no-event.pngbin0 -> 2994 bytes
-rw-r--r--icons/noninterpretable-video.pngbin0 -> 104459 bytes
-rw-r--r--icons/one-event.pngbin0 -> 2896 bytes
-rw-r--r--icons/one-star-filter-plus.svg322
-rw-r--r--icons/one-star.svg161
-rw-r--r--icons/one-tag.pngbin0 -> 3152 bytes
-rwxr-xr-xicons/pin-toolbar.svg528
-rw-r--r--icons/publish.pngbin0 -> 7209 bytes
-rw-r--r--icons/redeye.pngbin0 -> 5337 bytes
-rw-r--r--icons/rejected.svg453
-rw-r--r--icons/shotwell-16.svg161
-rw-r--r--icons/shotwell-24.svg200
-rw-r--r--icons/shotwell-street.jpgbin0 -> 29219 bytes
-rw-r--r--icons/shotwell.icobin0 -> 67646 bytes
-rw-r--r--icons/shotwell.svg237
-rwxr-xr-xicons/slideshow-extension-point.pngbin0 -> 3307 bytes
-rw-r--r--icons/sprocket.pngbin0 -> 231 bytes
-rw-r--r--icons/straighten.svg1238
-rw-r--r--icons/three-star-filter-plus.svg358
-rw-r--r--icons/three-stars.svg234
-rw-r--r--icons/two-star-filter-plus.svg328
-rw-r--r--icons/two-stars.svg194
-rw-r--r--icons/videos-page.pngbin0 -> 949 bytes
-rw-r--r--icons/zoom-in.pngbin0 -> 1458 bytes
-rw-r--r--icons/zoom-out.pngbin0 -> 1245 bytes
-rw-r--r--misc/org.yorba.shotwell-extras.gschema.xml38
-rw-r--r--misc/org.yorba.shotwell.gschema.xml689
-rw-r--r--misc/shotwell-viewer.desktop.head14
-rw-r--r--misc/shotwell.appdata.xml33
-rw-r--r--misc/shotwell.convert105
-rw-r--r--misc/shotwell.desktop.head15
-rw-r--r--plugins/Makefile33
-rw-r--r--plugins/Makefile.plugin.mk78
-rw-r--r--plugins/common/RESTSupport.vala1162
-rw-r--r--plugins/common/Resources.vala54
-rw-r--r--plugins/common/SqliteSupport.vala76
-rw-r--r--plugins/common/VersionNumber.vala50
-rw-r--r--plugins/plugins.mk33
-rw-r--r--plugins/shotwell-data-imports/FSpotDatabase.vala58
-rw-r--r--plugins/shotwell-data-imports/FSpotDatabaseBehavior.vala208
-rw-r--r--plugins/shotwell-data-imports/FSpotDatabaseTable.vala54
-rw-r--r--plugins/shotwell-data-imports/FSpotImporter.vala567
-rw-r--r--plugins/shotwell-data-imports/FSpotMetaTable.vala113
-rw-r--r--plugins/shotwell-data-imports/FSpotPhotoTagsTable.vala57
-rw-r--r--plugins/shotwell-data-imports/FSpotPhotoVersionsTable.vala271
-rw-r--r--plugins/shotwell-data-imports/FSpotPhotosTable.vala356
-rw-r--r--plugins/shotwell-data-imports/FSpotRollsTable.vala111
-rw-r--r--plugins/shotwell-data-imports/FSpotTableBehavior.vala28
-rw-r--r--plugins/shotwell-data-imports/FSpotTagsTable.vala129
-rw-r--r--plugins/shotwell-data-imports/Makefile30
-rw-r--r--plugins/shotwell-data-imports/f-spot-24.pngbin0 -> 1741 bytes
-rw-r--r--plugins/shotwell-data-imports/shotwell-data-imports.vala46
-rw-r--r--plugins/shotwell-publishing-extras/Makefile27
-rw-r--r--plugins/shotwell-publishing-extras/TumblrPublishing.vala1157
-rw-r--r--plugins/shotwell-publishing-extras/YandexPublishing.vala665
-rw-r--r--plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala42
-rw-r--r--plugins/shotwell-publishing-extras/tumblr.pngbin0 -> 1007 bytes
-rw-r--r--plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade132
-rw-r--r--plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade167
-rw-r--r--plugins/shotwell-publishing-extras/yandex_publish_model.glade175
-rw-r--r--plugins/shotwell-publishing/FacebookPublishing.vala1676
-rw-r--r--plugins/shotwell-publishing/FlickrPublishing.vala1371
-rw-r--r--plugins/shotwell-publishing/Makefile39
-rw-r--r--plugins/shotwell-publishing/PicasaPublishing.vala940
-rw-r--r--plugins/shotwell-publishing/PiwigoPublishing.vala1736
-rw-r--r--plugins/shotwell-publishing/YouTubePublishing.vala627
-rw-r--r--plugins/shotwell-publishing/facebook.pngbin0 -> 916 bytes
-rw-r--r--plugins/shotwell-publishing/facebook_publishing_options_pane.glade243
-rw-r--r--plugins/shotwell-publishing/flickr.pngbin0 -> 689 bytes
-rw-r--r--plugins/shotwell-publishing/flickr_pin_entry_pane.glade101
-rw-r--r--plugins/shotwell-publishing/flickr_publishing_options_pane.glade183
-rw-r--r--plugins/shotwell-publishing/picasa.pngbin0 -> 1249 bytes
-rw-r--r--plugins/shotwell-publishing/picasa_publishing_options_pane.glade263
-rw-r--r--plugins/shotwell-publishing/piwigo.pngbin0 -> 3148 bytes
-rw-r--r--plugins/shotwell-publishing/piwigo_authentication_pane.glade175
-rw-r--r--plugins/shotwell-publishing/piwigo_publishing_options_pane.glade314
-rw-r--r--plugins/shotwell-publishing/shotwell-publishing.vala50
-rw-r--r--plugins/shotwell-publishing/youtube.pngbin0 -> 1083 bytes
-rw-r--r--plugins/shotwell-publishing/youtube_publishing_options_pane.glade137
-rw-r--r--plugins/shotwell-transitions/BlindsEffect.vala96
-rw-r--r--plugins/shotwell-transitions/ChessEffect.vala88
-rw-r--r--plugins/shotwell-transitions/CircleEffect.vala71
-rw-r--r--plugins/shotwell-transitions/CirclesEffect.vala86
-rw-r--r--plugins/shotwell-transitions/ClockEffect.vala83
-rw-r--r--plugins/shotwell-transitions/CrumbleEffect.vala103
-rw-r--r--plugins/shotwell-transitions/FadeEffect.vala70
-rw-r--r--plugins/shotwell-transitions/Makefile21
-rw-r--r--plugins/shotwell-transitions/SlideEffect.vala75
-rw-r--r--plugins/shotwell-transitions/SquaresEffect.vala86
-rw-r--r--plugins/shotwell-transitions/StripesEffect.vala84
-rw-r--r--plugins/shotwell-transitions/shotwell-transitions.vala90
-rwxr-xr-xplugins/shotwell-transitions/slideshow-plugin.pngbin0 -> 3520 bytes
-rw-r--r--po/LINGUAS62
-rw-r--r--po/POTFILES.in222
-rw-r--r--po/POTFILES.skip0
-rw-r--r--po/af.po4250
-rw-r--r--po/ar.po4845
-rw-r--r--po/as.po4738
-rw-r--r--po/ast.po4447
-rw-r--r--po/bg.po4431
-rw-r--r--po/bn.po4367
-rw-r--r--po/bn_IN.po4407
-rw-r--r--po/ca.po4599
-rw-r--r--po/cs.po4757
-rw-r--r--po/da.po4514
-rw-r--r--po/de.po4676
-rw-r--r--po/el.po4815
-rw-r--r--po/en_GB.po4557
-rw-r--r--po/eo.po146
-rw-r--r--po/es.po4630
-rw-r--r--po/et.po4564
-rw-r--r--po/eu.po4624
-rw-r--r--po/fi.po4560
-rw-r--r--po/fr.po4755
-rw-r--r--po/gl.po4692
-rw-r--r--po/gu.po4551
-rw-r--r--po/he.po4552
-rw-r--r--po/hi.po4547
-rw-r--r--po/hr.po4565
-rw-r--r--po/hu.po4732
-rw-r--r--po/ia.po3883
-rw-r--r--po/id.po4591
-rw-r--r--po/it.po4619
-rw-r--r--po/ja.po4523
-rw-r--r--po/kk.po4489
-rw-r--r--po/km.po3882
-rw-r--r--po/kn.po4295
-rw-r--r--po/ko.po4481
-rw-r--r--po/ky.po4191
-rw-r--r--po/lt.po4753
-rw-r--r--po/lv.po4645
-rw-r--r--po/mk.po4514
-rw-r--r--po/ml.po4559
-rw-r--r--po/mr.po4512
-rw-r--r--po/nb.po4597
-rw-r--r--po/nl.po4621
-rw-r--r--po/nn.po4381
-rw-r--r--po/or.po4532
-rw-r--r--po/pa.po4553
-rw-r--r--po/pl.po4833
-rw-r--r--po/pt.po4609
-rw-r--r--po/pt_BR.po4720
-rw-r--r--po/ro.po4758
-rw-r--r--po/ru.po4715
-rw-r--r--po/sk.po4714
-rw-r--r--po/sl.po4813
-rw-r--r--po/sr.po4678
-rw-r--r--po/sv.po4605
-rw-r--r--po/ta.po4877
-rw-r--r--po/te.po4718
-rw-r--r--po/th.po4354
-rw-r--r--po/tr.po4594
-rw-r--r--po/uk.po4912
-rw-r--r--po/vi.po4344
-rw-r--r--po/zh_CN.po4589
-rw-r--r--po/zh_HK.po4533
-rw-r--r--po/zh_TW.po4558
-rw-r--r--settings-migrator/shotwell-settings-migrator33
-rw-r--r--shotwell-plugin-dev-1.0.m411
-rw-r--r--src/AppDirs.vala285
-rw-r--r--src/AppWindow.vala961
-rw-r--r--src/Application.vala228
-rw-r--r--src/BatchImport.vala2051
-rw-r--r--src/Box.vala403
-rw-r--r--src/CheckerboardLayout.vala1872
-rw-r--r--src/CollectionPage.vala765
-rw-r--r--src/ColorTransformation.vala1519
-rw-r--r--src/CommandManager.vala201
-rw-r--r--src/Commands.vala2497
-rw-r--r--src/CustomComponents.vala513
-rw-r--r--src/Debug.vala146
-rw-r--r--src/DesktopIntegration.vala308
-rw-r--r--src/Dialogs.vala2714
-rw-r--r--src/Dimensions.vala732
-rw-r--r--src/DirectoryMonitor.vala1454
-rw-r--r--src/Event.vala924
-rw-r--r--src/Exporter.vala343
-rw-r--r--src/International.vala32
-rw-r--r--src/LibraryFiles.vala104
-rw-r--r--src/LibraryMonitor.vala1013
-rw-r--r--src/MediaDataRepresentation.vala899
-rw-r--r--src/MediaInterfaces.vala215
-rw-r--r--src/MediaMetadata.vala128
-rw-r--r--src/MediaMonitor.vala418
-rw-r--r--src/MediaPage.vala1308
-rw-r--r--src/MediaViewTracker.vala114
-rw-r--r--src/MetadataWriter.vala675
-rw-r--r--src/Orientation.vala493
-rw-r--r--src/Page.vala2589
-rw-r--r--src/Photo.vala5381
-rw-r--r--src/PhotoMonitor.vala1156
-rw-r--r--src/PhotoPage.vala3361
-rw-r--r--src/PixbufCache.vala360
-rw-r--r--src/Printing.vala1156
-rw-r--r--src/Properties.vala700
-rw-r--r--src/Resources.vala1143
-rw-r--r--src/Screensaver.vala29
-rw-r--r--src/SearchFilter.vala1252
-rw-r--r--src/SlideshowPage.vala466
-rw-r--r--src/SortedList.vala429
-rw-r--r--src/Tag.vala1189
-rw-r--r--src/Thumbnail.vala400
-rw-r--r--src/ThumbnailCache.vala619
-rw-r--r--src/TimedQueue.vala284
-rw-r--r--src/Tombstone.vala336
-rw-r--r--src/UnityProgressBar.vala83
-rw-r--r--src/Upgrades.vala115
-rw-r--r--src/VideoMetadata.vala655
-rw-r--r--src/VideoMonitor.vala301
-rw-r--r--src/VideoSupport.vala1188
-rw-r--r--src/camera/Branch.vala116
-rw-r--r--src/camera/Camera.vala18
-rw-r--r--src/camera/CameraTable.vala417
-rw-r--r--src/camera/GPhoto.vala367
-rw-r--r--src/camera/ImportPage.vala1799
-rw-r--r--src/camera/mk/camera.mk32
-rw-r--r--src/config/Config.vala155
-rw-r--r--src/config/ConfigurationInterfaces.vala1609
-rw-r--r--src/config/GSettingsEngine.vala469
-rw-r--r--src/config/mk/config.mk29
-rw-r--r--src/core/Alteration.vala316
-rw-r--r--src/core/ContainerSourceCollection.vala237
-rw-r--r--src/core/Core.vala29
-rw-r--r--src/core/DataCollection.vala623
-rw-r--r--src/core/DataObject.vala137
-rw-r--r--src/core/DataSet.vala183
-rw-r--r--src/core/DataSource.vala679
-rw-r--r--src/core/DataSourceTypes.vala108
-rw-r--r--src/core/DataView.vala132
-rw-r--r--src/core/DataViewTypes.vala50
-rw-r--r--src/core/DatabaseSourceCollection.vala86
-rw-r--r--src/core/SourceCollection.vala221
-rw-r--r--src/core/SourceHoldingTank.vala209
-rw-r--r--src/core/SourceInterfaces.vala44
-rw-r--r--src/core/Tracker.vala216
-rw-r--r--src/core/ViewCollection.vala1287
-rw-r--r--src/core/mk/core.mk43
-rw-r--r--src/core/util.vala196
-rw-r--r--src/data_imports/DataImportJob.vala177
-rw-r--r--src/data_imports/DataImportSource.vala135
-rw-r--r--src/data_imports/DataImports.vala30
-rw-r--r--src/data_imports/DataImportsPluginHost.vala482
-rw-r--r--src/data_imports/DataImportsUI.vala445
-rw-r--r--src/data_imports/mk/data_imports.mk31
-rw-r--r--src/db/DatabaseTable.vala384
-rw-r--r--src/db/Db.vala366
-rw-r--r--src/db/EventTable.vala235
-rw-r--r--src/db/PhotoTable.vala1245
-rw-r--r--src/db/SavedSearchDBTable.vala641
-rw-r--r--src/db/TagTable.vala248
-rw-r--r--src/db/TombstoneTable.vala146
-rw-r--r--src/db/VersionTable.vala98
-rw-r--r--src/db/VideoTable.vala462
-rw-r--r--src/db/mk/db.mk35
-rw-r--r--src/direct/Direct.vala35
-rw-r--r--src/direct/DirectPhoto.vala316
-rw-r--r--src/direct/DirectPhotoPage.vala580
-rw-r--r--src/direct/DirectView.vala50
-rw-r--r--src/direct/DirectWindow.vala98
-rw-r--r--src/direct/mk/direct.mk36
-rw-r--r--src/editing_tools/EditingTools.vala2934
-rw-r--r--src/editing_tools/StraightenTool.vala559
-rw-r--r--src/editing_tools/mk/editing_tools.mk28
-rw-r--r--src/events/Branch.vala542
-rw-r--r--src/events/EventDirectoryItem.vala189
-rw-r--r--src/events/EventPage.vala162
-rw-r--r--src/events/Events.vala18
-rw-r--r--src/events/EventsDirectoryPage.vala313
-rw-r--r--src/events/mk/events.mk32
-rw-r--r--src/folders/Branch.vala198
-rw-r--r--src/folders/Folders.vala35
-rw-r--r--src/folders/Page.vala41
-rw-r--r--src/folders/mk/folders.mk31
-rw-r--r--src/library/Branch.vala54
-rw-r--r--src/library/FlaggedBranch.vala61
-rw-r--r--src/library/FlaggedPage.vala54
-rw-r--r--src/library/ImportQueueBranch.vala74
-rw-r--r--src/library/ImportQueuePage.vala208
-rw-r--r--src/library/LastImportBranch.vala47
-rw-r--r--src/library/LastImportPage.vala79
-rw-r--r--src/library/Library.vala19
-rw-r--r--src/library/LibraryWindow.vala1587
-rw-r--r--src/library/OfflineBranch.vala51
-rw-r--r--src/library/OfflinePage.vala130
-rw-r--r--src/library/TrashBranch.vala73
-rw-r--r--src/library/TrashPage.vala120
-rw-r--r--src/library/mk/library.mk54
-rw-r--r--src/main.vala441
-rw-r--r--src/photos/BmpSupport.vala184
-rw-r--r--src/photos/GRaw.vala307
-rw-r--r--src/photos/GdkSupport.vala129
-rw-r--r--src/photos/JfifSupport.vala236
-rw-r--r--src/photos/PhotoFileAdapter.vala112
-rw-r--r--src/photos/PhotoFileFormat.vala410
-rw-r--r--src/photos/PhotoFileSniffer.vala90
-rw-r--r--src/photos/PhotoMetadata.vala1169
-rw-r--r--src/photos/Photos.vala31
-rw-r--r--src/photos/PngSupport.vala181
-rw-r--r--src/photos/RawSupport.vala347
-rw-r--r--src/photos/TiffSupport.vala180
-rw-r--r--src/photos/mk/photos.mk38
-rw-r--r--src/plugins/DataImportsInterfaces.vala489
-rw-r--r--src/plugins/ManifestWidget.vala282
-rw-r--r--src/plugins/Plugins.vala436
-rw-r--r--src/plugins/PublishingInterfaces.vala605
-rw-r--r--src/plugins/SpitInterfaces.vala367
-rw-r--r--src/plugins/StandardHostInterface.vala84
-rw-r--r--src/plugins/TransitionsInterfaces.vala300
-rw-r--r--src/plugins/mk/interfaces.mk29
-rw-r--r--src/plugins/mk/plugins.mk35
-rw-r--r--src/publishing/APIGlue.vala133
-rw-r--r--src/publishing/Publishing.vala24
-rw-r--r--src/publishing/PublishingPluginHost.vala238
-rw-r--r--src/publishing/PublishingUI.vala552
-rw-r--r--src/publishing/mk/publishing.mk31
-rw-r--r--src/searches/Branch.vala150
-rw-r--r--src/searches/SavedSearchDialog.vala829
-rw-r--r--src/searches/SavedSearchPage.vala92
-rw-r--r--src/searches/SearchBoolean.vala971
-rw-r--r--src/searches/Searches.vala31
-rw-r--r--src/searches/mk/searches.mk31
-rw-r--r--src/sidebar/Branch.vala450
-rw-r--r--src/sidebar/Entry.vala70
-rw-r--r--src/sidebar/Sidebar.vala16
-rw-r--r--src/sidebar/Tree.vala1175
-rw-r--r--src/sidebar/common.vala114
-rw-r--r--src/sidebar/mk/sidebar.mk31
-rw-r--r--src/slideshow/Slideshow.vala32
-rw-r--r--src/slideshow/TransitionEffects.vala351
-rw-r--r--src/slideshow/mk/slideshow.mk29
-rw-r--r--src/tags/Branch.vala310
-rw-r--r--src/tags/HierarchicalTagIndex.vala90
-rw-r--r--src/tags/HierarchicalTagUtilities.vala184
-rw-r--r--src/tags/TagPage.vala125
-rw-r--r--src/tags/Tags.vala18
-rw-r--r--src/tags/mk/tags.mk32
-rw-r--r--src/threads/BackgroundJob.vala243
-rw-r--r--src/threads/Semaphore.vala160
-rw-r--r--src/threads/Threads.vala14
-rw-r--r--src/threads/Workers.vala104
-rw-r--r--src/threads/mk/threads.mk30
-rw-r--r--src/unit/Unit.vala14
-rw-r--r--src/unit/mk/unit.mk32
-rw-r--r--src/unit/rc/Unit.m429
-rw-r--r--src/unit/rc/UnitInternals.m432
-rw-r--r--src/unit/rc/template.mk27
-rw-r--r--src/unit/rc/template.vala7
-rw-r--r--src/unit/rc/unitize_entry.m419
-rw-r--r--src/util/KeyValueMap.vala118
-rw-r--r--src/util/Util.vala17
-rw-r--r--src/util/file.vala241
-rw-r--r--src/util/image.vala364
-rw-r--r--src/util/misc.vala377
-rw-r--r--src/util/mk/util.mk34
-rw-r--r--src/util/string.vala268
-rw-r--r--src/util/system.vala40
-rw-r--r--src/util/ui.vala98
-rw-r--r--thumbnailer/shotwell-video-thumbnailer.vala133
-rw-r--r--ui/collection.ui51
-rw-r--r--ui/direct.ui70
-rw-r--r--ui/direct_context.ui10
-rw-r--r--ui/event.ui25
-rw-r--r--ui/events_directory.ui63
-rw-r--r--ui/fullscreen.ui6
-rw-r--r--ui/import.ui65
-rw-r--r--ui/import_queue.ui34
-rw-r--r--ui/media.ui125
-rw-r--r--ui/offline.ui69
-rw-r--r--ui/photo.ui128
-rw-r--r--ui/photo_context.ui39
-rw-r--r--ui/savedsearch.ui8
-rw-r--r--ui/search_bar.ui12
-rw-r--r--ui/search_sidebar_context.ui6
-rw-r--r--ui/set_background_dialog.glade133
-rw-r--r--ui/shotwell.glade1714
-rw-r--r--ui/shotwell.xml10
-rw-r--r--ui/sidebar_default_context.ui7
-rw-r--r--ui/tag_sidebar_context.ui6
-rw-r--r--ui/tags.ui25
-rw-r--r--ui/top.ui12
-rw-r--r--ui/trash.ui82
-rw-r--r--unitize.mk29
-rw-r--r--units.mk35
-rw-r--r--vapi/ExtendedPosix.vapi18
-rw-r--r--vapi/LConv.vapi45
-rw-r--r--vapi/gphoto-2.4/libgphoto2.vapi487
-rw-r--r--vapi/gphoto-2.5/libgphoto2.vapi495
-rw-r--r--vapi/gphoto.h18
-rw-r--r--vapi/libexif.vapi340
-rw-r--r--vapi/libraw.vapi268
-rw-r--r--vapi/unique-3.0.deps8
-rw-r--r--vapi/unique-3.0.vapi94
-rw-r--r--vapi/unity.deps6
-rw-r--r--vapi/unity.vapi438
-rw-r--r--vapi/webkitgtk-3.0.deps8
-rw-r--r--vapi/webkitgtk-3.0.vapi653
476 files changed, 401128 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..441b99d
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,6 @@
+Jim Nelson <jim@yorba.org>
+Lucas Beeler <lucas@yorba.org>
+Allison Barlow <allison@yorba.org>
+Eric Gregory <eric@yorba.org>
+Clinton Rogers <clinton@yorba.org>
+
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..be4b291
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,479 @@
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+Some of Shotwell's icons are copyright their respective authors:
+
+ * Human
+ https://launchpad.net/human-icon-theme
+ Licensed under Creative Commons Attribution ShareAlike 3.0
+
+ * Breathe Icon Set
+ https://launchpad.net/breathe-icon-set
+ Licensed under Creative Commons Attribution ShareAlike 3.0
+
+ * gnome-icon-theme
+ http://git.gnome.org/browse/gnome-icon-theme
+ Licensed under Creative Commons Attribution ShareAlike 3.0
+
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..8c80631
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,27 @@
+
+ Shotwell Installation
+ ---------------------
+
+ To build and install Shotwell, type the following commands:
+
+ $ ./configure
+ $ make
+ $ make install
+
+ * By default, Shotwell will install under /usr/local. The configure script
+ can customize the prefix directory. Run ./configure --help for
+ instructions and other installation options.
+
+ * You may need to execute "make install" as root (i.e. sudo make install)
+ if installing to system directories.
+
+ * If you wish to try Shotwell before installing it, you may execute it
+ directly from its build directory. Note that certain desktop integration
+ (such as being listed in an application menu) requires full installation.
+
+ Once installed, Shotwell will be available on your desktop Applications
+ menu under Graphics or Photography.
+
+
+ Copyright 2009-2014 Yorba Foundation
+
diff --git a/MAINTAINERS b/MAINTAINERS
new file mode 100644
index 0000000..712c23b
--- /dev/null
+++ b/MAINTAINERS
@@ -0,0 +1,3 @@
+Jim Nelson
+email: jim@yorba.org
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..18f1e02
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,742 @@
+PROGRAM = shotwell
+PROGRAM_THUMBNAILER = shotwell-video-thumbnailer
+PROGRAM_MIGRATOR = shotwell-settings-migrator
+
+VERSION = 0.18.1
+GITVER := $(shell git log -n 1 2>/dev/null | head -n 1 | awk '{print $$2}')
+GETTEXT_PACKAGE = $(PROGRAM)
+BUILD_ROOT = 1
+
+ifndef VALAC
+VALAC := $(shell which valac)
+else
+VALAC := $(shell which $(VALAC))
+endif
+
+VALAC_VERSION := `$(VALAC) --version | awk '{print $$2}'`
+MIN_VALAC_VERSION := 0.20.1
+INSTALL_PROGRAM := install
+INSTALL_DATA := install -m 644
+
+export MIN_GLIB_VERSION=2.30.0
+
+# defaults that may be overridden by configure.mk
+PREFIX=/usr/local
+BUILD_RELEASE=1
+LIB=lib
+
+-include configure.mk
+ifndef LIBEXECDIR
+LIBEXECDIR=$(PREFIX)/libexec/shotwell
+endif
+
+CORE_SUPPORTED_LANGUAGES=$(shell cat po/LINGUAS)
+
+LOCAL_LANG_DIR=locale-langpack
+SYSTEM_LANG_DIR := $(DESTDIR)$(PREFIX)/share/locale
+
+VALAFLAGS := -g --enable-checking --target-glib=2.32 --thread --fatal-warnings --enable-experimental --enable-deprecated $(USER_VALAFLAGS)
+ifdef UNITY_SUPPORT
+VALAFLAGS := $(VALAFLAGS) --define UNITY_SUPPORT
+endif
+
+ifdef WITH_GPHOTO_25
+VALAFLAGS := $(VALAFLAGS) --define WITH_GPHOTO_25
+endif
+
+DEFINES := _PREFIX='"$(PREFIX)"' _VERSION='"$(VERSION)"' GETTEXT_PACKAGE='"$(GETTEXT_PACKAGE)"' \
+ _LANG_SUPPORT_DIR='"$(SYSTEM_LANG_DIR)"' _LIB='"${LIB}"' _LIBEXECDIR='"$(LIBEXECDIR)"'
+
+ifdef GITVER
+DEFINES := $(DEFINES) _GIT_VERSION='"$(GITVER)"'
+VALAFLAGS := $(VALAFLAGS) --define=_GITVERSION
+endif
+
+EXPORT_FLAGS = -export-dynamic
+
+include units.mk
+include plugins/plugins.mk
+
+UNUNITIZED_SRC_FILES = \
+ main.vala \
+ AppWindow.vala \
+ CollectionPage.vala \
+ Thumbnail.vala \
+ ThumbnailCache.vala \
+ CheckerboardLayout.vala \
+ PhotoPage.vala \
+ Page.vala \
+ SortedList.vala \
+ Dimensions.vala \
+ Box.vala \
+ Photo.vala \
+ Orientation.vala \
+ BatchImport.vala \
+ Dialogs.vala \
+ Resources.vala \
+ Debug.vala \
+ ColorTransformation.vala \
+ Properties.vala \
+ CustomComponents.vala \
+ Event.vala \
+ International.vala \
+ AppDirs.vala \
+ PixbufCache.vala \
+ CommandManager.vala \
+ Commands.vala \
+ SlideshowPage.vala \
+ LibraryFiles.vala \
+ Printing.vala \
+ Tag.vala \
+ Screensaver.vala \
+ Exporter.vala \
+ DirectoryMonitor.vala \
+ LibraryMonitor.vala \
+ VideoSupport.vala \
+ Tombstone.vala \
+ MetadataWriter.vala \
+ Application.vala \
+ TimedQueue.vala \
+ MediaPage.vala \
+ MediaDataRepresentation.vala \
+ DesktopIntegration.vala \
+ MediaInterfaces.vala \
+ MediaMetadata.vala \
+ VideoMetadata.vala \
+ MediaMonitor.vala \
+ PhotoMonitor.vala \
+ VideoMonitor.vala \
+ SearchFilter.vala \
+ MediaViewTracker.vala \
+ UnityProgressBar.vala \
+ Upgrades.vala
+
+THUMBNAILER_SRC_FILES = \
+ shotwell-video-thumbnailer.vala
+
+VAPI_FILES = \
+ ExtendedPosix.vapi \
+ LConv.vapi \
+ libexif.vapi \
+ libraw.vapi \
+ webkitgtk-3.0.vapi \
+ unique-3.0.vapi \
+ unity.vapi
+
+DEPS_FILES = \
+ webkitgtk-3.0.deps \
+ unique-3.0.deps \
+ unity.deps
+
+ifdef WITH_GPHOTO_25
+GPHOTO_VAPI_FILE = vapi/gphoto-2.5/libgphoto2.vapi
+else
+GPHOTO_VAPI_FILE = vapi/gphoto-2.4/libgphoto2.vapi
+endif
+
+RESOURCE_FILES = \
+ collection.ui \
+ direct.ui \
+ direct_context.ui \
+ events_directory.ui \
+ event.ui \
+ fullscreen.ui \
+ import_queue.ui \
+ import.ui \
+ media.ui \
+ offline.ui \
+ photo.ui \
+ photo_context.ui \
+ savedsearch.ui \
+ search_bar.ui \
+ search_sidebar_context.ui \
+ set_background_dialog.glade \
+ shotwell.glade \
+ shotwell.xml \
+ sidebar_default_context.ui \
+ tag_sidebar_context.ui \
+ tags.ui \
+ top.ui \
+ trash.ui
+
+SYS_INTEGRATION_FILES = \
+ shotwell.appdata.xml \
+ shotwell.desktop.head \
+ shotwell-viewer.desktop.head \
+ org.yorba.shotwell.gschema.xml \
+ org.yorba.shotwell-extras.gschema.xml \
+ shotwell.convert
+
+SCHEMA_FILES := $(shell ls misc/*.gschema.xml)
+
+SRC_HEADER_FILES = \
+ gphoto.h
+
+TEXT_FILES = \
+ AUTHORS \
+ COPYING \
+ INSTALL \
+ MAINTAINERS \
+ NEWS \
+ README \
+ THANKS
+
+ICON_FILES = \
+ all-rejected.png \
+ crop-pivot-reticle.png \
+ crop.svg \
+ drag_nub.png \
+ enhance.png \
+ five-star-filter.svg \
+ five-stars.svg \
+ flag-page.png \
+ flag-trinket.png \
+ four-star-filter-plus.svg \
+ four-stars.svg \
+ image-adjust.svg \
+ import-all.png \
+ import.svg \
+ make-primary.svg \
+ merge.svg \
+ multiple-events.png \
+ multiple-tags.png \
+ no-event.png \
+ noninterpretable-video.png \
+ one-event.png \
+ one-star-filter-plus.svg \
+ one-star.svg \
+ one-tag.png \
+ pin-toolbar.svg \
+ publish.png \
+ redeye.png \
+ rejected.svg \
+ shotwell-16.svg \
+ shotwell-24.svg \
+ shotwell.ico \
+ shotwell-street.jpg \
+ shotwell.svg \
+ sprocket.png \
+ straighten.svg \
+ three-star-filter-plus.svg \
+ three-stars.svg \
+ two-star-filter-plus.svg \
+ two-stars.svg \
+ videos-page.png \
+ zoom-in.png \
+ zoom-out.png \
+ slideshow-extension-point.png \
+ generic-plugin.png \
+ filter-raw.png \
+ filter-photos.png \
+ filter-videos.png \
+ filter-flagged.png
+
+VAPI_DIRS = \
+ ./vapi
+
+ifdef WITH_GPHOTO_25
+VAPI_DIRS += ./vapi/gphoto-2.5
+else
+VAPI_DIRS += ./vapi/gphoto-2.4
+endif
+
+
+HEADER_DIRS = \
+ ./vapi
+
+LOCAL_PKGS = \
+ ExtendedPosix \
+ posix \
+ LConv
+
+EXT_PKGS = \
+ atk \
+ gdk-3.0 \
+ gee-0.8 \
+ gexiv2 \
+ gio-unix-2.0 \
+ glib-2.0 \
+ gmodule-2.0 \
+ gstreamer-1.0 \
+ gstreamer-base-1.0 \
+ gstreamer-pbutils-1.0 \
+ gtk+-3.0 \
+ gudev-1.0 \
+ libexif \
+ libgphoto2 \
+ json-glib-1.0 \
+ libraw \
+ libsoup-2.4 \
+ libxml-2.0 \
+ sqlite3 \
+ webkitgtk-3.0
+ifdef UNITY_SUPPORT
+EXT_PKGS += unity
+endif
+
+THUMBNAILER_PKGS = \
+ gtk+-3.0 \
+ gee-0.8 \
+ gstreamer-1.0 \
+ gstreamer-base-1.0
+
+DIRECT_LIBS =
+
+EXT_PKG_VERSIONS = \
+ gee-0.8 >= 0.8.5 \
+ gexiv2 >= 0.4.90 \
+ gio-unix-2.0 >= 2.20 \
+ glib-2.0 >= $(MIN_GLIB_VERSION) \
+ gmodule-2.0 >= 2.24.0 \
+ gstreamer-1.0 >= 1.0.0 \
+ gstreamer-base-1.0 >= 1.0.0 \
+ gstreamer-plugins-base-1.0 >= 1.0.0 \
+ gstreamer-pbutils-1.0 >= 1.0.0 \
+ gtk+-3.0 >= 3.6.0 \
+ gudev-1.0 >= 145 \
+ libexif >= 0.6.16 \
+ libgphoto2 >= 2.4.2 \
+ libraw >= 0.13.2 \
+ libsoup-2.4 >= 2.26.0 \
+ libxml-2.0 >= 2.6.32 \
+ rest-0.7 >= 0.7 \
+ sqlite3 >= 3.5.9 \
+ webkitgtk-3.0 >= 1.4.0 \
+ gnome-doc-utils
+
+DIRECT_LIBS_VERSIONS =
+
+VALA_PKGS = $(EXT_PKGS) $(LOCAL_PKGS)
+
+ifndef BUILD_DIR
+BUILD_DIR=src
+endif
+
+DESKTOP_APP_SHORT_NAME="Shotwell"
+DESKTOP_APP_FULL_NAME="Shotwell Photo Manager"
+DESKTOP_APPLICATION_COMMENT="Organize your photos"
+DESKTOP_APPLICATION_CLASS="Photo Manager"
+DESKTOP_APP_KEYWORDS="album;camera;cameras;crop;edit;enhance;export;gallery;image;images;import;organize;photo;photographs;photos;picture;pictures;photography;print;publish;rotate;share;tags;video;facebook;flickr;picasa;youtube;piwigo;"
+DIRECT_EDIT_DESKTOP_APP_SHORT_NAME="Shotwell"
+DIRECT_EDIT_DESKTOP_APP_FULL_NAME="Shotwell Photo Viewer"
+DIRECT_EDIT_DESKTOP_APPLICATION_CLASS="Photo Viewer"
+TEMPORARY_DESKTOP_FILES = misc/shotwell.desktop misc/shotwell-viewer.desktop
+
+# for help page and translation .po files
+include help/Makefile.am
+
+# Process the units
+UNIT_MKS := $(foreach unit,$(UNITS),src/$(unit)/mk/$(notdir $(unit)).mk)
+include $(UNIT_MKS)
+
+UNITIZE_DIR := src/.unitize
+UNITIZE_ENTRIES := $(foreach unit,$(APP_UNITS),$(UNITIZE_DIR)/_$(unit)_unitize_entry.vala)
+UNITIZE_INITS := $(foreach nm,$(UNIT_NAMESPACES),$(UNITIZE_DIR)/_$(nm)Internals.vala)
+UNITIZE_STAMP := $(UNITIZE_DIR)/.unitized
+
+PLUGINS_DIR := plugins
+PLUGINS_SO := $(foreach plugin,$(PLUGINS),$(PLUGINS_DIR)/$(plugin)/$(plugin).so)
+EXTRA_PLUGINS_SO := $(foreach plugin,$(EXTRA_PLUGINS),$(PLUGINS_DIR)/$(plugin)/$(plugin).so)
+PLUGINS_DIST_FILES := `$(MAKE) --directory=plugins --no-print-directory listfiles`
+
+THUMBNAILER_DIR := thumbnailer
+THUMBNAILER_BIN := $(THUMBNAILER_DIR)/$(PROGRAM_THUMBNAILER)
+EXPANDED_THUMBNAILER_SRC_FILES := $(foreach file, $(THUMBNAILER_SRC_FILES), $(THUMBNAILER_DIR)/$(file))
+
+MIGRATOR_DIR := settings-migrator
+MIGRATOR_BIN := $(MIGRATOR_DIR)/$(PROGRAM_MIGRATOR)
+
+EXPANDED_CORE_PO_FILES := $(foreach po,$(CORE_SUPPORTED_LANGUAGES),po/$(po).po)
+
+EXPANDED_SRC_FILES := $(UNITIZED_SRC_FILES) $(foreach src,$(UNUNITIZED_SRC_FILES),src/$(src)) \
+ $(UNITIZE_INITS) $(UNITIZE_ENTRIES)
+EXPANDED_DIST_SRC_FILES := $(UNITIZED_SRC_FILES) $(foreach src,$(UNUNITIZED_SRC_FILES),src/$(src))
+EXPANDED_C_FILES := $(foreach file,$(subst src,$(BUILD_DIR),$(EXPANDED_SRC_FILES)),$(file:.vala=.c))
+EXPANDED_OBJ_FILES := $(foreach file,$(subst src,$(BUILD_DIR),$(EXPANDED_SRC_FILES)),$(file:.vala=.o))
+EXPANDED_SYS_INTEGRATION_FILES := $(foreach file,$(SYS_INTEGRATION_FILES),misc/$(file))
+EXPANDED_ICON_FILES := $(foreach file,$(ICON_FILES),icons/$(file))
+EXPANDED_VAPI_FILES := $(foreach vapi,$(VAPI_FILES),vapi/$(vapi))
+EXPANDED_DEPS_FILES := $(foreach deps,$(DEPS_FILES),vapi/$(deps))
+EXPANDED_SRC_HEADER_FILES := $(foreach header,$(SRC_HEADER_FILES),vapi/$(header))
+EXPANDED_RESOURCE_FILES := $(foreach res,$(RESOURCE_FILES),ui/$(res))
+EXPANDED_DOC_IMAGES := $(foreach file,$(DOC_IMAGES),help/C/figures/$(file))
+EXPANDED_DOC_PAGES := $(foreach page,$(DOC_PAGES),help/C/$(page))
+EXPANDED_DOC_PO := $(foreach lang,$(DOC_LINGUAS),help/$(lang)/$(lang).po)
+EXPANDED_XLAT_DOC_PAGES := \
+ $(foreach lang,$(DOC_LINGUAS),\
+ $(foreach page,$(DOC_PAGES),help/$(lang)/$(page)))
+VALA_STAMP := $(BUILD_DIR)/.stamp
+LANG_STAMP := $(LOCAL_LANG_DIR)/.langstamp
+DOC_LANG_STAMP := help/.langstamp
+MAKE_FILES := Makefile $(CONFIG_IN) $(UNIT_MKS) unitize.mk units.mk
+PC_INPUT := shotwell-plugin-dev-1.0.m4
+PC_FILE := $(PC_INPUT:.m4=.pc)
+
+DIST_FILES = Makefile configure chkver $(EXPANDED_DIST_SRC_FILES) $(EXPANDED_VAPI_FILES) \
+ $(EXPANDED_DEPS_FILES) $(EXPANDED_SRC_HEADER_FILES) $(EXPANDED_RESOURCE_FILES) $(TEXT_FILES) \
+ $(EXPANDED_ICON_FILES) $(EXPANDED_SYS_INTEGRATION_FILES) $(EXPANDED_CORE_PO_FILES) \
+ po/LINGUAS po/POTFILES.in po/POTFILES.skip \
+ $(EXPANDED_DOC_PAGES) $(EXPANDED_DOC_IMAGES) $(EXPANDED_DOC_PO) help/Makefile.am \
+ apport/shotwell.py $(UNIT_RESOURCES) $(UNIT_MKS) \
+ unitize.mk units.mk $(PC_INPUT) $(PLUGINS_DIST_FILES) \
+ vapi/gphoto-2.5/libgphoto2.vapi vapi/gphoto-2.4/libgphoto2.vapi \
+ $(EXPANDED_THUMBNAILER_SRC_FILES) $(MIGRATOR_BIN)
+
+DIST_TAR = $(PROGRAM)-$(VERSION).tar
+DIST_TAR_XZ = $(DIST_TAR).xz
+PACKAGE_ORIG_XZ = $(PROGRAM)_`parsechangelog | grep Version | sed 's/.*: //'`.orig.tar.xz
+
+VALAFLAGS := $(VALAFLAGS) $(VALA_DEFINES) --vapidir=plugins/
+
+VALA_CFLAGS := `pkg-config --cflags $(EXT_PKGS) $(DIRECT_LIBS) gthread-2.0` \
+ $(foreach hdir,$(HEADER_DIRS),-I$(hdir)) \
+ $(foreach def,$(DEFINES),-D$(def))
+
+VALA_LDFLAGS := `pkg-config --libs $(EXT_PKGS) $(DIRECT_LIBS) gthread-2.0`
+
+# REQUIRED_CFLAGS absolutely get appended to CFLAGS, whatever the
+# the value of CFLAGS in the environment
+REQUIRED_CFLAGS := -fPIC
+
+# setting CFLAGS in configure.mk overrides build type
+ifndef CFLAGS
+ifdef BUILD_DEBUG
+CFLAGS = -O0 -g -pipe
+PLUGIN_CFLAGS = -O0 -g -pipe
+else
+CFLAGS = -O2 -g -pipe
+PLUGIN_CFLAGS = -O2 -g -pipe
+endif
+endif
+
+CFLAGS += $(PROFILE_FLAGS) $(REQUIRED_CFLAGS)
+PLUGIN_CFLAGS += $(PROFILE_FLAGS) $(REQUIRED_CFLAGS)
+
+# Required for gudev-1.0
+CFLAGS += -DG_UDEV_API_IS_SUBJECT_TO_CHANGE
+
+all: pkgcheck valacheck desktop
+
+ifdef ENABLE_BUILD_FOR_GLADE
+all: $(PLUGINS_DIR) lib$(PROGRAM).so $(PROGRAM) $(PC_FILE)
+else
+all: $(PLUGINS_DIR) $(PROGRAM) $(PC_FILE)
+endif
+
+
+include src/plugins/mk/interfaces.mk
+
+$(LANG_STAMP): $(EXPANDED_CORE_PO_FILES)
+ @$(foreach po,$(CORE_SUPPORTED_LANGUAGES),`mkdir -p $(LOCAL_LANG_DIR)/$(po)/LC_MESSAGES ; \
+ msgfmt -c -o $(LOCAL_LANG_DIR)/$(po)/LC_MESSAGES/shotwell.mo po/$(po).po`)
+ @touch $(LANG_STAMP)
+
+clean:
+ rm -f $(EXPANDED_C_FILES)
+ rm -f $(EXPANDED_OBJ_FILES)
+ rm -f $(VALA_STAMP)
+ rm -rf $(PROGRAM)-$(VERSION)
+ rm -f $(PROGRAM)
+ rm -f $(THUMBNAILER_DIR)/$(PROGRAM_THUMBNAILER)
+ rm -rf $(LOCAL_LANG_DIR)
+ rm -f $(LANG_STAMP)
+ rm -f $(DOC_LANG_STAMP)
+ rm -f $(EXPANDED_XLAT_DOC_PAGES)
+ rm -f $(TEMPORARY_DESKTOP_FILES)
+ rm -f lib$(PROGRAM).so
+ rm -rf $(UNITIZE_DIR)
+ rm -f $(PLUGIN_VAPI)
+ rm -f $(PLUGIN_HEADER)
+ rm -f $(PLUGIN_DEPS)
+ rm -f $(PLUGINS_SO)
+ rm -f $(EXTRA_PLUGINS_SO)
+ @$(MAKE) --directory=plugins clean
+ rm -f $(PC_FILE)
+
+cleantemps:
+ rm -f $(EXPANDED_C_FILES)
+ rm -f $(EXPANDED_OBJ_FILES)
+ rm -f $(VALA_STAMP)
+ rm -f $(LANG_STAMP)
+ rm -f $(DOC_LANG_STAMP)
+ rm -f $(TEMPORARY_DESKTOP_FILES)
+ @$(MAKE) --directory=plugins cleantemps
+ rm -f misc/gschemas.compiled
+
+package:
+ $(MAKE) dist
+ cp $(DIST_TAR_XZ) $(PACKAGE_ORIG_XZ)
+ rm -f $(DIST_TAR_XZ)
+
+misc/shotwell.desktop: misc/shotwell.desktop.head $(EXPANDED_CORE_PO_FILES)
+ cp misc/shotwell.desktop.head misc/shotwell.desktop
+ @ $(foreach lang,$(CORE_SUPPORTED_LANGUAGES), echo X-GNOME-FullName[$(lang)]=`TEXTDOMAINDIR=locale-langpack \
+ LANGUAGE=$(lang) gettext --domain=shotwell $(DESKTOP_APP_FULL_NAME)` \
+ >> misc/shotwell.desktop ; \
+ echo GenericName[$(lang)]=`TEXTDOMAINDIR=locale-langpack LANGUAGE=$(lang) \
+ gettext --domain=shotwell $(DESKTOP_APPLICATION_CLASS)` >> misc/shotwell.desktop ; \
+ echo Comment[$(lang)]=`TEXTDOMAINDIR=locale-langpack LANGUAGE=$(lang) gettext \
+ --domain=shotwell $(DESKTOP_APPLICATION_COMMENT)` >> misc/shotwell.desktop ; \
+ echo Keywords[$(lang)]=`TEXTDOMAINDIR=locale-langpack LANGUAGE=$(lang) gettext \
+ --domain=shotwell $(DESKTOP_APP_KEYWORDS)` >> misc/shotwell.desktop ;)
+ifndef DISABLE_DESKTOP_VALIDATE
+ @ desktop-file-validate misc/shotwell.desktop 1>misc/shotwell.desktop.errors 2>&1; \
+ if test -s misc/shotwell.desktop.errors; then \
+ echo -e "\nThe file misc/shotwell.desktop.head or one of the .po files contains errors and may need to be edited.\nPlease see the file misc/shotwell.desktop.errors for details."; \
+ exit 1; \
+ else rm -f misc/shotwell.desktop.errors; \
+ fi
+endif
+
+misc/shotwell-viewer.desktop: misc/shotwell-viewer.desktop.head $(EXPANDED_CORE_PO_FILES)
+ cp misc/shotwell-viewer.desktop.head misc/shotwell-viewer.desktop
+ $(foreach lang,$(CORE_SUPPORTED_LANGUAGES), echo X-GNOME-FullName[$(lang)]=`TEXTDOMAINDIR=locale-langpack \
+ LANGUAGE=$(lang) gettext --domain=shotwell $(DESKTOP_APP_FULL_NAME)` \
+ echo X-GNOME-FullName[$(lang)]=`TEXTDOMAINDIR=locale-langpack LANGUAGE=$(lang) gettext \
+ --domain=shotwell $(DIRECT_EDIT_DESKTOP_APP_FULL_NAME)` >> misc/shotwell-viewer.desktop ; \
+ echo GenericName[$(lang)]=`TEXTDOMAINDIR=locale-langpack LANGUAGE=$(lang) gettext \
+ --domain=shotwell $(DIRECT_EDIT_DESKTOP_APPLICATION_CLASS)` >> misc/shotwell-viewer.desktop ;)
+ifndef DISABLE_DESKTOP_VALIDATE
+ @ desktop-file-validate misc/shotwell-viewer.desktop 1>misc/shotwell-viewer.desktop.errors 2>&1; \
+ if test -s misc/shotwell-viewer.desktop.errors; then \
+ echo -e S"\nThe file misc/shotwell-viewer.desktop.head or one of the .po files contains errors and may need to be edited.\nPlease see the file misc/shotwell-viewer.desktop.errors for details."; \
+ exit 1; \
+ else rm -f misc/shotwell-viewer.desktop.errors; \
+ fi
+endif
+
+.PHONY: desktop
+desktop: misc/shotwell.desktop misc/shotwell-viewer.desktop
+
+.PHONY: dist
+dist:
+ mkdir -p $(PROGRAM)-$(VERSION)
+ cp --parents --preserve $(DIST_FILES) $(PROGRAM)-$(VERSION)
+ tar --xz -cvf $(DIST_TAR_XZ) $(PROGRAM)-$(VERSION)
+ rm -rf $(PROGRAM)-$(VERSION)
+
+distclean: clean
+ rm -f configure.mk
+ rm -f $(DIST_TAR_XZ)
+ @$(MAKE) --directory=plugins distclean
+
+.PHONY: install
+install:
+ touch $(LANG_STAMP)
+ mkdir -p $(DESTDIR)$(PREFIX)/bin
+ $(INSTALL_PROGRAM) $(PROGRAM) $(DESTDIR)$(PREFIX)/bin
+ mkdir -p $(DESTDIR)$(LIBEXECDIR)
+ $(INSTALL_PROGRAM) $(THUMBNAILER_BIN) $(DESTDIR)$(LIBEXECDIR)
+ $(INSTALL_PROGRAM) $(MIGRATOR_BIN) $(DESTDIR)$(LIBEXECDIR)
+ mkdir -p $(DESTDIR)$(PREFIX)/share/shotwell/icons
+ $(INSTALL_DATA) icons/* $(DESTDIR)$(PREFIX)/share/shotwell/icons
+ mkdir -p $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps
+ $(INSTALL_DATA) icons/shotwell.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps
+ mkdir -p $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps
+ $(INSTALL_DATA) icons/shotwell-16.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/shotwell.svg
+ mkdir -p $(DESTDIR)$(PREFIX)/share/icons/hicolor/24x24/apps
+ $(INSTALL_DATA) icons/shotwell-24.svg $(DESTDIR)$(PREFIX)/share/icons/hicolor/24x24/apps/shotwell.svg
+ mkdir -p $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas
+ $(INSTALL_DATA) misc/org.yorba.shotwell.gschema.xml $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas
+ $(INSTALL_DATA) misc/org.yorba.shotwell-extras.gschema.xml $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas
+ifndef DISABLE_SCHEMAS_COMPILE
+ glib-compile-schemas $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas
+endif
+ifndef DISABLE_GSETTINGS_CONVERT_INSTALL
+ mkdir -p $(DESTDIR)/usr/share/GConf/gsettings
+ $(INSTALL_DATA) misc/shotwell.convert $(DESTDIR)/usr/share/GConf/gsettings
+endif
+ifndef DISABLE_ICON_UPDATE
+ -gtk-update-icon-cache -t -f $(DESTDIR)$(PREFIX)/share/icons/hicolor || :
+endif
+ mkdir -p $(DESTDIR)$(PREFIX)/share/shotwell/ui
+ $(INSTALL_DATA) ui/* $(DESTDIR)$(PREFIX)/share/shotwell/ui
+ mkdir -p $(DESTDIR)$(PREFIX)/share/applications
+ mkdir -p $(DESTDIR)$(PREFIX)/share/appdata
+ $(INSTALL_DATA) misc/shotwell.desktop $(DESTDIR)$(PREFIX)/share/applications
+ $(INSTALL_DATA) misc/shotwell-viewer.desktop $(DESTDIR)$(PREFIX)/share/applications
+ $(INSTALL_DATA) misc/shotwell.appdata.xml $(DESTDIR)$(PREFIX)/share/appdata
+ifndef DISABLE_DESKTOP_UPDATE
+ -update-desktop-database || :
+endif
+ifdef ENABLE_APPORT_HOOK_INSTALL
+ mkdir -p $(DESTDIR)$(PREFIX)/share/apport/package-hooks
+ $(INSTALL_DATA) apport/shotwell.py $(DESTDIR)$(PREFIX)/share/apport/package-hooks
+endif
+ifndef DISABLE_HELP_INSTALL
+ mkdir -p $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/C
+ $(INSTALL_DATA) $(EXPANDED_DOC_PAGES) $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/C
+ mkdir -p $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/C/figures
+ $(INSTALL_DATA) $(EXPANDED_DOC_IMAGES) $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/C/figures
+ $(foreach lang,$(DOC_LINGUAS),`mkdir -p $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/$(lang)`)
+ $(foreach lang,$(DOC_LINGUAS),\
+ $(foreach page,$(DOC_PAGES),\
+ `$(INSTALL_DATA) help/$(lang)/$(page) $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell/$(lang)`\
+ )\
+ )
+endif
+ -$(foreach lang,$(CORE_SUPPORTED_LANGUAGES),`mkdir -p $(SYSTEM_LANG_DIR)/$(lang)/LC_MESSAGES ; \
+ $(INSTALL_DATA) $(LOCAL_LANG_DIR)/$(lang)/LC_MESSAGES/shotwell.mo \
+ $(SYSTEM_LANG_DIR)/$(lang)/LC_MESSAGES/shotwell.mo`)
+ mkdir -p $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+ $(INSTALL_PROGRAM) $(PLUGINS_SO) $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+ifdef PLUGINS_RC
+ $(INSTALL_DATA) $(PLUGINS_RC) $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+endif
+ifndef DISABLE_EXTRA_PLUGINS_INSTALL
+ $(INSTALL_PROGRAM) $(EXTRA_PLUGINS_SO) $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+ifdef EXTRA_PLUGINS_RC
+ $(INSTALL_DATA) $(EXTRA_PLUGINS_RC) $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+endif
+endif
+ifdef INSTALL_HEADERS
+ mkdir -p $(DESTDIR)$(PREFIX)/include/shotwell/plugins
+ $(INSTALL_DATA) $(PLUGIN_HEADER) $(DESTDIR)$(PREFIX)/include/shotwell/plugins
+ mkdir -p $(DESTDIR)$(PREFIX)/share/vala/vapi
+ $(INSTALL_DATA) $(PLUGIN_VAPI) $(DESTDIR)$(PREFIX)/share/vala/vapi
+ $(INSTALL_DATA) $(PLUGIN_DEPS) $(DESTDIR)$(PREFIX)/share/vala/vapi
+ test -d $(DESTDIR)$(PREFIX)/$(LIB)/pkgconfig || mkdir -p $(DESTDIR)$(PREFIX)/$(LIB)/pkgconfig
+ $(INSTALL_DATA) $(PC_FILE) $(DESTDIR)$(PREFIX)/$(LIB)/pkgconfig
+endif
+
+# Old versions of Makefile installed util binaries to $(PREFIX)/bin, so uninstall from there for now
+uninstall:
+ rm -f $(DESTDIR)$(PREFIX)/bin/$(PROGRAM)
+ rm -f $(DESTDIR)$(PREFIX)/bin/$(PROGRAM_THUMBNAILER)
+ rm -f $(DESTDIR)$(PREFIX)/bin/$(PROGRAM_MIGRATOR)
+ rm -f $(DESTDIR)$(LIBEXECDIR)/$(PROGRAM_THUMBNAILER)
+ rm -f $(DESTDIR)$(LIBEXECDIR)/$(PROGRAM_MIGRATOR)
+ rm -fr $(DESTDIR)$(PREFIX)/share/shotwell
+ rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/shotwell.svg
+ rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/16x16/apps/shotwell.svg
+ rm -f $(DESTDIR)$(PREFIX)/share/icons/hicolor/24x24/apps/shotwell.svg
+ rm -f $(DESTDIR)$(PREFIX)/share/applications/shotwell.desktop
+ rm -f $(DESTDIR)$(PREFIX)/share/applications/shotwell-viewer.desktop
+ rm -f $(DESTDIR)$(PREFIX)/share/appdata/shotwell.appdata.xml
+ifndef DISABLE_DESKTOP_UPDATE
+ -update-desktop-database || :
+endif
+ifndef DISABLE_HELP_INSTALL
+ rm -rf $(DESTDIR)$(PREFIX)/share/gnome/help/shotwell
+endif
+ifdef ENABLE_APPORT_HOOK_INSTALL
+ rm -f $(DESTDIR)$(PREFIX)/share/apport/package-hooks/shotwell.py
+endif
+ $(foreach lang,$(CORE_SUPPORTED_LANGUAGES),`rm -f $(SYSTEM_LANG_DIR)/$(lang)/LC_MESSAGES/shotwell.mo`)
+ rm -rf $(DESTDIR)$(PREFIX)/$(LIB)/shotwell/plugins/builtin
+ifdef INSTALL_HEADERS
+ rm -rf $(DESTDIR)$(PREFIX)/include/shotwell
+ rm -f $(foreach vapi,$(PLUGIN_VAPI),$(DESTDIR)$(PREFIX)/share/vala/vapi/$(notdir $(vapi)))
+ rm -f $(foreach dep,$(PLUGIN_DEPS),$(DESTDIR)$(PREFIX)/share/vala/vapi/$(notdir $(dep)))
+ rm -f $(DESTDIR)$(PREFIX)/$(LIB)/pkgconfig/$(PC_FILE)
+endif
+ rm -f $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas/org.yorba.shotwell.gschema.xml
+ rm -f $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas/org.yorba.shotwell-extras.gschema.xml
+ifndef DISABLE_SCHEMAS_COMPILE
+ glib-compile-schemas $(DESTDIR)$(PREFIX)/share/glib-2.0/schemas
+endif
+ifndef DISABLE_GSETTINGS_CONVERT_INSTALL
+ rm -f $(DESTDIR)/usr/share/GConf/gsettings/shotwell.convert
+endif
+
+$(PC_FILE): $(PC_INPUT) $(MAKE_FILES)
+ m4 '-D_VERSION_=$(VERSION)' '-D_PREFIX_=$(PREFIX)' '-D_REQUIREMENTS_=$(PLUGIN_PKG_REQS)' \
+ '-D_LIB_=$(LIB)' $< > $@
+
+$(UNITIZE_STAMP): $(MAKE_FILES) src/unit/rc/UnitInternals.m4 src/unit/rc/unitize_entry.m4
+ @mkdir -p $(UNITIZE_DIR)
+ @$(foreach unit,$(APP_UNITS),\
+ `m4 '-D_APP_UNIT_=$(unit)' src/unit/rc/unitize_entry.m4 > $(UNITIZE_DIR)/_$(unit)_unitize_entry.vala`)
+ @$(foreach nm,$(UNIT_NAMESPACES),\
+ `m4 '-D_UNIT_NAME_=$(nm)' '-D_UNIT_USES_INITS_=$($(nm)_USES_INITS)' '-D_UNIT_USES_TERMINATORS_=$($(nm)_USES_TERMINATORS)' src/unit/rc/UnitInternals.m4 > $(UNITIZE_DIR)/_$(nm)Internals.vala`)
+ @touch $@
+
+$(UNITIZE_INITS) $(UNITIZE_ENTRIES): $(UNITIZE_STAMP)
+ @
+
+# EXPANDED_SRC_FILES includes UNITIZE_INITS and UNITIZE_ENTRY
+$(VALA_STAMP): $(EXPANDED_SRC_FILES) $(EXPANDED_VAPI_FILES) $(GPHOTO_VAPI_FILE) $(EXPANDED_SRC_HEADER_FILES)
+ $(call check_valac_version)
+ @echo Compiling Vala code...
+ @mkdir -p $(BUILD_DIR)
+ $(VALAC) --ccode --directory=$(BUILD_DIR) --basedir=src \
+ $(foreach pkg,$(VALA_PKGS),--pkg=$(pkg)) \
+ $(foreach vapidir,$(VAPI_DIRS),--vapidir=$(vapidir)) \
+ $(foreach def,$(DEFINES),-X -D$(def)) \
+ $(foreach hdir,$(HEADER_DIRS),-X -I$(hdir)) \
+ $(VALAFLAGS) \
+ $(EXPANDED_SRC_FILES)
+ @touch $@
+
+# Do not remove hard tab or at symbol; necessary for dependencies to complete.
+$(EXPANDED_C_FILES): $(VALA_STAMP)
+ @
+
+$(EXPANDED_OBJ_FILES): %.o: %.c $(CONFIG_IN) Makefile
+ $(CC) -c $(VALA_CFLAGS) $(CFLAGS) -o $@ $<
+
+$(PROGRAM): $(EXPANDED_OBJ_FILES) $(RESOURCES) $(LANG_STAMP) $(THUMBNAILER_BIN) misc/gschemas.compiled $(DOC_LANG_STAMP)
+ $(CC) $(EXPANDED_OBJ_FILES) $(CFLAGS) $(LDFLAGS) $(RESOURCES) $(VALA_LDFLAGS) $(EXPORT_FLAGS) -o $@
+
+misc/gschemas.compiled: $(SCHEMA_FILES)
+ rm -f misc/gschemas.compiled
+ glib-compile-schemas misc
+
+$(DOC_LANG_STAMP): $(EXPANDED_DOC_PAGES) $(EXPANDED_DOC_PO)
+ $(foreach lang,$(DOC_LINGUAS), \
+ $(foreach page,$(DOC_PAGES), `xml2po -m mallard -p help/$(lang)/$(lang).po -o help/$(lang)/$(page) help/C/$(page)`))
+ @touch $(DOC_LANG_STAMP)
+
+$(THUMBNAILER_BIN): $(EXPANDED_THUMBNAILER_SRC_FILES)
+ $(VALAC) $(EXPANDED_THUMBNAILER_SRC_FILES) $(VALAFLAGS) -o $@ $(foreach pkg,$(THUMBNAILER_PKGS),--pkg=$(pkg))
+
+$(PLUGINS_SO) $(EXTRA_PLUGINS_SO): $(PLUGINS_DIR)
+ @
+
+.PHONY: $(PLUGINS_DIR)
+$(PLUGINS_DIR): $(PLUGIN_VAPI) $(PLUGIN_HEADER) $(PLUGIN_DEPS)
+ $(call check_valac_version)
+ @$(MAKE) --directory=$@ PLUGINS_VERSION="$(VERSION)" USER_VALAFLAGS="$(USER_VALAFLAGS)" \
+ PLUGIN_CFLAGS="$(PLUGIN_CFLAGS)"
+
+.PHONY: docs
+docs:
+# valadoc complains if the directory already exists
+ @rm -rf docs
+ valadoc --directory=docs --package-name=shotwell-plugin-dev --package-version=$(VERSION) --verbose \
+ --no-protected \
+ $(foreach def,$(DEFINES),--define=$(def)) \
+ $(foreach pkg,$(VALA_PKGS),--pkg=$(pkg)) \
+ $(foreach vapidir,$(VAPI_DIRS),--vapidir=$(vapidir)) \
+ $(PLUGIN_INTERFACES)
+
+glade: lib$(PROGRAM).so
+
+lib$(PROGRAM).so: $(EXPANDED_OBJ_FILES) $(RESOURCES) $(LANG_STAMP)
+ $(CC) $(EXPANDED_OBJ_FILES) $(CFLAGS) $(LDFLAGS) $(RESOURCES) $(VALA_LDFLAGS) $(EXPORT_FLAGS) -shared -o $@
+
+.PHONY: pkgcheck
+pkgcheck:
+ @if ! test -f configure.mk; then echo "Please run ./configure first."; exit 2; fi
+
+.PHONY: valacheck
+valacheck:
+ @ $(VALAC) --version >/dev/null 2>/dev/null || ( echo 'Shotwell requires Vala compiler $(MIN_VALAC_VERSION) or greater. No valac found in path or $$VALAC.'; exit 1 )
+ @ ./chkver min $(VALAC_VERSION) $(MIN_VALAC_VERSION) || ( echo 'Shotwell requires Vala compiler $(MIN_VALAC_VERSION) or greater. You are running' $(VALAC_VERSION) '\b.'; exit 1 )
+ $(if $(MAX_VALAC_VERSION),\
+ @ ./chkver max $(VALAC_VERSION) $(MAX_VALAC_VERSION) || ( echo 'Shotwell cannot be built by Vala compiler $(MAX_VALAC_VERSION) or greater. You are running' $(VALAC_VERSION) '\b.'; exit 1 ),)
+
+
+
+ifndef ASSUME_PKGS
+ifdef EXT_PKG_VERSIONS
+ @pkg-config --print-errors --exists '$(EXT_PKG_VERSIONS) $(DIRECT_LIBS_VERSIONS)'
+endif
+ifdef EXT_PKGS
+ @pkg-config --print-errors --exists $(EXT_PKGS) $(DIRECT_LIBS_VERSIONS)
+endif
+endif
+ @ type msgfmt > /dev/null || ( echo 'msgfmt (usually found in the gettext package) is missing and is required to build Shotwell. ' ; exit 1 )
+ifndef DISABLE_DESKTOP_VALIDATE
+ @ type desktop-file-validate > /dev/null || ( echo 'desktop-file-validate (usually found in the desktop-file-utils package) is missing and is required to build Shotwell. ' ; exit 1 )
+endif
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..64fa483
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,595 @@
+Shotwell 0.18.1 - 30 Jun 2014
+-----------------------------
+
+ * Fix Flickr publishing errors due to Flickr moving to HTTPs-only
+ * Fix crash when updating photo data/time
+ * Fix crash due to nested tag and changing sidebar selection
+ * Corrected URLs to point to new gnome.org pages
+
+
+Shotwell 0.18.0 - 17 March 2014
+-------------------------------
+
+ * Compile and install translated help files
+ * Updated translations
+
+
+Shotwell 0.17.2 - 4 March 2014
+------------------------------
+
+ * UNIX pipe unnecessarily left open for each imported video
+ * Improved searching for event comments and diacritics
+ * Update translations
+
+
+Shotwell 0.17.1 - 17 February 2014
+----------------------------------
+
+ * Updated translations
+ * Parent folder names as search keywords rolled back (see bgo#722756)
+
+
+Shotwell 0.17.0 - 4 February 2014
+---------------------------------
+
+ * Include parent folder names for keyword search
+ * Tumblr publishing fixed
+ * Bug fixes
+ * Updated translations
+
+
+Shotwell 0.15.1 - 19 November 2013 - "You're a Cashier!"
+--------------------------------------------------------
+
+ * Install Tumblr plugin resources
+ * Fix crash when video thumbnails are being inspected and created
+
+
+Shotwell 0.15.0 - 3 October 2013 - "Fruit's a Gamble"
+-----------------------------------------------------
+
+ * Copy and paste color adjustments between photos
+ * Highlights detail adjustment
+ * YouTube plugin now uses OAuth / OpenID
+ * Videos in Missing Files now re-import properly
+ * Improvements when thumbnailing videos
+ * Numerous bug fixes
+
+
+Shotwell 0.14.1 - 3 April 2013 - "The Core, Stem, Seeds, Everything"
+----------------------------------------------------------------------------
+
+ * Fixes a critical issue where Shotwell could close unexpectedly
+ when working with RAW photos in direct-edit mode
+ * The Facebook Connector now recovers smoothly from type 7
+ errors
+ * EXIF-oriented photos uploaded to Facebook now appear in their
+ correct orientation, even when the strip metadata option is
+ turned on in the Facebook Connector
+ * Fixes an issue where incorrect view filter settings were
+ applied on tag and event pages
+ * The Camera Developer is now disabled for RAW images that lack
+ a suitable paired or embedded JPEG
+ * Updated translations for many languages, including an updated
+ Catalan translation that corrects a problem where incorrect
+ event dates were displayed
+ * Assorted smaller bug fixes
+
+
+Shotwell 0.14.0 - 18 March 2013 - "The Baby Shower"
+----------------------------------------------------------------------------
+
+ * A folder tree in the sidebar provides a directory-hierarchy
+ view of your Shotwell library
+ * Dramatically improved user experience for RAW photographers:
+ long-standing bugs involving RAW developer switching have been
+ fixed
+ * Comprehensive logging of photo and video import, including the
+ ability to save an import log file to disk. The log tracks which
+ files were detected as duplicates as well as files that couldn't
+ be imported due to disk or camera problems.
+ * The Facebook Connector now uses the Facebook Graph API,
+ resulting in a smoother, more stable experience uploading photos
+ and videos to Facebook. As a bonus, Shotwell photo titles now
+ appear as Facebook photo captions!
+ * The Shotwell video subsystem now relies on GStreamer 1.0, making
+ for easier, more stable video import, better video thumbnails,
+ and better handling of video metadata
+ * New slideshow effects, improved Piwigo support, the ability to
+ show and hide the main Shotwell sidebar, and numerous bug fixes
+ and translation updates!
+
+
+Shotwell 0.13.1 - 5 October 2012 - "A Date at the Diplomat's Club"
+----------------------------------------------------------------------------
+
+ * Fixes an issue in which Shotwell would crash after deleting
+ all photos present in a view
+ * Fixes an issue where Shotwell would not include all
+ selected photos during a Nautilus "Send To..." export
+ operation
+ * Corrects a problem in which the file chooser dialog
+ used to select Shotwell's library location would
+ inappropriately select the parent directory of the chosen
+ directory
+ * Shotwell now properly inhibits the system screensaver when
+ playing a slideshow
+ * Fixes an issue in which the search filter bar could become
+ invisible even though a filter was being applied
+ * A progress bar now correctly appears during long batch
+ rotate and auto-enhance operations
+ * Shotwell no longer crashes when certain kinds of malformed
+ responses are received from remote servers during photo
+ publishing
+ * Corrected translation and desktop integration errors
+
+
+Shotwell 0.13.0 - 19 September 2012 - "Peanuts, Coffee, Soda, and Magazines"
+----------------------------------------------------------------------------
+
+ * The Shotwell Extras plugins now include support for
+ publishing photos to Tumblr
+ * Shotwell correctly handles dates before 1969
+ * Shotwell lets you remove sensitive information from photos
+ before publishing them to social media sites
+ * Shotwell regenerates thumbnails automatically, making
+ migrating libraries between computers easier
+ * The Picasa connector now uses OAuth authentication for
+ enhanced security
+ * Bug fixes and translation updates
+
+
+Shotwell 0.12.3 - 9 May 2012 - "It was a million to one shot, Doc."
+----------------------------------------------------------------------------
+
+ * Corrects an issue where tags could be inappropriately removed from a
+ library.
+ * Enhances support for AVCHD-capable cameras.
+ * Prevents a soft lockup that could occur when certain very dark images
+ were autoenhanced.
+ * Corrects an issue where pressing the zoom hotkeys in certain parts
+ of the application could cause a crash.
+
+
+Shotwell 0.12.2 - 9 April 2012 - "It's Made From Fusilli Pasta"
+----------------------------------------------------------------------------
+
+ * Corrects an issue where graphical corruption of the UI could
+ occur if the user navigated away from a camera page while camera
+ previews were being generated.
+ * Adds enhanced support for the Unity desktop environment.
+ * Clarified several strings.
+ * The application now recovers gracefully from corrupted tag data.
+
+
+Shotwell 0.12.1 - 28 March 2012 - "Oh No, Not The Knuckle..."
+----------------------------------------------------------------------------
+
+ * Corrects a critical issue where the application could not be started in
+ direct-edit mode.
+
+
+Shotwell 0.12.0 - 27 March 2012 - "A Counter-Clockwise Swirl"
+----------------------------------------------------------------------------
+
+ * Adds straighten tool
+ * Ported from GTK 2 to GTK 3
+ * Better handling of importing from Android devices
+ * Facebook and Flickr login now use OAuth authentication
+ * Numerous enhancements to the plugin subsystem
+ * The F-Spot importer is now implemented as a plugin
+ * Many, many bugfixes and stability enhancements
+
+
+Shotwell 0.11.6 - 3 November 2011 - "I know you can't, and I'm positive that
+ you won't"
+----------------------------------------------------------------------------
+
+ * Fixes a critical bug in which adding or modifying tags in the
+ single-photo view could result in the loss of tag data
+
+
+Shotwell 0.11.5 - 18 October 2011 - "I hate anyone that ever had a pony"
+------------------------------------------------------------------------
+
+ * Fixes a collection concurrent access issue that could cause
+ Shotwell to crash during F-Spot import for users still
+ affected by this issue even after installing Shotwell 0.11.4.
+
+
+Shotwell 0.11.4 - 13 October 2011 - "The Pony Remark"
+---------------------------------------------------------------------
+
+ * Fixes two collection concurrent access issues that could cause
+ Shotwell to crash during F-Spot import.
+
+
+Shotwell 0.11.3 - 11 October 2011 - "All Old People Steal"
+---------------------------------------------------------------------
+
+ * Fixes a critical issue where Shotwell could crash immediately
+ following a photo import
+ * Fixes a critical issue where Shotwell could crash if the user
+ entered a tag name containing a slash ("/") character
+ * Long error messages in the Publishing dialog box are now wrapped
+ correctly
+
+
+Shotwell 0.11.2 - 20 September 2011 - "Strap them to a Rickshaw"
+---------------------------------------------------------------------
+
+ * Increases stability working with hierarchical tags
+ * Importing hierarchical tags from F-Spot now works properly
+ * Fixes "server redirect contained no session key" errors in
+ the Facebook Connector
+ * Corrects problems with item counts over mixed media
+ * Various small fixes and enhancements
+
+
+Shotwell 0.11.1 - 8 September 2011 - "It's Been Flagged"
+---------------------------------------------------------------------
+
+ * RAW+JPEG pairing now works on file import
+ * Startup crashes fixed
+ * Hierarchical tag issues resolved
+ * RAW developer bugs fixed
+ * Resolved internationalization problems
+ * Various small fixes and enhancements
+
+
+Shotwell 0.11.0 - 23 August 2011 - "The Bookstore"
+---------------------------------------------------------------------
+
+ * Hierarchical tags
+ * Support for RAW+JPEG and selectable RAW developer
+ * Switched from GConf to GSettings
+ * "Hide Photos Already Imported" is now persistent
+ * New Saved Search options
+ * Mimics no longer stored in home directory
+ * Added support for BMP format
+ * Many, many bugfixes
+
+
+Shotwell 0.10.1 - 3 June 2011 - "A Vacation From Ourselves"
+---------------------------------------------------------------------
+
+ * Fixes "Hide Photos Already Imported"
+ * Multiple editing bugs fixed
+ * Resolves crash when two or more cameras have the same name
+ * Documentation now includes saved searches
+ * Piwigo bugs fixed
+ * Translation updates
+
+
+Shotwell 0.10 - 26 May 2011 - "The Butter Shave"
+---------------------------------------------------------------------
+
+ * Dynamic view of photo library through saved search feature
+ * Automatic database backup
+ * Adjust date/time for videos
+ * Added Valadate testing framework
+ * Shotwell video thumbnailer eliminates Totem dependency
+ * Crop tool is now more flexible
+ * Filenames no longer used as titles on Facebook and Picasa uploads
+ * Translation corrections
+ * Many bug fixes
+
+
+Shotwell 0.9.3 - 21 April 2011 - "Without Rules There's Chaos"
+---------------------------------------------------------------------
+
+ * Resolves issue where setting the desktop background didn't work in Gnome3
+ * Mimics are now deleted when a RAW photo is removed
+ * Event dates are now only shown once in the Event view
+ * Fixes a number of translation issues
+
+
+Shotwell 0.9.2 - 11 April 2011 - "He's a Mystery Wrapped in a Twinkie"
+---------------------------------------------------------------------
+
+ * Resolves translation issue where shotwell.mo is installed in wrong location
+ * Fixes issue where cancelling Flickr upload can crash Shotwell
+ * Fixes issue where creating a Picasa Web album with an ampersand in the name
+ crashes Shotwell
+ * Resolves bug where selecting "Publish" in single photo mode publishes the
+ entire library instead of the selected photo
+ * Async I/O in publishing operations is now stopped when the user cancels the
+ operation
+ * Issue fixed on Fedora where the text was cut off in publishing dialog
+ * Fixes issue with ratings filter where it didn't function when the search bar
+ was hidden
+
+
+Shotwell 0.9.1 - 4 April 2011 - "All I Did was Hand Someone a Bag"
+---------------------------------------------------------------------
+
+ * Fixes many crashes and other issues in publishing plugins.
+ * Fixes issues where paths and filenames are not displayed correctly after a
+ failed import.
+ * Fixed issue where text search in event and camera import pages was a string
+ match instead of a keyword match.
+ * For enhanced compatibility with GNOME 3, the desktop name of the Shotwell
+ application has changed from "Shotwell Photo Manager" to simply "Shotwell".
+ * Shotwell now provides a configure script option to set the name of the system
+ library directory to either lib or lib64.
+ * Enhanced visibility of red-eye reticle.
+ * Fixed issue where the Adjust palette could be positioned partially off-screen
+ * Plugins now respect --debug switch in configure script.
+ * The event containing undated photos could be incorrectly labelled "(null)" in
+ the events directory page.
+
+
+Shotwell 0.9.0 - 22 March 2011 - "The Big Salad"
+---------------------------------------------------------------------
+
+ * New search bar can filter by media type, rating, and text matching.
+ (Titles, filename, tag and event names are searched.)
+ * TIFF support
+ * Extensible plugin framework for Web publishing and slideshow transitions.
+ * Print multiple photos, and multiple photos per page.
+ * Configurable user directory pattern during import.
+ * Edit multiple photo titles at once.
+ * Improved rendering of underexposed RAW photos.
+ * Various improvements and bug fixes.
+
+
+Shotwell 0.8.1 - 10 January 2011 - "The Airing of Grievances"
+---------------------------------------------------------------------
+
+ * Fixes a problem where Shotwell could crash unexpectedly at
+ startup or when reading/writing metadata to files.
+ * Fixes a problem where Shotwell could hang when importing
+ voice-annotated videos.
+ * Fixes a problem where Shotwell failed to import date and time
+ information for some camera-generated MP4 videos.
+ * Shotwell can now delete video files from camera memory.
+ * Shotwell now supports the 3GP video format common on mobile
+ phones and RAW files with the SRW suffix generated by Samsung
+ cameras.
+ * Translation fixes and updates.
+
+
+Shotwell 0.8.0 - 23 December 2010 - "The Festivus for the Rest of Us"
+---------------------------------------------------------------------
+
+ * Video support for Ogg, AVI, MP4, Quicktime, and WMV files.
+ * Upload videos to major Web services, including YouTube, Facebook, Flickr,
+ and PicasaWeb.
+ * Runtime monitoring of library directory and auto-import of newly created
+ files.
+ * Background writing of metadata (tags, titles, rating, orientation, exposure
+ date) to master files (user configurable).
+ * Flagging of photos for batch operations.
+ * Set multiple photos to desktop background slideshow.
+ * Numerous translation updates.
+ * Various bug fixes.
+
+
+Shotwell 0.7.2 - 10 September 2010
+----------------------------------
+
+ * Fixed major startup problem when the user's Pictures directory is actually
+ a symbolic link.
+ * Fixed potential crasher when the user's Pictures directory contains a
+ large number of subdirectories.
+ * No longer asking if copying or linking if importing from Pictures directory
+ (which will always be linked).
+ * Fixed issue when logging in to PicasaWeb with a password with a '+'
+ character.
+ * Fixed update problem when using an external editor on a photo that was
+ edited externally in an earlier session.
+ * Various bug fixes.
+ * Numerous translation updates.
+
+
+Shotwell 0.7.1 - 26 August 2010
+-----------------------------
+
+ * Fixed a critical bug that caused Shotwell to crash when deleting the
+ only photo in an event
+ * F-Spot import now correctly interprets older databases
+ * Fixed an issue where pressing F11 would not exit full-screen mode
+ * Translation updates for several languages
+ * Updated documentation
+
+
+Shotwell 0.7.0 - 20 August 2010
+-----------------------------
+
+ * Migration support for F-Spot users: Shotwell can import photos directly
+ from your F-Spot library, preserving tags and ratings.
+ * Photos can be rated on a 1-5 star scale or marked as rejected. A filter
+ button supports viewing only photos of a specified rating or better.
+ * A new Last Import page in the sidebar gives you instant access to your
+ most recently imported photo roll.
+ * Sidebar functionality and appearance have been improved with new icons
+ and inline renaming.
+ * Shotwell scans your library files at startup, looking for changes.
+ Maintains library consistency when working with photos in other
+ applications.
+
+
+Shotwell 0.6.1 - 30 June 2010
+-----------------------------
+
+ * Added Lithuanian and Serbian translations, updated Italian
+ and Spanish translations
+ * Fixed a problem with reverting to the default library
+ directory
+ * Added more zooming shorcuts
+ * Shotwell no longer offers to delete photos that failed to
+ import from a camera
+ * Photos emptied from trash no longer reappear
+
+
+Shotwell 0.6.0 - 28 June 2010
+-----------------------------
+
+ * Basic support for RAW images, including import support for all common
+ formats like CR2 and DNG
+ * Full support for working with PNG images
+ * Users can now zoom into photos to reveal latent detail
+ * A new preferences dialog gives users exceptional control over Shotwell's
+ functionality and appearance
+ * Users can now open photos in an external editor, such as the GIMP, from
+ within Shotwell
+ * Photo tags and titles are imported automatically from XMP and IPTC metadata
+ * A new photo trash can
+
+
+Shotwell 0.5.2 - 11 May 2010
+----------------------------
+
+ * Added Czech, Finnish, Greek, and Ukrainian translations. Updated Russian
+ translation.
+ * Updated codebase to enable building on Vala 0.8.x. Vala 0.8.0 or later is
+ now required to build Shotwell.
+
+
+Shotwell 0.5.1 - 16 March 2010
+------------------------------
+
+ * Minor Windows-specific release fixing an installer bug. No changes to Linux
+ version.
+
+
+Shotwell 0.5.0 - 11 March 2010
+------------------------------
+
+ * Photos can be tagged and organized by tag, creating a new tool for managing
+ your photo collection
+ * Printing
+ * Photos can now be published to Google's Picasa Web Albums service
+ * Photo exposure date & time can be set and shifted
+ * Photos can be set as your desktop background directly from Shotwell
+ * Photo import runs in the background, making imports smoother and more fluid
+ * Publishing photos to web services is more responsive
+ * Numerous bug fixes
+
+
+Shotwell 0.4.3 - 18 January 2010
+--------------------------------
+
+ * Updated Italian and French translations.
+ * Windows theme installed correctly.
+ * Problems unmounting camera fixed.
+
+
+Shotwell 0.4.2 - 4 January 2010
+-------------------------------
+
+ * Added Bulgarian, Portuguese, and Slovak translations. Updated
+ German translation.
+ * Windows installation fixed.
+ * Crash when deleting photos from camera fixed.
+
+
+Shotwell 0.4.1 - 24 December 2009
+---------------------------------
+
+ * Minor update adding a script missing in the 0.4.0 release.
+
+
+Shotwell 0.4.0 - 23 December 2009
+---------------------------------
+
+ * Facebook and Flickr publishing.
+ * Events may now be split and merged.
+ * Alpha-release of Windows port now available.
+ * Undo/redo.
+ * Mark photos as favorite or hidden. View only favorites or show hidden
+ photos.
+ * Duplicate photos.
+ * Numerous bug fixes.
+
+
+Shotwell 0.3.2 - 11 November 2009
+---------------------------------
+
+ * Loosened photo pipeline assertion that checked for pixbuf scaling.
+ * Better error handling for situation where the HAL daemon (hald) is not
+ running or ready.
+
+
+Shotwell 0.3.1 - 9 November 2009
+--------------------------------
+
+ * Makefile changes to facilitate packaging.
+ * Warnings caught by Vala 0.7.8 corrected.
+ * Toolbar items now marked "important" where appropriate.
+ * Binary dependencies corrected in Debian packaging.
+
+
+Shotwell 0.3.0 - 2 November 2009
+--------------------------------
+
+ * Major update with numerous feature additions and performance and
+ scalability enhancements.
+ * Auto enhance button, shadows control, and histogram contrast expansion now
+ available.
+ * Hierarchical event tree in sidebar. Events can now be renamed.
+ * Background readahead to display full-window and fullscreen photos faster.
+ * Crop aspect ratios.
+ * Basic information pane to display photo title, exposure time, dimensions,
+ and file size.
+ * Configurable slideshow delay.
+ * Direct edit mode. Shotwell can open any JPEG file, move between other
+ JPEGS in the same directory, and edit them with the same tools available in
+ the photo manager.
+ * Better keyboard handling for selecting photos and moving between pages on
+ the sidebar.
+ * In camera view, option to hide photos already imported into Shotwell.
+ User now offered full report of imported photos and asked if they wish to
+ delete the photos from the camera.
+ * User-configurable items now stored persistently via GConf.
+ * Code internationalized. Partial French translation now available.
+
+
+Shotwell 0.2.0 - 7 August 2009
+------------------------------
+
+ * Color histogram now available in adjustment tool.
+ * Drag-and-drop now supports the modifier keys for linking and asking
+ which operation to perform.
+ * Shotwell no longer uses a hardcoded directory for storing imported
+ photos.
+ * A nasty bug causing the X server to crash under compiz was fixed.
+ (#380)
+ * Support for libgee-0.3.0.
+
+
+Shotwell 0.1.2 - 3 August 2009
+------------------------------
+
+ * Red-eye reduction feature now available.
+ * File/Import From Folder offers one more way to import photos into the
+ library.
+ * Color adjustment (exposure/saturation/tint/temperature) now available.
+ * Support for Vala 0.7.5.
+
+
+Shotwell 0.1.1 - 30 June 2009
+-----------------------------
+
+ * Bug fix: Dragging a selection band to the bottom of the window to start
+ scrolling results in compiz crashing. This fixes that problem, although
+ another reported problem still exists (#380).
+ * Changed package dependency from vala-1.0 to gee-1.0. Although Vala is
+ required to build Shotwell, it does not need to be installed to execute
+ it. Gee provides the collections library Shotwell requires.
+ * Fixed code to compile with Vala 0.7.4.
+
+
+Shotwell 0.1.0 - 26 June 2009
+-----------------------------
+
+ * Initial release. Features include:
+ - Importing photos from file manager or camera via libgphoto2.
+ - Photos automatically sorted into time-grouped events.
+ - Thumbnails viewable at various sizes.
+ - Sort by photo name or date of exposure.
+ - Fullscreen mode.
+ - Photos may be rotated or cropped.
+ - Export photos as stored or at varying dimensions and JPEG quality.
+ - Desktop integration with Applications menu and media device handling.
+
diff --git a/README b/README
new file mode 100644
index 0000000..1aecfa5
--- /dev/null
+++ b/README
@@ -0,0 +1,61 @@
+
+ Shotwell Photo Manager
+ ----------------------
+
+ * Introduction
+
+ Shotwell is a digital photo manager designed for the GNOME desktop
+ environment. It allows you to import photos from disk or camera,
+ organize them in various ways, view them in full-window or fullscreen
+ mode, and export them to share with others.
+
+ Visit http://www.yorba.org/shotwell to read about the current state of
+ Shotwell's development and to make sure you're running the latest version.
+
+
+ * Installation & Licensing
+
+ Please consult the INSTALL and COPYING files for more information.
+
+
+ * Quick Start
+
+ There are three ways to import photos: via drag-and-drop, from a digital
+ camera, and from the File menu.
+
+ * Drag-and-drop: Simply drag photos from your file manager and drop them
+ onto the Shotwell window. You may drag files or directories. The photos
+ will be imported into the library.
+
+ * Camera: Connect your digital camera to your computer. Shotwell will
+ detect it and list it in the sidebar. When you select the camera, Shotwell
+ will load previews of each photo. You may choose specific photos to
+ import or to import them all.
+
+ Shotwell uses gPhoto to communicate with digital cameras. If your camera
+ does not appear in Shotwell's sidebar or there is a problem importing
+ photos, visit http://www.gphoto.org to see if it is supported.
+
+ * File menu: Select File -> Import From Folder ... and select a directory
+ from the chooser dialog box. Shotwell will scan the directory and all
+ sub-directories for photo files and automatically import them.
+
+ Once your photos are in Shotwell's library, you can view, edit, and export
+ them. More features are planned, so check http://www.yorba.org/shotwell
+ regularly for updates.
+
+
+ * Contacting Yorba
+
+ Yorba: http://www.yorba.org
+ Shotwell project page: http://www.yorba.org/shotwell
+ Shotwell documentation: http://www.yorba.org/shotwell/help
+
+ We also encourage you to join the Shotwell mailing list. Send an email
+ with a subject: line of "subscribe" (no quotes) to
+ shotwell-request@lists.yorba.org.
+
+
+
+ Copyright 2009-2014 Yorba Foundation
+
diff --git a/THANKS b/THANKS
new file mode 100644
index 0000000..e9d1c9a
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,191 @@
+The Shotwell team would like to thank the following contributors:
+
+Valentín Barros <valentin@sanva.net>
+Bruno Girin <brunogirin@gmail.com>
+Jani Monoses <jani@ubuntu.com>
+Patrick Tierney <patrick@yorba.org>
+
+Simon Adda-Reyss <simon.addareyss@libertysurf.fr>
+Mihhail Afanasjev <mihhail.afanasjev@gmail.com>
+Joeny Ang <ang.joeny@gmail.com>
+Jeroen Arnoldus <b.j.arnoldus@bja-electronics.nl>
+Michael Axiak <mike@axiak.net>
+Eser Aygün <eser.aygun@gmail.com>
+Jens B <javajens@gmail.com>
+Ash Balgimbayev <ash.balgimbayev@hotmail.com>
+Philip Beam <psbeam@gmail.com>
+Jeremy Bicha <jbicha@ubuntu.com>
+Jürg Billeter <j@bitron.ch>
+Jonas Bushart <eberhardtjonas@aol.com>
+Alban Browaeys <prahal@yahoo.com>
+Joseph Bylund <joseph.bylund@gmail.com>
+Matthias Clasen <matthias.clasen@gmail.com>
+Chris Cummins <christopher.e.cummins@intel.com>
+Valentin David <valentin.david@gmail.com>
+Sergey Davidoff <shnatsel@gmail.com>
+Tobe Deprez <tobedeprez@gmx.com>
+Guillaume Desmottes <gdesmott@gnome.org>
+Fryderyk Dziarmagowski <fdziarmagowski@gmail.com>
+Josh Freeman <josh@twilightedge.com>
+guillaumev <guillaume@viguierjust.com>
+Chris Hemsing <c.hemsing@gmx.net>
+Tomáš Hnyk <tomashnyk@gmail.com>
+Mikko Huhtala <mikko.t.huhtala@gmail.com>
+David Jeske <davidj@gmail.com>
+Matt Jones <mattjones@workhorsy.org>
+Maxim Kartashev <perezk@mail.ru>
+Till Kamppeter <till.kamppeter@gmail.com>
+Richard B. Kreckel <kreckel@ginac.de>
+Andreas Kühntopf <andreas@kuehntopf.org>
+Damien Lallement <mageia@damsweb.net>
+Dominique Leuenberger <dimstar@opensuse.org>
+Dominic Lloyd <dwlloyd@telus.net>
+Tobias Lott <tobias@lott.eu.org>
+Gavrilov Maksim <ulltor@gmail.com>
+Brian Masney <masneyb@onstation.org>
+mcben <mcbennn@gmail.com>
+Trevor Mehard <mehardtj@g.cofc.edu>
+mnemo <mnemo@minimum.se>
+Rafael Monica <monraaf@gmail.com>
+Thomas Moschny <thomas.moschny@gmx.de>
+Paul Novak <pnovak@alumni.caltech.edu>
+Joseph Nuzman <jnuzman@gmail.com>
+Carlos Penichet <cperezpenichet@gmail.com>
+Evgeniy Polyakov <zbr@ioremap.net>
+Camilo Polymeris <cpolymeris@gmail.com>
+Siddhesh Poyarekar <siddhesh.poyarekar@gmail.com>
+Norbert Preining <preining@logic.at>
+Nikola Radovanovic <nrad@eunet.rs>
+Tobias Rapp <yahuxo@gmx.de>
+Louis-Francis Ratté-Boulianne <louis-francis@ratte-boulianne.com>
+Martin Robinson <martin.james.robinson@gmail.com>
+Laurent Rocher <rocher.laurent@gmail.com>
+Alexandre Rosenfeld <alexandre.rosenfeld@gmail.com>
+Elliott S <quantum.analyst@gmail.com>
+Alexander Sack <asac@ubuntu.com>
+Michel Alexandre Salim <michael.silvanus@gmail.com>
+Benedikt Sauer <filmor@gmail.com>
+Peter Seiderer <peter.seiderer@gmx.de>
+Ville Skyttä <ville.skytta@iki.fi>
+Wolfgang Steitz <wolfer7@web.de>
+Marcel Stimberg <stimberg@users.sourceforge.net>
+Vincent Untz <vuntz@gnome.org>
+Timo Westkämper <timo.westkamper@gmail.com>
+Alexander Wilms <alexander.wilms@zoho.com>
+Timo Witte <timo.witte@googlemail.com>
+Gert Wollny <gw.fossdev@gmail.com>
+David Woodhouse <dwmw2@infradead.org>
+Frenk X <fr3nkx@googlemail.com>
+Shan Xiong <shan.xiong@gmail.com>
+
+Translations courtesy of:
+
+A S Alam <aalam@users.sf.net>
+Mohammad Anwari <mdamt@di.blankon.in>
+Yiğit Ateş <yigitates52@gmail.com>
+Allisson Azevedo <allisson@gmail.com>
+b6i <baddogai@gmail.com>
+Žygimantas Beručka <zygis@gnome.org>
+Blonďák <blondak@neser.cz>
+Peter Bojtos <ptr@ulx.hu>
+Jan-Christoph Borchardt <JanCBorchardt@gmail.com>
+Gabriel Bousquet <gbousque@clipper.ens.fr>
+Piyachat Chinsaeng <neo.bojang@gmail.com>
+Yuri Chornoivan <yurchor@ukr.net>
+Bruce Cowan <bcowan@fastmail.co.uk>
+Laszlo Csordas <csola48@gmail.com>
+Hüseyin Demirtaş <h.demirtas.l10n@gmail.com>
+Fran Diéguez <frandieguez@ubuntu.com>
+Piotr Drąg <piotrdrag@gmail.com>
+Joan Duran <jodufi@gmail.com>
+Djavan Fagundes <djavan@comum.org>
+Luca Ferretti <elle.uca@libero.it>
+Kelemen Gábor <kelemeng@gnome.hu>
+Asier Sarasua Garmendia <asiersar@yahoo.com>
+Glards <glards@gmail.com>
+Dimitris Glezos <dimitris@glezos.com>
+Jorge González <jorgegonz@svn.gnome.org>
+Emanuele Grande <caccolangrifata@gmail.com>
+Jiri Grönroos < jiri.gronroos@iki.fi>
+Laco Gubík <lacogubik@googlemail.com>
+Joe Hansen <joedalton2@yahoo.dk>
+Tommy He <tommy.he@linux.com>
+Khaled Hosny <khaledhosny@eglug.org>
+Praveen Illa <mail2ipn@gmail.com>
+Boram Kim <Boramism@gmail.com>
+Juergen Kofler <juergen.kofler@gobbz.net>
+Oleg Koptev <koptev.oleg@gmail.com>
+Марк Коренберг <socketpair@gmail.com>
+Mantas Kriaučiūnas <mantas@akl.lt>
+Peteris Krisjanis <pecisk@gmail.com>
+Mitko Krstev <m.krstev@hotmail.com>
+Krešo Kunjas <deresh@gmail.com>
+Shushi Kurose <md81bird@hitaki.net>
+monkey.libre <monkey.libre@gmail.com>
+Xhacker Liu < liu.dongyuan@gmail.com>
+Ingo Lütkebohle <iluetkeb@techfak.uni-bielefeld.de>
+Sven Mahlstedt <1ne_mail_an-sven.m@web.de>
+Sérgio Marques <smarquespt@gmail.com>
+Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>
+Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>
+William Jon McCann <william.jon.mccann@gmail.com>
+Antón Méixome <meixome@certima.net>
+Baurzhan Muftakhidinov <baurthefirst@gmail.com>
+Sankarshan Mukhopadhyay <sankarshan@fedoraproject.org>
+Jose Luis Navarro <jlnavarro111@gmail.com>
+Duy Nguyen <pclouds@gmail.com>
+Sira Nokyoongtong <gumaraa@gmail.com>
+Olof Nord <olof_nord_@hotmail.com>
+Daniel Nylander <po@danielnylander.se>
+Yohsuke Ooi <meke@momonga-linux.org>
+Peter Pall < gunter@peterpall.de>
+Thalia Papoutsaki <saliyath@gmail.com>
+Claude Paroz <claude@2xlibre.net>
+Claudio Rodrigo Pereyra Diaz <claudio@pereyradiaz.com.ar>
+Mattias Põldaru <mahfiaz@gmail.com>
+Yulia Poyarko <ypoyarko@redhat.com>
+Sterios Prosiniklis <steriosprosiniklis@gmail.com>
+Nikola Radovanovic <nrad@eunet.rs>
+Redmar <redmar@ubuntu-nl.org>
+Helder Ribeiro <helder@gmail.com>
+Jan Roar Roed <janroed@gmail.com>
+Adi Roiban <adiroiban@gmail.com>
+Roumano <roumano@gmail.com>
+Alain Rpnpif <rpnpif@free.fr>
+Seth Schoen <schoen@loyalty.org>
+Yaron Shahrabani <sh.yaron@gmail.com>
+Misha Shnurapet <zayzayats@yandex.ru>
+slackhideo <burajirugaijin@yahoo.co.jp>
+Nikolas Slivka <snicore@gmail.com>
+David Štancl <dstancl@dstancl.cz>
+Svetoslav Stefanov <lfu.project@gmail.com>
+Steko <steko@iosa.it>
+Cheng-Chia Tseng <pswo10680@gmail.com>
+Ville-Pekka Vainio <vpivaini@cs.helsinki.fi>
+svaradar83 <srikanth.varad@gmail.com>
+Iñigo Varela <ivarela@softastur.org>
+Marian Vasile <marianvasile@upcmail.ro>
+Martin Weißhaupt <mweisshaupt1988@googlemail.com>
+Rob van den Berg <linuxned@gmail.com>
+Kaj-Ivar van der Wijst <kaj-ivar@vanderwijst.com>
+Johannes Wilm <mail@johanneswilm.org>
+Lukáš Zapletal <lzap@seznam.cz>
+Zheng7fu2 <zheng7fu2@gmail.com>
+Andrej Žnidaršič <andrej.znidarsic@gmail.com>
+ZupaDupa <kallerainio@gmail.com>
+
+Testers we'd like to thank:
+
+Vera Yin <vera@yorba.org>
+
+Martin Olsson <martin@minimum.se>
+Vadim Peretokin <vperetokin@gmail.com>
+Kaj-Ivar van der Wijst <kaj-ivar@vanderwijst.com>
+Roman Yepishev <roman.yepishev@gmail.com>
+
+Documentation thanks to:
+
+Robert Ancell <robert.ancell@canonical.com>
+Phil Bull <philbull@gmail.com>
+Peter DO Smith <pdo.smith@gmail.com>
+
diff --git a/apport/shotwell.py b/apport/shotwell.py
new file mode 100644
index 0000000..a6a0183
--- /dev/null
+++ b/apport/shotwell.py
@@ -0,0 +1,7 @@
+import os.path
+import apport.hookutils
+
+def add_info(report):
+ log_file = os.path.expanduser('~/.cache/shotwell/shotwell.log')
+ apport.hookutils.attach_file_if_exists(report, log_file, 'shotwell.log')
+
diff --git a/chkver b/chkver
new file mode 100755
index 0000000..01028fc
--- /dev/null
+++ b/chkver
@@ -0,0 +1,119 @@
+#! /bin/bash
+#
+# Copyright 2009-2014 Yorba Foundation
+#
+# This software is licensed under the GNU LGPL (version 2.1 or later).
+# See the COPYING file in this distribution.
+#
+# chkver <min | max> <major.minor.revision> <min|max major.minor.revision>
+#
+# Returns 0 if queried version is greater than or equal (for min) or lesser than (for max) the
+# supplied value, or 1 otherwise.
+#
+# Set VERBOSE environment variable for somewhat useful output.
+#
+# NOTE:
+# This is an ultra-naive implementation with just enough error-checking.
+
+usage() {
+ echo 'usage: chkver <min | max> <major.minor.revision> <min|max major.minor.revision>'
+}
+
+abort() {
+ usage
+ exit 1
+}
+
+verify_cardinal() {
+ while [ $# != 0 ]
+ do
+ if [ $1 ] && [ $1 -eq $1 2> /dev/null ] && [ $1 -ge 0 ]
+ then
+ :
+ else
+ abort
+ fi
+
+ shift
+ done
+}
+
+# check_min name number min-number
+check_min() {
+ if [ $2 -gt $3 ]
+ then
+ verbose $1 large enough.
+ exit 0
+ elif [ $2 -lt $3 ]
+ then
+ verbose $1 not large enough.
+ exit 1
+ fi
+}
+
+# check_max name number max-number
+check_max() {
+ if [ $2 -lt $3 ]
+ then
+ verbose $1 small enough.
+ exit 0
+ elif [ $2 -gt $3 ]
+ then
+ verbose $1 not small enough.
+ exit 1
+ fi
+}
+
+verbose() {
+ if [ $VERBOSE ]
+ then
+ echo $*
+ fi
+}
+
+# Check number of arguments
+if [ $# -lt 3 ]
+then
+ abort
+fi
+
+# Parse arguments
+mode=$1
+if [ $mode != "min" ] && [ $mode != "max" ]
+then
+ abort
+fi
+
+major=`echo $2 | awk -F. '{print $1}'`
+minor=`echo $2 | awk -F. '{print $2}'`
+revision=`echo $2 | awk -F. '{print $3}'`
+
+min_major=`echo $3 | awk -F. '{print $1}'`
+min_minor=`echo $3 | awk -F. '{print $2}'`
+min_revision=`echo $3 | awk -F. '{print $3}'`
+
+# Verify they're all positive integers
+verify_cardinal "$major" "$minor" "$revision" "$min_major" "$min_minor" "$min_revision"
+
+verbose Comparing $major.$minor.$revision against $mode $min_major.$min_minor.$min_revision
+
+# check version numbers in order of importance
+if [ $mode == "min" ]
+then
+ check_min "Major" $major $min_major
+ check_min "Minor" $minor $min_minor
+ check_min "Revision" $revision $min_revision
+else
+ check_max "Major" $major $min_major
+ check_max "Minor" $minor $min_minor
+ check_max "Revision" $revision $min_revision
+fi
+
+verbose Same version.
+if [ $mode == "min" ]
+then
+ exit 0
+else
+ exit 1
+fi
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..5db2bf0
--- /dev/null
+++ b/configure
@@ -0,0 +1,201 @@
+#!/usr/bin/env bash
+#
+# Copyright 2009-2014 Yorba Foundation
+#
+# This software is licensed under the GNU LGPL (version 2.1 or later).
+# See the COPYING file in this distribution.
+
+CONFIG_IN=configure.mk
+
+configure_help() {
+ cat <<- EOT
+Usage:
+ ./configure [OPTIONS]...
+
+Options:
+ -h, --help Print this help and exit.
+ --assume-pkgs Turn off package version checking.
+ --build=DIR Build secondary files in DIR.
+ --debug | --release Build executable for debugging or release.
+ [--release]
+ --profile Enable profiling support during C compile & link.
+ --prefix=PREFIX Prepend PREFIX to program installation paths.
+ [/usr/local]
+ --lib=LIBNAME Set system library directory name to LIBNAME
+ (usually 'lib' or 'lib64').
+ [lib]
+ --libdir LIBNAME Equivalent to --lib=LIBNAME
+ --libexec=LIBEXECDIR Set utility executable to LIBEXECDIR
+ (usually 'PREFIX/libexec/shotwell').
+ [PREFIX/libexec/shotwell]
+ --libexec LIBEXECDIR Equivalent to --libexec=LIBEXECDIR
+
+ --define=SYMBOL Define a symbol for the Vala compiler.
+
+
+ --disable-schemas-compile
+ Disable compiling the GSettings schema.
+ --disable-gsettings-convert-install
+ Disable installing the gsettings-data-convert file.
+ --disable-desktop-update
+ Disable desktop database update.
+ --disable-desktop-validate
+ Disable validation of .desktop files.
+ --disable-icon-update
+ Disable icon cache update.
+ --enable-build-for-glade
+ Enable build for Glade-related development.
+ --disable-help-install
+ Disable installation of online help.
+ --disable-extra-plugins-install
+ Disable installation of extra (non-core) plugins.
+ --install-headers
+ Install headers and VAPI files (developers only).
+ --unity-support
+ Enable support for progress bars in the Unity launcher.
+EOT
+}
+
+abort() {
+ printf "%s: Invalid argument %s\n" $0 $1
+ configure_help
+ exit 1
+}
+
+while [ $# != 0 ]
+do
+ option=`echo $1 | sed 's/=.*//'`
+ if [ `echo $1 | grep '='` ]
+ then
+ value=`echo $1 | sed 's/.*=//'`
+ fi
+
+ case $option in
+ -h | --help) configure_help
+ exit 0
+ ;;
+
+ --prefix) if [ ! $value ]
+ then
+ shift
+ value=$1
+ fi
+
+ variables="${variables}PREFIX=$value\n"
+ ;;
+
+ --lib | --libdir) if [ ! $value ]
+ then
+ shift
+ value=$1
+ fi
+
+ variables="${variables}LIB=$value\n"
+ ;;
+
+ --libexec) if [ ! $value ]
+ then
+ shift
+ value=$1
+ fi
+
+ variables="${variables}LIBEXECDIR=$value\n"
+ ;;
+
+ --assume-pkgs) variables="${variables}ASSUME_PKGS=1\n"
+ ;;
+
+ --build) if [ ! $value ]
+ then
+ shift
+ value=$1
+ fi
+
+ variables="${variables}BUILD_DIR=$value\n"
+ ;;
+
+ --debug) variables="${variables}BUILD_RELEASE=\nBUILD_DEBUG=1\n"
+ ;;
+
+ --profile) variables="${variables}PROFILE_FLAGS=-pg\n"
+ ;;
+
+ --release) variables="${variables}BUILD_DEBUG=\nBUILD_RELEASE=1\n"
+ ;;
+
+ --define) variables="${variables}USER_VALAFLAGS+=--define=$value\n"
+ ;;
+
+ --disable-schemas-compile) variables="${variables}DISABLE_SCHEMAS_COMPILE=1\n"
+ ;;
+
+ --disable-gsettings-convert-install) variables="${variables}DISABLE_GSETTINGS_CONVERT_INSTALL=1\n"
+ ;;
+
+ --disable-desktop-update) variables="${variables}DISABLE_DESKTOP_UPDATE=1\n"
+ ;;
+
+ --disable-desktop-validate) variables="${variables}DISABLE_DESKTOP_VALIDATE=1\n"
+ ;;
+
+ --disable-icon-update) variables="${variables}DISABLE_ICON_UPDATE=1\n"
+ ;;
+
+ --enable-build-for-glade) variables="${variables}ENABLE_BUILD_FOR_GLADE=1\n"
+ ;;
+ --disable-help-install) variables="${variables}DISABLE_HELP_INSTALL=1\n"
+ ;;
+ --disable-extra-plugins-install) variables="${variables}DISABLE_EXTRA_PLUGINS_INSTALL=1\n"
+ ;;
+
+ --install-headers) variables="${variables}INSTALL_HEADERS=1\n"
+ ;;
+
+ --unity-support) variables="${variables}UNITY_SUPPORT=1\n"
+ ;;
+
+ --enable-* | --disable-*)
+
+ echo WARNING: unrecognized option: $option
+ ;;
+
+ *) if [ `echo $option | grep '\-\-'` ]
+ then
+ # we've hit a bogus '--' -type argument, don't accept it.
+ abort $option
+ fi
+
+ # this argument isn't for us; pass it on to the makefile phase.
+ variables="${variables}${option}=${value}\n"
+ ;;
+ esac
+
+ value=""
+ shift
+done
+
+# detect version of libgphoto2 the compilation host has installed
+pkg-config --atleast-version 2.5 libgphoto2
+if [ $? == 1 ]
+then
+ pkg-config --atleast-version 2.4 libgphoto2
+ if [ $? == 1 ]
+ then
+ printf "No compatible libGPhoto installation found. Configuration cannot continue.\n";
+ exit 1
+ else
+ printf "Detected libGPhoto 2.4.x - using default code path.\n";
+ fi
+else
+ printf "Detected libGPhoto 2.5.x - using 2.5-aware code path.\n";
+ variables="${variables}WITH_GPHOTO_25=1\n"
+fi
+
+rm -f $CONFIG_IN
+if [ $variables ]
+then
+ echo -e -n $variables > $CONFIG_IN
+fi
+echo "CONFIG_IN=${CONFIG_IN}" >> $CONFIG_IN
+
+printf "Configured. Type 'make' to build, 'make install' to install.\n"
diff --git a/help/C/edit-adjustments.page b/help/C/edit-adjustments.page
new file mode 100644
index 0000000..c8d9e3f
--- /dev/null
+++ b/help/C/edit-adjustments.page
@@ -0,0 +1,51 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-adjustments">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Change the exposure, saturation, tint, and shadows of a photo.</desc>
+
+ <link type="next" xref="edit-crop" />
+ </info>
+
+ <title>Color adjustments</title>
+
+<p>The <gui>Adjust</gui> button opens a floating window with a histogram and sliders to adjust a photo's exposure, saturation, tint, temperature, and shadows. The histogram also has sliders to reduce the upper and lower intensity thresholds of the photograph, expanding the contrast of the middle range.</p>
+
+<p>The <gui>Enhance</gui> button adjusts the histogram and shadows sliders to improve the quality of a photo.</p>
+
+<p>When the photo's colors and contrast are to your liking, press <gui>Apply</gui> to save the changes. <gui>Reset</gui> will return the image to its original state. <gui>Cancel</gui> discards all changes you've made.</p>
+
+<section>
+ <title>What do the color adjustments do?</title>
+ <terms>
+ <item>
+ <title>Exposure</title>
+ <p>Changes the brightness to make it look like the photo was exposed for a longer or shorter time. Use this to correct under- or over-exposed photos.</p>
+ </item>
+ <item>
+ <title>Saturation</title>
+ <p>Changes how vivid colors look. If your photo looks gray and washed out, try increasing the saturation. If colors look too bold, try decreasing it.</p>
+ </item>
+ <item>
+ <title>Tint</title>
+ <p>This tints the photo with a color. It's useful for correcting photos taken with the wrong white balance setting, which typically have an unnatural color cast. For example, photos taken outdoors with the white balance set to "Tungsten" may have a blue cast.</p>
+ </item>
+ <item>
+ <title>Temperature</title>
+ <p>Changes how "warm" or "cool" the picture looks. Use this to make cold, depressing scenes look more lively, for example.</p>
+ </item>
+ <item>
+ <title>Shadows</title>
+ <p>This makes shadowy areas appear lighter. Use this to make detail more visible if it's obscured by the darkness of a shadow.</p>
+ </item>
+ <item>
+ <title>Intensity Threshold (sliders on the histogram)</title>
+ <p>These sliders change how light the brightest white is and how dark the darkest black is. Use them to change the contrast of the photo. Photos which look washed out should particularly benefit from changing these settings.</p>
+ </item>
+ </terms>
+</section>
+
+</page>
+
diff --git a/help/C/edit-crop.page b/help/C/edit-crop.page
new file mode 100644
index 0000000..f39028f
--- /dev/null
+++ b/help/C/edit-crop.page
@@ -0,0 +1,46 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-crop">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Improve the composition of a photo by cutting out parts of it.</desc>
+
+ <link type="next" xref="edit-external" />
+ </info>
+
+ <title>Cropping</title>
+
+ <p>To reduce the area of a photo and concentrate the viewer's attention on a smaller portion of it, use the Crop tool.
+ The crop tool is only available in full-window or fullscreen mode.</p>
+
+<steps>
+ <item>
+ <p>Double-click on a photo to enter full-window mode, then press the <gui>Crop</gui> button on the toolbar.</p>
+ </item>
+ <item>
+ <p>A white box, the crop rectangle, will appear over the photo. The lighter portion of the photo within the crop rectangle represents what the photo will look like when you crop it.</p>
+ </item>
+ <item>
+ <p>If you place your cursor in the middle of the box, you can move the box around. If you drag the edges of the box, you can adjust its size. As you move and adjust the crop box, you'll see four lines appear inside it, like a tic-tac-toe grid. These are <em>rule of thirds</em> lines.</p>
+ <p>You can also constrain the crop box to one of many common sizes. Choose a size from the drop-down list that suits your needs. If you press the flip button next to it, the orientation of the constraint will switch (from landscape to portrait).</p>
+ </item>
+ <item>
+ <p>When you're happy with your crop outline, press the <gui>Apply</gui> button. Shotwell will display the cropped photo.</p>
+ </item>
+ <item>
+ <p>If you change your mind, press the <gui>Crop</gui> button again and fine-tune the crop.</p>
+ <p>If you press <gui>Cancel</gui> rather than <gui>Apply</gui>, Shotwell will return to the photo's previous crop dimensions.</p>
+ </item>
+</steps>
+
+<section>
+ <title>What is the rule of thirds?</title>
+ <p>The <em>rule of thirds</em> helps you to choose a pleasing composition for a photo.</p>
+ <p>Imagine that the scene is divided up into a 3x3 grid by two equally-spaced vertical lines and two equally-spaced horizontal lines. According to the rule, you're more likely to get a pleasing composition if you align major features (like the horizon, or a person's body) with one of the lines. Paying attention to the way features flow from one part of the grid to another can also help.</p>
+ <p>Cropping a photo so that it conforms to the rule of thirds often results in a more visually appealing image.</p>
+ <media type="image" src="figures/crop_thirds.jpg">
+ <p>Cropping a photo, using the "rule of thirds" lines to improve the composition.</p>
+ </media>
+</section>
+</page>
diff --git a/help/C/edit-enhance.page b/help/C/edit-enhance.page
new file mode 100644
index 0000000..8e8040d
--- /dev/null
+++ b/help/C/edit-enhance.page
@@ -0,0 +1,17 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-enhance">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Let Shotwell improve the brightness and contrast of a photo automatically.</desc>
+
+ <link type="seealso" xref="edit-adjustments" />
+
+ <link type="next" xref="edit-adjustments" />
+ </info>
+
+ <title>Auto-enhance</title>
+
+ <p>Clicking on the <gui>Enhance</gui> button is a quick way to automatically adjust the brightness and contrast of your photo. It will often give you a photo that is correctly exposed. You can also use it as a starting point and then improve the adjustments by clicking on the <gui>Adjust</gui> button.</p>
+</page>
diff --git a/help/C/edit-external.page b/help/C/edit-external.page
new file mode 100644
index 0000000..cee9fea
--- /dev/null
+++ b/help/C/edit-external.page
@@ -0,0 +1,54 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-external">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Use a different program to edit a photo.</desc>
+
+ <link type="next" xref="edit-redeye" />
+ </info>
+
+ <title>
+ Edit photos with an external program
+ </title>
+
+ <p>
+ You might want to use an external editor to do additional work on a photo.
+ If installed, GIMP and UFRaw are the default external editors for photo and RAW editing,
+ respectively. If these programs are not installed, you must select your preferred
+ editors by choosing <guiseq><gui>Edit</gui><gui>Preferences</gui></guiseq> and selecting
+ editors from drop-down menus of installed applications.
+ </p>
+
+ <p>
+ Once your editors have been set, select a photo and choose <guiseq><gui>Photos</gui>
+ <gui>Open With External Editor</gui></guiseq> to open the photo with the external editor.
+ Likewise, if the original photo is a RAW file, select <guiseq><gui>Photos</gui><gui>Open
+ With RAW Editor</gui></guiseq> to edit the RAW file directly with the set RAW editor.
+ </p>
+
+ <p>
+ When you complete your edits and save the file, Shotwell will detect the changes and
+ update the photo. When external edits have been made, press and hold the
+ <key>Shift</key> key in full-window view to show the original photo rather than the
+ externally-edited one.
+ </p>
+
+ <p>
+ Reverting to original will erase any external edits.
+ </p>
+
+ <note>
+ <p>
+ If you externally edit a RAW photo and save the result to another image, such as a
+ JPEG or PNG, Shotwell cannot automatically determine that the original RAW and the
+ new image should be paired.
+ </p>
+
+ <p>
+ If you want to work within the resulting image within Shotwell, you'll need to
+ import it yourself.
+ </p>
+ </note>
+</page>
diff --git a/help/C/edit-nondestructive.page b/help/C/edit-nondestructive.page
new file mode 100644
index 0000000..c289e25
--- /dev/null
+++ b/help/C/edit-nondestructive.page
@@ -0,0 +1,22 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-nondestructive">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Shotwell is a non-destructive photo editor - it does not modify your original photos.</desc>
+
+ <link type="next" xref="edit-time-date" />
+ </info>
+
+ <title>What happens to the original when I edit a photo?</title>
+
+<p>Shotwell is a non-destructive photo editor. It does not modify your original photographs. That is to say, if you crop a photo or adjust its colors, the photo file on disc remains untouched. Shotwell stores your edits in a database and applies them on the fly as necessary. This means you can undo any alterations you make to a photograph.</p>
+
+<p>If you want to see what a photo looked like before your modifications, press the <key>Shift</key> key. The original photo will be displayed as long as you hold the key down.</p>
+
+<p>Note that Shotwell can optionally write metadata (such as tags and titles) to photo files.
+For more information, see the section <link xref="other-files">Photo files</link>.</p>
+
+</page>
+
diff --git a/help/C/edit-redeye.page b/help/C/edit-redeye.page
new file mode 100644
index 0000000..470874f
--- /dev/null
+++ b/help/C/edit-redeye.page
@@ -0,0 +1,26 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-redeye">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Correct photos where people have red eyes because of the camera's flash.</desc>
+
+ <link type="next" xref="edit-rotate" />
+ </info>
+
+ <title>Removing red-eye</title>
+
+ <p>Red-eye occurs when the camera's flash reflects off the pupil of someone's eye. To eliminate this in a photo, use the Red-eye tool.</p>
+ <steps>
+ <item>
+ <p>Click <gui>Red-eye</gui>. A circle will appear on the photo.</p>
+ </item>
+ <item>
+ <p>Drag the circle over the affected pupil, adjust its size with the slider control, and press <gui>Apply</gui>. The redness will be removed.</p>
+ </item>
+ <item>
+ <p>Repeat this process for all red pupils in your photo. Press <gui>Close</gui> when finished.</p>
+ </item>
+ </steps>
+</page>
diff --git a/help/C/edit-rotate.page b/help/C/edit-rotate.page
new file mode 100644
index 0000000..6a85966
--- /dev/null
+++ b/help/C/edit-rotate.page
@@ -0,0 +1,27 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-rotate">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Click the <gui>Rotate</gui> button, or choose one of the commands in the <gui>Photo</gui> menu.</desc>
+
+ <link type="next" xref="edit-straighten" />
+ </info>
+
+ <title>Rotate or flip a photo</title>
+
+ <p>You can rotate your photos left and right (clockwise and counterclockwise) with the <gui>Rotate</gui> button on the toolbar of most views. You can also make a mirror image of any photo.</p>
+
+ <p>To rotate right, click on the <gui>Rotate</gui> button. To rotate left, press and hold the <key>Ctrl</key> key and then click the button. Both commands are available in the <gui>Photos</gui> menu too. Alternatively, use the following keyboard shortcuts:</p>
+ <list>
+ <item><p>rotate left: <keyseq><key>Shift</key><key>Ctrl</key><key>R</key></keyseq> or <key>[</key></p></item>
+ <item><p>rotate right: <keyseq><key>Ctrl</key><key>R</key></keyseq> or <key>]</key></p></item>
+ </list>
+ <p>To create a mirror image of a photo, use the <gui>Flip Horizontally</gui> command in the <gui>Photos</gui> menu. To flip an image vertically, use the <gui>Flip Vertically</gui> command in the same menu.</p>
+
+ <note>
+ <p>If you select more than one image, you can rotate all of them at the same time.</p>
+ </note>
+
+</page>
diff --git a/help/C/edit-straighten.page b/help/C/edit-straighten.page
new file mode 100644
index 0000000..6dc0af1
--- /dev/null
+++ b/help/C/edit-straighten.page
@@ -0,0 +1,28 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-straighten">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Straighten a photo so that its horizon appears level.</desc>
+
+ <link type="next" xref="edit-undo" />
+ </info>
+
+ <title>Straighten photos</title>
+
+<p>The straighten tools allows photos to be leveled and straightened. The straighten tool is only available in full-window or fullscreen mode. </p>
+
+ <steps>
+ <item>
+ <p>Click <gui>Straighten</gui>. The straighten slider will appear. Alternatively, use the keyboard shortcut <keyseq><key>Ctrl</key><key>A</key></keyseq>.</p>
+ </item>
+ <item>
+ <p>Drag the slider to achieve the desired degree of straightening.</p>
+ </item>
+ <item>
+ <p>Press <gui>OK</gui> when finished.</p>
+ </item>
+ </steps>
+
+</page>
diff --git a/help/C/edit-time-date.page b/help/C/edit-time-date.page
new file mode 100644
index 0000000..2f3f03c
--- /dev/null
+++ b/help/C/edit-time-date.page
@@ -0,0 +1,21 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-time-date">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Change the time and date of photos if those details are incorrect.</desc>
+
+ <link type="next" xref="edit-enhance" />
+ </info>
+
+ <title>Adjust the time and date of photos</title>
+
+<p>To adjust the time and date of photos, select the photos you would like to adjust, choose <guiseq><gui>Photos</gui><gui>Adjust Time and Date</gui></guiseq> and select a new time and date.</p>
+
+<p>If you are changing the date and time of multiple photos at once, you can choose to shift all the photos by the same amount of time or to set all the photos to the same time.</p>
+
+<p>By default, the time and date are only changed inside Shotwell. You can also choose to modify the time and date in the original file, but this cannot be undone once you exit Shotwell.</p>
+
+</page>
+
diff --git a/help/C/edit-undo.page b/help/C/edit-undo.page
new file mode 100644
index 0000000..74c2f78
--- /dev/null
+++ b/help/C/edit-undo.page
@@ -0,0 +1,22 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="edit-undo">
+
+ <info>
+ <link type="guide" xref="index#edit"/>
+ <desc>Return a photo to its original, unedited form.</desc>
+
+ <link type="seealso" xref="edit-nondestructive" />
+
+ <link type="next" xref="edit-nondestructive" />
+ </info>
+
+ <title>Undoing changes</title>
+
+ <p>Because Shotwell is a non-destructive photo editor, you can undo any alterations you make to a photograph.</p>
+
+ <p>If you want to see what a photo looked like before your modifications, press the <key>Shift</key> key. The original photo will be displayed as long as you hold the key down.</p>
+
+ <p>To completely undo all the changes you've made to a photo, click <guiseq><gui>Photos</gui><gui>Revert to Original</gui></guiseq>. The only exception is that time and date adjustments will not be reverted.</p>
+
+</page>
diff --git a/help/C/figures/crop_thirds.jpg b/help/C/figures/crop_thirds.jpg
new file mode 100755
index 0000000..2e5ebb4
--- /dev/null
+++ b/help/C/figures/crop_thirds.jpg
Binary files differ
diff --git a/help/C/figures/edit_toolbar.png b/help/C/figures/edit_toolbar.png
new file mode 100644
index 0000000..0a5f5ae
--- /dev/null
+++ b/help/C/figures/edit_toolbar.png
Binary files differ
diff --git a/help/C/figures/editing_overview.png b/help/C/figures/editing_overview.png
new file mode 100644
index 0000000..266b639
--- /dev/null
+++ b/help/C/figures/editing_overview.png
Binary files differ
diff --git a/help/C/figures/shotwell_logo.png b/help/C/figures/shotwell_logo.png
new file mode 100644
index 0000000..5431bdb
--- /dev/null
+++ b/help/C/figures/shotwell_logo.png
Binary files differ
diff --git a/help/C/figures/trash_process.png b/help/C/figures/trash_process.png
new file mode 100644
index 0000000..d114d32
--- /dev/null
+++ b/help/C/figures/trash_process.png
Binary files differ
diff --git a/help/C/formats.page b/help/C/formats.page
new file mode 100755
index 0000000..5b9b19d
--- /dev/null
+++ b/help/C/formats.page
@@ -0,0 +1,35 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="formats">
+
+ <info>
+ <link type="guide" xref="index"/>
+ <desc>Shotwell supports JPEG, PNG, TIFF, BMP and RAW photo files as well as video files.</desc>
+
+ <link type="next" xref="running" />
+ </info>
+
+ <title>Supported photo and video formats</title>
+
+ <p>Shotwell supports JPEG, PNG, TIFF, BMP and <link type="guide" xref="other-raw">RAW</link> photo files. Shotwell does not yet support other graphics format such as GIF.</p>
+
+<p>Shotwell's RAW format support is currently limited. When you view a RAW photo, you are actually viewing a JPEG derived from the RAW photo, not the RAW image itself. Additionally, the RAW editing pipeline is not fully 16-bit - you can only export edited photos as 8-bit files. All supported formats can be used for export (JPEG, PNG, TIFF, BMP).</p>
+
+<p>For more information about RAW-format photos in Shotwell, please see
+the <link type="guide" xref="other-raw">RAW</link> section.
+</p>
+
+<p>Shotwell also supports video files in any format supported by the GStreamer media library on the system where
+Shotwell is running. This typically includes the following formats among others:</p>
+<list>
+<item><p>Container formats: Ogg, QuickTime, MP4, AVI.</p></item>
+<item><p>Codecs: Theora, Quicktime, MPEG-4, Motion JPEG. <em>Note that some operating systems may not include all
+codecs listed here due to legal or licensing restrictions.</em></p></item>
+</list>
+
+<p>Shotwell supports both photos and videos, but for simplicity, this documentation uses just the term "photos"
+in most places. Many operations in Shotwell apply to both photos and videos, however. In particular, events,
+flagging, rating, tagging, and publishing work both for photos and for videos.</p>
+
+</page>
+
diff --git a/help/C/import-camera.page b/help/C/import-camera.page
new file mode 100644
index 0000000..59d3e31
--- /dev/null
+++ b/help/C/import-camera.page
@@ -0,0 +1,33 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="import-camera">
+
+ <info>
+ <link type="guide" xref="index#import"/>
+ <desc>Copy photos from a digital camera.</desc>
+
+ <link type="next" xref="import-memorycard"/>
+ </info>
+
+ <title>Importing from a camera</title>
+
+ <p>To import photos from a digital camera:</p>
+
+ <steps>
+ <item>
+ <p>Connect the camera to your computer and switch it on.
+ Shotwell will detect it and list it in the sidebar.</p>
+ </item>
+ <item>
+ <p>Select the camera in the sidebar. Previews of each photo on the camera will be displayed.</p>
+ </item>
+ <item>
+ <p>If you like, you can choose a set of specific photos to import. To do this, hold down the <key>Ctrl</key> key and click to select individual photos. You can hold down <key>Shift</key> and click to select a range of photos too.</p>
+ </item>
+ <item>
+ <p>Click either <gui>Import Selected</gui> or <gui>Import All</gui>. The photos will be copied from the camera and saved on your computer.</p>
+ </item>
+ </steps>
+
+ <p>Once the import is complete, you can open the <gui>Last Import</gui> view (in the sidebar) to see all photos that were imported. The Events list (also in the sidebar) will also show the new photos, organized by date.</p>
+</page>
diff --git a/help/C/import-f-spot.page b/help/C/import-f-spot.page
new file mode 100644
index 0000000..f96c128
--- /dev/null
+++ b/help/C/import-f-spot.page
@@ -0,0 +1,22 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="import-f-spot">
+
+ <info>
+ <link type="guide" xref="index#import"/>
+ <desc>Shotwell can import all your photos and tags from the F-Spot photo manager.</desc>
+
+ <link type="next" xref="import-camera"/>
+ </info>
+
+ <title>Importing from F-Spot</title>
+
+ <p>To import an existing photo collection from F-Spot:</p>
+ <steps>
+ <item><p>Select <guiseq><gui>File</gui><gui>Import From F-Spot</gui></guiseq>. </p></item>
+ <item><p>Now choose either the default F-Spot library or another F-Spot database.
+ If importing from another F-Spot database, select a directory and file from the chooser dialog box.</p></item>
+ </steps>
+ <p>Shotwell will import your photos, together with their tags and other information.
+ Once the import is complete, you can select <gui>Last Import</gui> in the sidebar to see all photos successfully imported. The Events list will also show new entries for the dates corresponding to the imported photos.</p>
+</page>
diff --git a/help/C/import-file.page b/help/C/import-file.page
new file mode 100644
index 0000000..afc8cef
--- /dev/null
+++ b/help/C/import-file.page
@@ -0,0 +1,24 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="import-file">
+
+ <info>
+ <link type="guide" xref="index#import"/>
+ <desc>Import photos that are already saved on your computer.</desc>
+
+ <link type="next" xref="import-f-spot"/>
+ </info>
+
+ <title>Importing from your hard disk</title>
+
+ <p>To import photo files from your hard disk into Shotwell, just drag them from your file browser into the Shotwell window.</p>
+
+ <p>Alternatively, click <guiseq><gui>File</gui><gui>Import From Folder</gui></guiseq> and select the folder containing the photos you want to import.</p>
+
+ <p>Shotwell will ask whether you want to copy the photo files to your library folder (usually this is the <file>Pictures</file> folder in your home directory) or to import them in place without copying the files.</p>
+
+ <p>If you hold down <key>Ctrl</key> while dragging photos in, Shotwell will copy the photos into your library folder without prompting. Similarly, if you hold down <keyseq><key>Ctrl</key><key>Shift</key></keyseq> while dragging photos in, Shotwell will import the photos without copying them.</p>
+
+ <p>Once the import is complete, you can select <gui>Last Import</gui> in the sidebar to see all photos successfully imported. The Events list will also show new entries for the dates corresponding to the imported photos.</p>
+
+</page>
diff --git a/help/C/import-memorycard.page b/help/C/import-memorycard.page
new file mode 100644
index 0000000..79833d9
--- /dev/null
+++ b/help/C/import-memorycard.page
@@ -0,0 +1,32 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="import-memorycard">
+
+ <info>
+ <link type="guide" xref="index#import"/>
+ <desc>Import photos from a digital camera's memory card.</desc>
+
+ <link type="next" xref="import-file"/>
+ </info>
+
+ <title>Importing from a memory card</title>
+
+<p>To import photos from a camera memory card:</p>
+
+<steps>
+ <item>
+ <p>Put the card into your card reader. Make sure the card reader is plugged in to the computer and switched on.</p>
+ </item>
+ <item>
+ <p>The card reader and card should be detected automatically.</p>
+ </item>
+ <item>
+ <p>Follow the instructions for <link xref="import-file">importing photos from your hard disk</link>. If you click <guiseq><gui>File</gui><gui>Import From Folder</gui></guiseq>, the memory card should be visible as a folder in the side bar of the file selection window.</p>
+ </item>
+</steps>
+
+<p>Shotwell can import photos from any memory card that is compatible with your card reader.</p>
+
+<p>If the card is not detected automatically, your card reader may not have been recognized. Try unplugging it and then plugging it in again. If that doesn't work, you should still be able to import photos by <link xref="import-camera">connecting your camera directly to the computer</link>, though.</p>
+
+</page>
diff --git a/help/C/index.page b/help/C/index.page
new file mode 100644
index 0000000..9777b3f
--- /dev/null
+++ b/help/C/index.page
@@ -0,0 +1,48 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="index">
+
+ <info>
+ <title type="link">Shotwell</title>
+ <title type="text">Shotwell</title>
+ <credit type="author">
+ <name>Jim Nelson</name>
+ <email>jim@yorba.org</email>
+ <name>Allison Barlow</name>
+ <email>allison@yorba.org</email>
+ <name>Robert Ancell</name>
+ <email>robert.ancell@canonical.com</email>
+ <name>Peter Smith</name>
+ <email>pdo.smith@gmail.com</email>
+ <name>Phil Bull</name>
+ <email>philbull@gmail.com</email>
+ </credit>
+ </info>
+
+
+ <title><media type="image" src="figures/shotwell_logo.png"></media>Shotwell Photo Manager</title>
+
+ <section id="import" style="2column">
+ <title>Importing Photos</title>
+ </section>
+
+ <section id="view" style="2column">
+ <title>Viewing Photos</title>
+ </section>
+
+ <section id="organize" style="2column">
+ <title>Organizing Photos</title>
+ </section>
+
+ <section id="edit" style="2column">
+ <title>Editing Photos</title>
+ </section>
+
+ <section id="share" style="2column">
+ <title>Sharing Photos</title>
+ </section>
+
+ <section id="other" style="2column">
+ <title>Other Features</title>
+ </section>
+</page>
diff --git a/help/C/organize-event.page b/help/C/organize-event.page
new file mode 100644
index 0000000..72bf212
--- /dev/null
+++ b/help/C/organize-event.page
@@ -0,0 +1,60 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="event">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Group photos together that were taken at the same time. Learn how to rename, merge, and sort events.</desc>
+
+ <link type="next" xref="flag"/>
+ </info>
+
+ <title>Events</title>
+
+ <p>An event is a group of photos that were taken at approximately the same time. When you import photos, Shotwell checks when each photo was taken. It then groups the photos into events.</p>
+
+ <p>Choose <gui>Events</gui> from the sidebar to see your photos organized by date. If you select a month or year from the sidebar, a list of events will be displayed in the main window. Double-click an event to see all the photos that were taken around that time.</p>
+
+ <p>If a photo has no embedded date/time information, then Shotwell can't automatically
+ place it in any event. In this case the photo will appear in the <gui>No Event</gui>
+ view accessible from the sidebar. You can still move the photo to any event you like
+ as described below.
+ </p>
+
+ <section>
+ <title>Renaming events</title>
+
+ <p>To give an event a name rather than referring to it by its date, select the event, click <guiseq><gui>Edit</gui><gui>Rename Event</gui></guiseq> and enter a new name. Another way of renaming an event is to double-click its name in the sidebar; type a new name and then press <key>Enter</key>.</p>
+ </section>
+
+ <section>
+ <title>Moving photos between events</title>
+
+ <p>Even though photos are initially grouped into events by their date, you can move photos between events. To do this, drag any photo to the sidebar and drop it on an event.</p>
+ </section>
+
+ <section>
+ <title>Creating and merging events</title>
+ <p>To create a new event, select the photos you would like in the new event and click <guiseq><gui>Events</gui><gui>New Event</gui></guiseq>.</p>
+ <p>To merge events, select <guiseq><gui>Events</gui></guiseq> from the sidebar, then, while holding down <key>Ctrl</key> click on the events you want to merge in the main window area. Finally, click <guiseq><gui>Events</gui><gui>Merge Events</gui></guiseq>.</p>
+ </section>
+
+ <section>
+ <title>Sorting events</title>
+
+ <p>Events are displayed in a tree in the sidebar, organized by the year and month of the earliest photo in the event.
+ To change the event sort order, click <guiseq><gui>View</gui><gui>Sort Events</gui></guiseq> and select either ascending or descending.</p>
+
+ </section>
+
+ <section>
+ <title>Change the photo used to represent each event</title>
+
+ <p>If you select the Events item in the sidebar, you'll see a single photo which represents each event. This is called the key photo.</p>
+
+ <p>By default, Shotwell uses the first photo in each event as its key photo.
+ To use a different key photo, select the photo and choose <guiseq><gui>Photos</gui><gui>Make Key Photo for Event</gui></guiseq>.</p>
+
+ </section>
+
+</page>
diff --git a/help/C/organize-flag.page b/help/C/organize-flag.page
new file mode 100644
index 0000000..26b0a1d
--- /dev/null
+++ b/help/C/organize-flag.page
@@ -0,0 +1,35 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="flag">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Flag photos to mark them as special or to work with them as a set.</desc>
+
+ <link type="next" xref="rating"/>
+ </info>
+
+ <title>Flagging photos</title>
+
+ <p>Shotwell lets you <em>flag</em> photos. When a photo is flagged, a small flag icon
+ appears in its upper right corner. You can select the <gui>Flagged</gui> item in the sidebar to see
+ all photos which have been flagged.</p>
+
+ <p>Flagging a photo marks it as special. You can interpret this in any way you like. For example,
+ you might flag all photos which need visual
+ adjustment, or all photos which you want to share with a friend.</p>
+
+ <p>Flagging
+ is also useful because you can operate on all flagged photos as a set. For example, you can
+ select the <gui>Flagged</gui> view and then upload all flagged photos to a publishing service.</p>
+
+ <section>
+ <title>To flag or unflag a photo</title>
+ <p>
+ To flag or unflag a photo, right-click the photo and choose <gui>Flag</gui> or <gui>Unflag</gui>
+ from the context menu. Or use the <keyseq><key>Ctrl</key><key>G</key></keyseq> or <key>/</key>
+ shortcut keys.
+ </p>
+ </section>
+
+</page>
diff --git a/help/C/organize-rating.page b/help/C/organize-rating.page
new file mode 100644
index 0000000..e75abfa
--- /dev/null
+++ b/help/C/organize-rating.page
@@ -0,0 +1,30 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="rating">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Give photos a rating between 1 and 5 stars. You can reject bad photos, hiding them from view.</desc>
+
+ <link type="next" xref="delete"/>
+ </info>
+
+ <title>Ratings</title>
+<p>You can assign each photo a rating from 1-5 stars, or may alternatively rate it as Rejected, in which case Shotwell will hide the photo by default.</p>
+
+<p>You can rate a photo or a set of photos in any of these ways:</p>
+
+<list>
+<item><p>Select the photo(s), then choose a rating from the top-level <guiseq><gui>Photos</gui><gui>Set Rating</gui></guiseq> menu.</p></item>
+<item><p>Right-click on the photo(s), then choose a rating from the Set Rating context menu.</p></item>
+<item><p>Select the photo(s), then press any of the shortcut keys <key>1</key>, <key>2</key>, <key>3</key>, <key>4</key> or <key>5</key> to assign a rating. Or press <key>9</key> to mark the photo(s) as rejected or <key>0</key> to clear the rating(s).</p></item>
+</list>
+
+<p>
+Normally Shotwell displays all photos except rejected photos. You can set a different rating filter using the <guiseq><gui>View</gui><gui>Filter Photos</gui></guiseq> menu - for example, you can display only photos rated with 3 stars or higher, or you can display all photos including those marked rejected. The Shotwell icon on the toolbar displays the current rating filter and can also be used to set the filter.</p>
+
+<p>Shotwell normally displays each photo's rating in its lower left-hand corner. You can turn off the display of ratings using the <guiseq><gui>View</gui><gui>Ratings</gui></guiseq> menu item.</p>
+
+<p>You can increase or decrease a photo's rating using the <guiseq><gui>Set Rating</gui><gui>Increase</gui></guiseq> and <guiseq><gui>Set Rating</gui><gui>Decrease</gui></guiseq> commands, or the keyboard shortcuts <key>&lt;</key> and <key>&gt;</key>. </p>
+</page>
+
diff --git a/help/C/organize-remove.page b/help/C/organize-remove.page
new file mode 100644
index 0000000..4cfc3b6
--- /dev/null
+++ b/help/C/organize-remove.page
@@ -0,0 +1,45 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="delete">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Remove photos from the library, or delete them from your computer entirely.</desc>
+
+ <link type="next" xref="search"/>
+ </info>
+
+ <title>Removing and deleting photos</title>
+
+ <p>You may remove photos from your library and you may additionally delete them entirely from your hard disk.</p>
+<media type="image" src="figures/trash_process.png">Delete process</media>
+<p>This diagram shows how a photo, when deleted, is first put into Shotwell's trash. If you delete it from Shotwell's trash, it is put into your computer's trash. If you delete it from your computer's trash the photo is finally and irretrievably deleted from your computer.</p>
+<section id="delete-remove">
+ <title>Removing photos from the library</title>
+ <p>Select the photos to remove and choose <guiseq><gui>Edit</gui><gui>Move to Trash</gui></guiseq>.
+ (You can also press the <key>Delete</key> key.)
+ The photos will be moved from your library to Shotwell's Trash.</p>
+ <p>If you want to remove photos from Shotwell without having them pass through the trash, simply select the photos to be removed and choose <guiseq><gui>Edit</gui><gui>Remove From Library</gui></guiseq>. The photo files will be left in place on disk.</p>
+</section>
+
+<section id="delete-empty">
+ <title>Emptying or restoring the trash folder</title>
+ <p>Select the Trash entry in the Sidebar and Shotwell will display all photos that have been marked for removal or deletion. In the Trash view, the following commands are available:</p>
+ <terms>
+ <item><title>Delete</title><p>Delete the selected photos from the trash folder.</p></item>
+ <item><title>Restore</title><p>Restore the selected photos into Shotwell.</p></item>
+ <item><title>Empty trash</title><p>Delete all photos from the trash folder.</p></item>
+ </terms>
+</section>
+
+<section id="delete-trash">
+ <title>Deleting or emptying Trash</title>
+ <p>When you delete files from the Trash folder or empty the Trash folder, you will be given the following choices:</p>
+ <terms>
+ <item><title>Only Remove</title><p>Remove photos from the library but leave the photos in their location on the computer.</p></item>
+ <item><title>Trash file</title><p>Remove photos from the library and delete them from the computer.</p></item>
+ <item><title>Cancel</title><p>Do nothing.</p></item>
+ </terms>
+</section>
+
+</page>
diff --git a/help/C/organize-search.page b/help/C/organize-search.page
new file mode 100644
index 0000000..7f97370
--- /dev/null
+++ b/help/C/organize-search.page
@@ -0,0 +1,63 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="search">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Find photos and videos in your collection by a variety of criteria.</desc>
+
+ <link type="next" xref="tag"/>
+ </info>
+
+ <title>Searching</title>
+
+ <p>
+ There are two ways to search in Shotwell: the filter toolbar, and with a saved search. The search
+ bar allows you to quickly search the current view for certain criteria. Saved Searches feature
+ more complex search criteria and persist in the sidebar between sessions.
+ </p>
+
+ <section id="searchbar">
+ <title>Search bar</title>
+ <p>
+ The <guiseq><gui>View</gui><gui>Search Bar</gui></guiseq> checkbox toggles the display of the
+ search bar. You can also hit <keyseq><key>Ctrl</key><key>F</key></keyseq> or <key>F8</key> to
+ bring up the search bar. From this bar, you can find, show and hide photos and videos based on
+ title, tag, rating or other options.
+ </p>
+
+ <p>
+ To begin searching, simply enter a search keyword in the text box, or click on <gui>Flagged</gui>,
+ <gui>Rating</gui> or <gui>Type</gui>. The text search matches your keywords across tag names,
+ photo or video titles and photos' original filenames. The <gui>Flagged</gui>,
+ <gui>Rating</gui> and <gui>Type</gui> buttons allow you to filter your collection by
+ whether photos are flagged, their current number of stars, and whether the items shown are
+ images, videos, or raw camera files, respectively.
+ </p>
+
+ <p>
+ Disabling the search bar or exiting Shotwell automatically resets the search bar.
+ </p>
+ </section>
+
+ <section id="savedsearch">
+ <title>Saved search</title>
+ <p>
+ A saved search persists across Shotwell sessions, and is updated as photos and videos are added
+ and removed from your Shotwell library.
+ </p>
+
+ <p>
+ Create a new saved search with <guiseq><gui>Edit</gui><gui>New Search</gui></guiseq> or by hitting
+ <keyseq><key>Ctrl</key><key>S</key></keyseq>. The dialog box allows you to enter a name for the
+ search and select whether you want to meet Any, All, or None of the criteria in the following rows.
+ </p>
+
+ <p>
+ Each row represents a search criterion. Use the + button to add more rows, and the - button to
+ remove a specific row. The combo box on the left of each row selects the type of criteria.
+ Criteria must be entered correctly before the OK button becomes available.
+ </p>
+ </section>
+
+</page>
diff --git a/help/C/organize-tag.page b/help/C/organize-tag.page
new file mode 100644
index 0000000..86f2d0c
--- /dev/null
+++ b/help/C/organize-tag.page
@@ -0,0 +1,94 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="tag">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Organize photos by labelling them.</desc>
+
+ <link type="seealso" xref="event"/>
+
+ <link type="next" xref="title"/>
+ </info>
+
+ <title>Tagging photos</title>
+
+ <p>
+ You can assign one or more tags to selected photos.
+ A tag can be one or more words that you want to associate with
+ those photos.
+ </p>
+
+ <p>
+ To add new tags to photos, select the photos you would like to
+ tag, then do any of the following:
+ </p>
+
+ <list>
+ <item><p>Choose <guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq>.</p></item>
+ <item><p>Type <keyseq><key>Ctrl</key><key>T</key></keyseq>.</p></item>
+ <item><p>Drag the selected photos and drop them on the desired tag.</p></item>
+ </list>
+
+ <p>
+ When you use <keyseq><key>Ctrl</key><key>T</key></keyseq> or
+ <guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq> you can type
+ in the names of one or more tags, separated by commas.
+ Once you have created a tag, you can rename it by selecting that
+ tag in the sidebar and choosing
+ <guiseq><gui>Tags</gui><gui>Rename Tag "[name]"</gui></guiseq>,
+ by rightclicking on it and choose <gui>Rename...</gui> or
+ double-click on the tag in the sidebar.
+ </p>
+
+ <p>
+ To change which tags are associated with a particular photo,
+ select that photo, choose
+ <guiseq><gui>Tags</gui><gui>Modify Tags</gui></guiseq> or
+ right-click on a photo and select <gui>Modify Tags</gui> and
+ edit the comma separated list.
+ To remove a tag from one or more photos, first select that tag
+ in the sidebar, then select the photos you would like to remove,
+ and choose
+ <guiseq><gui>Tags</gui><gui>Remove Tag "[name]" from Photos</gui></guiseq>
+ or right-click on the photos an select
+ <gui>Remove Tag "[name]" from Photos</gui>.
+ </p>
+
+ <p>
+ To delete a tag entirely, select that tag in the sidebar and choose
+ <guiseq><gui>Tags</gui><gui>Delete Tag "[name]"</gui></guiseq>
+ or by right-click and select <gui>Delete Tag "[name]"</gui>.
+ </p>
+
+ <p>
+ When you create a tag, it will appear in the sidebar under the
+ Tags item, which is hidden if there are no tags. Photos can have
+ multiple tags attached to them, and when you click on the name
+ of a given tag in the sidebar, you will see all the photos
+ associated with that tag.
+ </p>
+
+ <section id="hierarchaicaltags">
+ <title>Hierarchical Tags</title>
+ <p>
+ Shotwell supports also hierarchial tags. You can
+ rearrange your tags by drag and drop a tag onto another.
+ To create a new subtag right-click on a tag and select
+ <gui>New</gui>.
+ </p>
+
+ <p>
+ Hierarchial tags can help you to sort your tag list in
+ ways that better match how you work or think; for example,
+ you can store location tags like "Mountains" or "Beach"
+ under a parent tag "Places", which itself can be placed
+ under the tag "Summer Holidays".
+ </p>
+
+ <p>
+ Note that deleting a parent tag will also delete its
+ child tags.
+ </p>
+ </section>
+</page>
diff --git a/help/C/organize-title.page b/help/C/organize-title.page
new file mode 100644
index 0000000..1bc1790
--- /dev/null
+++ b/help/C/organize-title.page
@@ -0,0 +1,20 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="title">
+
+ <info>
+ <link type="guide" xref="index#organize"/>
+ <desc>Give titles to your photos.</desc>
+
+ <link type="next" xref="event" />
+ </info>
+
+ <title>Titles</title>
+
+<p>The <guiseq><gui>View</gui><gui>Titles</gui></guiseq> checkbox toggles the display of titles
+beneath each photo. By default, a photo's title is its filename.</p>
+
+<p>To change a photo's title,
+select the photo and click <guiseq><gui>Photos</gui><gui>Edit Title</gui></guiseq>, or press <key>F2</key>.</p>
+
+</page>
diff --git a/help/C/other-files.page b/help/C/other-files.page
new file mode 100644
index 0000000..20bb9f8
--- /dev/null
+++ b/help/C/other-files.page
@@ -0,0 +1,146 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="other-files">
+
+ <info>
+ <link type="guide" xref="index#other"/>
+ <desc>Keep the Shotwell library in sync with photo files on disk.</desc>
+
+ <link type="next" xref="other-plugins"/>
+ </info>
+
+ <title>Photo files</title>
+
+ <p>
+ Every photo in the Shotwell library corresponds to a file stored on your hard disk. Shotwell has
+ several features which help you keep the Shotwell library and files on disk in sync.
+ </p>
+ <links type="section" />
+
+ <section id="dirpattern">
+ <title>Using a custom directory pattern</title>
+ <p>
+ Shotwell allows you to specify how it names directories in your library. You can do this
+ by changing the <gui>Directory Structure</gui> and <gui>Pattern</gui> settings in the
+ <gui>Preferences</gui> dialog. You may use a preselected pattern, or choose <gui>Custom</gui>
+ and type in your own.
+ </p>
+
+ <p>
+ The available symbols for the directory pattern begin with a % (percent sign). The values
+ these symbols produce are locale-dependent, so what you see on your computer may vary
+ from the examples below.
+ </p>
+
+ <table frame="all" rules="rowgroups">
+ <tbody>
+ <tr>
+ <td><p> </p></td> <td><p><em>Symbol</em></p></td> <td><p><em>Meaning</em></p></td> <td><p><em>Example</em></p></td>
+ </tr>
+ </tbody>
+ <tbody>
+ <tr>
+ <td><p> </p></td><td><p> %Y </p></td><td><p> Year: full </p></td><td><p> 2011 </p></td>
+ </tr>
+ <tr>
+ <td><p> </p></td><td><p> %y </p></td><td><p> Year: two digit </p></td><td><p> 11 </p></td>
+ </tr>
+ <tr>
+ <td><p> </p></td><td><p> %d </p></td><td><p> Day of the month with leading zero </p></td><td><p> 03 </p></td>
+ </tr>
+ <tr>
+ <td><p> </p></td><td><p> %A </p></td><td><p> Day name: full </p></td><td><p> Wednesday </p></td>
+ </tr>
+ <tr>
+ <td><p> </p></td><td><p> %a </p></td><td><p> Day name: abbreviated </p></td><td><p> Wed </p></td>
+ </tr>
+ <tr>
+ <td><p> </p></td><td><p> %m </p></td><td><p> Month number with leading zero </p></td><td><p> 02 </p></td>
+ </tr>
+ <tr><td><p> </p></td><td><p> %b </p></td><td><p> Month name: abbreviated </p></td><td><p> Feb
+
+ </p></td></tr><tr><td><p> </p></td><td><p> %B </p></td><td><p> Month name: full </p></td><td><p> February
+ </p></td></tr><tr><td><p> </p></td><td><p> %I </p></td><td><p> Hour: 12 hour format </p></td><td><p> 05
+ </p></td></tr><tr><td><p> </p></td><td><p> %H </p></td><td><p> Hour: 24 hour format </p></td><td><p> 17
+
+ </p></td></tr><tr><td><p> </p></td><td><p> %M </p></td><td><p> Minute </p></td><td><p> 16
+ </p></td></tr><tr><td><p> </p></td><td><p> %S </p></td><td><p> Second </p></td><td><p> 30
+ </p></td></tr><tr><td><p> </p></td><td><p> %p </p></td><td><p> AM or PM </p></td><td><p> PM </p></td></tr>
+ </tbody>
+ </table>
+
+ <p>
+ There are other symbols available; please check the manual for strftime by running
+ the command <cmd>man strftime</cmd> if you need one that isn't listed here.
+ </p>
+ </section>
+
+ <section id="automatic-import">
+ <title>Automatically importing photos</title>
+
+ <p>Shotwell can automatically import new photos which appear in the library directory.
+ (The library directory is usually the <file>Pictures</file> directory in your home directory;
+ you can change its location in in the <gui>Preferences</gui> window.)
+ </p>
+
+ <p>To enable auto-import,
+ check the box <gui>Watch library directory for new files</gui> in
+ the <gui>Preferences</gui> window.</p>
+
+ <note style="advanced"><p>Shotwell can also follow symbolic links inside automatically-imported directories.</p></note>
+
+ </section>
+
+ <section id="automatic-rename">
+ <title>Automatically renaming imported photos to lowercase</title>
+
+ <p>
+ Shotwell can automatically change the filenames of imported photos
+ to lowercase. To enable this, choose <guiseq><gui>Edit</gui><gui>Preferences</gui></guiseq>,
+ and in the <gui>Preferences</gui> window, check the <gui>Rename imported files to lowercase</gui>
+ box.
+ </p>
+
+ </section>
+
+ <section id="writing-metadata">
+ <title>Writing metadata on the fly</title>
+
+ <p>By default, Shotwell does not modify photo files, even when you edit photos or change their
+ tags or titles. Shotwell records these changes in its own database only.</p>
+
+ <p>To change this behavior, you can enable the checkbox
+ <gui>Write tags, titles and other metadata to photo files</gui>
+ in the <gui>Preferences</gui> dialog. When this option is enabled, Shotwell will write
+ the following metadata to most photo files whenever you change it in Shotwell:</p>
+
+ <list>
+ <item><p>titles</p></item>
+ <item><p>tags</p></item>
+ <item><p>ratings</p></item>
+ <item><p>rotation information</p></item>
+ <item><p>time/date</p></item>
+ </list>
+
+ <p>Shotwell stores this information in photo files in EXIF, IPTC and/or XMP format. Note
+ that Shotwell can write only to photo files in JPEG, PNG and TIFF format, not to BMP photos, RAW photos
+ or to video files.
+ </p>
+
+ </section>
+
+ <section id="runtime-monitoring">
+ <title>Runtime monitoring</title>
+
+ <p>While Shotwell is running, it notices changes made to any photo file externally.
+ When a photo file changes, Shotwell rereads the file and updates your view of the
+ photo and metadata.</p>
+
+ <p>Note that Shotwell checks all photo files for changes at startup, but only photo files contained in
+ the library directory are monitored in real time after startup. We hope to remove this limitation
+ in a further release.</p>
+
+ </section>
+
+</page>
+
diff --git a/help/C/other-missing.page b/help/C/other-missing.page
new file mode 100644
index 0000000..535070d
--- /dev/null
+++ b/help/C/other-missing.page
@@ -0,0 +1,23 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="other-missing">
+
+ <info>
+ <link type="guide" xref="index#other"/>
+ <desc>If Shotwell can't find a photo in your library, it marks it as missing.</desc>
+
+ <link type="next" xref="other-multiple"/>
+ </info>
+
+ <title>Missing photos</title>
+
+<p>Each time Shotwell starts up, it scans your photo library to verify that all photo files still exist on your hard drive. If Shotwell finds that any photo files are missing, it will not display them in the normal Photos, Events and Tags views, but will instead show them in a separate Missing Files view which will appear in the sidebar.</p>
+
+<p>If you no longer want the missing files to be part of your Shotwell collection (perhaps because you deleted them), go to the Missing Files view, select the photos and then click <gui>Remove From Library</gui>.</p>
+
+<p>If you have photos on a removable disk, such as a CD or USB flash drive, and <link xref="index#import">import</link> them into Shotwell <em>without</em> copying the photos to your computer, they will show up as missing files if you then disconnect the removable disk. See <link xref="import-file"/> to learn how to copy files from removable disks onto your computer.</p>
+
+<p>If any missing photo files become available again, Shotwell will notice this the next time it starts. The photos will once again appear in the Photos, Events and Tags views.</p>
+
+</page>
+
diff --git a/help/C/other-multiple.page b/help/C/other-multiple.page
new file mode 100644
index 0000000..1082ae9
--- /dev/null
+++ b/help/C/other-multiple.page
@@ -0,0 +1,23 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="other-multiple">
+
+ <info>
+ <link type="guide" xref="index#other"/>
+ <desc>You can open Shotwell with a different photo library by using the command line.</desc>
+
+ <link type="next" xref="other-files"/>
+ </info>
+
+ <title>Multiple libraries</title>
+
+<p>Shotwell normally stores its database and photo thumbnails in the directory <file>~/.shotwell</file> . This directory does not hold photos, but the database in this directory contains a list of all the photos in the Shotwell library.</p>
+
+<p>As an advanced feature, it's possible for you to have multiple Shotwell libraries, each of which has its own set of photos. Each library needs its own database directory. To launch Shotwell with an alternate library, specify an alternate database directory on the command line as follows:</p>
+
+<screen>
+shotwell -d [library-directory]
+</screen>
+
+</page>
+
diff --git a/help/C/other-plugins.page b/help/C/other-plugins.page
new file mode 100644
index 0000000..4381892
--- /dev/null
+++ b/help/C/other-plugins.page
@@ -0,0 +1,29 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="other-plugins">
+
+ <info>
+ <link type="guide" xref="index#other"/>
+ <desc>Extend Shotwell's functionality dynamically.</desc>
+
+ <link type="next" xref="other-missing"/>
+ </info>
+
+ <title>Plugins</title>
+ <p>
+ Shotwell can be used with <em>plugins</em>, which are companion shared libraries that can
+ add support for new publishing destinations or new slideshow transitions.
+ </p>
+
+ <p>
+ To see a list of installed plugins, choose <guiseq><gui>Edit</gui><gui>Preferences</gui></guiseq>,
+ and in the <gui>Preferences</gui> window, click on the <gui>Plugins</gui> tab. You'll see a list
+ of currently-installed plugins, each with a checkbox by it, and you may enable or disable each by
+ selecting or deselecting the checkbox by its name.
+ </p>
+
+ <note style="advanced"><p>Full documentation on how to develop new plugins is available at
+ <link href="http://redmine.yorba.org/projects/shotwell/wiki/ShotwellArchWritingPlugins">http://redmine.yorba.org/projects/shotwell/wiki/ShotwellArchWritingPlugins</link></p></note>
+
+</page>
+
diff --git a/help/C/raw.page b/help/C/raw.page
new file mode 100644
index 0000000..553f83b
--- /dev/null
+++ b/help/C/raw.page
@@ -0,0 +1,46 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="other-raw">
+
+ <info>
+ <link type="guide" xref="index#other"/>
+ <desc>More about RAW support in Shotwell.</desc>
+
+ <link type="next" xref="running" />
+ </info>
+
+ <title>RAW support in Shotwell</title>
+ <p>Some cameras have the ability to store data directly off the sensor
+ and into a file that contains extra color information; this is commonly
+ referred to as 'RAW' or 'camera RAW', and Shotwell supports these files
+ as well.</p>
+
+ <p>Since RAW photographs normally cannot be displayed directly, but must
+ be first developed - that is, have their extra information interpreted and
+ readied for displaying - most cameras will either embed a JPEG inside a
+ RAW-format file, or produce a JPEG alongside the RAW file at the time the
+ snapshot is taken. The latter is referred to throughout this document as
+ RAW+JPEG. If you import a RAW+JPEG pair, Shotwell will
+ keep them paired and treat them as one item in your library.
+ </p>
+
+ <p>When you import a RAW file, you can choose to either use the camera's
+ internally-developed JPEG or Shotwell's by selecting
+ <guiseq><gui>Photos</gui><gui>Developer</gui></guiseq> in the menus.
+ </p>
+
+ <note>
+ <p>
+ Changing between developers will cause all edits made to a photograph
+ to be discarded.
+ </p>
+ </note>
+
+ <p>
+ In order to publish or use a RAW photograph in most other software, it has to be
+ exported first. Shotwell can export your RAW photos in JPEG, PNG, TIFF
+ or BMP format, and, when publishing, will internally export a JPEG version
+ for you and publish that.
+ </p>
+
+</page>
diff --git a/help/C/running.page b/help/C/running.page
new file mode 100644
index 0000000..7f9f59c
--- /dev/null
+++ b/help/C/running.page
@@ -0,0 +1,29 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="running">
+
+ <info>
+ <link type="guide" xref="index"/>
+ <desc>Find Shotwell in the Applications menu, or have it start automatically when you plug in a camera.</desc>
+
+ <link type="seealso" xref="other-multiple" />
+
+ <link type="next" xref="formats" />
+ </info>
+
+ <title>Running Shotwell</title>
+
+<p>Once installed, Shotwell is available in your <gui>Applications</gui> menu under <gui>Graphics</gui> or <gui>Photography</gui>.</p>
+
+<p>Shotwell may also be executed automatically when a camera is plugged in to your computer. To check
+that your system is set up to run Shotwell when a camera is detected, go to
+<guiseq><gui>Edit</gui><gui>Preferences</gui></guiseq> in any
+Nautilus (file browser) window and choose the <gui>Media</gui> tab.  You'll see a dropdown box
+entitled <gui>Photos:</gui> which lets you choose Shotwell as your photo handling application.</p>
+
+<note style="advanced">
+ <p>Shotwell may also be executed directly from its build directory, although this is only recommended for testing out Shotwell or for developers.</p>
+</note>
+
+</page>
+
diff --git a/help/C/share-background.page b/help/C/share-background.page
new file mode 100644
index 0000000..9dff407
--- /dev/null
+++ b/help/C/share-background.page
@@ -0,0 +1,23 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-background">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Set your desktop background to a single photo or to a slideshow of photos.</desc>
+
+ <link type="next" xref="share-slideshow" />
+ </info>
+
+ <title>Set a desktop background or slideshow</title>
+
+ <p>To set a single photo as your desktop background, select the photo and choose <guiseq><gui>File</gui><gui>Set as Desktop Background</gui></guiseq>.</p>
+
+ <p>You can also set your background to a slideshow of photos. To do this, select the photos for
+ the slideshow and choose <guiseq><gui>File</gui><gui>Set as Desktop Slideshow</gui></guiseq>.
+ Shotwell will prompt you for a slideshow delay, which can be any interval up to one day in length.
+ The background slideshow will proceed even when Shotwell is not running.
+ </p>
+
+</page>
+
diff --git a/help/C/share-export.page b/help/C/share-export.page
new file mode 100644
index 0000000..65a5f83
--- /dev/null
+++ b/help/C/share-export.page
@@ -0,0 +1,45 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-export">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Copy photos out of Shotwell so you can put them somewhere else.</desc>
+
+ <link type="next" xref="share-print" />
+ </info>
+
+ <title>Exporting photos</title>
+
+<p>To export photos from Shotwell via drag and drop, drag the photos from Shotwell onto
+a file manager window or your desktop. The new files will be full-sized copies of
+the photos in your library.</p>
+
+<p>
+Alternatively, select a set of photos and choose the <guiseq><gui>File</gui><gui>Export</gui></guiseq> command or press <keyseq><key>Shift</key><key>Ctrl</key><key>E</key></keyseq>, which exports photos while letting you fine-tune the size and dimensions of your photo files.
+A window will appear allowing you to make several choices:
+</p>
+
+<list>
+<item><p>A format for export.
+</p>
+<list>
+<item><p>Choose <gui>Unmodified</gui> to export photos in their original format without
+any edits made in Shotwell. RAW photos will be exported in their original RAW format.</p></item>
+<item><p>Choose <gui>Current</gui> to export photos including edits made in Shotwell. RAW photos will be
+exported in JPEG format if you have edited them in Shotwell, and otherwise in their original RAW format.</p></item>
+<item><p>
+Or you can choose a particular image format (JPEG, PNG, TIFF, BMP) to be used for exporting. Any edits made in
+Shotwell will be included, and Shotwell will convert photos to the destination format.
+</p></item>
+</list>
+</item>
+<item><p>The image quality for exporting (Low, Medium, High, or Maximum).</p></item>
+<item><p>A scaling constraint (which means how Shotwell will decide to scale the photos down), and the desired pixel size.</p></item>
+<item><p>The option whether you like to export metadatas such as tags or ratings. This can help to save your privacy if you have geolocation tags or tags which shouldn't be seen by anyone.</p></item>
+</list>
+
+<p>If selected, Shotwell will write tags, titles, and other metadata to the new files.</p>
+
+</page>
+
diff --git a/help/C/share-print.page b/help/C/share-print.page
new file mode 100644
index 0000000..7af4799
--- /dev/null
+++ b/help/C/share-print.page
@@ -0,0 +1,24 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-print">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Click <guiseq><gui>File</gui><gui>Print</gui></guiseq>. For more printing options, select the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog.</desc>
+
+ <link type="next" xref="share-upload" />
+ </info>
+
+ <title>Printing</title>
+
+ <p>To print a photo, select it and choose <guiseq><gui>File</gui><gui>Print</gui></guiseq>.</p>
+
+ <p>
+ Shotwell can also print multiple images in one page; to do this, select multiple images,
+ choose <guiseq><gui>File</gui><gui>Print</gui></guiseq>, and in the <gui>Print</gui> dialog,
+ choose the <gui>Image Settings</gui> tab. In <gui>Image Settings</gui>, choose one of the
+ multiple-image-per-page options under <gui>Autosize</gui>.
+ </p>
+
+ <p>If you would like to set formatting, paper size, and orientation options, choose the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog prior to printing.</p>
+</page>
diff --git a/help/C/share-send.page b/help/C/share-send.page
new file mode 100644
index 0000000..d788f6c
--- /dev/null
+++ b/help/C/share-send.page
@@ -0,0 +1,25 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-send">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Send photos via email, instant messaging or in other ways.</desc>
+
+ <link type="next" xref="share-background" />
+ </info>
+
+ <title>Sending photos</title>
+
+ <p>Shotwell can send photos using the GNOME desktop's Send To mechanism, which
+ lets you send photos via email, instant messaging or in other ways.</p>
+ <p>To send photos, select them in Shotwell and choose
+ <guiseq><gui>File</gui><gui>Send To...</gui></guiseq>,
+ or right-click the photos and choose <gui>Send To...</gui> from the context menu.
+ A <gui>Send To</gui> dialog box will appear which lets you choose a mechanism for
+ sending the files (such as email or instant messaging) and a destination. You can
+ optionally choose to send the files in a compressed format.
+ </p>
+
+</page>
+
diff --git a/help/C/share-slideshow.page b/help/C/share-slideshow.page
new file mode 100644
index 0000000..41f131a
--- /dev/null
+++ b/help/C/share-slideshow.page
@@ -0,0 +1,23 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-slideshow">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Watch a slideshow of your photos.</desc>
+
+ <link type="next" xref="share-export" />
+ </info>
+
+ <title>Slideshows</title>
+
+ <p>To see a sideshow of any collection in Shotwell, navigate to that collection and select <guiseq><gui>View</gui><gui>Slideshow</gui></guiseq> or press <key>F5</key>.</p>
+
+ <p>You can change some settings in a running slideshow:</p>
+
+ <list>
+ <item><p>The duration how long an image should be shown: 1 - 30 seconds</p></item>
+ <item><p>You can select different transition effects.</p></item>
+ <item><p>The time for each transition effect: 0.1 - 1.0 seconds</p></item>
+ </list>
+</page>
diff --git a/help/C/share-upload.page b/help/C/share-upload.page
new file mode 100644
index 0000000..71bc93a
--- /dev/null
+++ b/help/C/share-upload.page
@@ -0,0 +1,38 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="share-upload">
+
+ <info>
+ <link type="guide" xref="index#share"/>
+ <desc>Publish photos to Facebook, Flickr, Picasa Web Albums, or other sites.</desc>
+
+ <link type="next" xref="share-send" />
+ </info>
+
+ <title>Publishing to the Web</title>
+
+ <p>Through the use of <link xref="other-plugins">plugins</link>, Shotwell can publish photos
+ and videos to the following services, each of which requires an account:</p>
+
+ <list>
+ <item><p><link href="http://facebook.com">Facebook</link></p></item>
+ <item><p><link href="http://flickr.com">Flickr</link></p></item>
+ <item><p><link href="http://picasaweb.google.com">Picasa Web Albums</link> and <link href="http://plus.google.com">Google+</link></p></item>
+ <item><p><link href="http://youtube.com">YouTube</link> (videos only)</p></item>
+ <item><p><link href="http://fotki.yandex.ru">Yandex.Fotki</link>, a photo site popular in Russia (photos only)</p></item>
+ <item><p>Any site running the <link href="http://piwigo.org">Piwigo</link> photo gallery software (photos only)</p></item>
+ </list>
+
+ <p>To publish selected photos in a collection, choose <guiseq><gui>Edit</gui><gui>Preferences</gui></guiseq> and
+ click on the <gui>Plugins</gui> tab to enable the plugin for the service you want to publish to. Next, choose,
+ <guiseq><gui>File</gui><gui>Publish</gui></guiseq>, press the <gui>Publish</gui> toolbar button or use <keyseq><key>Ctrl</key><key>P</key></keyseq>.
+ You will see a dialog that lets you select a publishing service. You will then need to log in or create an account.</p>
+
+ <p>Publishing to Facebook requires you to grant certain permissions to the Shotwell Connect Facebook application.
+ You only need to grant these permissions once, when you first associate Shotwell Connect with your Facebook account.
+</p>
+
+ <p>Similarly, publishing to Flickr requires you to log in and permit Shotwell Connect to access your account.</p>
+
+ <p>If you have a Google account, but have not yet used Picasa Web Albums, you will need to log in to Picasa using a browser once before you can publish to this service.</p>
+</page>
diff --git a/help/C/view-displaying.page b/help/C/view-displaying.page
new file mode 100644
index 0000000..7833e03
--- /dev/null
+++ b/help/C/view-displaying.page
@@ -0,0 +1,28 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="view-view">
+
+ <info>
+ <link type="guide" xref="index#view"/>
+ <desc>Learn about different ways of viewing your photos: in a grid, filling the main window, or filling the whole screen.</desc>
+
+ <link type="next" xref="view-sidebar"/>
+ </info>
+
+ <title>Photo views</title>
+
+<p>When you select any collection in the sidebar, Shotwell displays all photos in the collection in the main window area. At the bottom right is a slider which adjusts the viewing size of the thumbnails. You may also adjust the thumbnail size using the plus and minus keys (<key>+</key> and <key>-</key>) or by pressing <key>Ctrl</key> while moving your mouse scroll wheel.</p>
+
+<p>You can view a photo full-window by double-clicking on it. From there you may move to other photos in the collection with the Back and Forward buttons. To return to the collection, double-click on the photo or press <key>Esc</key>.</p>
+
+<p>When viewing a photo in full-window mode, the slider on the toolbar controls zoom. You can pan around by grabbing and dragging anywhere on the photo. You can also zoom using your scroll wheel or by pressing the following keyboard shortcuts: <keyseq><key>Ctrl</key>0</keyseq> for the full image, <keyseq><key>Ctrl</key>1</keyseq> for 100% (1 photo pixel = 1 screen pixel), and <keyseq><key>Ctrl</key>2</keyseq> for 200% (1 photo pixel = 2x2 screen pixels).</p>
+
+<p>Shotwell offers a fullscreen mode to display photos. Choose <guiseq><gui>View</gui><gui>Fullscreen</gui></guiseq> or press <key>F11</key>. To see the fullscreen toolbar, move your mouse to the bottom of the screen. The toolbar offers buttons to move through the collection, to pin the toolbar down (so it isn't hidden when you move the mouse away), and to leave fullscreen view.</p>
+
+<section>
+<title>Viewing videos</title>
+<p>When you double-click a video, Shotwell will launch an external video player to play the video. It's not currently
+possible to display a video in full-window mode in Shotwell or to play the video within Shotwell itself.</p>
+</section>
+
+</page>
diff --git a/help/C/view-information.page b/help/C/view-information.page
new file mode 100644
index 0000000..c62f27e
--- /dev/null
+++ b/help/C/view-information.page
@@ -0,0 +1,19 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="view-information">
+
+ <info>
+ <link type="guide" xref="index#view"/>
+ <desc>View more detailed information about photos, like the exposure mode used by the camera.</desc>
+
+ <link type="next" xref="view-view"/>
+ </info>
+
+ <title>Basic and extended information</title>
+
+<p>The Basic Information pane appears at the bottom of the sidebar, and displays a brief summary of the photos you've selected. If no photos are selected, it displays a summary of the entire collection. You can toggle the display of this pane using the <guiseq><gui>View</gui><gui>Basic Information</gui></guiseq> command.</p>
+
+<p>The floating Extended Information window displays more information about the selected photo. The <guiseq><gui>View</gui><gui>Extended Information</gui></guiseq> command or <keyseq><key>Ctrl</key><key>Shift</key><key>X</key></keyseq> toggles the display of this window.</p>
+
+</page>
+
diff --git a/help/C/view-sidebar.page b/help/C/view-sidebar.page
new file mode 100644
index 0000000..2da4674
--- /dev/null
+++ b/help/C/view-sidebar.page
@@ -0,0 +1,36 @@
+<page xmlns="http://projectmallard.org/1.0/"
+ type="guide"
+ id="view-sidebar">
+
+ <info>
+ <link type="guide" xref="index#view"/>
+ <desc>The sidebar on the left of the window lists various views of your library.</desc>
+
+ <link type="seealso" xref="event"/>
+ <link type="seealso" xref="tag"/>
+ <link type="seealso" xref="flag"/>
+ <link type="seealso" xref="search#savedsearch"/>
+ <link type="seealso" xref="import-file"/>
+ <link type="seealso" xref="import-f-spot"/>
+ <link type="seealso" xref="import-memorycard"/>
+ <link type="seealso" xref="import-camera"/>
+
+ <link type="next" xref="view-information"/>
+ </info>
+
+ <title>The sidebar</title>
+
+<p>The sidebar on the left side of the Shotwell window lists various views of your library. Although you may see the same photo in multiple views, it's only stored once on your hard drive.</p>
+
+<p>The <gui>Last Import</gui> view lists your last imported photos no matter if they are imported from F-Spot, your camera, a memory card or the hard disk.</p>
+
+<p>The <gui>Flagged</gui> lists all photos you had previous flagged.</p>
+
+<p>The <gui>Saved Search</gui> allows you to sort your library by many criteria.</p>
+
+<p>The <gui>Events</gui> folder lists all events in your library. An event is a group of photos that were taken at approximately the same time.</p>
+
+<p>The <gui>Tags</gui> folder lists all tags you've assigned to photos. Photos can have multiple tags attached to them. When you click on the name of a tag in the sidebar, you will see all the photos associated with that tag.</p>
+
+</page>
+
diff --git a/help/Makefile.am b/help/Makefile.am
new file mode 100644
index 0000000..27d8e1d
--- /dev/null
+++ b/help/Makefile.am
@@ -0,0 +1,53 @@
+# Dummy Makefile.am to allow the help to be translated on l10n.gnome.org.
+# This isn't actually processed by automake.
+
+DOC_ID = shotwell
+
+DOC_IMAGES = \
+ crop_thirds.jpg \
+ editing_overview.png \
+ edit_toolbar.png \
+ shotwell_logo.png \
+ trash_process.png
+
+DOC_PAGES = \
+ edit-adjustments.page \
+ edit-crop.page \
+ edit-enhance.page \
+ edit-external.page \
+ edit-nondestructive.page \
+ edit-redeye.page \
+ edit-rotate.page \
+ edit-straighten.page \
+ edit-time-date.page \
+ edit-undo.page \
+ formats.page \
+ import-camera.page \
+ import-file.page \
+ import-f-spot.page \
+ import-memorycard.page \
+ index.page \
+ organize-event.page \
+ organize-flag.page \
+ organize-rating.page \
+ organize-remove.page \
+ organize-search.page \
+ organize-tag.page \
+ organize-title.page \
+ other-files.page \
+ other-missing.page \
+ other-multiple.page \
+ other-plugins.page \
+ raw.page \
+ running.page \
+ share-background.page \
+ share-export.page \
+ share-print.page \
+ share-send.page \
+ share-slideshow.page \
+ share-upload.page \
+ view-displaying.page \
+ view-information.page \
+ view-sidebar.page
+
+DOC_LINGUAS = el es
diff --git a/help/el/el.po b/help/el/el.po
new file mode 100644
index 0000000..778554a
--- /dev/null
+++ b/help/el/el.po
@@ -0,0 +1,2973 @@
+# Greek translation for shotwell.
+# Copyright (C) 2014 shotwell's COPYRIGHT HOLDER
+# This file is distributed under the same license as the shotwell package.
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell master\n"
+"POT-Creation-Date: 2014-03-16 11:29+0000\n"
+"PO-Revision-Date: 2014-03-16 19:07+0300\n"
+"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
+"Language-Team: team@lists.gnome.gr\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.0\n"
+
+#: C/view-sidebar.page:7(desc)
+msgid ""
+"The sidebar on the left of the window lists various views of your library."
+msgstr ""
+"Η πλευρική στήλη στα αριστερά του παραθύρου καταχωρίζει ποικίλες προβολές "
+"της βιβλιοθήκης σας."
+
+#: C/view-sidebar.page:21(title)
+msgid "The sidebar"
+msgstr "Η πλευρική στήλη"
+
+#: C/view-sidebar.page:23(p)
+msgid ""
+"The sidebar on the left side of the Shotwell window lists various views of "
+"your library. Although you may see the same photo in multiple views, it's "
+"only stored once on your hard drive."
+msgstr ""
+"Η πλευρική στήλη στα αριστερά του παραθύρου Shotwell εμφανίζει ποικίλες "
+"προβολές της βιβλιοθήκης σας. Αν και μπορείτε να δείτε την ίδια φωτογραφία "
+"σε πολλές προβολές, είναι αποθηκευμένη μόνο μια φορά στον σκληρό σας δίσκο."
+
+#: C/view-sidebar.page:25(p)
+msgid ""
+"The <gui>Last Import</gui> view lists your last imported photos no matter if "
+"they are imported from F-Spot, your camera, a memory card or the hard disk."
+msgstr ""
+"Η προβολή <gui>Τελευταία εισαγωγή</gui> εμφανίζει τις τελευταίες εισηγμένες "
+"φωτογραφίες άσχετα με το αν εισήχθησαν από το F-Spot, τη κάμερά σας, μια "
+"κάρτα μνήμης ή τον σκληρό δίσκο."
+
+#: C/view-sidebar.page:27(p)
+msgid "The <gui>Flagged</gui> lists all photos you had previous flagged."
+msgstr ""
+"Το <gui>Με σημαία</gui> εμφανίζει όλες τις φωτογραφίες που είχατε "
+"προηγούμενων με σημαία."
+
+#: C/view-sidebar.page:29(p)
+msgid ""
+"The <gui>Saved Search</gui> allows you to sort your library by many criteria."
+msgstr ""
+"Το <gui>Αποθηκευμένη αναζήτηση</gui> σας επιτρέπει την ταξινόμηση της "
+"βιβλιοθήκης σας με πολλά κριτήρια."
+
+#: C/view-sidebar.page:31(p)
+msgid ""
+"The <gui>Events</gui> folder lists all events in your library. An event is a "
+"group of photos that were taken at approximately the same time."
+msgstr ""
+"Ο φάκελος <gui>Συμβάντα</gui> εμφανίζει όλα τα συμβάντα στη βιβλιοθήκη σας. "
+"Ένα συμβάν είναι μια ομάδα φωτογραφιών που ελήφθησαν περίπου την ίδια ώρα."
+
+#: C/view-sidebar.page:33(p)
+msgid ""
+"The <gui>Tags</gui> folder lists all tags you've assigned to photos. Photos "
+"can have multiple tags attached to them. When you click on the name of a tag "
+"in the sidebar, you will see all the photos associated with that tag."
+msgstr ""
+"Ο φάκελος <gui>Ετικέτες</gui> εμφανίζει όλες τις ετικέτες που έχετε "
+"εκχωρήσει σε φωτογραφίες. Οι φωτογραφίες μπορούν να έχουν πολλαπλές ετικέτες "
+"συσχετισμένες με αυτές. Όταν πατήσετε σε ένα όνομα μιας ετικέτας στην "
+"πλευρική στήλη, θα δείτε όλες τις συσχετισμένες φωτογραφίες με αυτήν την "
+"ετικέτα."
+
+#: C/view-information.page:7(desc)
+msgid ""
+"View more detailed information about photos, like the exposure mode used by "
+"the camera."
+msgstr ""
+"Προβολή περισσότερο λεπτομερών πληροφοριών για τις φωτογραφίες, όπως η "
+"κατάσταση έκθεσης που χρησιμοποιείται από τη φωτογραφική μηχανή."
+
+#: C/view-information.page:12(title)
+msgid "Basic and extended information"
+msgstr "Βασικές και εκτεταμένες πληροφορίες"
+
+#: C/view-information.page:14(p)
+msgid ""
+"The Basic Information pane appears at the bottom of the sidebar, and "
+"displays a brief summary of the photos you've selected. If no photos are "
+"selected, it displays a summary of the entire collection. You can toggle the "
+"display of this pane using the <guiseq><gui>View</gui><gui>Basic "
+"Information</gui></guiseq> command."
+msgstr ""
+"Το βασικό φάτνωμα πληροφοριών εμφανίζεται στο τέλος της πλευρικής στήλης και "
+"εμφανίζει μια σύντομη περίληψη των φωτογραφιών που έχετε επιλέξει. Αν δεν "
+"επιλεγεί καμία φωτογραφία, εμφανίζει μια περίληψη ολόκληρης της συλλογής. "
+"Μπορείτε να εναλλάξετε την εμφάνιση αυτού του φατνώματος χρησιμοποιώντας την "
+"εντολή <guiseq><gui>Προβολή</gui><gui>Βασικές πληροφορίες</gui></guiseq>."
+
+#: C/view-information.page:16(p)
+msgid ""
+"The floating Extended Information window displays more information about the "
+"selected photo. The <guiseq><gui>View</gui><gui>Extended Information</gui></"
+"guiseq> command or <keyseq><key>Ctrl</key><key>Shift</key><key>X</key></"
+"keyseq> toggles the display of this window."
+msgstr ""
+"Το αιωρούμενο εκτεταμένο παράθυρο πληροφοριών εμφανίζει περισσότερες "
+"πληροφορίες για την επιλεγμένη φωτογραφία. Η εντολή <guiseq><gui>Προβολή</"
+"gui><gui>Εκτεταμένες πληροφορίες</gui></guiseq> ή <keyseq><key>Ctrl</"
+"key><key>Shift</key><key>X</key></keyseq> εναλλάσσει την εμφάνιση αυτού του "
+"παραθύρου."
+
+#: C/view-displaying.page:7(desc)
+msgid ""
+"Learn about different ways of viewing your photos: in a grid, filling the "
+"main window, or filling the whole screen."
+msgstr ""
+"Μάθετε για τους διαφορετικούς τρόπους προβολής των φωτογραφιών σας: σε ένα "
+"πλέγμα, με γεμάτο το κυρίως παράθυρο ή όλη την οθόνη."
+
+#: C/view-displaying.page:12(title)
+msgid "Photo views"
+msgstr "Προβολές φωτογραφίας"
+
+#: C/view-displaying.page:14(p)
+msgid ""
+"When you select any collection in the sidebar, Shotwell displays all photos "
+"in the collection in the main window area. At the bottom right is a slider "
+"which adjusts the viewing size of the thumbnails. You may also adjust the "
+"thumbnail size using the plus and minus keys (<key>+</key> and <key>-</key>) "
+"or by pressing <key>Ctrl</key> while moving your mouse scroll wheel."
+msgstr ""
+"Όταν επιλέγετε οποιαδήποτε συλλογή στην πλευρική στήλη, το Shotwell "
+"εμφανίζει όλες τις φωτογραφίες της συλλογής στην περιοχή του κυρίως "
+"παραθύρου. Στα κάτω δεξιά υπάρχει ένας ολισθητής που ρυθμίζει το μέγεθος "
+"προβολής των μικρογραφιών. Μπορείτε επίσης να ρυθμίσετε το μέγεθος "
+"μικρογραφιών χρησιμοποιώντας τα πλήκτρα συν και πλην (<key>+</key> και <key>-"
+"</key>) ή πατώντας το <key>Ctrl</key> ενώ μετακινείτε τον τροχό κύλισης του "
+"ποντικιού."
+
+#: C/view-displaying.page:16(p)
+msgid ""
+"You can view a photo full-window by double-clicking on it. From there you "
+"may move to other photos in the collection with the Back and Forward "
+"buttons. To return to the collection, double-click on the photo or press "
+"<key>Esc</key>."
+msgstr ""
+"Μπορείτε να προβάλετε μια φωτογραφία σε πλήρες παράθυρο διπλοπατώντας την. "
+"Από εκεί μπορείτε να μετακινηθείτε σε άλλες φωτογραφίες στη συλλογή με τα "
+"πλήκτρα πίσω και μπροστά. Για να επιστρέψετε στη συλλογή, διπλοπατήστε στη "
+"φωτογραφία ή πατήστε το πλήκτρο <key>Διαφυγής</key>."
+
+#: C/view-displaying.page:18(p)
+msgid ""
+"When viewing a photo in full-window mode, the slider on the toolbar controls "
+"zoom. You can pan around by grabbing and dragging anywhere on the photo. You "
+"can also zoom using your scroll wheel or by pressing the following keyboard "
+"shortcuts: <keyseq><key>Ctrl</key>0</keyseq> for the full image, "
+"<keyseq><key>Ctrl</key>1</keyseq> for 100% (1 photo pixel = 1 screen pixel), "
+"and <keyseq><key>Ctrl</key>2</keyseq> for 200% (1 photo pixel = 2x2 screen "
+"pixels)."
+msgstr ""
+"Όταν προβάλετε μια φωτογραφία σε κατάσταση πλήρους παραθύρου, ο ολισθητής "
+"στην εργαλειοθήκη ελέγχει την εστίαση. Μπορείτε να μετακινηθείτε ολόγυρα "
+"συλλαμβάνοντας και μεταφέροντας οπουδήποτε στην φωτογραφία. Μπορείτε επίσης "
+"να εστιάσετε χρησιμοποιώντας τον τροχό κύλισης ή πατώντας τις παρακάτω "
+"συντομεύσεις πληκτρολογίου: <keyseq><key>Ctrl</key>0</keyseq> για την πλήρη "
+"εικόνα, <keyseq><key>Ctrl</key>1</keyseq> για 100% (1 εικονοστοιχείο "
+"φωτογραφίας = 1 εικονοστοιχείο οθόνης) και <keyseq><key>Ctrl</key>2</keyseq> "
+"για 200% (1 εικονοστοιχείο φωτογραφίας = 2x2 εικονοστοιχεία οθόνης)."
+
+#: C/view-displaying.page:20(p)
+msgid ""
+"Shotwell offers a fullscreen mode to display photos. Choose "
+"<guiseq><gui>View</gui><gui>Fullscreen</gui></guiseq> or press <key>F11</"
+"key>. To see the fullscreen toolbar, move your mouse to the bottom of the "
+"screen. The toolbar offers buttons to move through the collection, to pin "
+"the toolbar down (so it isn't hidden when you move the mouse away), and to "
+"leave fullscreen view."
+msgstr ""
+"Το Shotwell προσφέρει μια κατάσταση πλήρους οθόνης για προβολή φωτογραφιών. "
+"Επιλέξτε <guiseq><gui>Προβολή</gui><gui>Πλήρης οθόνη</gui></guiseq> ή "
+"πατήστε <key>F11</key>. Για να δείτε την εργαλειοθήκη πλήρης οθόνη, "
+"μετακινήστε το ποντίκι σας στο τέλος της οθόνης. Η εργαλειοθήκη προσφέρει "
+"πλήκτρα για μετακίνηση μέσα από τη συλλογή, για να προσδέσει την "
+"εργαλειοθήκη (έτσι δεν είναι κρυφή όταν μετακινείτε το ποντίκι μακριά) και "
+"για να αφήσετε την προβολή πλήρους οθόνης."
+
+#: C/view-displaying.page:23(title)
+msgid "Viewing videos"
+msgstr "Προβολή βίντεο"
+
+#: C/view-displaying.page:24(p)
+msgid ""
+"When you double-click a video, Shotwell will launch an external video player "
+"to play the video. It's not currently possible to display a video in full-"
+"window mode in Shotwell or to play the video within Shotwell itself."
+msgstr ""
+"Όταν διπλοπατάτε ένα βίντεο, το Shotwell θα ξεκινήσει μια εξωτερική συσκευή "
+"βίντεο για να αναπαραγάγει το βίντεο. Δεν είναι προς το παρόν δυνατή η "
+"εμφάνιση ενός βίντεο σε κατάσταση πλήρους παραθύρου στο Shotwell ή η "
+"αναπαραγωγή του βίντεο στο ίδιο το Shotwell."
+
+#: C/share-upload.page:7(desc)
+msgid "Publish photos to Facebook, Flickr, Picasa Web Albums, or other sites."
+msgstr ""
+"Δημοσίευση φωτογραφιών στα Facebook, Flickr, συλλογές ιστού Picasa, ή άλλους "
+"τόπους."
+
+#: C/share-upload.page:12(title)
+msgid "Publishing to the Web"
+msgstr "Δημοσιεύοντας στον ιστό"
+
+#: C/share-upload.page:14(p)
+msgid ""
+"Through the use of <link xref=\"other-plugins\">plugins</link>, Shotwell can "
+"publish photos and videos to the following services, each of which requires "
+"an account:"
+msgstr ""
+"Μέσα από τη χρήση <link xref=\"other-plugins\">προσθέτων</link>, το Shotwell "
+"μπορεί να δημοσιεύσει φωτογραφίες και βίντεο στις ακόλουθες υπηρεσίες, που "
+"καθεμιά τους απαιτεί έναν λογαριασμό:"
+
+#: C/share-upload.page:18(link)
+msgid "Facebook"
+msgstr "Facebook"
+
+#: C/share-upload.page:19(link)
+msgid "Flickr"
+msgstr "Flickr"
+
+#: C/share-upload.page:20(p)
+msgid ""
+"<link href=\"http://picasaweb.google.com\">Picasa Web Albums</link> and "
+"<link href=\"http://plus.google.com\">Google+</link>"
+msgstr ""
+"<link href=\"http://picasaweb.google.com\">Συλλογές ιστού Picasa</link> και "
+"<link href=\"http://plus.google.com\">Google+</link>"
+
+#: C/share-upload.page:21(p)
+msgid "<link href=\"http://youtube.com\">YouTube</link> (videos only)"
+msgstr "<link href=\"http://youtube.com\">YouTube</link> (μόνο βίντεο)"
+
+#: C/share-upload.page:22(p)
+msgid ""
+"<link href=\"http://fotki.yandex.ru\">Yandex.Fotki</link>, a photo site "
+"popular in Russia (photos only)"
+msgstr ""
+"<link href=\"http://fotki.yandex.ru\">Yandex.Fotki</link>, έναν δημοφιλή "
+"τόπο φωτογραφιών στη Ρωσία (μόνο φωτογραφίες)"
+
+#: C/share-upload.page:23(p)
+msgid ""
+"Any site running the <link href=\"http://piwigo.org\">Piwigo</link> photo "
+"gallery software (photos only)"
+msgstr ""
+"Οποιονδήποτε τόπο που τρέχει το λογισμικό συλλογής φωτογραφιών <link href="
+"\"http://piwigo.org\">Piwigo</link> (μόνο φωτογραφίες)"
+
+#: C/share-upload.page:26(p)
+msgid ""
+"To publish selected photos in a collection, choose <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq> and click on the <gui>Plugins</gui> tab "
+"to enable the plugin for the service you want to publish to. Next, choose, "
+"<guiseq><gui>File</gui><gui>Publish</gui></guiseq>, press the <gui>Publish</"
+"gui> toolbar button or use <keyseq><key>Ctrl</key><key>P</key></keyseq>. You "
+"will see a dialog that lets you select a publishing service. You will then "
+"need to log in or create an account."
+msgstr ""
+"Για να δημοσιεύσετε επιλεγμένες φωτογραφίες σε μια συλλογή, επιλέξτε "
+"<guiseq><gui>Επεξεργασία</gui><gui>Προτιμήσεις</gui></guiseq> και πατήστε "
+"την καρτέλα <gui>Πρόσθετα</gui> για να ενεργοποιήσετε το πρόσθετο για την "
+"υπηρεσία στην οποία θέλετε να δημοσιεύσετε. Κατόπιν, επιλέξτε, "
+"<guiseq><gui>Αρχείο</gui><gui>Δημοσίευση</gui></guiseq>, πατήστε το πλήκτρο "
+"εργαλειοθήκης <gui>Δημοσίευση</gui> ή χρησιμοποιήστε <keyseq><key>Ctrl</"
+"key><key>P</key></keyseq>. Θα δείτε έναν διάλογο που σας επιτρέπει να "
+"επιλέξετε μια υπηρεσία δημοσίευσης. Θα χρειαστείτε τότε να συνδεθείτε ή να "
+"δημιουργήσετε έναν λογαριασμό."
+
+#: C/share-upload.page:31(p)
+msgid ""
+"Publishing to Facebook requires you to grant certain permissions to the "
+"Shotwell Connect Facebook application. You only need to grant these "
+"permissions once, when you first associate Shotwell Connect with your "
+"Facebook account."
+msgstr ""
+"Η δημοσίευση στο Facebook απαιτεί να δώσετε συγκεκριμένα δικαιώματα στην "
+"εφαρμογή Shotwell Connect με το Facebook. Εσείς χρειάζεστε να δώσετε αυτά τα "
+"δικαιώματα μια φορά, όταν συσχετίζετε για πρώτη φορά το Shotwell Connect με "
+"τον λογαριασμό σας στο Facebook."
+
+#: C/share-upload.page:35(p)
+msgid ""
+"Similarly, publishing to Flickr requires you to log in and permit Shotwell "
+"Connect to access your account."
+msgstr ""
+"Παρόμοια, η δημοσίευση στο Flickr απαιτεί να συνδεθείτε και να επιτρέψετε "
+"στο Shotwell Connect να προσπελάσει τον λογαριασμό σας."
+
+#: C/share-upload.page:37(p)
+msgid ""
+"If you have a Google account, but have not yet used Picasa Web Albums, you "
+"will need to log in to Picasa using a browser once before you can publish to "
+"this service."
+msgstr ""
+"Αν έχετε έναν λογαριασμό Google, αλλά δεν έχετε ακόμα χρησιμοποιήσει τις "
+"συλλογές ιστού Picasa, θα χρειαστείτε να συνδεθείτε στο Picasa "
+"χρησιμοποιώντας έναν περιηγητή μια φορά πριν να μπορείτε να δημοσιεύετε σε "
+"αυτήν την υπηρεσία."
+
+#: C/share-slideshow.page:7(desc)
+msgid "Watch a slideshow of your photos."
+msgstr "Παρακολούθηση μιας προβολής διαφανειών των φωτογραφιών σας."
+
+#: C/share-slideshow.page:12(title)
+msgid "Slideshows"
+msgstr "Προβολές διαφανειών"
+
+#: C/share-slideshow.page:14(p)
+msgid ""
+"To see a sideshow of any collection in Shotwell, navigate to that collection "
+"and select <guiseq><gui>View</gui><gui>Slideshow</gui></guiseq> or press "
+"<key>F5</key>."
+msgstr ""
+"Για να δείτε νια προβολή διαφανειών οποιασδήποτε συλλογής στο Shotwell, "
+"περιηγηθείτε σε αυτήν τη συλλογή και επιλέξτε <guiseq><gui>Προβολή</"
+"gui><gui>Προβολή διαφανειών</gui></guiseq> ή πατήστε <key>F5</key>."
+
+#: C/share-slideshow.page:16(p)
+msgid "You can change some settings in a running slideshow:"
+msgstr ""
+"Μπορείτε να αλλάξετε κάποιες ρυθμίσεις σε μια εκτελούμενη προβολή διαφανειών:"
+
+#: C/share-slideshow.page:19(p)
+msgid "The duration how long an image should be shown: 1 - 30 seconds"
+msgstr ""
+"Η διάρκεια χρόνου εμφάνισης μιας εικόνας πρέπει να είναι: 1 - 30 δευτερόλεπτα"
+
+#: C/share-slideshow.page:20(p)
+msgid "You can select different transition effects."
+msgstr "Μπορείτε να επιλέξετε διαφορετικά εφέ μετάβασης."
+
+#: C/share-slideshow.page:21(p)
+msgid "The time for each transition effect: 0.1 - 1.0 seconds"
+msgstr "Ο χρόνος για κάθε εφέ μετάβασης: 0.1 - 1.0 δευτερόλεπτα"
+
+#: C/share-send.page:7(desc)
+msgid "Send photos via email, instant messaging or in other ways."
+msgstr ""
+"Αποστολή φωτογραφιών μέσα από ηλεκτρονική αλληλογραφία, άμεσα μηνύματα ή με "
+"άλλους τρόπους."
+
+#: C/share-send.page:12(title)
+msgid "Sending photos"
+msgstr "Αποστολή φωτογραφιών"
+
+#: C/share-send.page:14(p)
+msgid ""
+"Shotwell can send photos using the GNOME desktop's Send To mechanism, which "
+"lets you send photos via email, instant messaging or in other ways."
+msgstr ""
+"Το Shotwell μπορεί να στείλει φωτογραφίες χρησιμοποιώντας τον μηχανισμό "
+"αποστολής προς της επιφάνειας εργασίας GNOME, που σας επιτρέπει να στέλνετε "
+"φωτογραφίες μέσα από ηλεκτρονική αλληλογραφία, άμεσα μηνύματα ή με άλλους "
+"τρόπους."
+
+#: C/share-send.page:16(p)
+msgid ""
+"To send photos, select them in Shotwell and choose <guiseq><gui>File</"
+"gui><gui>Send To...</gui></guiseq>, or right-click the photos and choose "
+"<gui>Send To...</gui> from the context menu. A <gui>Send To</gui> dialog box "
+"will appear which lets you choose a mechanism for sending the files (such as "
+"email or instant messaging) and a destination. You can optionally choose to "
+"send the files in a compressed format."
+msgstr ""
+"Για να στείλετε φωτογραφίες, επιλέξτε τες στο Shotwell και επιλέξτε "
+"<guiseq><gui>Αρχείο</gui><gui>Αποστολή σε...</gui></guiseq>, ή δεξιοπατήστε "
+"τις φωτογραφίες και επιλέξτε <gui>Αποστολή σε...</gui> από το μενού "
+"περιεχομένων. Ένα πλαίσιο διαλόγου <gui>Αποστολή προς</gui> θα εμφανιστεί "
+"που σας επιτρέπει να επιλέξετε έναν μηχανισμό για αποστολή των αρχείων (όπως "
+"ηλεκτρονική αλληλογραφία ή άμεσα μηνύματα) και έναν προορισμό. Μπορείτε "
+"προαιρετικά να επιλέξετε να στείλετε τα αρχεία σε συμπιεσμένη μορφή."
+
+#: C/share-print.page:7(desc)
+msgid ""
+"Click <guiseq><gui>File</gui><gui>Print</gui></guiseq>. For more printing "
+"options, select the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog."
+msgstr ""
+"Πατήστε <guiseq><gui>Αρχείο</gui><gui>Εκτύπωση</gui></guiseq>. Για "
+"περισσότερες επιλογές εκτύπωσης, επιλέξτε την καρτέλα <gui>Διαμόρφωση "
+"σελίδας</gui> στον διάλογο <gui>Εκτύπωση</gui>."
+
+#: C/share-print.page:12(title)
+msgid "Printing"
+msgstr "Εκτύπωση"
+
+#: C/share-print.page:14(p)
+msgid ""
+"To print a photo, select it and choose <guiseq><gui>File</gui><gui>Print</"
+"gui></guiseq>."
+msgstr ""
+"Για να εκτυπώσετε μια φωτογραφία, επιλέξτε την και επιλέξτε "
+"<guiseq><gui>Αρχείο</gui><gui>Εκτύπωση</gui></guiseq>."
+
+#: C/share-print.page:16(p)
+msgid ""
+"Shotwell can also print multiple images in one page; to do this, select "
+"multiple images, choose <guiseq><gui>File</gui><gui>Print</gui></guiseq>, "
+"and in the <gui>Print</gui> dialog, choose the <gui>Image Settings</gui> "
+"tab. In <gui>Image Settings</gui>, choose one of the multiple-image-per-page "
+"options under <gui>Autosize</gui>."
+msgstr ""
+"Το Shotwell μπορεί να εκτυπώσει επίσης πολλαπλές εικόνες σε μια σελίδα· για "
+"να το κάνετε αυτό, επιλέξτε πολλαπλές εικόνες, διαλέξτε <guiseq><gui>Αρχείο</"
+"gui><gui>Εκτύπωση</gui></guiseq> και στον διάλογο <gui>Εκτύπωση</gui>, "
+"επιλέξτε την καρτέλα <gui>Ρυθμίσεις εικόνας</gui>. Στο <gui>Ρυθμίσεις "
+"εικόνας</gui>, επιλέξτε μια από τις επιλογές πολλαπλές εικόνες ανά σελίδα "
+"στο <gui>Αυτόματο μέγεθος</gui>."
+
+#: C/share-print.page:23(p)
+msgid ""
+"If you would like to set formatting, paper size, and orientation options, "
+"choose the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog prior to "
+"printing."
+msgstr ""
+"Αν θα θέλατε να ορίσετε επιλογές μορφοποίηση, μέγεθος χαρτιού και "
+"προσανατολισμό, επιλέξτε την καρτέλα <gui>Διαμόρφωση σελίδας</gui> στον "
+"διάλογο <gui>Εκτύπωση</gui> πριν από την εκτύπωση."
+
+#: C/share-export.page:7(desc)
+msgid "Copy photos out of Shotwell so you can put them somewhere else."
+msgstr ""
+"Αντιγραφή φωτογραφιών από το Shotwell, έτσι ώστε να μπορείτε να τις βάλετε "
+"κάπου αλλού."
+
+#: C/share-export.page:12(title)
+msgid "Exporting photos"
+msgstr "Εξαγωγή φωτογραφιών"
+
+#: C/share-export.page:14(p)
+msgid ""
+"To export photos from Shotwell via drag and drop, drag the photos from "
+"Shotwell onto a file manager window or your desktop. The new files will be "
+"full-sized copies of the photos in your library."
+msgstr ""
+"Για να εξάγετε φωτογραφίες από το Shotwell μέσα από μεταφορά και απόθεση, "
+"μεταφέρτε τις φωτογραφίες από το Shotwell σε ένα παράθυρο διαχειριστή "
+"αρχείων ή στην επιφάνεια εργασίας σας. Τα νέα αρχεία θα είναι αντίγραφα "
+"πλήρους μεγέθους των φωτογραφιών στη βιβλιοθήκη σας."
+
+#: C/share-export.page:18(p)
+msgid ""
+"Alternatively, select a set of photos and choose the <guiseq><gui>File</"
+"gui><gui>Export</gui></guiseq> command or press <keyseq><key>Shift</"
+"key><key>Ctrl</key><key>E</key></keyseq>, which exports photos while letting "
+"you fine-tune the size and dimensions of your photo files. A window will "
+"appear allowing you to make several choices:"
+msgstr ""
+"Εναλλακτικά, επιλέξτε ένα σύνολο φωτογραφιών και διαλέξτε την εντολή "
+"<guiseq><gui>Αρχείο</gui><gui>Εξαγωγή</gui></guiseq> ή πατήστε "
+"<keyseq><key>Shift</key><key>Ctrl</key><key>E</key></keyseq>, που εξάγει "
+"φωτογραφίες ενώ σας επιτρέπει να μικρορυθμίσετε το μέγεθος και τις "
+"διαστάσεις των αρχείων φωτογραφίας σας. Θα εμφανιστεί ένα παράθυρο που σας "
+"επιτρέπει να κάνετε πολλές επιλογές:"
+
+#: C/share-export.page:24(p)
+msgid "A format for export."
+msgstr "Μια μορφή για εξαγωγή."
+
+#: C/share-export.page:27(p)
+msgid ""
+"Choose <gui>Unmodified</gui> to export photos in their original format "
+"without any edits made in Shotwell. RAW photos will be exported in their "
+"original RAW format."
+msgstr ""
+"Επιλέξτε <gui>Ατροποποίητη</gui> για να εξάγετε φωτογραφίες στην αρχική τους "
+"μορφή χωρίς καμιά επεξεργασία που έγινε στο Shotwell. Οι ακατέργαστες "
+"φωτογραφίες θα εξαχθούν στην αρχική τους μορφή RAW."
+
+#: C/share-export.page:29(p)
+msgid ""
+"Choose <gui>Current</gui> to export photos including edits made in Shotwell. "
+"RAW photos will be exported in JPEG format if you have edited them in "
+"Shotwell, and otherwise in their original RAW format."
+msgstr ""
+"Επιλέξτε <gui>Τρέχουσα</gui> για να εξάγετε τις φωτογραφίες "
+"συμπεριλαμβάνοντας τις επεξεργασίες που έγιναν στο Shotwell. Οι ακατέργαστες "
+"φωτογραφίες θα εξαχθούν σε μορφή JPEG αν τις έχετε επεξεργαστεί στο Shotwell "
+"και αλλιώς στην αρχική τους ακατέργαστη μορφή."
+
+#: C/share-export.page:31(p)
+msgid ""
+"Or you can choose a particular image format (JPEG, PNG, TIFF, BMP) to be "
+"used for exporting. Any edits made in Shotwell will be included, and "
+"Shotwell will convert photos to the destination format."
+msgstr ""
+"Ή μπορείτε να επιλέξετε μια ειδική μορφή εικόνας (JPEG, PNG, TIFF, BMP) που "
+"θα χρησιμοποιηθεί για εξαγωγή. Οποιαδήποτε επεξεργασία έγινε στο Shotwell θα "
+"συμπεριληφθεί και το Shotwell θα μετατρέψει τις φωτογραφίες στη μορφή "
+"προορισμού."
+
+#: C/share-export.page:37(p)
+msgid "The image quality for exporting (Low, Medium, High, or Maximum)."
+msgstr "Η ποιότητα εικόνας για εξαγωγή (χαμηλή, μέτρια, υψηλή, ή μέγιστη)."
+
+#: C/share-export.page:38(p)
+msgid ""
+"A scaling constraint (which means how Shotwell will decide to scale the "
+"photos down), and the desired pixel size."
+msgstr ""
+"Ένας περιορισμός κλιμάκωσης (που σημαίνει πώς θα αποφασίσει το Shotwell να "
+"σμικρύνει τις φωτογραφίες) και το επιθυμητό μέγεθος εικονοστοιχείων."
+
+#: C/share-export.page:39(p)
+msgid ""
+"The option whether you like to export metadatas such as tags or ratings. "
+"This can help to save your privacy if you have geolocation tags or tags "
+"which shouldn't be seen by anyone."
+msgstr ""
+"Η επιλογή εξαγωγής μεταδεδομένων όπως ετικέτες ή αξιολογήσεις. Αυτό μπορεί "
+"να βοηθήσει στην αποθήκευση της ιδιωτικότητά σας αν έχετε ετικέτες "
+"γεωεντοπισμού ή ετικέτες που δεν θα έπρεπε να ιδωθούν από κάποιον."
+
+#: C/share-export.page:42(p)
+msgid ""
+"If selected, Shotwell will write tags, titles, and other metadata to the new "
+"files."
+msgstr ""
+"Αν επιλεγεί, το Shotwell θα γράψει ετικέτες, τίτλους και άλλα μεταδεδομένα "
+"στα νέα αρχεία."
+
+#: C/share-background.page:7(desc)
+msgid ""
+"Set your desktop background to a single photo or to a slideshow of photos."
+msgstr ""
+"Ορίστε το παρασκήνιο της επιφάνειας εργασίας σας σε μια μόνο φωτογραφία ή σε "
+"μια προβολή διαφανειών των φωτογραφιών."
+
+#: C/share-background.page:12(title)
+msgid "Set a desktop background or slideshow"
+msgstr "Ορίστε ένα παρασκήνιο επιφάνειας εργασίας ή προβολής διαφανειών"
+
+#: C/share-background.page:14(p)
+msgid ""
+"To set a single photo as your desktop background, select the photo and "
+"choose <guiseq><gui>File</gui><gui>Set as Desktop Background</gui></guiseq>."
+msgstr ""
+"Για να ορίσετε μια μόνο φωτογραφία ως παρασκήνιο της επιφάνειας εργασίας "
+"σας, επιλέξτε τη φωτογραφία και διαλέξτε <guiseq><gui>Αρχείο</"
+"gui><gui>Ορισμός ως παρασκήνιο επιφάνειας εργασίας</gui></guiseq>."
+
+#: C/share-background.page:16(p)
+msgid ""
+"You can also set your background to a slideshow of photos. To do this, "
+"select the photos for the slideshow and choose <guiseq><gui>File</"
+"gui><gui>Set as Desktop Slideshow</gui></guiseq>. Shotwell will prompt you "
+"for a slideshow delay, which can be any interval up to one day in length. "
+"The background slideshow will proceed even when Shotwell is not running."
+msgstr ""
+"Μπορείτε επίσης να ορίσετε το παρασκήνιό σας σε μια προβολή διαφανειών "
+"φωτογραφιών. Για να το κάνετε αυτό, επιλέξτε τις φωτογραφίες για την προβολή "
+"διαφανειών και διαλέξτε <guiseq><gui>Αρχείο</gui><gui>Ορισμός ως προβολής "
+"διαφανειών επιφάνειας εργασίας</gui></guiseq>. Το Shotwell θα σας ζητήσει "
+"μια καθυστέρηση προβολής διαφανειών, που μπορεί να είναι οποιοδήποτε "
+"διάστημα μέχρι μια ημέρα. Η προβολή διαφανειών παρασκηνίου θα συνεχίσει "
+"ακόμα κι όταν το Shotwell δεν εκτελείται."
+
+#: C/running.page:7(desc)
+msgid ""
+"Find Shotwell in the Applications menu, or have it start automatically when "
+"you plug in a camera."
+msgstr ""
+"Βρείτε το Shotwell στο μενού εφαρμογές, ή ξεκινήστε το αυτόματα όταν "
+"συνδέετε μια φωτογραφική μηχανή."
+
+#: C/running.page:14(title)
+msgid "Running Shotwell"
+msgstr "Εκτελώντας το Shotwell"
+
+#: C/running.page:16(p)
+msgid ""
+"Once installed, Shotwell is available in your <gui>Applications</gui> menu "
+"under <gui>Graphics</gui> or <gui>Photography</gui>."
+msgstr ""
+"Μόλις εγκατασταθεί το Shotwell είναι διαθέσιμο στο μενού <gui>Εφαρμογές</"
+"gui> κάτω από το <gui>Γραφικά</gui> ή <gui>Φωτογραφία</gui>."
+
+#: C/running.page:18(p)
+msgid ""
+"Shotwell may also be executed automatically when a camera is plugged in to "
+"your computer. To check that your system is set up to run Shotwell when a "
+"camera is detected, go to <guiseq><gui>Edit</gui><gui>Preferences</gui></"
+"guiseq> in any Nautilus (file browser) window and choose the <gui>Media</"
+"gui> tab.  You'll see a dropdown box entitled <gui>Photos:</gui> which lets "
+"you choose Shotwell as your photo handling application."
+msgstr ""
+"Το Shotwell μπορεί επίσης να εκτελεστεί αυτόματα όταν μια φωτογραφική μηχανή "
+"συνδέεται με τον υπολογιστή σας. Για να ελέγξετε ότι το σύστημά σας έχει "
+"ρυθμιστεί να εκτελέσει το Shotwell όταν μια φωτογραφική μηχανή ανιχνευτεί, "
+"πηγαίνετε στο <guiseq><gui>Αρχείο</gui><gui>Προτιμήσεις</gui></guiseq> σε "
+"οποιοδήποτε παράθυρο Ναυτίλου (περιηγητής αρχείου) και επιλέξτε την καρτέλα "
+"<gui>Μέσα</gui>. Θα δείτε ένα πτυσσόμενο πλαίσιο με τίτλο <gui>Φωτογραφίες:</"
+"gui> που σας επιτρέπει να επιλέξετε το Shotwell ως την εφαρμογή διαχείρισης "
+"φωτογραφιών."
+
+#: C/running.page:25(p)
+msgid ""
+"Shotwell may also be executed directly from its build directory, although "
+"this is only recommended for testing out Shotwell or for developers."
+msgstr ""
+"Το Shotwell μπορεί επίσης να εκτελεστεί άμεσα από το δομημένο κατάλογό του "
+"αν και αυτό συνιστάται μόνο για δοκιμή του Shotwell ή για προγραμματιστές."
+
+#: C/raw.page:7(desc)
+msgid "More about RAW support in Shotwell."
+msgstr "Περισσότερα για την υποστήριξη RAW στο Shotwell."
+
+#: C/raw.page:12(title)
+msgid "RAW support in Shotwell"
+msgstr "Υποστήριξη RAW (ακατέργαστο) στο Shotwell"
+
+#: C/raw.page:13(p)
+msgid ""
+"Some cameras have the ability to store data directly off the sensor and into "
+"a file that contains extra color information; this is commonly referred to "
+"as 'RAW' or 'camera RAW', and Shotwell supports these files as well."
+msgstr ""
+"Κάποιες φωτογραφικές μηχανές έχουν τη δυνατότητα να αποθηκεύουν δεδομένα "
+"αμέσως από τον αισθητήρα και σε ένα αρχείο που περιέχει πρόσθετες "
+"πληροφορίες χρώματος· αυτό συνήθως αναφέρεται ως 'RAW' ή 'φωτογραφική μηχανή "
+"RAW' και το Shotwell υποστηρίζει αυτά τα αρχεία επίσης."
+
+#: C/raw.page:18(p)
+msgid ""
+"Since RAW photographs normally cannot be displayed directly, but must be "
+"first developed - that is, have their extra information interpreted and "
+"readied for displaying - most cameras will either embed a JPEG inside a RAW-"
+"format file, or produce a JPEG alongside the RAW file at the time the "
+"snapshot is taken. The latter is referred to throughout this document as RAW"
+"+JPEG. If you import a RAW+JPEG pair, Shotwell will keep them paired and "
+"treat them as one item in your library."
+msgstr ""
+"Αφού οι φωτογραφίες RAW δεν μπορούν κανονικά να εμφανιστούν άμεσα, αλλά "
+"πρέπει πρώτα να αναπτυχθούν - δηλαδή, έχουν τις δικές τους πρόσθετες "
+"πληροφορίες να ερμηνευτούν και να διαβαστούν για να εμφανιστούν - οι "
+"περισσότερες φωτογραφικές μηχανές ή ενσωματώνουν μια JPEG μέσα σε ένα αρχείο "
+"μορφής RAW, ή παράγουν μια JPEG μαζί με το αρχείο RAW τη στιγμή λήψης του "
+"στιγμιοτύπου. Το δεύτερο αναφέρεται σε όλο αυτό το έγγραφο ως RAW+JPEG. Αν "
+"εισάγετε ένα ζεύγος RAW+JPEG, το Shotwell θα τα κρατήσει συζευγμένα και θα "
+"τα θεωρήσει ως ένα στοιχείο στη βιβλιοθήκη σας."
+
+#: C/raw.page:27(p)
+msgid ""
+"When you import a RAW file, you can choose to either use the camera's "
+"internally-developed JPEG or Shotwell's by selecting <guiseq><gui>Photos</"
+"gui><gui>Developer</gui></guiseq> in the menus."
+msgstr ""
+"Όταν εισάγετε ένα αρχείο RAW, μπορείτε να επιλέξετε ή να χρησιμοποιήσετε την "
+"εσωτερικά αναπτυγμένη JPEG της φωτογραφικής μηχανής ή του Shotwell "
+"επιλέγοντας <guiseq><gui>Φωτογραφίες</gui><gui>Ανάπτυξη</gui></guiseq> στα "
+"μενού."
+
+#: C/raw.page:33(p)
+msgid ""
+"Changing between developers will cause all edits made to a photograph to be "
+"discarded."
+msgstr ""
+"Η αλλαγή μεταξύ αναπτύξεων θα προκαλέσει την απόρριψη όλων των επεξεργασιών "
+"που έγιναν σε μια φωτογραφία."
+
+#: C/raw.page:39(p)
+msgid ""
+"In order to publish or use a RAW photograph in most other software, it has "
+"to be exported first. Shotwell can export your RAW photos in JPEG, PNG, TIFF "
+"or BMP format, and, when publishing, will internally export a JPEG version "
+"for you and publish that."
+msgstr ""
+"Για να δημοσιεύσετε ή να χρησιμοποιήσετε μια φωτογραφία RAW στα περισσότερα "
+"άλλα λογισμικά, πρέπει πρώτα να εξαχθεί. Το Shotwell μπορεί να εξάγει τις "
+"φωτογραφίες RAW σε μορφή JPEG, PNG, TIFF ή BMP και όταν δημοσιευτούν θα "
+"εξάγει εσωτερικά μια έκδοση JPEG για σας και θα την δημοσιεύσει."
+
+#: C/other-plugins.page:7(desc)
+msgid "Extend Shotwell's functionality dynamically."
+msgstr "Επέκταση της δυναμικής λειτουργικότητας του Shotwell."
+
+#: C/other-plugins.page:12(title)
+msgid "Plugins"
+msgstr "Πρόσθετα"
+
+#: C/other-plugins.page:13(p)
+msgid ""
+"Shotwell can be used with <em>plugins</em>, which are companion shared "
+"libraries that can add support for new publishing destinations or new "
+"slideshow transitions."
+msgstr ""
+"Το Shotwell μπορεί να χρησιμοποιηθεί με <em>πρόσθετα</em>, που είναι συνοδοί "
+"κοινόχρηστων βιβλιοθηκών που μπορούν να προσθέσουν υποστήριξη για "
+"νεοδημοσιευόμενους προορισμούς ή νέες μεταβάσεις προβολής διαφανειών."
+
+#: C/other-plugins.page:18(p)
+msgid ""
+"To see a list of installed plugins, choose <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq>, and in the <gui>Preferences</gui> "
+"window, click on the <gui>Plugins</gui> tab. You'll see a list of currently-"
+"installed plugins, each with a checkbox by it, and you may enable or disable "
+"each by selecting or deselecting the checkbox by its name."
+msgstr ""
+"Για να δείτε έναν κατάλογο εγκατεστημένων προσθέτων, επιλέξτε "
+"<guiseq><gui>Επεξεργασία</gui><gui>Προτιμήσεις</gui></guiseq> και στο "
+"παράθυρο <gui>Προτιμήσεις</gui>, πατώντας στην καρτέλα <gui>Πρόσθετα</gui>. "
+"Θα δείτε έναν κατάλογο των εγκατεστημένων μέχρι τώρα προσθέτων, που το "
+"καθένα τους έχει ένα πλαίσιο ελέγχου και μπορείτε να ενεργοποιήσετε ή να "
+"απενεργοποιήσετε καθένα τους επιλέγοντας ή αποεπιλέγοντας το όνομά του."
+
+#: C/other-plugins.page:25(p)
+msgid ""
+"Full documentation on how to develop new plugins is available at <link href="
+"\"http://redmine.yorba.org/projects/shotwell/wiki/ShotwellArchWritingPlugins"
+"\">http://redmine.yorba.org/projects/shotwell/wiki/"
+"ShotwellArchWritingPlugins</link>"
+msgstr ""
+"Η πλήρης τεκμηρίωση ανάπτυξης νέων προσθέτων είναι διαθέσιμη στο <link href="
+"\"http://redmine.yorba.org/projects/shotwell/wiki/ShotwellArchWritingPlugins"
+"\">http://redmine.yorba.org/projects/shotwell/wiki/"
+"ShotwellArchWritingPlugins</link>"
+
+#: C/other-multiple.page:7(desc)
+msgid ""
+"You can open Shotwell with a different photo library by using the command "
+"line."
+msgstr ""
+"Μπορείτε να ανοίξετε το Shotwell με μια διαφορετική βιβλιοθήκη φωτογραφιών "
+"χρησιμοποιώντας τη γραμμή εντολών."
+
+#: C/other-multiple.page:12(title)
+msgid "Multiple libraries"
+msgstr "Πολλαπλές βιβλιοθήκες"
+
+#: C/other-multiple.page:14(p)
+msgid ""
+"Shotwell normally stores its database and photo thumbnails in the directory "
+"<file>~/.shotwell</file> . This directory does not hold photos, but the "
+"database in this directory contains a list of all the photos in the Shotwell "
+"library."
+msgstr ""
+"Το Shotwell κανονικά αποθηκεύει τη βάση δεδομένων του και τις μικρογραφίες "
+"φωτογραφιών στον κατάλογο <file>~/.shotwell</file>. Αυτός ο κατάλογος δεν "
+"περιέχει φωτογραφίες, αλλά η βάση δεδομένων σε αυτόν τον κατάλογο περιέχει "
+"έναν κατάλογο όλων των φωτογραφιών στη βιβλιοθήκη Shotwell."
+
+#: C/other-multiple.page:16(p)
+msgid ""
+"As an advanced feature, it's possible for you to have multiple Shotwell "
+"libraries, each of which has its own set of photos. Each library needs its "
+"own database directory. To launch Shotwell with an alternate library, "
+"specify an alternate database directory on the command line as follows:"
+msgstr ""
+"Ως ένα προχωρημένο γνώρισμα, μπορείτε να έχετε πολλαπλές βιβλιοθήκες "
+"Shotwell, που καθεμιά τους έχει το δικό της σύνολο φωτογραφιών. Κάθε "
+"βιβλιοθήκη χρειάζεται το δικό του κατάλογο βάσης δεδομένων. Για να "
+"ξεκινήσετε το Shotwell με μια εναλλακτική βιβλιοθήκη, ορίστε έναν "
+"εναλλακτικό κατάλογο βάσης δεδομένων στη γραμμή εντολών ως εξής:"
+
+#: C/other-multiple.page:18(screen)
+#, no-wrap
+msgid ""
+"\n"
+"shotwell -d [library-directory]\n"
+msgstr ""
+"\n"
+"shotwell -d [library-directory]\n"
+
+#: C/other-missing.page:7(desc)
+msgid "If Shotwell can't find a photo in your library, it marks it as missing."
+msgstr ""
+"Αν το Shotwell δεν μπορεί να βρει μια φωτογραφία στη βιβλιοθήκη σας, τη "
+"σημειώνει ως χαμένη."
+
+#: C/other-missing.page:12(title)
+msgid "Missing photos"
+msgstr "Χαμένες φωτογραφίες"
+
+#: C/other-missing.page:14(p)
+msgid ""
+"Each time Shotwell starts up, it scans your photo library to verify that all "
+"photo files still exist on your hard drive. If Shotwell finds that any photo "
+"files are missing, it will not display them in the normal Photos, Events and "
+"Tags views, but will instead show them in a separate Missing Files view "
+"which will appear in the sidebar."
+msgstr ""
+"Κάθε φορά που το Shotwell ξεκινά, σαρώνει τη βιβλιοθήκη φωτογραφιών σας για "
+"να επιβεβαιώσει ότι όλα τα αρχεία φωτογραφιών υπάρχουν ακόμα στον σκληρό σας "
+"δίσκο. Αν το Shotwell βρει ότι οποιαδήποτε αρχεία φωτογραφιών λείπουν, δεν "
+"θα τα εμφανίσει στις κανονικές προβολές φωτογραφιών, συμβάντων και ετικετών, "
+"αλλά θα τα εμφανίσει σε μια ξεχωριστή προβολή χαμένων αρχείων που θα "
+"εμφανιστεί στην πλευρική στήλη."
+
+#: C/other-missing.page:16(p)
+msgid ""
+"If you no longer want the missing files to be part of your Shotwell "
+"collection (perhaps because you deleted them), go to the Missing Files view, "
+"select the photos and then click <gui>Remove From Library</gui>."
+msgstr ""
+"Αν δεν θέλετε πια τα χαμένα αρχεία να είναι μέρος της συλλογής σας Shotwell "
+"(ίσως επειδή τα διαγράψατε), πηγαίνετε στην προβολή χαμένα αρχεία, επιλέξτε "
+"τις φωτογραφίες και έπειτα πατήστε <gui>Αφαίρεση από τη βιβλιοθήκη</gui>."
+
+#: C/other-missing.page:18(p)
+msgid ""
+"If you have photos on a removable disk, such as a CD or USB flash drive, and "
+"<link xref=\"index#import\">import</link> them into Shotwell <em>without</"
+"em> copying the photos to your computer, they will show up as missing files "
+"if you then disconnect the removable disk. See <link xref=\"import-file\"/> "
+"to learn how to copy files from removable disks onto your computer."
+msgstr ""
+"Αν έχετε φωτογραφίες σε έναν αφαιρούμενο δίσκο, όπως σε ένα CD ή USB και τα "
+"<link xref=\"index#import\">εισάγετε</link> στο Shotwell <em>χωρίς</em> να "
+"αντιγράψετε τις φωτογραφίες στον υπολογιστή σας, θα εμφανιστούν ως χαμένα "
+"αρχεία αν έπειτα αποσυνδέσετε τον αφαιρούμενο δίσκο. Δείτε <link xref="
+"\"import-file\"/> για να μάθετε πώς να αντιγράψετε αρχεία από αφαιρούμενους "
+"δίσκους στον υπολογιστή σας."
+
+#: C/other-missing.page:20(p)
+msgid ""
+"If any missing photo files become available again, Shotwell will notice this "
+"the next time it starts. The photos will once again appear in the Photos, "
+"Events and Tags views."
+msgstr ""
+"Αν οποιαδήποτε χαμένα αρχεία φωτογραφιών γίνουν διαθέσιμα ξανά, το Shotwell "
+"θα το σημειώσει την επόμενη φορά που ξεκινά. Οι φωτογραφίες θα εμφανιστούν "
+"πάλι στις προβολές φωτογραφιών, συμβάντων και ετικετών."
+
+#: C/other-files.page:7(desc)
+msgid "Keep the Shotwell library in sync with photo files on disk."
+msgstr ""
+"Διατηρείστε τη βιβλιοθήκη Shotwell σε συγχρονισμό με τα αρχεία φωτογραφιών "
+"στον δίσκο."
+
+#: C/other-files.page:12(title)
+msgid "Photo files"
+msgstr "Αρχεία φωτογραφιών"
+
+#: C/other-files.page:14(p)
+msgid ""
+"Every photo in the Shotwell library corresponds to a file stored on your "
+"hard disk. Shotwell has several features which help you keep the Shotwell "
+"library and files on disk in sync."
+msgstr ""
+"Κάθε φωτογραφία στη βιβλιοθήκη Shotwell αντιστοιχεί σε ένα αποθηκευμένο "
+"αρχείο στον σκληρό σας δίσκο. Το Shotwell έχει πολλά γνωρίσματα που σας "
+"βοηθούν να κρατήσετε τη βιβλιοθήκη Shotwell και τα αρχεία στον δίσκο σε "
+"συγχρονισμό."
+
+#: C/other-files.page:21(title)
+msgid "Using a custom directory pattern"
+msgstr "Χρησιμοποιώντας ένα προσαρμοσμένο υπόδειγμα καταλόγου"
+
+#: C/other-files.page:22(p)
+msgid ""
+"Shotwell allows you to specify how it names directories in your library. You "
+"can do this by changing the <gui>Directory Structure</gui> and <gui>Pattern</"
+"gui> settings in the <gui>Preferences</gui> dialog. You may use a "
+"preselected pattern, or choose <gui>Custom</gui> and type in your own."
+msgstr ""
+"Το Shotwell σας επιτρέπει να ορίσετε τον τρόπο ονομασίας των καταλόγων στη "
+"βιβλιοθήκη σας. Μπορείτε να το κάνετε αλλάζοντας τις ρυθμίσεις <gui>Δομή "
+"καταλόγου</gui> και <gui>Υπόδειγμα</gui> στον διάλογο <gui>Προτιμήσεις</"
+"gui>. Μπορείτε να χρησιμοποιήσετε ένα προεπιλεγμένο υπόδειγμα, ή να "
+"επιλέξετε <gui>Προσαρμογή</gui> και να πληκτρολογήσετε το δικό σας."
+
+#: C/other-files.page:29(p)
+msgid ""
+"The available symbols for the directory pattern begin with a % (percent "
+"sign). The values these symbols produce are locale-dependent, so what you "
+"see on your computer may vary from the examples below."
+msgstr ""
+"Τα διαθέσιμα σύμβολα για υπόδειγμα καταλόγου ξεκινά με ένα % (σύμβολο "
+"ποσοστού). Οι τιμές που αυτά τα σύμβολα παράγουν εξαρτώνται από τις τοπικές "
+"ρυθμίσεις, έτσι ό,τι βλέπετε στον υπολογιστή σας μπορεί να διαφέρει από τα "
+"παρακάτω παραδείγματα."
+
+#: C/other-files.page:38(em)
+msgid "Symbol"
+msgstr "Σύμβολο"
+
+#: C/other-files.page:38(em)
+msgid "Meaning"
+msgstr "Σημασία"
+
+#: C/other-files.page:38(em)
+msgid "Example"
+msgstr "Παράδειγμα"
+
+#: C/other-files.page:43(p)
+msgid "%Y"
+msgstr "%Y"
+
+#: C/other-files.page:43(p)
+msgid "Year: full"
+msgstr "Έτος: πλήρες"
+
+#: C/other-files.page:43(p)
+msgid "2011"
+msgstr "2011"
+
+#: C/other-files.page:46(p)
+msgid "%y"
+msgstr "%y"
+
+#: C/other-files.page:46(p)
+msgid "Year: two digit"
+msgstr "Έτος: δύο ψηφία"
+
+#: C/other-files.page:46(p)
+msgid "11"
+msgstr "11"
+
+#: C/other-files.page:49(p)
+msgid "%d"
+msgstr "%d"
+
+#: C/other-files.page:49(p)
+msgid "Day of the month with leading zero"
+msgstr "Ημέρα του μήνα με αρχικό μηδέν"
+
+#: C/other-files.page:49(p)
+msgid "03"
+msgstr "03"
+
+#: C/other-files.page:52(p)
+msgid "%A"
+msgstr "%A"
+
+#: C/other-files.page:52(p)
+msgid "Day name: full"
+msgstr "Όνομα ημέρας: πλήρες"
+
+#: C/other-files.page:52(p)
+msgid "Wednesday"
+msgstr "Τετάρτη"
+
+#: C/other-files.page:55(p)
+msgid "%a"
+msgstr "%a"
+
+#: C/other-files.page:55(p)
+msgid "Day name: abbreviated"
+msgstr "Όνομα ημέρας: συντομευμένο"
+
+#: C/other-files.page:55(p)
+msgid "Wed"
+msgstr "Τετ"
+
+#: C/other-files.page:58(p)
+msgid "%m"
+msgstr "%m"
+
+#: C/other-files.page:58(p)
+msgid "Month number with leading zero"
+msgstr "Αριθμός μήνα με αρχικό μηδέν"
+
+#: C/other-files.page:58(p)
+msgid "02"
+msgstr "02"
+
+#: C/other-files.page:60(p)
+msgid "%b"
+msgstr "%b"
+
+#: C/other-files.page:60(p)
+msgid "Month name: abbreviated"
+msgstr "Όνομα μήνα: συντομευμένο"
+
+#: C/other-files.page:60(p)
+msgid "Feb"
+msgstr "Φεβ"
+
+#: C/other-files.page:62(p)
+msgid "%B"
+msgstr "%B"
+
+#: C/other-files.page:62(p)
+msgid "Month name: full"
+msgstr "Όνομα μήνα: πλήρες"
+
+#: C/other-files.page:62(p)
+msgid "February"
+msgstr "Φεβρουάριος"
+
+#: C/other-files.page:63(p)
+msgid "%I"
+msgstr "%I"
+
+#: C/other-files.page:63(p)
+msgid "Hour: 12 hour format"
+msgstr "Ώρα: 12ώρη μορφή"
+
+#: C/other-files.page:63(p)
+msgid "05"
+msgstr "05"
+
+#: C/other-files.page:64(p)
+msgid "%H"
+msgstr "%H"
+
+#: C/other-files.page:64(p)
+msgid "Hour: 24 hour format"
+msgstr "Ώρα: 24ώρη μορφή"
+
+#: C/other-files.page:64(p)
+msgid "17"
+msgstr "17"
+
+#: C/other-files.page:66(p)
+msgid "%M"
+msgstr "%M"
+
+#: C/other-files.page:66(p)
+msgid "Minute"
+msgstr "Λεπτό"
+
+#: C/other-files.page:66(p)
+msgid "16"
+msgstr "16"
+
+#: C/other-files.page:67(p)
+msgid "%S"
+msgstr "%S"
+
+#: C/other-files.page:67(p)
+msgid "Second"
+msgstr "Δευτερόλεπτο"
+
+#: C/other-files.page:67(p)
+msgid "30"
+msgstr "30"
+
+#: C/other-files.page:68(p)
+msgid "%p"
+msgstr "%p"
+
+#: C/other-files.page:68(p)
+msgid "AM or PM"
+msgstr "ΠΜ ή ΜΜ"
+
+#: C/other-files.page:68(p)
+msgid "PM"
+msgstr "ΜΜ"
+
+#: C/other-files.page:72(p)
+msgid ""
+"There are other symbols available; please check the manual for strftime by "
+"running the command <cmd>man strftime</cmd> if you need one that isn't "
+"listed here."
+msgstr ""
+"Υπάρχουν άλλα διαθέσιμα σύμβολα· παρακαλούμε, ελέγξτε το εγχειρίδιο για "
+"strftime εκτελώντας την εντολή <cmd>man strftime</cmd> αν χρειάζεστε ένα "
+"σύμβολο που δεν είναι καταχωρισμένο εδώ."
+
+#: C/other-files.page:79(title)
+msgid "Automatically importing photos"
+msgstr "Αυτόματη εισαγωγή φωτογραφιών"
+
+#: C/other-files.page:81(p)
+msgid ""
+"Shotwell can automatically import new photos which appear in the library "
+"directory. (The library directory is usually the <file>Pictures</file> "
+"directory in your home directory; you can change its location in in the "
+"<gui>Preferences</gui> window.)"
+msgstr ""
+"Το Shotwell μπορεί να εισάγει αυτόματα νέες φωτογραφίες που εμφανίζονται "
+"στον κατάλογο βιβλιοθήκης. (Ο κατάλογος βιβλιοθήκης είναι συνήθως ο "
+"κατάλογος <file>Εικόνες</file> στον προσωπικό σας κατάλογο· μπορείτε να "
+"αλλάξετε την θέση του στο παράθυρο <gui>Προτιμήσεις</gui>.)"
+
+#: C/other-files.page:86(p)
+msgid ""
+"To enable auto-import, check the box <gui>Watch library directory for new "
+"files</gui> in the <gui>Preferences</gui> window."
+msgstr ""
+"Για την ενεργοποίηση της αυτόματης εισαγωγής, ελέγξτε το πλαίσιο "
+"<gui>Παρακολούθηση του καταλόγου βιβλιοθήκης για νέα αρχεία</gui> στο "
+"παράθυρο <gui>Προτιμήσεις</gui>."
+
+#: C/other-files.page:90(p)
+msgid ""
+"Shotwell can also follow symbolic links inside automatically-imported "
+"directories."
+msgstr ""
+"Το Shotwell μπορεί επίσης να ακολουθήσει τους συμβολικούς δεσμούς σε "
+"αυτόματα εισαγόμενους καταλόγους."
+
+#: C/other-files.page:95(title)
+msgid "Automatically renaming imported photos to lowercase"
+msgstr "Αυτόματη μετονομασία εισαγόμενων φωτογραφιών σε πεζά γράμματα"
+
+#: C/other-files.page:97(p)
+msgid ""
+"Shotwell can automatically change the filenames of imported photos to "
+"lowercase. To enable this, choose <guiseq><gui>Edit</gui><gui>Preferences</"
+"gui></guiseq>, and in the <gui>Preferences</gui> window, check the "
+"<gui>Rename imported files to lowercase</gui> box."
+msgstr ""
+"Το Shotwell μπορεί να αλλάξει αυτόματα τα ονόματα αρχείων των εισαγόμενων "
+"φωτογραφιών σε πεζά γράμματα. Για να το ενεργοποιήσετε αυτό, επιλέξτε "
+"<guiseq><gui>Επεξεργασία</gui><gui>Προτιμήσεις</gui></guiseq> και στο "
+"παράθυρο <gui>Προτιμήσεις</gui>, σημειώστε το πλαίσιο <gui>Μετονομασία "
+"εισαγόμενων αρχείων σε πεζά γράμματα</gui>."
+
+#: C/other-files.page:107(title)
+msgid "Writing metadata on the fly"
+msgstr "Εγγραφή μεταδεδομένων απευθείας"
+
+#: C/other-files.page:109(p)
+msgid ""
+"By default, Shotwell does not modify photo files, even when you edit photos "
+"or change their tags or titles. Shotwell records these changes in its own "
+"database only."
+msgstr ""
+"Από προεπιλογή, το Shotwell δεν τροποποιεί αρχεία φωτογραφιών, ακόμα κι όταν "
+"επεξεργάζεστε φωτογραφίες ή αλλάζετε τις ετικέτες τους ή τίτλους τους. Το "
+"Shotwell καταγράφει αυτές τις αλλαγές μόνο στη δικιά του βάση δεδομένων."
+
+#: C/other-files.page:112(p)
+msgid ""
+"To change this behavior, you can enable the checkbox <gui>Write tags, titles "
+"and other metadata to photo files</gui> in the <gui>Preferences</gui> "
+"dialog. When this option is enabled, Shotwell will write the following "
+"metadata to most photo files whenever you change it in Shotwell:"
+msgstr ""
+"Για να αλλάξετε αυτήν την συμπεριφορά, μπορείτε να ενεργοποιήσετε το πλαίσιο "
+"ελέγχου <gui>Εγγραφή ετικετών, τίτλων και άλλων μεταδεδομένων σε αρχεία "
+"φωτογραφιών</gui> στον διάλογο <gui>Προτιμήσεις</gui>. Όταν αυτή η επιλογή "
+"είναι ενεργή, το Shotwell θα γράψει τα παρακάτω μεταδεδομένα στα περισσότερα "
+"αρχεία φωτογραφιών όποτε το αλλάζετε σε Shotwell:"
+
+#: C/other-files.page:118(p)
+msgid "titles"
+msgstr "τίτλοι"
+
+#: C/other-files.page:119(p)
+msgid "tags"
+msgstr "ετικέτες"
+
+#: C/other-files.page:120(p)
+msgid "ratings"
+msgstr "αξιολογήσεις"
+
+#: C/other-files.page:121(p)
+msgid "rotation information"
+msgstr "πληροφορίες περιστροφής"
+
+#: C/other-files.page:122(p)
+msgid "time/date"
+msgstr "χρόνος/ημερομηνία"
+
+#: C/other-files.page:125(p)
+msgid ""
+"Shotwell stores this information in photo files in EXIF, IPTC and/or XMP "
+"format. Note that Shotwell can write only to photo files in JPEG, PNG and "
+"TIFF format, not to BMP photos, RAW photos or to video files."
+msgstr ""
+"Το Shotwell αποθηκεύει αυτές τις πληροφορίες σε αρχεία φωτογραφιών σε μορφή "
+"EXIF, IPTC και/ή XMP. Σημειώστε ότι το Shotwell μπορεί να γράψει μόνο σε "
+"αρχεία φωτογραφιών σε μορφή JPEG, PNG και TIFF, όχι σε φωτογραφίες BMP, RAW "
+"ή σε αρχεία βίντεο."
+
+#: C/other-files.page:133(title)
+msgid "Runtime monitoring"
+msgstr "Παρακολούθηση χρόνου εκτέλεσης"
+
+#: C/other-files.page:135(p)
+msgid ""
+"While Shotwell is running, it notices changes made to any photo file "
+"externally. When a photo file changes, Shotwell rereads the file and updates "
+"your view of the photo and metadata."
+msgstr ""
+"Ενώ εκτελείται το Shotwell, σημειώνει αλλαγές που έγιναν σε οποιαδήποτε "
+"εξωτερικό αρχείο φωτογραφίας. Όταν ένα αρχείο φωτογραφίας αλλάζει, το "
+"Shotwell ξαναδιαβάζει το αρχείο και ενημερώνει την προβολή σας της "
+"φωτογραφίας και των μεταδεδομένων."
+
+#: C/other-files.page:139(p)
+msgid ""
+"Note that Shotwell checks all photo files for changes at startup, but only "
+"photo files contained in the library directory are monitored in real time "
+"after startup. We hope to remove this limitation in a further release."
+msgstr ""
+"Σημειώστε ότι το Shotwell ελέγχει όλα τα αρχεία φωτογραφιών για αλλαγές στην "
+"εκκίνηση, αλλά μόνο τα περιεχόμενα αρχεία φωτογραφίας στον κατάλογο "
+"βιβλιοθήκης παρακολουθούνται σε πραγματικό χρόνο μετά την εκκίνηση. "
+"Ελπίζουμε να αφαιρέσουμε αυτόν τον περιορισμό σε μια μεταγενέστερη έκδοση."
+
+#: C/organize-title.page:7(desc)
+msgid "Give titles to your photos."
+msgstr "Δώστε τίτλους στις φωτογραφίες σας."
+
+#: C/organize-title.page:12(title)
+msgid "Titles"
+msgstr "Τίτλοι"
+
+#: C/organize-title.page:14(p)
+msgid ""
+"The <guiseq><gui>View</gui><gui>Titles</gui></guiseq> checkbox toggles the "
+"display of titles beneath each photo. By default, a photo's title is its "
+"filename."
+msgstr ""
+"Το πλαίσιο ελέγχου <guiseq><gui>Προβολή</gui><gui>Τίτλοι</gui></guiseq> "
+"εναλλάσσει την εμφάνιση των τίτλων κάτω από κάθε φωτογραφία. Από προεπιλογή, "
+"ο τίτλος μιας φωτογραφίας είναι το όνομα του αρχείου της."
+
+#: C/organize-title.page:17(p)
+msgid ""
+"To change a photo's title, select the photo and click <guiseq><gui>Photos</"
+"gui><gui>Edit Title</gui></guiseq>, or press <key>F2</key>."
+msgstr ""
+"Για να αλλάξετε τον τίτλο μιας φωτογραφίας, επιλέξτε τη φωτογραφία και "
+"πατήστε <guiseq><gui>Φωτογραφίες</gui><gui>Επεξεργασία τίτλου</gui></"
+"guiseq>, ή πατήστε <key>F2</key>."
+
+#: C/organize-tag.page:7(desc)
+msgid "Organize photos by labelling them."
+msgstr "Οργάνωση φωτογραφιών βάζοντας ετικέτες."
+
+#: C/organize-tag.page:14(title)
+msgid "Tagging photos"
+msgstr "Ονομασία φωτογραφιών"
+
+#: C/organize-tag.page:16(p)
+msgid ""
+"You can assign one or more tags to selected photos. A tag can be one or more "
+"words that you want to associate with those photos."
+msgstr ""
+"Μπορείτε να δώσετε μία ή περισσότερες ετικέτες σε επιλεγμένες φωτογραφίες. "
+"Μια ετικέτα μπορεί να έχει μία ή περισσότερες λέξεις που θέλετε να "
+"συσχετίσετε με αυτές τις φωτογραφίες."
+
+#: C/organize-tag.page:22(p)
+msgid ""
+"To add new tags to photos, select the photos you would like to tag, then do "
+"any of the following:"
+msgstr ""
+"Για να προσθέσετε νέες ετικέτες στις φωτογραφίες, επιλέξτε τις φωτογραφίες "
+"στις οποίες θέλετε να βάλετε ετικέτες, έπειτα κάντε οποιοδήποτε από τα "
+"παρακάτω:"
+
+#: C/organize-tag.page:28(p)
+msgid "Choose <guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq>."
+msgstr ""
+"Επιλέξτε <guiseq><gui>Ετικέτες</gui><gui>Προσθήκη ετικετών</gui></guiseq>."
+
+#: C/organize-tag.page:29(p)
+msgid "Type <keyseq><key>Ctrl</key><key>T</key></keyseq>."
+msgstr "Πληκτρολογήστε <keyseq><key>Ctrl</key><key>T</key></keyseq>."
+
+#: C/organize-tag.page:30(p)
+msgid "Drag the selected photos and drop them on the desired tag."
+msgstr ""
+"Μεταφέρτε τις επιλεγμένες φωτογραφίες και αποθέστε τες στην επιθυμητή "
+"ετικέτα."
+
+#: C/organize-tag.page:33(p)
+msgid ""
+"When you use <keyseq><key>Ctrl</key><key>T</key></keyseq> or "
+"<guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq> you can type in the "
+"names of one or more tags, separated by commas. Once you have created a tag, "
+"you can rename it by selecting that tag in the sidebar and choosing "
+"<guiseq><gui>Tags</gui><gui>Rename Tag \"[name]\"</gui></guiseq>, by "
+"rightclicking on it and choose <gui>Rename...</gui> or double-click on the "
+"tag in the sidebar."
+msgstr ""
+"Όταν χρησιμοποιείτε <keyseq><key>Ctrl</key><key>T</key></keyseq> ή "
+"<guiseq><gui>Ετικέτες</gui><gui>Προσθήκη ετικετών</gui></guiseq> μπορείτε να "
+"πληκτρολογήσετε τα ονόματα μιας ή περισσότερων ετικετών, χωριζόμενων με "
+"κόμματα. Αφού έχετε δημιουργήσει μια ετικέτα, μπορείτε να την μετονομάσετε "
+"επιλέγοντας αυτήν την ετικέτα στην πλευρική στήλη και επιλέγοντας "
+"<guiseq><gui>Ετικέτες</gui><gui>Μετονομασία ετικέτας \"[όνομα]\"</gui></"
+"guiseq>, δεξιοπατώντας την και επιλέγοντας <gui>Μετονομασία...</gui> ή "
+"διπλοπατώντας την ετικέτα στην πλευρική στήλη."
+
+#: C/organize-tag.page:44(p)
+msgid ""
+"To change which tags are associated with a particular photo, select that "
+"photo, choose <guiseq><gui>Tags</gui><gui>Modify Tags</gui></guiseq> or "
+"right-click on a photo and select <gui>Modify Tags</gui> and edit the comma "
+"separated list. To remove a tag from one or more photos, first select that "
+"tag in the sidebar, then select the photos you would like to remove, and "
+"choose <guiseq><gui>Tags</gui><gui>Remove Tag \"[name]\" from Photos</gui></"
+"guiseq> or right-click on the photos an select <gui>Remove Tag \"[name]\" "
+"from Photos</gui>."
+msgstr ""
+"Για να αλλάξετε ποιες ετικέτες συσχετίζονται με μια συγκεκριμένη φωτογραφία, "
+"επιλέξτε αυτήν την φωτογραφία, διαλέξτε <guiseq><gui>Ετικέτες</"
+"gui><gui>Τροποποίηση ετικετών</gui></guiseq> ή δεξιοπατήστε σε μια "
+"φωτογραφία και επιλέξτε <gui>Τροποποίηση ετικετών</gui> και επεξεργαστείτε "
+"τον κατάλογο που χωρίζεται με κόμματα. Για να αφαιρέσετε μια ετικέτα από μία "
+"ή περισσότερες φωτογραφίες, επιλέξτε πρώτα αυτήν την ετικέτα στην πλευρική "
+"στήλη, έπειτα επιλέξτε τις φωτογραφίες που θα θέλατε να αφαιρέσετε και "
+"επιλέξτε <guiseq><gui>Ετικέτες</gui><gui>Αφαίρεση ετικέτας \"[όνομα]\" από "
+"τις φωτογραφίες</gui></guiseq> ή δεξιοπατήστε στις φωτογραφίες και επιλέξτε "
+"<gui>Αφαίρεση ετικέτας \"[όνομα]\" από τις φωτογραφίες</gui>."
+
+#: C/organize-tag.page:58(p)
+msgid ""
+"To delete a tag entirely, select that tag in the sidebar and choose "
+"<guiseq><gui>Tags</gui><gui>Delete Tag \"[name]\"</gui></guiseq> or by right-"
+"click and select <gui>Delete Tag \"[name]\"</gui>."
+msgstr ""
+"Για να διαγράψετε μια ετικέτα πλήρως, επιλέξτε αυτήν την ετικέτα στην "
+"πλευρική στήλη και επιλέξτε <guiseq><gui>Ετικέτες</gui><gui>Διαγραφή "
+"ετικέτας \"[όνομα]\"</gui></guiseq> ή δεξιοπατήστε και επιλέξτε "
+"<gui>Διαγραφή ετικέτας \"[όνομα]\"</gui>."
+
+#: C/organize-tag.page:64(p)
+msgid ""
+"When you create a tag, it will appear in the sidebar under the Tags item, "
+"which is hidden if there are no tags. Photos can have multiple tags attached "
+"to them, and when you click on the name of a given tag in the sidebar, you "
+"will see all the photos associated with that tag."
+msgstr ""
+"Όταν δημιουργείτε μια ετικέτα, θα εμφανιστεί στην πλευρική στήλη κάτω από το "
+"στοιχείο ετικέτες, που είναι κρυφό αν δεν υπάρχουν ετικέτες. Οι φωτογραφίες "
+"μπορούν να έχουν πολλαπλές ετικέτες προσαρτημένες σε αυτές και όταν πατάτε "
+"στο όνομα μιας δοσμένης ετικέτας στην πλευρική στήλη, θα δείτε όλες τις "
+"συσχετισμένες φωτογραφίες με αυτήν την ετικέτα."
+
+#: C/organize-tag.page:73(title)
+msgid "Hierarchical Tags"
+msgstr "Ιεραρχικές ετικέτες"
+
+#: C/organize-tag.page:74(p)
+msgid ""
+"Shotwell supports also hierarchial tags. You can rearrange your tags by drag "
+"and drop a tag onto another. To create a new subtag right-click on a tag and "
+"select <gui>New</gui>."
+msgstr ""
+"Το Shotwell υποστηρίζει επίσης ιεραρχικές ετικέτες. Μπορείτε να αναδιατάξετε "
+"τις ετικέτες σας με μεταφορά και απόθεση μιας ετικέτας σε μια άλλη. Για να "
+"δημιουργήσετε μια νέα υποετικέτα δεξιοπατήστε σε μια ετικέτα και επιλέξτε "
+"<gui>Νέα</gui>."
+
+#: C/organize-tag.page:81(p)
+msgid ""
+"Hierarchial tags can help you to sort your tag list in ways that better "
+"match how you work or think; for example, you can store location tags like "
+"\"Mountains\" or \"Beach\" under a parent tag \"Places\", which itself can "
+"be placed under the tag \"Summer Holidays\"."
+msgstr ""
+"Οι ιεραρχικές ετικέτες μπορεί να σας βοηθήσουν να ταξινομήσετε τον κατάλογο "
+"ετικετών σας έτσι που να ταιριάζει καλύτερα με τον τρόπο εργασίας ή σκέψης "
+"σας· για παράδειγμα, μπορείτε να αποθηκεύσετε ετικέτες θέσης όπως \"βουνά\" "
+"ή \"παραλίες\" κάτω από μια γονική ετικέτα \"Τοποθεσίες\", που η ίδια μπορεί "
+"να τοποθετηθεί κάτω από την ετικέτα \"καλοκαιρινές διακοπές\"."
+
+#: C/organize-tag.page:89(p)
+msgid "Note that deleting a parent tag will also delete its child tags."
+msgstr ""
+"Σημειώστε ότι διαγράφοντας μια γονική ετικέτα διαγράφονται επίσης και οι "
+"θυγατρικές της ετικέτες."
+
+#: C/organize-search.page:7(desc)
+msgid "Find photos and videos in your collection by a variety of criteria."
+msgstr "Εύρεση φωτογραφιών και βίντεο στη συλλογή σας με διάφορα κριτήρια."
+
+#: C/organize-search.page:12(title)
+msgid "Searching"
+msgstr "Αναζήτηση"
+
+#: C/organize-search.page:14(p)
+msgid ""
+"There are two ways to search in Shotwell: the filter toolbar, and with a "
+"saved search. The search bar allows you to quickly search the current view "
+"for certain criteria. Saved Searches feature more complex search criteria "
+"and persist in the sidebar between sessions."
+msgstr ""
+"Υπάρχουν δύο τρόποι αναζήτησης στο Shotwell: η εργαλειοθήκη φίλτρου και με "
+"μια αποθηκευμένη αναζήτηση. Η γραμμή αναζήτησης σας επιτρέπει να αναζητήσετε "
+"γρήγορα την τρέχουσα προβολή για συγκεκριμένα κριτήρια. Αποθηκευμένες "
+"αναζητήσεις χαρακτηρίζουν πιο σύνθετα κριτήρια αναζήτησης και παραμένουν "
+"στην πλευρική στήλη μεταξύ των συνεδριών."
+
+#: C/organize-search.page:21(title)
+msgid "Search bar"
+msgstr "Γραμμή αναζήτησης"
+
+#: C/organize-search.page:22(p)
+msgid ""
+"The <guiseq><gui>View</gui><gui>Search Bar</gui></guiseq> checkbox toggles "
+"the display of the search bar. You can also hit <keyseq><key>Ctrl</"
+"key><key>F</key></keyseq> or <key>F8</key> to bring up the search bar. From "
+"this bar, you can find, show and hide photos and videos based on title, tag, "
+"rating or other options."
+msgstr ""
+"Το πλαίσιο ελέγχου <guiseq><gui>Προβολή</gui><gui>Γραμμή αναζήτησης</gui></"
+"guiseq> εναλλάσσει την εμφάνιση της γραμμής αναζήτησης. Μπορείτε επίσης να "
+"πατήσετε <keyseq><key>Ctrl</key><key>F</key></keyseq> ή <key>F8</key> για να "
+"εμφανίσετε τη γραμμή αναζήτησης. Από αυτήν τη γραμμή, μπορείτε να βρείτε, να "
+"εμφανίσετε και να κρύψετε φωτογραφίες και βίντεο με βάση τον τίτλο, την "
+"ετικέτα, την βαθμολόγηση ή άλλες επιλογές."
+
+#: C/organize-search.page:29(p)
+msgid ""
+"To begin searching, simply enter a search keyword in the text box, or click "
+"on <gui>Flagged</gui>, <gui>Rating</gui> or <gui>Type</gui>. The text search "
+"matches your keywords across tag names, photo or video titles and photos' "
+"original filenames. The <gui>Flagged</gui>, <gui>Rating</gui> and <gui>Type</"
+"gui> buttons allow you to filter your collection by whether photos are "
+"flagged, their current number of stars, and whether the items shown are "
+"images, videos, or raw camera files, respectively."
+msgstr ""
+"Για να ξεκινήσετε την αναζήτηση, εισάγετε απλά μια λέξη-κλειδί αναζήτησης "
+"στο πλαίσιο κειμένου, ή πατήστε στα <gui>Με σημαία</gui>, <gui>Αξιολόγηση</"
+"gui> ή <gui>Τύπος</gui>. Η αναζήτηση κειμένου ταιριάζει με τις λέξεις-"
+"κλειδιά σας σε όλα τα ονόματα ετικετών, φωτογραφιών ή τίτλων βίντεο και με "
+"τα αρχικά ονόματα αρχείων των φωτογραφιών. Τα πλήκτρα <gui>Με σημαία</gui>, "
+"<gui>Αξιολόγηση</gui> και <gui>Τύπος</gui> σας επιτρέπουν να φιλτράρετε τη "
+"συλλογή σας σύμφωνα με το αν οι φωτογραφίες είναι με σημαία, με τον τρέχοντα "
+"αριθμό αστεριών και αν τα εμφανιζόμενα στοιχεία είναι εικόνες, βίντεο ή "
+"ακατέργαστα αρχεία φωτογραφικής μηχανής, αντίστοιχα."
+
+#: C/organize-search.page:38(p)
+msgid ""
+"Disabling the search bar or exiting Shotwell automatically resets the search "
+"bar."
+msgstr ""
+"Η απενεργοποίηση της γραμμής αναζήτησης ή η έξοδος από το Shotwell "
+"επαναφέρει αυτόματα τη γραμμή αναζήτησης."
+
+#: C/organize-search.page:44(title)
+msgid "Saved search"
+msgstr "Αποθηκευμένη αναζήτηση"
+
+#: C/organize-search.page:45(p)
+msgid ""
+"A saved search persists across Shotwell sessions, and is updated as photos "
+"and videos are added and removed from your Shotwell library."
+msgstr ""
+"Μια αποθηκευμένη αναζήτηση παραμένει στις συνεδρίες του Shotwell και "
+"ενημερώνεται καθώς προστίθενται και αφαιρούνται φωτογραφίες και βίντεο από "
+"τη βιβλιοθήκη του Shotwell."
+
+#: C/organize-search.page:50(p)
+msgid ""
+"Create a new saved search with <guiseq><gui>Edit</gui><gui>New Search</gui></"
+"guiseq> or by hitting <keyseq><key>Ctrl</key><key>S</key></keyseq>. The "
+"dialog box allows you to enter a name for the search and select whether you "
+"want to meet Any, All, or None of the criteria in the following rows."
+msgstr ""
+"Δημιουργήστε μια νέα αποθηκευμένη αναζήτηση με <guiseq><gui>Επεξεργασία</"
+"gui><gui>Νέα αναζήτηση</gui></guiseq> ή πατώντας <keyseq><key>Ctrl</"
+"key><key>S</key></keyseq>. Το πλαίσιο διαλόγου σας επιτρέπει να εισάγετε ένα "
+"όνομα για την αναζήτηση και να επιλέξετε αν θέλετε να ικανοποιεί "
+"οποιοδήποτε, όλα ή κανένα από τα κριτήρια στις επόμενες γραμμές."
+
+#: C/organize-search.page:56(p)
+msgid ""
+"Each row represents a search criterion. Use the + button to add more rows, "
+"and the - button to remove a specific row. The combo box on the left of each "
+"row selects the type of criteria. Criteria must be entered correctly before "
+"the OK button becomes available."
+msgstr ""
+"Κάθε γραμμή αναπαριστά ένα κριτήριο αναζήτησης. Χρησιμοποιήστε το πλήκτρο + "
+"για να προσθέσετε περισσότερες γραμμές και το πλήκτρο - για να αφαιρέσετε "
+"μια συγκεκριμένη γραμμή. Το σύνθετο πλαίσιο στα αριστερά κάθε γραμμής "
+"επιλέγει τον τύπο των κριτηρίων. Τα κριτήρια πρέπει να εισαχθούν σωστά πριν "
+"να γίνει διαθέσιμο το πλήκτρο Εντάξει."
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/organize-remove.page:15(None)
+msgid ""
+"@@image: 'figures/trash_process.png'; md5=ed596bda34c2f4a79a310fbc8bb51fd2"
+msgstr ""
+"@@image: 'figures/trash_process.png'· md5=ed596bda34c2f4a79a310fbc8bb51fd2"
+
+#: C/organize-remove.page:7(desc)
+msgid ""
+"Remove photos from the library, or delete them from your computer entirely."
+msgstr ""
+"Αφαίρεση φωτογραφιών από τη βιβλιοθήκη, ή διαγραφή τους από τον υπολογιστή "
+"σας πλήρως."
+
+#: C/organize-remove.page:12(title)
+msgid "Removing and deleting photos"
+msgstr "Αφαίρεση και διαγραφή φωτογραφιών"
+
+#: C/organize-remove.page:14(p)
+msgid ""
+"You may remove photos from your library and you may additionally delete them "
+"entirely from your hard disk."
+msgstr ""
+"Μπορείτε να αφαιρέσετε φωτογραφίες από τη βιβλιοθήκη σας και μπορείτε "
+"πρόσθετα να τις διαγράψετε πλήρως από τον σκληρό σας δίσκο."
+
+#: C/organize-remove.page:15(media)
+msgid "Delete process"
+msgstr "Διαγραφή διεργασίας"
+
+#: C/organize-remove.page:16(p)
+msgid ""
+"This diagram shows how a photo, when deleted, is first put into Shotwell's "
+"trash. If you delete it from Shotwell's trash, it is put into your "
+"computer's trash. If you delete it from your computer's trash the photo is "
+"finally and irretrievably deleted from your computer."
+msgstr ""
+"Αυτό το διάγραμμα εμφανίζει πώς μια φωτογραφία, όταν διαγράφεται, μπαίνει "
+"πρώτα στα απορρίμματα του Shotwell. Αν την διαγράψετε από τα απορρίμματα του "
+"Shotwell, μπαίνει στα απορρίμματα του υπολογιστή σας. Αν την διαγράψετε από "
+"τα απορρίμματα του υπολογιστή σας η φωτογραφία διαγράφεται οριστικά και "
+"αμετάκλητα από τον υπολογιστή σας."
+
+#: C/organize-remove.page:18(title)
+msgid "Removing photos from the library"
+msgstr "Αφαίρεση φωτογραφιών από τη βιβλιοθήκη"
+
+#: C/organize-remove.page:19(p)
+msgid ""
+"Select the photos to remove and choose <guiseq><gui>Edit</gui><gui>Move to "
+"Trash</gui></guiseq>. (You can also press the <key>Delete</key> key.) The "
+"photos will be moved from your library to Shotwell's Trash."
+msgstr ""
+"Επιλέξτε τις φωτογραφίες που θέλετε να αφαιρέσετε και επιλέξτε "
+"<guiseq><gui>Επεξεργασία</gui><gui>Μετακίνηση στα απορρίμματα</gui></"
+"guiseq>. (Μπορείτε επίσης να πατήσετε το πλήκτρο <key>Διαγραφή</key>.) Οι "
+"φωτογραφίες θα μετακινηθούν από τη βιβλιοθήκη σας στα απορρίμματα του "
+"Shotwell."
+
+#: C/organize-remove.page:22(p)
+msgid ""
+"If you want to remove photos from Shotwell without having them pass through "
+"the trash, simply select the photos to be removed and choose "
+"<guiseq><gui>Edit</gui><gui>Remove From Library</gui></guiseq>. The photo "
+"files will be left in place on disk."
+msgstr ""
+"Αν θέλετε να αφαιρέσετε φωτογραφίες από το Shotwell χωρίς να τις περάσετε "
+"μέσα από τα απορρίμματα, επιλέξτε απλά τις φωτογραφίες που θα αφαιρεθούν και "
+"επιλέξτε <guiseq><gui>Επεξεργασία</gui><gui>Αφαίρεση από τη βιβλιοθήκη</"
+"gui></guiseq>. Τα αρχεία φωτογραφιών θα αφεθούν επί τόπου στον δίσκο."
+
+#: C/organize-remove.page:26(title)
+msgid "Emptying or restoring the trash folder"
+msgstr "Άδειασμα ή επαναφορά του φακέλου απορριμμάτων"
+
+#: C/organize-remove.page:27(p)
+msgid ""
+"Select the Trash entry in the Sidebar and Shotwell will display all photos "
+"that have been marked for removal or deletion. In the Trash view, the "
+"following commands are available:"
+msgstr ""
+"Επιλέξτε την καταχώριση απορριμμάτων στην πλευρική στήλη και το Shotwell θα "
+"εμφανίσει όλες τις φωτογραφίες που έχετε σημειώσει για αφαίρεση ή διαγραφή. "
+"Στην προβολή απορριμάτων, οι επόμενες εντολές είναι διαθέσιμες:"
+
+#: C/organize-remove.page:29(title)
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#: C/organize-remove.page:29(p)
+msgid "Delete the selected photos from the trash folder."
+msgstr "Διαγραφή των επιλεγμένων φωτογραφιών από τον φάκελο απορριμμάτων."
+
+#: C/organize-remove.page:30(title)
+msgid "Restore"
+msgstr "Επαναφορά"
+
+#: C/organize-remove.page:30(p)
+msgid "Restore the selected photos into Shotwell."
+msgstr "Επαναφορά των επιλεγμένων φωτογραφιών στο Shotwell."
+
+#: C/organize-remove.page:31(title)
+msgid "Empty trash"
+msgstr "Άδειασμα απορριμάτων"
+
+#: C/organize-remove.page:31(p)
+msgid "Delete all photos from the trash folder."
+msgstr "Διαγραφή όλων των φωτογραφιών από τον φάκελο απορριμμάτων."
+
+#: C/organize-remove.page:36(title)
+msgid "Deleting or emptying Trash"
+msgstr "Διαγραφή ή άδειασμα απορριμμάτων"
+
+#: C/organize-remove.page:37(p)
+msgid ""
+"When you delete files from the Trash folder or empty the Trash folder, you "
+"will be given the following choices:"
+msgstr ""
+"Όταν διαγράφετε αρχεία από τον φάκελο απορριμμάτων ή αδειάζετε τον φάκελο "
+"απορριμμάτων, θα σας δοθούν οι επόμενες επιλογές:"
+
+#: C/organize-remove.page:39(title)
+msgid "Only Remove"
+msgstr "Μόνο αφαίρεση"
+
+#: C/organize-remove.page:39(p)
+msgid ""
+"Remove photos from the library but leave the photos in their location on the "
+"computer."
+msgstr ""
+"Αφαιρεί τις φωτογραφίες από τη βιβλιοθήκη, αλλά τις αφήνει στη θέση τους "
+"στον υπολογιστή."
+
+#: C/organize-remove.page:40(title)
+msgid "Trash file"
+msgstr "Αρχείο απορριμμάτων"
+
+#: C/organize-remove.page:40(p)
+msgid "Remove photos from the library and delete them from the computer."
+msgstr ""
+"Αφαιρεί τις φωτογραφίες από τη βιβλιοθήκη και τις διαγράφει από τον "
+"υπολογιστή."
+
+#: C/organize-remove.page:41(title)
+msgid "Cancel"
+msgstr "Άκυρο"
+
+#: C/organize-remove.page:41(p)
+msgid "Do nothing."
+msgstr "Καμία ενέργεια."
+
+#: C/organize-rating.page:7(desc)
+msgid ""
+"Give photos a rating between 1 and 5 stars. You can reject bad photos, "
+"hiding them from view."
+msgstr ""
+"Δώστε στις φωτογραφίες μια αξιολόγηση μεταξύ 1 και 5 αστεριών. Μπορείτε να "
+"απορρίψετε άσχημες φωτογραφίες, κρύβοντας τες από την προβολή."
+
+#: C/organize-rating.page:12(title)
+msgid "Ratings"
+msgstr "Αξιολογήσεις"
+
+#: C/organize-rating.page:13(p)
+msgid ""
+"You can assign each photo a rating from 1-5 stars, or may alternatively rate "
+"it as Rejected, in which case Shotwell will hide the photo by default."
+msgstr ""
+"Μπορείτε να δώσετε σε κάθε φωτογραφία μια βαθμολόγηση από 1-5 αστέρια, ή "
+"μπορείτε εναλλακτικά να την αξιολογήσετε ως απορριφθείσα, οπότε το Shotwell "
+"θα κρύψει την φωτογραφία από προεπιλογή."
+
+#: C/organize-rating.page:15(p)
+msgid "You can rate a photo or a set of photos in any of these ways:"
+msgstr ""
+"Μπορείτε να αξιολογήσετε μια φωτογραφία ή ένα σύνολο φωτογραφιών με "
+"οποιονδήποτε από αυτούς τους τρόπους:"
+
+#: C/organize-rating.page:18(p)
+msgid ""
+"Select the photo(s), then choose a rating from the top-level "
+"<guiseq><gui>Photos</gui><gui>Set Rating</gui></guiseq> menu."
+msgstr ""
+"Επιλέξτε τις φωτογραφίες, έπειτα επιλέξτε μια αξιολόγηση από το μενού "
+"ανωτάτου επιπέδου <guiseq><gui>Φωτογραφίες</gui><gui>Ορισμός αξιολόγησης</"
+"gui></guiseq>."
+
+#: C/organize-rating.page:19(p)
+msgid ""
+"Right-click on the photo(s), then choose a rating from the Set Rating "
+"context menu."
+msgstr ""
+"Δεξιοπατήστε στις φωτογραφίες, έπειτα επιλέξτε μια αξιολόγηση από το μενού "
+"περιεχομένων αξιολόγησης."
+
+#: C/organize-rating.page:20(p)
+msgid ""
+"Select the photo(s), then press any of the shortcut keys <key>1</key>, "
+"<key>2</key>, <key>3</key>, <key>4</key> or <key>5</key> to assign a rating. "
+"Or press <key>9</key> to mark the photo(s) as rejected or <key>0</key> to "
+"clear the rating(s)."
+msgstr ""
+"Επιλέξτε τις φωτογραφίες, έπειτα πατήστε οποιαδήποτε από τα πλήκτρα "
+"συντόμευσης <key>1</key>, <key>2</key>, <key>3</key>, <key>4</key> ή <key>5</"
+"key> για να δώσετε μια αξιολόγηση. Ή πατήστε <key>9</key> για να σημειώσετε "
+"τις φωτογραφίες ως απορριφθείσες ή <key>0</key> για να καθαρίσετε τις "
+"αξιολογήσεις."
+
+#: C/organize-rating.page:23(p)
+msgid ""
+"Normally Shotwell displays all photos except rejected photos. You can set a "
+"different rating filter using the <guiseq><gui>View</gui><gui>Filter Photos</"
+"gui></guiseq> menu - for example, you can display only photos rated with 3 "
+"stars or higher, or you can display all photos including those marked "
+"rejected. The Shotwell icon on the toolbar displays the current rating "
+"filter and can also be used to set the filter."
+msgstr ""
+"Κανονικά το Shotwell εμφανίζει όλες τις φωτογραφίες εκτός από τις "
+"απορριφθείσες. Μπορείτε να ορίσετε ένα διαφορετικό φίλτρο αξιολόγησης "
+"χρησιμοποιώντας το μενού <guiseq><gui>Προβολή</gui><gui>Φιλτράρισμα "
+"φωτογραφιών</gui></guiseq> - για παράδειγμα, μπορείτε να εμφανίσετε μόνο "
+"φωτογραφίες που αξιολογούνται με 3 αστέρια ή περισσότερο, ή μπορείτε να "
+"εμφανίσετε όλες τις φωτογραφίες συμπεριλαμβανομένων αυτών που σημειώθηκαν ως "
+"απορριφθείσες. Το εικονίδιο Shotwell στην εργαλειοθήκη εμφανίζει το τρέχον "
+"φίλτρο αξιολόγησης και μπορεί επίσης να χρησιμοποιηθεί για να ορίσει το "
+"φίλτρο."
+
+#: C/organize-rating.page:26(p)
+msgid ""
+"Shotwell normally displays each photo's rating in its lower left-hand "
+"corner. You can turn off the display of ratings using the <guiseq><gui>View</"
+"gui><gui>Ratings</gui></guiseq> menu item."
+msgstr ""
+"Το Shotwell κανονικά εμφανίζει αξιολόγηση κάθε φωτογραφίας στην κάτω "
+"αριστερή γωνία. Μπορείτε να απενεργοποιήσετε την εμφάνιση των αξιολογήσεων "
+"χρησιμοποιώντας το στοιχείο μενού <guiseq><gui>Προβολή</"
+"gui><gui>Αξιολογήσεις</gui></guiseq>."
+
+#: C/organize-rating.page:28(p)
+msgid ""
+"You can increase or decrease a photo's rating using the <guiseq><gui>Set "
+"Rating</gui><gui>Increase</gui></guiseq> and <guiseq><gui>Set Rating</"
+"gui><gui>Decrease</gui></guiseq> commands, or the keyboard shortcuts "
+"<key>&lt;</key> and <key>&gt;</key>."
+msgstr ""
+"Μπορείτε να αυξήσετε ή να μειώσετε την αξιολόγηση μιας φωτογραφίας "
+"χρησιμοποιώντας τις εντολές <guiseq><gui>Ορισμός αξιολόγησης</"
+"gui><gui>Αύξηση</gui></guiseq> και <guiseq><gui>Ορισμός αξιολόγησης</"
+"gui><gui>Μείωση</gui></guiseq>, ή τις συντομεύσεις πληκτρολογίου <key>&lt;</"
+"key> και <key>&gt;</key>."
+
+#: C/organize-flag.page:7(desc)
+msgid "Flag photos to mark them as special or to work with them as a set."
+msgstr ""
+"Βάλτε σημαίες για να τις σημειώσετε ως ειδικές ή για να τις δουλέψετε ως "
+"σύνολο."
+
+#: C/organize-flag.page:12(title)
+msgid "Flagging photos"
+msgstr "Προσθήκη σημαίας στις φωτογραφίες"
+
+#: C/organize-flag.page:14(p)
+msgid ""
+"Shotwell lets you <em>flag</em> photos. When a photo is flagged, a small "
+"flag icon appears in its upper right corner. You can select the "
+"<gui>Flagged</gui> item in the sidebar to see all photos which have been "
+"flagged."
+msgstr ""
+"Το Shotwell σας επιτρέπει να <em>βάλετε σημαία</em> στις φωτογραφίες. Όταν "
+"μια φωτογραφία είναι με σημαία, ένα μικρό εικονίδιο σημαίας εμφανίζεται στην "
+"πάνω δεξιά γωνία. Μπορείτε να επιλέξετε το στοιχείο <gui>με σημαία</gui> "
+"στην πλευρική στήλη για να δείτε όλες τις φωτογραφίες που έχουν σημαία."
+
+#: C/organize-flag.page:18(p)
+msgid ""
+"Flagging a photo marks it as special. You can interpret this in any way you "
+"like. For example, you might flag all photos which need visual adjustment, "
+"or all photos which you want to share with a friend."
+msgstr ""
+"Η προσθήκη σημαίας σε μια φωτογραφία τη σημειώνει ως ειδική. Μπορείτε να το "
+"ερμηνεύσετε όπως θέλετε. Για παράδειγμα, μπορείτε να βάλετε σημαία σε όλες "
+"τις φωτογραφίες που χρειάζονται οπτική ρύθμιση, ή σε όλες τις φωτογραφίες "
+"που θέλετε να μοιραστείτε με έναν φίλο."
+
+#: C/organize-flag.page:22(p)
+msgid ""
+"Flagging is also useful because you can operate on all flagged photos as a "
+"set. For example, you can select the <gui>Flagged</gui> view and then upload "
+"all flagged photos to a publishing service."
+msgstr ""
+"Η προσθήκη σημαίας είναι επίσης χρήσιμη, επειδή μπορείτε να επεξεργαστείτε "
+"όλες τις φωτογραφίες με σημαία ως σύνολο. Για παράδειγμα, μπορείτε να "
+"επιλέξετε την προβολή <gui>με σημαία</gui> και έπειτα να μεταφορτώσετε όλες "
+"τις φωτογραφίες με σημαία σε μια υπηρεσία δημοσίευσης."
+
+#: C/organize-flag.page:27(title)
+msgid "To flag or unflag a photo"
+msgstr "Προσθήκη ή αφαίρεση σημαίας σε φωτογραφία"
+
+#: C/organize-flag.page:28(p)
+msgid ""
+"To flag or unflag a photo, right-click the photo and choose <gui>Flag</gui> "
+"or <gui>Unflag</gui> from the context menu. Or use the <keyseq><key>Ctrl</"
+"key><key>G</key></keyseq> or <key>/</key> shortcut keys."
+msgstr ""
+"Για να προσθέσετε ή να αφαιρέσετε σημαία σε μια φωτογραφία, δεξιοπατήστε τη "
+"φωτογραφία και επιλέξτε <gui>Προσθήκη σημαίας</gui> ή <gui>Αφαίρεση σημαίας</"
+"gui> από το μενού περιεχομένων. Ή χρησιμοποιήστε τα πλήκτρα συντόμευσης "
+"<keyseq><key>Ctrl</key><key>G</key></keyseq> ή <key>/</key>."
+
+#: C/organize-event.page:7(desc)
+msgid ""
+"Group photos together that were taken at the same time. Learn how to rename, "
+"merge, and sort events."
+msgstr ""
+"Ομαδοποιήστε μαζί τις φωτογραφίες που ελήφθησαν ταυτόχρονα. Μάθετε πώς να "
+"μετονομάσετε, να συγχωνεύσετε και να ταξινομήσετε συμβάντα."
+
+#: C/organize-event.page:12(title)
+msgid "Events"
+msgstr "Συμβάντα"
+
+#: C/organize-event.page:14(p)
+msgid ""
+"An event is a group of photos that were taken at approximately the same "
+"time. When you import photos, Shotwell checks when each photo was taken. It "
+"then groups the photos into events."
+msgstr ""
+"Ένα συμβάν είναι μια ομάδα φωτογραφιών που ελήφθησαν περίπου την ίδια ώρα. "
+"Όταν εισάγετε φωτογραφίες, το Shotwell ελέγχει πότε ελήφθη κάθε φωτογραφία. "
+"Έπειτα ομαδοποιεί τις φωτογραφίες σε συμβάντα."
+
+#: C/organize-event.page:16(p)
+msgid ""
+"Choose <gui>Events</gui> from the sidebar to see your photos organized by "
+"date. If you select a month or year from the sidebar, a list of events will "
+"be displayed in the main window. Double-click an event to see all the photos "
+"that were taken around that time."
+msgstr ""
+"Επιλέξτε <gui>Συμβάντα</gui> από την πλευρική στήλη για να δείτε τις "
+"φωτογραφίες σας οργανωμένες κατά ημερομηνία. Αν επιλέξετε έναν μήνα ή έτος "
+"από την πλευρική στήλη, θα εμφανιστεί ένας κατάλογος συμβάντων στο κυρίως "
+"παράθυρο. Διπλοπατήστε όλες τις φωτογραφίες που ελήφθησαν περίπου την ίδια "
+"ώρα."
+
+#: C/organize-event.page:18(p)
+msgid ""
+"If a photo has no embedded date/time information, then Shotwell can't "
+"automatically place it in any event. In this case the photo will appear in "
+"the <gui>No Event</gui> view accessible from the sidebar. You can still move "
+"the photo to any event you like as described below."
+msgstr ""
+"Αν μια φωτογραφία δεν έχει ενσωματωμένες πληροφορίες ημερομηνίας/χρόνου, "
+"τότε το Shotwell δεν μπορεί να την βάλει αυτόματα σε κανένα συμβάν. Σε αυτήν "
+"την περίπτωση η φωτογραφία θα εμφανιστεί στην προβολή <gui>Κανένα συμβάν</"
+"gui> προσβάσιμη από την πλευρική στήλη. Μπορείτε ακόμα να μετακινήσετε την "
+"φωτογραφία σε οποιοδήποτε συμβάν θέλετε όπως περιγράφεται παρακάτω."
+
+#: C/organize-event.page:25(title)
+msgid "Renaming events"
+msgstr "Μετονομασία συμβάντων"
+
+#: C/organize-event.page:27(p)
+msgid ""
+"To give an event a name rather than referring to it by its date, select the "
+"event, click <guiseq><gui>Edit</gui><gui>Rename Event</gui></guiseq> and "
+"enter a new name. Another way of renaming an event is to double-click its "
+"name in the sidebar; type a new name and then press <key>Enter</key>."
+msgstr ""
+"Για να δώσετε ένα όνομα σε ένα συμβάν αντί να το αναφέρετε με την ημερομηνία "
+"του, επιλέξτε το συμβάν, πατήστε <guiseq><gui>Επεξεργασία</"
+"gui><gui>Μετονομασία συμβάντος</gui></guiseq> και εισάγετε ένα νέο όνομα. "
+"Ένας άλλος τρόπος μετονομασίας ενός συμβάντος είναι να διπλοπατήσετε το "
+"όνομά του στην πλευρική στήλη· πληκτρολογήστε ένα νέο όνομα και έπειτα "
+"πατήστε το πλήκτρο <key>Εισαγωγή</key>."
+
+#: C/organize-event.page:31(title)
+msgid "Moving photos between events"
+msgstr "Μετακίνηση φωτογραφιών μεταξύ συμβάντων"
+
+#: C/organize-event.page:33(p)
+msgid ""
+"Even though photos are initially grouped into events by their date, you can "
+"move photos between events. To do this, drag any photo to the sidebar and "
+"drop it on an event."
+msgstr ""
+"Αν και οι φωτογραφίες είναι αρχικά ομαδοποιημένες σε συμβάντα με την "
+"ημερομηνία τους, μπορείτε να μετακινήσετε φωτογραφίες μεταξύ συμβάντων. Για "
+"να το κάνετε αυτό, μεταφέρτε κάθε φωτογραφία στην πλευρική στήλη και "
+"αποθέστε την σε ένα συμβάν."
+
+#: C/organize-event.page:37(title)
+msgid "Creating and merging events"
+msgstr "Δημιουργία και συγχώνευση συμβάντων"
+
+#: C/organize-event.page:38(p)
+msgid ""
+"To create a new event, select the photos you would like in the new event and "
+"click <guiseq><gui>Events</gui><gui>New Event</gui></guiseq>."
+msgstr ""
+"Για να δημιουργήσετε ένα νέο συμβάν, επιλέξτε τις φωτογραφίες που θα θέλατε "
+"στο νέο συμβάν και πατήστε <guiseq><gui>Συμβάντα</gui><gui>Νέο συμβάν</gui></"
+"guiseq>."
+
+#: C/organize-event.page:39(p)
+msgid ""
+"To merge events, select <guiseq><gui>Events</gui></guiseq> from the sidebar, "
+"then, while holding down <key>Ctrl</key> click on the events you want to "
+"merge in the main window area. Finally, click <guiseq><gui>Events</"
+"gui><gui>Merge Events</gui></guiseq>."
+msgstr ""
+"Για να συγχωνεύσετε συμβάντα, επιλέξτε <guiseq><gui>Συμβάντα</gui></guiseq> "
+"από την πλευρική στήλη, έπειτα, ενώ κρατάτε πατημένο το <key>Ctrl</key> "
+"πατήστε στα συμβάντα που θέλετε να συγχωνεύσετε στην περιοχή του κυρίως "
+"παραθύρου. Τελικά, πατήστε <guiseq><gui>Συμβάντα</gui><gui>Συγχώνευση "
+"συμβάντων</gui></guiseq>."
+
+#: C/organize-event.page:43(title)
+msgid "Sorting events"
+msgstr "Ταξινόμηση συμβάντων"
+
+#: C/organize-event.page:45(p)
+msgid ""
+"Events are displayed in a tree in the sidebar, organized by the year and "
+"month of the earliest photo in the event. To change the event sort order, "
+"click <guiseq><gui>View</gui><gui>Sort Events</gui></guiseq> and select "
+"either ascending or descending."
+msgstr ""
+"Τα συμβάντα εμφανίζονται σε ένα δένδρο στην πλευρική στήλη, οργανωμένα "
+"σύμφωνα με το έτος και τον μήνα της πιο πρόσφατης φωτογραφίας στο συμβάν. "
+"Για να αλλάξετε τη σειρά ταξινόμησης του συμβάντος, πατήστε "
+"<guiseq><gui>Προβολή</gui><gui>Ταξινόμηση συμβάντων</gui></guiseq> και "
+"επιλέξτε ή αύξουσα ή φθίνουσα."
+
+#: C/organize-event.page:51(title)
+msgid "Change the photo used to represent each event"
+msgstr ""
+"Αλλαγή της χρησιμοποιούμενης φωτογραφίας που θα αναπαραστήσει κάθε συμβάν"
+
+#: C/organize-event.page:53(p)
+msgid ""
+"If you select the Events item in the sidebar, you'll see a single photo "
+"which represents each event. This is called the key photo."
+msgstr ""
+"Αν επιλέξετε το στοιχείο συμβάντα στην πλευρική στήλη, θα δείτε μια "
+"μεμονωμένη φωτογραφία που απεικονίζει κάθε συμβάν. Αυτή λέγεται βασική "
+"φωτογραφία."
+
+#: C/organize-event.page:55(p)
+msgid ""
+"By default, Shotwell uses the first photo in each event as its key photo. To "
+"use a different key photo, select the photo and choose <guiseq><gui>Photos</"
+"gui><gui>Make Key Photo for Event</gui></guiseq>."
+msgstr ""
+"Από προεπιλογή, το Shotwell χρησιμοποιεί την πρώτη φωτογραφία σε κάθε συμβάν "
+"ως την βασική φωτογραφία. Για να χρησιμοποιήσετε μια διαφορετική φωτογραφία "
+"ως βασική, επιλέξτε την φωτογραφία και διαλέξτε <guiseq><gui>Φωτογραφίες</"
+"gui><gui>Ορισμός ως βασική φωτογραφία για το συμβάν</gui></guiseq>."
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/index.page:23(None)
+msgid ""
+"@@image: 'figures/shotwell_logo.png'; md5=59de2b2c4fa64ea1497c98452c509dbd"
+msgstr ""
+"@@image: 'figures/shotwell_logo.png'· md5=59de2b2c4fa64ea1497c98452c509dbd"
+
+#: C/index.page:6(title) C/index.page:7(title)
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: C/index.page:9(name)
+msgid "Jim Nelson"
+msgstr "Jim Nelson"
+
+#: C/index.page:10(email)
+msgid "jim@yorba.org"
+msgstr "jim@yorba.org"
+
+#: C/index.page:11(name)
+msgid "Allison Barlow"
+msgstr "Allison Barlow"
+
+#: C/index.page:12(email)
+msgid "allison@yorba.org"
+msgstr "allison@yorba.org"
+
+#: C/index.page:13(name)
+msgid "Robert Ancell"
+msgstr "Robert Ancell"
+
+#: C/index.page:14(email)
+msgid "robert.ancell@canonical.com"
+msgstr "robert.ancell@canonical.com"
+
+#: C/index.page:15(name)
+msgid "Peter Smith"
+msgstr "Peter Smith"
+
+#: C/index.page:16(email)
+msgid "pdo.smith@gmail.com"
+msgstr "pdo.smith@gmail.com"
+
+#: C/index.page:17(name)
+msgid "Phil Bull"
+msgstr "Phil Bull"
+
+#: C/index.page:18(email)
+msgid "philbull@gmail.com"
+msgstr "philbull@gmail.com"
+
+#: C/index.page:23(title)
+msgid ""
+"<media type=\"image\" src=\"figures/shotwell_logo.png\"/>Shotwell Photo "
+"Manager"
+msgstr ""
+"<media type=\"image\" src=\"figures/shotwell_logo.png\"/>Διαχειριστής "
+"φωτογραφιών Shotwell"
+
+#: C/index.page:26(title)
+msgid "Importing Photos"
+msgstr "Εισαγωγή φωτογραφιών"
+
+#: C/index.page:30(title)
+msgid "Viewing Photos"
+msgstr "Προβολή φωτογραφιών"
+
+#: C/index.page:34(title)
+msgid "Organizing Photos"
+msgstr "Οργάνωση φωτογραφιών"
+
+#: C/index.page:38(title)
+msgid "Editing Photos"
+msgstr "Επεξεργασία φωτογραφιών"
+
+#: C/index.page:42(title)
+msgid "Sharing Photos"
+msgstr "Μερισμός φωτογραφιών"
+
+#: C/index.page:46(title)
+msgid "Other Features"
+msgstr "Άλλα χαρακτηριστικά"
+
+#: C/import-memorycard.page:7(desc)
+msgid "Import photos from a digital camera's memory card."
+msgstr "Εισαγωγή φωτογραφιών από κάρτα μνήμης ψηφιακής φωτογραφικής μηχανής."
+
+#: C/import-memorycard.page:12(title)
+msgid "Importing from a memory card"
+msgstr "Εισαγωγή από μια κάρτα μνήμης"
+
+#: C/import-memorycard.page:14(p)
+msgid "To import photos from a camera memory card:"
+msgstr "Για να εισάγετε φωτογραφίες από μια κάρτα μνήμης φωτογραφικής μηχανής:"
+
+#: C/import-memorycard.page:18(p)
+msgid ""
+"Put the card into your card reader. Make sure the card reader is plugged in "
+"to the computer and switched on."
+msgstr ""
+"Βάλτε την κάρτα στον αναγνώστη καρτών σας. Βεβαιωθείτε ότι ο αναγνώστης "
+"καρτών είναι συνδεμένος με τον υπολογιστή και ενεργός."
+
+#: C/import-memorycard.page:21(p)
+msgid "The card reader and card should be detected automatically."
+msgstr "Ο αναγνώστης καρτών και η κάρτα πρέπει να ανιχνευτούν αυτόματα."
+
+#: C/import-memorycard.page:24(p)
+msgid ""
+"Follow the instructions for <link xref=\"import-file\">importing photos from "
+"your hard disk</link>. If you click <guiseq><gui>File</gui><gui>Import From "
+"Folder</gui></guiseq>, the memory card should be visible as a folder in the "
+"side bar of the file selection window."
+msgstr ""
+"Ακολουθήστε τις οδηγίες για την <link xref=\"import-file\">εισαγωγή "
+"φωτογραφιών από τον σκληρό σας δίσκο</link>. Αν πατήσετε "
+"<guiseq><gui>Αρχείο</gui><gui>Εισαγωγή από φάκελο</gui></guiseq>, η κάρτα "
+"μνήμης πρέπει να είναι ορατή ως φάκελος στην πλευρική στήλη του παραθύρου "
+"επιλογής αρχείου."
+
+#: C/import-memorycard.page:28(p)
+msgid ""
+"Shotwell can import photos from any memory card that is compatible with your "
+"card reader."
+msgstr ""
+"Το Shotwell μπορεί να εισάγει φωτογραφίες από κάθε κάρτα μνήμης που είναι "
+"συμβατή με τον αναγνώστη της κάρτας σας."
+
+#: C/import-memorycard.page:30(p)
+msgid ""
+"If the card is not detected automatically, your card reader may not have "
+"been recognized. Try unplugging it and then plugging it in again. If that "
+"doesn't work, you should still be able to import photos by <link xref="
+"\"import-camera\">connecting your camera directly to the computer</link>, "
+"though."
+msgstr ""
+"Αν η κάρτα δεν έχει αναγνωριστεί αυτόματα, ο αναγνώστης της κάρτας σας "
+"μπορεί να μην έχει αναγνωριστεί. Δοκιμάστε να την αποσυνδέσετε και έπειτα "
+"συνδέστε την πάλι. Αν αυτό δεν δουλέψει, θα πρέπει να μπορείτε ακόμα να "
+"εισάγετε φωτογραφίες <link xref=\"import-camera\">συνδέοντας την φωτογραφική "
+"μηχανή σας άμεσα με τον υπολογιστή</link>, όμως."
+
+#: C/import-f-spot.page:7(desc)
+msgid ""
+"Shotwell can import all your photos and tags from the F-Spot photo manager."
+msgstr ""
+"Το Shotwell μπορεί να εισάγει όλες τις φωτογραφίες και ετικέτες σας από τον "
+"διαχειριστή φωτογραφιών F-Spot."
+
+#: C/import-f-spot.page:12(title)
+msgid "Importing from F-Spot"
+msgstr "Εισαγωγή από F-Spot"
+
+#: C/import-f-spot.page:14(p)
+msgid "To import an existing photo collection from F-Spot:"
+msgstr "Για να εισάγετε μια υπάρχουσα φωτογραφική συλλογή από F-Spot:"
+
+#: C/import-f-spot.page:16(p)
+msgid "Select <guiseq><gui>File</gui><gui>Import From F-Spot</gui></guiseq>."
+msgstr ""
+"Επιλέξτε <guiseq><gui>Αρχείο</gui><gui>Εισαγωγή από F-Spot</gui></guiseq>."
+
+#: C/import-f-spot.page:17(p)
+msgid ""
+"Now choose either the default F-Spot library or another F-Spot database. If "
+"importing from another F-Spot database, select a directory and file from the "
+"chooser dialog box."
+msgstr ""
+"Τώρα επιλέξτε ή την προεπιλεγμένη βιβλιοθήκη F-Spot ή κάποια άλλη βάση "
+"δεδομένων F-Spot. Αν η εισαγωγή είναι από μια άλλη βάση δεδομένων F-Spot, "
+"επιλέξτε κατάλογο και αρχείο από το πλαίσιο διαλόγου επιλογής."
+
+#: C/import-f-spot.page:20(p)
+msgid ""
+"Shotwell will import your photos, together with their tags and other "
+"information. Once the import is complete, you can select <gui>Last Import</"
+"gui> in the sidebar to see all photos successfully imported. The Events list "
+"will also show new entries for the dates corresponding to the imported "
+"photos."
+msgstr ""
+"Το Shotwell θα εισάγει τις φωτογραφίες σας, μαζί με τις ετικέτες τους και "
+"άλλες πληροφορίες. Αφού συμπληρωθεί η εισαγωγή, μπορείτε να επιλέξετε "
+"<gui>Τελευταία εισαγωγή</gui> στην πλευρική στήλη για να δείτε όλες τις "
+"φωτογραφίες εισηγμένες με επιτυχία. Ο κατάλογος συμβάντων θα εμφανίσει "
+"επίσης νέες καταχωρίσεις για τις ημερομηνίες που αντιστοιχούν στις "
+"εισηγμένες φωτογραφίες."
+
+#: C/import-file.page:7(desc)
+msgid "Import photos that are already saved on your computer."
+msgstr ""
+"Για να εισάγετε φωτογραφίες που είναι ήδη αποθηκευμένες στον υπολογιστή σας."
+
+#: C/import-file.page:12(title)
+msgid "Importing from your hard disk"
+msgstr "Εισαγωγή από τον σκληρό δίσκο σας"
+
+#: C/import-file.page:14(p)
+msgid ""
+"To import photo files from your hard disk into Shotwell, just drag them from "
+"your file browser into the Shotwell window."
+msgstr ""
+"Για να εισάγετε αρχεία φωτογραφιών από τον σκληρό δίσκο σας στο Shotwell, "
+"μεταφέρτε τα απλά από τον περιηγητή αρχείων σας στο παράθυρο Shotwell."
+
+#: C/import-file.page:16(p)
+msgid ""
+"Alternatively, click <guiseq><gui>File</gui><gui>Import From Folder</gui></"
+"guiseq> and select the folder containing the photos you want to import."
+msgstr ""
+"Εναλλακτικά, πατήστε <guiseq><gui>Αρχείο</gui><gui>Εισαγωγή από φάκελο</"
+"gui></guiseq> και επιλέξτε τον φάκελο που περιέχει τις φωτογραφίες που "
+"θέλετε να εισάγετε."
+
+#: C/import-file.page:18(p)
+msgid ""
+"Shotwell will ask whether you want to copy the photo files to your library "
+"folder (usually this is the <file>Pictures</file> folder in your home "
+"directory) or to import them in place without copying the files."
+msgstr ""
+"Το Shotwell θα ρωτήσει αν θέλετε να αντιγράψετε τα αρχεία φωτογραφίας στον "
+"φάκελο βιβλιοθήκης (συνήθως αυτός είναι ο φάκελος <file>Pictures</file> στον "
+"προσωπικό σας κατάλογο) ή να τα εισάγετε επί τόπου χωρίς αντιγραφή των "
+"αρχείων."
+
+#: C/import-file.page:20(p)
+msgid ""
+"If you hold down <key>Ctrl</key> while dragging photos in, Shotwell will "
+"copy the photos into your library folder without prompting. Similarly, if "
+"you hold down <keyseq><key>Ctrl</key><key>Shift</key></keyseq> while "
+"dragging photos in, Shotwell will import the photos without copying them."
+msgstr ""
+"Αν κρατάτε πατημένο το <key>Ctrl</key> κατά τη μεταφορά των φωτογραφιών, το "
+"Shotwell θα αντιγράψει τις φωτογραφίες στον φάκελο βιβλιοθήκης χωρίς "
+"ειδοποίηση. Παρόμοια, αν κρατάτε πατημένα τα <keyseq><key>Ctrl</"
+"key><key>Shift</key></keyseq> κατά τη μεταφορά φωτογραφιών, το Shotwell θα "
+"εισάγει τις φωτογραφίες χωρίς να τις αντιγράψει."
+
+#: C/import-file.page:22(p)
+msgid ""
+"Once the import is complete, you can select <gui>Last Import</gui> in the "
+"sidebar to see all photos successfully imported. The Events list will also "
+"show new entries for the dates corresponding to the imported photos."
+msgstr ""
+"Αφού συμπληρωθεί η εισαγωγή, μπορείτε να επιλέξετε <gui>Τελευταία εισαγωγή</"
+"gui> στην πλευρική στήλη για να δείτε όλες τις φωτογραφίες εισηγμένες με "
+"επιτυχία. Ο κατάλογος συμβάντων θα εμφανίσει επίσης νέες καταχωρίσεις για "
+"τις ημερομηνίες που αντιστοιχούν στις εισηγμένες φωτογραφίες."
+
+#: C/import-camera.page:7(desc)
+msgid "Copy photos from a digital camera."
+msgstr "Αντιγραφή φωτογραφιών από μια ψηφιακή φωτογραφική μηχανή."
+
+#: C/import-camera.page:12(title)
+msgid "Importing from a camera"
+msgstr "Εισαγωγή από φωτογραφική μηχανή"
+
+#: C/import-camera.page:14(p)
+msgid "To import photos from a digital camera:"
+msgstr "Για να εισάγετε φωτογραφίες από μια ψηφιακή κάμερα:"
+
+#: C/import-camera.page:18(p)
+msgid ""
+"Connect the camera to your computer and switch it on. Shotwell will detect "
+"it and list it in the sidebar."
+msgstr ""
+"Συνδέστε τη φωτογραφική μηχανή στον υπολογιστή σας και ανοίξτε την. Το "
+"Shotwell θα την αναγνωρίσει και θα την καταχωρίσει στην πλευρική στήλη."
+
+#: C/import-camera.page:22(p)
+msgid ""
+"Select the camera in the sidebar. Previews of each photo on the camera will "
+"be displayed."
+msgstr ""
+"Επιλέξτε τη φωτογραφική μηχανή στην πλευρική στήλη. Οι προεπισκοπήσεις κάθε "
+"φωτογραφίας στη φωτογραφική μηχανή θα εμφανιστούν."
+
+#: C/import-camera.page:25(p)
+msgid ""
+"If you like, you can choose a set of specific photos to import. To do this, "
+"hold down the <key>Ctrl</key> key and click to select individual photos. You "
+"can hold down <key>Shift</key> and click to select a range of photos too."
+msgstr ""
+"Αν θέλετε, μπορείτε να επιλέξετε ένα σύνολο ειδικών φωτογραφιών για "
+"εισαγωγή. Για να το κάνετε αυτό, κρατήστε πατημένο το πλήκτρο <key>Ctrl</"
+"key> και πατήστε για να επιλέξετε τις μεμονωμένες φωτογραφίες. Μπορείτε να "
+"κρατήσετε πατημένο το <key>Shift</key> και να πατήσετε να επιλέξετε μια "
+"περιοχή φωτογραφιών επίσης."
+
+#: C/import-camera.page:28(p)
+msgid ""
+"Click either <gui>Import Selected</gui> or <gui>Import All</gui>. The photos "
+"will be copied from the camera and saved on your computer."
+msgstr ""
+"Πατήστε ή <gui>Εισαγωγή επιλεγμένης</gui> ή <gui>Εισαγωγή όλων</gui>. Οι "
+"φωτογραφίες θα αντιγραφούν από τη φωτογραφική μηχανή και θα αποθηκευτούν "
+"στον υπολογιστή σας."
+
+#: C/import-camera.page:32(p)
+msgid ""
+"Once the import is complete, you can open the <gui>Last Import</gui> view "
+"(in the sidebar) to see all photos that were imported. The Events list (also "
+"in the sidebar) will also show the new photos, organized by date."
+msgstr ""
+"Όταν ολοκληρωθεί η εισαγωγή, μπορείτε να ανοίξετε την προβολή <gui>Τελευταία "
+"εισαγωγή</gui> (στην πλευρική στήλη) για να δείτε όλες τις φωτογραφίες που "
+"εισήχθησαν. Ο κατάλογος συμβάντων (επίσης στην πλευρική στήλη) θα εμφανίσει "
+"τις νέες φωτογραφίες, οργανωμένες κατά ημερομηνία."
+
+#: C/formats.page:7(desc)
+msgid ""
+"Shotwell supports JPEG, PNG, TIFF, BMP and RAW photo files as well as video "
+"files."
+msgstr ""
+"Το Shotwell υποστηρίζει αρχεία φωτογραφίας JPEG, PNG, TIFF, BMP και RAW "
+"καθώς και αρχεία βίντεο."
+
+#: C/formats.page:12(title)
+msgid "Supported photo and video formats"
+msgstr "Υποστηριζόμενες μορφές φωτογραφιών και βίντεο"
+
+#: C/formats.page:14(p)
+msgid ""
+"Shotwell supports JPEG, PNG, TIFF, BMP and <link type=\"guide\" xref=\"other-"
+"raw\">RAW</link> photo files. Shotwell does not yet support other graphics "
+"format such as GIF."
+msgstr ""
+"Το Shotwell υποστηρίζει αρχεία φωτογραφίας JPEG, PNG, TIFF, BMP και <link "
+"type=\"guide\" xref=\"other-raw\">RAW</link>. Το Shotwell δεν υποστηρίζει "
+"ακόμα άλλες μορφές γραφικών όπως GIF."
+
+#: C/formats.page:16(p)
+msgid ""
+"Shotwell's RAW format support is currently limited. When you view a RAW "
+"photo, you are actually viewing a JPEG derived from the RAW photo, not the "
+"RAW image itself. Additionally, the RAW editing pipeline is not fully 16-bit "
+"- you can only export edited photos as 8-bit files. All supported formats "
+"can be used for export (JPEG, PNG, TIFF, BMP)."
+msgstr ""
+"Η υποστήριξη της μορφής RAW του Shotwell είναι προς το παρόν περιορισμένη. "
+"Όταν προβάλετε μια φωτογραφία RAW, στην πραγματικότητα προβάλετε μια JPEG "
+"που παράγεται από τη φωτογραφία RAW, όχι την ίδια την εικόνα RAW. "
+"Επιπρόσθετα, η διοχέτευση επεξεργασίας RAW δεν είναι πλήρως 16-δυαδικών - "
+"μπορείτε μόνο να εξάγετε επεξεργασμένες φωτογραφίες ως αρχεία 8 δυαδικών. "
+"Όλες οι υποστηριζόμενες μορφές μπορούν να χρησιμοποιηθούν για εξαγωγή (JPEG, "
+"PNG, TIFF, BMP)."
+
+#: C/formats.page:18(p)
+msgid ""
+"For more information about RAW-format photos in Shotwell, please see the "
+"<link type=\"guide\" xref=\"other-raw\">RAW</link> section."
+msgstr ""
+"Για περισσότερες πληροφορίες σχετικά με τις φωτογραφίες μορφής RAW στο "
+"Shotwell, παρακαλούμε δείτε την ενότητα <link type=\"guide\" xref=\"other-raw"
+"\">RAW</link>."
+
+#: C/formats.page:22(p)
+msgid ""
+"Shotwell also supports video files in any format supported by the GStreamer "
+"media library on the system where Shotwell is running. This typically "
+"includes the following formats among others:"
+msgstr ""
+"Το Shotwell υποστηρίζει επίσης αρχεία βίντεο σε οποιαδήποτε υποστηριζόμενη "
+"μορφή από τη βιβλιοθήκη πολυμέσων GStreamer στο σύστημα όπου εκτελείται το "
+"Shotwell. Αυτό περιλαμβάνει τυπικά τις παρακάτω μορφές μεταξύ άλλων:"
+
+#: C/formats.page:25(p)
+msgid "Container formats: Ogg, QuickTime, MP4, AVI."
+msgstr "Μορφές περιέκτη: Ogg, QuickTime, MP4, AVI."
+
+#: C/formats.page:26(p)
+msgid ""
+"Codecs: Theora, Quicktime, MPEG-4, Motion JPEG. <em>Note that some operating "
+"systems may not include all codecs listed here due to legal or licensing "
+"restrictions.</em>"
+msgstr ""
+"Κωδικοποιητές: Theora, Quicktime, MPEG-4, Motion JPEG. <em>Σημειώστε ότι "
+"κάποια λειτουργικά συστήματα μπορεί να μην περιλαμβάνουν όλους τους "
+"καταχωρισμένους κωδικοποιητές εδώ λόγω νομικών περιορισμών ή αδειοδότησης.</"
+"em>"
+
+#: C/formats.page:30(p)
+msgid ""
+"Shotwell supports both photos and videos, but for simplicity, this "
+"documentation uses just the term \"photos\" in most places. Many operations "
+"in Shotwell apply to both photos and videos, however. In particular, events, "
+"flagging, rating, tagging, and publishing work both for photos and for "
+"videos."
+msgstr ""
+"Το Shotwell υποστηρίζει και φωτογραφίες και βίντεο, αλλά για απλότητα, αυτή "
+"η τεκμηρίωση χρησιμοποιεί απλά τον όρο \"φωτογραφίες\" στις περισσότερες "
+"τοποθεσίες. Πολλές λειτουργίες στο Shotwell εφαρμόζονται και στις "
+"φωτογραφίες και στα βίντεο. Ειδικά, τα συμβάντα, η προσθήκη σημαίας, η "
+"αξιολόγηση, οι ετικέτες και η δημοσίευση δουλεύουν και για φωτογραφίες και "
+"για βίντεο."
+
+#: C/edit-undo.page:7(desc)
+msgid "Return a photo to its original, unedited form."
+msgstr "Επιστροφή μιας φωτογραφίας στην αρχική ανεπεξέργαστη μορφή."
+
+#: C/edit-undo.page:14(title)
+msgid "Undoing changes"
+msgstr "Αναίρεση αλλαγών"
+
+#: C/edit-undo.page:16(p)
+msgid ""
+"Because Shotwell is a non-destructive photo editor, you can undo any "
+"alterations you make to a photograph."
+msgstr ""
+"Επειδή το Shotwell είναι ένας μη καταστροφικός επεξεργαστής φωτογραφίας, "
+"μπορείτε να αναιρέσετε οποιεσδήποτε αλλαγές κάνετε σε μια φωτογραφία."
+
+#: C/edit-undo.page:18(p) C/edit-nondestructive.page:16(p)
+msgid ""
+"If you want to see what a photo looked like before your modifications, press "
+"the <key>Shift</key> key. The original photo will be displayed as long as "
+"you hold the key down."
+msgstr ""
+"Αν θέλετε να δείτε πώς ήταν μια φωτογραφία πριν τις τροποποιήσεις σας, "
+"πατήστε το πλήκτρο <key>Shift</key>. Η αρχική φωτογραφία θα εμφανιστεί όσο "
+"κρατάτε πατημένο το πλήκτρο."
+
+#: C/edit-undo.page:20(p)
+msgid ""
+"To completely undo all the changes you've made to a photo, click "
+"<guiseq><gui>Photos</gui><gui>Revert to Original</gui></guiseq>. The only "
+"exception is that time and date adjustments will not be reverted."
+msgstr ""
+"Για να αναιρέσετε πλήρως όλες τις αλλαγές που έχετε κάνει σε μια φωτογραφία, "
+"πατήστε <guiseq><gui>Φωτογραφίες</gui><gui>Επαναφορά στο αρχικό</gui></"
+"guiseq>. Η μόνη εξαίρεση είναι ότι οι ρυθμίσεις ώρας και ημερομηνίας δεν θα "
+"μετατραπούν."
+
+#: C/edit-time-date.page:7(desc)
+msgid "Change the time and date of photos if those details are incorrect."
+msgstr ""
+"Αλλάξτε την ώρα και την ημερομηνία των φωτογραφιών αν αυτές οι λεπτομέρειες "
+"είναι ανακριβείς."
+
+#: C/edit-time-date.page:12(title)
+msgid "Adjust the time and date of photos"
+msgstr "Ρύθμιση της ώρας και της ημερομηνίας των φωτογραφιών"
+
+#: C/edit-time-date.page:14(p)
+msgid ""
+"To adjust the time and date of photos, select the photos you would like to "
+"adjust, choose <guiseq><gui>Photos</gui><gui>Adjust Time and Date</gui></"
+"guiseq> and select a new time and date."
+msgstr ""
+"Για να ρυθμίσετε την ώρα και την ημερομηνία των φωτογραφιών, επιλέξτε τις "
+"φωτογραφίες που θα θέλατε να ρυθμίσετε, επιλέξτε <guiseq><gui>Φωτογραφίες</"
+"gui><gui>Ρύθμιση ώρας και ημερομηνίας</gui></guiseq> και επιλέξτε μια νέα "
+"ώρα και ημερομηνία."
+
+#: C/edit-time-date.page:16(p)
+msgid ""
+"If you are changing the date and time of multiple photos at once, you can "
+"choose to shift all the photos by the same amount of time or to set all the "
+"photos to the same time."
+msgstr ""
+"Αν αλλάζετε την ημερομηνία και την ώρα πολλών φωτογραφιών μονομιάς, μπορείτε "
+"να επιλέξετε να μετατοπίσετε όλες τις φωτογραφίες κατά τον ίδιο χρόνο ή να "
+"ορίσετε όλες τις φωτογραφίες στην ίδια ώρα."
+
+#: C/edit-time-date.page:18(p)
+msgid ""
+"By default, the time and date are only changed inside Shotwell. You can also "
+"choose to modify the time and date in the original file, but this cannot be "
+"undone once you exit Shotwell."
+msgstr ""
+"Από προεπιλογή, η ώρα και η ημερομηνία αλλάζουν μόνο μέσα στο Shotwell. "
+"Μπορείτε επίσης να επιλέξετε να τροποποιήσετε την ώρα και την ημερομηνία στο "
+"αρχικό αρχείο, αλλά αυτό δεν μπορεί να αναιρεθεί μόλις εξέλθετε από το "
+"Shotwell."
+
+#: C/edit-straighten.page:7(desc)
+msgid "Straighten a photo so that its horizon appears level."
+msgstr ""
+"Ευθυγράμμιση μιας φωτογραφίας έτσι ώστε ο ορίζοντας της να εμφανίζεται "
+"επίπεδος."
+
+#: C/edit-straighten.page:12(title)
+msgid "Straighten photos"
+msgstr "Ευθυγράμμιση φωτογραφιών"
+
+#: C/edit-straighten.page:14(p)
+msgid ""
+"The straighten tools allows photos to be leveled and straightened. The "
+"straighten tool is only available in full-window or fullscreen mode."
+msgstr ""
+"Τα εργαλεία ευθυγράμμισης επιτρέπουν την εξίσωση και ευθυγράμμιση των "
+"φωτογραφιών. Το εργαλείο ευθυγράμμισης είναι διαθέσιμο μόνο σε πλήρες "
+"παράθυρο ή σε κατάσταση πλήρους οθόνης."
+
+#: C/edit-straighten.page:18(p)
+msgid ""
+"Click <gui>Straighten</gui>. The straighten slider will appear. "
+"Alternatively, use the keyboard shortcut <keyseq><key>Ctrl</key><key>A</"
+"key></keyseq>."
+msgstr ""
+"Πατήστε <gui>Ευθυγράμμιση</gui>. Ο ολισθητής ευθυγράμμισης θα εμφανιστεί. "
+"Εναλλακτικά, χρησιμοποιήστε τη συντόμευση πληκτρολογίου <keyseq><key>Ctrl</"
+"key><key>A</key></keyseq>."
+
+#: C/edit-straighten.page:21(p)
+msgid "Drag the slider to achieve the desired degree of straightening."
+msgstr ""
+"Μεταφέρτε τον ολισθητή για να πετύχετε τον επιθυμητό βαθμό ευθυγράμμισης."
+
+#: C/edit-straighten.page:24(p)
+msgid "Press <gui>OK</gui> when finished."
+msgstr "Πατήστε <gui>Εντάξει</gui> όταν τελειώσετε."
+
+#: C/edit-rotate.page:7(desc)
+msgid ""
+"Click the <gui>Rotate</gui> button, or choose one of the commands in the "
+"<gui>Photo</gui> menu."
+msgstr ""
+"Πατήστε το πλήκτρο <gui>Περιστροφή</gui>, ή επιλέξτε μια από τις εντολές στο "
+"μενού <gui>Φωτογραφία</gui>."
+
+#: C/edit-rotate.page:12(title)
+msgid "Rotate or flip a photo"
+msgstr "Περιστροφή ή αναστροφή φωτογραφίας"
+
+#: C/edit-rotate.page:14(p)
+msgid ""
+"You can rotate your photos left and right (clockwise and counterclockwise) "
+"with the <gui>Rotate</gui> button on the toolbar of most views. You can also "
+"make a mirror image of any photo."
+msgstr ""
+"Μπορείτε να περιστρέψετε τις φωτογραφίες σας αριστερά και δεξιά (δεξιόστροφα "
+"και αριστερόστροφα) με το πλήκτρο <gui>Περιστροφή</gui> στην εργαλειοθήκη "
+"των περισσότερων προβολών. Μπορείτε επίσης να κάνετε μια κατοπτρική εικόνα "
+"κάθε φωτογραφίας."
+
+#: C/edit-rotate.page:16(p)
+msgid ""
+"To rotate right, click on the <gui>Rotate</gui> button. To rotate left, "
+"press and hold the <key>Ctrl</key> key and then click the button. Both "
+"commands are available in the <gui>Photos</gui> menu too. Alternatively, use "
+"the following keyboard shortcuts:"
+msgstr ""
+"Για να περιστρέψετε δεξιά, πατήστε το πλήκτρο <gui>Περιστροφή</gui>. Για να "
+"περιστρέψετε αριστερά, πατήστε και κρατήστε πατημένο το πλήκτρο <key>Ctrl</"
+"key> και έπειτα πατήστε το πλήκτρο. Και οι δυο εντολές είναι διαθέσιμες "
+"επίσης στο μενού <gui>Φωτογραφίες</gui>. Εναλλακτικά, χρησιμοποιήστε τις "
+"παρακάτω συντομεύσεις πληκτρολογίου:"
+
+#: C/edit-rotate.page:18(p)
+msgid ""
+"rotate left: <keyseq><key>Shift</key><key>Ctrl</key><key>R</key></keyseq> or "
+"<key>[</key>"
+msgstr ""
+"αριστερή περιστροφή: <keyseq><key>Shift</key><key>Ctrl</key><key>R</key></"
+"keyseq> ή <key>[</key>"
+
+#: C/edit-rotate.page:19(p)
+msgid ""
+"rotate right: <keyseq><key>Ctrl</key><key>R</key></keyseq> or <key>]</key>"
+msgstr ""
+"δεξιά περιστροφή: <keyseq><key>Ctrl</key><key>R</key></keyseq> ή <key>]</key>"
+
+#: C/edit-rotate.page:21(p)
+msgid ""
+"To create a mirror image of a photo, use the <gui>Flip Horizontally</gui> "
+"command in the <gui>Photos</gui> menu. To flip an image vertically, use the "
+"<gui>Flip Vertically</gui> command in the same menu."
+msgstr ""
+"Για να δημιουργήσετε μια κατοπτρική εικόνα μιας φωτογραφίας, χρησιμοποιήστε "
+"την εντολή <gui>Οριζόντια αναστροφή</gui> στο μενού <gui>Φωτογραφίες</gui>. "
+"Για να αναστρέψετε μια εικόνα κάθετα, χρησιμοποιήστε την εντολή <gui>Κάθετη "
+"αναστροφή</gui> στο ίδιο μενού."
+
+#: C/edit-rotate.page:24(p)
+msgid ""
+"If you select more than one image, you can rotate all of them at the same "
+"time."
+msgstr ""
+"Αν επιλέξετε περισσότερες από μία εικόνες, μπορείτε να τις περιστρέψετε όλες "
+"ταυτόχρονα."
+
+#: C/edit-redeye.page:7(desc)
+msgid ""
+"Correct photos where people have red eyes because of the camera's flash."
+msgstr ""
+"Διορθώστε τις φωτογραφίες όπου οι άνθρωποι έχουν κόκκινα μάτια λόγω της "
+"αναλαμπής της φωτογραφικής μηχανής."
+
+#: C/edit-redeye.page:12(title)
+msgid "Removing red-eye"
+msgstr "Αφαίρεση κόκκινου ματιού"
+
+#: C/edit-redeye.page:14(p)
+msgid ""
+"Red-eye occurs when the camera's flash reflects off the pupil of someone's "
+"eye. To eliminate this in a photo, use the Red-eye tool."
+msgstr ""
+"Το κόκκινο μάτι συμβαίνει όταν η αναλαμπή της φωτογραφικής μηχανής ανανακλά "
+"την κόρη του ματιού. Για να το εξουδετερώσετε αυτό σε μια φωτογραφία, "
+"χρησιμοποιήστε το εργαλείο κόκκινου ματιού."
+
+#: C/edit-redeye.page:17(p)
+msgid "Click <gui>Red-eye</gui>. A circle will appear on the photo."
+msgstr ""
+"Πατήστε <gui>Κόκκινο μάτι</gui>. Θα εμφανιστεί ένας κύκλος στη φωτογραφία."
+
+#: C/edit-redeye.page:20(p)
+msgid ""
+"Drag the circle over the affected pupil, adjust its size with the slider "
+"control, and press <gui>Apply</gui>. The redness will be removed."
+msgstr ""
+"Μεταφέρτε τον κύκλο πάνω από την επηρεαζόμενη κόρη, ρυθμίστε το μέγεθός της "
+"με το στοιχείο ελέγχου ολισθητή και πατήστε <gui>Εφαρμογή</gui>. Η "
+"ερυθρότητα θα αφαιρεθεί."
+
+#: C/edit-redeye.page:23(p)
+msgid ""
+"Repeat this process for all red pupils in your photo. Press <gui>Close</gui> "
+"when finished."
+msgstr ""
+"Επαναλάβετε αυτήν τη διεργασία για όλες τις κόκκινες κόρες στην φωτογραφία "
+"σας. Πατήστε <gui>κλείσιμο</gui> όταν τελειώσετε."
+
+#: C/edit-nondestructive.page:7(desc)
+msgid ""
+"Shotwell is a non-destructive photo editor - it does not modify your "
+"original photos."
+msgstr ""
+"Το Shotwell είναι ένας μη καταστροφικός επεξεργαστής φωτογραφίας - δεν "
+"τροποποιεί τις αρχικές σας φωτογραφίες."
+
+#: C/edit-nondestructive.page:12(title)
+msgid "What happens to the original when I edit a photo?"
+msgstr "Τι συμβαίνει στην αρχική φωτογραφία όταν επεξεργάζεται μια φωτογραφία;"
+
+#: C/edit-nondestructive.page:14(p)
+msgid ""
+"Shotwell is a non-destructive photo editor. It does not modify your original "
+"photographs. That is to say, if you crop a photo or adjust its colors, the "
+"photo file on disc remains untouched. Shotwell stores your edits in a "
+"database and applies them on the fly as necessary. This means you can undo "
+"any alterations you make to a photograph."
+msgstr ""
+"Το Shotwell είναι ένας μη καταστροφικός επεξεργαστής φωτογραφίας. Δεν "
+"τροποποιεί τις αρχικές σας φωτογραφίες. Δηλαδή, αν περικόψετε μια φωτογραφία "
+"ή ρυθμίσετε τα χρώματά της, το αρχείο φωτογραφίας στον δίσκο παραμένει "
+"ανέπαφο. Το Shotwell αποθηκεύει τις επεξεργασίες σας σε μια βάση δεδομένων "
+"και τις εφαρμόζει απευθείας όταν χρειάζεται. Αυτό σημαίνει ότι μπορείτε να "
+"αναιρέσετε οποιεσδήποτε αλλαγές κάνετε σε μια φωτογραφία."
+
+#: C/edit-nondestructive.page:18(p)
+msgid ""
+"Note that Shotwell can optionally write metadata (such as tags and titles) "
+"to photo files. For more information, see the section <link xref=\"other-"
+"files\">Photo files</link>."
+msgstr ""
+"Σημειώστε ότι το Shotwell μπορεί προαιρετικά να γράψει μεταδεδομένα (όπως "
+"ετικέτες και τίτλους) σε αρχεία φωτογραφίας. Για περισσότερες πληροφορίες, "
+"δείτε την ενότητα <link xref=\"other-files\">Αρχεία φωτογραφιών</link>."
+
+#: C/edit-external.page:7(desc)
+msgid "Use a different program to edit a photo."
+msgstr ""
+"Χρησιμοποιήστε ένα διαφορετικό πρόγραμμα για να επεξεργαστείτε μια "
+"φωτογραφία."
+
+#: C/edit-external.page:12(title)
+msgid "Edit photos with an external program"
+msgstr "Επεξεργασία φωτογραφιών με εξωτερικό πρόγραμμα"
+
+#: C/edit-external.page:16(p)
+msgid ""
+"You might want to use an external editor to do additional work on a photo. "
+"If installed, GIMP and UFRaw are the default external editors for photo and "
+"RAW editing, respectively. If these programs are not installed, you must "
+"select your preferred editors by choosing <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq> and selecting editors from drop-down "
+"menus of installed applications."
+msgstr ""
+"Μπορεί να θέλετε να χρησιμοποιήσετε έναν εξωτερικό επεξεργαστή για να κάνει "
+"επιπρόσθετη δουλειά σε μια φωτογραφία. Αν εγκατασταθεί, τα GIMP και UFRaw "
+"είναι οι προεπιλεγμένοι εξωτερικοί επεξεργαστές για φωτογραφίες και "
+"επεξεργασία RAW, αντίστοιχα. Αν αυτά τα προγράμματα δεν είναι εγκατεστημένα, "
+"πρέπει να επιλέξετε τους αγαπημένους σας επεξεργαστές επιλέγοντας "
+"<guiseq><gui>Επεξεργασία</gui><gui>Προτιμήσεις</gui></guiseq> και "
+"επιλέγοντας επεξεργαστές από τα πτυσσόμενα μενού των εγκατεστημένων "
+"εφαρμογών."
+
+#: C/edit-external.page:24(p)
+msgid ""
+"Once your editors have been set, select a photo and choose "
+"<guiseq><gui>Photos</gui><gui>Open With External Editor</gui></guiseq> to "
+"open the photo with the external editor. Likewise, if the original photo is "
+"a RAW file, select <guiseq><gui>Photos</gui><gui>Open With RAW Editor</gui></"
+"guiseq> to edit the RAW file directly with the set RAW editor."
+msgstr ""
+"Όταν έχουν οριστεί οι επεξεργαστές σας, επιλέξτε μια φωτογραφία και διαλέξτε "
+"<guiseq><gui>Φωτογραφίες</gui><gui>Άνοιγμα με εξωτερικό επεξεργαστή</gui></"
+"guiseq> για να ανοίξετε την φωτογραφία με εξωτερικό επεξεργαστή. Παρόμοια, "
+"αν η αρχική φωτογραφία είναι ένα αρχείο RAW, επιλέξτε "
+"<guiseq><gui>Φωτογραφίες</gui><gui>Άνοιγμα με επεξεργαστή RAW</gui></guiseq> "
+"για να επεξεργαστείτε το αρχείο RAW αμέσως με τον ορισμένο επεξεργαστή RAW."
+
+#: C/edit-external.page:31(p)
+msgid ""
+"When you complete your edits and save the file, Shotwell will detect the "
+"changes and update the photo. When external edits have been made, press and "
+"hold the <key>Shift</key> key in full-window view to show the original photo "
+"rather than the externally-edited one."
+msgstr ""
+"Όταν ολοκληρώσετε τις επεξεργασίες σας και αποθηκεύσετε το αρχείο, το "
+"Shotwell θα αναγνωρίσει τις αλλαγές και θα ενημερώσει τη φωτογραφία. Όταν "
+"έχουν γίνει εξωτερικές επεξεργασίες, πατήστε και κρατήστε πατημένο το "
+"πλήκτρο <key>Shift</key> σε προβολή πλήρους παραθύρου για να εμφανίσετε την "
+"αρχική φωτογραφία αντί για την εξωτερικά επεξεργασμένη."
+
+#: C/edit-external.page:38(p)
+msgid "Reverting to original will erase any external edits."
+msgstr "Η επαναφορά στην αρχική θα σβήσει κάθε εξωτερική επεξεργασία."
+
+#: C/edit-external.page:43(p)
+msgid ""
+"If you externally edit a RAW photo and save the result to another image, "
+"such as a JPEG or PNG, Shotwell cannot automatically determine that the "
+"original RAW and the new image should be paired."
+msgstr ""
+"Αν επεξεργαστείτε εξωτερικά μια φωτογραφία RAW και αποθηκεύσετε το "
+"αποτέλεσμα σε μια άλλη εικόνα, όπως JPEG ή PNG, το Shotwell δεν μπορεί να "
+"προσδιορίσει αυτόματα ότι η αρχική RAW και η νέα εικόνα πρέπει να συζευχθούν."
+
+#: C/edit-external.page:49(p)
+msgid ""
+"If you want to work within the resulting image within Shotwell, you'll need "
+"to import it yourself."
+msgstr ""
+"Αν θέλετε να δουλέψετε μέσα στην τελική εικόνα μες το Shotwell, θα "
+"χρειαστείτε να την εισάγετε οι ίδιοι."
+
+#: C/edit-enhance.page:7(desc)
+msgid ""
+"Let Shotwell improve the brightness and contrast of a photo automatically."
+msgstr ""
+"Αφήστε το Shotwell να βελτιώσει τη φωτεινότητα και την αντίθεση μιας "
+"φωτογραφίας αυτόματα."
+
+#: C/edit-enhance.page:14(title)
+msgid "Auto-enhance"
+msgstr "Αυτόματη βελτίωση"
+
+#: C/edit-enhance.page:16(p)
+msgid ""
+"Clicking on the <gui>Enhance</gui> button is a quick way to automatically "
+"adjust the brightness and contrast of your photo. It will often give you a "
+"photo that is correctly exposed. You can also use it as a starting point and "
+"then improve the adjustments by clicking on the <gui>Adjust</gui> button."
+msgstr ""
+"Πατώντας το πλήκτρο <gui>Βελτίωση</gui> είναι ένας γρήγορος τρόπος για "
+"αυτόματη ρύθμιση της φωτεινότητας και της αντίθεσης της φωτογραφίας σας. Θα "
+"σας δώσει συχνά μια φωτογραφία με τη σωστή έκθεση. Μπορείτε επίσης να την "
+"χρησιμοποιήσετε ως αρχικό σημείο και έπειτα να βελτιώσετε τις ρυθμίσεις "
+"πατώντας στο πλήκτρο <gui>Προσαρμογή</gui>."
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/edit-crop.page:42(None)
+msgid ""
+"@@image: 'figures/crop_thirds.jpg'; md5=4cf0a026bb812c7eab0c9db8210a9524"
+msgstr ""
+"@@image: 'figures/crop_thirds.jpg'· md5=4cf0a026bb812c7eab0c9db8210a9524"
+
+#: C/edit-crop.page:7(desc)
+msgid "Improve the composition of a photo by cutting out parts of it."
+msgstr "Βελτιώστε τη σύνθεση μιας φωτογραφίας περικόπτοντας τμήματά της."
+
+#: C/edit-crop.page:12(title)
+msgid "Cropping"
+msgstr "Περικοπή"
+
+#: C/edit-crop.page:14(p)
+msgid ""
+"To reduce the area of a photo and concentrate the viewer's attention on a "
+"smaller portion of it, use the Crop tool. The crop tool is only available in "
+"full-window or fullscreen mode."
+msgstr ""
+"Για να μειώσετε την περιοχή μιας φωτογραφίας και να συγκεντρώσετε την "
+"προσοχή του θεατή σε ένα μικρότερο τμήμα της, χρησιμοποιήστε το εργαλείο "
+"περικοπής. Το εργαλείο περικοπής είναι διαθέσιμο μόνο σε πλήρες παράθυρο ή "
+"κατάσταση πλήρους οθόνης."
+
+#: C/edit-crop.page:19(p)
+msgid ""
+"Double-click on a photo to enter full-window mode, then press the <gui>Crop</"
+"gui> button on the toolbar."
+msgstr ""
+"Διπλοπατήστε μια φωτογραφία για να μπείτε στην κατάσταση πλήρους παραθύρου, "
+"έπειτα πατήστε το πλήκτρο <gui>Περικοπή</gui> στην εργαλειοθήκη."
+
+#: C/edit-crop.page:22(p)
+msgid ""
+"A white box, the crop rectangle, will appear over the photo. The lighter "
+"portion of the photo within the crop rectangle represents what the photo "
+"will look like when you crop it."
+msgstr ""
+"Ένα λευκό πλαίσιο, το ορθογώνιο περικοπής, θα εμφανιστεί πάνω από τη "
+"φωτογραφία. Το πιο φωτεινό τμήμα της φωτογραφίας μέσα στο ορθογώνιο "
+"περικοπής απεικονίζει πώς θα μοιάζει η φωτογραφία όταν την περικόψετε."
+
+#: C/edit-crop.page:25(p)
+msgid ""
+"If you place your cursor in the middle of the box, you can move the box "
+"around. If you drag the edges of the box, you can adjust its size. As you "
+"move and adjust the crop box, you'll see four lines appear inside it, like a "
+"tic-tac-toe grid. These are <em>rule of thirds</em> lines."
+msgstr ""
+"Αν τοποθετήσετε τον δρομέα σας στη μέση του πλαισίου, μπορείτε να "
+"μετακινήσετε το πλαίσιο ολόγυρα. Αν σύρετε τις άκρες του πλαισίου, μπορείτε "
+"να ρυθμίσετε το μέγεθός της. Καθώς μετακινείτε και ρυθμίζετε το πλαίσιο "
+"περικοπής, θα δείτε τέσσερις γραμμές να εμφανίζονται μέσα της, όπως ένα "
+"πλέγμα τρίλιζας. Αυτές είναι γραμμές του <em>κανόνα των τρίτων</em>."
+
+#: C/edit-crop.page:26(p)
+msgid ""
+"You can also constrain the crop box to one of many common sizes. Choose a "
+"size from the drop-down list that suits your needs. If you press the flip "
+"button next to it, the orientation of the constraint will switch (from "
+"landscape to portrait)."
+msgstr ""
+"Μπορείτε επίσης να περιορίσετε το πλαίσιο περικοπής σε ένα από τα πολλά "
+"συνηθισμένα μεγέθη. Επιλέξτε ένα μέγεθος από τον πτυσσόμενο κατάλογο που "
+"ταιριάζει τις ανάγκες σας. Αν πατήσετε το κουμπί αναστροφής δίπλα του, ο "
+"προσανατολισμός του περιορισμού θα αλλάξει (από οριζόντιο σε κάθετο)."
+
+#: C/edit-crop.page:29(p)
+msgid ""
+"When you're happy with your crop outline, press the <gui>Apply</gui> button. "
+"Shotwell will display the cropped photo."
+msgstr ""
+"Όταν είσαστε ικανοποιημένοι με το περίγραμμα περικοπής σας, πατήστε το "
+"πλήκτρο <gui>Εφαρμογή</gui>. Το Shotwell θα εμφανίσει την περικομμένη "
+"φωτογραφία."
+
+#: C/edit-crop.page:32(p)
+msgid ""
+"If you change your mind, press the <gui>Crop</gui> button again and fine-"
+"tune the crop."
+msgstr ""
+"Αν αλλάξετε γνώμη, πατήστε το πλήκτρο <gui>Περικοπή</gui> ξανά και "
+"μικρορυθμίστε την περικοπή."
+
+#: C/edit-crop.page:33(p)
+msgid ""
+"If you press <gui>Cancel</gui> rather than <gui>Apply</gui>, Shotwell will "
+"return to the photo's previous crop dimensions."
+msgstr ""
+"Αν πατήσετε <gui>Άκυρο</gui> αντί για <gui>Εφαρμογή</gui>, το Shotwell θα "
+"επιστρέψει στις διαστάσεις πριν την περικοπή της φωτογραφίας."
+
+#: C/edit-crop.page:38(title)
+msgid "What is the rule of thirds?"
+msgstr "Τι είναι ο κανόνας των τρίτων;"
+
+#: C/edit-crop.page:39(p)
+msgid ""
+"The <em>rule of thirds</em> helps you to choose a pleasing composition for a "
+"photo."
+msgstr ""
+"Ο <em>κανόνας των τρίτων</em> σας βοηθά να επιλέξετε μια καλύτερη σύνθεση "
+"για μια φωτογραφία."
+
+#: C/edit-crop.page:40(p)
+msgid ""
+"Imagine that the scene is divided up into a 3x3 grid by two equally-spaced "
+"vertical lines and two equally-spaced horizontal lines. According to the "
+"rule, you're more likely to get a pleasing composition if you align major "
+"features (like the horizon, or a person's body) with one of the lines. "
+"Paying attention to the way features flow from one part of the grid to "
+"another can also help."
+msgstr ""
+"Θεωρήστε ότι η σκηνή διαιρείται σε ένα πλέγμα 3x3 από δύο ισαπέχουσες "
+"κάθετες γραμμές και δύο ισαπέχουσες οριζόντιες γραμμές. Σύμφωνα με τον "
+"κανόνα, είναι πιο πιθανό να πάρετε μια καλύτερη σύνθεση αν στοιχίσετε τα "
+"μεγάλα γνωρίσματα (όπως τον ορίζοντα, ή το σώμα του ατόμου) με μια από αυτές "
+"τις γραμμές. Προσέχοντας τον τρόπο που τα γνωρίσματα ρέουν από το ένα μέρος "
+"του πλέγματος στο άλλο μπορεί επίσης να βοηθήσει."
+
+#: C/edit-crop.page:41(p)
+msgid ""
+"Cropping a photo so that it conforms to the rule of thirds often results in "
+"a more visually appealing image."
+msgstr ""
+"Η περικοπή μιας φωτογραφίας έτσι ώστε να συμφωνεί με τον κανόνα των τρίτων "
+"καταλήγει συχνά σε μια περισσότερο ελκυστική οπτικά εικόνα."
+
+#: C/edit-crop.page:43(p)
+msgid ""
+"Cropping a photo, using the \"rule of thirds\" lines to improve the "
+"composition."
+msgstr ""
+"Περικοπή μιας φωτογραφίας, χρησιμοποιώντας τον \"κανόνα των τρίτων\" για να "
+"βελτιώσετε τη σύνθεση."
+
+#: C/edit-adjustments.page:7(desc)
+msgid "Change the exposure, saturation, tint, and shadows of a photo."
+msgstr ""
+"Αλλαγή της έκθεσης, του κορεσμού, της απόχρωσης και των σκιών μιας "
+"φωτογραφίας."
+
+#: C/edit-adjustments.page:12(title)
+msgid "Color adjustments"
+msgstr "Προσαρμογές χρώματος"
+
+#: C/edit-adjustments.page:14(p)
+msgid ""
+"The <gui>Adjust</gui> button opens a floating window with a histogram and "
+"sliders to adjust a photo's exposure, saturation, tint, temperature, and "
+"shadows. The histogram also has sliders to reduce the upper and lower "
+"intensity thresholds of the photograph, expanding the contrast of the middle "
+"range."
+msgstr ""
+"Το πλήκτρο <gui>Ρύθμιση</gui> ανοίγει ένα αιωρούμενο παράθυρο με ένα "
+"ιστόγραμμα και ολισθητές για να ρυθμίσουν την έκθεση, τον κορεσμό, την "
+"απόχρωση, τη θερμοκρασία και τις σκιές μιας φωτογραφίας. Το ιστόγραμμα "
+"επίσης έχει ολισθητές που μειώνουν τα πάνω και κάτω κατώφλια έντασης της "
+"φωτογραφίας, επεκτείνοντας την αντίθεση της μεσαίας περιοχής."
+
+#: C/edit-adjustments.page:16(p)
+msgid ""
+"The <gui>Enhance</gui> button adjusts the histogram and shadows sliders to "
+"improve the quality of a photo."
+msgstr ""
+"Το πλήκτρο <gui>Βελτίωση</gui> ρυθμίζει το ιστόγραμμα και τους ολισθητές "
+"σκιών για να βελτιώσουν την ποιότητα μιας φωτογραφίας."
+
+#: C/edit-adjustments.page:18(p)
+msgid ""
+"When the photo's colors and contrast are to your liking, press <gui>Apply</"
+"gui> to save the changes. <gui>Reset</gui> will return the image to its "
+"original state. <gui>Cancel</gui> discards all changes you've made."
+msgstr ""
+"Όταν τα χρώματα και η αντίθεση της φωτογραφίας σας αρέσουν, πατήστε "
+"<gui>Εφαρμογή</gui> για να αποθηκεύσετε τις αλλαγές. Η <gui>Επαναφορά</gui> "
+"θα επιστρέψει την εικόνα στην αρχική της κατάσταση. Το <gui>Άκυρο</gui> "
+"απορρίπτει όλες τις αλλαγές που έχετε κάνει."
+
+#: C/edit-adjustments.page:21(title)
+msgid "What do the color adjustments do?"
+msgstr "Τι κάνουν οι ρυθμίσεις χρώματος;"
+
+#: C/edit-adjustments.page:24(title)
+msgid "Exposure"
+msgstr "Έκθεση"
+
+#: C/edit-adjustments.page:25(p)
+msgid ""
+"Changes the brightness to make it look like the photo was exposed for a "
+"longer or shorter time. Use this to correct under- or over-exposed photos."
+msgstr ""
+"Αλλάζει τη φωτεινότητα κάνοντας τη φωτογραφία να φαίνεται ότι εκτέθηκε για "
+"μεγαλύτερο ή λιγότερο χρόνο. Χρησιμοποιήστε το για να διορθώσετε "
+"υποεκτεθειμένες ή υπερεκτεθειμένες φωτογραφίες."
+
+#: C/edit-adjustments.page:28(title)
+msgid "Saturation"
+msgstr "Κορεσμός"
+
+#: C/edit-adjustments.page:29(p)
+msgid ""
+"Changes how vivid colors look. If your photo looks gray and washed out, try "
+"increasing the saturation. If colors look too bold, try decreasing it."
+msgstr ""
+"Αλλάζει τη ζωηρότητα των χρωμάτων. Αν η φωτογραφία φαίνεται γκρίζα και "
+"ξεθωριασμένη, δοκιμάστε να αυξήσετε τον κορεσμό. Αν τα χρώματα φαίνονται "
+"υπερβολικά έντονα, δοκιμάστε να τον μειώσετε."
+
+#: C/edit-adjustments.page:32(title)
+msgid "Tint"
+msgstr "Απόχρωση"
+
+#: C/edit-adjustments.page:33(p)
+msgid ""
+"This tints the photo with a color. It's useful for correcting photos taken "
+"with the wrong white balance setting, which typically have an unnatural "
+"color cast. For example, photos taken outdoors with the white balance set to "
+"\"Tungsten\" may have a blue cast."
+msgstr ""
+"Αυτό χρωματίζει τη φωτογραφία με ένα χρώμα. Είναι χρήσιμη για διόρθωση "
+"φωτογραφιών που ελήφθησαν με εσφαλμένη ρύθμιση ισορροπίας λευκού, που τυπικά "
+"έχει μια αφύσικη απόχρωση χρώματος. Για παράδειγμα, οι φωτογραφίες που "
+"ελήφθησαν υπαίθρια με την λευκή ισορροπία ορισμένη σε \"βολφράμιο\" μπορεί "
+"να έχουν μια γαλάζια απόχρωση."
+
+#: C/edit-adjustments.page:36(title)
+msgid "Temperature"
+msgstr "Θερμοκρασία"
+
+#: C/edit-adjustments.page:37(p)
+msgid ""
+"Changes how \"warm\" or \"cool\" the picture looks. Use this to make cold, "
+"depressing scenes look more lively, for example."
+msgstr ""
+"Αλλάζει το πόσο \"θερμή\" ή \"κρύα\" φαίνεται η εικόνα. Χρησιμοποιήστε το "
+"για να κάνετε κρύα μειώνοντας τις σκηνές που φαίνονται πιο ζωντανές, για "
+"παράδειγμα."
+
+#: C/edit-adjustments.page:40(title)
+msgid "Shadows"
+msgstr "Σκιές"
+
+#: C/edit-adjustments.page:41(p)
+msgid ""
+"This makes shadowy areas appear lighter. Use this to make detail more "
+"visible if it's obscured by the darkness of a shadow."
+msgstr ""
+"Αυτό κάνει σκιώδεις περιοχές να φαίνονται πιο ανοικτές. Χρησιμοποιήστε το "
+"για να κάνετε την λεπτομέρεια πιο ορατή αν καλύπτεται από τη σκοτεινότητα "
+"μιας σκιάς."
+
+#: C/edit-adjustments.page:44(title)
+msgid "Intensity Threshold (sliders on the histogram)"
+msgstr "Κατώφλι έντασης (ολισθητές στο ιστόγραμμα)"
+
+#: C/edit-adjustments.page:45(p)
+msgid ""
+"These sliders change how light the brightest white is and how dark the "
+"darkest black is. Use them to change the contrast of the photo. Photos which "
+"look washed out should particularly benefit from changing these settings."
+msgstr ""
+"Αυτοί οι ολισθητές αλλάζουν το πόσο ανοικτό είναι το πιο φωτεινό λευκό και "
+"πόσο σκούρο το πιο σκοτεινό μαύρο. Χρησιμοποιήστε τα για να αλλάξετε την "
+"αντίθεση της φωτογραφίας. Οι φωτογραφίες που φαίνονται ξεθωριασμένες πρέπει "
+"να επωφελούνται ιδιαίτερα από την αλλαγή αυτών των ρυθμίσεων."
+
+#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
+#: C/edit-adjustments.page:0(None)
+msgid "translator-credits"
+msgstr "Δημήτρης Σπίγγος <dmtrs32@gmail.com>, 2014"
diff --git a/help/es/es.po b/help/es/es.po
new file mode 100644
index 0000000..5bf7ae7
--- /dev/null
+++ b/help/es/es.po
@@ -0,0 +1,2203 @@
+# Spanish translation for shotwell.
+# Copyright (C) 2014 shotwell's COPYRIGHT HOLDER
+# This file is distributed under the same license as the shotwell package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell master\n"
+"POT-Creation-Date: 2014-01-16 09:35+0000\n"
+"PO-Revision-Date: 2014-03-14 18:01+0100\n"
+"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
+"Language-Team: Español <gnome-es-list@gnome.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"X-Generator: Gtranslator 2.91.5\n"
+
+#: C/view-sidebar.page:7(desc)
+msgid ""
+"The sidebar on the left of the window lists various views of your library."
+msgstr ""
+
+#: C/view-sidebar.page:21(title)
+msgid "The sidebar"
+msgstr "La barra lateral"
+
+#: C/view-sidebar.page:23(p)
+msgid ""
+"The sidebar on the left side of the Shotwell window lists various views of "
+"your library. Although you may see the same photo in multiple views, it's "
+"only stored once on your hard drive."
+msgstr ""
+
+#: C/view-sidebar.page:25(p)
+msgid ""
+"The <gui>Last Import</gui> view lists your last imported photos no matter if "
+"they are imported from F-Spot, your camera, a memory card or the hard disk."
+msgstr ""
+
+#: C/view-sidebar.page:27(p)
+msgid "The <gui>Flagged</gui> lists all photos you had previous flagged."
+msgstr ""
+
+#: C/view-sidebar.page:29(p)
+msgid ""
+"The <gui>Saved Search</gui> allows you to sort your library by many criteria."
+msgstr ""
+
+#: C/view-sidebar.page:31(p)
+msgid ""
+"The <gui>Events</gui> folder lists all events in your library. An event is a "
+"group of photos that were taken at approximately the same time."
+msgstr ""
+
+#: C/view-sidebar.page:33(p)
+msgid ""
+"The <gui>Tags</gui> folder lists all tags you've assigned to photos. Photos "
+"can have multiple tags attached to them. When you click on the name of a tag "
+"in the sidebar, you will see all the photos associated with that tag."
+msgstr ""
+
+#: C/view-information.page:7(desc)
+msgid ""
+"View more detailed information about photos, like the exposure mode used by "
+"the camera."
+msgstr ""
+
+#: C/view-information.page:12(title)
+msgid "Basic and extended information"
+msgstr "Información básica y extendida"
+
+#: C/view-information.page:14(p)
+msgid ""
+"The Basic Information pane appears at the bottom of the sidebar, and "
+"displays a brief summary of the photos you've selected. If no photos are "
+"selected, it displays a summary of the entire collection. You can toggle the "
+"display of this pane using the <guiseq><gui>View</gui><gui>Basic "
+"Information</gui></guiseq> command."
+msgstr ""
+
+#: C/view-information.page:16(p)
+msgid ""
+"The floating Extended Information window displays more information about the "
+"selected photo. The <guiseq><gui>View</gui><gui>Extended Information</gui></"
+"guiseq> command or <keyseq><key>Ctrl</key><key>Shift</key><key>X</key></"
+"keyseq> toggles the display of this window."
+msgstr ""
+
+#: C/view-displaying.page:7(desc)
+msgid ""
+"Learn about different ways of viewing your photos: in a grid, filling the "
+"main window, or filling the whole screen."
+msgstr ""
+
+#: C/view-displaying.page:12(title)
+msgid "Photo views"
+msgstr ""
+
+#: C/view-displaying.page:14(p)
+msgid ""
+"When you select any collection in the sidebar, Shotwell displays all photos "
+"in the collection in the main window area. At the bottom right is a slider "
+"which adjusts the viewing size of the thumbnails. You may also adjust the "
+"thumbnail size using the plus and minus keys (<key>+</key> and <key>-</key>) "
+"or by pressing <key>Ctrl</key> while moving your mouse scroll wheel."
+msgstr ""
+
+#: C/view-displaying.page:16(p)
+msgid ""
+"You can view a photo full-window by double-clicking on it. From there you "
+"may move to other photos in the collection with the Back and Forward "
+"buttons. To return to the collection, double-click on the photo or press "
+"<key>Esc</key>."
+msgstr ""
+
+#: C/view-displaying.page:18(p)
+msgid ""
+"When viewing a photo in full-window mode, the slider on the toolbar controls "
+"zoom. You can pan around by grabbing and dragging anywhere on the photo. You "
+"can also zoom using your scroll wheel or by pressing the following keyboard "
+"shortcuts: <keyseq><key>Ctrl</key>0</keyseq> for the full image, "
+"<keyseq><key>Ctrl</key>1</keyseq> for 100% (1 photo pixel = 1 screen pixel), "
+"and <keyseq><key>Ctrl</key>2</keyseq> for 200% (1 photo pixel = 2x2 screen "
+"pixels)."
+msgstr ""
+
+#: C/view-displaying.page:20(p)
+msgid ""
+"Shotwell offers a fullscreen mode to display photos. Choose "
+"<guiseq><gui>View</gui><gui>Fullscreen</gui></guiseq> or press <key>F11</"
+"key>. To see the fullscreen toolbar, move your mouse to the bottom of the "
+"screen. The toolbar offers buttons to move through the collection, to pin "
+"the toolbar down (so it isn't hidden when you move the mouse away), and to "
+"leave fullscreen view."
+msgstr ""
+
+#: C/view-displaying.page:23(title)
+msgid "Viewing videos"
+msgstr "Ver vídeos"
+
+#: C/view-displaying.page:24(p)
+msgid ""
+"When you double-click a video, Shotwell will launch an external video player "
+"to play the video. It's not currently possible to display a video in full-"
+"window mode in Shotwell or to play the video within Shotwell itself."
+msgstr ""
+
+#: C/share-upload.page:7(desc)
+msgid "Publish photos to Facebook, Flickr, Picasa Web Albums, or other sites."
+msgstr ""
+
+#: C/share-upload.page:12(title)
+msgid "Publishing to the Web"
+msgstr "Publicar en la web"
+
+#: C/share-upload.page:14(p)
+msgid ""
+"Through the use of <link xref=\"other-plugins\">plugins</link>, Shotwell can "
+"publish photos and videos to the following services, each of which requires "
+"an account:"
+msgstr ""
+
+#: C/share-upload.page:18(link)
+msgid "Facebook"
+msgstr "Facebook"
+
+#: C/share-upload.page:19(link)
+msgid "Flickr"
+msgstr "Flickr"
+
+#: C/share-upload.page:20(p)
+msgid ""
+"<link href=\"http://picasaweb.google.com\">Picasa Web Albums</link> and "
+"<link href=\"http://plus.google.com\">Google+</link>"
+msgstr ""
+"<link href=\"http://picasaweb.google.com\">Álbumes de Picasa Web</link> y "
+"<link href=\"http://plus.google.com\">Google+</link>"
+
+#: C/share-upload.page:21(p)
+msgid "<link href=\"http://youtube.com\">YouTube</link> (videos only)"
+msgstr "<link href=\"http://youtube.com\">YouTube</link> (sólo vídeos)"
+
+#: C/share-upload.page:22(p)
+msgid ""
+"<link href=\"http://fotki.yandex.ru\">Yandex.Fotki</link>, a photo site "
+"popular in Russia (photos only)"
+msgstr ""
+
+#: C/share-upload.page:23(p)
+msgid ""
+"Any site running the <link href=\"http://piwigo.org\">Piwigo</link> photo "
+"gallery software (photos only)"
+msgstr ""
+
+#: C/share-upload.page:26(p)
+msgid ""
+"To publish selected photos in a collection, choose <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq> and click on the <gui>Plugins</gui> tab "
+"to enable the plugin for the service you want to publish to. Next, choose, "
+"<guiseq><gui>File</gui><gui>Publish</gui></guiseq>, press the <gui>Publish</"
+"gui> toolbar button or use <keyseq><key>Ctrl</key><key>P</key></keyseq>. You "
+"will see a dialog that lets you select a publishing service. You will then "
+"need to log in or create an account."
+msgstr ""
+
+#: C/share-upload.page:31(p)
+msgid ""
+"Publishing to Facebook requires you to grant certain permissions to the "
+"Shotwell Connect Facebook application. You only need to grant these "
+"permissions once, when you first associate Shotwell Connect with your "
+"Facebook account."
+msgstr ""
+
+#: C/share-upload.page:35(p)
+msgid ""
+"Similarly, publishing to Flickr requires you to log in and permit Shotwell "
+"Connect to access your account."
+msgstr ""
+
+#: C/share-upload.page:37(p)
+msgid ""
+"If you have a Google account, but have not yet used Picasa Web Albums, you "
+"will need to log in to Picasa using a browser once before you can publish to "
+"this service."
+msgstr ""
+
+#: C/share-slideshow.page:7(desc)
+msgid "Watch a slideshow of your photos."
+msgstr "Ver sus fotos como diapositivas."
+
+#: C/share-slideshow.page:12(title)
+msgid "Slideshows"
+msgstr "Diapositivas"
+
+#: C/share-slideshow.page:14(p)
+msgid ""
+"To see a sideshow of any collection in Shotwell, navigate to that collection "
+"and select <guiseq><gui>View</gui><gui>Slideshow</gui></guiseq> or press "
+"<key>F5</key>."
+msgstr ""
+
+#: C/share-slideshow.page:16(p)
+msgid "You can change some settings in a running slideshow:"
+msgstr ""
+
+#: C/share-slideshow.page:19(p)
+msgid "The duration how long an image should be shown: 1 - 30 seconds"
+msgstr ""
+
+#: C/share-slideshow.page:20(p)
+msgid "You can select different transition effects."
+msgstr "Puede seleccionar diferentes efectos de transición."
+
+#: C/share-slideshow.page:21(p)
+msgid "The time for each transition effect: 0.1 - 1.0 seconds"
+msgstr "El tiempo para cada efecto de transición: 0.1 - 1.0 segundos"
+
+#: C/share-send.page:7(desc)
+msgid "Send photos via email, instant messaging or in other ways."
+msgstr "Enviar fotos por correo-e, mensajería instantánea u otras maneras."
+
+#: C/share-send.page:12(title)
+msgid "Sending photos"
+msgstr "Enviar fotos"
+
+#: C/share-send.page:14(p)
+msgid ""
+"Shotwell can send photos using the GNOME desktop's Send To mechanism, which "
+"lets you send photos via email, instant messaging or in other ways."
+msgstr ""
+
+#: C/share-send.page:16(p)
+msgid ""
+"To send photos, select them in Shotwell and choose <guiseq><gui>File</"
+"gui><gui>Send To...</gui></guiseq>, or right-click the photos and choose "
+"<gui>Send To...</gui> from the context menu. A <gui>Send To</gui> dialog box "
+"will appear which lets you choose a mechanism for sending the files (such as "
+"email or instant messaging) and a destination. You can optionally choose to "
+"send the files in a compressed format."
+msgstr ""
+
+#: C/share-print.page:7(desc)
+msgid ""
+"Click <guiseq><gui>File</gui><gui>Print</gui></guiseq>. For more printing "
+"options, select the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog."
+msgstr ""
+
+#: C/share-print.page:12(title)
+msgid "Printing"
+msgstr "Imprimir"
+
+#: C/share-print.page:14(p)
+msgid ""
+"To print a photo, select it and choose <guiseq><gui>File</gui><gui>Print</"
+"gui></guiseq>."
+msgstr ""
+"Para imprimir una foto, selecciónela y elija <guiseq><gui>Archivo</"
+"gui><gui>Imprimir</gui></guiseq>."
+
+#: C/share-print.page:16(p)
+msgid ""
+"Shotwell can also print multiple images in one page; to do this, select "
+"multiple images, choose <guiseq><gui>File</gui><gui>Print</gui></guiseq>, "
+"and in the <gui>Print</gui> dialog, choose the <gui>Image Settings</gui> "
+"tab. In <gui>Image Settings</gui>, choose one of the multiple-image-per-page "
+"options under <gui>Autosize</gui>."
+msgstr ""
+
+#: C/share-print.page:23(p)
+msgid ""
+"If you would like to set formatting, paper size, and orientation options, "
+"choose the <gui>Page Setup</gui> tab in the <gui>Print</gui> dialog prior to "
+"printing."
+msgstr ""
+
+#: C/share-export.page:7(desc)
+msgid "Copy photos out of Shotwell so you can put them somewhere else."
+msgstr ""
+
+#: C/share-export.page:12(title)
+msgid "Exporting photos"
+msgstr "Exportar fotos"
+
+#: C/share-export.page:14(p)
+msgid ""
+"To export photos from Shotwell via drag and drop, drag the photos from "
+"Shotwell onto a file manager window or your desktop. The new files will be "
+"full-sized copies of the photos in your library."
+msgstr ""
+
+#: C/share-export.page:18(p)
+msgid ""
+"Alternatively, select a set of photos and choose the <guiseq><gui>File</"
+"gui><gui>Export</gui></guiseq> command or press <keyseq><key>Shift</"
+"key><key>Ctrl</key><key>E</key></keyseq>, which exports photos while letting "
+"you fine-tune the size and dimensions of your photo files. A window will "
+"appear allowing you to make several choices:"
+msgstr ""
+
+#: C/share-export.page:24(p)
+msgid "A format for export."
+msgstr ""
+
+#: C/share-export.page:27(p)
+msgid ""
+"Choose <gui>Unmodified</gui> to export photos in their original format "
+"without any edits made in Shotwell. RAW photos will be exported in their "
+"original RAW format."
+msgstr ""
+
+#: C/share-export.page:29(p)
+msgid ""
+"Choose <gui>Current</gui> to export photos including edits made in Shotwell. "
+"RAW photos will be exported in JPEG format if you have edited them in "
+"Shotwell, and otherwise in their original RAW format."
+msgstr ""
+
+#: C/share-export.page:31(p)
+msgid ""
+"Or you can choose a particular image format (JPEG, PNG, TIFF, BMP) to be "
+"used for exporting. Any edits made in Shotwell will be included, and "
+"Shotwell will convert photos to the destination format."
+msgstr ""
+
+#: C/share-export.page:37(p)
+msgid "The image quality for exporting (Low, Medium, High, or Maximum)."
+msgstr ""
+
+#: C/share-export.page:38(p)
+msgid ""
+"A scaling constraint (which means how Shotwell will decide to scale the "
+"photos down), and the desired pixel size."
+msgstr ""
+
+#: C/share-export.page:39(p)
+msgid ""
+"The option whether you like to export metadatas such as tags or ratings. "
+"This can help to save your privacy if you have geolocation tags or tags "
+"which shouldn't be seen by anyone."
+msgstr ""
+
+#: C/share-export.page:42(p)
+msgid ""
+"If selected, Shotwell will write tags, titles, and other metadata to the new "
+"files."
+msgstr ""
+
+#: C/share-background.page:7(desc)
+msgid ""
+"Set your desktop background to a single photo or to a slideshow of photos."
+msgstr ""
+
+#: C/share-background.page:12(title)
+msgid "Set a desktop background or slideshow"
+msgstr ""
+
+#: C/share-background.page:14(p)
+msgid ""
+"To set a single photo as your desktop background, select the photo and "
+"choose <guiseq><gui>File</gui><gui>Set as Desktop Background</gui></guiseq>."
+msgstr ""
+
+#: C/share-background.page:16(p)
+msgid ""
+"You can also set your background to a slideshow of photos. To do this, "
+"select the photos for the slideshow and choose <guiseq><gui>File</"
+"gui><gui>Set as Desktop Slideshow</gui></guiseq>. Shotwell will prompt you "
+"for a slideshow delay, which can be any interval up to one day in length. "
+"The background slideshow will proceed even when Shotwell is not running."
+msgstr ""
+
+#: C/running.page:7(desc)
+msgid ""
+"Find Shotwell in the Applications menu, or have it start automatically when "
+"you plug in a camera."
+msgstr ""
+
+#: C/running.page:14(title)
+msgid "Running Shotwell"
+msgstr "Ejecutar Shotwell"
+
+#: C/running.page:16(p)
+msgid ""
+"Once installed, Shotwell is available in your <gui>Applications</gui> menu "
+"under <gui>Graphics</gui> or <gui>Photography</gui>."
+msgstr ""
+
+#: C/running.page:18(p)
+msgid ""
+"Shotwell may also be executed automatically when a camera is plugged in to "
+"your computer. To check that your system is set up to run Shotwell when a "
+"camera is detected, go to <guiseq><gui>Edit</gui><gui>Preferences</gui></"
+"guiseq> in any Nautilus (file browser) window and choose the <gui>Media</"
+"gui> tab.  You'll see a dropdown box entitled <gui>Photos:</gui> which lets "
+"you choose Shotwell as your photo handling application."
+msgstr ""
+
+#: C/running.page:25(p)
+msgid ""
+"Shotwell may also be executed directly from its build directory, although "
+"this is only recommended for testing out Shotwell or for developers."
+msgstr ""
+
+#: C/raw.page:7(desc)
+msgid "More about RAW support in Shotwell."
+msgstr ""
+
+#: C/raw.page:12(title)
+msgid "RAW support in Shotwell"
+msgstr "Soporte de RAW en Shotwell"
+
+#: C/raw.page:13(p)
+msgid ""
+"Some cameras have the ability to store data directly off the sensor and into "
+"a file that contains extra color information; this is commonly referred to "
+"as 'RAW' or 'camera RAW', and Shotwell supports these files as well."
+msgstr ""
+
+#: C/raw.page:18(p)
+msgid ""
+"Since RAW photographs normally cannot be displayed directly, but must be "
+"first developed - that is, have their extra information interpreted and "
+"readied for displaying - most cameras will either embed a JPEG inside a RAW-"
+"format file, or produce a JPEG alongside the RAW file at the time the "
+"snapshot is taken. The latter is referred to throughout this document as RAW"
+"+JPEG. If you import a RAW+JPEG pair, Shotwell will keep them paired and "
+"treat them as one item in your library."
+msgstr ""
+
+#: C/raw.page:27(p)
+msgid ""
+"When you import a RAW file, you can choose to either use the camera's "
+"internally-developed JPEG or Shotwell's by selecting <guiseq><gui>Photos</"
+"gui><gui>Developer</gui></guiseq> in the menus."
+msgstr ""
+
+#: C/raw.page:33(p)
+msgid ""
+"Changing between developers will cause all edits made to a photograph to be "
+"discarded."
+msgstr ""
+
+#: C/raw.page:39(p)
+msgid ""
+"In order to publish or use a RAW photograph in most other software, it has "
+"to be exported first. Shotwell can export your RAW photos in JPEG, PNG, TIFF "
+"or BMP format, and, when publishing, will internally export a JPEG version "
+"for you and publish that."
+msgstr ""
+
+#: C/other-plugins.page:7(desc)
+msgid "Extend Shotwell's functionality dynamically."
+msgstr ""
+
+#: C/other-plugins.page:12(title)
+msgid "Plugins"
+msgstr "Complementos"
+
+#: C/other-plugins.page:13(p)
+msgid ""
+"Shotwell can be used with <em>plugins</em>, which are companion shared "
+"libraries that can add support for new publishing destinations or new "
+"slideshow transitions."
+msgstr ""
+
+#: C/other-plugins.page:18(p)
+msgid ""
+"To see a list of installed plugins, choose <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq>, and in the <gui>Preferences</gui> "
+"window, click on the <gui>Plugins</gui> tab. You'll see a list of currently-"
+"installed plugins, each with a checkbox by it, and you may enable or disable "
+"each by selecting or deselecting the checkbox by its name."
+msgstr ""
+
+#: C/other-plugins.page:25(p)
+msgid ""
+"Full documentation on how to develop new plugins is available at <link href="
+"\"http://redmine.yorba.org/projects/shotwell/wiki/ShotwellArchWritingPlugins"
+"\">http://redmine.yorba.org/projects/shotwell/wiki/"
+"ShotwellArchWritingPlugins</link>"
+msgstr ""
+
+#: C/other-multiple.page:7(desc)
+msgid ""
+"You can open Shotwell with a different photo library by using the command "
+"line."
+msgstr ""
+
+#: C/other-multiple.page:12(title)
+msgid "Multiple libraries"
+msgstr "Varias bibliotecas"
+
+#: C/other-multiple.page:14(p)
+msgid ""
+"Shotwell normally stores its database and photo thumbnails in the directory "
+"<file>~/.shotwell</file> . This directory does not hold photos, but the "
+"database in this directory contains a list of all the photos in the Shotwell "
+"library."
+msgstr ""
+
+#: C/other-multiple.page:16(p)
+msgid ""
+"As an advanced feature, it's possible for you to have multiple Shotwell "
+"libraries, each of which has its own set of photos. Each library needs its "
+"own database directory. To launch Shotwell with an alternate library, "
+"specify an alternate database directory on the command line as follows:"
+msgstr ""
+
+#: C/other-multiple.page:18(screen)
+#, no-wrap
+msgid ""
+"\n"
+"shotwell -d [library-directory]\n"
+msgstr ""
+"\n"
+"shotwell -d [carpeta-biblioteca]\n"
+
+#: C/other-missing.page:7(desc)
+msgid "If Shotwell can't find a photo in your library, it marks it as missing."
+msgstr ""
+
+#: C/other-missing.page:12(title)
+msgid "Missing photos"
+msgstr ""
+
+#: C/other-missing.page:14(p)
+msgid ""
+"Each time Shotwell starts up, it scans your photo library to verify that all "
+"photo files still exist on your hard drive. If Shotwell finds that any photo "
+"files are missing, it will not display them in the normal Photos, Events and "
+"Tags views, but will instead show them in a separate Missing Files view "
+"which will appear in the sidebar."
+msgstr ""
+
+#: C/other-missing.page:16(p)
+msgid ""
+"If you no longer want the missing files to be part of your Shotwell "
+"collection (perhaps because you deleted them), go to the Missing Files view, "
+"select the photos and then click <gui>Remove From Library</gui>."
+msgstr ""
+
+#: C/other-missing.page:18(p)
+msgid ""
+"If you have photos on a removable disk, such as a CD or USB flash drive, and "
+"<link xref=\"index#import\">import</link> them into Shotwell <em>without</"
+"em> copying the photos to your computer, they will show up as missing files "
+"if you then disconnect the removable disk. See <link xref=\"import-file\"/> "
+"to learn how to copy files from removable disks onto your computer."
+msgstr ""
+
+#: C/other-missing.page:20(p)
+msgid ""
+"If any missing photo files become available again, Shotwell will notice this "
+"the next time it starts. The photos will once again appear in the Photos, "
+"Events and Tags views."
+msgstr ""
+
+#: C/other-files.page:7(desc)
+msgid "Keep the Shotwell library in sync with photo files on disk."
+msgstr ""
+
+#: C/other-files.page:12(title)
+msgid "Photo files"
+msgstr ""
+
+#: C/other-files.page:14(p)
+msgid ""
+"Every photo in the Shotwell library corresponds to a file stored on your "
+"hard disk. Shotwell has several features which help you keep the Shotwell "
+"library and files on disk in sync."
+msgstr ""
+
+#: C/other-files.page:21(title)
+msgid "Using a custom directory pattern"
+msgstr ""
+
+#: C/other-files.page:22(p)
+msgid ""
+"Shotwell allows you to specify how it names directories in your library. You "
+"can do this by changing the <gui>Directory Structure</gui> and <gui>Pattern</"
+"gui> settings in the <gui>Preferences</gui> dialog. You may use a "
+"preselected pattern, or choose <gui>Custom</gui> and type in your own."
+msgstr ""
+
+#: C/other-files.page:29(p)
+msgid ""
+"The available symbols for the directory pattern begin with a % (percent "
+"sign). The values these symbols produce are locale-dependent, so what you "
+"see on your computer may vary from the examples below."
+msgstr ""
+
+#: C/other-files.page:38(em)
+msgid "Symbol"
+msgstr "Símbolo"
+
+#: C/other-files.page:38(em)
+msgid "Meaning"
+msgstr "Significado"
+
+#: C/other-files.page:38(em)
+msgid "Example"
+msgstr "Ejemplo"
+
+#: C/other-files.page:43(p)
+msgid "%Y"
+msgstr "%Y"
+
+#: C/other-files.page:43(p)
+msgid "Year: full"
+msgstr "Año: completo"
+
+#: C/other-files.page:43(p)
+msgid "2011"
+msgstr "2011"
+
+#: C/other-files.page:46(p)
+msgid "%y"
+msgstr "%y"
+
+#: C/other-files.page:46(p)
+msgid "Year: two digit"
+msgstr "Año: dos dígitos"
+
+#: C/other-files.page:46(p)
+msgid "11"
+msgstr "11"
+
+#: C/other-files.page:49(p)
+msgid "%d"
+msgstr "%d"
+
+#: C/other-files.page:49(p)
+msgid "Day of the month with leading zero"
+msgstr "Dia del mes, empezando por cero"
+
+#: C/other-files.page:49(p)
+msgid "03"
+msgstr "03"
+
+#: C/other-files.page:52(p)
+msgid "%A"
+msgstr "%A"
+
+#: C/other-files.page:52(p)
+msgid "Day name: full"
+msgstr "Nombre del día: completo"
+
+#: C/other-files.page:52(p)
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: C/other-files.page:55(p)
+msgid "%a"
+msgstr "%a"
+
+#: C/other-files.page:55(p)
+msgid "Day name: abbreviated"
+msgstr "Nombre del día: abreviado"
+
+#: C/other-files.page:55(p)
+msgid "Wed"
+msgstr "Mié"
+
+#: C/other-files.page:58(p)
+msgid "%m"
+msgstr "%m"
+
+#: C/other-files.page:58(p)
+msgid "Month number with leading zero"
+msgstr "Número de mes, empezando por cero"
+
+#: C/other-files.page:58(p)
+msgid "02"
+msgstr "02"
+
+#: C/other-files.page:60(p)
+msgid "%b"
+msgstr "%b"
+
+#: C/other-files.page:60(p)
+msgid "Month name: abbreviated"
+msgstr "Nombre del mes: abreviado"
+
+#: C/other-files.page:60(p)
+msgid "Feb"
+msgstr "Feb"
+
+#: C/other-files.page:62(p)
+msgid "%B"
+msgstr "%B"
+
+#: C/other-files.page:62(p)
+msgid "Month name: full"
+msgstr "Nombre del mes: completo"
+
+#: C/other-files.page:62(p)
+msgid "February"
+msgstr "Febrero"
+
+#: C/other-files.page:63(p)
+msgid "%I"
+msgstr "%I"
+
+#: C/other-files.page:63(p)
+msgid "Hour: 12 hour format"
+msgstr "Hora: formato de 12 horas"
+
+#: C/other-files.page:63(p)
+msgid "05"
+msgstr "05"
+
+#: C/other-files.page:64(p)
+msgid "%H"
+msgstr "%H"
+
+#: C/other-files.page:64(p)
+msgid "Hour: 24 hour format"
+msgstr "Hora: formato de 24 horas"
+
+#: C/other-files.page:64(p)
+msgid "17"
+msgstr "17"
+
+#: C/other-files.page:66(p)
+msgid "%M"
+msgstr "%M"
+
+#: C/other-files.page:66(p)
+msgid "Minute"
+msgstr "Minuto"
+
+#: C/other-files.page:66(p)
+msgid "16"
+msgstr "16"
+
+#: C/other-files.page:67(p)
+msgid "%S"
+msgstr "%S"
+
+#: C/other-files.page:67(p)
+msgid "Second"
+msgstr "Segundo"
+
+#: C/other-files.page:67(p)
+msgid "30"
+msgstr "30"
+
+#: C/other-files.page:68(p)
+msgid "%p"
+msgstr "%p"
+
+#: C/other-files.page:68(p)
+msgid "AM or PM"
+msgstr "AM o PM"
+
+#: C/other-files.page:68(p)
+msgid "PM"
+msgstr "PM"
+
+#: C/other-files.page:72(p)
+msgid ""
+"There are other symbols available; please check the manual for strftime by "
+"running the command <cmd>man strftime</cmd> if you need one that isn't "
+"listed here."
+msgstr ""
+
+#: C/other-files.page:79(title)
+msgid "Automatically importing photos"
+msgstr "Importar fotos automáticamente"
+
+#: C/other-files.page:81(p)
+msgid ""
+"Shotwell can automatically import new photos which appear in the library "
+"directory. (The library directory is usually the <file>Pictures</file> "
+"directory in your home directory; you can change its location in in the "
+"<gui>Preferences</gui> window.)"
+msgstr ""
+
+#: C/other-files.page:86(p)
+msgid ""
+"To enable auto-import, check the box <gui>Watch library directory for new "
+"files</gui> in the <gui>Preferences</gui> window."
+msgstr ""
+
+#: C/other-files.page:90(p)
+msgid ""
+"Shotwell can also follow symbolic links inside automatically-imported "
+"directories."
+msgstr ""
+
+#: C/other-files.page:95(title)
+msgid "Automatically renaming imported photos to lowercase"
+msgstr ""
+
+#: C/other-files.page:97(p)
+msgid ""
+"Shotwell can automatically change the filenames of imported photos to "
+"lowercase. To enable this, choose <guiseq><gui>Edit</gui><gui>Preferences</"
+"gui></guiseq>, and in the <gui>Preferences</gui> window, check the "
+"<gui>Rename imported files to lowercase</gui> box."
+msgstr ""
+
+#: C/other-files.page:107(title)
+msgid "Writing metadata on the fly"
+msgstr "Escribir metadatos al vuelo"
+
+#: C/other-files.page:109(p)
+msgid ""
+"By default, Shotwell does not modify photo files, even when you edit photos "
+"or change their tags or titles. Shotwell records these changes in its own "
+"database only."
+msgstr ""
+
+#: C/other-files.page:112(p)
+msgid ""
+"To change this behavior, you can enable the checkbox <gui>Write tags, titles "
+"and other metadata to photo files</gui> in the <gui>Preferences</gui> "
+"dialog. When this option is enabled, Shotwell will write the following "
+"metadata to most photo files whenever you change it in Shotwell:"
+msgstr ""
+
+#: C/other-files.page:118(p)
+msgid "titles"
+msgstr "títulos"
+
+#: C/other-files.page:119(p)
+msgid "tags"
+msgstr "etiquetas"
+
+#: C/other-files.page:120(p)
+msgid "ratings"
+msgstr "valoraciones"
+
+#: C/other-files.page:121(p)
+msgid "rotation information"
+msgstr "información de rotación"
+
+#: C/other-files.page:122(p)
+msgid "time/date"
+msgstr "fecha/hora"
+
+#: C/other-files.page:125(p)
+msgid ""
+"Shotwell stores this information in photo files in EXIF, IPTC and/or XMP "
+"format. Note that Shotwell can write only to photo files in JPEG, PNG and "
+"TIFF format, not to BMP photos, RAW photos or to video files."
+msgstr ""
+
+#: C/other-files.page:133(title)
+msgid "Runtime monitoring"
+msgstr ""
+
+#: C/other-files.page:135(p)
+msgid ""
+"While Shotwell is running, it notices changes made to any photo file "
+"externally. When a photo file changes, Shotwell rereads the file and updates "
+"your view of the photo and metadata."
+msgstr ""
+
+#: C/other-files.page:139(p)
+msgid ""
+"Note that Shotwell checks all photo files for changes at startup, but only "
+"photo files contained in the library directory are monitored in real time "
+"after startup. We hope to remove this limitation in a further release."
+msgstr ""
+
+#: C/organize-title.page:7(desc)
+msgid "Give titles to your photos."
+msgstr "Asignar títulos a las fotos."
+
+#: C/organize-title.page:12(title)
+msgid "Titles"
+msgstr "Títulos"
+
+#: C/organize-title.page:14(p)
+msgid ""
+"The <guiseq><gui>View</gui><gui>Titles</gui></guiseq> checkbox toggles the "
+"display of titles beneath each photo. By default, a photo's title is its "
+"filename."
+msgstr ""
+
+#: C/organize-title.page:17(p)
+msgid ""
+"To change a photo's title, select the photo and click <guiseq><gui>Photos</"
+"gui><gui>Edit Title</gui></guiseq>, or press <key>F2</key>."
+msgstr ""
+
+#: C/organize-tag.page:7(desc)
+msgid "Organize photos by labelling them."
+msgstr "Organizar las fotos etiquetándolas."
+
+#: C/organize-tag.page:14(title)
+msgid "Tagging photos"
+msgstr "Etiquetar fotos"
+
+#: C/organize-tag.page:16(p)
+msgid ""
+"You can assign one or more tags to selected photos. A tag can be one or more "
+"words that you want to associate with those photos."
+msgstr ""
+
+#: C/organize-tag.page:22(p)
+msgid ""
+"To add new tags to photos, select the photos you would like to tag, then do "
+"any of the following:"
+msgstr ""
+
+#: C/organize-tag.page:28(p)
+msgid "Choose <guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq>."
+msgstr ""
+"Elija <guiseq><gui>Etiquetas</gui><gui>Añadir etiquetas</gui></guiseq>."
+
+#: C/organize-tag.page:29(p)
+msgid "Type <keyseq><key>Ctrl</key><key>T</key></keyseq>."
+msgstr "Pulse <keyseq><key>Ctrl</key><key>T</key></keyseq>."
+
+#: C/organize-tag.page:30(p)
+msgid "Drag the selected photos and drop them on the desired tag."
+msgstr ""
+
+#: C/organize-tag.page:33(p)
+msgid ""
+"When you use <keyseq><key>Ctrl</key><key>T</key></keyseq> or "
+"<guiseq><gui>Tags</gui><gui>Add Tags</gui></guiseq> you can type in the "
+"names of one or more tags, separated by commas. Once you have created a tag, "
+"you can rename it by selecting that tag in the sidebar and choosing "
+"<guiseq><gui>Tags</gui><gui>Rename Tag \"[name]\"</gui></guiseq>, by "
+"rightclicking on it and choose <gui>Rename...</gui> or double-click on the "
+"tag in the sidebar."
+msgstr ""
+
+#: C/organize-tag.page:44(p)
+msgid ""
+"To change which tags are associated with a particular photo, select that "
+"photo, choose <guiseq><gui>Tags</gui><gui>Modify Tags</gui></guiseq> or "
+"right-click on a photo and select <gui>Modify Tags</gui> and edit the comma "
+"separated list. To remove a tag from one or more photos, first select that "
+"tag in the sidebar, then select the photos you would like to remove, and "
+"choose <guiseq><gui>Tags</gui><gui>Remove Tag \"[name]\" from Photos</gui></"
+"guiseq> or right-click on the photos an select <gui>Remove Tag \"[name]\" "
+"from Photos</gui>."
+msgstr ""
+
+#: C/organize-tag.page:58(p)
+msgid ""
+"To delete a tag entirely, select that tag in the sidebar and choose "
+"<guiseq><gui>Tags</gui><gui>Delete Tag \"[name]\"</gui></guiseq> or by right-"
+"click and select <gui>Delete Tag \"[name]\"</gui>."
+msgstr ""
+
+#: C/organize-tag.page:64(p)
+msgid ""
+"When you create a tag, it will appear in the sidebar under the Tags item, "
+"which is hidden if there are no tags. Photos can have multiple tags attached "
+"to them, and when you click on the name of a given tag in the sidebar, you "
+"will see all the photos associated with that tag."
+msgstr ""
+
+#: C/organize-tag.page:73(title)
+msgid "Hierarchical Tags"
+msgstr "Etiquetas jerárquicas"
+
+#: C/organize-tag.page:74(p)
+msgid ""
+"Shotwell supports also hierarchial tags. You can rearrange your tags by drag "
+"and drop a tag onto another. To create a new subtag right-click on a tag and "
+"select <gui>New</gui>."
+msgstr ""
+
+#: C/organize-tag.page:81(p)
+msgid ""
+"Hierarchial tags can help you to sort your tag list in ways that better "
+"match how you work or think; for example, you can store location tags like "
+"\"Mountains\" or \"Beach\" under a parent tag \"Places\", which itself can "
+"be placed under the tag \"Summer Holidays\"."
+msgstr ""
+
+#: C/organize-tag.page:89(p)
+msgid "Note that deleting a parent tag will also delete its child tags."
+msgstr ""
+
+#: C/organize-search.page:7(desc)
+msgid "Find photos and videos in your collection by a variety of criteria."
+msgstr ""
+
+#: C/organize-search.page:12(title)
+msgid "Searching"
+msgstr "Búsqueda"
+
+#: C/organize-search.page:14(p)
+msgid ""
+"There are two ways to search in Shotwell: the filter toolbar, and with a "
+"saved search. The search bar allows you to quickly search the current view "
+"for certain criteria. Saved Searches feature more complex search criteria "
+"and persist in the sidebar between sessions."
+msgstr ""
+
+#: C/organize-search.page:21(title)
+msgid "Search bar"
+msgstr "Barra de búsqueda"
+
+#: C/organize-search.page:22(p)
+msgid ""
+"The <guiseq><gui>View</gui><gui>Search Bar</gui></guiseq> checkbox toggles "
+"the display of the search bar. You can also hit <keyseq><key>Ctrl</"
+"key><key>F</key></keyseq> or <key>F8</key> to bring up the search bar. From "
+"this bar, you can find, show and hide photos and videos based on title, tag, "
+"rating or other options."
+msgstr ""
+
+#: C/organize-search.page:29(p)
+msgid ""
+"To begin searching, simply enter a search keyword in the text box, or click "
+"on <gui>Flagged</gui>, <gui>Rating</gui> or <gui>Type</gui>. The text search "
+"matches your keywords across tag names, photo or video titles and photos' "
+"original filenames. The <gui>Flagged</gui>, <gui>Rating</gui> and <gui>Type</"
+"gui> buttons allow you to filter your collection by whether photos are "
+"flagged, their current number of stars, and whether the items shown are "
+"images, videos, or raw camera files, respectively."
+msgstr ""
+
+#: C/organize-search.page:38(p)
+msgid ""
+"Disabling the search bar or exiting Shotwell automatically resets the search "
+"bar."
+msgstr ""
+
+#: C/organize-search.page:44(title)
+msgid "Saved search"
+msgstr "Búsqueda guardada"
+
+#: C/organize-search.page:45(p)
+msgid ""
+"A saved search persists across Shotwell sessions, and is updated as photos "
+"and videos are added and removed from your Shotwell library."
+msgstr ""
+
+#: C/organize-search.page:50(p)
+msgid ""
+"Create a new saved search with <guiseq><gui>Edit</gui><gui>New Search</gui></"
+"guiseq> or by hitting <keyseq><key>Ctrl</key><key>S</key></keyseq>. The "
+"dialog box allows you to enter a name for the search and select whether you "
+"want to meet Any, All, or None of the criteria in the following rows."
+msgstr ""
+
+#: C/organize-search.page:56(p)
+msgid ""
+"Each row represents a search criterion. Use the + button to add more rows, "
+"and the - button to remove a specific row. The combo box on the left of each "
+"row selects the type of criteria. Criteria must be entered correctly before "
+"the OK button becomes available."
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/organize-remove.page:15(None)
+msgid ""
+"@@image: 'figures/trash_process.png'; md5=ed596bda34c2f4a79a310fbc8bb51fd2"
+msgstr ""
+"@@image: 'figures/trash_process.png'; md5=ed596bda34c2f4a79a310fbc8bb51fd2"
+
+#: C/organize-remove.page:7(desc)
+msgid ""
+"Remove photos from the library, or delete them from your computer entirely."
+msgstr ""
+
+#: C/organize-remove.page:12(title)
+msgid "Removing and deleting photos"
+msgstr "Quitar y eliminar fotos"
+
+#: C/organize-remove.page:14(p)
+msgid ""
+"You may remove photos from your library and you may additionally delete them "
+"entirely from your hard disk."
+msgstr ""
+
+#: C/organize-remove.page:15(media)
+msgid "Delete process"
+msgstr ""
+
+#: C/organize-remove.page:16(p)
+msgid ""
+"This diagram shows how a photo, when deleted, is first put into Shotwell's "
+"trash. If you delete it from Shotwell's trash, it is put into your "
+"computer's trash. If you delete it from your computer's trash the photo is "
+"finally and irretrievably deleted from your computer."
+msgstr ""
+
+#: C/organize-remove.page:18(title)
+msgid "Removing photos from the library"
+msgstr "Quitar fotos de la biblioteca"
+
+#: C/organize-remove.page:19(p)
+msgid ""
+"Select the photos to remove and choose <guiseq><gui>Edit</gui><gui>Move to "
+"Trash</gui></guiseq>. (You can also press the <key>Delete</key> key.) The "
+"photos will be moved from your library to Shotwell's Trash."
+msgstr ""
+
+#: C/organize-remove.page:22(p)
+msgid ""
+"If you want to remove photos from Shotwell without having them pass through "
+"the trash, simply select the photos to be removed and choose "
+"<guiseq><gui>Edit</gui><gui>Remove From Library</gui></guiseq>. The photo "
+"files will be left in place on disk."
+msgstr ""
+
+#: C/organize-remove.page:26(title)
+msgid "Emptying or restoring the trash folder"
+msgstr "Vaciar o restaurar la carpeta de la papelera"
+
+#: C/organize-remove.page:27(p)
+msgid ""
+"Select the Trash entry in the Sidebar and Shotwell will display all photos "
+"that have been marked for removal or deletion. In the Trash view, the "
+"following commands are available:"
+msgstr ""
+
+#: C/organize-remove.page:29(title)
+msgid "Delete"
+msgstr "Eliminar"
+
+#: C/organize-remove.page:29(p)
+msgid "Delete the selected photos from the trash folder."
+msgstr "Eliminar las fotos seleccionadas de la carpeta de la papelera"
+
+#: C/organize-remove.page:30(title)
+msgid "Restore"
+msgstr "Restaurar"
+
+#: C/organize-remove.page:30(p)
+msgid "Restore the selected photos into Shotwell."
+msgstr "Restaurar las fotos seleccionadas en Shotwell."
+
+#: C/organize-remove.page:31(title)
+msgid "Empty trash"
+msgstr "Vaciar la papelera"
+
+#: C/organize-remove.page:31(p)
+msgid "Delete all photos from the trash folder."
+msgstr "Eliminar todas las fotos de la papelera."
+
+#: C/organize-remove.page:36(title)
+msgid "Deleting or emptying Trash"
+msgstr "Eliminar o vaciar la papelera"
+
+#: C/organize-remove.page:37(p)
+msgid ""
+"When you delete files from the Trash folder or empty the Trash folder, you "
+"will be given the following choices:"
+msgstr ""
+
+#: C/organize-remove.page:39(title)
+msgid "Only Remove"
+msgstr ""
+
+#: C/organize-remove.page:39(p)
+msgid ""
+"Remove photos from the library but leave the photos in their location on the "
+"computer."
+msgstr ""
+
+#: C/organize-remove.page:40(title)
+msgid "Trash file"
+msgstr ""
+
+#: C/organize-remove.page:40(p)
+msgid "Remove photos from the library and delete them from the computer."
+msgstr ""
+
+#: C/organize-remove.page:41(title)
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: C/organize-remove.page:41(p)
+msgid "Do nothing."
+msgstr "No hacer nada."
+
+#: C/organize-rating.page:7(desc)
+msgid ""
+"Give photos a rating between 1 and 5 stars. You can reject bad photos, "
+"hiding them from view."
+msgstr ""
+
+#: C/organize-rating.page:12(title)
+msgid "Ratings"
+msgstr "Valoraciones"
+
+#: C/organize-rating.page:13(p)
+msgid ""
+"You can assign each photo a rating from 1-5 stars, or may alternatively rate "
+"it as Rejected, in which case Shotwell will hide the photo by default."
+msgstr ""
+
+#: C/organize-rating.page:15(p)
+msgid "You can rate a photo or a set of photos in any of these ways:"
+msgstr ""
+
+#: C/organize-rating.page:18(p)
+msgid ""
+"Select the photo(s), then choose a rating from the top-level "
+"<guiseq><gui>Photos</gui><gui>Set Rating</gui></guiseq> menu."
+msgstr ""
+
+#: C/organize-rating.page:19(p)
+msgid ""
+"Right-click on the photo(s), then choose a rating from the Set Rating "
+"context menu."
+msgstr ""
+
+#: C/organize-rating.page:20(p)
+msgid ""
+"Select the photo(s), then press any of the shortcut keys <key>1</key>, "
+"<key>2</key>, <key>3</key>, <key>4</key> or <key>5</key> to assign a rating. "
+"Or press <key>9</key> to mark the photo(s) as rejected or <key>0</key> to "
+"clear the rating(s)."
+msgstr ""
+
+#: C/organize-rating.page:23(p)
+msgid ""
+"Normally Shotwell displays all photos except rejected photos. You can set a "
+"different rating filter using the <guiseq><gui>View</gui><gui>Filter Photos</"
+"gui></guiseq> menu - for example, you can display only photos rated with 3 "
+"stars or higher, or you can display all photos including those marked "
+"rejected. The Shotwell icon on the toolbar displays the current rating "
+"filter and can also be used to set the filter."
+msgstr ""
+
+#: C/organize-rating.page:26(p)
+msgid ""
+"Shotwell normally displays each photo's rating in its lower left-hand "
+"corner. You can turn off the display of ratings using the <guiseq><gui>View</"
+"gui><gui>Ratings</gui></guiseq> menu item."
+msgstr ""
+
+#: C/organize-rating.page:28(p)
+msgid ""
+"You can increase or decrease a photo's rating using the <guiseq><gui>Set "
+"Rating</gui><gui>Increase</gui></guiseq> and <guiseq><gui>Set Rating</"
+"gui><gui>Decrease</gui></guiseq> commands, or the keyboard shortcuts "
+"<key>&lt;</key> and <key>&gt;</key>."
+msgstr ""
+
+#: C/organize-flag.page:7(desc)
+msgid "Flag photos to mark them as special or to work with them as a set."
+msgstr ""
+
+#: C/organize-flag.page:12(title)
+msgid "Flagging photos"
+msgstr "Marcar fotos"
+
+#: C/organize-flag.page:14(p)
+msgid ""
+"Shotwell lets you <em>flag</em> photos. When a photo is flagged, a small "
+"flag icon appears in its upper right corner. You can select the "
+"<gui>Flagged</gui> item in the sidebar to see all photos which have been "
+"flagged."
+msgstr ""
+
+#: C/organize-flag.page:18(p)
+msgid ""
+"Flagging a photo marks it as special. You can interpret this in any way you "
+"like. For example, you might flag all photos which need visual adjustment, "
+"or all photos which you want to share with a friend."
+msgstr ""
+
+#: C/organize-flag.page:22(p)
+msgid ""
+"Flagging is also useful because you can operate on all flagged photos as a "
+"set. For example, you can select the <gui>Flagged</gui> view and then upload "
+"all flagged photos to a publishing service."
+msgstr ""
+
+#: C/organize-flag.page:27(title)
+msgid "To flag or unflag a photo"
+msgstr ""
+
+#: C/organize-flag.page:28(p)
+msgid ""
+"To flag or unflag a photo, right-click the photo and choose <gui>Flag</gui> "
+"or <gui>Unflag</gui> from the context menu. Or use the <keyseq><key>Ctrl</"
+"key><key>G</key></keyseq> or <key>/</key> shortcut keys."
+msgstr ""
+
+#: C/organize-event.page:7(desc)
+msgid ""
+"Group photos together that were taken at the same time. Learn how to rename, "
+"merge, and sort events."
+msgstr ""
+
+#: C/organize-event.page:12(title)
+msgid "Events"
+msgstr "Eventos"
+
+#: C/organize-event.page:14(p)
+msgid ""
+"An event is a group of photos that were taken at approximately the same "
+"time. When you import photos, Shotwell checks when each photo was taken. It "
+"then groups the photos into events."
+msgstr ""
+
+#: C/organize-event.page:16(p)
+msgid ""
+"Choose <gui>Events</gui> from the sidebar to see your photos organized by "
+"date. If you select a month or year from the sidebar, a list of events will "
+"be displayed in the main window. Double-click an event to see all the photos "
+"that were taken around that time."
+msgstr ""
+
+#: C/organize-event.page:18(p)
+msgid ""
+"If a photo has no embedded date/time information, then Shotwell can't "
+"automatically place it in any event. In this case the photo will appear in "
+"the <gui>No Event</gui> view accessible from the sidebar. You can still move "
+"the photo to any event you like as described below."
+msgstr ""
+
+#: C/organize-event.page:25(title)
+msgid "Renaming events"
+msgstr "Renombrar eventos"
+
+#: C/organize-event.page:27(p)
+msgid ""
+"To give an event a name rather than referring to it by its date, select the "
+"event, click <guiseq><gui>Edit</gui><gui>Rename Event</gui></guiseq> and "
+"enter a new name. Another way of renaming an event is to double-click its "
+"name in the sidebar; type a new name and then press <key>Enter</key>."
+msgstr ""
+
+#: C/organize-event.page:31(title)
+msgid "Moving photos between events"
+msgstr "Mover fotos entre eventos"
+
+#: C/organize-event.page:33(p)
+msgid ""
+"Even though photos are initially grouped into events by their date, you can "
+"move photos between events. To do this, drag any photo to the sidebar and "
+"drop it on an event."
+msgstr ""
+
+#: C/organize-event.page:37(title)
+msgid "Creating and merging events"
+msgstr ""
+
+#: C/organize-event.page:38(p)
+msgid ""
+"To create a new event, select the photos you would like in the new event and "
+"click <guiseq><gui>Events</gui><gui>New Event</gui></guiseq>."
+msgstr ""
+
+#: C/organize-event.page:39(p)
+msgid ""
+"To merge events, select <guiseq><gui>Events</gui></guiseq> from the sidebar, "
+"then, while holding down <key>Ctrl</key> click on the events you want to "
+"merge in the main window area. Finally, click <guiseq><gui>Events</"
+"gui><gui>Merge Events</gui></guiseq>."
+msgstr ""
+
+#: C/organize-event.page:43(title)
+msgid "Sorting events"
+msgstr "Ordenar eventos"
+
+#: C/organize-event.page:45(p)
+msgid ""
+"Events are displayed in a tree in the sidebar, organized by the year and "
+"month of the earliest photo in the event. To change the event sort order, "
+"click <guiseq><gui>View</gui><gui>Sort Events</gui></guiseq> and select "
+"either ascending or descending."
+msgstr ""
+
+#: C/organize-event.page:51(title)
+msgid "Change the photo used to represent each event"
+msgstr ""
+
+#: C/organize-event.page:53(p)
+msgid ""
+"If you select the Events item in the sidebar, you'll see a single photo "
+"which represents each event. This is called the key photo."
+msgstr ""
+
+#: C/organize-event.page:55(p)
+msgid ""
+"By default, Shotwell uses the first photo in each event as its key photo. To "
+"use a different key photo, select the photo and choose <guiseq><gui>Photos</"
+"gui><gui>Make Key Photo for Event</gui></guiseq>."
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/index.page:23(None)
+msgid ""
+"@@image: 'figures/shotwell_logo.png'; md5=59de2b2c4fa64ea1497c98452c509dbd"
+msgstr ""
+"@@image: 'figures/shotwell_logo.png'; md5=59de2b2c4fa64ea1497c98452c509dbd"
+
+#: C/index.page:6(title) C/index.page:7(title)
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: C/index.page:9(name)
+msgid "Jim Nelson"
+msgstr "Jim Nelson"
+
+#: C/index.page:10(email)
+msgid "jim@yorba.org"
+msgstr "jim@yorba.org"
+
+#: C/index.page:11(name)
+msgid "Allison Barlow"
+msgstr "Allison Barlow"
+
+#: C/index.page:12(email)
+msgid "allison@yorba.org"
+msgstr "allison@yorba.org"
+
+#: C/index.page:13(name)
+msgid "Robert Ancell"
+msgstr "Robert Ancell"
+
+#: C/index.page:14(email)
+msgid "robert.ancell@canonical.com"
+msgstr "robert.ancell@canonical.com"
+
+#: C/index.page:15(name)
+msgid "Peter Smith"
+msgstr "Peter Smith"
+
+#: C/index.page:16(email)
+msgid "pdo.smith@gmail.com"
+msgstr "pdo.smith@gmail.com"
+
+#: C/index.page:17(name)
+msgid "Phil Bull"
+msgstr "Phil Bull"
+
+#: C/index.page:18(email)
+msgid "philbull@gmail.com"
+msgstr "philbull@gmail.com"
+
+#: C/index.page:23(title)
+msgid ""
+"<media type=\"image\" src=\"figures/shotwell_logo.png\"/>Shotwell Photo "
+"Manager"
+msgstr ""
+"<media type=\"image\" src=\"figures/shotwell_logo.png\"/>Gestor de fotos "
+"Shotwell"
+
+#: C/index.page:26(title)
+msgid "Importing Photos"
+msgstr "Importar fotos"
+
+#: C/index.page:30(title)
+msgid "Viewing Photos"
+msgstr "Ver fotos"
+
+#: C/index.page:34(title)
+msgid "Organizing Photos"
+msgstr "Organizar fotos"
+
+#: C/index.page:38(title)
+msgid "Editing Photos"
+msgstr "Editar fotos"
+
+#: C/index.page:42(title)
+msgid "Sharing Photos"
+msgstr "Compartir fotos"
+
+#: C/index.page:46(title)
+msgid "Other Features"
+msgstr "Otras características"
+
+#: C/import-memorycard.page:7(desc)
+msgid "Import photos from a digital camera's memory card."
+msgstr ""
+
+#: C/import-memorycard.page:12(title)
+msgid "Importing from a memory card"
+msgstr "Importar desde una tarjeta de memoria"
+
+#: C/import-memorycard.page:14(p)
+msgid "To import photos from a camera memory card:"
+msgstr ""
+
+#: C/import-memorycard.page:18(p)
+msgid ""
+"Put the card into your card reader. Make sure the card reader is plugged in "
+"to the computer and switched on."
+msgstr ""
+
+#: C/import-memorycard.page:21(p)
+msgid "The card reader and card should be detected automatically."
+msgstr ""
+
+#: C/import-memorycard.page:24(p)
+msgid ""
+"Follow the instructions for <link xref=\"import-file\">importing photos from "
+"your hard disk</link>. If you click <guiseq><gui>File</gui><gui>Import From "
+"Folder</gui></guiseq>, the memory card should be visible as a folder in the "
+"side bar of the file selection window."
+msgstr ""
+
+#: C/import-memorycard.page:28(p)
+msgid ""
+"Shotwell can import photos from any memory card that is compatible with your "
+"card reader."
+msgstr ""
+
+#: C/import-memorycard.page:30(p)
+msgid ""
+"If the card is not detected automatically, your card reader may not have "
+"been recognized. Try unplugging it and then plugging it in again. If that "
+"doesn't work, you should still be able to import photos by <link xref="
+"\"import-camera\">connecting your camera directly to the computer</link>, "
+"though."
+msgstr ""
+
+#: C/import-f-spot.page:7(desc)
+msgid ""
+"Shotwell can import all your photos and tags from the F-Spot photo manager."
+msgstr ""
+
+#: C/import-f-spot.page:12(title)
+msgid "Importing from F-Spot"
+msgstr "Importar desde F-Spot"
+
+#: C/import-f-spot.page:14(p)
+msgid "To import an existing photo collection from F-Spot:"
+msgstr "Para importar una colección de fotos existente desde F-Spot:"
+
+#: C/import-f-spot.page:16(p)
+msgid "Select <guiseq><gui>File</gui><gui>Import From F-Spot</gui></guiseq>."
+msgstr ""
+"Seleccione <guiseq><gui>Archivo</gui><gui>Importar desde F-Spot</gui></"
+"guiseq>."
+
+#: C/import-f-spot.page:17(p)
+msgid ""
+"Now choose either the default F-Spot library or another F-Spot database. If "
+"importing from another F-Spot database, select a directory and file from the "
+"chooser dialog box."
+msgstr ""
+
+#: C/import-f-spot.page:20(p)
+msgid ""
+"Shotwell will import your photos, together with their tags and other "
+"information. Once the import is complete, you can select <gui>Last Import</"
+"gui> in the sidebar to see all photos successfully imported. The Events list "
+"will also show new entries for the dates corresponding to the imported "
+"photos."
+msgstr ""
+
+#: C/import-file.page:7(desc)
+msgid "Import photos that are already saved on your computer."
+msgstr ""
+
+#: C/import-file.page:12(title)
+msgid "Importing from your hard disk"
+msgstr "Importar desde su disco duro"
+
+#: C/import-file.page:14(p)
+msgid ""
+"To import photo files from your hard disk into Shotwell, just drag them from "
+"your file browser into the Shotwell window."
+msgstr ""
+
+#: C/import-file.page:16(p)
+msgid ""
+"Alternatively, click <guiseq><gui>File</gui><gui>Import From Folder</gui></"
+"guiseq> and select the folder containing the photos you want to import."
+msgstr ""
+
+#: C/import-file.page:18(p)
+msgid ""
+"Shotwell will ask whether you want to copy the photo files to your library "
+"folder (usually this is the <file>Pictures</file> folder in your home "
+"directory) or to import them in place without copying the files."
+msgstr ""
+
+#: C/import-file.page:20(p)
+msgid ""
+"If you hold down <key>Ctrl</key> while dragging photos in, Shotwell will "
+"copy the photos into your library folder without prompting. Similarly, if "
+"you hold down <keyseq><key>Ctrl</key><key>Shift</key></keyseq> while "
+"dragging photos in, Shotwell will import the photos without copying them."
+msgstr ""
+
+#: C/import-file.page:22(p)
+msgid ""
+"Once the import is complete, you can select <gui>Last Import</gui> in the "
+"sidebar to see all photos successfully imported. The Events list will also "
+"show new entries for the dates corresponding to the imported photos."
+msgstr ""
+
+#: C/import-camera.page:7(desc)
+msgid "Copy photos from a digital camera."
+msgstr "Copiar fotos desde una cámara digital."
+
+#: C/import-camera.page:12(title)
+msgid "Importing from a camera"
+msgstr "Importar desde una cámara"
+
+#: C/import-camera.page:14(p)
+msgid "To import photos from a digital camera:"
+msgstr "Para importar fotos desde una cámara digital:"
+
+#: C/import-camera.page:18(p)
+msgid ""
+"Connect the camera to your computer and switch it on. Shotwell will detect "
+"it and list it in the sidebar."
+msgstr ""
+
+#: C/import-camera.page:22(p)
+msgid ""
+"Select the camera in the sidebar. Previews of each photo on the camera will "
+"be displayed."
+msgstr ""
+
+#: C/import-camera.page:25(p)
+msgid ""
+"If you like, you can choose a set of specific photos to import. To do this, "
+"hold down the <key>Ctrl</key> key and click to select individual photos. You "
+"can hold down <key>Shift</key> and click to select a range of photos too."
+msgstr ""
+
+#: C/import-camera.page:28(p)
+msgid ""
+"Click either <gui>Import Selected</gui> or <gui>Import All</gui>. The photos "
+"will be copied from the camera and saved on your computer."
+msgstr ""
+
+#: C/import-camera.page:32(p)
+msgid ""
+"Once the import is complete, you can open the <gui>Last Import</gui> view "
+"(in the sidebar) to see all photos that were imported. The Events list (also "
+"in the sidebar) will also show the new photos, organized by date."
+msgstr ""
+
+#: C/formats.page:7(desc)
+msgid ""
+"Shotwell supports JPEG, PNG, TIFF, BMP and RAW photo files as well as video "
+"files."
+msgstr ""
+
+#: C/formats.page:12(title)
+msgid "Supported photo and video formats"
+msgstr "Formatos de foto y vídeo soportados"
+
+#: C/formats.page:14(p)
+msgid ""
+"Shotwell supports JPEG, PNG, TIFF, BMP and <link type=\"guide\" xref=\"other-"
+"raw\">RAW</link> photo files. Shotwell does not yet support other graphics "
+"format such as GIF."
+msgstr ""
+
+#: C/formats.page:16(p)
+msgid ""
+"Shotwell's RAW format support is currently limited. When you view a RAW "
+"photo, you are actually viewing a JPEG derived from the RAW photo, not the "
+"RAW image itself. Additionally, the RAW editing pipeline is not fully 16-bit "
+"- you can only export edited photos as 8-bit files. All supported formats "
+"can be used for export (JPEG, PNG, TIFF, BMP)."
+msgstr ""
+
+#: C/formats.page:18(p)
+msgid ""
+"For more information about RAW-format photos in Shotwell, please see the "
+"<link type=\"guide\" xref=\"other-raw\">RAW</link> section."
+msgstr ""
+
+#: C/formats.page:22(p)
+msgid ""
+"Shotwell also supports video files in any format supported by the GStreamer "
+"media library on the system where Shotwell is running. This typically "
+"includes the following formats among others:"
+msgstr ""
+
+#: C/formats.page:25(p)
+msgid "Container formats: Ogg, QuickTime, MP4, AVI."
+msgstr ""
+
+#: C/formats.page:26(p)
+msgid ""
+"Codecs: Theora, Quicktime, MPEG-4, Motion JPEG. <em>Note that some operating "
+"systems may not include all codecs listed here due to legal or licensing "
+"restrictions.</em>"
+msgstr ""
+
+#: C/formats.page:30(p)
+msgid ""
+"Shotwell supports both photos and videos, but for simplicity, this "
+"documentation uses just the term \"photos\" in most places. Many operations "
+"in Shotwell apply to both photos and videos, however. In particular, events, "
+"flagging, rating, tagging, and publishing work both for photos and for "
+"videos."
+msgstr ""
+
+#: C/edit-undo.page:7(desc)
+msgid "Return a photo to its original, unedited form."
+msgstr ""
+
+#: C/edit-undo.page:14(title)
+msgid "Undoing changes"
+msgstr "Deshacer cambios"
+
+#: C/edit-undo.page:16(p)
+msgid ""
+"Because Shotwell is a non-destructive photo editor, you can undo any "
+"alterations you make to a photograph."
+msgstr ""
+
+#: C/edit-undo.page:18(p) C/edit-nondestructive.page:16(p)
+msgid ""
+"If you want to see what a photo looked like before your modifications, press "
+"the <key>Shift</key> key. The original photo will be displayed as long as "
+"you hold the key down."
+msgstr ""
+
+#: C/edit-undo.page:20(p)
+msgid ""
+"To completely undo all the changes you've made to a photo, click "
+"<guiseq><gui>Photos</gui><gui>Revert to Original</gui></guiseq>. The only "
+"exception is that time and date adjustments will not be reverted."
+msgstr ""
+
+#: C/edit-time-date.page:7(desc)
+msgid "Change the time and date of photos if those details are incorrect."
+msgstr ""
+
+#: C/edit-time-date.page:12(title)
+msgid "Adjust the time and date of photos"
+msgstr ""
+
+#: C/edit-time-date.page:14(p)
+msgid ""
+"To adjust the time and date of photos, select the photos you would like to "
+"adjust, choose <guiseq><gui>Photos</gui><gui>Adjust Time and Date</gui></"
+"guiseq> and select a new time and date."
+msgstr ""
+
+#: C/edit-time-date.page:16(p)
+msgid ""
+"If you are changing the date and time of multiple photos at once, you can "
+"choose to shift all the photos by the same amount of time or to set all the "
+"photos to the same time."
+msgstr ""
+
+#: C/edit-time-date.page:18(p)
+msgid ""
+"By default, the time and date are only changed inside Shotwell. You can also "
+"choose to modify the time and date in the original file, but this cannot be "
+"undone once you exit Shotwell."
+msgstr ""
+
+#: C/edit-straighten.page:7(desc)
+msgid "Straighten a photo so that its horizon appears level."
+msgstr ""
+
+#: C/edit-straighten.page:12(title)
+msgid "Straighten photos"
+msgstr ""
+
+#: C/edit-straighten.page:14(p)
+msgid ""
+"The straighten tools allows photos to be leveled and straightened. The "
+"straighten tool is only available in full-window or fullscreen mode."
+msgstr ""
+
+#: C/edit-straighten.page:18(p)
+msgid ""
+"Click <gui>Straighten</gui>. The straighten slider will appear. "
+"Alternatively, use the keyboard shortcut <keyseq><key>Ctrl</key><key>A</"
+"key></keyseq>."
+msgstr ""
+
+#: C/edit-straighten.page:21(p)
+msgid "Drag the slider to achieve the desired degree of straightening."
+msgstr ""
+
+#: C/edit-straighten.page:24(p)
+msgid "Press <gui>OK</gui> when finished."
+msgstr ""
+
+#: C/edit-rotate.page:7(desc)
+msgid ""
+"Click the <gui>Rotate</gui> button, or choose one of the commands in the "
+"<gui>Photo</gui> menu."
+msgstr ""
+
+#: C/edit-rotate.page:12(title)
+msgid "Rotate or flip a photo"
+msgstr ""
+
+#: C/edit-rotate.page:14(p)
+msgid ""
+"You can rotate your photos left and right (clockwise and counterclockwise) "
+"with the <gui>Rotate</gui> button on the toolbar of most views. You can also "
+"make a mirror image of any photo."
+msgstr ""
+
+#: C/edit-rotate.page:16(p)
+msgid ""
+"To rotate right, click on the <gui>Rotate</gui> button. To rotate left, "
+"press and hold the <key>Ctrl</key> key and then click the button. Both "
+"commands are available in the <gui>Photos</gui> menu too. Alternatively, use "
+"the following keyboard shortcuts:"
+msgstr ""
+
+#: C/edit-rotate.page:18(p)
+msgid ""
+"rotate left: <keyseq><key>Shift</key><key>Ctrl</key><key>R</key></keyseq> or "
+"<key>[</key>"
+msgstr ""
+
+#: C/edit-rotate.page:19(p)
+msgid ""
+"rotate right: <keyseq><key>Ctrl</key><key>R</key></keyseq> or <key>]</key>"
+msgstr ""
+
+#: C/edit-rotate.page:21(p)
+msgid ""
+"To create a mirror image of a photo, use the <gui>Flip Horizontally</gui> "
+"command in the <gui>Photos</gui> menu. To flip an image vertically, use the "
+"<gui>Flip Vertically</gui> command in the same menu."
+msgstr ""
+
+#: C/edit-rotate.page:24(p)
+msgid ""
+"If you select more than one image, you can rotate all of them at the same "
+"time."
+msgstr ""
+
+#: C/edit-redeye.page:7(desc)
+msgid ""
+"Correct photos where people have red eyes because of the camera's flash."
+msgstr ""
+
+#: C/edit-redeye.page:12(title)
+msgid "Removing red-eye"
+msgstr ""
+
+#: C/edit-redeye.page:14(p)
+msgid ""
+"Red-eye occurs when the camera's flash reflects off the pupil of someone's "
+"eye. To eliminate this in a photo, use the Red-eye tool."
+msgstr ""
+
+#: C/edit-redeye.page:17(p)
+msgid "Click <gui>Red-eye</gui>. A circle will appear on the photo."
+msgstr ""
+
+#: C/edit-redeye.page:20(p)
+msgid ""
+"Drag the circle over the affected pupil, adjust its size with the slider "
+"control, and press <gui>Apply</gui>. The redness will be removed."
+msgstr ""
+
+#: C/edit-redeye.page:23(p)
+msgid ""
+"Repeat this process for all red pupils in your photo. Press <gui>Close</gui> "
+"when finished."
+msgstr ""
+
+#: C/edit-nondestructive.page:7(desc)
+msgid ""
+"Shotwell is a non-destructive photo editor - it does not modify your "
+"original photos."
+msgstr ""
+
+#: C/edit-nondestructive.page:12(title)
+msgid "What happens to the original when I edit a photo?"
+msgstr ""
+
+#: C/edit-nondestructive.page:14(p)
+msgid ""
+"Shotwell is a non-destructive photo editor. It does not modify your original "
+"photographs. That is to say, if you crop a photo or adjust its colors, the "
+"photo file on disc remains untouched. Shotwell stores your edits in a "
+"database and applies them on the fly as necessary. This means you can undo "
+"any alterations you make to a photograph."
+msgstr ""
+
+#: C/edit-nondestructive.page:18(p)
+msgid ""
+"Note that Shotwell can optionally write metadata (such as tags and titles) "
+"to photo files. For more information, see the section <link xref=\"other-"
+"files\">Photo files</link>."
+msgstr ""
+
+#: C/edit-external.page:7(desc)
+msgid "Use a different program to edit a photo."
+msgstr ""
+
+#: C/edit-external.page:12(title)
+msgid "Edit photos with an external program"
+msgstr ""
+
+#: C/edit-external.page:16(p)
+msgid ""
+"You might want to use an external editor to do additional work on a photo. "
+"If installed, GIMP and UFRaw are the default external editors for photo and "
+"RAW editing, respectively. If these programs are not installed, you must "
+"select your preferred editors by choosing <guiseq><gui>Edit</"
+"gui><gui>Preferences</gui></guiseq> and selecting editors from drop-down "
+"menus of installed applications."
+msgstr ""
+
+#: C/edit-external.page:24(p)
+msgid ""
+"Once your editors have been set, select a photo and choose "
+"<guiseq><gui>Photos</gui><gui>Open With External Editor</gui></guiseq> to "
+"open the photo with the external editor. Likewise, if the original photo is "
+"a RAW file, select <guiseq><gui>Photos</gui><gui>Open With RAW Editor</gui></"
+"guiseq> to edit the RAW file directly with the set RAW editor."
+msgstr ""
+
+#: C/edit-external.page:31(p)
+msgid ""
+"When you complete your edits and save the file, Shotwell will detect the "
+"changes and update the photo. When external edits have been made, press and "
+"hold the <key>Shift</key> key in full-window view to show the original photo "
+"rather than the externally-edited one."
+msgstr ""
+
+#: C/edit-external.page:38(p)
+msgid "Reverting to original will erase any external edits."
+msgstr ""
+
+#: C/edit-external.page:43(p)
+msgid ""
+"If you externally edit a RAW photo and save the result to another image, "
+"such as a JPEG or PNG, Shotwell cannot automatically determine that the "
+"original RAW and the new image should be paired."
+msgstr ""
+
+#: C/edit-external.page:49(p)
+msgid ""
+"If you want to work within the resulting image within Shotwell, you'll need "
+"to import it yourself."
+msgstr ""
+
+#: C/edit-enhance.page:7(desc)
+msgid ""
+"Let Shotwell improve the brightness and contrast of a photo automatically."
+msgstr ""
+
+#: C/edit-enhance.page:14(title)
+msgid "Auto-enhance"
+msgstr ""
+
+#: C/edit-enhance.page:16(p)
+msgid ""
+"Clicking on the <gui>Enhance</gui> button is a quick way to automatically "
+"adjust the brightness and contrast of your photo. It will often give you a "
+"photo that is correctly exposed. You can also use it as a starting point and "
+"then improve the adjustments by clicking on the <gui>Adjust</gui> button."
+msgstr ""
+
+#. When image changes, this message will be marked fuzzy or untranslated for you.
+#. It doesn't matter what you translate it to: it's not used at all.
+#: C/edit-crop.page:42(None)
+msgid ""
+"@@image: 'figures/crop_thirds.jpg'; md5=4cf0a026bb812c7eab0c9db8210a9524"
+msgstr ""
+"@@image: 'figures/crop_thirds.jpg'; md5=4cf0a026bb812c7eab0c9db8210a9524"
+
+#: C/edit-crop.page:7(desc)
+msgid "Improve the composition of a photo by cutting out parts of it."
+msgstr ""
+
+#: C/edit-crop.page:12(title)
+msgid "Cropping"
+msgstr ""
+
+#: C/edit-crop.page:14(p)
+msgid ""
+"To reduce the area of a photo and concentrate the viewer's attention on a "
+"smaller portion of it, use the Crop tool. The crop tool is only available in "
+"full-window or fullscreen mode."
+msgstr ""
+
+#: C/edit-crop.page:19(p)
+msgid ""
+"Double-click on a photo to enter full-window mode, then press the <gui>Crop</"
+"gui> button on the toolbar."
+msgstr ""
+
+#: C/edit-crop.page:22(p)
+msgid ""
+"A white box, the crop rectangle, will appear over the photo. The lighter "
+"portion of the photo within the crop rectangle represents what the photo "
+"will look like when you crop it."
+msgstr ""
+
+#: C/edit-crop.page:25(p)
+msgid ""
+"If you place your cursor in the middle of the box, you can move the box "
+"around. If you drag the edges of the box, you can adjust its size. As you "
+"move and adjust the crop box, you'll see four lines appear inside it, like a "
+"tic-tac-toe grid. These are <em>rule of thirds</em> lines."
+msgstr ""
+
+#: C/edit-crop.page:26(p)
+msgid ""
+"You can also constrain the crop box to one of many common sizes. Choose a "
+"size from the drop-down list that suits your needs. If you press the flip "
+"button next to it, the orientation of the constraint will switch (from "
+"landscape to portrait)."
+msgstr ""
+
+#: C/edit-crop.page:29(p)
+msgid ""
+"When you're happy with your crop outline, press the <gui>Apply</gui> button. "
+"Shotwell will display the cropped photo."
+msgstr ""
+
+#: C/edit-crop.page:32(p)
+msgid ""
+"If you change your mind, press the <gui>Crop</gui> button again and fine-"
+"tune the crop."
+msgstr ""
+
+#: C/edit-crop.page:33(p)
+msgid ""
+"If you press <gui>Cancel</gui> rather than <gui>Apply</gui>, Shotwell will "
+"return to the photo's previous crop dimensions."
+msgstr ""
+
+#: C/edit-crop.page:38(title)
+msgid "What is the rule of thirds?"
+msgstr ""
+
+#: C/edit-crop.page:39(p)
+msgid ""
+"The <em>rule of thirds</em> helps you to choose a pleasing composition for a "
+"photo."
+msgstr ""
+
+#: C/edit-crop.page:40(p)
+msgid ""
+"Imagine that the scene is divided up into a 3x3 grid by two equally-spaced "
+"vertical lines and two equally-spaced horizontal lines. According to the "
+"rule, you're more likely to get a pleasing composition if you align major "
+"features (like the horizon, or a person's body) with one of the lines. "
+"Paying attention to the way features flow from one part of the grid to "
+"another can also help."
+msgstr ""
+
+#: C/edit-crop.page:41(p)
+msgid ""
+"Cropping a photo so that it conforms to the rule of thirds often results in "
+"a more visually appealing image."
+msgstr ""
+
+#: C/edit-crop.page:43(p)
+msgid ""
+"Cropping a photo, using the \"rule of thirds\" lines to improve the "
+"composition."
+msgstr ""
+
+#: C/edit-adjustments.page:7(desc)
+msgid "Change the exposure, saturation, tint, and shadows of a photo."
+msgstr ""
+
+#: C/edit-adjustments.page:12(title)
+msgid "Color adjustments"
+msgstr ""
+
+#: C/edit-adjustments.page:14(p)
+msgid ""
+"The <gui>Adjust</gui> button opens a floating window with a histogram and "
+"sliders to adjust a photo's exposure, saturation, tint, temperature, and "
+"shadows. The histogram also has sliders to reduce the upper and lower "
+"intensity thresholds of the photograph, expanding the contrast of the middle "
+"range."
+msgstr ""
+
+#: C/edit-adjustments.page:16(p)
+msgid ""
+"The <gui>Enhance</gui> button adjusts the histogram and shadows sliders to "
+"improve the quality of a photo."
+msgstr ""
+
+#: C/edit-adjustments.page:18(p)
+msgid ""
+"When the photo's colors and contrast are to your liking, press <gui>Apply</"
+"gui> to save the changes. <gui>Reset</gui> will return the image to its "
+"original state. <gui>Cancel</gui> discards all changes you've made."
+msgstr ""
+
+#: C/edit-adjustments.page:21(title)
+msgid "What do the color adjustments do?"
+msgstr ""
+
+#: C/edit-adjustments.page:24(title)
+msgid "Exposure"
+msgstr ""
+
+#: C/edit-adjustments.page:25(p)
+msgid ""
+"Changes the brightness to make it look like the photo was exposed for a "
+"longer or shorter time. Use this to correct under- or over-exposed photos."
+msgstr ""
+
+#: C/edit-adjustments.page:28(title)
+msgid "Saturation"
+msgstr ""
+
+#: C/edit-adjustments.page:29(p)
+msgid ""
+"Changes how vivid colors look. If your photo looks gray and washed out, try "
+"increasing the saturation. If colors look too bold, try decreasing it."
+msgstr ""
+
+#: C/edit-adjustments.page:32(title)
+msgid "Tint"
+msgstr ""
+
+#: C/edit-adjustments.page:33(p)
+msgid ""
+"This tints the photo with a color. It's useful for correcting photos taken "
+"with the wrong white balance setting, which typically have an unnatural "
+"color cast. For example, photos taken outdoors with the white balance set to "
+"\"Tungsten\" may have a blue cast."
+msgstr ""
+
+#: C/edit-adjustments.page:36(title)
+msgid "Temperature"
+msgstr ""
+
+#: C/edit-adjustments.page:37(p)
+msgid ""
+"Changes how \"warm\" or \"cool\" the picture looks. Use this to make cold, "
+"depressing scenes look more lively, for example."
+msgstr ""
+
+#: C/edit-adjustments.page:40(title)
+msgid "Shadows"
+msgstr ""
+
+#: C/edit-adjustments.page:41(p)
+msgid ""
+"This makes shadowy areas appear lighter. Use this to make detail more "
+"visible if it's obscured by the darkness of a shadow."
+msgstr ""
+
+#: C/edit-adjustments.page:44(title)
+msgid "Intensity Threshold (sliders on the histogram)"
+msgstr ""
+
+#: C/edit-adjustments.page:45(p)
+msgid ""
+"These sliders change how light the brightest white is and how dark the "
+"darkest black is. Use them to change the contrast of the photo. Photos which "
+"look washed out should particularly benefit from changing these settings."
+msgstr ""
+
+#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
+#: C/index.page:0(None)
+msgid "translator-credits"
+msgstr "Daniel Mustieles <daniel.mustieles@gmail.com>, 2014"
diff --git a/icons/all-rejected.png b/icons/all-rejected.png
new file mode 100644
index 0000000..2f36668
--- /dev/null
+++ b/icons/all-rejected.png
Binary files differ
diff --git a/icons/crop-pivot-reticle.png b/icons/crop-pivot-reticle.png
new file mode 100644
index 0000000..591235d
--- /dev/null
+++ b/icons/crop-pivot-reticle.png
Binary files differ
diff --git a/icons/crop.svg b/icons/crop.svg
new file mode 100644
index 0000000..39320d0
--- /dev/null
+++ b/icons/crop.svg
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="0 0 128 128" overflow="visible" enable-background="new 0 0 128 128" xml:space="preserve">
+ <path opacity="0.2" fill="#141414" d="M7,26c-0.552,0-1,0.448-1,1v98c0,0.553,0.448,1,1,1h98c0.553,0,1-0.447,1-1V98 c0-0.553-0.447-1-1-1c0,0-68.057,0-70,0c0-1.943,0-70,0-70c0-0.552-0.448-1-1-1H7z"/>
+ <polygon opacity="0.6" fill="#141414" points="34,98 34,27 7,27 7,125 105,125 105,98"/>
+ <polygon fill="#F98818" points="34,97 34,26 7,26 7,124 105,124 105,97"/>
+ <polygon fill="#F9B471" points="33,98 33,27 8,27 8,123 104,123 104,98"/>
+ <rect x="8" y="121.5" fill="#FCDAB8" width="96" height="1.5"/>
+ <path fill="#FCDAB8" d="M20,40v1h13v-1H20z M26,46h7v-1h-7V46z M26,52h7v-1h-7V52z M26,58h7v-1h-7V58z M26,64h7v-1h-7V64z M27,75h6 v-1h-7L27,75z M27,81h6v-1h-7L27,81z M27,87h6v-1h-7L27,87z M27,93h6v-1h-7L27,93z M21,69h12v-1H20L21,69z M21,98h12v-1H20L21,98z"/>
+ <rect x="33" y="98" fill="#FCDAB8" width="71" height="1"/>
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="19.9995" y1="67.5" x2="32.9995" y2="67.5">
+ <stop offset="0" style="stop-color: rgb(214, 114, 16);"/>
+ <stop offset="0.5449" style="stop-color: rgb(224, 119, 17);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_4_)" d="M20,38v2h13v-2H20z M26,45h7v-2h-7V45z M26,51h7v-2h-7V51z M26,57h7v-2h-7V57z M26,63h7v-2h-7V63z M26,74h7v-2h-7V74z M26,80h7v-2h-7V80z M26,86h7v-2h-7V86z M26,92h7v-2h-7V92z M20,68h13v-2H20V68z M20,97h13v-2H20V97z"/>
+ <path fill="#E07711" d="M35,111h2V97h-2V111z M40,105h2v-8h-2V105z M46,105h2v-8h-2V105z M52,105h2v-8h-2V105z M58,105h2v-8h-2V105 z M69,105h2v-8h-2V105z M75,105h2v-8h-2V105z M81,105h2v-8h-2V105z M87,105h2v-8h-2V105z M63,111h2V97h-2V111z M92,97v14h2V97H92z"/>
+ <path fill="#FCDAB8" d="M35,112.166h2V111h-2V112.166z M40,106.166h2V105h-2V106.166z M46,106.166h2V105h-2V106.166z M52,106.166h2 V105h-2V106.166z M58,106.166h2V105h-2V106.166z M63,112.166h2V111h-2V112.166z M69,106.166h2V105h-2V106.166z M75,106.166h2V105 h-2V106.166z M87,106h2v-1h-2V106z M92,111v1h2v-1H92z"/>
+ <path fill="#E04B00" d="M94,97h-2v1h2V97z M87,97v1h2v-1H87z M81,97v1h2v-1H81z M75,97v1h2v-1H75z M69,97v1h2v-1H69z M64,97v1h2v-1 H64z M58,97v1h2v-1H58z M52,97v1h2v-1H52z M46,97v1h2v-1H46z M40,97v1h2v-1H40z M35,97v1h2v-1H35z"/>
+ <rect x="8" y="27" fill="#FCDAB8" width="25" height="1"/>
+ <path fill="#E04B00" d="M33,38v2h1v-2H33z M33,45h1v-2h-1V45z M33,51h1v-2h-1V51z M33,57h1v-2h-1V57z M33,63h1v-2h-1V63z M33,68h1 v-2h-1V68z M33,74h1v-2h-1V74z M33,80h1v-2h-1V80z M33,86h1v-2h-1V86z M33,92h1v-2h-1V92z M33,97h1v-2h-1V97z"/>
+ <rect x="8" y="28" fill="#FCC48D" width="1" height="94"/>
+ <path opacity="0.1" d="M54.931,15.071c-0.747,0.317-1.218,1.055-1.218,1.844c0,0.129,0.013,0.259,0.039,0.39 c0.029,0.144,2.958,14.637,8.733,26.188c5.668,11.335,17.062,31.291,17.175,31.488c0.45,0.787,1.376,1.174,2.251,0.94 c0.874-0.231,1.485-1.026,1.485-1.933V54.013l-0.354-1.138c-0.001-0.001-25.684-37.102-25.684-37.102 C56.819,14.998,55.799,14.703,54.931,15.071z"/>
+ <path opacity="0.5" d="M55.121,14.491c-0.437,0.185-0.683,0.651-0.59,1.116c0.029,0.145,2.946,14.535,8.647,25.938l0,0 c5.654,11.309,17.034,31.239,17.148,31.439c0.226,0.393,0.687,0.586,1.125,0.47s0.743-0.513,0.743-0.966V52.512 c0-0.204-0.063-0.402-0.178-0.569L56.334,14.842C56.064,14.453,55.558,14.306,55.121,14.491z"/>
+ <path opacity="0.2" d="M55.121,16.491c-0.437,0.185-0.683,0.651-0.59,1.116c0.029,0.145,2.946,14.535,8.647,25.938l0,0 c5.654,11.309,17.034,31.239,17.148,31.439c0.226,0.393,0.687,0.586,1.125,0.47s0.743-0.513,0.743-0.966V54.512 c0-0.204-0.063-0.402-0.178-0.569L56.334,16.842C56.064,16.453,55.558,16.306,55.121,16.491z"/>
+ <linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="58.1685" y1="21.7676" x2="77.6685" y2="56.2676">
+ <stop offset="0" style="stop-color: rgb(114, 114, 115);"/>
+ <stop offset="1" style="stop-color: rgb(127, 126, 127);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_5_)" d="M55.512,15.412l25.683,37.101v19.976c0,0-11.415-19.976-17.122-31.391 C58.365,29.683,55.512,15.412,55.512,15.412z"/>
+ <polygon fill="#949599" points="55.512,15.412 81.195,53.458 81.195,52.512"/>
+ <path fill="#949599" d="M62.291,37.239c0.56,1.305,1.153,2.6,1.782,3.858c5.707,11.415,17.122,31.391,17.122,31.391v-2.199 C80.611,69.384,70.063,52.981,64.5,41.5C63.662,39.771,62.941,38.44,62.291,37.239z"/>
+ <path opacity="0.2" d="M94.791,74.121l-5.107,3.559c-0.424,0.295-0.553,0.865-0.297,1.315c0.406,0.712,9.951,17.464,11.947,20.458 l0.188,0.281c1.921,2.889,4.099,6.164,9.479,6.164c4.208,0,12.166-2.486,12.166-11.898c0-9.596-6.464-13-12-13 c-4.387,0-7.489,2.34-8.968,3.746c-1.079-1.863-5.97-10.307-5.97-10.307c-0.141-0.241-0.376-0.414-0.648-0.475 C95.306,73.904,95.021,73.961,94.791,74.121z M108.392,88.866c2.362-1.612,5.338-1.173,7.074,1.047 c0.815,1.042,1.166,2.426,0.987,3.896c-0.183,1.502-0.894,2.838-1.95,3.665c-1,0.782-2.098,1.103-3.174,0.925 c-1.259-0.209-2.42-1.077-3.357-2.512l0,0C105.445,92.021,106.312,90.285,108.392,88.866z"/>
+ <path opacity="0.2" fill="#333333" d="M80.621,3.614L80.621,3.614C80.058,3.847,79.695,4.391,79.695,5v74.5 c0,0.827,0.673,1.5,1.5,1.5h3.972c0.548,0,1.051-0.298,1.314-0.777c0,0,1.353-2.463,1.589-2.893 c0.154-0.121,6.535-5.154,6.535-5.154c0.362-0.287,0.57-0.715,0.57-1.177c0-0.014-0.004-0.108-0.004-0.122l-0.27-3.326 c-0.372-4.536-0.793-9.677-0.793-11.185c0-20.476-5.871-46.444-11.854-52.426C81.826,3.509,81.183,3.381,80.621,3.614z"/>
+ <path opacity="0.5" fill="#141414" d="M92.351,69.238l-5.098,4.342c-0.213,0.181-0.34,0.442-0.351,0.721 c-0.011,0.279,0.095,0.551,0.292,0.748l3.25,2.876c0.353,0.353,5.621-2.874,5.404-3.306l-1.955-5.066 c-0.138-0.275-0.395-0.471-0.695-0.533C92.898,68.959,92.586,69.039,92.351,69.238z"/>
+ <polygon fill="#999999" points="93,70 94.959,74.237 90.755,77.195 87.902,74.342"/>
+ <path opacity="0.4" fill="#333333" d="M80.804,3.076C80.435,3.231,80.195,3.596,80.195,4v74.5c0,0.553,0.442,1,0.987,1h3.922 c0.36,0,0.692-0.199,0.866-0.519c0,0,1.444-2.664,1.617-2.98c0.299-0.24,6.531-5.218,6.531-5.218 c0.238-0.191,0.375-0.48,0.375-0.784c0-0.026,0-0.054-0.003-0.081l-0.267-3.326c-0.367-4.547-0.783-9.701-0.783-11.226 c0-20.372-5.727-46.165-11.561-52.073C81.598,3.007,81.173,2.921,80.804,3.076z"/>
+ <linearGradient id="XMLID_6_" gradientUnits="userSpaceOnUse" x1="77.8511" y1="4.5283" x2="86.4412" y2="58.8908">
+ <stop offset="0" style="stop-color: rgb(184, 184, 185);"/>
+ <stop offset="1" style="stop-color: rgb(189, 189, 190);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_6_)" d="M93.675,69.998c-0.41-5.152-1.066-12.673-1.066-14.632C92.609,35.39,86.902,9.707,81.195,4v5.707 V78.5h3.972l1.735-3.158L93.675,69.998z"/>
+ <polygon fill="#ABA9AB" points="89.755,61.073 81.195,61.073 81.195,94.646 82.5,62.273"/>
+ <path opacity="0.2" d="M80.195,79.208c0,0,0,10.675,0,12.075c-1.264-3.047-17.122-2.092-17.122,14.117 c0,13.267,8.8,19.453,14.269,19.453c2.854,0,8.561-2.254,8.561-9.054c0-2.854,0-36.592,0-36.592H80.195z M80,115.5 c0,1.5-1.188,3.45-3.05,3.45c-2.784,0-7.95-5.616-7.95-12.171c0-12.603,11-10.496,11-9.279V115.5z"/>
+ <path opacity="0.2" d="M80.195,78.208c-0.553,0-1,0.448-1,1c0,0,0,7.665,0,10.272c-1.518-0.479-3.732-0.503-5.658-0.119 c-2.713,0.54-11.465,3.293-11.464,16.039c0,13.346,8.867,20.453,15.269,20.453c3.119,0,9.561-2.457,9.561-10.054V79.208 c0-0.552-0.447-1-1-1H80.195z M70,106.779c0-4.337,1.393-7.296,4.025-8.559c2.191-1.049,4.379-0.601,4.975-0.301 c0,0.803,0,17.58,0,17.58c0,0.999-0.799,2.45-2.05,2.45C74.991,117.95,70,112.996,70,106.779z"/>
+ <path fill="#292929" d="M80.195,78.208c0,0,0,10.675,0,12.075c-1.264-3.047-17.122-2.092-17.122,14.117 c0,13.267,8.8,19.453,14.269,19.453c2.854,0,8.561-2.254,8.561-9.054c0-2.854,0-36.592,0-36.592H80.195z M80,114.5 c0,1.5-1.188,3.45-3.05,3.45c-2.784,0-7.95-5.616-7.95-12.171c0-12.603,11-10.496,11-9.279V114.5z"/>
+ <path d="M81.743,79.208c0,1.695,0,11.159,0,11.159c0,0.461-0.344,0.818-0.802,0.932c-0.459,0.112-0.959-0.139-1.184-0.546 l0.025,0.046c-0.391-0.479-3.58-1.194-7.318,0.083c-3.172,1.083-8.393,4.306-8.392,13.71c0,13.141,8.918,18.595,13.692,18.595 c2.546,0,7.803-1.983,7.803-8.115c0,0,0-33.956,0-35.863C84.462,79.208,82.848,79.208,81.743,79.208z M68.125,105.982 c0-8.333,4.809-11.303,9.309-11.303c1.525,0,4.107,0.411,4.107,1.951v18.139c0,2.121-1.716,4.484-4.179,4.484 C73.882,119.254,68.125,113.051,68.125,105.982z"/>
+ <path opacity="0.2" d="M111.166,82c-5.707,0-9.166,4.398-9.166,4.398l-6.637-11.457L90.255,78.5c0,0,9.91,17.398,11.91,20.398 s3.834,6,8.834,6c3,0,11.166-1.697,11.166-10.898C122.166,85.75,117,82,111.166,82z M115.121,98.262 c-2.55,1.994-5.795,1.524-7.986-1.828c-2.744-4.197-1.98-6.568,0.693-8.394c2.719-1.854,6.321-1.433,8.426,1.257 C118.359,91.985,117.669,96.266,115.121,98.262z"/>
+ <path fill="#292929" d="M111.166,81c-5.707,0-9.166,4.398-9.166,4.398l-6.637-11.457L90.255,77.5c0,0,9.91,17.398,11.91,20.398 s3.834,6,8.834,6c3,0,11.166-1.697,11.166-10.898C122.166,84.75,117,81,111.166,81z M115.121,97.262 c-2.55,1.994-5.795,1.524-7.986-1.828c-2.744-4.197-1.98-6.568,0.693-8.394c2.719-1.854,6.321-1.433,8.426,1.257 C118.359,90.985,117.669,95.266,115.121,97.262z"/>
+ <path d="M91.777,77.498c1.96,3.433,9.706,16.973,11.422,19.546l0.188,0.282c1.881,2.829,3.506,5.272,7.813,5.272 c0.415,0,10.167-0.112,10.167-9.899c0-8.109-5.166-11-10-11c-5.131,0-8.351,3.979-8.383,4.02c-0.205,0.259-0.526,0.4-0.856,0.377 c-0.33-0.025-0.628-0.209-0.793-0.496c0,0-5.174-8.932-6.093-10.517C94.244,75.779,92.645,76.893,91.777,77.498z M111.203,99.07 c-1.825-0.301-3.452-1.474-4.705-3.39l0,0c-2.809-4.297-2.502-7.399,0.967-9.767c3.207-2.189,7.41-1.559,9.777,1.467 c1.145,1.462,1.641,3.369,1.397,5.369c-0.247,2.025-1.231,3.847-2.702,4.998C114.504,98.869,112.824,99.339,111.203,99.07z"/>
+ <polygon fill="#F8F9F8" points="82.09,60.273 89.755,61.073 81.195,61.073"/>
+ <polygon fill="#D2D6DE" points="81.195,61.073 81.195,4.5 81.544,5.273 82.273,60.182"/>
+ <circle fill="#F8F9F8" cx="87.028" cy="67.307" r="1.427"/>
+ <circle fill="#727375" cx="87.829" cy="68.007" r="1.427"/>
+</svg> \ No newline at end of file
diff --git a/icons/drag_nub.png b/icons/drag_nub.png
new file mode 100644
index 0000000..f16a85d
--- /dev/null
+++ b/icons/drag_nub.png
Binary files differ
diff --git a/icons/enhance.png b/icons/enhance.png
new file mode 100644
index 0000000..4f3dea1
--- /dev/null
+++ b/icons/enhance.png
Binary files differ
diff --git a/icons/filter-flagged.png b/icons/filter-flagged.png
new file mode 100755
index 0000000..ad5db78
--- /dev/null
+++ b/icons/filter-flagged.png
Binary files differ
diff --git a/icons/filter-photos.png b/icons/filter-photos.png
new file mode 100644
index 0000000..355aa85
--- /dev/null
+++ b/icons/filter-photos.png
Binary files differ
diff --git a/icons/filter-raw.png b/icons/filter-raw.png
new file mode 100644
index 0000000..9d94946
--- /dev/null
+++ b/icons/filter-raw.png
Binary files differ
diff --git a/icons/filter-videos.png b/icons/filter-videos.png
new file mode 100755
index 0000000..8634acd
--- /dev/null
+++ b/icons/filter-videos.png
Binary files differ
diff --git a/icons/five-star-filter.svg b/icons/five-star-filter.svg
new file mode 100644
index 0000000..2bc545a
--- /dev/null
+++ b/icons/five-star-filter.svg
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="four-star-filter-plus.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="150"
+ height="30"
+ viewBox="0 0 150 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3607"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-60.536186"
+ x2="-32.249207"
+ y1="-48.952423"
+ x1="-44.715599"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-4"
+ xlink:href="#path2428_1_-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-1"><stop
+ id="stop10-6"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-3"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective2875"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient3684"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-8"><stop
+ id="stop10-9-7"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3612"
+ id="linearGradient3618"
+ x1="49.337769"
+ y1="20.002615"
+ x2="40.295216"
+ y2="10.759528"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616" /></linearGradient><inkscape:perspective
+ id="perspective3697"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-9"
+ id="linearGradient3684-5"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-9"><stop
+ id="stop10-66"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-1"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889-7"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612-5"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614-5" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616-6" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient3758"
+ gradientUnits="userSpaceOnUse"
+ x1="40.655746"
+ y1="9.9033442"
+ x2="46.994576"
+ y2="17.4475" /><inkscape:perspective
+ id="perspective3789"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6"
+ xlink:href="#path2428_1_-34"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34"><stop
+ id="stop10-7"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective3850"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3"
+ xlink:href="#path2428_1_-34-4"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4"><stop
+ id="stop10-7-6"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective3948"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,148.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3-1"
+ xlink:href="#path2428_1_-34-4-2"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4-2"><stop
+ id="stop10-7-6-0"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2-1"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective4046"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,178.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3-1-0"
+ xlink:href="#path2428_1_-34-4-2-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4-2-1"><stop
+ id="stop10-7-6-0-1"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2-1-5"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="46.293199"
+ inkscape:cx="76.831212"
+ inkscape:zoom="4"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="M 14.974021,1.6037673 10.73812,10.270486 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.4768752,1.360062 6.877622,6.687061 c 0.091469,0.09256 0.1295816,0.225406 0.1001807,0.35281 L 6.3661051,28.33023 14.860775,23.860211 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 14.974021,1.6037673 z"
+ id="path2428-4-8" /><path
+ style="fill:url(#linearGradient3218);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6"
+ transform="translate(30,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 44.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 44.974021,1.603767 z"
+ id="path2428-4-8-2" /><path
+ style="fill:url(#linearGradient3218-6);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 44.977,2.7879997 41.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.7879997 z"
+ id="path2428-4-3" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2"
+ transform="translate(60,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 74.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 74.974021,1.603767 z"
+ id="path2428-4-8-2-1" /><path
+ style="fill:url(#linearGradient3218-6-3);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 74.977,2.7879997 71.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.7879997 z"
+ id="path2428-4-3-9" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2-3"
+ transform="translate(90,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 104.97402,1.603767 -4.2359,8.666719 c -0.0392,0.08275 -0.10671,0.149182 -0.18947,0.186205 -0.0229,0.01089 -0.0468,0.02069 -0.0708,0.02613 l -9.476877,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.494675,-4.470019 c 0.1078,-0.05444 0.23411,-0.05336 0.34192,0 l 8.47289,4.455862 -1.63338,-9.469253 c -0.0218,-0.11978 0.0174,-0.245006 0.10236,-0.33212 l 6.87544,-6.721906 -9.47469,-1.341551 c -0.12196,-0.01634 -0.22977,-0.09038 -0.28748,-0.200361 L 104.974,1.603767 z"
+ id="path2428-4-8-2-1-3" /><path
+ style="fill:url(#linearGradient3218-6-3-1);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 104.977,2.7879997 101.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.9410003 z"
+ id="path2428-4-3-9-3" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2-3-2"
+ transform="translate(120,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 134.97402,1.603767 -4.2359,8.666719 c -0.0392,0.08275 -0.10671,0.149182 -0.18947,0.186205 -0.0229,0.01089 -0.0468,0.02069 -0.0708,0.02613 l -9.47688,1.360062 6.87762,6.687061 c 0.0915,0.09256 0.12959,0.225406 0.10019,0.35281 l -1.6127,9.447476 8.49468,-4.470019 c 0.1078,-0.05444 0.23411,-0.05336 0.34192,0 l 8.47289,4.455862 -1.63338,-9.469253 c -0.0218,-0.11978 0.0174,-0.245006 0.10236,-0.33212 l 6.87544,-6.721906 -9.47469,-1.341551 c -0.12196,-0.01634 -0.22977,-0.09038 -0.28748,-0.200361 L 134.974,1.603767 z"
+ id="path2428-4-8-2-1-3-1" /><path
+ style="fill:url(#linearGradient3218-6-3-1-0);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 134.977,2.7879997 131.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.9410003 z"
+ id="path2428-4-3-9-3-7" /></g></svg> \ No newline at end of file
diff --git a/icons/five-stars.svg b/icons/five-stars.svg
new file mode 100644
index 0000000..ba450dc
--- /dev/null
+++ b/icons/five-stars.svg
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="four-stars.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="150"
+ height="30"
+ viewBox="0 0 150 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" />
+ </linearGradient>
+
+<inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_-3"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4042"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-0"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7"><stop
+ id="stop10-9-3"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4101"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051-2"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9"><stop
+ id="stop10-9-3-2"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4110"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4160"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4110-4"
+ xlink:href="#path2428_1_-3-7-9-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9-7"><stop
+ id="stop10-9-3-2-1"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,148.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4169"
+ xlink:href="#path2428_1_-3-7-9-7"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4219"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,148.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4169-0"
+ xlink:href="#path2428_1_-3-7-9-7-2"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9-7-2"><stop
+ id="stop10-9-3-2-1-5"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6-3-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,178.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4228"
+ xlink:href="#path2428_1_-3-7-9-7-2"
+ inkscape:collect="always" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="9.4130776"
+ inkscape:cx="92.914342"
+ inkscape:zoom="13.45"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0"
+ objecttolerance="10000"
+ guidetolerance="10000">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background"><rect
+ style="fill:#000000;fill-opacity:0.62222224;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+ id="rect3239"
+ width="150.03719"
+ height="30.037174"
+ x="0.074349441"
+ y="0.037174076" /></g><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:url(#linearGradient3218)"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><path
+ style="fill:url(#linearGradient4051);display:inline"
+ d="m 44.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.788 z"
+ id="path2428-4-1" /><path
+ style="fill:url(#linearGradient4110);display:inline"
+ d="m 74.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.788 z"
+ id="path2428-4-1-4" /><path
+ style="fill:url(#linearGradient4169);display:inline"
+ d="m 104.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.941 z"
+ id="path2428-4-1-4-9" /><path
+ style="fill:url(#linearGradient4228);display:inline"
+ d="m 134.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.941 z"
+ id="path2428-4-1-4-9-6" /></g></svg> \ No newline at end of file
diff --git a/icons/flag-page.png b/icons/flag-page.png
new file mode 100644
index 0000000..36e9491
--- /dev/null
+++ b/icons/flag-page.png
Binary files differ
diff --git a/icons/flag-trinket.png b/icons/flag-trinket.png
new file mode 100644
index 0000000..a160b72
--- /dev/null
+++ b/icons/flag-trinket.png
Binary files differ
diff --git a/icons/four-star-filter-plus.svg b/icons/four-star-filter-plus.svg
new file mode 100644
index 0000000..9a4216c
--- /dev/null
+++ b/icons/four-star-filter-plus.svg
@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="four-star-filter-plus.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="140"
+ height="30"
+ viewBox="0 0 140 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3607"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-60.536186"
+ x2="-32.249207"
+ y1="-48.952423"
+ x1="-44.715599"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-4"
+ xlink:href="#path2428_1_-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-1"><stop
+ id="stop10-6"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-3"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective2875"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient3684"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-8"><stop
+ id="stop10-9-7"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3612"
+ id="linearGradient3618"
+ x1="49.337769"
+ y1="20.002615"
+ x2="40.295216"
+ y2="10.759528"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616" /></linearGradient><inkscape:perspective
+ id="perspective3697"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-9"
+ id="linearGradient3684-5"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-9"><stop
+ id="stop10-66"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-1"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889-7"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612-5"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614-5" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616-6" /></linearGradient><inkscape:perspective
+ id="perspective3789"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6"
+ xlink:href="#path2428_1_-34"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34"><stop
+ id="stop10-7"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective3850"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3"
+ xlink:href="#path2428_1_-34-4"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4"><stop
+ id="stop10-7-6"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective3948"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,148.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3-1"
+ xlink:href="#path2428_1_-34-4-2"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4-2"><stop
+ id="stop10-7-6-0"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2-1"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="19.465697"
+ inkscape:cx="71.34808"
+ inkscape:zoom="8"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="text3633"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3744"
+ width="18.07069"
+ height="4.0127206"
+ x="119.87285"
+ y="12.834166" /><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3742"
+ width="4.0202866"
+ height="18.007797"
+ x="126.88173"
+ y="5.7885885" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="M 14.974021,1.6037673 10.73812,10.270486 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.4768752,1.360062 6.877622,6.687061 c 0.091469,0.09256 0.1295816,0.225406 0.1001807,0.35281 L 6.3661051,28.33023 14.860775,23.860211 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 14.974021,1.6037673 z"
+ id="path2428-4-8" /><path
+ style="fill:url(#linearGradient3218);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><g
+ style="font-size:37.43058395px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3684);fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif"
+ id="text3633"
+ transform="matrix(1.2245423,0,0,1.2245423,73.644182,-3.9917374)"><path
+ d="m 46.416154,8.3360248 0,5.7461792 5.724247,0 0,2.587974 -5.724247,0 0,5.746179 -2.609906,0 0,-5.746179 -5.724247,0 0,-2.587974 5.724247,0 0,-5.7461792 2.609906,0"
+ style="font-size:22.45834922999999961px;font-weight:bold;fill:#7d7d7d;fill-opacity:1;stroke:#000000;stroke-width:0.20000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+ id="path3638" /></g><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6"
+ transform="translate(30,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 44.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 44.974021,1.603767 z"
+ id="path2428-4-8-2" /><path
+ style="fill:url(#linearGradient3218-6);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 44.977,2.7879997 41.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.7879997 z"
+ id="path2428-4-3" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2"
+ transform="translate(60,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 74.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 74.974021,1.603767 z"
+ id="path2428-4-8-2-1" /><path
+ style="fill:url(#linearGradient3218-6-3);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 74.977,2.7879997 71.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.7879997 z"
+ id="path2428-4-3-9" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2-3"
+ transform="translate(90,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 104.97402,1.603767 -4.2359,8.666719 c -0.0392,0.08275 -0.10671,0.149182 -0.18947,0.186205 -0.0229,0.01089 -0.0468,0.02069 -0.0708,0.02613 l -9.476877,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.494675,-4.470019 c 0.1078,-0.05444 0.23411,-0.05336 0.34192,0 l 8.47289,4.455862 -1.63338,-9.469253 c -0.0218,-0.11978 0.0174,-0.245006 0.10236,-0.33212 l 6.87544,-6.721906 -9.47469,-1.341551 c -0.12196,-0.01634 -0.22977,-0.09038 -0.28748,-0.200361 l -4.28382,-8.647115 z"
+ id="path2428-4-8-2-1-3" /><path
+ style="fill:url(#linearGradient3218-6-3-1);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 104.977,2.7879997 101.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.9410003 z"
+ id="path2428-4-3-9-3" /></g></svg> \ No newline at end of file
diff --git a/icons/four-stars.svg b/icons/four-stars.svg
new file mode 100644
index 0000000..04f85c4
--- /dev/null
+++ b/icons/four-stars.svg
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="three-stars.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="120"
+ height="30"
+ viewBox="0 0 120 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" />
+ </linearGradient>
+
+<inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_-3"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4042"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-0"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7"><stop
+ id="stop10-9-3"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4101"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051-2"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9"><stop
+ id="stop10-9-3-2"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4110"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4160"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4110-4"
+ xlink:href="#path2428_1_-3-7-9-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9-7"><stop
+ id="stop10-9-3-2-1"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,148.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4169"
+ xlink:href="#path2428_1_-3-7-9-7"
+ inkscape:collect="always" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="9.4130776"
+ inkscape:cx="94.205517"
+ inkscape:zoom="13.45"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0"
+ objecttolerance="10000"
+ guidetolerance="10000">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background"><rect
+ style="fill:#000000;fill-opacity:0.62222224;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+ id="rect3239"
+ width="120.00001"
+ height="30.037174"
+ x="0.074349441"
+ y="0.037174076" /></g><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:url(#linearGradient3218)"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><path
+ style="fill:url(#linearGradient4051);display:inline"
+ d="m 44.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.788 z"
+ id="path2428-4-1" /><path
+ style="fill:url(#linearGradient4110);display:inline"
+ d="m 74.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.788 z"
+ id="path2428-4-1-4" /><path
+ style="fill:url(#linearGradient4169);display:inline"
+ d="m 104.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 c -0.112,-0.015 -0.211,-0.083 -0.264,-0.184 l -3.934,-7.941 z"
+ id="path2428-4-1-4-9" /></g></svg> \ No newline at end of file
diff --git a/icons/generic-plugin.png b/icons/generic-plugin.png
new file mode 100644
index 0000000..7ad74bd
--- /dev/null
+++ b/icons/generic-plugin.png
Binary files differ
diff --git a/icons/image-adjust.svg b/icons/image-adjust.svg
new file mode 100644
index 0000000..b9f130c
--- /dev/null
+++ b/icons/image-adjust.svg
@@ -0,0 +1,369 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="24"
+ id="svg2976"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="image-adjust.svg">
+ <defs
+ id="defs2978">
+ <linearGradient
+ id="linearGradient3672">
+ <stop
+ offset="0"
+ style="stop-color:#808080;stop-opacity:1;"
+ id="stop3674" />
+ <stop
+ offset="1"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ id="stop3676" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="0"
+ id="stop3626" />
+ <stop
+ id="stop3638"
+ offset="0.16829631"
+ style="stop-color:#f57900;stop-opacity:1;" />
+ <stop
+ id="stop3636"
+ offset="0.34493041"
+ style="stop-color:#edd400;stop-opacity:1;" />
+ <stop
+ id="stop3634"
+ offset="0.51930183"
+ style="stop-color:#73d216;stop-opacity:1;" />
+ <stop
+ id="stop3632"
+ offset="0.69330686"
+ style="stop-color:#3465a4;stop-opacity:1;" />
+ <stop
+ style="stop-color:#75507b;stop-opacity:1;"
+ offset="0.82747382"
+ id="stop3640" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="1"
+ id="stop3628" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3650">
+ <stop
+ id="stop3662"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ <stop
+ id="stop3664"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective3141"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3672-0"
+ id="linearGradient3670"
+ gradientUnits="userSpaceOnUse"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6" />
+ <linearGradient
+ id="linearGradient3672-0">
+ <stop
+ offset="0"
+ style="stop-color:#808080;stop-opacity:1;"
+ id="stop3674-1" />
+ <stop
+ offset="1"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ id="stop3676-0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3624-1"
+ id="linearGradient3630"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3624-1">
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="0"
+ id="stop3626-3" />
+ <stop
+ id="stop3638-7"
+ offset="0.16829631"
+ style="stop-color:#f57900;stop-opacity:1;" />
+ <stop
+ id="stop3636-7"
+ offset="0.34493041"
+ style="stop-color:#edd400;stop-opacity:1;" />
+ <stop
+ id="stop3634-2"
+ offset="0.51930183"
+ style="stop-color:#73d216;stop-opacity:1;" />
+ <stop
+ id="stop3632-6"
+ offset="0.69330686"
+ style="stop-color:#3465a4;stop-opacity:1;" />
+ <stop
+ style="stop-color:#75507b;stop-opacity:1;"
+ offset="0.82747382"
+ id="stop3640-4" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="1"
+ id="stop3628-5" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3650-2"
+ id="linearGradient3648"
+ gradientUnits="userSpaceOnUse"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6" />
+ <linearGradient
+ id="linearGradient3650-2">
+ <stop
+ id="stop3662-0"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ <stop
+ id="stop3664-2"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective3259"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3672-2"
+ id="linearGradient3768"
+ gradientUnits="userSpaceOnUse"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6" />
+ <linearGradient
+ id="linearGradient3672-2">
+ <stop
+ offset="0"
+ style="stop-color:#808080;stop-opacity:1;"
+ id="stop3674-6" />
+ <stop
+ offset="1"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ id="stop3676-9" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3624-10"
+ id="linearGradient3764"
+ gradientUnits="userSpaceOnUse"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6" />
+ <linearGradient
+ id="linearGradient3624-10">
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="0"
+ id="stop3626-4" />
+ <stop
+ id="stop3638-2"
+ offset="0.16829631"
+ style="stop-color:#f57900;stop-opacity:1;" />
+ <stop
+ id="stop3636-74"
+ offset="0.34493041"
+ style="stop-color:#edd400;stop-opacity:1;" />
+ <stop
+ id="stop3634-0"
+ offset="0.51930183"
+ style="stop-color:#73d216;stop-opacity:1;" />
+ <stop
+ id="stop3632-3"
+ offset="0.69330686"
+ style="stop-color:#3465a4;stop-opacity:1;" />
+ <stop
+ style="stop-color:#75507b;stop-opacity:1;"
+ offset="0.82747382"
+ id="stop3640-2" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1;"
+ offset="1"
+ id="stop3628-8" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3650-0"
+ id="linearGradient3772"
+ gradientUnits="userSpaceOnUse"
+ x1="3.5"
+ y1="6"
+ x2="28.5"
+ y2="6" />
+ <linearGradient
+ id="linearGradient3650-0">
+ <stop
+ id="stop3662-3"
+ offset="0"
+ style="stop-color:#2e3436;stop-opacity:1;" />
+ <stop
+ id="stop3664-7"
+ offset="1"
+ style="stop-color:#eeeeec;stop-opacity:1;" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="38.432192"
+ inkscape:cy="20.49805"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1024"
+ inkscape:window-height="719"
+ inkscape:window-x="1024"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3110"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2981">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ transform="translate(0,-24)">
+ <rect
+ ry="0.5"
+ rx="0.5"
+ y="26.499863"
+ x="2.5"
+ height="5"
+ width="19.000275"
+ id="rect3678"
+ style="fill:#eeeeec;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ ry="0.5"
+ rx="0.5"
+ style="fill:#eeeeec;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3680"
+ width="19.000275"
+ height="5"
+ x="2.5"
+ y="33.499863" />
+ <rect
+ ry="0.5"
+ rx="0.5"
+ y="40.5"
+ x="2.5"
+ height="5"
+ width="19.000275"
+ id="rect3682"
+ style="fill:#eeeeec;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z"
+ id="path3684"
+ style="fill:url(#linearGradient3772);fill-opacity:1;stroke:none"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ inkscape:radius="-1"
+ sodipodi:type="inkscape:offset"
+ transform="matrix(0.72,0,0,0.8,0.48013733,38.199863)" />
+ <path
+ transform="matrix(0.72,0,0,0.8,0.48013733,24.199863)"
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ style="fill:url(#linearGradient3764);fill-opacity:1;stroke:none"
+ id="path3686"
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z" />
+ <path
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z"
+ id="path3692"
+ style="fill:url(#linearGradient3768);fill-opacity:1;stroke:none"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ inkscape:radius="-1"
+ sodipodi:type="inkscape:offset"
+ transform="matrix(0.72000001,0,0,0.8,0.48013733,31.199863)" />
+ <path
+ transform="matrix(0.68,0,0,0.59999999,1.1201373,32.399863)"
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ style="opacity:0.60439561;fill:none;stroke:#ffffff;stroke-width:1.56556082;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3694"
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z" />
+ <path
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z"
+ id="path3770"
+ style="opacity:0.60439561;fill:none;stroke:#ffffff;stroke-width:1.56556082;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ inkscape:radius="-1"
+ sodipodi:type="inkscape:offset"
+ transform="matrix(0.68,0,0,0.59999999,1.1201373,25.399863)" />
+ <path
+ d="m 3.5,3.5 0,5 25,0 0,-5 -25,0 z"
+ id="path3774"
+ style="opacity:0.60439561;fill:none;stroke:#ffffff;stroke-width:1.56556082;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:original="M 3 2.5 C 2.723 2.5 2.5 2.723 2.5 3 L 2.5 9 C 2.5 9.277 2.723 9.5 3 9.5 L 29 9.5 C 29.277 9.5 29.5 9.277 29.5 9 L 29.5 3 C 29.5 2.723 29.277 2.5 29 2.5 L 3 2.5 z "
+ inkscape:radius="-1"
+ sodipodi:type="inkscape:offset"
+ transform="matrix(0.68,0,0,0.59999999,1.1201373,39.399863)" />
+ </g>
+</svg>
diff --git a/icons/import-all.png b/icons/import-all.png
new file mode 100644
index 0000000..c9a24ec
--- /dev/null
+++ b/icons/import-all.png
Binary files differ
diff --git a/icons/import.svg b/icons/import.svg
new file mode 100644
index 0000000..64efde4
--- /dev/null
+++ b/icons/import.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="0 0 128 128" overflow="visible" enable-background="new 0 0 128 128" xml:space="preserve">
+ <path opacity="0.2" fill="#1A1A1A" d="M125,106c0,6.286-2.713,9-9,9H14c-6.286,0-9-2.714-9-9V24c0-6.287,2.714-9,9-9h102 c6.287,0,9,2.713,9,9V106z"/>
+ <path opacity="0.2" fill="#1A1A1A" d="M124.25,107c0,6.286-2.68,9-8.888,9H14.638c-6.208,0-8.888-2.714-8.888-9V25 c0-6.287,2.68-9,8.888-9h100.725c6.208,0,8.888,2.713,8.888,9V107z"/>
+ <path opacity="0.4" fill="#1A1A1A" d="M14,12C7.178,12,4,15.178,4,22v82c0,6.822,3.178,10,10,10h102c6.822,0,10-3.178,10-10V22 c0-6.822-3.178-10-10-10H14z"/>
+ <linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="23.3413" y1="24" x2="119.5405" y2="114.0588">
+ <stop offset="0" style="stop-color: rgb(248, 249, 248);"/>
+ <stop offset="1" style="stop-color: rgb(231, 231, 230);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_7_)" d="M125,104c0,6.286-2.713,9-9,9H14c-6.286,0-9-2.714-9-9V22c0-6.287,2.714-9,9-9h102 c6.287,0,9,2.713,9,9V104z"/>
+ <rect x="16" y="36" fill="#003A8F" width="98" height="52"/>
+ <rect x="17" y="37" fill="#FFFFFF" width="98" height="52"/>
+ <radialGradient id="XMLID_8_" cx="44" cy="46" r="94.8685" gradientUnits="userSpaceOnUse">
+ <stop offset="0" style="stop-color: rgb(83, 142, 212);"/>
+ <stop offset="1" style="stop-color: rgb(0, 25, 64);"/>
+ </radialGradient>
+ <rect x="16" y="50" fill="url(#XMLID_8_)" width="98" height="38"/>
+ <rect x="16" y="36" fill="#296096" width="98" height="14"/>
+ <path fill="#52463A" d="M67,87.951c-2.975-3.135-5.95-6.269-11.899-6.269c-5.949,0-20.823-6.271-20.823-6.271 s-11.899-6.27-17.849-6.27c0,6.27,0,18.809,0,18.809H67z"/>
+ <linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="70.2695" y1="26.522" x2="57.2696" y2="73.522">
+ <stop offset="0" style="stop-color: rgb(101, 162, 220);"/>
+ <stop offset="0.5674" style="stop-color: rgb(78, 131, 194);"/>
+ <stop offset="1" style="stop-color: rgb(136, 174, 194);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_9_)" d="M113,54.143c-30,0-84,11.429-96,22.857V37h96V54.143z"/>
+ <linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="18.6816" y1="75.5381" x2="49.1252" y2="91.7747">
+ <stop offset="0" style="stop-color: rgb(124, 130, 113);"/>
+ <stop offset="1" style="stop-color: rgb(120, 103, 85);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_10_)" d="M65.5,88c-2.912-2.833-5.823-5.666-11.647-5.666c-5.823,0-20.382-5.667-20.382-5.667 S21.823,71,16,71c0,5.667,0,17,0,17H65.5z"/>
+ <path fill="#CBC7B8" d="M17,77c1.74-1.657,4.369-3.314,7.675-4.938c-2.697-0.968-5.513-1.774-7.675-1.902V77z"/>
+ <path fill="#52463A" d="M83.939,87.955c0,0,2.728-4.596,6.291-4.596c3.564,0,4.401,4.596,4.401,4.596H83.939z"/>
+
+ <linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="85.4639" y1="86.5039" x2="94.0352" y2="86.5039" gradientTransform="matrix(1, 0, -0.1353, 0.9324, 11.5082, 5.4565)">
+ <stop offset="0" style="stop-color: rgb(124, 130, 113);"/>
+ <stop offset="1" style="stop-color: rgb(120, 103, 85);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_11_)" d="M85,87.955c0,0,2.187-3.685,5.043-3.685c2.857,0,3.528,3.685,3.528,3.685H85z"/>
+ <linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="41" y1="47.7856" x2="101.25" y2="47.7856">
+ <stop offset="0" style="stop-color: rgb(96, 133, 185);"/>
+ <stop offset="1" style="stop-color: rgb(55, 73, 122);"/>
+ </linearGradient>
+ <path fill="url(#XMLID_12_)" d="M45.288,50.143h67.215c-1.565-2.777-4.952-4.714-8.909-4.714H54.199 C50.241,45.429,46.853,47.366,45.288,50.143z"/>
+ <path fill="#BCAC8D" d="M27.793,76.766c-1.633-2.153-4.843-3.357-5.856-0.658c-1.012,2.697-2.025,5.396-2.025,5.396l6.983,4.161 L27.793,76.766z"/>
+ <path fill="#56573F" d="M30.825,76.912C30.327,79.664,27,87,27,87h-8c0,0,8.157-11.922,9.991-11.005 C30.825,76.912,30.825,76.912,30.825,76.912z"/>
+ <path fill="#3A434C" d="M30,86c0,0,5.228-2.161,6.918-3.625s2.457-3.311,2.457-3.311l-4.461,0.313L30,86z"/>
+ <path fill="#BCAC8D" d="M37,81c-2-1-5-1-5,1s0,4,0,4l7,1L37,81z"/>
+ <path fill="#BCAC8D" d="M46,82.493c-2-0.751-5-0.751-5,0.751c0,1.503,0,3.005,0,3.005L48,87L46,82.493z"/>
+ <path fill="#94876F" d="M53.794,83.459c-1.85-0.699-3.949-0.699-3.047,0.699c0.901,1.399,1.803,2.799,1.803,2.799l5.348,0.699 L53.794,83.459z"/>
+ <path fill="#53634C" d="M51,86c0,0-4-4-6-5s-4-1-4-1l2,4L51,86z"/>
+</svg> \ No newline at end of file
diff --git a/icons/make-primary.svg b/icons/make-primary.svg
new file mode 100644
index 0000000..150e143
--- /dev/null
+++ b/icons/make-primary.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg>
+<svg width="400" height="400" viewBox="-100 -100 200 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g id="2">
+ <g id="1">
+ <circle cx="60" r="20"/>
+ <path d="M 0,0 h 60" stroke="black" stroke-width="10"/>
+ </g>
+ <use xlink:href="#1" transform="scale(-1, -1)"/>
+ </g>
+ <use xlink:href="#2" transform="rotate(60)"/>
+ <use xlink:href="#2" transform="rotate(-60)"/>
+</svg> \ No newline at end of file
diff --git a/icons/merge.svg b/icons/merge.svg
new file mode 100644
index 0000000..a150871
--- /dev/null
+++ b/icons/merge.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0"
+ id="svg2" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-filename="D:\proj\icons\released\icon_star.png" sodipodi:version="0.32" inkscape:version="0.46" sodipodi:docbase="D:\gfx" sodipodi:docname="icon_star.svg" inkscape:export-xdpi="45" inkscape:export-ydpi="45" sodipodi:modified="TRUE" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px"
+ viewBox="0 0 30 30" enable-background="new 0 0 30 30" xml:space="preserve">
+<sodipodi:namedview width="30px" height="30px" id="base" borderopacity="1.0" showguides="true" showgrid="false" inkscape:cx="9.9653605" inkscape:zoom="19.021172" gridtolerance="10000" inkscape:cy="13.102534" bordercolor="#666666" pagecolor="#ffffff" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:grid-points="true" inkscape:window-width="1679" inkscape:window-height="1003" inkscape:window-x="1" inkscape:window-y="20" inkscape:snap-global="true">
+ <inkscape:grid type="xygrid" id="grid2395"></inkscape:grid>
+</sodipodi:namedview>
+<sodipodi:namedview width="30px" height="30px" id="base" borderopacity="1.0" showguides="true" showgrid="false" inkscape:cx="9.9653605" inkscape:zoom="19.021172" gridtolerance="10000" inkscape:cy="13.102534" bordercolor="#666666" pagecolor="#ffffff" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:grid-points="true" inkscape:window-width="1679" inkscape:window-height="1003" inkscape:window-x="1" inkscape:window-y="20" inkscape:snap-global="true">
+ <inkscape:grid type="xygrid" id="grid2395"></inkscape:grid>
+</sodipodi:namedview>
+<sodipodi:namedview width="30px" height="30px" id="base" borderopacity="1.0" showguides="true" showgrid="false" inkscape:cx="9.9653605" inkscape:zoom="19.021172" gridtolerance="10000" inkscape:cy="13.102534" bordercolor="#666666" pagecolor="#ffffff" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:grid-points="true" inkscape:window-width="1679" inkscape:window-height="1003" inkscape:window-x="1" inkscape:window-y="20" inkscape:snap-global="true">
+ <inkscape:grid type="xygrid" id="grid2395"></inkscape:grid>
+</sodipodi:namedview>
+<sodipodi:namedview width="30px" height="30px" id="base" borderopacity="1.0" showguides="true" showgrid="false" inkscape:cx="9.9653605" inkscape:zoom="19.021172" gridtolerance="10000" inkscape:cy="13.102534" bordercolor="#666666" pagecolor="#ffffff" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:grid-points="true" inkscape:window-width="1679" inkscape:window-height="1003" inkscape:window-x="1" inkscape:window-y="20" inkscape:snap-global="true">
+ <inkscape:grid type="xygrid" id="grid2395"></inkscape:grid>
+</sodipodi:namedview>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="15.0005" y1="31.373" x2="15.0005" y2="3.8685">
+ <stop offset="0" style="stop-color:#F15A24"/>
+ <stop offset="1" style="stop-color:#FCEE5C"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" stroke="#000000" stroke-width="0.432" d="M15,29.288c0.913,0,1.748-0.381,2.347-0.98l11.037-11.037
+ c0.6-0.597,0.979-1.433,0.979-2.346c0-0.912-0.359-1.694-0.957-2.292L17.347,1.605c-0.599-0.601-1.434-0.98-2.347-0.98
+ c-0.914,0-1.75,0.38-2.347,0.98L1.594,12.632c-0.599,0.597-0.957,1.38-0.957,2.292c0,0.914,0.379,1.75,0.98,2.346l11.037,11.036
+ C13.25,28.907,14.086,29.288,15,29.288z"/>
+<g>
+ <path d="M15.992,10.276c0,2.439,3.201,7.369,5.641,7.369v2.315c-3.717,0-7.956-5.966-7.956-9.684"/>
+ <polygon points="9.824,10.42 19.977,10.42 14.901,5.344 "/>
+ <path d="M13.677,10.276c0,2.439-3.201,7.369-5.641,7.369v2.315c3.718,0,7.957-5.966,7.957-9.684"/>
+</g>
+</svg>
diff --git a/icons/multiple-events.png b/icons/multiple-events.png
new file mode 100644
index 0000000..17c8a4a
--- /dev/null
+++ b/icons/multiple-events.png
Binary files differ
diff --git a/icons/multiple-tags.png b/icons/multiple-tags.png
new file mode 100644
index 0000000..5c09cf2
--- /dev/null
+++ b/icons/multiple-tags.png
Binary files differ
diff --git a/icons/no-event.png b/icons/no-event.png
new file mode 100644
index 0000000..d764c04
--- /dev/null
+++ b/icons/no-event.png
Binary files differ
diff --git a/icons/noninterpretable-video.png b/icons/noninterpretable-video.png
new file mode 100644
index 0000000..d42514e
--- /dev/null
+++ b/icons/noninterpretable-video.png
Binary files differ
diff --git a/icons/one-event.png b/icons/one-event.png
new file mode 100644
index 0000000..dadf2e6
--- /dev/null
+++ b/icons/one-event.png
Binary files differ
diff --git a/icons/one-star-filter-plus.svg b/icons/one-star-filter-plus.svg
new file mode 100644
index 0000000..a104e8d
--- /dev/null
+++ b/icons/one-star-filter-plus.svg
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="one-star-filter-plus.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="50"
+ height="30"
+ viewBox="0 0 50 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3748"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3750" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3752" /></linearGradient><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3607"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-60.536186"
+ x2="-32.249207"
+ y1="-48.952423"
+ x1="-44.715599"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-4"
+ xlink:href="#path2428_1_-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-1"><stop
+ id="stop10-6"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-3"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective2875"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient3684"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-8"><stop
+ id="stop10-9-7"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3612"
+ id="linearGradient3618"
+ x1="49.337769"
+ y1="20.002615"
+ x2="40.295216"
+ y2="10.759528"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616" /></linearGradient><linearGradient
+ y2="18.059975"
+ x2="47.913288"
+ y1="10.133021"
+ x1="40.400551"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3697"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-9"
+ id="linearGradient3684-5"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-9"><stop
+ id="stop10-66"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-1"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889-7"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612-5"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614-5" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616-6" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3711"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3748"
+ id="linearGradient3754"
+ x1="37.982001"
+ y1="15.376191"
+ x2="52.240401"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="22.715697"
+ inkscape:cx="-14.265373"
+ inkscape:zoom="8"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3744"
+ width="18.07069"
+ height="4.0127206"
+ x="29.87285"
+ y="12.834166" /><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3742"
+ width="4.0202866"
+ height="18.007797"
+ x="36.881729"
+ y="5.7885885" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="M 14.974021,1.6037673 10.73812,10.270486 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.4768752,1.360062 6.877622,6.687061 c 0.091469,0.09256 0.1295816,0.225406 0.1001807,0.35281 L 6.3661051,28.33023 14.860775,23.860211 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 14.974021,1.6037673 z"
+ id="path2428-4-8" /><path
+ style="fill:url(#linearGradient3218);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><g
+ style="font-size:37.43058394999999905px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3684);fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif;opacity:1"
+ id="text3633"
+ transform="matrix(1.2245423,0,0,1.2245423,-16.355818,-3.9917374)"><path
+ d="m 46.416154,8.3360248 0,5.7461792 5.724247,0 0,2.587974 -5.724247,0 0,5.746179 -2.609906,0 0,-5.746179 -5.724247,0 0,-2.587974 5.724247,0 0,-5.7461792 2.609906,0"
+ style="font-size:22.45834922999999961px;font-weight:bold;fill:#7d7d7d;fill-opacity:1;stroke:#000000;stroke-width:0.20000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+ id="path3638" /></g></g></svg> \ No newline at end of file
diff --git a/icons/one-star.svg b/icons/one-star.svg
new file mode 100644
index 0000000..35e36d8
--- /dev/null
+++ b/icons/one-star.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="rating.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="30"
+ height="30"
+ viewBox="0 0 30 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_-3"
+ inkscape:collect="always" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="15.361033"
+ inkscape:cx="11.115243"
+ inkscape:zoom="13.45"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background"><rect
+ style="fill:#000000;fill-opacity:0.62222224;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+ id="rect3239"
+ width="30.037176"
+ height="30.037174"
+ x="0.074349441"
+ y="0.037174076" /></g><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:url(#linearGradient3218)"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /></g></svg> \ No newline at end of file
diff --git a/icons/one-tag.png b/icons/one-tag.png
new file mode 100644
index 0000000..fb456c7
--- /dev/null
+++ b/icons/one-tag.png
Binary files differ
diff --git a/icons/pin-toolbar.svg b/icons/pin-toolbar.svg
new file mode 100755
index 0000000..bdda67a
--- /dev/null
+++ b/icons/pin-toolbar.svg
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="24"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="pin-toolbar.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4033">
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1;"
+ offset="0"
+ id="stop4035" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="1"
+ id="stop4037" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3998">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="0"
+ id="stop4000" />
+ <stop
+ style="stop-color:#888a85;stop-opacity:1;"
+ offset="1"
+ id="stop4002" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(564,-2289)"
+ y2="2313.4915"
+ x2="-553.92468"
+ y1="2312.9053"
+ x1="-555.33148"
+ gradientUnits="userSpaceOnUse"
+ id="SVGID_1_">
+ <stop
+ id="stop2829"
+ style="stop-color:#FFFFFF"
+ offset="0" />
+
+ <stop
+ id="stop2831"
+ style="stop-color:#000000"
+ offset="1" />
+
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(-0.6898,-0.724,-0.724,0.6898,-2402.6819,-3539.5129)"
+ y2="701.80103"
+ x2="-4245.8159"
+ y1="706.7207"
+ x1="-4236.2666"
+ gradientUnits="userSpaceOnUse"
+ id="SVGID_2_">
+ <stop
+ id="stop2836"
+ style="stop-color:#D97A36"
+ offset="0" />
+
+ <stop
+ id="stop2838"
+ style="stop-color:#FBB03B"
+ offset="1" />
+
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(376,-1526)"
+ y2="1533.7778"
+ x2="-363.8967"
+ y1="1537.7227"
+ x1="-356.2388"
+ gradientUnits="userSpaceOnUse"
+ id="SVGID_3_">
+ <stop
+ id="stop2843"
+ style="stop-color:#D97A36"
+ offset="0" />
+
+ <stop
+ id="stop2845"
+ style="stop-color:#FBB03B"
+ offset="1" />
+
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.914,0.4056,-0.4056,0.914,511.3918,-1493.9607)"
+ y2="1567.5454"
+ x2="153.24541"
+ y1="1571.6094"
+ x1="161.1338"
+ gradientUnits="userSpaceOnUse"
+ id="SVGID_4_">
+ <stop
+ id="stop2850"
+ style="stop-color:#D97A36"
+ offset="0" />
+
+ <stop
+ id="stop2852"
+ style="stop-color:#FBB03B"
+ offset="1" />
+
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_1_"
+ id="linearGradient3751"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(564,-2289)"
+ x1="-555.33148"
+ y1="2312.9053"
+ x2="-553.92468"
+ y2="2313.4915" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_2_"
+ id="linearGradient3753"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1.1358031,-1.1461985,-1.1921158,1.0920549,-3956.2979,-4598.6415)"
+ x1="-4236.2666"
+ y1="706.7207"
+ x2="-4245.8159"
+ y2="701.80103" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_3_"
+ id="linearGradient3755"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.629457,0,0,1.5995712,612.68113,-1436.2782)"
+ x1="-356.2388"
+ y1="1537.7227"
+ x2="-363.8967"
+ y2="1533.7778" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#SVGID_4_"
+ id="linearGradient3757"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4570086,0.65492263,-0.64656748,1.4758365,815.29868,-1408.5385)"
+ x1="161.1338"
+ y1="1571.6094"
+ x2="153.24541"
+ y2="1567.5454" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4198"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="radialGradient4200"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99436734,0.00472242,0.00255798,0.54156932,-2.7508561,472.71224)"
+ cx="14.125"
+ cy="1031.8622"
+ fx="14.125"
+ fy="1031.8622"
+ r="12" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4202"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.97717252,6.2838499e-4,6.2838483e-4,0.97789819,-0.34457168,22.979736)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4204"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4257"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="radialGradient4259"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99436734,0.00472242,0.00255798,0.54156932,-2.7508561,472.71224)"
+ cx="14.125"
+ cy="1031.8622"
+ fx="14.125"
+ fy="1031.8622"
+ r="12" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4261"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.97717252,6.2838499e-4,6.2838483e-4,0.97789819,-0.34457168,22.979736)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4263"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4277"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4279"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0019995,-0.02085632,-0.02085633,0.97791683,21.488612,23.412187)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="radialGradient4281"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99796277,6.4801146e-5,3.510518e-5,0.54060371,0.00892039,474.07905)"
+ cx="14.125"
+ cy="1031.8622"
+ fx="14.125"
+ fy="1031.8622"
+ r="12" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4291"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4297"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="radialGradient4358"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99796277,6.4801146e-5,3.510518e-5,0.54060371,0.00892039,474.07905)"
+ cx="14.125"
+ cy="1031.8622"
+ fx="14.125"
+ fy="1031.8622"
+ r="12" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4360"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0019995,-0.02085632,-0.02085633,0.97791683,21.488612,23.412187)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4362"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4379"
+ gradientUnits="userSpaceOnUse"
+ x1="11.5"
+ y1="6"
+ x2="33.5"
+ y2="6" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99147534,-0.00770029,-0.0077003,0.98258395,8.6501676,17.917358)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="radialGradient4385"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0052838,-0.0016392,-8.8790128e-4,0.5435035,1.2064928,471.64277)"
+ cx="14.125"
+ cy="1031.8622"
+ fx="14.125"
+ fy="1031.8622"
+ r="12" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4389"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4411"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99147534,-0.00770029,-0.0077003,0.98258395,8.6501676,17.917358)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4033"
+ id="linearGradient4415"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99147534,-0.00770029,-0.0077003,0.98258395,8.6501676,17.917358)"
+ x1="15"
+ y1="1020.3622"
+ x2="25.875"
+ y2="1020.3622" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3998"
+ id="linearGradient4421"
+ gradientUnits="userSpaceOnUse"
+ x1="10.893434"
+ y1="33.517208"
+ x2="13.106566"
+ y2="33.517208" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#bcbcbc"
+ borderopacity="1"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-178.4079"
+ inkscape:cy="1.8840601"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1024"
+ inkscape:window-height="719"
+ inkscape:window-x="1024"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3733"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <g
+ transform="matrix(0.44705555,0.2500323,-0.25810765,0.43306865,267.7515,589.83299)"
+ id="g4188">
+ <g
+ id="g4287"
+ transform="matrix(0.96451465,-0.0070708,-0.0070708,0.95634998,9.0253063,45.60349)"
+ style="stroke-width:1.44913375;stroke-miterlimit:4;stroke-dasharray:none">
+ <path
+ sodipodi:type="star"
+ style="fill:url(#linearGradient4421);fill-opacity:1;stroke:none"
+ id="path3826"
+ sodipodi:sides="3"
+ sodipodi:cx="12"
+ sodipodi:cy="34"
+ sodipodi:r1="2.236068"
+ sodipodi:r2="1.118034"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 13.936492,35.118034 -3.872984,0 L 12,31.763932 l 1.936492,3.354102 z"
+ transform="matrix(1.8073922,0,0,-6.5591326,0.31129339,1260.206)" />
+ <path
+ transform="matrix(1.8086773,0.00916212,-0.03324985,-6.6021899,1.2231039,1261.5381)"
+ d="m 13.936492,35.118034 -3.872984,0 L 12,31.763932 l 1.936492,3.354102 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5707963"
+ sodipodi:arg1="0.52359878"
+ sodipodi:r2="1.118034"
+ sodipodi:r1="2.236068"
+ sodipodi:cy="34"
+ sodipodi:cx="12"
+ sodipodi:sides="3"
+ id="path4011"
+ style="fill:none;stroke:#555753;stroke-width:0.59306389;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="star" />
+ </g>
+ <path
+ sodipodi:nodetypes="cscss"
+ d="m 22.666072,1026.4067 c -6.035362,0.011 -12.8270327,3.311 -11.69845,8.4475 0.651145,2.9635 7.614542,3.5999 11.424764,3.5935 4.318248,-0.01 10.775734,-0.6651 11.436566,-3.6308 1.14537,-5.1401 -5.127515,-8.4202 -11.16288,-8.4102 z"
+ style="fill:url(#radialGradient4385);fill-opacity:1;stroke:#204a87;stroke-width:1.96821022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3974" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1.9123493"
+ inkscape:original="M 22.65625 1026.4062 C 16.620888 1026.4172 9.8401673 1029.7072 10.96875 1034.8438 C 11.619895 1037.8073 18.596028 1038.4439 22.40625 1038.4375 C 26.724498 1038.4275 33.182918 1037.7782 33.84375 1034.8125 C 34.98912 1029.6724 28.691615 1026.3963 22.65625 1026.4062 z "
+ style="opacity:0.8;fill:none;stroke:#ffffff;stroke-width:1.96821022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4419"
+ d="m 22.65625,1028.3125 c -2.671501,0 -5.593257,0.7892 -7.5,2 -1.906743,1.2108 -2.686165,2.4243 -2.3125,4.125 0.01227,0.056 0.08767,0.2446 0.625,0.5625 0.537332,0.3179 1.436336,0.6378 2.46875,0.875 2.064827,0.4744 4.672102,0.6593 6.46875,0.6562 2.065484,-0 4.670272,-0.1819 6.65625,-0.6562 0.992989,-0.2372 1.818273,-0.5665 2.3125,-0.875 0.494227,-0.3085 0.569138,-0.4833 0.59375,-0.5938 0.3921,-1.7596 -0.325087,-2.9432 -2.09375,-4.125 -1.768663,-1.1817 -4.548176,-1.9731 -7.21875,-1.9687 z" />
+ <path
+ id="path3769"
+ d="m 22.694087,1009.0398 c -3.559269,0.03 -6.458381,1.81 -6.475391,3.9805 l -0.11553,14.7388 c -0.017,2.1705 2.854538,3.9079 6.413789,3.8803 3.559267,-0.03 6.458381,-1.8098 6.475389,-3.9804 l 0.115531,-14.7389 c 0.017,-2.1707 -2.854539,-3.9077 -6.41379,-3.8803 z"
+ style="fill:url(#linearGradient4383);fill-opacity:1;stroke:#204a87;stroke-width:1.96821034;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1.9158137"
+ inkscape:original="M 22.6875 1009.0312 C 19.128231 1009.0612 16.23576 1010.8607 16.21875 1013.0312 L 16.09375 1027.75 C 16.07675 1029.9205 18.971999 1031.6526 22.53125 1031.625 C 26.090517 1031.595 28.982992 1029.8268 29 1027.6562 L 29.09375 1012.9062 C 29.11075 1010.7355 26.246751 1009.0039 22.6875 1009.0312 z "
+ style="fill:url(#linearGradient4415);fill-opacity:1;stroke:#ffffff;stroke-width:1.96821033999999995;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;opacity:0.8"
+ id="path4413"
+ d="m 22.6875,1010.9375 c -1.447743,0.018 -2.76177,0.4102 -3.5625,0.9063 -0.806819,0.4998 -0.998131,0.949 -1,1.1874 a 1.9160053,1.9160053 0 0 1 0,0.031 L 18,1027.75 l 0,0.031 c 0.0034,0.2312 0.189455,0.6256 0.96875,1.0938 0.785926,0.4722 2.079975,0.8492 3.53125,0.8438 0.01108,-1e-4 0.02015,0 0.03125,0 1.453481,-0.018 2.762945,-0.4163 3.5625,-0.9063 0.805547,-0.4937 0.998131,-0.9178 1,-1.1563 l 0.09375,-14.75 c 0.0019,-0.2388 -0.155143,-0.6518 -0.9375,-1.125 -0.776429,-0.4695 -2.079966,-0.8491 -3.53125,-0.8437 -0.01108,0 -0.02015,-10e-5 -0.03125,0 z" />
+ <path
+ transform="matrix(0.94028351,0.00742702,0.00744084,0.95062693,1.0992454,1004.254)"
+ d="M 33,6 A 10.5,4 0 1 1 12,6 10.5,4 0 1 1 33,6 z"
+ sodipodi:ry="4"
+ sodipodi:rx="10.5"
+ sodipodi:cy="6"
+ sodipodi:cx="22.5"
+ id="path3767"
+ style="fill:url(#linearGradient4379);fill-opacity:1;stroke:#204a87;stroke-width:2.08185506;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc" />
+ <path
+ style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.04092747999999991;stroke-miterlimit:4;stroke-opacity:1;opacity:1;stroke-dasharray:none"
+ d="m 31.545984,5.9878011 c -0.963049,1.7062011 -8.220456,2.6577682 -9.932288,2.4637892 -2.334823,-0.264574 -7.556968,-0.683736 -7.99132,-2.3097161 -0.344344,-1.8700023 7.685657,-2.6004794 8.586714,-2.5951541 0.978978,0.00579 7.804027,0.07008 9.336894,2.441081 z"
+ id="path4396"
+ sodipodi:nodetypes="cscsc"
+ transform="matrix(0.94028351,0.00742702,0.00744084,0.95062693,1.0992454,1004.254)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;stroke:#204a87;stroke-width:2.08185506000000009;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4405"
+ sodipodi:cx="22.5"
+ sodipodi:cy="6"
+ sodipodi:rx="10.5"
+ sodipodi:ry="4"
+ d="M 33,6 A 10.5,4 0 1 1 12,6 10.5,4 0 1 1 33,6 z"
+ transform="matrix(0.94028351,0.00742702,0.00744084,0.95062693,1.0992454,1004.254)" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/publish.png b/icons/publish.png
new file mode 100644
index 0000000..1f414ea
--- /dev/null
+++ b/icons/publish.png
Binary files differ
diff --git a/icons/redeye.png b/icons/redeye.png
new file mode 100644
index 0000000..47b2ba6
--- /dev/null
+++ b/icons/redeye.png
Binary files differ
diff --git a/icons/rejected.svg b/icons/rejected.svg
new file mode 100644
index 0000000..92e57fe
--- /dev/null
+++ b/icons/rejected.svg
@@ -0,0 +1,453 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="128"
+ id="svg11300"
+ inkscape:export-filename="/home/vishnoo/Desktop/emblem-unreadable1.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:version="0.46+devel r22260"
+ sodipodi:docname="emblem-unreadable.svg"
+ sodipodi:version="0.32"
+ style="display:inline;enable-background:new"
+ version="1.0"
+ width="128">
+ <title
+ id="title4119">Breathe Icon Theme computer</title>
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient3302">
+ <stop
+ id="stop3304"
+ offset="0"
+ style="stop-color:#ff9393;stop-opacity:1;" />
+ <stop
+ id="stop3306"
+ offset="1"
+ style="stop-color:#950000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3270">
+ <stop
+ id="stop3272"
+ offset="0"
+ style="stop-color:#8e0000;stop-opacity:1;" />
+ <stop
+ id="stop3274"
+ offset="1"
+ style="stop-color:#7e0000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3242">
+ <stop
+ id="stop3244"
+ offset="0"
+ style="stop-color:#ce1919;stop-opacity:1;" />
+ <stop
+ id="stop3246"
+ offset="1"
+ style="stop-color:#e73838;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3248"
+ inkscape:collect="always"
+ x1="91.695564"
+ x2="46.431141"
+ xlink:href="#linearGradient3242"
+ y1="120.51822"
+ y2="17.16164" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3268"
+ inkscape:collect="always"
+ x1="10.736336"
+ x2="124.38779"
+ xlink:href="#linearGradient3270"
+ y1="68.01416"
+ y2="68.01416" />
+ <radialGradient
+ cx="23.452066"
+ cy="26.206148"
+ fx="23.452066"
+ fy="26.206148"
+ gradientTransform="matrix(1.0000001,-1.1309123,0.8472065,0.7491355,-21.740861,27.942313)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3308"
+ inkscape:collect="always"
+ r="7.7027783"
+ xlink:href="#linearGradient3302" />
+ <radialGradient
+ cx="30.827892"
+ cy="84.148384"
+ fx="30.827892"
+ fy="84.148384"
+ gradientTransform="matrix(1,0,0,0.8726313,-4.3103448,3.605798)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3318"
+ inkscape:collect="always"
+ r="19.227224"
+ xlink:href="#linearGradient3302" />
+ <radialGradient
+ cx="93.780174"
+ cy="29.085732"
+ fx="93.780174"
+ fy="29.085732"
+ gradientTransform="matrix(1,0,0,0.8666394,0,4.6325902)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3328"
+ inkscape:collect="always"
+ r="20.523726"
+ xlink:href="#linearGradient3302" />
+ </defs>
+ <sodipodi:namedview
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ fill="#f57900"
+ gridtolerance="12"
+ guidetolerance="13"
+ height="300px"
+ id="base"
+ inkscape:current-layer="layer6"
+ inkscape:cx="34.834571"
+ inkscape:cy="70.200247"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:guide-bbox="true"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:showpageshadow="false"
+ inkscape:snap-bbox="true"
+ inkscape:snap-nodes="false"
+ inkscape:window-height="1154"
+ inkscape:window-maximized="1"
+ inkscape:window-width="1920"
+ inkscape:window-x="0"
+ inkscape:window-y="23"
+ inkscape:zoom="2.8237469"
+ objecttolerance="7"
+ pagecolor="#ffffff"
+ showgrid="false"
+ showguides="true"
+ stroke="#ef2929"
+ width="400px">
+ <inkscape:grid
+ empspacing="5"
+ enabled="true"
+ id="grid5883"
+ spacingx="1px"
+ spacingy="1px"
+ type="xygrid"
+ visible="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Breathe Icon Team</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source />
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
+ <dc:title>Breathe Icon Theme icon</dc:title>
+ <dc:subject>
+ <rdf:Bag />
+ </dc:subject>
+ <dc:date />
+ <dc:rights>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:rights>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title />
+ </cc:Agent>
+ </dc:publisher>
+ <dc:identifier />
+ <dc:relation />
+ <dc:language />
+ <dc:coverage />
+ <dc:description />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Jakub Steiner, Cory Kontros, Oxygen and Breathe icon teams</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Notice" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#Attribution" />
+ <cc:prohibits
+ rdf:resource="http://creativecommons.org/ns#CommercialUse" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="emblems/emblem-unreadable"
+ style="display:inline"
+ transform="translate(-3,-4)">
+ <rect
+ height="256"
+ id="256x256"
+ inkscape:label="256x256"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:none;overflow:visible;enable-background:accumulate"
+ width="256"
+ x="26.5"
+ y="32.823101" />
+ <rect
+ height="48"
+ id="48x48"
+ inkscape:label="48x48"
+ style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:none;overflow:visible;enable-background:accumulate"
+ width="48"
+ x="-35.5"
+ y="32.823101" />
+ <text
+ id="text6091"
+ sodipodi:linespacing="125%"
+ style="font-size:56.11526489px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:none;overflow:visible;enable-background:accumulate;font-family:Myriad"
+ x="-418.41196"
+ xml:space="preserve"
+ y="34.084831"><tspan
+ id="tspan6093"
+ sodipodi:role="line"
+ x="-418.41196"
+ y="34.084831">audio-x-generic</tspan></text>
+ <g
+ id="layer6"
+ inkscape:groupmode="layer"
+ inkscape:label="plate"
+ sodipodi:insensitive="true"
+ style="display:none">
+ <text
+ id="text3734"
+ inkscape:label="emblems"
+ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="40"
+ xml:space="preserve"
+ y="19"><tspan
+ id="tspan3736"
+ sodipodi:role="line"
+ x="40"
+ y="19">emblems</tspan></text>
+ <text
+ id="text3738"
+ inkscape:label="emblem-unreadable"
+ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="12"
+ xml:space="preserve"
+ y="127"><tspan
+ id="tspan3740"
+ sodipodi:role="line"
+ x="12"
+ y="127">emblem-unreadable</tspan></text>
+ </g>
+ <g
+ id="Livello_1"
+ transform="translate(387.11439,42.495045)" />
+ <g
+ id="g3290"
+ transform="translate(443.11439,59.884345)" />
+ <g
+ id="g7148"
+ transform="matrix(0.1956571,0,0,0.1956571,345.26471,19.402885)" />
+ <g
+ id="g7555"
+ transform="matrix(0.1333333,0,0,0.1333333,319.90372,105.99052)" />
+ <g
+ id="g9283"
+ transform="matrix(1.0666666,0,0,1.0666666,384.44667,40.470571)" />
+ <path
+ d="M 10.372002,34.44921 48.114562,67.581992 10.253314,100.91817 26.501656,119.46024 67.418008,84.004327 108.05369,119.25061 124.46401,101.00288 86.433344,67.293881 124.46401,34.161099 107.92051,15.627644 67.418008,51.159657 26.657633,15.727344 10.372002,34.44921 z"
+ id="path3240"
+ sodipodi:nodetypes="ccccccccccccc"
+ style="fill:url(#linearGradient3248);fill-opacity:1;fill-rule:evenodd;stroke:#951212;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 11.236336,34.737321 49.555118,67.581992 11.015954,100.88406 27.111855,118.4312 67.418008,83.156795 107.93499,118.65015 123.45676,100.85996 84.992788,67.293881 123.31157,34.161099 108.12391,16.37329 67.418008,52.312102 26.803685,16.733737 11.236336,34.737321 z"
+ id="path3252"
+ sodipodi:nodetypes="ccccccccccccc"
+ style="fill:none;stroke:url(#linearGradient3268);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 11.812557,34.304022 26.387759,17.35631"
+ id="path3290"
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:url(#radialGradient3308);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 11.921504,100.65429 49.555117,67.870103"
+ id="path3310"
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:url(#radialGradient3318);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="M 67.706119,52.02399 105.5984,19.390307"
+ id="path3320"
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:url(#radialGradient3328);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <g
+ id="g3330"
+ transform="matrix(0.4,0,0,0.4,285.76345,17.384519)" />
+ <g
+ id="g3332"
+ transform="matrix(0.4,0,0,0.4,308.16345,24.340239)" />
+ <g
+ id="g3334"
+ transform="matrix(0.07826284,0,0,0.07826284,269.02358,8.1476546)" />
+ <g
+ id="g3336"
+ transform="matrix(0.05333332,0,0,0.05333332,258.87918,42.782708)" />
+ <g
+ id="g3338"
+ transform="matrix(0.4266666,0,0,0.4266666,284.69636,16.57473)" />
+ <g
+ id="g3362"
+ transform="matrix(0.268,0,0,0.268,235.65969,64.238809)" />
+ <g
+ id="g3364"
+ transform="matrix(0.268,0,0,0.268,250.66769,68.899142)" />
+ <g
+ id="g3366"
+ transform="matrix(0.0524361,0,0,0.0524361,224.44398,58.05011)" />
+ <g
+ id="g3368"
+ transform="matrix(0.03573332,0,0,0.03573332,217.64723,81.255596)" />
+ <g
+ id="g3370"
+ transform="matrix(0.2858666,0,0,0.2858666,234.94474,63.696251)" />
+ <g
+ id="g3394"
+ transform="matrix(0.201,0,0,0.201,210.24503,96.026329)" />
+ <g
+ id="g3396"
+ transform="matrix(0.201,0,0,0.201,221.50103,99.521579)" />
+ <g
+ id="g3398"
+ transform="matrix(0.03932708,0,0,0.03932708,201.83325,91.384805)" />
+ <g
+ id="g3400"
+ transform="matrix(0.02679999,0,0,0.02679999,196.73569,108.78892)" />
+ <g
+ id="g3402"
+ transform="matrix(0.2144,0,0,0.2144,209.70882,95.61941)" />
+ <g
+ id="g3426"
+ transform="matrix(0.13065,0,0,0.13065,183.75938,120.78275)" />
+ <g
+ id="g3428"
+ transform="matrix(0.13065,0,0,0.13065,191.07578,123.05466)" />
+ <g
+ id="g3430"
+ transform="matrix(0.0255626,0,0,0.0255626,178.29172,117.76576)" />
+ <g
+ id="g3432"
+ transform="matrix(0.01742,0,0,0.01742,174.97831,129.07843)" />
+ <g
+ id="g3434"
+ transform="matrix(0.13936,0,0,0.13936,183.41084,120.51825)" />
+ <g
+ id="g3596"
+ transform="matrix(0.4,0,0,0.4,285.79094,17.836931)" />
+ <g
+ id="g3598"
+ transform="matrix(0.4,0,0,0.4,308.19094,24.792651)" />
+ <g
+ id="g3600"
+ transform="matrix(0.07826284,0,0,0.07826284,269.05107,8.6000674)" />
+ <g
+ id="g3602"
+ transform="matrix(0.05333332,0,0,0.05333332,258.90668,43.235121)" />
+ <g
+ id="g3604"
+ transform="matrix(0.4266666,0,0,0.4266666,284.72386,17.027142)" />
+ <g
+ id="g3616"
+ transform="matrix(0.16,0,0,0.16,245.25057,7.7927214)" />
+ <g
+ id="g3618"
+ transform="matrix(0.16,0,0,0.16,254.21057,10.575009)" />
+ <g
+ id="g3620"
+ transform="matrix(0.03130514,0,0,0.03130514,238.55462,4.0979754)" />
+ <g
+ id="g3622"
+ transform="matrix(0.02133333,0,0,0.02133333,234.49686,17.951996)" />
+ <g
+ id="g3624"
+ transform="matrix(0.1706666,0,0,0.1706666,244.82373,7.4688054)" />
+ <g
+ id="g3626"
+ transform="matrix(0.1072,0,0,0.1072,225.20906,26.534437)" />
+ <g
+ id="g3628"
+ transform="matrix(0.1072,0,0,0.1072,231.21226,28.39857)" />
+ <g
+ id="g3630"
+ transform="matrix(0.02097444,0,0,0.02097444,220.72278,24.058957)" />
+ <g
+ id="g3632"
+ transform="matrix(0.01429333,0,0,0.01429333,218.00408,33.341152)" />
+ <g
+ id="g3634"
+ transform="matrix(0.1143466,0,0,0.1143466,224.92308,26.317414)" />
+ <g
+ id="g3646"
+ transform="matrix(0.0804,0,0,0.0804,215.0432,39.249445)" />
+ <g
+ id="g3648"
+ transform="matrix(0.0804,0,0,0.0804,219.5456,40.647545)" />
+ <g
+ id="g3650"
+ transform="matrix(0.01573083,0,0,0.01573083,211.67849,37.392835)" />
+ <g
+ id="g3652"
+ transform="matrix(0.01072,0,0,0.01072,209.63946,44.354481)" />
+ <g
+ id="g3654"
+ transform="matrix(0.08576,0,0,0.08576,214.82872,39.086677)" />
+ <g
+ id="g3666"
+ transform="matrix(0.05226,0,0,0.05226,204.44894,49.152015)" />
+ <g
+ id="g3668"
+ transform="matrix(0.05226,0,0,0.05226,207.3755,50.060779)" />
+ <g
+ id="g3670"
+ transform="matrix(0.01022504,0,0,0.01022504,202.26188,47.945219)" />
+ <g
+ id="g3672"
+ transform="matrix(0.006968,0,0,0.006968,200.93651,52.470287)" />
+ <g
+ id="g3674"
+ transform="matrix(0.055744,0,0,0.055744,204.30952,49.046215)" />
+ </g>
+</svg>
diff --git a/icons/shotwell-16.svg b/icons/shotwell-16.svg
new file mode 100644
index 0000000..db38cb2
--- /dev/null
+++ b/icons/shotwell-16.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="16"
+ height="16"
+ viewBox="0 0 16 16"
+ enable-background="new 0 0 180 180"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="shotwell.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7"><linearGradient
+ id="linearGradient3710"><stop
+ style="stop-color:#c9332e;stop-opacity:1;"
+ offset="0"
+ id="stop3712" /><stop
+ style="stop-color:#87231f;stop-opacity:1;"
+ offset="1"
+ id="stop3714" /></linearGradient><linearGradient
+ id="linearGradient3665"><stop
+ style="stop-color:#667f2e;stop-opacity:1;"
+ offset="0"
+ id="stop3667" /><stop
+ style="stop-color:#94b641;stop-opacity:1;"
+ offset="1"
+ id="stop3669" /></linearGradient><linearGradient
+ id="linearGradient3628"><stop
+ style="stop-color:#099bd1;stop-opacity:1;"
+ offset="0"
+ id="stop3630" /><stop
+ style="stop-color:#035fa9;stop-opacity:1;"
+ offset="1"
+ id="stop3632" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3665"
+ id="linearGradient4937"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.025641,0,0,1.0126582,136.85898,-4.28481)"
+ x1="-17.5"
+ y1="22"
+ x2="-17.5"
+ y2="62.152832" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3710"
+ id="linearGradient4939"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.16838723,0,0,0.16838725,40.079373,-0.16517623)"
+ x1="-124.5"
+ y1="101.26834"
+ x2="-124.5"
+ y2="73.998131" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3628"
+ id="linearGradient4949"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0761749,0,0,1.0251887,112.74312,3.0132867)"
+ x1="-43.661713"
+ y1="60.388466"
+ x2="-43.661713"
+ y2="31.618958" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#e7e7e7"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1024"
+ inkscape:window-height="719"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="16"
+ inkscape:cx="12.787588"
+ inkscape:cy="9.1475636"
+ inkscape:window-x="1024"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:showpageshadow="false"
+ showborder="true"><inkscape:grid
+ type="xygrid"
+ id="grid2819"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview>
+
+<g
+ id="g4920"
+ transform="matrix(0.62380656,0,0,0.62380656,0.55469739,5.4956476)"><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1.6030612;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect2823"
+ width="12.824489"
+ height="14.427549"
+ x="9.5306835"
+ y="-6.4052672"
+ rx="0"
+ ry="0" /><g
+ transform="matrix(0.10019132,0,0,0.12022958,3.6694907,-6.2249229)"
+ id="g3686"><rect
+ style="fill:url(#linearGradient4937);fill-opacity:1;stroke:none"
+ id="rect3663"
+ width="80"
+ height="80"
+ x="82.5"
+ y="18.5" /></g><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1.60306096;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect2821"
+ width="11.221428"
+ height="14.427549"
+ x="7.9276218"
+ y="0.0069773095"
+ rx="0"
+ ry="0" /><g
+ transform="matrix(0.59500541,0,0,0.71400649,2.2148058,-6.3674843)"
+ id="g4732"><rect
+ style="fill:url(#linearGradient4939);fill-opacity:1;stroke:none"
+ id="rect3700"
+ width="13.470979"
+ height="13.470979"
+ x="10.948382"
+ y="12.295481" /></g><rect
+ ry="0"
+ rx="0"
+ y="-3.1991448"
+ x="1.5153779"
+ height="16.030609"
+ width="12.824489"
+ id="rect2817"
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1.6030612;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><g
+ transform="matrix(0.07546143,0,0,0.11203951,2.9656204,-4.8213977)"
+ id="g3636"><rect
+ style="fill:url(#linearGradient4949);fill-opacity:1;stroke:none"
+ id="rect3618"
+ width="106.21725"
+ height="100.15598"
+ x="12.646845"
+ y="35.941288" /><path
+ style="fill:#01131a;fill-opacity:1;stroke:none"
+ d="m 12.646845,93.173279 0,42.923991 105.885315,0 0.33193,-57.231989 -106.217245,14.307998 z"
+ id="path4951"
+ sodipodi:nodetypes="ccccc" /></g></g></svg> \ No newline at end of file
diff --git a/icons/shotwell-24.svg b/icons/shotwell-24.svg
new file mode 100644
index 0000000..1e6d9ed
--- /dev/null
+++ b/icons/shotwell-24.svg
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="24"
+ height="24"
+ viewBox="0 0 24 24"
+ enable-background="new 0 0 180 180"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="shotwell.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7"><linearGradient
+ id="linearGradient3710"><stop
+ style="stop-color:#c9332e;stop-opacity:1;"
+ offset="0"
+ id="stop3712" /><stop
+ style="stop-color:#87231f;stop-opacity:1;"
+ offset="1"
+ id="stop3714" /></linearGradient><linearGradient
+ id="linearGradient3665"><stop
+ style="stop-color:#667f2e;stop-opacity:1;"
+ offset="0"
+ id="stop3667" /><stop
+ style="stop-color:#94b641;stop-opacity:1;"
+ offset="1"
+ id="stop3669" /></linearGradient><linearGradient
+ id="linearGradient3628"><stop
+ style="stop-color:#099bd1;stop-opacity:1;"
+ offset="0"
+ id="stop3630" /><stop
+ style="stop-color:#035fa9;stop-opacity:1;"
+ offset="1"
+ id="stop3632" /></linearGradient><linearGradient
+ id="linearGradient3607"><stop
+ style="stop-color:#fffbf7;stop-opacity:1;"
+ offset="0"
+ id="stop3609" /><stop
+ style="stop-color:#fed697;stop-opacity:1;"
+ offset="1"
+ id="stop3611" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3628"
+ id="linearGradient4849"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.94709495,0,0,0.99337445,107.10999,4.0351276)"
+ x1="-43.661713"
+ y1="60.388466"
+ x2="-43.661713"
+ y2="31.618958" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3607"
+ id="radialGradient4851"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.82352939,-6.1355775e-8,5.2590677e-8,0.7058825,-29.1752,17.22328)"
+ cx="-165.3261"
+ cy="58.559208"
+ fx="-165.3261"
+ fy="58.559208"
+ r="8.9683418" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3710"
+ id="linearGradient4853"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.16838723,0,0,0.16838725,40.079373,-0.16517623)"
+ x1="-124.5"
+ y1="101.26834"
+ x2="-124.5"
+ y2="73.998131" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3665"
+ id="linearGradient4859"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.025641,0,0,1.0126582,136.85898,-4.28481)"
+ x1="-17.5"
+ y1="22"
+ x2="-17.5"
+ y2="62.152832" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#e7e7e7"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1024"
+ inkscape:window-height="719"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="14.262976"
+ inkscape:cy="-4.0941656"
+ inkscape:window-x="1024"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:showpageshadow="false"><inkscape:grid
+ type="xygrid"
+ id="grid2819"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview>
+
+<rect
+ ry="0"
+ rx="0"
+ y="1.4999686"
+ x="9.5"
+ height="14.000021"
+ width="12"
+ id="rect2823"
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><g
+ id="g3686"
+ transform="matrix(0.1125,0,0,0.125,1.71875,0.68750003)"><rect
+ y="18.5"
+ x="82.5"
+ height="80"
+ width="80"
+ id="rect3663"
+ style="fill:url(#linearGradient4859);fill-opacity:1;stroke:none" /><path
+ sodipodi:nodetypes="cssssccccccc"
+ id="path3677"
+ d="m 162.5,69.58583 c -2.28236,-1.229642 -4.57791,-5.41744 -7.58117,-4.432837 -0.78685,0.257961 -1.99733,1.357334 -2.75431,0.985074 -1.3901,-0.683607 -3.07858,-2.289088 -4.13145,-3.324628 -0.80496,-0.791701 -4.70948,0.165709 -5.8842,-0.123135 -3.46751,-0.852608 -6.66988,-3.146265 -8.26291,-6.279853 l -2.3787,-3.940301 c -1.72413,-0.890004 -3.25174,-1.970149 -4.56282,-1.970149 l 0,48 10.69739,0 24.85817,0 0,-28.914171 z"
+ style="fill:#6a8430;fill-opacity:1;stroke:none" /><path
+ sodipodi:nodetypes="csscccc"
+ d="m 162.5,82.622687 c -3.33496,-0.219989 -5.59826,-0.201933 -8.62649,0.541512 -2.36305,0.580142 -3.51283,2.267732 -6.28066,2.558951 -3.82935,0.40291 -7.99575,0.09842 -11.75952,0.09842 l 0.13362,12.597917 26.53305,0.08051 0,-15.877312 z"
+ style="fill:#526726;fill-opacity:1;stroke:none"
+ id="path3681" /><path
+ sodipodi:nodetypes="csscccc"
+ d="m 162.5,93.500098 c -2.06783,0.286598 -2.97748,-3.761525 -5.12192,-2.872127 -2.1533,0.893061 -3.76922,2.389161 -6.30492,2.914995 -2.07742,0.4308 -4.65014,-0.342941 -6.35094,-0.128603 l 0,5.085637 17.77778,0 0,-4.999902 z"
+ style="fill:#384619;fill-opacity:1;stroke:none"
+ id="path3679" /></g><rect
+ ry="0"
+ rx="0"
+ y="8.499979"
+ x="6.5"
+ height="14.000021"
+ width="12"
+ id="rect2821"
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><g
+ id="g4732"
+ transform="matrix(0.74233577,0,0,0.74233656,-1.1273759,0.87261515)"><rect
+ y="12.295481"
+ x="10.948382"
+ height="13.470979"
+ width="13.470979"
+ id="rect3700"
+ style="fill:url(#linearGradient4853);fill-opacity:1;stroke:none" /><path
+ sodipodi:nodetypes="cssssssssssssccccc"
+ id="path3698"
+ d="m 22.746535,19.053834 c 0.198966,-0.08701 0.392759,0.08835 0.48121,0.289058 0.01342,0.03047 -0.02041,0.121367 0,0.144532 0.06273,0.07116 0.189322,-0.132434 0.325522,0.176647 0.0858,0.194719 -0.254487,0.546307 -0.169838,0.642354 0.06335,0.07189 0.242053,-0.07864 0.297218,-0.01604 0.04007,0.04546 0.0063,0.308709 0.02831,0.321178 0.134217,0.07614 0.267055,-0.102667 0.325522,0.09635 0.05617,0.191212 -0.350926,0.215354 -0.22645,0.497826 0.02408,0.05462 0.39413,0.11681 0.479802,0.149211 0.01477,0.0056 0.04442,0.146464 0.0361,0.155907 -0.134993,0.153169 -0.176224,0.05489 -0.176224,0.353295 0,0.181733 0.184661,0.0168 0.268854,0.112343 0.0063,0.0071 5.6e-5,0.843438 5.6e-5,0.99572 l -5.6e-5,2.794243 -2.691384,-9e-6 0,-6.712605 1.021362,0 z"
+ style="fill:#4e1413;fill-opacity:1;stroke:none" /></g><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect2817"
+ width="14"
+ height="16"
+ x="1.5000001"
+ y="4.5000005"
+ rx="0"
+ ry="0" /><g
+ id="g3636"
+ transform="matrix(0.11767575,0,0,0.12365028,0.76185377,1.5558495)"><rect
+ y="35.941288"
+ x="19.019604"
+ height="97.047897"
+ width="93.477203"
+ id="rect3618"
+ style="fill:url(#linearGradient4849);fill-opacity:1;stroke:none" /><path
+ transform="matrix(1.5101535,0,0,1.4371859,298.43013,-28.000866)"
+ d="m -156.8853,58.559208 c 0,4.661721 -3.77907,8.440792 -8.4408,8.440792 -4.66172,0 -8.44079,-3.779071 -8.44079,-8.440792 0,-4.661721 3.77907,-8.440792 8.44079,-8.440792 4.66173,0 8.4408,3.779071 8.4408,8.440792 z"
+ sodipodi:ry="8.4407921"
+ sodipodi:rx="8.4407921"
+ sodipodi:cy="58.559208"
+ sodipodi:cx="-165.3261"
+ id="path2825"
+ style="fill:url(#radialGradient4851);fill-opacity:1;stroke:none"
+ sodipodi:type="arc" /><path
+ sodipodi:nodetypes="csssssssssssssssssssssssssssssccssssssssccsssssssssssssssssssssccccc"
+ id="path3615"
+ d="m 25.001687,93.889677 c 0.911316,-0.506743 0.850357,-2.3054 2.209168,-1.801683 1.901206,0.704784 1.088581,1.128726 1.693696,1.801682 0.128025,0.142384 1.336983,0.198353 1.546421,0.08189 1.290536,-0.717609 1.428811,-2.440343 2.87192,-1.637895 0.77509,0.430994 0.782776,1.443802 1.251858,1.965473 0.572285,0.636442 1.657056,0.246064 2.135532,1.310315 0.408696,0.90903 -0.316283,2.35079 0.368201,3.112 0.06084,0.0676 1.602176,0.0398 1.620057,0 0.375268,-0.83469 -0.166368,-9.806135 0.147274,-10.154947 0.800902,-0.890693 2.36496,-0.486634 3.092835,-0.08189 0.850814,0.473098 2.39736,-1.5924 4.565622,0.818948 0.187913,0.208978 1.572247,0 1.840977,0 2.29394,0 4.124986,0.08234 6.112039,0.818947 0.135439,0.0502 0.567423,-0.106008 0.662742,0 0.554782,0.61697 -0.350598,2.558302 0.3682,3.357685 0.178561,0.198583 1.550798,0.04177 1.767331,0.08189 1.274699,0.236268 0.417431,-1.119379 0.957307,-1.719789 0.07499,-0.08338 0.612402,0 0.736398,0 0.596573,0 2.916669,-0.277812 3.313754,0.16379 0.05519,0.06139 -0.131734,0.275712 -0.147282,0.327579 -0.163445,0.545304 -0.267603,4.303477 0,4.749887 0.06463,0.10778 1.612418,1.71555 1.62006,1.71979 1.272108,0.70737 1.03375,-4.110354 1.178223,-4.913679 0.582646,-3.239845 -0.710646,-4.838944 2.798283,-5.814525 0.577837,-0.160657 0.867674,-0.900842 1.399142,-0.900842 0.310506,0 0.394248,-4.154349 0.58541,-4.154349 0.346514,0 0.454812,4.15007 0.874734,4.383572 1.811343,1.007207 1.397344,1.228836 1.706328,1.572462 0.109111,0.121336 1.703036,0.348342 2.061895,1.146525 0.48508,1.078928 0.220917,8.378506 0.220917,10.236847 l -0.0026,0.21108 c 0.02755,0.3772 -0.02605,0.75608 -0.02605,1.1292 0,0.50385 1.160028,0.0514 1.275727,-0.46327 0.06964,-0.30967 0.175313,-0.62543 0.208285,-0.95548 0.06366,-0.636731 -0.109767,-3.004971 0.286392,-3.445541 0.03557,-0.0396 0.12197,0.0226 0.156208,0.0289 0.66034,0.1224 1.307281,0.11582 1.978689,0.11582 0.338089,0 2.214979,0.25838 2.473355,-0.0289 0.183793,-0.2044 -0.02402,-1.16889 -0.05212,-1.41875 -0.133739,-1.189857 -0.05202,-2.445035 -0.05202,-3.648226 l -0.260336,-0.579082 c 0.324992,-1.036327 0.0053,-8.518315 0.624853,-9.207424 0.459311,-0.510798 0.677051,-0.492295 0.93727,-0.63699 1.029373,-0.572387 0.781067,-1.039801 0.781067,-2.258426 0,-0.897099 0.546294,-10.133954 0.781052,-10.133954 0.196926,0 0.833127,9.129019 0.833127,10.307681 0,0.252495 0.730508,2.028475 0.833135,2.142606 0.221701,0.246555 0.450224,0.4428 0.624843,0.636995 0.510577,0.567815 -0.195042,7.311171 0.312426,7.875531 0.284632,0.316538 0.695485,0.936855 1.093486,1.158165 0.456115,0.253626 0.853489,-0.249266 1.30176,0 0.641571,0.356746 1.34858,-0.474975 1.770404,0.463267 0.757395,1.684608 -0.104456,4.052877 0.624853,5.675017 0.08548,0.19006 0.363841,0.11581 0.5207,0.11581 2.157185,0 0.390534,-4.9222 1.145542,-6.601544 0.04749,-0.105472 6.386881,-0.07772 6.560931,0.115818 0.926132,1.029976 -0.102111,5.329836 0.416542,5.906646 0.167527,0.18629 1.48443,0 1.77041,0 0.30014,0 1.06443,0.43767 1.24969,0.23164 0.9455,-1.05151 2.25726,-2.203427 2.70767,-3.706138 0.1699,-0.56681 -0.26969,-1.458098 -0.52069,-1.737249 -0.33609,-0.373751 0,-2.963371 0,-3.590318 0,-5.010921 -0.87601,-8.40012 3.33251,-9.960231 l 0,50.843517 -84.979273,0 0,-34.973952 c 0.54743,-0.02803 1.511853,-0.07246 1.733112,-0.08189 z"
+ style="fill:#01131a;fill-opacity:1;stroke:#01131a;stroke-width:8.29008293px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /></g></svg> \ No newline at end of file
diff --git a/icons/shotwell-street.jpg b/icons/shotwell-street.jpg
new file mode 100644
index 0000000..f698779
--- /dev/null
+++ b/icons/shotwell-street.jpg
Binary files differ
diff --git a/icons/shotwell.ico b/icons/shotwell.ico
new file mode 100644
index 0000000..697fdd7
--- /dev/null
+++ b/icons/shotwell.ico
Binary files differ
diff --git a/icons/shotwell.svg b/icons/shotwell.svg
new file mode 100644
index 0000000..1a0c067
--- /dev/null
+++ b/icons/shotwell.svg
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="120"
+ height="120"
+ viewBox="0 0 120 120"
+ enable-background="new 0 0 180 180"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="shotwell.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7"><linearGradient
+ id="linearGradient3710"><stop
+ style="stop-color:#c9332e;stop-opacity:1;"
+ offset="0"
+ id="stop3712" /><stop
+ style="stop-color:#87231f;stop-opacity:1;"
+ offset="1"
+ id="stop3714" /></linearGradient><linearGradient
+ id="linearGradient3665"><stop
+ style="stop-color:#667f2e;stop-opacity:1;"
+ offset="0"
+ id="stop3667" /><stop
+ style="stop-color:#94b641;stop-opacity:1;"
+ offset="1"
+ id="stop3669" /></linearGradient><linearGradient
+ id="linearGradient3628"><stop
+ style="stop-color:#099bd1;stop-opacity:1;"
+ offset="0"
+ id="stop3630" /><stop
+ style="stop-color:#035fa9;stop-opacity:1;"
+ offset="1"
+ id="stop3632" /></linearGradient><linearGradient
+ id="linearGradient3607"><stop
+ style="stop-color:#fffbf7;stop-opacity:1;"
+ offset="0"
+ id="stop3609" /><stop
+ style="stop-color:#fed697;stop-opacity:1;"
+ offset="1"
+ id="stop3611" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3710"
+ id="linearGradient2906"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.66249999,0,0,0.66249999,155.6125,-4.0249993)"
+ x1="-124.5"
+ y1="101.26834"
+ x2="-124.5"
+ y2="73.998131" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3628"
+ id="linearGradient2918"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0131827,0,0,1.0031202,113.23728,-0.21917682)"
+ x1="-43.661713"
+ y1="60.388466"
+ x2="-43.661713"
+ y2="31.618958" /><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3607"
+ id="radialGradient2920"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.82352939,-6.1355775e-8,5.2590677e-8,0.7058825,-29.1752,17.22328)"
+ cx="-165.3261"
+ cy="58.559208"
+ fx="-165.3261"
+ fy="58.559208"
+ r="8.9683418" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3665"
+ id="linearGradient2922"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.025641,0,0,1.0126582,136.85898,-4.28481)"
+ x1="-17.5"
+ y1="22"
+ x2="-17.5"
+ y2="62.152832" /><filter
+ inkscape:collect="always"
+ id="filter3702"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.5975"
+ id="feGaussianBlur3704" /></filter><filter
+ inkscape:collect="always"
+ id="filter3706"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.5975"
+ id="feGaussianBlur3708" /></filter><filter
+ inkscape:collect="always"
+ id="filter3710"><feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.5975"
+ id="feGaussianBlur3712" /></filter></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#e7e7e7"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1024"
+ inkscape:window-height="719"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="36.341145"
+ inkscape:cy="36.952073"
+ inkscape:window-x="1024"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:showpageshadow="false"><inkscape:grid
+ type="xygrid"
+ id="grid2819"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" /></sodipodi:namedview>
+
+<rect
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99999981999999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3702);opacity:0.6"
+ id="rect2924"
+ width="62.000004"
+ height="71"
+ x="50.5"
+ y="5.5"
+ rx="0"
+ ry="0" /><rect
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99999981999999998;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3706);opacity:0.6"
+ id="rect2926"
+ width="65"
+ height="74"
+ x="34.5"
+ y="39.5"
+ rx="0"
+ ry="0" /><rect
+ ry="0"
+ rx="0"
+ y="15.5"
+ x="7.5"
+ height="88"
+ width="78"
+ id="rect2928"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99999994000000003;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3710);opacity:0.6" /><rect
+ ry="0"
+ rx="0"
+ y="5.5"
+ x="50.5"
+ height="71"
+ width="62.000004"
+ id="rect2823"
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:0.99999982;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><g
+ id="g3686"
+ transform="matrix(0.6625,0,0,0.6625,0.34375,-2.25625)"><rect
+ y="18.5"
+ x="82.5"
+ height="80"
+ width="80"
+ id="rect3663"
+ style="fill:url(#linearGradient2922);fill-opacity:1;stroke:none" /><path
+ sodipodi:nodetypes="cssssccccccc"
+ id="path3677"
+ d="m 162.5,69.403979 c -2.22852,-1.237376 -4.46994,-5.451512 -7.40236,-4.460717 -0.76829,0.259584 -1.95022,1.365871 -2.68935,0.99127 -1.35731,-0.687906 -3.00597,-2.303485 -4.03401,-3.345538 -0.78598,-0.79668 -4.59841,0.166751 -5.74542,-0.123909 -3.38574,-0.857971 -6.51258,-3.166053 -8.06803,-6.319349 l -2.32261,-3.965082 c -1.68346,-0.895603 -3.17504,-1.982541 -4.4552,-1.982541 l 0,48.301887 10.4451,0 24.27188,0 0,-29.096021 z"
+ style="fill:#6a8430;fill-opacity:1;stroke:none" /><path
+ sodipodi:nodetypes="csscccc"
+ d="m 162.5,79.027822 c -3.20911,-0.269797 -5.387,-0.247653 -8.30096,0.664119 -2.27389,0.711495 -3.38028,2.781181 -6.04365,3.138337 -3.68484,0.494134 -7.69403,0.120706 -11.31577,0.120706 l 0.12858,15.450277 25.5318,0.09874 0,-19.472178 z"
+ style="fill:#526726;fill-opacity:1;stroke:none"
+ id="path3681" /><path
+ sodipodi:nodetypes="csscccc"
+ d="m 162.5,90.952978 c -2.45799,0.432601 -3.53926,-5.677772 -6.08832,-4.335286 -2.55957,1.348017 -4.48039,3.606282 -7.49452,4.399992 -2.46939,0.650265 -5.52753,-0.517646 -7.54924,-0.194118 l 0,7.676434 21.13208,0 0,-7.547022 z"
+ style="fill:#384619;fill-opacity:1;stroke:none"
+ id="path3679" /></g><rect
+ ry="0"
+ rx="0"
+ y="39.5"
+ x="34.5"
+ height="74"
+ width="65"
+ id="rect2821"
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:0.99999982;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><rect
+ style="fill:url(#linearGradient2906);fill-opacity:1;stroke:none"
+ id="rect3700"
+ width="53"
+ height="53"
+ x="41"
+ y="45" /><path
+ style="fill:#4e1413;fill-opacity:1;stroke:none"
+ d="m 86.549183,74.081477 c 0.886193,-0.310035 1.749359,0.314783 2.143319,1.029989 0.05979,0.10859 -0.09092,0.432448 0,0.514995 0.279367,0.253582 0.843247,-0.471893 1.449895,0.629429 0.38218,0.693827 -1.133497,1.946613 -0.756471,2.288853 0.282161,0.256125 1.078114,-0.280248 1.323818,-0.05721 0.178461,0.161993 0.02823,1.100004 0.126077,1.14443 0.597812,0.271316 1.189475,-0.365825 1.449896,0.343329 0.2502,0.681328 -1.563042,0.767351 -1.008621,1.773859 0.107211,0.194647 1.755465,0.416218 2.137051,0.531672 0.06578,0.01985 0.197844,0.521889 0.160786,0.555535 -0.601263,0.545772 -0.784906,0.195587 -0.784906,1.258864 0,0.647559 0.822487,0.05987 1.197486,0.400301 0.02795,0.02536 2.48e-4,3.005357 2.48e-4,3.547977 L 93.987513,98 82,97.999967 l 0,-23.918486 4.549183,0 z"
+ id="path3698"
+ sodipodi:nodetypes="cssssssssssssccccc" /><rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect2817"
+ width="78"
+ height="88"
+ x="7.5"
+ y="15.5"
+ rx="0"
+ ry="0" /><g
+ id="g3636"
+ transform="matrix(0.65656596,0,0,0.66151013,0.69694898,0.83443815)"><rect
+ y="32"
+ x="19"
+ height="98"
+ width="100"
+ id="rect3618"
+ style="fill:url(#linearGradient2918);fill-opacity:1;stroke:none" /><path
+ transform="matrix(0.90221167,0,0,0.89546848,202.92837,6.7683671)"
+ d="m -156.8853,58.559208 c 0,4.661721 -3.77907,8.440792 -8.4408,8.440792 -4.66172,0 -8.44079,-3.779071 -8.44079,-8.440792 0,-4.661721 3.77907,-8.440792 8.44079,-8.440792 4.66173,0 8.4408,3.779071 8.4408,8.440792 z"
+ sodipodi:ry="8.4407921"
+ sodipodi:rx="8.4407921"
+ sodipodi:cy="58.559208"
+ sodipodi:cx="-165.3261"
+ id="path2825"
+ style="fill:url(#radialGradient2920);fill-opacity:1;stroke:none"
+ sodipodi:type="arc" /><path
+ sodipodi:nodetypes="csssssssssssssssssssssssssssssccssssssssccsssssssssssssssssssssccccc"
+ id="path3615"
+ d="m 21.519059,93.213403 c 1.061673,-0.524535 0.990657,-2.386339 2.573658,-1.864938 2.214885,0.729528 1.268186,1.168354 1.973138,1.864937 0.149149,0.147381 1.557573,0.205316 1.801566,0.08477 1.503461,-0.742803 1.66455,-2.52602 3.345756,-1.695399 0.902974,0.446126 0.911928,1.494492 1.458404,2.034479 0.666705,0.658786 1.930453,0.254702 2.487873,1.356318 0.476127,0.940945 -0.368466,2.433317 0.428949,3.221258 0.07088,0.06998 1.86652,0.04117 1.887352,0 0.437183,-0.863997 -0.193818,-10.150414 0.171571,-10.511472 0.933044,-0.921965 2.755155,-0.503719 3.603123,-0.08477 0.991189,0.489709 2.7929,-1.648306 5.318904,0.8477 0.218916,0.216316 1.83165,0 2.144719,0 2.672417,0 4.805567,0.08523 7.120463,0.8477 0.157786,0.05197 0.661043,-0.10973 0.772089,0 0.646315,0.638631 -0.408444,2.648119 0.428948,3.475566 0.208023,0.205556 1.806665,0.04323 2.058923,0.08477 1.485011,0.244562 0.486304,-1.158679 1.115253,-1.780169 0.08737,-0.08631 0.713443,0 0.857896,0 0.695002,0 3.39789,-0.287565 3.86049,0.16954 0.0643,0.06355 -0.153469,0.285393 -0.171582,0.33908 -0.190411,0.56445 -0.311756,4.454567 0,4.916656 0.07529,0.111549 1.878451,1.775769 1.887354,1.780168 1.481993,0.732198 1.204308,-4.254669 1.372618,-5.086196 0.678776,-3.353592 -0.827896,-5.008833 3.259972,-6.018664 0.673175,-0.166298 1.010831,-0.93247 1.629986,-0.93247 0.361736,0 0.459296,-4.300201 0.681996,-4.300201 0.403686,0 0.529852,4.295772 1.019056,4.537471 2.110196,1.042569 1.627893,1.271979 1.987856,1.627669 0.12711,0.125596 1.98402,0.360573 2.402087,1.186779 0.565113,1.116807 0.257366,8.672665 0.257366,10.596246 l -0.003,0.218489 c 0.0321,0.39045 -0.03036,0.78263 -0.03036,1.16885 0,0.52154 1.35142,0.0532 1.486209,-0.47953 0.08113,-0.32055 0.204238,-0.64739 0.24265,-0.989033 0.07416,-0.65908 -0.127878,-3.110471 0.333644,-3.566513 0.04144,-0.041 0.142094,0.0234 0.181981,0.02997 0.769289,0.126692 1.52297,0.119882 2.305152,0.119882 0.393871,0 2.580428,0.267459 2.881434,-0.02997 0.214116,-0.211576 -0.02799,-1.209927 -0.06072,-1.468564 -0.155806,-1.23163 -0.06061,-2.530874 -0.06061,-3.776308 l -0.303288,-0.599412 c 0.378611,-1.072711 0.0062,-8.817379 0.727946,-9.530682 0.535093,-0.528731 0.788757,-0.509578 1.091909,-0.659354 1.199211,-0.592482 0.909938,-1.076307 0.909938,-2.337715 0,-0.928595 0.636426,-10.489742 0.909916,-10.489742 0.229418,0 0.970585,9.449524 0.970585,10.669567 0,0.261359 0.851034,2.099693 0.970594,2.21783 0.258279,0.255212 0.524507,0.458346 0.727935,0.659358 0.594817,0.587751 -0.227222,7.567856 0.363974,8.152028 0.331592,0.327653 0.810233,0.969748 1.2739,1.198827 0.531369,0.26253 0.994306,-0.258017 1.516538,0 0.747423,0.369271 1.571082,-0.491649 2.062502,0.479531 0.882358,1.743754 -0.121692,4.195166 0.727947,5.874257 0.09958,0.196736 0.423871,0.119883 0.60661,0.119883 2.513101,0 0.45497,-5.095015 1.334551,-6.833319 0.0553,-0.109174 7.44065,-0.08045 7.64341,0.119883 1.07893,1.066138 -0.11895,5.516963 0.48527,6.114022 0.19517,0.192832 1.72935,0 2.06251,0 0.34967,0 1.24005,0.453039 1.45588,0.239764 1.1015,-1.088415 2.62968,-2.28078 3.15441,-3.836248 0.19793,-0.58671 -0.31419,-1.509289 -0.6066,-1.798242 -0.39154,-0.386872 0,-3.06741 0,-3.716366 0,-5.186847 -1.02054,-8.695037 3.88234,-10.309919 l 0,52.628545 -99,0 0,-36.201827 c 0.637751,-0.02902 1.761294,-0.075 2.019059,-0.08477 z"
+ style="fill:#01131a;fill-opacity:1;stroke:#01131a;stroke-width:1.5173738px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /></g></svg> \ No newline at end of file
diff --git a/icons/slideshow-extension-point.png b/icons/slideshow-extension-point.png
new file mode 100755
index 0000000..5dbd2e0
--- /dev/null
+++ b/icons/slideshow-extension-point.png
Binary files differ
diff --git a/icons/sprocket.png b/icons/sprocket.png
new file mode 100644
index 0000000..218dfbf
--- /dev/null
+++ b/icons/sprocket.png
Binary files differ
diff --git a/icons/straighten.svg b/icons/straighten.svg
new file mode 100644
index 0000000..df4e8d5
--- /dev/null
+++ b/icons/straighten.svg
@@ -0,0 +1,1238 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="24"
+ height="24"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="straighten_2.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <metadata
+ id="metadata36">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="718"
+ inkscape:window-width="1366"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:zoom="11.313708"
+ inkscape:cx="18.107146"
+ inkscape:cy="15.500233"
+ inkscape:window-x="0"
+ inkscape:window-y="28"
+ inkscape:current-layer="g4711"
+ inkscape:snap-global="false"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4630" />
+ </sodipodi:namedview>
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4703">
+ <stop
+ style="stop-color:#00b6b6;stop-opacity:1;"
+ offset="0"
+ id="stop4705" />
+ <stop
+ style="stop-color:#0084b6;stop-opacity:1;"
+ offset="1"
+ id="stop4707" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4913">
+ <stop
+ id="stop4915"
+ offset="0"
+ style="stop-color:#ff8800;stop-opacity:1;" />
+ <stop
+ id="stop4917"
+ offset="1"
+ style="stop-color:#ffe900;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4713">
+ <stop
+ style="stop-color:#e3a121;stop-opacity:1;"
+ offset="0"
+ id="stop4715" />
+ <stop
+ style="stop-color:#e2d706;stop-opacity:1;"
+ offset="1"
+ id="stop4717" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4707">
+ <stop
+ id="stop4709"
+ offset="0"
+ style="stop-color:#22790f;stop-opacity:1" />
+ <stop
+ id="stop4711"
+ offset="1"
+ style="stop-color:#2abe2b;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3198">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0"
+ id="stop3200" />
+ <stop
+ offset="0.58384681"
+ style="stop-color:#8eb3d9;stop-opacity:0.53608245"
+ id="stop3202" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ id="stop3204" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5105-262-943-861">
+ <stop
+ id="stop2487"
+ style="stop-color:#0d0d0d;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop2489"
+ style="stop-color:#0d0d0d;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="11.25"
+ cy="19.03125"
+ r="8.0625"
+ fx="11.25"
+ fy="19.03125"
+ id="radialGradient2459"
+ xlink:href="#linearGradient5105-262-943-861"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4061954,0,0,0.3867044,-3.8196985,13.522738)" />
+ <linearGradient
+ id="linearGradient3533">
+ <stop
+ id="stop3535"
+ style="stop-color:#b0cce6;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3545"
+ style="stop-color:#83acd5;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="15.372947"
+ y1="5.0471625"
+ x2="15.372947"
+ y2="22.599676"
+ id="linearGradient2517"
+ xlink:href="#linearGradient3533"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4873978,0,0,0.4781595,0.4950536,1.7007118)" />
+ <linearGradient
+ id="linearGradient3266">
+ <stop
+ id="stop3268"
+ style="stop-color:#538ec6;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3270"
+ style="stop-color:#3f84c5;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="33.686768"
+ y1="35.773647"
+ x2="37.039948"
+ y2="29.856804"
+ id="linearGradient2514"
+ xlink:href="#linearGradient3266"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5107033,0,0,0.5010232,0.3489945,0.2504326)" />
+ <linearGradient
+ id="linearGradient3276">
+ <stop
+ id="stop3278"
+ style="stop-color:#83acd5;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3280"
+ style="stop-color:#83acd5;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="31.226292"
+ y1="34.600941"
+ x2="34.96563"
+ y2="26.842505"
+ id="linearGradient2512"
+ xlink:href="#linearGradient3276"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.5107033,0,0,0.5010232,0.3489945,0.2504326)" />
+ <linearGradient
+ id="linearGradient4873">
+ <stop
+ id="stop4875"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4877"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="21.628975"
+ y1="2.1102102"
+ x2="22.245434"
+ y2="43.366352"
+ id="linearGradient2509"
+ xlink:href="#linearGradient4873"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4873978,0,0,0.4781595,0.4950536,1.7007118)" />
+ <linearGradient
+ id="linearGradient3319">
+ <stop
+ id="stop3321"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="0" />
+ <stop
+ id="stop3323"
+ style="stop-color:#ffffff;stop-opacity:0.14383562"
+ offset="0.57424062" />
+ <stop
+ id="stop3325"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="33.386703"
+ y1="41.887085"
+ x2="39.686337"
+ y2="28.50532"
+ id="linearGradient2506"
+ xlink:href="#linearGradient3319"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.4873978,0,0,0.4781595,0.4950536,1.7007118)" />
+ <linearGradient
+ gradientTransform="matrix(0.22110724,0,0,0.22110728,6.6934256,6.693263)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3087-408-4-672-8-5"
+ y2="45.368999"
+ x2="7.0776"
+ y1="3.0816"
+ x1="7.0776">
+ <stop
+ offset="0"
+ style="stop-color:#232323;stop-opacity:1"
+ id="stop5153-9-6" />
+ <stop
+ offset="1"
+ style="stop-color:#747474;stop-opacity:1"
+ id="stop5155-8-8" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.33737863,0,0,0.32783017,40.739235,10.589967)"
+ y2="88.211113"
+ x2="-12.623446"
+ y1="64.191788"
+ x1="-12.623446"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3146"
+ xlink:href="#linearGradient3087-408-4-672-8"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientTransform="matrix(1,0,0,0.14285715,0,34.654626)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient5071-7-3"
+ id="radialGradient4314"
+ fy="40.430397"
+ fx="19.53446"
+ r="23.929714"
+ cy="40.430397"
+ cx="19.53446" />
+ <linearGradient
+ id="linearGradient5071-7-3">
+ <stop
+ offset="0"
+ style="stop-color:#9b6b00;stop-opacity:1;"
+ id="stop5073-2-9" />
+ <stop
+ offset="1"
+ style="stop-color:#c65e00;stop-opacity:0;"
+ id="stop5075-2-1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4623-7-8">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.75494069;"
+ id="stop4625-3-6" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.368"
+ id="stop4627-1-9" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.94191741,0.25183272,-0.17907033,0.66612446,121.0441,28.818071)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4623-7-8"
+ id="linearGradient3109"
+ y2="52.887863"
+ x2="-76.844345"
+ y1="6.6805849"
+ x1="-76.834877" />
+ <linearGradient
+ id="linearGradient3600-9-0">
+ <stop
+ offset="0"
+ style="stop-color:#f4f4f4;stop-opacity:1"
+ id="stop3602-0-8" />
+ <stop
+ offset="1"
+ style="stop-color:#dbdbdb;stop-opacity:1"
+ id="stop3604-9-2" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1.0786784,0.28775775,-0.17353123,0.64477442,2.542677,0.6300187)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3600-9-0"
+ id="linearGradient3106"
+ y2="47.013336"
+ x2="25.132275"
+ y1="0.98520643"
+ x1="25.132275" />
+ <linearGradient
+ id="linearGradient3977-7-9">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop3979-6-2" />
+ <stop
+ offset="0.03626217"
+ style="stop-color:#ffffff;stop-opacity:0.23529412"
+ id="stop3981-3-2" />
+ <stop
+ offset="0.95056331"
+ style="stop-color:#ffffff;stop-opacity:0.15686275"
+ id="stop3983-8-7" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.39215687"
+ id="stop3985-2-7" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.99352183,0.26504064,-0.20865372,0.77527588,5.1631619,-0.9676391)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3977-7-9"
+ id="linearGradient3102"
+ y2="43"
+ x2="23.99999"
+ y1="5.5641499"
+ x1="23.99999" />
+ <linearGradient
+ id="linearGradient4623-7">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.27058825"
+ id="stop4625-3" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.368"
+ id="stop4627-1" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.99682577,5.6082336e-4,2.043022e-4,0.71682639,121.08747,4.8432569)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4623-7"
+ id="linearGradient4712-5"
+ y2="52.887863"
+ x2="-76.844345"
+ y1="6.6805849"
+ x1="-76.834877" />
+ <linearGradient
+ id="linearGradient3600-9">
+ <stop
+ offset="0"
+ style="stop-color:#f4f4f4;stop-opacity:1"
+ id="stop3602-0" />
+ <stop
+ offset="1"
+ style="stop-color:#dbdbdb;stop-opacity:1"
+ id="stop3604-9" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1.1428545,0,0,0.69530686,-3.4285096,8.2459549)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3600-9"
+ id="linearGradient4884"
+ y2="47.013336"
+ x2="25.132275"
+ y1="0.98520643"
+ x1="25.132275" />
+ <linearGradient
+ id="linearGradient4039">
+ <stop
+ offset="0"
+ style="stop-color:#ba3d12;stop-opacity:1"
+ id="stop4041" />
+ <stop
+ offset="1"
+ style="stop-color:#db6737;stop-opacity:1"
+ id="stop4043" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.99999787,0,0,0.613558,5.3026516e-5,12.194657)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4039"
+ id="linearGradient5175"
+ y2="0.57054341"
+ x2="25"
+ y1="44.2915"
+ x1="25" />
+ <linearGradient
+ id="linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-8-3">
+ <stop
+ offset="0"
+ style="stop-color:#ffcd7d;stop-opacity:1"
+ id="stop3750-1-0" />
+ <stop
+ offset="0.26238"
+ style="stop-color:#fc8f36;stop-opacity:1"
+ id="stop3752-3-7" />
+ <stop
+ offset="0.704952"
+ style="stop-color:#e23a0e;stop-opacity:1"
+ id="stop3754-1-8" />
+ <stop
+ offset="1"
+ style="stop-color:#ac441f;stop-opacity:1"
+ id="stop3756-1-6" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(-1.6167276e-7,4.0506272,-8.0921943,-1.2158892e-7,104.56412,-24.663298)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-8-3"
+ id="radialGradient5173"
+ fy="9.9571075"
+ fx="7.2758255"
+ r="12.671875"
+ cy="9.9571075"
+ cx="7.8060555" />
+ <linearGradient
+ id="linearGradient3977-7">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop3979-6" />
+ <stop
+ offset="0.03626217"
+ style="stop-color:#ffffff;stop-opacity:0.23529412"
+ id="stop3981-3" />
+ <stop
+ offset="0.95056331"
+ style="stop-color:#ffffff;stop-opacity:0.15686275"
+ id="stop3983-8" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.39215687"
+ id="stop3985-2" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(1.0540541,0,0,0.83783781,-1.297291,5.8918993)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3977-7"
+ id="linearGradient4881"
+ y2="43"
+ x2="23.99999"
+ y1="5.5641499"
+ x1="23.99999" />
+ <radialGradient
+ gradientTransform="matrix(1.1294118,0,0,0.2823525,-58.729414,19.694118)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3109"
+ r="10.625"
+ cy="4.625"
+ cx="62.625">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1"
+ id="stop8840-3" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0"
+ id="stop8842-5" />
+ </radialGradient>
+ <radialGradient
+ gradientTransform="matrix(0.94117645,0,0,0.23529375,-22.941178,44.411765)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#radialGradient3109"
+ id="radialGradient3296"
+ r="10.625"
+ cy="4.625"
+ cx="62.625" />
+ <linearGradient
+ id="linearGradient4270-7-5">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.32800001"
+ id="stop4272-8-7" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.68000001"
+ id="stop4274-6-3" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(19.745054,0.3004337)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4270-7-5"
+ id="linearGradient3287"
+ y2="46.702221"
+ x2="19.758543"
+ y1="24.734938"
+ x1="19.758543" />
+ <linearGradient
+ id="linearGradient8265-821-176-38-919-66-249-7-7-1-5">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop2687-1-9-6-7" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ id="stop2689-5-4-4-2" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.78156364,0,0,0.81327093,5.205855,7.3544235)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient8265-821-176-38-919-66-249-7-7-1-5"
+ id="linearGradient4873-3"
+ y2="24.627615"
+ x2="20.054544"
+ y1="15.298182"
+ x1="16.626165" />
+ <radialGradient
+ gradientTransform="matrix(0,1.2316483,-1.625754,0,18.486966,-28.721977)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3093-718"
+ r="20.396999"
+ cy="3.99"
+ cx="23.896">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop5115" />
+ <stop
+ offset="0.26238"
+ style="stop-color:#dddddd;stop-opacity:1"
+ id="stop5117" />
+ <stop
+ offset="0.66093999"
+ style="stop-color:#abacae;stop-opacity:1"
+ id="stop5119" />
+ <stop
+ offset="1"
+ style="stop-color:#89898b;stop-opacity:1"
+ id="stop5121" />
+ </radialGradient>
+ <radialGradient
+ gradientTransform="matrix(0,1.1732278,-1.5486399,0,42.179273,-2.7904503)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#radialGradient3093-718"
+ id="radialGradient3370"
+ r="20.396999"
+ cy="3.99"
+ cx="23.896" />
+ <linearGradient
+ id="linearGradient4077-488-880-992">
+ <stop
+ offset="0"
+ style="stop-color:#1b1b1b;stop-opacity:1"
+ id="stop5085" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:1"
+ id="stop5087" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.3777779,0,0,0.3777779,-0.2666777,-0.2672777)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4077-488-880-992"
+ id="linearGradient3367"
+ y2="118.82703"
+ x2="83.589935"
+ y1="73.438828"
+ x1="83.589935" />
+ <linearGradient
+ id="linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-641-289-620-227-114-444-680-744-921-551-3-685-166-313">
+ <stop
+ offset="0"
+ style="stop-color:#3e3e3e;stop-opacity:1"
+ id="stop5075" />
+ <stop
+ offset="0.26238"
+ style="stop-color:#343434;stop-opacity:1"
+ id="stop5077" />
+ <stop
+ offset="0.704952"
+ style="stop-color:#272727;stop-opacity:1"
+ id="stop5079" />
+ <stop
+ offset="1"
+ style="stop-color:#1d1d1d;stop-opacity:1"
+ id="stop5081" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0,0.84903112,-0.99029401,-2.4719546e-8,58.806002,18.893712)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-641-289-620-227-114-444-680-744-921-551-3-685-166-313"
+ id="radialGradient3365"
+ fy="22.955328"
+ fx="10.229324"
+ r="19.99999"
+ cy="22.955328"
+ cx="10.229324" />
+ <linearGradient
+ gradientTransform="matrix(0.5135135,0,0,0.5135135,-24.836132,-1.021284)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3101-4-766"
+ y2="44.341"
+ x2="71.204002"
+ y1="6.2375998"
+ x1="71.204002">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop5091" />
+ <stop
+ offset="0.50775999"
+ style="stop-color:#ffffff;stop-opacity:0.23529412"
+ id="stop5093" />
+ <stop
+ offset="0.83456999"
+ style="stop-color:#ffffff;stop-opacity:0.15686275"
+ id="stop5095" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.39215687"
+ id="stop5097" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.40540542,0,0,0.40541182,6.9188398,25.719156)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3101-4-766"
+ id="linearGradient3362"
+ y2="44.341"
+ x2="71.204002"
+ y1="6.2375998"
+ x1="71.204002" />
+ <linearGradient
+ id="linearGradient3707-319-631-407-324-616-79">
+ <stop
+ offset="0"
+ style="stop-color:#787878;stop-opacity:1"
+ id="stop5194" />
+ <stop
+ offset="1"
+ style="stop-color:#474747;stop-opacity:1"
+ id="stop5196" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0,0.5852684,-0.77254394,0,39.068868,15.666161)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3707-319-631-407-324-616-79"
+ id="radialGradient3359"
+ fy="4.0774455"
+ fx="24.780325"
+ r="20.396999"
+ cy="4.0774455"
+ cx="24.780325" />
+ <linearGradient
+ gradientTransform="matrix(0.22110724,0,0,0.22110728,6.6934256,6.693263)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3087-408-4-672-8"
+ y2="45.368999"
+ x2="7.0776"
+ y1="3.0816"
+ x1="7.0776">
+ <stop
+ offset="0"
+ style="stop-color:#232323;stop-opacity:1"
+ id="stop5153-9" />
+ <stop
+ offset="1"
+ style="stop-color:#747474;stop-opacity:1"
+ id="stop5155-8" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3087-408-4-672-8"
+ id="linearGradient3322"
+ y2="88.211113"
+ x2="-12.623446"
+ y1="64.191788"
+ x1="-12.623446" />
+ <linearGradient
+ id="linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-691-923">
+ <stop
+ offset="0"
+ style="stop-color:#432f91;stop-opacity:1"
+ id="stop5181" />
+ <stop
+ offset="1"
+ style="stop-color:#1972a2;stop-opacity:1"
+ id="stop5183" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0,0.35194562,-0.46456203,0,37.853602,24.363529)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient2867-449-88-871-390-598-476-591-434-148-57-177-691-923"
+ id="radialGradient3355"
+ r="20.396999"
+ cy="3.99"
+ cx="23.896" />
+ <linearGradient
+ id="linearGradient4278-757">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0"
+ id="stop5107" />
+ <stop
+ offset="0.5"
+ style="stop-color:#000000;stop-opacity:0"
+ id="stop5109" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:1"
+ id="stop5111" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0.40504497,-6.0397591e-8,5.6748104e-8,0.38057038,-2.8816551,-0.4513398)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4278-757"
+ id="radialGradient3352"
+ fy="95.388451"
+ fx="95.838364"
+ r="9.4981718"
+ cy="95.388451"
+ cx="95.838364" />
+ <linearGradient
+ id="linearGradient3990-3-968">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop5069" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ id="stop5071" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3990-3-968"
+ id="linearGradient3328"
+ y2="65.922028"
+ x2="68.313301"
+ y1="52.925316"
+ x1="68.313301" />
+ <linearGradient
+ id="linearGradient4174-396">
+ <stop
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0.736"
+ id="stop5101" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0.096"
+ id="stop5103" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0,-0.33333336,0.33333336,0,25.333369,67.999402)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient4174-396"
+ id="linearGradient3348"
+ y2="31.999891"
+ x2="122.7144"
+ y1="31.999891"
+ x1="79" />
+ <linearGradient
+ id="linearGradient8265-821-176-38-919-66-249-7-7-1-5-7-842">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop5135" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ id="stop5137" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.4522551,0,0,0.60960849,25.124691,22.517134)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient8265-821-176-38-919-66-249-7-7-1-5-7-842"
+ id="linearGradient3345"
+ y2="24.627615"
+ x2="20.054544"
+ y1="15.298182"
+ x1="16.626165" />
+ <linearGradient
+ id="linearGradient5187-627">
+ <stop
+ offset="0"
+ style="stop-color:#cc70ff;stop-opacity:1"
+ id="stop5147" />
+ <stop
+ offset="1"
+ style="stop-color:#9361ed;stop-opacity:0"
+ id="stop5149" />
+ </linearGradient>
+ <radialGradient
+ gradientTransform="matrix(0.2125759,-0.05186244,0.04347626,0.17820226,15.259174,37.686556)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient5187-627"
+ id="radialGradient3339"
+ fy="50.888916"
+ fx="95.087158"
+ r="23.499998"
+ cy="50.888916"
+ cx="95.087158" />
+ <linearGradient
+ gradientTransform="matrix(0.5135135,0,0,0.5135135,-24.836132,-1.021284)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3101"
+ y2="44.341"
+ x2="71.204002"
+ y1="6.2375998"
+ x1="71.204002">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ id="stop4013-8" />
+ <stop
+ offset="0.50775999"
+ style="stop-color:#ffffff;stop-opacity:0.23529412"
+ id="stop4015-11" />
+ <stop
+ offset="0.83456999"
+ style="stop-color:#ffffff;stop-opacity:0.15686275"
+ id="stop4017-4" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.39215687"
+ id="stop4019-3" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="matrix(0.5135135,0,0,0.5135135,-0.836132,22.978716)"
+ gradientUnits="userSpaceOnUse"
+ xlink:href="#linearGradient3101"
+ id="linearGradient3290"
+ y2="44.341"
+ x2="71.204002"
+ y1="6.2375998"
+ x1="71.204002" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3163-6"
+ id="linearGradient2781"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6134245,0,0,0.6095496,26.745048,-3.078874)"
+ x1="25"
+ y1="11.923377"
+ x2="25"
+ y2="40.32198" />
+ <linearGradient
+ id="linearGradient3163-6">
+ <stop
+ style="stop-color:#82cf72;stop-opacity:1;"
+ offset="0"
+ id="stop3165" />
+ <stop
+ style="stop-color:#3d8125;stop-opacity:1;"
+ offset="1"
+ id="stop3167" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5113"
+ inkscape:collect="always">
+ <stop
+ id="stop5115-3"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop5117-6"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter4703"
+ x="-0.13171892"
+ width="1.2634378"
+ y="-0.15326274"
+ height="1.3065255">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2431513"
+ id="feGaussianBlur4705" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4909"
+ x="-0.15004265"
+ width="1.3000853"
+ y="-0.31181566"
+ height="1.6236313">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.30062305"
+ id="feGaussianBlur4911" />
+ </filter>
+ <linearGradient
+ id="linearGradient3650-0">
+ <stop
+ style="stop-color:#2e3436;stop-opacity:1;"
+ offset="0"
+ id="stop3662-3" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="1"
+ id="stop3664-7" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3624-10">
+ <stop
+ id="stop3626-4"
+ offset="0"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#f57900;stop-opacity:1;"
+ offset="0.16829631"
+ id="stop3638-2" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0.34493041"
+ id="stop3636-74" />
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0.51930183"
+ id="stop3634-0" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0.69330686"
+ id="stop3632-3" />
+ <stop
+ id="stop3640-2"
+ offset="0.82747382"
+ style="stop-color:#75507b;stop-opacity:1;" />
+ <stop
+ id="stop3628-8"
+ offset="1"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3672-2">
+ <stop
+ id="stop3674-6"
+ style="stop-color:#808080;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3676-9"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective3259" />
+ <linearGradient
+ id="linearGradient3650-2">
+ <stop
+ style="stop-color:#2e3436;stop-opacity:1;"
+ offset="0"
+ id="stop3662-0" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="1"
+ id="stop3664-2" />
+ </linearGradient>
+ <linearGradient
+ y2="6"
+ x2="28.5"
+ y1="6"
+ x1="3.5"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3648"
+ xlink:href="#linearGradient3650-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3624-1">
+ <stop
+ id="stop3626-3"
+ offset="0"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#f57900;stop-opacity:1;"
+ offset="0.16829631"
+ id="stop3638-7" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0.34493041"
+ id="stop3636-7" />
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0.51930183"
+ id="stop3634-2" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0.69330686"
+ id="stop3632-6" />
+ <stop
+ id="stop3640-4"
+ offset="0.82747382"
+ style="stop-color:#75507b;stop-opacity:1;" />
+ <stop
+ id="stop3628-5"
+ offset="1"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="6"
+ x2="28.5"
+ y1="6"
+ x1="3.5"
+ id="linearGradient3630"
+ xlink:href="#linearGradient3624-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3672-0">
+ <stop
+ id="stop3674-1"
+ style="stop-color:#808080;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3676-0"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="6"
+ x2="28.5"
+ y1="6"
+ x1="3.5"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3670"
+ xlink:href="#linearGradient3672-0"
+ inkscape:collect="always" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective3141" />
+ <linearGradient
+ id="linearGradient3650">
+ <stop
+ style="stop-color:#2e3436;stop-opacity:1;"
+ offset="0"
+ id="stop3662" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:1;"
+ offset="1"
+ id="stop3664" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3624">
+ <stop
+ id="stop3626"
+ offset="0"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#f57900;stop-opacity:1;"
+ offset="0.16829631"
+ id="stop3638" />
+ <stop
+ style="stop-color:#edd400;stop-opacity:1;"
+ offset="0.34493041"
+ id="stop3636" />
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0.51930183"
+ id="stop3634" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1;"
+ offset="0.69330686"
+ id="stop3632" />
+ <stop
+ id="stop3640"
+ offset="0.82747382"
+ style="stop-color:#75507b;stop-opacity:1;" />
+ <stop
+ id="stop3628"
+ offset="1"
+ style="stop-color:#cc0000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3672">
+ <stop
+ id="stop3674"
+ style="stop-color:#808080;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3676"
+ style="stop-color:#00b2b2;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3600-9-0"
+ id="linearGradient4734"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1213382,0.29913804,-0.18039407,0.67027405,13.090564,-5.455519)"
+ x1="25.132275"
+ y1="0.98520643"
+ x2="25.132275"
+ y2="47.013336" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4736"
+ gradientUnits="userSpaceOnUse"
+ x1="12.760963"
+ y1="30.010126"
+ x2="31.327831"
+ y2="30.010126"
+ gradientTransform="matrix(0.96015627,0,0,0.96015627,1.3470852,1.6083629)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4913"
+ id="linearGradient4738"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6134245,0,0,0.6095496,36.462999,11.194839)"
+ x1="29.740108"
+ y1="32.968552"
+ x2="19.005157"
+ y2="10.157225" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5113"
+ id="linearGradient4740"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.6162702,0,0,0.6095496,70.214433,9.3370605)"
+ x1="58.748795"
+ y1="2.047786"
+ x2="105.32369"
+ y2="58.047787" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5071-7-3"
+ id="linearGradient4742"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(10.530178,16.501498)"
+ x1="8.5625"
+ y1="5.4055738"
+ x2="9.4961023"
+ y2="2.0305738" />
+ </defs>
+ <g
+ id="g3832"
+ transform="translate(-10.833184,-16.074749)">
+ <g
+ transform="matrix(-0.73081866,0,0,0.73081866,42.058727,5.0022716)"
+ id="g4726" />
+ <g
+ id="g4748">
+ <g
+ id="g4711"
+ transform="translate(-0.41598227,-0.2920011)">
+ <path
+ d="m 29.219378,39.406623 -17.04193,-4.529859 3.629682,-13.43784 17.041931,4.529859 z"
+ id="path4713"
+ style="color:#000000;fill:none;stroke:#6e6e6e;stroke-width:1.92031252;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 15.425816,20.993643 c 4.119655,1.095031 17.977662,4.779537 17.977662,4.779537 l -3.802767,14.078725 c 0,0 -11.985283,-3.185768 -17.977925,-4.778654 1.267676,-4.693199 2.535349,-9.386397 3.803026,-14.079598 z"
+ id="path4715"
+ style="fill:url(#linearGradient4734);fill-opacity:1;stroke:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 16.766798,23.087829 c 3.30437,0.878323 14.419862,3.833638 14.419862,3.833638 l -2.926951,10.836251 c 0,0 -9.613377,-2.555299 -14.420066,-3.832949 0.975718,-3.612312 1.951437,-7.224625 2.927154,-10.836937 z"
+ id="path4717"
+ style="color:#000000;fill:url(#linearGradient4736);fill-opacity:1;fill-rule:nonzero;stroke:#2683a8;stroke-width:0.48007813;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00217938;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.00217942, 1.00217942;stroke-dashoffset:0"
+ d="m 13.259822,29.858107 16.977622,0"
+ id="path4719"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4722"
+ d="m 21.773677,23.360908 0,13.591361"
+ style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ transform="matrix(-0.73081866,0,0,0.73081866,41.246227,4.7522718)"
+ sodipodi:nodetypes="cccccccc"
+ id="path4724"
+ d="m 12.306795,28.698783 7.382718,8.518163 7.345715,-8.518163 -3.736853,0 c -1.255863,-3.34397 -3.80826,-6.840742 -0.818202,-6.840742 2.453526,-0.188398 13.367749,-4.494582 2.976518,-4.108078 -5.60924,0 -9.77606,4.326942 -9.461318,10.94882 z"
+ style="opacity:0.61209962;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4703)"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient4738);fill-opacity:1;fill-rule:nonzero;stroke:#dba100;stroke-width:0.99999952000000003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+ d="m 23.984813,15.777479 c 4.129023,0 6.709134,1.885249 8.723094,4.83191 l -3.420821,0.897966 c -1.319427,-0.393456 -2.165359,-0.256562 -3.121499,-0.256562 -2.990058,0 -5.57465,2.129344 -4.318787,5.473314 l 3.720143,0 -7.312006,8.509293 -7.397526,-8.509293 3.677383,0 c -0.314741,-6.621878 3.840779,-10.946628 9.450019,-10.946628 z"
+ id="path4728"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sccscccccs"
+ transform="matrix(-0.73081866,0,0,0.73081866,42.058727,5.002272)" />
+ <path
+ style="opacity:0.35400007999999999;fill:none;stroke:url(#linearGradient4740);stroke-width:0.99999945999999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 13.071755,27.722304 5.163909,5.926634 5.131595,-5.926634 -2.191633,0 c -1.921899,-4.253649 0.898137,-7.3408 4.706221,-7.401774 2.742676,-0.2896 2.519157,0.08349 3.364007,0.125573 0.844851,-0.104943 0.548256,-0.215886 1.671707,-0.488818 -2.126328,-2.368185 -4.601067,-3.183787 -6.946393,-3.188198 -4.739015,-0.0089 -9.393222,3.841886 -8.345563,10.953217 z"
+ id="path4730"
+ sodipodi:nodetypes="cccccccccc"
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.73081866,0,0,0.73081866,42.058727,5.002272)" />
+ <path
+ style="fill:url(#linearGradient4742);fill-opacity:1;stroke:none;filter:url(#filter4909)"
+ d="m 17.530178,20.282748 3.1875,0.8125 c 0,0 2.828398,-0.09398 3.09375,-0.3125 0.973949,-0.802071 -2.350446,-4.367511 -3.3125,-3.375 -1.290443,0.639334 -2.135937,1.748253 -2.96875,2.875 z"
+ id="path4732"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscc" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/three-star-filter-plus.svg b/icons/three-star-filter-plus.svg
new file mode 100644
index 0000000..550d6ab
--- /dev/null
+++ b/icons/three-star-filter-plus.svg
@@ -0,0 +1,358 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="three-star-filter-plus.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="110"
+ height="30"
+ viewBox="0 0 110 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3607"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-60.536186"
+ x2="-32.249207"
+ y1="-48.952423"
+ x1="-44.715599"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-4"
+ xlink:href="#path2428_1_-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-1"><stop
+ id="stop10-6"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-3"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective2875"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-8"><stop
+ id="stop10-9-7"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3612"
+ id="linearGradient3618"
+ x1="49.337769"
+ y1="20.002615"
+ x2="40.295216"
+ y2="10.759528"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616" /></linearGradient><inkscape:perspective
+ id="perspective3697"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-9"
+ id="linearGradient3684-5"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-9"><stop
+ id="stop10-66"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-1"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889-7"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612-5"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614-5" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616-6" /></linearGradient><inkscape:perspective
+ id="perspective3789"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6"
+ xlink:href="#path2428_1_-34"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34"><stop
+ id="stop10-7"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective3850"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6-3"
+ xlink:href="#path2428_1_-34-4"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34-4"><stop
+ id="stop10-7-6"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6-2"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="18.840697"
+ inkscape:cx="23.734627"
+ inkscape:zoom="8"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3744"
+ width="18.07069"
+ height="4.0127206"
+ x="89.872849"
+ y="12.834166" /><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3742"
+ width="4.0202866"
+ height="18.007797"
+ x="96.881729"
+ y="5.7885885" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="M 14.974021,1.6037673 10.73812,10.270486 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.4768752,1.360062 6.877622,6.687061 c 0.091469,0.09256 0.1295816,0.225406 0.1001807,0.35281 L 6.3661051,28.33023 14.860775,23.860211 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 14.974021,1.6037673 z"
+ id="path2428-4-8" /><path
+ style="fill:url(#linearGradient3218);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><g
+ style="font-size:37.43058394999999905px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#7d7d7d;fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif"
+ id="text3633"
+ transform="matrix(1.2245423,0,0,1.2245423,43.644182,-3.9917374)"><path
+ d="m 46.416154,8.3360248 0,5.7461792 5.724247,0 0,2.587974 -5.724247,0 0,5.746179 -2.609906,0 0,-5.746179 -5.724247,0 0,-2.587974 5.724247,0 0,-5.7461792 2.609906,0"
+ style="font-size:22.45834922999999961px;font-weight:bold;fill:#7d7d7d;fill-opacity:1;stroke:#000000;stroke-width:0.20000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+ id="path3638" /></g><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6"
+ transform="translate(30,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 44.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 44.974021,1.603767 z"
+ id="path2428-4-8-2" /><path
+ style="fill:url(#linearGradient3218-6);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 44.977,2.7879997 41.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.7879997 z"
+ id="path2428-4-3" /><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6-2"
+ transform="translate(60,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 74.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 74.974021,1.603767 z"
+ id="path2428-4-8-2-1" /><path
+ style="fill:url(#linearGradient3218-6-3);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 74.977,2.7879997 71.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.7879997 z"
+ id="path2428-4-3-9" /></g></svg> \ No newline at end of file
diff --git a/icons/three-stars.svg b/icons/three-stars.svg
new file mode 100644
index 0000000..4a0be5e
--- /dev/null
+++ b/icons/three-stars.svg
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="three-stars.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="90"
+ height="30"
+ viewBox="0 0 90 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" />
+ </linearGradient>
+
+<inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_-3"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4042"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-0"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7"><stop
+ id="stop10-9-3"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4101"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051-2"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7-9"><stop
+ id="stop10-9-3-2"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7-6"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,118.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4110"
+ xlink:href="#path2428_1_-3-7-9"
+ inkscape:collect="always" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="9.4130776"
+ inkscape:cx="37.502016"
+ inkscape:zoom="13.45"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0"
+ objecttolerance="10000"
+ guidetolerance="10000">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background"><rect
+ style="fill:#000000;fill-opacity:0.62222224;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+ id="rect3239"
+ width="90.111526"
+ height="30.037174"
+ x="0.074349441"
+ y="0.037174076" /></g><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:url(#linearGradient3218)"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><path
+ style="fill:url(#linearGradient4051);display:inline"
+ d="m 44.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.788 z"
+ id="path2428-4-1" /><path
+ style="fill:url(#linearGradient4110);display:inline"
+ d="m 74.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 79.063,10.898 78.964,10.83 78.911,10.729 L 74.977,2.788 z"
+ id="path2428-4-1-4" /></g></svg> \ No newline at end of file
diff --git a/icons/two-star-filter-plus.svg b/icons/two-star-filter-plus.svg
new file mode 100644
index 0000000..3f6d717
--- /dev/null
+++ b/icons/two-star-filter-plus.svg
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="two-star-filter-plus.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="80"
+ height="30"
+ viewBox="0 0 80 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+
+<linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient2829"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective3607"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-60.536186"
+ x2="-32.249207"
+ y1="-48.952423"
+ x1="-44.715599"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-4"
+ xlink:href="#path2428_1_-1"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-1"><stop
+ id="stop10-6"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-3"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><inkscape:perspective
+ id="perspective2875"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_"
+ id="linearGradient3684"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-8"><stop
+ id="stop10-9-7"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-3"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3612"
+ id="linearGradient3618"
+ x1="49.337769"
+ y1="20.002615"
+ x2="40.295216"
+ y2="10.759528"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616" /></linearGradient><inkscape:perspective
+ id="perspective3697"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-9"
+ id="linearGradient3684-5"
+ x1="40.289215"
+ y1="11.247496"
+ x2="45.111202"
+ y2="15.376191"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-9"><stop
+ id="stop10-66"
+ style="stop-color:#e0e0e0;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-1"
+ style="stop-color:#454545;stop-opacity:1;"
+ offset="1" /></linearGradient><linearGradient
+ y2="9.9702187"
+ x2="40.538078"
+ y1="21.004431"
+ x1="49.944931"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2889-7"
+ xlink:href="#linearGradient3612-5"
+ inkscape:collect="always" /><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3612-5"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3614-5" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3616-6" /></linearGradient><inkscape:perspective
+ id="perspective3789"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-57.139297"
+ x2="-35.584976"
+ y1="-46.334759"
+ x1="-45.430847"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-6"
+ xlink:href="#path2428_1_-34"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-34"><stop
+ id="stop10-7"
+ style="stop-color:#e0e0e0;stop-opacity:1;"
+ offset="0" /><stop
+ id="stop12-6"
+ style="stop-color:#373737;stop-opacity:1;"
+ offset="1" /></linearGradient></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="20.215697"
+ inkscape:cx="4.484627"
+ inkscape:zoom="8"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3744"
+ width="18.07069"
+ height="4.0127206"
+ x="59.872849"
+ y="12.834166" /><rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3742"
+ width="4.0202866"
+ height="18.007797"
+ x="66.881729"
+ y="5.7885885" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="M 14.974021,1.6037673 10.73812,10.270486 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.4768752,1.360062 6.877622,6.687061 c 0.091469,0.09256 0.1295816,0.225406 0.1001807,0.35281 L 6.3661051,28.33023 14.860775,23.860211 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 14.974021,1.6037673 z"
+ id="path2428-4-8" /><path
+ style="fill:url(#linearGradient3218);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><g
+ style="font-size:37.43058395px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:url(#linearGradient3684);fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif"
+ id="text3633"
+ transform="matrix(1.2245423,0,0,1.2245423,13.644182,-3.9917374)"><path
+ d="m 46.416154,8.3360248 0,5.7461792 5.724247,0 0,2.587974 -5.724247,0 0,5.746179 -2.609906,0 0,-5.746179 -5.724247,0 0,-2.587974 5.724247,0 0,-5.7461792 2.609906,0"
+ style="font-size:22.45834922999999961px;font-weight:bold;fill:#7d7d7d;fill-opacity:1;stroke:#000000;stroke-width:0.20000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+ id="path3638" /></g><polygon
+ style="fill:#427bc3;display:inline"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465-6"
+ transform="translate(30,0)" /><path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+ d="m 44.974021,1.603767 -4.235901,8.666719 c -0.0392,0.08275 -0.106714,0.149182 -0.189472,0.186205 -0.02287,0.01089 -0.04682,0.02069 -0.07078,0.02613 l -9.476875,1.360062 6.877622,6.687061 c 0.09147,0.09256 0.129581,0.225406 0.100181,0.35281 l -1.612691,9.447476 8.49467,-4.470019 c 0.107802,-0.05444 0.234117,-0.05336 0.341921,0 l 8.47289,4.455862 -1.633381,-9.469253 c -0.02178,-0.11978 0.01743,-0.245006 0.102363,-0.33212 l 6.875444,-6.721906 -9.474697,-1.341551 c -0.12196,-0.01634 -0.229763,-0.09038 -0.287476,-0.200361 L 44.974021,1.603767 z"
+ id="path2428-4-8-2" /><path
+ style="fill:url(#linearGradient3218-6);fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="M 44.977,2.7879997 41.087,10.747 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.7879997 z"
+ id="path2428-4-3" /></g></svg> \ No newline at end of file
diff --git a/icons/two-stars.svg b/icons/two-stars.svg
new file mode 100644
index 0000000..65ac773
--- /dev/null
+++ b/icons/two-stars.svg
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="svg2"
+ sodipodi:version="0.32"
+ sodipodi:modified="TRUE"
+ inkscape:export-ydpi="45"
+ inkscape:export-xdpi="45"
+ sodipodi:docname="one-star.svg"
+ inkscape:version="0.47 r22583"
+ inkscape:export-filename="D:\proj\icons\released\icon_star.png"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ x="0px"
+ y="0px"
+ width="60"
+ height="30"
+ viewBox="0 0 60 30"
+ enable-background="new 0 0 30 30"
+ xml:space="preserve"
+ style="display:inline"><metadata
+ id="metadata17"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs15"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 15 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="30 : 15 : 1"
+ inkscape:persp3d-origin="15 : 10 : 1"
+ id="perspective19" />
+
+
+
+ <linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_">
+ <stop
+ id="stop10"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" />
+ <stop
+ id="stop12"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" />
+ </linearGradient>
+
+<inkscape:perspective
+ id="perspective3209"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#path2428_1_-3"
+ id="linearGradient2829-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ x1="-43.2197"
+ y1="-49.6968"
+ x2="-32.297298"
+ y2="-58.5979" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3"><stop
+ id="stop10-9"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218"
+ xlink:href="#path2428_1_-3"
+ inkscape:collect="always" /><inkscape:perspective
+ id="perspective4042"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" /><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3218-0"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /><linearGradient
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,58.9338,-31.8961)"
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientUnits="userSpaceOnUse"
+ id="path2428_1_-3-7"><stop
+ id="stop10-9-3"
+ style="stop-color:#ffffff;stop-opacity:0.92156863;"
+ offset="0" /><stop
+ id="stop12-2-7"
+ style="stop-color:#bababa;stop-opacity:0.92156863;"
+ offset="1" /></linearGradient><linearGradient
+ y2="-58.5979"
+ x2="-32.297298"
+ y1="-49.6968"
+ x1="-43.2197"
+ gradientTransform="matrix(0.9948,0.1014,0.1014,-0.9948,88.9338,-31.8961)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4051"
+ xlink:href="#path2428_1_-3-7"
+ inkscape:collect="always" /></defs>
+<sodipodi:namedview
+ width="30px"
+ height="30px"
+ id="base"
+ showguides="true"
+ pagecolor="#ffffff"
+ inkscape:cy="15.361033"
+ inkscape:cx="18.810408"
+ inkscape:zoom="13.45"
+ gridtolerance="10000"
+ showgrid="false"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ inkscape:snap-global="true"
+ inkscape:window-y="24"
+ inkscape:window-x="1"
+ inkscape:window-height="1000"
+ inkscape:window-width="1679"
+ inkscape:grid-points="true"
+ inkscape:current-layer="layer2"
+ inkscape:document-units="px"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:window-maximized="0"
+ objecttolerance="10000"
+ guidetolerance="10000">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2395"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+</sodipodi:namedview>
+<polygon
+ style="fill:#427bc3"
+ points="16,12.5 22,12.5 22,12.5 "
+ id="rect3465" />
+<g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="black_background"><rect
+ style="fill:#000000;fill-opacity:0.62222224;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none"
+ id="rect3239"
+ width="60.074352"
+ height="30.037174"
+ x="0.074349441"
+ y="0.037174076" /></g><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="stars"
+ style="display:inline"><path
+ style="fill:url(#linearGradient3218)"
+ d="m 14.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 19.063,10.898 18.964,10.83 18.911,10.729 L 14.977,2.788 z"
+ id="path2428-4" /><path
+ style="fill:url(#linearGradient4051);display:inline"
+ d="m 44.977,2.788 -3.89,7.959 c -0.036,0.076 -0.098,0.137 -0.174,0.171 -0.021,0.01 -0.043,0.019 -0.065,0.024 l -8.703,1.249 6.316,6.141 c 0.084,0.085 0.119,0.207 0.092,0.324 l -1.481,8.676 7.801,-4.105 c 0.099,-0.05 0.215,-0.049 0.314,0 l 7.781,4.092 -1.5,-8.696 c -0.02,-0.11 0.016,-0.225 0.094,-0.305 l 6.314,-6.173 -8.701,-1.232 C 49.063,10.898 48.964,10.83 48.911,10.729 L 44.977,2.788 z"
+ id="path2428-4-1" /></g></svg> \ No newline at end of file
diff --git a/icons/videos-page.png b/icons/videos-page.png
new file mode 100644
index 0000000..8aeb199
--- /dev/null
+++ b/icons/videos-page.png
Binary files differ
diff --git a/icons/zoom-in.png b/icons/zoom-in.png
new file mode 100644
index 0000000..af84614
--- /dev/null
+++ b/icons/zoom-in.png
Binary files differ
diff --git a/icons/zoom-out.png b/icons/zoom-out.png
new file mode 100644
index 0000000..6c674df
--- /dev/null
+++ b/icons/zoom-out.png
Binary files differ
diff --git a/misc/org.yorba.shotwell-extras.gschema.xml b/misc/org.yorba.shotwell-extras.gschema.xml
new file mode 100644
index 0000000..17e66c7
--- /dev/null
+++ b/misc/org.yorba.shotwell-extras.gschema.xml
@@ -0,0 +1,38 @@
+<schemalist>
+
+<schema id="org.yorba.shotwell.sharing.org-yorba-shotwell-publishing-yandex-fotki" path="/org/yorba/shotwell/sharing/org-yorba-shotwell-publishing-yandex-fotki/">
+ <key name="auth-token" type="s">
+ <default>""</default>
+ <summary>authentication token</summary>
+ <description>Yandex-Fotki authentication token, if logged in.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.org-yorba-shotwell-publishing-tumblr" path="/org/yorba/shotwell/sharing/org-yorba-shotwell-publishing-tumblr/">
+ <key name="token" type="s">
+ <default>""</default>
+ <summary>Token</summary>
+ <description>The token to access tumblr</description>
+ </key>
+
+ <key name="token-secret" type="s">
+ <default>""</default>
+ <summary>Secret token</summary>
+ <description>The secret token to sign oauth requests</description>
+ </key>
+
+ <key name="default-size" type="i">
+ <default>2</default>
+ <summary>default size</summary>
+ <description>A numeric code representing the default size for photos uploaded to Tumblr</description>
+ </key>
+
+ <key name="default-blog" type="i">
+ <default>0</default>
+ <summary>default blog</summary>
+ <description>The name of the default blog of the user, if any</description>
+ </key>
+</schema>
+
+</schemalist>
+
diff --git a/misc/org.yorba.shotwell.gschema.xml b/misc/org.yorba.shotwell.gschema.xml
new file mode 100644
index 0000000..e0e9448
--- /dev/null
+++ b/misc/org.yorba.shotwell.gschema.xml
@@ -0,0 +1,689 @@
+<schemalist>
+
+<schema id="org.yorba.shotwell" path="/org/yorba/shotwell/">
+ <child name="preferences" schema="org.yorba.shotwell.preferences" />
+ <child name="sharing" schema="org.yorba.shotwell.sharing" />
+ <child name="video" schema="org.yorba.shotwell.video" />
+ <child name="printing" schema="org.yorba.shotwell.printing" />
+ <child name="plugins" schema="org.yorba.shotwell.plugins" />
+</schema>
+
+<schema id="org.yorba.shotwell.preferences" path="/org/yorba/shotwell/preferences/">
+ <child name="ui" schema="org.yorba.shotwell.preferences.ui" />
+ <child name="slideshow" schema="org.yorba.shotwell.preferences.slideshow" />
+ <child name="window" schema="org.yorba.shotwell.preferences.window" />
+ <child name="files" schema="org.yorba.shotwell.preferences.files" />
+ <child name="editing" schema="org.yorba.shotwell.preferences.editing" />
+</schema>
+
+<schema id="org.yorba.shotwell.preferences.ui" path="/org/yorba/shotwell/preferences/ui/">
+ <key name="display-basic-properties" type="b">
+ <default>true</default>
+ <summary>display basic properties</summary>
+ <description>True if the basic properties pane is to be displayed, false otherwise.</description>
+ </key>
+
+ <key name="display-extended-properties" type="b">
+ <default>false</default>
+ <summary>display extended properties</summary>
+ <description>True if the extended properties window is to be displayed, false otherwise.</description>
+ </key>
+
+ <key name="display-sidebar" type="b">
+ <default>true</default>
+ <summary>display sidebar</summary>
+ <description>True if the sidebar is to be displayed, false otherwise.</description>
+ </key>
+
+ <key name="display-search-bar" type="b">
+ <default>false</default>
+ <summary>display search bar</summary>
+ <description>True if the Search/Filter Toolbar is to be displayed, false otherwise.</description>
+ </key>
+
+ <key name="display-photo-titles" type="b">
+ <default>false</default>
+ <summary>display photo titles</summary>
+ <description>True if photo titles are to be displayed beneath thumbnails in collection views, false otherwise.</description>
+ </key>
+
+ <key name="display-photo-comments" type="b">
+ <default>false</default>
+ <summary>display photo comments</summary>
+ <description>True if photo comments are to be displayed beneath thumbnails in collection views, false otherwise.</description>
+ </key>
+
+ <key name="display-event-comments" type="b">
+ <default>false</default>
+ <summary>display event comments</summary>
+ <description>True if event comments are to be displayed beneath thumbnails in event views, false otherwise.</description>
+ </key>
+
+ <key name="display-photo-tags" type="b">
+ <default>true</default>
+ <summary>display photo tags</summary>
+ <description>True if photo tags are to be listed beneath thumbnails in collection views, false otherwise.</description>
+ </key>
+
+ <key name="display-photo-ratings" type="b">
+ <default>true</default>
+ <summary>display photo ratings</summary>
+ <description>True if a photo's rating should be displayed as overlaid trinket, false otherwise.</description>
+ </key>
+
+ <key name="photo-rating-filter" type="i">
+ <default>0</default>
+ <summary>rating filter level</summary>
+ <description>Determines how to filter photos based on their ratings. 1: Rejected or better, 2: Unrated or better, 3: One or better, 4: Two or better, 5: Three or better, 6: Four or better, 7: Five or better.</description>
+ </key>
+
+ <key name="events-sort-ascending" type="b">
+ <default>false</default>
+ <summary>sort events ascending</summary>
+ <description>True if events should be sorted ascending, false if descending.</description>
+ </key>
+
+ <key name="library-photos-sort-ascending" type="b">
+ <default>false</default>
+ <summary>sort library photos ascending</summary>
+ <description>True if library photos should be sorted ascending, false if descending.</description>
+ </key>
+
+ <key name="library-photos-sort-by" type="i">
+ <default>2</default>
+ <summary>sort library photos criteria</summary>
+ <description>A numeric code that specifies the sort criteria for photos in library views.</description>
+ </key>
+
+ <key name="event-photos-sort-ascending" type="b">
+ <default>true</default>
+ <summary>sort event photos ascending</summary>
+ <description>True if event photos should be sorted ascending, false if descending.</description>
+ </key>
+
+ <key name="event-photos-sort-by" type="i">
+ <default>2</default>
+ <summary>sort event photos criteria</summary>
+ <description>Specifies the sort criteria for event photos.</description>
+ </key>
+
+ <key name="use-24-hour-time" type="b">
+ <default>false</default>
+ <summary>use 24 hour time</summary>
+ <description>True if should display times with a 24 hour clock, false if times should use AM/PM notation.</description>
+ </key>
+
+ <key name="keep-relativity" type="b">
+ <default>true</default>
+ <summary>keep relative time between photos</summary>
+ <description>True if when adjusting time/date of photos, relative time should be maintained. False if all photos should be set to the same time.</description>
+ </key>
+
+ <key name="modify-originals" type="b">
+ <default>false</default>
+ <summary>modify original photo files</summary>
+ <description>True if when adjusting time/date of photos, the original files should be modified as well. False if changes are made only in the database.</description>
+ </key>
+
+ <key name="show-welcome-dialog" type="b">
+ <default>true</default>
+ <summary>show welcome dialog on startup</summary>
+ <description>True if, when on startup, a welcome dialog should be shown. False if it should not be shown.</description>
+ </key>
+
+ <key name="sidebar-position" type="i">
+ <default>180</default>
+ <summary>sidebar position</summary>
+ <description>The width, in pixels, of the sidebar</description>
+ </key>
+
+ <key name="photo-thumbnail-scale" type="i">
+ <default>128</default>
+ <summary>photo thumbnail scale</summary>
+ <description>The scale of photo thumbnails, ranging from 72 to 360.</description>
+ </key>
+
+ <key name="pin-toolbar-state" type="b">
+ <default>false</default>
+ <summary>pin toolbar state</summary>
+ <description>Pin toolbar in fullscreen, or not.</description>
+ </key>
+
+ <key name="background-color" type="s">
+ <default>'#444'</default>
+ <summary>background color</summary>
+ <description>A grayscale color for use as the background color.</description>
+ </key>
+
+ <key name="hide-photos-already-imported" type="b">
+ <default>false</default>
+ <summary>Selection state of "hide photos" option</summary>
+ <description>Last used selection state of the "hide photos already imported" option in the import page.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.preferences.slideshow" path="/org/yorba/shotwell/preferences/slideshow/">
+ <key name="delay" type="d">
+ <default>3.0</default>
+ <summary>delay</summary>
+ <description>Delay (in seconds) between photos in the slideshow.</description>
+ </key>
+
+ <key name="transition-delay" type="d">
+ <default>0.3</default>
+ <summary>transition delay</summary>
+ <description>The time (in seconds) that a transition runs between photos in a slideshow</description>
+ </key>
+
+ <key name="transition-effect-id" type="s">
+ <default>""</default>
+ <summary>transition effect id</summary>
+ <description>The name of the transition effect that will be used between photos when running a slideshow</description>
+ </key>
+
+ <key name="show-title" type="b">
+ <default>false</default>
+ <summary>Show title</summary>
+ <description>Whether to show the title of a photo during the slideshow</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.preferences.window" path="/org/yorba/shotwell/preferences/window/">
+ <key name="library-maximize" type="b">
+ <default>false</default>
+ <summary>maximize library window</summary>
+ <description>True if library application is maximized, false otherwise.</description>
+ </key>
+
+ <key name="library-width" type="i">
+ <default>1024</default>
+ <summary>width of library window</summary>
+ <description>The last recorded width of the library application window.</description>
+ </key>
+
+ <key name="library-height" type="i">
+ <default>768</default>
+ <summary>height of library window</summary>
+ <description>The last recorded height of the library application window.</description>
+ </key>
+
+ <key name="direct-maximize" type="b">
+ <default>false</default>
+ <summary>maximize direct-edit window</summary>
+ <description>True if direct-edit application is maximized, false otherwise.</description>
+ </key>
+
+ <key name="direct-width" type="i">
+ <default>1024</default>
+ <summary>width of direct-edit window</summary>
+ <description>The last recorded width of the direct-edit application window.</description>
+ </key>
+
+ <key name="direct-height" type="i">
+ <default>768</default>
+ <summary>height of direct-edit window</summary>
+ <description>The last recorded height of the direct-edit application window.</description>
+ </key>
+
+ <key name="sidebar-position" type="i">
+ <default>180</default>
+ <summary>sidebar divider position</summary>
+ <description>The last recorded position of the divider between the sidebar and view in library application window.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.preferences.files" path="/org/yorba/shotwell/preferences/files/">
+ <key name="import-dir" type="s">
+ <default>""</default>
+ <summary>import directory</summary>
+ <description>Directory in which imported photo files are placed.</description>
+ </key>
+
+ <key name="auto-import" type="b">
+ <default>false</default>
+ <summary>watch library directory for new files</summary>
+ <description>If true, files added to the library directory are automatically imported.</description>
+ </key>
+
+ <key name="commit-metadata" type="b">
+ <default>false</default>
+ <summary>write metadata to master files</summary>
+ <description>If true, changes to metadata (tags, titles, etc.) are written to the master photo file.</description>
+ </key>
+
+ <key name="use-lowercase-filenames" type="b">
+ <default>false</default>
+ <summary>use lowercase filenames</summary>
+ <description>If true, Shotwell will convert all filenames to lowercase when importing photo files</description>
+ </key>
+
+ <key name="directory-pattern" type="s">
+ <default>""</default>
+ <summary>directory pattern</summary>
+ <description>A string encoding a naming pattern that will be used to name photo directories on import.</description>
+ </key>
+
+ <key name="directory-pattern-custom" type="s">
+ <default>""</default>
+ <summary>directory pattern custom</summary>
+ <description>A string encoding a custom naming pattern that will be used to name photo directories on import.</description>
+ </key>
+
+ <key name="raw-developer-default" type="s">
+ <default>'CAMERA'</default>
+ <summary>RAW developer default</summary>
+ <description>Default option for which RAW developer Shotwell will use.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.crop-settings" path="/org/yorba/shotwell/crop-settings/">
+ <key name="last-crop-menu-choice" type="i">
+ <default>1</default>
+ <summary>Most-recently-used crop aspect ratio menu choice.</summary>
+ <description>A numeric code representing the last crop menu choice the user made.</description>
+ </key>
+ <key name="last-crop-width" type="i">
+ <default>1</default>
+ <summary>Most-recently-used crop custom aspect ratio's numerator.</summary>
+ <description>A nonzero, positive integer representing the width part of the last custom crop ratio the user entered.</description>
+ </key>
+ <key name="last-crop-height" type="i">
+ <default>1</default>
+ <summary>Most-recently-used crop custom aspect ratio's denominator.</summary>
+ <description>A nonzero, positive integer representing the height part of the last custom crop ratio the user entered.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.preferences.editing" path="/org/yorba/shotwell/preferences/editing/">
+ <key name="external-photo-editor" type="s">
+ <default>""</default>
+ <summary>external photo editor</summary>
+ <description>External application used to edit photos.</description>
+ </key>
+
+ <key name="external-raw-editor" type="s">
+ <default>""</default>
+ <summary>external raw editor</summary>
+ <description>External application used to edit RAW photos.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing" path="/org/yorba/shotwell/sharing/">
+ <key name="last-used-service" type="s">
+ <default>""</default>
+ <summary>last used publishing service</summary>
+ <description>A numeric code representing the last service to which photos were published</description>
+ </key>
+
+ <key name="default-service" type="i">
+ <default>1</default>
+ <summary>default publishing service</summary>
+ <description>A numeric code representing the last service to which photos were published</description>
+ </key>
+
+ <child name="facebook" schema="org.yorba.shotwell.sharing.facebook" />
+ <child name="flickr" schema="org.yorba.shotwell.sharing.flickr" />
+ <child name="picasa" schema="org.yorba.shotwell.sharing.picasa" />
+ <child name="youtube" schema="org.yorba.shotwell.sharing.youtube" />
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.facebook" path="/org/yorba/shotwell/sharing/facebook/">
+ <key name="access-token" type="s">
+ <default>""</default>
+ <summary>access token</summary>
+ <description>Facebook OAuth token for the currently logged in session, if any</description>
+ </key>
+
+ <key name="uid" type="s">
+ <default>""</default>
+ <summary>user i.d.</summary>
+ <description>Facebook user i.d. for the currently logged in user, if any</description>
+ </key>
+
+ <key name="user-name" type="s">
+ <default>""</default>
+ <summary>user name</summary>
+ <description>The name of the currently logged in Facebook user, if any</description>
+ </key>
+
+ <key name="default-size" type="i">
+ <default>0</default>
+ <summary>default size code</summary>
+ <description>A numeric code representing the default size for photos published to Facebook</description>
+ </key>
+
+ <key name="strip-metadata" type="b">
+ <default>false</default>
+ <summary>remove sensitive info from uploads</summary>
+ <description>Whether images being uploaded to Facebook should have their metadata removed first</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.flickr" path="/org/yorba/shotwell/sharing/flickr/">
+ <key name="access-phase-token" type="s">
+ <default>""</default>
+ <summary>OAuth Access Phase Token</summary>
+ <description>The authorization token for the currently logged in Flickr user, if any</description>
+ </key>
+
+ <key name="access-phase-token-secret" type="s">
+ <default>""</default>
+ <summary>OAuth Access Phase Token Secret</summary>
+ <description>The cryptographic secret used to sign requests against the authorization token for the currently logged in Flickr user, if any</description>
+ </key>
+
+ <key name="access-phase-username" type="s">
+ <default>""</default>
+ <summary>username</summary>
+ <description>The user name of the currently logged in Flickr user, if any</description>
+ </key>
+
+ <key name="default-size" type="i">
+ <default>2</default>
+ <summary>default size code</summary>
+ <description>A numeric code representing the default size for photos published to Flickr</description>
+ </key>
+
+ <key name="visibility" type="i">
+ <default>1</default>
+ <summary>default visibility</summary>
+ <description>A numeric code representing the default visibility for photos published to Flickr</description>
+ </key>
+
+ <key name="strip-metadata" type="b">
+ <default>false</default>
+ <summary>remove sensitive info from uploads</summary>
+ <description>Whether images being uploaded to Flickr should have their metadata removed first</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.picasa" path="/org/yorba/shotwell/sharing/picasa/">
+ <key name="refresh-token" type="s">
+ <default>""</default>
+ <summary>refresh token</summary>
+ <description>The OAuth token used to refresh the Picasa Web Albums session for the currently logged in user, if any.</description>
+ </key>
+
+ <key name="default-size" type="i">
+ <default>2</default>
+ <summary>default size</summary>
+ <description>A numeric code representing the default size for photos uploaded to Picasa Web Albums</description>
+ </key>
+
+ <key name="last-album" type="s">
+ <default>""</default>
+ <summary>last album</summary>
+ <description>The name of the last album the user published photos to, if any</description>
+ </key>
+
+ <key name="strip-metadata" type="b">
+ <default>false</default>
+ <summary>remove sensitive info from uploads</summary>
+ <description>Whether images being uploaded to Picasa should have their metadata removed first</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.org-yorba-shotwell-publishing-piwigo" path="/org/yorba/shotwell/sharing/org-yorba-shotwell-publishing-piwigo/">
+ <key name="url" type="s">
+ <default>""</default>
+ <summary>Piwigio URL</summary>
+ <description>URL of the Piwigo server.</description>
+ </key>
+
+ <key name="username" type="s">
+ <default>""</default>
+ <summary>username</summary>
+ <description>Piwigo username, if logged in.</description>
+ </key>
+
+ <key name="password" type="s">
+ <default>""</default>
+ <summary>password</summary>
+ <description>Piwigo password, if logged in.</description>
+ </key>
+
+ <key name="remember-password" type="b">
+ <default>false</default>
+ <summary>remember password</summary>
+ <description>If true, remember the Piwigo password.</description>
+ </key>
+
+ <key name="last-category" type="i">
+ <default>-1</default>
+ <summary>last category</summary>
+ <description>The last selected Piwigo category.</description>
+ </key>
+
+ <key name="last-permission-level" type="i">
+ <default>-1</default>
+ <summary>last permission level</summary>
+ <description>The last chosen Piwigo permission level.</description>
+ </key>
+
+ <key name="last-photo-size" type="i">
+ <default>-1</default>
+ <summary>last photo size</summary>
+ <description>A numeric code representing the last photo size preset used when publishing to Piwigo.</description>
+ </key>
+
+ <key name="strip-metadata" type="b">
+ <default>false</default>
+ <summary>remove sensitive info from uploads</summary>
+ <description>Whether images being uploaded to Piwigo should have their metadata removed first</description>
+ </key>
+
+ <key name="last-title-as-comment" type="b">
+ <default>false</default>
+ <summary>if title is set and comment unset, use title as comment for uploads to Piwigo</summary>
+ <description>Whether images being uploaded to Piwigo should have their comment set from the title if title is set and comment unset</description>
+ </key>
+
+ <key name="last-no-upload-tags" type="b">
+ <default>false</default>
+ <summary>do not upload tags when uploading to Piwigo</summary>
+ <description>Whether images being uploaded to Piwigo should have their tags removed on upload, such that these tags will not appear on the remote Piwigo server.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.sharing.youtube" path="/org/yorba/shotwell/sharing/youtube/">
+ <key name="refresh-token" type="s">
+ <default>""</default>
+ <summary>refresh token</summary>
+ <description>The OAuth token used to refresh the YouTube session for the currently logged in user, if any.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.dataimports" path="/org/yorba/shotwell/dataimports/">
+ <key name="last-used-dataimports-service" type="s">
+ <default>""</default>
+ <summary>last used import service</summary>
+ <description>A numeric code representing the last service from which photos were imported</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.video" path="/org/yorba/shotwell/video/">
+ <key name="interpreter-state-cookie" type="i">
+ <default>-1</default>
+ <summary>interpreter state cookie</summary>
+ <description>A numeric code that captures the state of the GStreamer plug-in environment</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.printing" path="/org/yorba/shotwell/printing/">
+ <key name="content-layout" type="i">
+ <default>3</default>
+ <summary>content layout mode</summary>
+ <description>A numeric code that describes how photos are laid out on the page during printing</description>
+ </key>
+
+ <key name="content-ppi" type="i">
+ <default>600</default>
+ <summary>content ppi</summary>
+ <description>The number of pixels per inch (ppi) sent to the printer during printing</description>
+ </key>
+
+ <key name="content-width" type="d">
+ <default>7.0</default>
+ <summary>content width</summary>
+ <description>The width of the printed emulsion on the page when printing</description>
+ </key>
+
+ <key name="content-height" type="d">
+ <default>5.0</default>
+ <summary>content height</summary>
+ <description>The height of the printed emulsion on the page when printing</description>
+ </key>
+
+ <key name="content-units" type="i">
+ <default>1</default>
+ <summary>content units</summary>
+ <description>A numeric code representing unit of measure (inches or centimeters) used when printing</description>
+ </key>
+
+ <key name="images-per-page" type="i">
+ <default>1</default>
+ <summary>images per page code</summary>
+ <description>A numeric code representing the currently selected images per page mode used when printing</description>
+ </key>
+
+ <key name="size-selection" type="i">
+ <default>3</default>
+ <summary>size selection</summary>
+ <description>The index of the current print size in a pre-defined list of standard sizes</description>
+ </key>
+
+ <key name="match-aspect-ratio" type="b">
+ <default>true</default>
+ <summary>match aspect ratio</summary>
+ <description>Determines whether custom print sizes must match the aspect ratio of the original photo</description>
+ </key>
+
+ <key name="print-titles" type="b">
+ <default>false</default>
+ <summary>print titles</summary>
+ <description>True if the title of a photo should be printed when the photo is printed, false otherwise.</description>
+ </key>
+
+ <key name="titles-font" type="s">
+ <default>"Sans Bold 12"</default>
+ <summary>titles font</summary>
+ <description>The name of the font to use for photo titles when they are printed.</description>
+ </key>
+</schema>
+
+<schema id="org.yorba.shotwell.plugins" path="/org/yorba/shotwell/plugins/" >
+ <child name="enable-state" schema="org.yorba.shotwell.plugins.enable-state" />
+</schema>
+
+<schema id="org.yorba.shotwell.plugins.enable-state" path="/org/yorba/shotwell/plugins/enable-state/" >
+ <key name="publishing-facebook" type="b">
+ <default>true</default>
+ <summary>enable facebook publishing plugin</summary>
+ <description>True if the Facebook publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-flickr" type="b">
+ <default>true</default>
+ <summary>enable flickr publishing plugin</summary>
+ <description>True if the Flickr publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-picasa" type="b">
+ <default>true</default>
+ <summary>enable picasa publishing plugin</summary>
+ <description>True if the Picasa Web Albums publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-youtube" type="b">
+ <default>true</default>
+ <summary>enable youtube publishing plugin</summary>
+ <description>True if the YouTube publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-piwigo" type="b">
+ <default>true</default>
+ <summary>enable piwigo publishing plugin</summary>
+ <description>True if the Piwigo publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-yandex-fotki" type="b">
+ <default>false</default>
+ <summary>enable yandex publishing plugin</summary>
+ <description>True if the Yandex.Fotki publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="publishing-tumblr" type="b">
+ <default>false</default>
+ <summary>enable tumblr publishing plugin</summary>
+ <description>True if the Tumblr publishing plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="dataimports-fspot" type="b">
+ <default>true</default>
+ <summary>enable F-Spot import plugin</summary>
+ <description>True if the F-Spot import plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-crumble" type="b">
+ <default>true</default>
+ <summary>enable slideshow crumble transition</summary>
+ <description>True if the Crumble slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-fade" type="b">
+ <default>true</default>
+ <summary>enable slideshow fade transition</summary>
+ <description>True if the Fade slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-slide" type="b">
+ <default>true</default>
+ <summary>enable slideshow slide transition</summary>
+ <description>True if the Slide slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-clock" type="b">
+ <default>true</default>
+ <summary>enable slideshow clock transition</summary>
+ <description>True if the Clock slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-circle" type="b">
+ <default>true</default>
+ <summary>enable slideshow circle transition</summary>
+ <description>True if the Circle slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-circles" type="b">
+ <default>true</default>
+ <summary>enable slideshow circle transition</summary>
+ <description>True if the Circles slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-blinds" type="b">
+ <default>true</default>
+ <summary>enable slideshow slide transition</summary>
+ <description>True if the Blinds slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-squares" type="b">
+ <default>true</default>
+ <summary>enable slideshow squares transition</summary>
+ <description>True if the Squares slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-stripes" type="b">
+ <default>true</default>
+ <summary>enable slideshow stripes transition</summary>
+ <description>True if the Stripes slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+
+ <key name="transitions-chess" type="b">
+ <default>true</default>
+ <summary>enable slideshow chess transition</summary>
+ <description>True if the Chess-Board slideshow transition plugin is enabled, false otherwise</description>
+ </key>
+</schema>
+
+</schemalist>
+
diff --git a/misc/shotwell-viewer.desktop.head b/misc/shotwell-viewer.desktop.head
new file mode 100644
index 0000000..994bc18
--- /dev/null
+++ b/misc/shotwell-viewer.desktop.head
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Version=1.0
+Name=Shotwell Viewer
+GenericName=Photo Viewer
+Exec=shotwell %f
+Icon=shotwell
+Terminal=false
+NoDisplay=true
+Type=Application
+MimeType=image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/x-3fr;image/x-adobe-dng;image/x-arw;image/x-bay;image/x-bmp;image/x-canon-cr2;image/x-canon-crw;image/x-cap;image/x-cr2;image/x-crw;image/x-dcr;image/x-dcraw;image/x-dcs;image/x-dng;image/x-drf;image/x-eip;image/x-erf;image/x-fff;image/x-fuji-raf;image/x-iiq;image/x-k25;image/x-kdc;image/x-mef;image/x-minolta-mrw;image/x-mos;image/x-mrw;image/x-nef;image/x-nikon-nef;image/x-nrw;image/x-olympus-orf;image/x-orf;image/x-panasonic-raw;image/x-pef;image/x-pentax-pef;image/x-png;image/x-ptx;image/x-pxn;image/x-r3d;image/x-raf;image/x-raw;image/x-rw2;image/x-rwl;image/x-rwz;image/x-sigma-x3f;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-sr2;image/x-srf;image/x-x3f;
+Categories=Graphics;Viewer;Photography;GNOME;GTK;
+X-GIO-NoFuse=true
+X-GNOME-Gettext-Domain=shotwell
+X-GNOME-FullName=Shotwell Photo Viewer
diff --git a/misc/shotwell.appdata.xml b/misc/shotwell.appdata.xml
new file mode 100644
index 0000000..8f13515
--- /dev/null
+++ b/misc/shotwell.appdata.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2013-2014 Yorba Foundation (shotwell@yorba.org) -->
+<application>
+ <id type="desktop">shotwell.desktop</id>
+ <licence>CC0</licence>
+ <summary>Popular photo manager</summary>
+ <description>
+ <p>
+ Shotwell is an easy-to-use, fast photo organizer designed for the GNOME desktop.
+ It allows you to import photos from your camera or disk, organize them by date and subject
+ matter, even ratings. It also offers basic photo editing, like crop, red-eye correction,
+ color adjustments, and straighten. Shotwell's non-destructive photo editor does not alter
+ your master photos, making it easy to experiment and correct errors.
+ </p>
+ <p>
+ When ready, Shotwell can upload your photos to various web sites, such as Facebook, Flickr,
+ Picasa (Google Plus), and more.
+ </p>
+ <p>
+ Shotwell supports JPEG, PNG, TIFF, and a variety of RAW file formats.
+ </p>
+ </description>
+ <url type="homepage">http://www.yorba.org/projects/shotwell/</url>
+ <screenshots>
+ <screenshot type="default">http://www.yorba.org/wp-content/uploads/2013/02/harbor.png</screenshot>
+ <screenshot>http://www.yorba.org/wp-content/uploads/2013/02/import-300x155.png</screenshot>
+ <screenshot>http://www.yorba.org/wp-content/uploads/2013/02/organize-300x197.png</screenshot>
+ <screenshot>http://www.yorba.org/wp-content/uploads/2013/02/edit-300x247.png</screenshot>
+ <screenshot>http://www.yorba.org/wp-content/uploads/2013/02/publish-300x213.png</screenshot>
+ </screenshots>
+ <updatecontact>shotwell@yorba.org</updatecontact>
+ <project_group>GNOME</project_group>
+</application>
diff --git a/misc/shotwell.convert b/misc/shotwell.convert
new file mode 100644
index 0000000..2f972c1
--- /dev/null
+++ b/misc/shotwell.convert
@@ -0,0 +1,105 @@
+[org.yorba.shotwell.preferences.ui]
+background-color = /apps/shotwell/preferences/ui/background_color
+display-basic-properties = /apps/shotwell/preferences/ui/display_basic_properties
+display-extended-properties = /apps/shotwell/preferences/ui/display_extended_properties
+display-photo-ratings = /apps/shotwell/preferences/ui/display_photo_ratings
+display-photo-tags = /apps/shotwell/preferences/ui/display_photo_tags
+display-photo-titles = /apps/shotwell/preferences/ui/display_photo_titles
+event-photos-sort-ascending = /apps/shotwell/preferences/ui/event_photos_sort_ascending
+event-photos-sort-by = /apps/shotwell/preferences/ui/event_photos_sort_by
+events-sort-ascending = /apps/shotwell/preferences/ui/events_sort_ascending
+hide-photos-already-imported = /apps/shotwell/preferences/ui/hide_photos_already_imported
+keep-relativity = /apps/shotwell/preferences/ui/keep_relativity
+library-photos-sort-ascending = /apps/shotwell/preferences/ui/library_photos_sort_ascending
+library-photos-sort-by = /apps/shotwell/preferences/ui/library_photos_sort_by
+modify-originals = /apps/shotwell/preferences/ui/modify_originals
+photo-thumbnail-scale = /apps/shotwell/preferences/ui/photo_thumbnail_scale
+show-welcome-dialog = /apps/shotwell/preferences/ui/show_welcome_dialog
+sidebar-position = /apps/shotwell/preferences/ui/pane_position
+use-24-hour-time = /apps/shotwell/preferences/ui/twentyfour_hr_time
+
+[org.yorba.shotwell.preferences.slideshow]
+delay = /apps/shotwell/preferences/slideshow/delay
+transition-delay = /apps/shotwell/preferences/slideshow_transition/delay
+transition-effect-id = /apps/shotwell/preferences/slideshow_transition/name
+show-title = /apps/shotwell/preferences/slideshow/show-title
+
+[org.yorba.shotwell.preferences.window]
+direct-height = /apps/shotwell/preferences/window/direct_height
+direct-maximize = /apps/shotwell/preferences/window/direct_maximize
+direct-width = /apps/shotwell/preferences/window/direct_width
+library-height = /apps/shotwell/preferences/window/library_height
+library-maximize = /apps/shotwell/preferences/window/library_maximize
+library-width = /apps/shotwell/preferences/window/library_width
+
+[org.yorba.shotwell.preferences.files]
+auto-import = /apps/shotwell/preferences/files/auto_import
+commit-metadata = /apps/shotwell/preferences/files/commit_metadata
+directory-pattern = /apps/shotwell/preferences/files/directory_pattern
+directory-pattern-custom = /apps/shotwell/preferences/files/directory_pattern_custom
+import-dir = /apps/shotwell/preferences/files/import_dir
+use-lowercase-filenames = /apps/shotwell/preferences/files/use_lowercase_filenames
+raw-developer-default = /apps/shotwell/preferences/files/raw_developer_default
+
+[org.yorba.shotwell.preferences.editing]
+external-photo-editor = /apps/shotwell/preferences/editing/external_photo_editor
+external-raw-editor = /apps/shotwell/preferences/editing/external_raw_editor
+
+[org.yorba.shotwell.video]
+interpreter-state-cookie = /apps/shotwell/video/interpreter_state_cookie
+
+[org.yorba.shotwell.printing]
+content-height = /apps/shotwell/printing/content_height
+content-layout = /apps/shotwell/printing/content_layout
+content-ppi = /apps/shotwell/printing/content_ppi
+content-units = /apps/shotwell/printing/content_units
+content-width = /apps/shotwell/printing/content_width
+images-per-page = /apps/shotwell/printing/images_per_page_selection
+match-aspect-ratio = /apps/shotwell/printing/match_aspect_ratio
+print-titles = /apps/shotwell/printing/print_titles
+size-selection = /apps/shotwell/printing/size_selection
+titles-font = /apps/shotwell/printing/print_titles_font
+
+[org.yorba.shotwell.sharing]
+default-service = /apps/shotwell/sharing/default_service
+last-used-service = /apps/shotwell/sharing/last_used_service
+
+[org.yorba.shotwell.plugins.enable-state]
+publishing-facebook = /apps/shotwell/plugins/org.yorba.shotwell.publishing.facebook/enabled
+publishing-flickr = /apps/shotwell/plugins/org.yorba.shotwell.publishing.flickr/enabled
+publishing-picasa = /apps/shotwell/plugins/org.yorba.shotwell.publishing.picasa/enabled
+publishing-piwigo = /apps/shotwell/plugins/org.yorba.shotwell.publishing.piwigo/enabled
+publishing-yandex-fotki = /apps/shotwell/plugins/org.yorba.shotwell.publishing.yandex-fotki/enabled
+publishing-youtube = /apps/shotwell/plugins/org.yorba.shotwell.publishing.youtube/enabled
+transitions-crumble = /apps/shotwell/plugins/org.yorba.shotwell.transitions.crumble/enabled
+transitions-fade = /apps/shotwell/plugins/org.yorba.shotwell.transitions.fade/enabled
+transitions-slide = /apps/shotwell/plugins/org.yorba.shotwell.transitions.slide/enabled
+
+[org.yorba.shotwell.sharing.facebook]
+uid = /apps/shotwell/sharing/facebook/uid
+user-name = /apps/shotwell/sharing/facebook/user_name
+default-size = /apps/shotwell/sharing/facebook/default_size
+
+[org.yorba.shotwell.sharing.flickr]
+default-size = /apps/shotwell/sharing/flickr/default_size
+visibility = /apps/shotwell/sharing/flickr/visibility
+
+[org.yorba.shotwell.sharing.picasa]
+default-size = /apps/shotwell/sharing/picasa/default_size
+last-album = /apps/shotwell/sharing/picasa/last_album
+
+[org.yorba.shotwell.sharing.org-yorba-shotwell-publishing-piwigo]
+url = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/url
+username = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/username
+password = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/password
+remember-password = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/remember-password
+last-category = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/last-category
+last-permission-level = /apps/shotwell/sharing/org.yorba.shotwell.publishing.piwigo/last-permission-level
+
+[org.yorba.shotwell.sharing.org-yorba-shotwell-publishing-yandex-fotki]
+auth-token = /apps/shotwell/sharing/org.yorba.shotwell.publishing.yandex-fotki/auth_token
+
+[org.yorba.shotwell.sharing.youtube]
+user-name = /apps/shotwell/sharing/youtube/user_name
+auth-token = /apps/shotwell/sharing/youtube/auth_token
+
diff --git a/misc/shotwell.desktop.head b/misc/shotwell.desktop.head
new file mode 100644
index 0000000..09ca9ed
--- /dev/null
+++ b/misc/shotwell.desktop.head
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Version=1.0
+Name=Shotwell
+GenericName=Photo Manager
+Comment=Organize your photos
+Keywords=album;camera;cameras;crop;edit;enhance;export;gallery;image;images;import;organize;photo;photographs;photos;picture;pictures;photography;print;publish;rotate;share;tags;video;facebook;flickr;picasa;youtube;piwigo;
+Exec=shotwell %U
+Icon=shotwell
+Terminal=false
+Type=Application
+MimeType=x-content/image-dcf;
+Categories=Graphics;Photography;GNOME;GTK;
+X-GIO-NoFuse=true
+X-GNOME-Gettext-Domain=shotwell
+X-GNOME-FullName=Shotwell Photo Manager
diff --git a/plugins/Makefile b/plugins/Makefile
new file mode 100644
index 0000000..c622063
--- /dev/null
+++ b/plugins/Makefile
@@ -0,0 +1,33 @@
+
+include plugins.mk
+
+DIST_FILES := \
+ Makefile \
+ Makefile.plugin.mk \
+ plugins.mk
+
+.PHONY: all
+all: $(ALL_PLUGINS)
+
+.PHONY: $(ALL_PLUGINS)
+$(ALL_PLUGINS):
+ @$(MAKE) --directory=$@ PLUGINS_VERSION="$(PLUGINS_VERSION)" USER_VALAFLAGS="$(USER_VALAFLAGS)" \
+ PLUGIN_CFLAGS="$(PLUGIN_CFLAGS)"
+
+.PHONY: clean
+clean:
+ $(foreach plugin,$(ALL_PLUGINS),$(MAKE) --directory=$(plugin) clean;)
+
+.PHONY: cleantemps
+cleantemps:
+ $(foreach plugin,$(ALL_PLUGINS),$(MAKE) --directory=$(plugin) cleantemps;)
+
+.PHONY: distclean
+distclean:
+ $(foreach plugin,$(ALL_PLUGINS),$(MAKE) --directory=$(plugin) distclean;)
+
+.PHONY: listfiles
+listfiles:
+ @printf "$(foreach file,$(DIST_FILES), plugins/$(file)) "
+ @$(foreach plugin,$(ALL_PLUGINS),$(MAKE) --directory=$(plugin) --no-print-directory listfiles;)
+
diff --git a/plugins/Makefile.plugin.mk b/plugins/Makefile.plugin.mk
new file mode 100644
index 0000000..539de86
--- /dev/null
+++ b/plugins/Makefile.plugin.mk
@@ -0,0 +1,78 @@
+
+# Generic plug-in Makefile for Shotwell standard plugins.
+#
+# Requires PLUGIN and SRC_FILES be set to the name of the plugin binary (minus extension) and that
+# the directory is registered in plugins.mk.
+#
+# To use, include this file in each plug-in directory's Makefile after setting appropriate variables.
+# Also be sure that each plug-in has a dummy_main() function to satisfy valac's linkage.
+#
+# NOTE: This file is called from the cwd of each directory, hence the relative paths should be
+# read as such.
+
+ifndef VALAC
+VALAC := valac
+endif
+MAKE_FILES := Makefile ../Makefile.plugin.mk ../plugins.mk
+HEADER_FILES := ../shotwell-plugin-dev-1.0.vapi ../shotwell-plugin-dev-1.0.h \
+ ../shotwell-plugin-dev-1.0.deps
+
+include ../plugins.mk
+
+# automatically include shotwell-plugin-dev-1.0's dependencies
+# NOTE: This line will generate an error when running "make dist" from the master Makefile.
+# It can be safely ignored.
+PKGS := $(shell sed ':a;N;$$!ba;s/\n/ /g' ../shotwell-plugin-dev-1.0.deps) $(PKGS)
+
+# automatically include the shotwell-plugin-dev-1.0 package as a local dependency
+EXT_PKGS := $(PKGS)
+PKGS := shotwell-plugin-dev-1.0 $(PKGS) $(PLUGIN_PKGS)
+
+# automatically include the Resources.vala common file
+SRC_FILES := ../common/Resources.vala $(SRC_FILES)
+
+CFILES := $(notdir $(SRC_FILES:.vala=.c))
+OFILES := $(notdir $(SRC_FILES:.vala=.o))
+
+CFLAGS := `pkg-config --print-errors --cflags $(EXT_PKGS) $(PLUGIN_PKGS)` -nostdlib -export-dynamic $(PLUGIN_CFLAGS)
+LIBS := `pkg-config --print-errors --libs $(EXT_PKGS) $(PLUGIN_PKGS)`
+DEFINES := -D_VERSION='"$(PLUGINS_VERSION)"' -DGETTEXT_PACKAGE='"shotwell"'
+
+all: $(PLUGIN).so
+
+.stamp: $(SRC_FILES) $(MAKE_FILES) $(HEADER_FILES)
+ $(VALAC) --target-glib=$(MIN_GLIB_VERSION) -g --enable-checking --fatal-warnings --save-temps --compile --enable-deprecated \
+ --vapidir=../ $(foreach pkg,$(PKGS),--pkg=$(pkg)) $(foreach pkg,$(CUSTOM_VAPI_PKGS),--pkg=$(pkg)) \
+ -X -I../.. -X -fPIC \
+ $(foreach dfn,$(DEFINES),-X $(dfn)) \
+ $(USER_VALAFLAGS) \
+ --vapidir=../../vapi \
+ $(SRC_FILES)
+ @touch .stamp
+
+$(CFILES): .stamp
+ @
+
+$(OFILES): %.o: %.c $(CFILES)
+ $(CC) -c $(CFLAGS) $(DEFINES) -I../.. $(CFILES)
+
+$(PLUGIN).so: $(OFILES)
+ $(CC) $(CFLAGS) $(LDFLAGS) -shared $(OFILES) $(LIBS) -o $@
+
+.PHONY: cleantemps
+cleantemps:
+ @rm -f $(notdir $(SRC_FILES:.vala=.c)) $(notdir $(SRC_FILES:.vala=.o))
+ @rm -f .stamp
+
+.PHONY: clean
+clean: cleantemps
+ @rm -f $(PLUGIN).so $(OFILES) $(CFILES)
+
+.PHONY: distclean
+distclean: clean
+
+.PHONY: listfiles
+listfiles:
+ @printf "plugins/$(PLUGIN)/Makefile $(foreach file,$(SRC_FILES),plugins/$(PLUGIN)/$(file)) "
+ @printf "$(foreach rc,$(RC_FILES),plugins/$(PLUGIN)/$(rc)) "
+
diff --git a/plugins/common/RESTSupport.vala b/plugins/common/RESTSupport.vala
new file mode 100644
index 0000000..6a64025
--- /dev/null
+++ b/plugins/common/RESTSupport.vala
@@ -0,0 +1,1162 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern Soup.Message soup_form_request_new_from_multipart(string uri, Soup.Multipart multipart);
+
+namespace Publishing.RESTSupport {
+
+public abstract class Session {
+ private string? endpoint_url = null;
+ private Soup.Session soup_session = null;
+ private bool transactions_stopped = false;
+
+ public signal void wire_message_unqueued(Soup.Message message);
+ public signal void authenticated();
+ public signal void authentication_failed(Spit.Publishing.PublishingError err);
+
+ public Session(string? endpoint_url = null) {
+ this.endpoint_url = endpoint_url;
+ soup_session = new Soup.SessionAsync();
+ }
+
+ protected void notify_wire_message_unqueued(Soup.Message message) {
+ wire_message_unqueued(message);
+ }
+
+ protected void notify_authenticated() {
+ authenticated();
+ }
+
+ protected void notify_authentication_failed(Spit.Publishing.PublishingError err) {
+ authentication_failed(err);
+ }
+
+ public abstract bool is_authenticated();
+
+ public string? get_endpoint_url() {
+ return endpoint_url;
+ }
+
+ public void stop_transactions() {
+ transactions_stopped = true;
+ soup_session.abort();
+ }
+
+ public bool are_transactions_stopped() {
+ return transactions_stopped;
+ }
+
+ public void send_wire_message(Soup.Message message) {
+ if (are_transactions_stopped())
+ return;
+
+ soup_session.request_unqueued.connect(notify_wire_message_unqueued);
+ soup_session.send_message(message);
+
+ soup_session.request_unqueued.disconnect(notify_wire_message_unqueued);
+ }
+}
+
+public enum HttpMethod {
+ GET,
+ POST,
+ PUT;
+
+ public string to_string() {
+ switch (this) {
+ case HttpMethod.GET:
+ return "GET";
+
+ case HttpMethod.PUT:
+ return "PUT";
+
+ case HttpMethod.POST:
+ return "POST";
+
+ default:
+ error("unrecognized HTTP method enumeration value");
+ }
+ }
+
+ public static HttpMethod from_string(string str) {
+ if (str == "GET") {
+ return HttpMethod.GET;
+ } else if (str == "PUT") {
+ return HttpMethod.PUT;
+ } else if (str == "POST") {
+ return HttpMethod.POST;
+ } else {
+ error("unrecognized HTTP method name: %s", str);
+ }
+ }
+}
+
+public class Argument {
+ public string key;
+ public string value;
+
+ public Argument(string key, string value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public static int compare(Argument arg1, Argument arg2) {
+ return strcmp(arg1.key, arg2.key);
+ }
+
+ public static Argument[] sort(Argument[] inputArray) {
+ FixedTreeSet<Argument> sorted_args = new FixedTreeSet<Argument>(Argument.compare);
+
+ foreach (Argument arg in inputArray)
+ sorted_args.add(arg);
+
+ return sorted_args.to_array();
+ }
+}
+
+public class Transaction {
+ private Argument[] arguments;
+ private bool is_executed = false;
+ private weak Session parent_session = null;
+ private Soup.Message message = null;
+ private int bytes_written = 0;
+ private Spit.Publishing.PublishingError? err = null;
+ private string? endpoint_url = null;
+ private bool use_custom_payload;
+
+ public signal void chunk_transmitted(int bytes_written_so_far, int total_bytes);
+ public signal void network_error(Spit.Publishing.PublishingError err);
+ public signal void completed();
+
+ public Transaction(Session parent_session, HttpMethod method = HttpMethod.POST) {
+ // if our creator doesn't specify an endpoint url by using the Transaction.with_endpoint_url
+ // constructor, then our parent session must have a non-null endpoint url
+ assert(parent_session.get_endpoint_url() != null);
+
+ this.parent_session = parent_session;
+
+ message = new Soup.Message(method.to_string(), parent_session.get_endpoint_url());
+ message.wrote_body_data.connect(on_wrote_body_data);
+ }
+
+ public Transaction.with_endpoint_url(Session parent_session, string endpoint_url,
+ HttpMethod method = HttpMethod.POST) {
+ this.parent_session = parent_session;
+ this.endpoint_url = endpoint_url;
+ message = new Soup.Message(method.to_string(), endpoint_url);
+ }
+
+ private void on_wrote_body_data(Soup.Buffer written_data) {
+ bytes_written += (int) written_data.length;
+ chunk_transmitted(bytes_written, (int) message.request_body.length);
+ }
+
+ private void on_message_unqueued(Soup.Message message) {
+ if (this.message != message)
+ return;
+
+ try {
+ check_response(message);
+ } catch (Spit.Publishing.PublishingError err) {
+ warning("Publishing error: %s", err.message);
+ warning("response validation failed. bad response = '%s'.", get_response());
+ this.err = err;
+ }
+ }
+
+ protected void check_response(Soup.Message message) throws Spit.Publishing.PublishingError {
+ switch (message.status_code) {
+ case Soup.KnownStatusCode.OK:
+ case Soup.KnownStatusCode.CREATED: // HTTP code 201 (CREATED) signals that a new
+ // resource was created in response to a PUT or POST
+ break;
+
+ case Soup.KnownStatusCode.CANT_RESOLVE:
+ case Soup.KnownStatusCode.CANT_RESOLVE_PROXY:
+ throw new Spit.Publishing.PublishingError.NO_ANSWER("Unable to resolve %s (error code %u)",
+ get_endpoint_url(), message.status_code);
+
+ case Soup.KnownStatusCode.CANT_CONNECT:
+ case Soup.KnownStatusCode.CANT_CONNECT_PROXY:
+ throw new Spit.Publishing.PublishingError.NO_ANSWER("Unable to connect to %s (error code %u)",
+ get_endpoint_url(), message.status_code);
+
+ default:
+ // status codes below 100 are used by Soup, 100 and above are defined HTTP codes
+ if (message.status_code >= 100) {
+ throw new Spit.Publishing.PublishingError.NO_ANSWER("Service %s returned HTTP status code %u %s",
+ get_endpoint_url(), message.status_code, message.reason_phrase);
+ } else {
+ throw new Spit.Publishing.PublishingError.NO_ANSWER("Failure communicating with %s (error code %u)",
+ get_endpoint_url(), message.status_code);
+ }
+ }
+
+ // All valid communication involves body data in the response
+ if (message.response_body.data == null || message.response_body.data.length == 0)
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("No response data from %s",
+ get_endpoint_url());
+ }
+
+ public Argument[] get_arguments() {
+ return arguments;
+ }
+
+ public Argument[] get_sorted_arguments() {
+ return Argument.sort(get_arguments());
+ }
+
+ protected void set_is_executed(bool is_executed) {
+ this.is_executed = is_executed;
+ }
+
+ protected void send() throws Spit.Publishing.PublishingError {
+ parent_session.wire_message_unqueued.connect(on_message_unqueued);
+ message.wrote_body_data.connect(on_wrote_body_data);
+ parent_session.send_wire_message(message);
+
+ parent_session.wire_message_unqueued.disconnect(on_message_unqueued);
+ message.wrote_body_data.disconnect(on_wrote_body_data);
+
+ if (err != null)
+ network_error(err);
+ else
+ completed();
+
+ if (err != null)
+ throw err;
+ }
+
+ public HttpMethod get_method() {
+ return HttpMethod.from_string(message.method);
+ }
+
+ protected virtual void add_header(string key, string value) {
+ message.request_headers.append(key, value);
+ }
+
+ // set custom_payload to null to have this transaction send the default payload of
+ // key-value pairs appended through add_argument(...) (this is how most REST requests work).
+ // To send a payload other than traditional key-value pairs (such as an XML document or a JPEG
+ // image) to the endpoint, set the custom_payload parameter to a non-null value. If the
+ // custom_payload you specify is text data, then it's null terminated, and its length is just
+ // custom_payload.length, so you don't have to pass in a payload_length parameter in this case.
+ // If, however, custom_payload is binary data (such as a JEPG), then the caller must set
+ // payload_length to the byte length of the custom_payload buffer
+ protected void set_custom_payload(string? custom_payload, string payload_content_type,
+ ulong payload_length = 0) {
+ assert (get_method() != HttpMethod.GET); // GET messages don't have payloads
+
+ if (custom_payload == null) {
+ use_custom_payload = false;
+ return;
+ }
+
+ ulong length = (payload_length > 0) ? payload_length : custom_payload.length;
+ message.set_request(payload_content_type, Soup.MemoryUse.COPY, custom_payload.data[0:length]);
+
+ use_custom_payload = true;
+ }
+
+ // When writing a specialized transaction subclass you should rarely need to
+ // call this method. In general, it's better to leave the underlying Soup message
+ // alone and let the Transaction class manage it for you. You should only need
+ // to install a new message if your subclass has radically different behavior from
+ // normal Transactions -- like multipart encoding.
+ protected void set_message(Soup.Message message) {
+ this.message = message;
+ }
+
+ public bool get_is_executed() {
+ return is_executed;
+ }
+
+ public uint get_status_code() {
+ assert(get_is_executed());
+ return message.status_code;
+ }
+
+ public virtual void execute() throws Spit.Publishing.PublishingError {
+ // if a custom payload is being used, we don't need to peform the tasks that are necessary
+ // to prepare a traditional key-value pair REST request; Instead (since we don't
+ // know anything about the custom payload), we just put it on the wire and return
+ if (use_custom_payload) {
+ is_executed = true;
+ send();
+
+ return;
+ }
+
+ // REST POST requests must transmit at least one argument
+ if (get_method() == HttpMethod.POST)
+ assert(arguments.length > 0);
+
+ // concatenate the REST arguments array into an HTTP formdata string
+ string formdata_string = "";
+ for (int i = 0; i < arguments.length; i++) {
+ formdata_string += ("%s=%s".printf(arguments[i].key, arguments[i].value));
+ if (i < arguments.length - 1)
+ formdata_string += "&";
+ }
+
+ // for GET requests with arguments, append the formdata string to the endpoint url after a
+ // query divider ('?') -- but make sure to save the old (caller-specified) endpoint URL
+ // and restore it after the GET so that the underlying Soup message remains consistent
+ string old_url = null;
+ string url_with_query = null;
+ if (get_method() == HttpMethod.GET && arguments.length > 0) {
+ old_url = message.get_uri().to_string(false);
+ url_with_query = get_endpoint_url() + "?" + formdata_string;
+ message.set_uri(new Soup.URI(url_with_query));
+ } else {
+ message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY,
+ formdata_string.data);
+ }
+
+ is_executed = true;
+
+ try {
+ debug("sending message to URI = '%s'", message.get_uri().to_string(false));
+ send();
+ } finally {
+ // if old_url is non-null, then restore it
+ if (old_url != null)
+ message.set_uri(new Soup.URI(old_url));
+ }
+ }
+
+ public string get_response() {
+ assert(get_is_executed());
+ return (string) message.response_body.data;
+ }
+
+ public unowned Soup.MessageHeaders get_response_headers() {
+ assert(get_is_executed());
+ return message.response_headers;
+ }
+
+ public void add_argument(string name, string value) {
+ arguments += new Argument(name, value);
+ }
+
+ public string? get_endpoint_url() {
+ return (endpoint_url != null) ? endpoint_url : parent_session.get_endpoint_url();
+ }
+
+ public Session get_parent_session() {
+ return parent_session;
+ }
+}
+
+public class UploadTransaction : Transaction {
+ protected GLib.HashTable<string, string> binary_disposition_table = null;
+ protected Spit.Publishing.Publishable publishable = null;
+ protected string mime_type;
+ protected Gee.HashMap<string, string> message_headers = null;
+
+ public UploadTransaction(Session session, Spit.Publishing.Publishable publishable) {
+ base (session);
+ this.publishable = publishable;
+ this.mime_type = media_type_to_mime_type(publishable.get_media_type());
+
+ binary_disposition_table = create_default_binary_disposition_table();
+
+ message_headers = new Gee.HashMap<string, string>();
+ }
+
+ public UploadTransaction.with_endpoint_url(Session session,
+ Spit.Publishing.Publishable publishable, string endpoint_url) {
+ base.with_endpoint_url(session, endpoint_url);
+ this.publishable = publishable;
+ this.mime_type = media_type_to_mime_type(publishable.get_media_type());
+
+ binary_disposition_table = create_default_binary_disposition_table();
+
+ message_headers = new Gee.HashMap<string, string>();
+ }
+
+ protected override void add_header(string key, string value) {
+ message_headers.set(key, value);
+ }
+
+ private static string media_type_to_mime_type(Spit.Publishing.Publisher.MediaType media_type) {
+ if (media_type == Spit.Publishing.Publisher.MediaType.PHOTO)
+ return "image/jpeg";
+ else if (media_type == Spit.Publishing.Publisher.MediaType.VIDEO)
+ return "video/mpeg";
+ else
+ error("UploadTransaction: unknown media type %s.", media_type.to_string());
+ }
+
+ private GLib.HashTable<string, string> create_default_binary_disposition_table() {
+ GLib.HashTable<string, string> result =
+ new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
+
+ result.insert("filename", Soup.URI.encode(publishable.get_serialized_file().get_basename(),
+ null));
+
+ return result;
+ }
+
+ protected void set_binary_disposition_table(GLib.HashTable<string, string> new_disp_table) {
+ binary_disposition_table = new_disp_table;
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ Argument[] request_arguments = get_arguments();
+ assert(request_arguments.length > 0);
+
+ Soup.Multipart message_parts = new Soup.Multipart("multipart/form-data");
+
+ foreach (Argument arg in request_arguments)
+ message_parts.append_form_string(arg.key, arg.value);
+
+ string payload;
+ size_t payload_length;
+ try {
+ FileUtils.get_contents(publishable.get_serialized_file().get_path(), out payload,
+ out payload_length);
+ } catch (FileError e) {
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A temporary file needed for publishing is unavailable"));
+ }
+
+ int payload_part_num = message_parts.get_length();
+
+ Soup.Buffer bindable_data = new Soup.Buffer(Soup.MemoryUse.COPY, payload.data[0:payload_length]);
+ message_parts.append_form_file("", publishable.get_serialized_file().get_path(), mime_type,
+ bindable_data);
+
+ unowned Soup.MessageHeaders image_part_header;
+ unowned Soup.Buffer image_part_body;
+ message_parts.get_part(payload_part_num, out image_part_header, out image_part_body);
+ image_part_header.set_content_disposition("form-data", binary_disposition_table);
+
+ Soup.Message outbound_message =
+ soup_form_request_new_from_multipart(get_endpoint_url(), message_parts);
+ // TODO: there must be a better way to iterate over a map
+ Gee.MapIterator<string, string> i = message_headers.map_iterator();
+ bool cont = i.next();
+ while(cont) {
+ outbound_message.request_headers.append(i.get_key(), i.get_value());
+ cont = i.next();
+ }
+ set_message(outbound_message);
+
+ set_is_executed(true);
+ send();
+ }
+}
+
+public class XmlDocument {
+ // Returns non-null string if an error condition is discovered in the XML (such as a well-known
+ // node). The string is used when generating a PublishingError exception. This delegate does
+ // not need to check for general-case malformed XML.
+ public delegate string? CheckForErrorResponse(XmlDocument doc);
+
+ private Xml.Doc* document;
+
+ private XmlDocument(Xml.Doc* doc) {
+ document = doc;
+ }
+
+ ~RESTXmlDocument() {
+ delete document;
+ }
+
+ public Xml.Node* get_root_node() {
+ return document->get_root_element();
+ }
+
+ public Xml.Node* get_named_child(Xml.Node* parent, string child_name)
+ throws Spit.Publishing.PublishingError {
+ Xml.Node* doc_node_iter = parent->children;
+
+ for ( ; doc_node_iter != null; doc_node_iter = doc_node_iter->next) {
+ if (doc_node_iter->name == child_name)
+ return doc_node_iter;
+ }
+
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Can't find XML node %s",
+ child_name);
+ }
+
+ public string get_property_value(Xml.Node* node, string property_key)
+ throws Spit.Publishing.PublishingError {
+ string value_string = node->get_prop(property_key);
+ if (value_string == null)
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Can't find XML " +
+ "property %s on node %s", property_key, node->name);
+
+ return value_string;
+ }
+
+ public static XmlDocument parse_string(string? input_string,
+ CheckForErrorResponse check_for_error_response) throws Spit.Publishing.PublishingError {
+ if (input_string == null || input_string.length == 0)
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Empty XML string");
+
+ // Does this even start and end with the right characters?
+ if (!input_string.chug().chomp().has_prefix("<") ||
+ !input_string.chug().chomp().has_suffix(">")) {
+ // Didn't start or end with a < or > and can't be parsed as XML - treat as malformed.
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Unable to parse XML " +
+ "document");
+ }
+
+ // Don't want blanks to be included as text nodes, and want the XML parser to tolerate
+ // tolerable XML
+ Xml.Doc* doc = Xml.Parser.read_memory(input_string, (int) input_string.length, null, null,
+ Xml.ParserOption.NOBLANKS | Xml.ParserOption.RECOVER);
+ if (doc == null)
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Unable to parse XML " +
+ "document");
+
+ // Since 'doc' is the top level, if it has no children, something is wrong
+ // with the XML; we cannot continue normally here.
+ if (doc->children == null) {
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("Unable to parse XML " +
+ "document");
+ }
+
+ XmlDocument rest_doc = new XmlDocument(doc);
+
+ string? result = check_for_error_response(rest_doc);
+ if (result != null)
+ throw new Spit.Publishing.PublishingError.SERVICE_ERROR("%s", result);
+
+ return rest_doc;
+ }
+}
+
+/* Encoding strings in XML decimal encoding is a relatively esoteric operation. Most web services
+ prefer to have non-ASCII character entities encoded using "symbolic encoding," where common
+ entities are encoded in short, symbolic names (e.g. "ñ" -> &ntilde;). Picasa Web Albums,
+ however, doesn't like symbolic encoding, and instead wants non-ASCII entities encoded directly
+ as their Unicode code point numbers (e.g. "ñ" -> &241;). */
+public string decimal_entity_encode(string source) {
+ StringBuilder encoded_str_builder = new StringBuilder();
+ string current_char = source;
+ while (true) {
+ int current_char_value = (int) (current_char.get_char_validated());
+
+ // null character signals end of string
+ if (current_char_value < 1)
+ break;
+
+ // no need to escape ASCII characters except the ampersand, greater-than sign and less-than
+ // signs, which are special in the world of XML
+ if ((current_char_value < 128) && (current_char_value != '&') && (current_char_value != '<') &&
+ (current_char_value != '>'))
+ encoded_str_builder.append_unichar(current_char.get_char_validated());
+ else
+ encoded_str_builder.append("&#%d;".printf(current_char_value));
+
+ current_char = current_char.next_char();
+ }
+
+ return encoded_str_builder.str;
+}
+
+internal abstract class BatchUploader {
+ private int current_file = 0;
+ private Spit.Publishing.Publishable[] publishables = null;
+ private Session session = null;
+ private unowned Spit.Publishing.ProgressCallback? status_updated = null;
+
+ public signal void upload_complete(int num_photos_published);
+ public signal void upload_error(Spit.Publishing.PublishingError err);
+
+ public BatchUploader(Session session, Spit.Publishing.Publishable[] publishables) {
+ this.publishables = publishables;
+ this.session = session;
+ }
+
+ private void send_files() {
+ current_file = 0;
+ bool stop = false;
+ foreach (Spit.Publishing.Publishable publishable in publishables) {
+ GLib.File? file = publishable.get_serialized_file();
+
+ // if the current publishable hasn't been serialized, then skip it
+ if (file == null) {
+ current_file++;
+ continue;
+ }
+
+ double fraction_complete = ((double) current_file) / publishables.length;
+ if (status_updated != null)
+ status_updated(current_file + 1, fraction_complete);
+
+ Transaction txn = create_transaction(publishables[current_file]);
+
+ txn.chunk_transmitted.connect(on_chunk_transmitted);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ upload_error(err);
+ stop = true;
+ }
+
+ txn.chunk_transmitted.disconnect(on_chunk_transmitted);
+
+ if (stop)
+ break;
+
+ current_file++;
+ }
+
+ if (!stop)
+ upload_complete(current_file);
+ }
+
+ private void on_chunk_transmitted(int bytes_written_so_far, int total_bytes) {
+ double file_span = 1.0 / publishables.length;
+ double this_file_fraction_complete = ((double) bytes_written_so_far) / total_bytes;
+ double fraction_complete = (current_file * file_span) + (this_file_fraction_complete *
+ file_span);
+
+ if (status_updated != null)
+ status_updated(current_file + 1, fraction_complete);
+ }
+
+ protected Session get_session() {
+ return session;
+ }
+
+ protected Spit.Publishing.Publishable get_current_publishable() {
+ return publishables[current_file];
+ }
+
+ protected abstract Transaction create_transaction(Spit.Publishing.Publishable publishable);
+
+ public void upload(Spit.Publishing.ProgressCallback? status_updated = null) {
+ this.status_updated = status_updated;
+
+ if (publishables.length > 0)
+ send_files();
+ }
+}
+
+// Remove diacritics in a string, yielding ASCII. If the given string is in
+// a character set not based on Latin letters (e.g. Cyrillic), the result
+// may be empty.
+public string asciify_string(string s) {
+ string t = s.normalize(); // default normalization yields a maximally decomposed form
+
+ StringBuilder b = new StringBuilder();
+ for (unowned string u = t; u.get_char() != 0 ; u = u.next_char()) {
+ unichar c = u.get_char();
+ if ((int) c < 128)
+ b.append_unichar(c);
+ }
+
+ return b.str;
+}
+
+/** @brief Work-around for a problem in libgee where a TreeSet can leak references when it
+ * goes out of scope; please see https://bugzilla.gnome.org/show_bug.cgi?id=695045 for more
+ * details. This class merely wraps it and adds a call to clear() to the destructor.
+ */
+public class FixedTreeSet<G> : Gee.TreeSet<G> {
+ public FixedTreeSet(owned CompareDataFunc<G>? comp_func = null) {
+ base((owned) comp_func);
+ }
+
+ ~FixedTreeSet() {
+ clear();
+ }
+}
+
+public abstract class GoogleSession : Session {
+ public abstract string get_user_name();
+ public abstract string get_access_token();
+ public abstract string get_refresh_token();
+ public abstract void deauthenticate();
+}
+
+public abstract class GooglePublisher : Object, Spit.Publishing.Publisher {
+ private const string OAUTH_CLIENT_ID = "1073902228337-gm4uf5etk25s0hnnm0g7uv2tm2bm1j0b.apps.googleusercontent.com";
+ private const string OAUTH_CLIENT_SECRET = "_kA4RZz72xqed4DqfO7xMmMN";
+
+ private class GoogleSessionImpl : GoogleSession {
+ public string? access_token;
+ public string? user_name;
+ public string? refresh_token;
+
+ public GoogleSessionImpl() {
+ this.access_token = null;
+ this.user_name = null;
+ this.refresh_token = null;
+ }
+
+ public override bool is_authenticated() {
+ return (access_token != null);
+ }
+
+ public override string get_user_name() {
+ assert (user_name != null);
+ return user_name;
+ }
+
+ public override string get_access_token() {
+ assert(is_authenticated());
+ return access_token;
+ }
+
+ public override string get_refresh_token() {
+ assert(refresh_token != null);
+ return refresh_token;
+ }
+
+ public override void deauthenticate() {
+ access_token = null;
+ user_name = null;
+ refresh_token = null;
+ }
+ }
+
+ private class WebAuthenticationPane : Spit.Publishing.DialogPane, Object {
+ public static bool cache_dirty = false;
+
+ private WebKit.WebView webview;
+ private Gtk.Box pane_widget;
+ private Gtk.ScrolledWindow webview_frame;
+ private string auth_sequence_start_url;
+
+ public signal void authorized(string auth_code);
+
+ public WebAuthenticationPane(string auth_sequence_start_url) {
+ this.auth_sequence_start_url = auth_sequence_start_url;
+
+ pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ webview_frame = new Gtk.ScrolledWindow(null, null);
+ webview_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN);
+ webview_frame.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+
+ webview = new WebKit.WebView();
+ webview.get_settings().enable_plugins = false;
+ webview.get_settings().enable_default_context_menu = false;
+
+ webview.load_finished.connect(on_page_load);
+ webview.load_started.connect(on_load_started);
+
+ webview_frame.add(webview);
+ pane_widget.pack_start(webview_frame, true, true, 0);
+ }
+
+ public static bool is_cache_dirty() {
+ return cache_dirty;
+ }
+
+ private void on_page_load(WebKit.WebFrame origin_frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+
+ string page_title = webview.get_title();
+ if (page_title.index_of("state=connect") > 0) {
+ int auth_code_field_start = page_title.index_of("code=");
+ if (auth_code_field_start < 0)
+ return;
+
+ string auth_code =
+ page_title.substring(auth_code_field_start + 5); // 5 = "code=".length
+
+ cache_dirty = true;
+
+ authorized(auth_code);
+ }
+ }
+
+ private void on_load_started(WebKit.WebFrame frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.WATCH));
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public void on_pane_installed() {
+ webview.open(auth_sequence_start_url);
+ }
+
+ public void on_pane_uninstalled() {
+ }
+ }
+
+ private class GetAccessTokensTransaction : Publishing.RESTSupport.Transaction {
+ private const string ENDPOINT_URL = "https://accounts.google.com/o/oauth2/token";
+
+ public GetAccessTokensTransaction(Session session, string auth_code) {
+ base.with_endpoint_url(session, ENDPOINT_URL);
+
+ add_argument("code", auth_code);
+ add_argument("client_id", OAUTH_CLIENT_ID);
+ add_argument("client_secret", OAUTH_CLIENT_SECRET);
+ add_argument("redirect_uri", "urn:ietf:wg:oauth:2.0:oob");
+ add_argument("grant_type", "authorization_code");
+ }
+ }
+
+ private class RefreshAccessTokenTransaction : Publishing.RESTSupport.Transaction {
+ private const string ENDPOINT_URL = "https://accounts.google.com/o/oauth2/token";
+
+ public RefreshAccessTokenTransaction(Session session) {
+ base.with_endpoint_url(session, ENDPOINT_URL);
+
+ add_argument("client_id", OAUTH_CLIENT_ID);
+ add_argument("client_secret", OAUTH_CLIENT_SECRET);
+ add_argument("refresh_token", ((GoogleSession) session).get_refresh_token());
+ add_argument("grant_type", "refresh_token");
+ }
+ }
+
+ public class AuthenticatedTransaction : Publishing.RESTSupport.Transaction {
+ private AuthenticatedTransaction.with_endpoint_url(GoogleSession session,
+ string endpoint_url, Publishing.RESTSupport.HttpMethod method) {
+ base.with_endpoint_url(session, endpoint_url, method);
+ }
+
+ public AuthenticatedTransaction(GoogleSession session, string endpoint_url,
+ Publishing.RESTSupport.HttpMethod method) {
+ base.with_endpoint_url(session, endpoint_url, method);
+ assert(session.is_authenticated());
+
+ add_header("Authorization", "Bearer " + session.get_access_token());
+ }
+ }
+
+ private class UsernameFetchTransaction : AuthenticatedTransaction {
+ private const string ENDPOINT_URL = "https://www.googleapis.com/oauth2/v1/userinfo";
+
+ public UsernameFetchTransaction(GoogleSession session) {
+ base(session, ENDPOINT_URL, Publishing.RESTSupport.HttpMethod.GET);
+ }
+ }
+
+ private string scope;
+ private GoogleSessionImpl session;
+ private WebAuthenticationPane? web_auth_pane;
+ private weak Spit.Publishing.PluginHost host;
+ private weak Spit.Publishing.Service service;
+
+ protected GooglePublisher(Spit.Publishing.Service service, Spit.Publishing.PluginHost host,
+ string scope) {
+ this.scope = scope;
+ this.session = new GoogleSessionImpl();
+ this.service = service;
+ this.host = host;
+ this.web_auth_pane = null;
+ }
+
+ private void on_web_auth_pane_authorized(string auth_code) {
+ web_auth_pane.authorized.disconnect(on_web_auth_pane_authorized);
+
+ debug("EVENT: user authorized scope %s with auth_code %s", scope, auth_code);
+
+ if (!is_running())
+ return;
+
+ do_get_access_tokens(auth_code);
+ }
+
+ private void on_get_access_tokens_complete(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_get_access_tokens_complete);
+ txn.network_error.disconnect(on_get_access_tokens_error);
+
+ debug("EVENT: network transaction to exchange authorization code for access tokens " +
+ "completed successfully.");
+
+ if (!is_running())
+ return;
+
+ do_extract_tokens(txn.get_response());
+ }
+
+ private void on_get_access_tokens_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_get_access_tokens_complete);
+ txn.network_error.disconnect(on_get_access_tokens_error);
+
+ debug("EVENT: network transaction to exchange authorization code for access tokens " +
+ "failed; response = '%s'", txn.get_response());
+
+ if (!is_running())
+ return;
+
+ host.post_error(err);
+ }
+
+ private void on_refresh_access_token_transaction_completed(Publishing.RESTSupport.Transaction
+ txn) {
+ txn.completed.disconnect(on_refresh_access_token_transaction_completed);
+ txn.network_error.disconnect(on_refresh_access_token_transaction_error);
+
+ debug("EVENT: refresh access token transaction completed successfully.");
+
+ if (!is_running())
+ return;
+
+ if (session.is_authenticated()) // ignore these events if the session is already auth'd
+ return;
+
+ do_extract_tokens(txn.get_response());
+ }
+
+ private void on_refresh_access_token_transaction_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_refresh_access_token_transaction_completed);
+ txn.network_error.disconnect(on_refresh_access_token_transaction_error);
+
+ debug("EVENT: refresh access token transaction caused a network error.");
+
+ if (!is_running())
+ return;
+
+ if (session.is_authenticated()) // ignore these events if the session is already auth'd
+ return;
+
+ // 400 errors indicate that the OAuth client ID and secret have become invalid. In most
+ // cases, this can be fixed by logging the user out
+ if (txn.get_status_code() == 400) {
+ do_logout();
+ return;
+ }
+
+ host.post_error(err);
+ }
+
+ private void on_refresh_token_available(string token) {
+ debug("EVENT: an OAuth refresh token has become available; token = '%s'.", token);
+
+ if (!is_running())
+ return;
+
+ session.refresh_token = token;
+ }
+
+ private void on_access_token_available(string token) {
+ debug("EVENT: an OAuth access token has become available; token = '%s'.", token);
+
+ if (!is_running())
+ return;
+
+ session.access_token = token;
+
+ do_fetch_username();
+ }
+
+ private void on_fetch_username_transaction_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_fetch_username_transaction_completed);
+ txn.network_error.disconnect(on_fetch_username_transaction_error);
+
+ debug("EVENT: username fetch transaction completed successfully.");
+
+ if (!is_running())
+ return;
+
+ do_extract_username(txn.get_response());
+ }
+
+ private void on_fetch_username_transaction_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_fetch_username_transaction_completed);
+ txn.network_error.disconnect(on_fetch_username_transaction_error);
+
+ debug("EVENT: username fetch transaction caused a network error");
+
+ if (!is_running())
+ return;
+
+ host.post_error(err);
+ }
+
+ private void do_get_access_tokens(string auth_code) {
+ debug("ACTION: exchanging authorization code for access & refresh tokens");
+
+ host.install_login_wait_pane();
+
+ GetAccessTokensTransaction tokens_txn = new GetAccessTokensTransaction(session, auth_code);
+ tokens_txn.completed.connect(on_get_access_tokens_complete);
+ tokens_txn.network_error.connect(on_get_access_tokens_error);
+
+ try {
+ tokens_txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_hosted_web_authentication() {
+ debug("ACTION: running OAuth authentication flow in hosted web pane.");
+
+ string user_authorization_url = "https://accounts.google.com/o/oauth2/auth?" +
+ "response_type=code&" +
+ "client_id=" + OAUTH_CLIENT_ID + "&" +
+ "redirect_uri=" + Soup.URI.encode("urn:ietf:wg:oauth:2.0:oob", null) + "&" +
+ "scope=" + Soup.URI.encode(scope, null) + "+" +
+ Soup.URI.encode("https://www.googleapis.com/auth/userinfo.profile", null) + "&" +
+ "state=connect&" +
+ "access_type=offline&" +
+ "approval_prompt=force";
+
+ web_auth_pane = new WebAuthenticationPane(user_authorization_url);
+ web_auth_pane.authorized.connect(on_web_auth_pane_authorized);
+
+ host.install_dialog_pane(web_auth_pane);
+
+ }
+
+ private void do_exchange_refresh_token_for_access_token() {
+ debug("ACTION: exchanging OAuth refresh token for OAuth access token.");
+
+ host.install_login_wait_pane();
+
+ RefreshAccessTokenTransaction txn = new RefreshAccessTokenTransaction(session);
+
+ txn.completed.connect(on_refresh_access_token_transaction_completed);
+ txn.network_error.connect(on_refresh_access_token_transaction_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_extract_tokens(string response_body) {
+ debug("ACTION: extracting OAuth tokens from body of server response");
+
+ Json.Parser parser = new Json.Parser();
+
+ try {
+ parser.load_from_data(response_body);
+ } catch (Error err) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "Couldn't parse JSON response: " + err.message));
+ return;
+ }
+
+ Json.Object response_obj = parser.get_root().get_object();
+
+ if ((!response_obj.has_member("access_token")) && (!response_obj.has_member("refresh_token"))) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "neither access_token nor refresh_token not present in server response"));
+ return;
+ }
+
+ if (response_obj.has_member("refresh_token")) {
+ string refresh_token = response_obj.get_string_member("refresh_token");
+
+ if (refresh_token != "")
+ on_refresh_token_available(refresh_token);
+ }
+
+ if (response_obj.has_member("access_token")) {
+ string access_token = response_obj.get_string_member("access_token");
+
+ if (access_token != "")
+ on_access_token_available(access_token);
+ }
+ }
+
+ private void do_fetch_username() {
+ debug("ACTION: running network transaction to fetch username.");
+
+ host.install_login_wait_pane();
+ host.set_service_locked(true);
+
+ UsernameFetchTransaction txn = new UsernameFetchTransaction(session);
+ txn.completed.connect(on_fetch_username_transaction_completed);
+ txn.network_error.connect(on_fetch_username_transaction_error);
+
+ try {
+ txn.execute();
+ } catch (Error err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_extract_username(string response_body) {
+ debug("ACTION: extracting username from body of server response");
+
+ Json.Parser parser = new Json.Parser();
+
+ try {
+ parser.load_from_data(response_body);
+ } catch (Error err) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "Couldn't parse JSON response: " + err.message));
+ return;
+ }
+
+ Json.Object response_obj = parser.get_root().get_object();
+
+ if (response_obj.has_member("name")) {
+ string username = response_obj.get_string_member("name");
+
+ if (username != "")
+ session.user_name = username;
+ }
+
+ if (response_obj.has_member("access_token")) {
+ string access_token = response_obj.get_string_member("access_token");
+
+ if (access_token != "")
+ session.access_token = access_token;
+ }
+
+ // by the time we get a username, the session should be authenticated, or else something
+ // really tragic has happened
+ assert(session.is_authenticated());
+
+ on_login_flow_complete();
+ }
+
+ protected unowned Spit.Publishing.PluginHost get_host() {
+ return host;
+ }
+
+ protected GoogleSession get_session() {
+ return session;
+ }
+
+ protected void start_oauth_flow(string? refresh_token = null) {
+ if (refresh_token != null && refresh_token != "") {
+ session.refresh_token = refresh_token;
+ do_exchange_refresh_token_for_access_token();
+ } else {
+ if (WebAuthenticationPane.is_cache_dirty()) {
+ host.install_static_message_pane(_("You have already logged in and out of a Google service during this Shotwell session.\n\nTo continue publishing to Google services, quit and restart Shotwell, then try publishing again."));
+ return;
+ }
+
+ do_hosted_web_authentication();
+ }
+ }
+
+ protected abstract void on_login_flow_complete();
+
+ protected abstract void do_logout();
+
+ public abstract bool is_running();
+
+ public abstract void start();
+
+ public abstract void stop();
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+}
+
+}
+
diff --git a/plugins/common/Resources.vala b/plugins/common/Resources.vala
new file mode 100644
index 0000000..bcdc590
--- /dev/null
+++ b/plugins/common/Resources.vala
@@ -0,0 +1,54 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Resources {
+
+public const string WEBSITE_NAME = _("Visit the Yorba web site");
+public const string WEBSITE_URL = "https://wiki.gnome.org/Apps/Shotwell";
+
+public const string LICENSE = """
+Shotwell is free software; you can redistribute it and/or modify it under the
+terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or (at your option)
+any later version.
+
+Shotwell is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with Shotwell; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+""";
+
+public const string TRANSLATORS = _("translator-credits");
+
+// TODO: modify to load multiple icons
+//
+// provided all the icons in the set follow a known naming convention (such as iconName_nn.png,
+// where 'nn' is a size value in pixels, for example plugins_16.png -- this convention seems
+// pretty common in the GNOME world), then this function can be modified to load an entire icon
+// set without its interface needing to change, since given one icon filename, we can
+// determine the others.
+public Gdk.Pixbuf[]? load_icon_set(GLib.File? icon_file) {
+ Gdk.Pixbuf? icon = null;
+ try {
+ icon = new Gdk.Pixbuf.from_file(icon_file.get_path());
+ } catch (Error err) {
+ warning("couldn't load icon set from %s.", icon_file.get_path());
+ }
+
+ if (icon_file != null) {
+ Gdk.Pixbuf[] icon_pixbuf_set = new Gdk.Pixbuf[0];
+ icon_pixbuf_set += icon;
+ return icon_pixbuf_set;
+ }
+
+ return null;
+}
+
+}
diff --git a/plugins/common/SqliteSupport.vala b/plugins/common/SqliteSupport.vala
new file mode 100644
index 0000000..1c4a2bf
--- /dev/null
+++ b/plugins/common/SqliteSupport.vala
@@ -0,0 +1,76 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public errordomain DatabaseError {
+ ERROR,
+ BACKING,
+ MEMORY,
+ ABORT,
+ LIMITS,
+ TYPESPEC
+}
+
+public abstract class ImportableDatabaseTable {
+
+ protected static Sqlite.Database db;
+
+ public string table_name = null;
+
+ protected void set_table_name(string table_name) {
+ this.table_name = table_name;
+ }
+
+ // This method will throw an error on an SQLite return code unless it's OK, DONE, or ROW, which
+ // are considered normal results.
+ protected static void throw_error(string method, int res) throws DatabaseError {
+ string msg = "(%s) [%d] - %s".printf(method, res, db.errmsg());
+
+ switch (res) {
+ case Sqlite.OK:
+ case Sqlite.DONE:
+ case Sqlite.ROW:
+ return;
+
+ case Sqlite.PERM:
+ case Sqlite.BUSY:
+ case Sqlite.READONLY:
+ case Sqlite.IOERR:
+ case Sqlite.CORRUPT:
+ case Sqlite.CANTOPEN:
+ case Sqlite.NOLFS:
+ case Sqlite.AUTH:
+ case Sqlite.FORMAT:
+ case Sqlite.NOTADB:
+ throw new DatabaseError.BACKING(msg);
+
+ case Sqlite.NOMEM:
+ throw new DatabaseError.MEMORY(msg);
+
+ case Sqlite.ABORT:
+ case Sqlite.LOCKED:
+ case Sqlite.INTERRUPT:
+ throw new DatabaseError.ABORT(msg);
+
+ case Sqlite.FULL:
+ case Sqlite.EMPTY:
+ case Sqlite.TOOBIG:
+ case Sqlite.CONSTRAINT:
+ case Sqlite.RANGE:
+ throw new DatabaseError.LIMITS(msg);
+
+ case Sqlite.SCHEMA:
+ case Sqlite.MISMATCH:
+ throw new DatabaseError.TYPESPEC(msg);
+
+ case Sqlite.ERROR:
+ case Sqlite.INTERNAL:
+ case Sqlite.MISUSE:
+ default:
+ throw new DatabaseError.ERROR(msg);
+ }
+ }
+}
+
diff --git a/plugins/common/VersionNumber.vala b/plugins/common/VersionNumber.vala
new file mode 100644
index 0000000..5a69cfe
--- /dev/null
+++ b/plugins/common/VersionNumber.vala
@@ -0,0 +1,50 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Utils {
+
+/**
+ * A class that represents a version number in the form x.y.z and is able to compare
+ * different versions.
+ */
+public class VersionNumber : Object, Gee.Comparable<VersionNumber> {
+ private int[] version;
+
+ public VersionNumber(int[] version) {
+ this.version = version;
+ }
+
+ public VersionNumber.from_string(string str_version, string separator = ".") {
+ string[] version_items = str_version.split(separator);
+ this.version = new int[version_items.length];
+ for (int i = 0; i < version_items.length; i++)
+ this.version[i] = int.parse(version_items[i]);
+ }
+
+ public string to_string() {
+ string[] version_items = new string[this.version.length];
+ for (int i = 0; i < this.version.length; i++)
+ version_items[i] = this.version[i].to_string();
+ return string.joinv(".", version_items);
+ }
+
+ public int compare_to(VersionNumber other) {
+ int max_len = ((this.version.length > other.version.length) ?
+ this.version.length : other.version.length);
+ int res = 0;
+ for(int i = 0; i < max_len; i++) {
+ int this_v = (i < this.version.length ? this.version[i] : 0);
+ int other_v = (i < other.version.length ? other.version[i] : 0);
+ res = this_v - other_v;
+ if (res != 0)
+ break;
+ }
+ return res;
+ }
+}
+
+}
+
diff --git a/plugins/plugins.mk b/plugins/plugins.mk
new file mode 100644
index 0000000..35bb80c
--- /dev/null
+++ b/plugins/plugins.mk
@@ -0,0 +1,33 @@
+
+PLUGINS := \
+ shotwell-transitions \
+ shotwell-publishing \
+ shotwell-data-imports
+
+PLUGINS_RC := \
+ plugins/shotwell-publishing/facebook.png \
+ plugins/shotwell-publishing/facebook_publishing_options_pane.glade \
+ plugins/shotwell-publishing/flickr.png \
+ plugins/shotwell-publishing/flickr_publishing_options_pane.glade \
+ plugins/shotwell-publishing/flickr_pin_entry_pane.glade \
+ plugins/shotwell-publishing/picasa.png \
+ plugins/shotwell-publishing/picasa_publishing_options_pane.glade \
+ plugins/shotwell-publishing/youtube.png \
+ plugins/shotwell-publishing/youtube_publishing_options_pane.glade \
+ plugins/shotwell-publishing/piwigo.png \
+ plugins/shotwell-publishing/piwigo_authentication_pane.glade \
+ plugins/shotwell-publishing/piwigo_publishing_options_pane.glade \
+ plugins/shotwell-transitions/slideshow-plugin.png
+
+EXTRA_PLUGINS := \
+ shotwell-publishing-extras
+
+EXTRA_PLUGINS_RC := \
+ plugins/shotwell-publishing-extras/yandex_publish_model.glade \
+ plugins/shotwell-data-imports/f-spot-24.png \
+ plugins/shotwell-publishing-extras/tumblr.png \
+ plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade \
+ plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade
+
+ALL_PLUGINS := $(PLUGINS) $(EXTRA_PLUGINS)
+
diff --git a/plugins/shotwell-data-imports/FSpotDatabase.vala b/plugins/shotwell-data-imports/FSpotDatabase.vala
new file mode 100644
index 0000000..634c5c9
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotDatabase.vala
@@ -0,0 +1,58 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+public const int64 NULL_ID = 0;
+public const int64 INVALID_ID = -1;
+
+/**
+ * Initialization method for the whole module.
+ */
+public void init() {
+ FSpotDatabaseBehavior.create_behavior_map();
+}
+
+/**
+ * An object that is able to read from the F-Spot
+ * database and extract the relevant objects.
+ */
+public class FSpotDatabase : Object {
+ private Sqlite.Database fspot_db;
+ private FSpotMetaTable meta_table;
+ public FSpotPhotosTable photos_table;
+ public FSpotPhotoVersionsTable photo_versions_table;
+ public FSpotTagsTable tags_table;
+ public FSpotRollsTable rolls_table;
+ public int64 hidden_tag_id;
+
+ public FSpotDatabase(File db_file) throws DatabaseError, Spit.DataImports.DataImportError {
+ string filename = db_file.get_path();
+ int res = Sqlite.Database.open_v2(filename, out fspot_db,
+ Sqlite.OPEN_READONLY, null);
+ if (res != Sqlite.OK)
+ throw new DatabaseError.ERROR("Unable to open F-Spot database %s: %d", filename, res);
+ meta_table = new FSpotMetaTable(fspot_db);
+ hidden_tag_id = meta_table.get_hidden_tag_id();
+
+ FSpotDatabaseBehavior db_behavior = new FSpotDatabaseBehavior(get_version());
+
+ photos_table = new FSpotPhotosTable(fspot_db, db_behavior);
+ photo_versions_table = new FSpotPhotoVersionsTable(fspot_db, db_behavior);
+ tags_table = new FSpotTagsTable(fspot_db, db_behavior);
+ rolls_table = new FSpotRollsTable(fspot_db, db_behavior);
+ }
+
+ ~FSpotDatabase() {
+ }
+
+ private Utils.VersionNumber get_version() throws DatabaseError {
+ return new Utils.VersionNumber.from_string(meta_table.get_db_version());
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotDatabaseBehavior.vala b/plugins/shotwell-data-imports/FSpotDatabaseBehavior.vala
new file mode 100644
index 0000000..973eb38
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotDatabaseBehavior.vala
@@ -0,0 +1,208 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+private class FSpotBehaviorEntry {
+ private Utils.VersionNumber version;
+ private FSpotTableBehavior behavior;
+
+ public FSpotBehaviorEntry(Utils.VersionNumber version, FSpotTableBehavior behavior) {
+ this.version = version;
+ this.behavior = behavior;
+ }
+
+ public Utils.VersionNumber get_version() {
+ return version;
+ }
+
+ public FSpotTableBehavior get_behavior() {
+ return behavior;
+ }
+}
+
+/**
+ * A class that consolidates the behavior of all F-Spot tables (apart from meta)
+ * and is the one place to check whether the database version is supported.
+ */
+public class FSpotDatabaseBehavior : Object {
+ // Minimum unsupported version: any database from that version and above
+ // is not supported as it's too new and support has not been provided
+ // In practice, the code may work with future versions but this cannot be
+ // guaranteed as it hasn't been tested so it's probably better to just
+ // bomb out at that point rather than risk importing incorrect data
+ public static Utils.VersionNumber MIN_UNSUPPORTED_VERSION =
+ new Utils.VersionNumber({ 19 });
+ private static Gee.Map<string, Gee.List<FSpotBehaviorEntry>> behavior_map;
+
+ private FSpotTableBehavior<FSpotPhotoRow> photos_behavior;
+ private FSpotTableBehavior<FSpotTagRow> tags_behavior;
+ private FSpotTableBehavior<FSpotPhotoTagRow> photo_tags_behavior;
+ private FSpotTableBehavior<FSpotPhotoVersionRow> photo_versions_behavior;
+ private FSpotTableBehavior<FSpotRollRow> rolls_behavior;
+
+ public static void create_behavior_map() {
+ behavior_map = new Gee.HashMap<string, Gee.List<FSpotBehaviorEntry>>();
+ // photos table
+ Gee.List<FSpotBehaviorEntry> photos_list = new Gee.ArrayList<FSpotBehaviorEntry>();
+ // v0-4
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 0 }),
+ FSpotPhotosV0Behavior.get_instance()
+ ));
+ // v5-6
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 5 }),
+ FSpotPhotosV5Behavior.get_instance()
+ ));
+ // v7-10
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 7 }),
+ FSpotPhotosV7Behavior.get_instance()
+ ));
+ // v11-15
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 11 }),
+ FSpotPhotosV11Behavior.get_instance()
+ ));
+ // v16
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 16 }),
+ FSpotPhotosV16Behavior.get_instance()
+ ));
+ // v17
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 17 }),
+ FSpotPhotosV17Behavior.get_instance()
+ ));
+ // v18+
+ photos_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 18 }),
+ FSpotPhotosV18Behavior.get_instance()
+ ));
+ behavior_map.set(FSpotPhotosTable.TABLE_NAME, photos_list);
+ // tags table
+ Gee.List<FSpotBehaviorEntry> tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
+ // v0+
+ tags_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 0 }),
+ FSpotTagsV0Behavior.get_instance()
+ ));
+ behavior_map.set(FSpotTagsTable.TABLE_NAME, tags_list);
+ // photo_tags table
+ Gee.List<FSpotBehaviorEntry> photo_tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
+ // v0+
+ photo_tags_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 0 }),
+ FSpotPhotoTagsV0Behavior.get_instance()
+ ));
+ behavior_map.set(FSpotPhotoTagsTable.TABLE_NAME, photo_tags_list);
+ // photo_versions table
+ Gee.List<FSpotBehaviorEntry> photo_versions_list = new Gee.ArrayList<FSpotBehaviorEntry>();
+ // v0-8
+ photo_versions_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 0 }),
+ FSpotPhotoVersionsV0Behavior.get_instance()
+ ));
+ // v9-15
+ photo_versions_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 9 }),
+ FSpotPhotoVersionsV9Behavior.get_instance()
+ ));
+ // v16
+ photo_versions_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 16 }),
+ FSpotPhotoVersionsV16Behavior.get_instance()
+ ));
+ // v17
+ photo_versions_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 17 }),
+ FSpotPhotoVersionsV17Behavior.get_instance()
+ ));
+ // v18+
+ photo_versions_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 18 }),
+ FSpotPhotoVersionsV18Behavior.get_instance()
+ ));
+ behavior_map.set(FSpotPhotoVersionsTable.TABLE_NAME, photo_versions_list);
+ // rolls table
+ Gee.List<FSpotBehaviorEntry> rolls_list = new Gee.ArrayList<FSpotBehaviorEntry>();
+ // v0-4
+ rolls_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 0 }),
+ FSpotRollsV0Behavior.get_instance()
+ ));
+ // v5+
+ rolls_list.add(new FSpotBehaviorEntry(
+ new Utils.VersionNumber({ 5 }),
+ FSpotRollsV5Behavior.get_instance()
+ ));
+ behavior_map.set(FSpotRollsTable.TABLE_NAME, rolls_list);
+ }
+
+ public static FSpotTableBehavior? find_behavior(string table_name, Utils.VersionNumber version) {
+ FSpotTableBehavior behavior = null;
+ Gee.List<FSpotBehaviorEntry> behavior_list = behavior_map.get(table_name);
+ if (behavior_list != null)
+ foreach (FSpotBehaviorEntry entry in behavior_list) {
+ if (version.compare_to(entry.get_version()) >= 0)
+ behavior = entry.get_behavior();
+ }
+ else
+ warning("Could not find behavior list for table %s", table_name);
+ return behavior;
+
+ }
+ public FSpotDatabaseBehavior(Utils.VersionNumber version) throws Spit.DataImports.DataImportError {
+ if (version.compare_to(MIN_UNSUPPORTED_VERSION) >= 0)
+ throw new Spit.DataImports.DataImportError.UNSUPPORTED_VERSION("Version %s is not yet supported", version.to_string());
+
+ FSpotTableBehavior? photos_generic_behavior = find_behavior(FSpotPhotosTable.TABLE_NAME, version);
+ if (photos_generic_behavior != null)
+ photos_behavior = photos_generic_behavior as FSpotTableBehavior<FSpotPhotoRow>;
+ FSpotTableBehavior? tags_generic_behavior = find_behavior(FSpotTagsTable.TABLE_NAME, version);
+ if (tags_generic_behavior != null)
+ tags_behavior = tags_generic_behavior as FSpotTableBehavior<FSpotTagRow>;
+ FSpotTableBehavior? photo_tags_generic_behavior = find_behavior(FSpotPhotoTagsTable.TABLE_NAME, version);
+ if (photo_tags_generic_behavior != null)
+ photo_tags_behavior = photo_tags_generic_behavior as FSpotTableBehavior<FSpotPhotoTagRow>;
+ FSpotTableBehavior? photo_versions_generic_behavior = find_behavior(FSpotPhotoVersionsTable.TABLE_NAME, version);
+ if (photo_versions_generic_behavior != null)
+ photo_versions_behavior = photo_versions_generic_behavior as FSpotTableBehavior<FSpotPhotoVersionRow>;
+ FSpotTableBehavior? rolls_generic_behavior = find_behavior(FSpotRollsTable.TABLE_NAME, version);
+ if (rolls_generic_behavior != null)
+ rolls_behavior = rolls_generic_behavior as FSpotTableBehavior<FSpotRollRow>;
+
+ if (photos_behavior == null || tags_behavior == null ||
+ photo_tags_behavior == null || photo_versions_behavior == null ||
+ rolls_behavior == null
+ )
+ throw new Spit.DataImports.DataImportError.UNSUPPORTED_VERSION("Version %s is not supported", version.to_string());
+ }
+
+ public FSpotTableBehavior<FSpotPhotoRow> get_photos_behavior() {
+ return photos_behavior;
+ }
+
+ public FSpotTableBehavior<FSpotTagRow> get_tags_behavior() {
+ return tags_behavior;
+ }
+
+ public FSpotTableBehavior<FSpotPhotoTagRow> get_photo_tags_behavior() {
+ return photo_tags_behavior;
+ }
+
+ public FSpotTableBehavior<FSpotPhotoVersionRow> get_photo_versions_behavior() {
+ return photo_versions_behavior;
+ }
+
+ public FSpotTableBehavior<FSpotRollRow> get_rolls_behavior() {
+ return rolls_behavior;
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotDatabaseTable.vala b/plugins/shotwell-data-imports/FSpotDatabaseTable.vala
new file mode 100644
index 0000000..eba64be
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotDatabaseTable.vala
@@ -0,0 +1,54 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * This class represents a generic F-Spot table.
+ */
+public abstract class FSpotDatabaseTable<T> : ImportableDatabaseTable {
+ protected unowned Sqlite.Database fspot_db;
+ protected FSpotTableBehavior<T> behavior;
+
+ public FSpotDatabaseTable(Sqlite.Database db) {
+ this.fspot_db = db;
+ }
+
+ public void set_behavior(FSpotTableBehavior<T> behavior) {
+ this.behavior = behavior;
+ set_table_name(behavior.get_table_name());
+ }
+
+ public FSpotTableBehavior<T> get_behavior() {
+ return behavior;
+ }
+
+ protected string get_joined_column_list(bool with_table = false) {
+ string[] columns = behavior.list_columns();
+ if (with_table)
+ for (int i = 0; i < columns.length; i++)
+ columns[i] = "%s.%s".printf(table_name, columns[i]);
+ return string.joinv(", ", columns);
+ }
+
+ protected int select_all(out Sqlite.Statement stmt) throws DatabaseError {
+ string column_list = get_joined_column_list();
+ string sql = "SELECT %s FROM %s".printf(column_list, table_name);
+
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW && res != Sqlite.DONE)
+ throw_error("select_all %s %s".printf(table_name, column_list), res);
+
+ return res;
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotImporter.vala b/plugins/shotwell-data-imports/FSpotImporter.vala
new file mode 100644
index 0000000..03abe01
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotImporter.vala
@@ -0,0 +1,567 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class FSpotService : Object, Spit.Pluggable, Spit.DataImports.Service {
+ private const string ICON_FILENAME = "f-spot-24.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public FSpotService(GLib.File resource_directory) {
+ // initialize the database layer
+ DataImports.FSpot.Db.init();
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.DataImports.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.dataimports.fspot";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "F-Spot";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Bruno Girin";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.DataImports.DataImporter create_data_importer(Spit.DataImports.PluginHost host) {
+ return new DataImports.FSpot.FSpotDataImporter(this, host);
+ }
+}
+
+namespace DataImports.FSpot {
+
+internal const string SERVICE_NAME = "F-Spot";
+internal const string SERVICE_WELCOME_MESSAGE =
+ _("Welcome to the F-Spot library import service.\n\nPlease select a library to import, either by selecting one of the existing libraries found by Shotwell or by selecting an alternative F-Spot database file.");
+internal const string SERVICE_WELCOME_MESSAGE_FILE_ONLY =
+ _("Welcome to the F-Spot library import service.\n\nPlease select an F-Spot database file.");
+internal const string FILE_IMPORT_LABEL =
+ _("Manually select an F-Spot database file to import:");
+internal const string ERROR_CANT_OPEN_DB_FILE =
+ _("Cannot open the selected F-Spot database file: the file does not exist or is not an F-Spot database");
+internal const string ERROR_UNSUPPORTED_DB_VERSION =
+ _("Cannot open the selected F-Spot database file: this version of the F-Spot database is not supported by Shotwell");
+internal const string ERROR_CANT_READ_TAGS_TABLE =
+ _("Cannot read the selected F-Spot database file: error while reading tags table");
+internal const string ERROR_CANT_READ_PHOTOS_TABLE =
+ _("Cannot read the selected F-Spot database file: error while reading photos table");
+internal const string MESSAGE_FINAL_SCREEN =
+ _("Shotwell has found %d photos in the F-Spot library and is currently importing them. Duplicates will be automatically detected and removed.\n\nYou can close this dialog and start using Shotwell while the import is taking place in the background.");
+
+public class FSpotImportableLibrary : Spit.DataImports.ImportableLibrary, GLib.Object {
+ private File db_file;
+
+ public FSpotImportableLibrary(File db_file) {
+ this.db_file = db_file;
+ }
+
+ public File get_db_file() {
+ return db_file;
+ }
+
+ public string get_display_name() {
+ return _("F-Spot library: %s").printf(db_file.get_path());
+ }
+}
+
+public class FSpotImportableItem : Spit.DataImports.ImportableMediaItem, GLib.Object {
+ private DataImports.FSpot.Db.FSpotPhotoRow photo_row;
+ private DataImports.FSpot.Db.FSpotPhotoVersionRow? photo_version_row;
+ private DataImports.FSpot.Db.FSpotRollRow? roll_row;
+ private FSpotImportableTag[] tags;
+ private FSpotImportableEvent? event;
+ private FSpotImportableRating rating;
+ private string folder_path;
+ private string filename;
+
+ public FSpotImportableItem(
+ DataImports.FSpot.Db.FSpotPhotoRow photo_row,
+ DataImports.FSpot.Db.FSpotPhotoVersionRow? photo_version_row,
+ DataImports.FSpot.Db.FSpotRollRow? roll_row,
+ FSpotImportableTag[] tags,
+ FSpotImportableEvent? event,
+ bool is_hidden,
+ bool is_favorite
+ ) {
+ this.photo_row = photo_row;
+ this.photo_version_row = photo_version_row;
+ this.roll_row = roll_row;
+ this.tags = tags;
+ this.event = event;
+ if (photo_row.rating > 0)
+ this.rating = new FSpotImportableRating(photo_row.rating);
+ else if (is_hidden)
+ this.rating = new FSpotImportableRating(FSpotImportableRating.REJECTED);
+ else if (is_favorite)
+ this.rating = new FSpotImportableRating(5);
+ else
+ this.rating = new FSpotImportableRating(FSpotImportableRating.UNRATED);
+
+ // store path and filename
+ folder_path = (photo_version_row != null) ?
+ photo_version_row.base_path.get_path() :
+ photo_row.base_path.get_path();
+ filename = (photo_version_row != null) ?
+ photo_version_row.filename :
+ photo_row.filename;
+
+ // In theory, neither field should be null at that point but belts
+ // and braces don't hurt
+ if (folder_path != null && filename != null) {
+ // check if file exist and if not decode as URL
+ File photo = File.new_for_path(folder_path).get_child(filename);
+
+ // If file not found, parse as URI and store back
+ if (!photo.query_exists()) {
+ folder_path = decode_url(folder_path);
+ filename = decode_url(filename);
+ }
+ }
+ }
+
+ public Spit.DataImports.ImportableTag[] get_tags() {
+ Spit.DataImports.ImportableTag[] importable_tags = new Spit.DataImports.ImportableTag[0];
+ foreach (FSpotImportableTag tag in tags)
+ importable_tags += tag;
+ return importable_tags;
+ }
+
+ public Spit.DataImports.ImportableEvent? get_event() {
+ return event;
+ }
+
+ public string get_folder_path() {
+ return folder_path;
+ }
+
+ public string get_filename() {
+ return filename;
+ }
+
+ public string? get_title() {
+ return (photo_row.description == null || photo_row.description == "") ? null : photo_row.description;
+ }
+
+ public Spit.DataImports.ImportableRating get_rating() {
+ return rating;
+ }
+
+ private string decode_url(string url) {
+ StringBuilder builder = new StringBuilder();
+ for (int idx = 0; idx < url.length; ) {
+ int cidx = url.index_of_char('%', idx);
+ if (cidx > idx) {
+ builder.append(url.slice(idx, cidx));
+ }
+ if (cidx >= 0) {
+ if (cidx < url.length - 2) {
+ char c1 = url.get(cidx + 1);
+ char c2 = url.get(cidx + 2);
+ if (c1.isxdigit() && c1.isxdigit()) {
+ int ccode = 0x10 * c1.xdigit_value() + c2.xdigit_value();
+ builder.append_c((char)ccode);
+ }
+ idx = cidx + 3;
+ } else {
+ idx = cidx + 1;
+ }
+ } else {
+ builder.append(url.substring(idx));
+ idx = url.length;
+ }
+ }
+ return builder.str;
+ }
+}
+
+public class FSpotImportableTag : Spit.DataImports.ImportableTag, GLib.Object {
+ private DataImports.FSpot.Db.FSpotTagRow row;
+ private FSpotImportableTag? parent;
+
+ public FSpotImportableTag(DataImports.FSpot.Db.FSpotTagRow row, FSpotImportableTag? parent) {
+ this.row = row;
+ this.parent = parent;
+ }
+
+ public int64 get_id() {
+ return row.tag_id;
+ }
+
+ public string get_name() {
+ return row.name;
+ }
+
+ public Spit.DataImports.ImportableTag? get_parent() {
+ return parent;
+ }
+
+ public FSpotImportableTag? get_fspot_parent() {
+ return parent;
+ }
+
+ public string get_stock_icon() {
+ return row.stock_icon;
+ }
+
+ public bool is_stock() {
+ return (row.stock_icon.has_prefix(DataImports.FSpot.Db.FSpotTagsTable.PREFIX_STOCK_ICON));
+ }
+
+ public FSpotImportableEvent to_event() {
+ return new FSpotImportableEvent(this.row);
+ }
+}
+
+public class FSpotImportableEvent : Spit.DataImports.ImportableEvent, GLib.Object {
+ private DataImports.FSpot.Db.FSpotTagRow row;
+
+ public FSpotImportableEvent(DataImports.FSpot.Db.FSpotTagRow row) {
+ this.row = row;
+ }
+
+ public string get_name() {
+ return row.name;
+ }
+}
+
+public class FSpotImportableRating : Spit.DataImports.ImportableRating, GLib.Object {
+ public static const int REJECTED = -1;
+ public static const int UNRATED = 0;
+
+ private int rating_value;
+
+ public FSpotImportableRating(int rating_value) {
+ if (rating_value < -1)
+ rating_value = -1;
+ else if (rating_value > 5)
+ rating_value = 5;
+ this.rating_value = rating_value;
+ }
+
+ public bool is_rejected() {
+ return (rating_value == REJECTED);
+ }
+
+ public bool is_unrated() {
+ return (rating_value == UNRATED);
+ }
+
+ public int get_value() {
+ return rating_value;
+ }
+}
+
+internal class FSpotTagsCache : Object {
+ private DataImports.FSpot.Db.FSpotTagsTable tags_table;
+ private Gee.HashMap<int64?, FSpotImportableTag> tags_map;
+
+ public FSpotTagsCache(DataImports.FSpot.Db.FSpotTagsTable tags_table) throws DatabaseError {
+ this.tags_table = tags_table;
+ tags_map = new Gee.HashMap<int64?, FSpotImportableTag> ();
+ }
+
+ public FSpotImportableTag get_tag(DataImports.FSpot.Db.FSpotTagRow tag_row) throws DatabaseError {
+ FSpotImportableTag? tag = tags_map.get(tag_row.tag_id);
+ if (tag != null) {
+ return tag;
+ } else {
+ FSpotImportableTag? parent_tag = get_tag_from_id(tag_row.category_id);
+ FSpotImportableTag new_tag = new FSpotImportableTag(tag_row, parent_tag);
+ tags_map[tag_row.tag_id] = new_tag;
+ return new_tag;
+ }
+ }
+
+ private FSpotImportableTag? get_tag_from_id(int64 tag_id) throws DatabaseError {
+ // check whether the tag ID is valid first, otherwise return null
+ if (tag_id < 1)
+ return null;
+ FSpotImportableTag? tag = tags_map.get(tag_id);
+ if (tag != null)
+ return tag;
+ DataImports.FSpot.Db.FSpotTagRow? tag_row = tags_table.get_by_id(tag_id);
+ if (tag_row != null) {
+ FSpotImportableTag? parent_tag = get_tag_from_id(tag_row.category_id);
+ FSpotImportableTag new_tag = new FSpotImportableTag(tag_row, parent_tag);
+ tags_map[tag_id] = new_tag;
+ return new_tag;
+ }
+ return null;
+ }
+}
+
+public class FSpotDataImporter : Spit.DataImports.DataImporter, GLib.Object {
+
+ private weak Spit.DataImports.PluginHost host = null;
+ private weak Spit.DataImports.Service service = null;
+ private bool running = false;
+
+ public FSpotDataImporter(Spit.DataImports.Service service,
+ Spit.DataImports.PluginHost host) {
+ debug("FSpotDataImporter instantiated.");
+ this.service = service;
+ this.host = host;
+ }
+
+ private bool is_running() {
+ return running;
+ }
+
+ public Spit.DataImports.Service get_service() {
+ return service;
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ debug("FSpotDataImporter: starting interaction.");
+
+ running = true;
+
+ do_discover_importable_libraries();
+ }
+
+ public void stop() {
+ debug("FSpotDataImporter: stopping interaction.");
+
+ running = false;
+ }
+
+ // Actions and event implementation
+
+ /**
+ * Action that discovers importable libraries based on standard locations.
+ */
+ private void do_discover_importable_libraries() {
+ Spit.DataImports.ImportableLibrary[] discovered_libraries =
+ new Spit.DataImports.ImportableLibrary[0];
+
+ File[] db_files = {
+ // where the DB is in Ubuntu Lucid
+ File.new_for_path(Environment.get_user_config_dir()).
+ get_child("f-spot").get_child("photos.db"),
+ // where it seems to be in Ubuntu Jaunty
+ File.new_for_path(Environment.get_home_dir()).get_child(".gnome2").
+ get_child("f-spot").get_child("photos.db"),
+ // where it should really be if it followed the XDG spec
+ File.new_for_path(Environment.get_user_data_dir()).
+ get_child("f-spot").get_child("photos.db")
+ };
+
+ foreach (File db_file in db_files) {
+ if (db_file.query_exists(null)) {
+ discovered_libraries += new FSpotImportableLibrary(db_file);
+ message("Discovered importable library: %s", db_file.get_path());
+ }
+ }
+
+ host.install_library_selection_pane(
+ (discovered_libraries.length > 0 ? SERVICE_WELCOME_MESSAGE : SERVICE_WELCOME_MESSAGE_FILE_ONLY),
+ discovered_libraries,
+ FILE_IMPORT_LABEL
+ );
+ }
+
+ public void on_library_selected(Spit.DataImports.ImportableLibrary library) {
+ on_file_selected(((FSpotImportableLibrary)library).get_db_file());
+ }
+
+ public void on_file_selected(File file) {
+ DataImports.FSpot.Db.FSpotDatabase database;
+ FSpotTagsCache tags_cache;
+ Gee.ArrayList<DataImports.FSpot.Db.FSpotPhotoRow> all_photos;
+ double progress_delta_per_photo = 1.0;
+ double progress_plugin_to_host_ratio = 0.5;
+ double current_progress = 0.0;
+ try {
+ database = new DataImports.FSpot.Db.FSpotDatabase(file);
+ } catch(DatabaseError e) {
+ debug("FSpotDataImporter: Can't open database file: %s".printf(e.message));
+ host.post_error_message(ERROR_CANT_OPEN_DB_FILE);
+ return;
+ } catch(Spit.DataImports.DataImportError e) {
+ debug("FSpotDataImporter: Unsupported F-Spot database version: %s".printf(e.message));
+ host.post_error_message(ERROR_UNSUPPORTED_DB_VERSION);
+ return;
+ }
+ try {
+ tags_cache = new FSpotTagsCache(database.tags_table);
+ } catch(DatabaseError e) {
+ debug("FSpotDataImporter: Can't read tags table: %s".printf(e.message));
+ host.post_error_message(ERROR_CANT_READ_TAGS_TABLE);
+ return;
+ }
+ host.install_import_progress_pane(_("Preparing to import"));
+ try {
+ all_photos = database.photos_table.get_all();
+ } catch(DatabaseError e) {
+ debug("FSpotDataImporter: Can't read photos table: %s".printf(e.message));
+ host.post_error_message(ERROR_CANT_READ_PHOTOS_TABLE);
+ return;
+ }
+ if (all_photos.size > 0)
+ progress_delta_per_photo = 1.0 / all_photos.size;
+ foreach (DataImports.FSpot.Db.FSpotPhotoRow photo_row in all_photos) {
+ bool hidden = false;
+ bool favorite = false;
+ FSpotImportableTag[] tags = new FSpotImportableTag[0];
+ FSpotImportableEvent? event = null;
+ DataImports.FSpot.Db.FSpotRollRow? roll_row = null;
+
+ // TODO: We do not convert F-Spot events to Shotwell events because F-Spot's events
+ // are essentially tags. We would need to detect if the tag is an event (use
+ // is_tag_event) and then assign the event to the photo ... since a photo can be
+ // in multiple F-Spot events, we would need to pick one, and since their tags
+ // are hierarchical, we would need to pick a name (probably the leaf)
+ try {
+ foreach (
+ DataImports.FSpot.Db.FSpotTagRow tag_row in
+ database.tags_table.get_by_photo_id(photo_row.photo_id)
+ ) {
+ FSpotImportableTag tag = tags_cache.get_tag(tag_row);
+ if (is_tag_hidden(tag, database.hidden_tag_id))
+ hidden = true;
+ else if (is_tag_favorite(tag))
+ favorite = true;
+ else
+ tags += tag;
+ }
+ } catch(DatabaseError e) {
+ // log the error and leave the tag list empty
+ message("Failed to retrieve tags for photo ID %ld: %s", (long) photo_row.photo_id,
+ e.message);
+ }
+
+ try {
+ roll_row = database.rolls_table.get_by_id(photo_row.roll_id);
+ } catch (DatabaseError e) {
+ // log the error and leave the roll row null
+ message("Failed to retrieve roll for photo ID %ld: %s", (long) photo_row.photo_id,
+ e.message);
+ }
+
+ Spit.DataImports.ImportableMediaItem[] importable_items = new Spit.DataImports.ImportableMediaItem[0];
+ try {
+ Gee.ArrayList<DataImports.FSpot.Db.FSpotPhotoVersionRow> photo_versions =
+ database.photo_versions_table.get_by_photo_id(photo_row.photo_id);
+ bool photo_versions_added = false; // set to true if at least one version was added
+ bool photo_versions_skipped = false; // set to true if at least one version was skipped due to missing file details
+ foreach (DataImports.FSpot.Db.FSpotPhotoVersionRow photo_version_row in photo_versions) {
+ if (photo_version_row.base_path != null && photo_version_row.filename != null) {
+ importable_items += new FSpotImportableItem(
+ photo_row, photo_version_row, roll_row, tags, event, hidden, favorite
+ );
+ photo_versions_added = true;
+ } else {
+ photo_versions_skipped = true;
+ }
+ }
+
+ // Older versions of F-Spot (0.4.3.1 at least, perhaps later) did not maintain photo_versions,
+ // this handles that case
+ // It also handles the case when we had to skip any photo version due to missing
+ // file details
+ if (photo_versions_skipped || !photo_versions_added) {
+ if (photo_row.base_path != null && photo_row.filename != null) {
+ importable_items += new FSpotImportableItem(
+ photo_row, null, roll_row, tags, event, hidden, favorite
+ );
+ }
+ }
+ } catch (DatabaseError e) {
+ // if we can't load the different versions, do the best we can
+ // and create one photo from the photo row that was found earlier
+ message("Failed to retrieve versions for photo ID %ld: %s", (long) photo_row.photo_id,
+ e.message);
+ if (photo_row.base_path != null && photo_row.filename != null) {
+ importable_items += new FSpotImportableItem(
+ photo_row, null, roll_row, tags, event, hidden, favorite
+ );
+ }
+ }
+ // If the importer is still running, import the items and loop,
+ // otherwise break the loop
+ if (running) {
+ host.prepare_media_items_for_import(
+ importable_items,
+ current_progress + (progress_delta_per_photo * progress_plugin_to_host_ratio),
+ progress_delta_per_photo * (1 - progress_plugin_to_host_ratio),
+ null
+ );
+ current_progress += progress_delta_per_photo;
+ host.update_import_progress_pane(current_progress);
+ } else {
+ break;
+ }
+ }
+ host.finalize_import(on_imported_items_count);
+ }
+
+ public void on_imported_items_count(int imported_items_count) {
+ host.install_static_message_pane(
+ MESSAGE_FINAL_SCREEN.printf(imported_items_count),
+ Spit.DataImports.PluginHost.ButtonMode.CLOSE
+ );
+ }
+
+ private bool is_tag_event(FSpotImportableTag tag) {
+ bool result = (DataImports.FSpot.Db.FSpotTagsTable.STOCK_ICON_EVENTS == tag.get_stock_icon());
+ if (!result) {
+ FSpotImportableTag? parent = tag.get_fspot_parent();
+ if (parent == null)
+ result = false;
+ else
+ result = is_tag_event(parent);
+ }
+ return result;
+ }
+
+ private bool is_tag_hidden(FSpotImportableTag tag, int64 hidden_tag_id) {
+ bool result = (hidden_tag_id == tag.get_id());
+ if (!result) {
+ FSpotImportableTag? parent = tag.get_fspot_parent();
+ if (parent == null)
+ result = false;
+ else
+ result = is_tag_hidden(parent, hidden_tag_id);
+ }
+ return result;
+ }
+
+ private bool is_tag_favorite(FSpotImportableTag tag) {
+ bool result = (DataImports.FSpot.Db.FSpotTagsTable.STOCK_ICON_FAV == tag.get_stock_icon());
+ if (!result) {
+ FSpotImportableTag? parent = tag.get_fspot_parent();
+ if (parent == null)
+ result = false;
+ else
+ result = is_tag_favorite(parent);
+ }
+ return result;
+ }
+}
+
+} // namespace
+
diff --git a/plugins/shotwell-data-imports/FSpotMetaTable.vala b/plugins/shotwell-data-imports/FSpotMetaTable.vala
new file mode 100644
index 0000000..b2d16eb
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotMetaTable.vala
@@ -0,0 +1,113 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "meta" table, representing a single database row.
+ */
+public class FSpotMetaRow : Object {
+ // ignore the ID
+ public string name;
+ public string data;
+}
+
+/**
+ * This class represents the F-Spot meta table, which stores some essential
+ * meta-data for the whole database. It is implemented as a simple dictionary
+ * where each row in the table is a key/value pair.
+ *
+ * The meta table implementation is the only one that throws a database error
+ * if something goes wrong because:
+ * * it is essential to read the content of that table in order to identify
+ * the version of the database and select the correct behavior,
+ * * this table is read at the very beginning of the process so any failure
+ * will occur immediately,
+ * * failing to read this table means that there is no point in reading the
+ * attempting to read the rest of the database so we might as well abort.
+ */
+public class FSpotMetaTable : FSpotDatabaseTable<FSpotMetaRow> {
+
+ public FSpotMetaTable(Sqlite.Database db) {
+ base(db);
+ set_behavior(FSpotMetaBehavior.get_instance());
+ }
+
+ public string? get_data(string name) throws DatabaseError {
+ string[] columns = behavior.list_columns();
+ string column_list = string.joinv(", ", columns);
+ string sql = "SELECT %s FROM %s WHERE name=?".printf(column_list, table_name);
+ Sqlite.Statement stmt;
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.bind_text(1, name);
+ if (res != Sqlite.OK)
+ throw_error("Bind failed for name %s".printf(name), res);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW) {
+ if (res != Sqlite.DONE)
+ throw_error("FSpotMetaTable.get_data", res);
+
+ return null;
+ }
+
+ FSpotMetaRow row;
+ behavior.build_row(stmt, out row);
+ return row.data;
+ }
+
+ public string? get_app_version() throws DatabaseError {
+ return get_data("F-Spot Version");
+ }
+
+ public string? get_db_version() throws DatabaseError {
+ return get_data("F-Spot Database Version");
+ }
+
+ public int64 get_hidden_tag_id() throws DatabaseError {
+ string id_str = get_data("Hidden Tag Id");
+ if(id_str != null) {
+ return int64.parse(id_str);
+ } else {
+ return -1;
+ }
+ }
+}
+
+public class FSpotMetaBehavior : FSpotTableBehavior<FSpotMetaRow>, Object {
+ public static const string TABLE_NAME = "Meta";
+
+ private static FSpotMetaBehavior instance;
+
+ private FSpotMetaBehavior() {
+ }
+
+ public static FSpotMetaBehavior get_instance() {
+ if (instance == null)
+ instance = new FSpotMetaBehavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "name", "data" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotMetaRow row, int offset = 0) {
+ row = new FSpotMetaRow();
+ row.name = stmt.column_text(offset + 0);
+ row.data = stmt.column_text(offset + 1);
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotPhotoTagsTable.vala b/plugins/shotwell-data-imports/FSpotPhotoTagsTable.vala
new file mode 100644
index 0000000..7d65594
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotPhotoTagsTable.vala
@@ -0,0 +1,57 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "photo_tags" table, representing a single database row.
+ */
+public class FSpotPhotoTagRow : Object {
+ public int64 photo_id;
+ public int64 tag_id;
+}
+
+/**
+ * This class represents the F-Spot photo_tags table.
+ */
+public class FSpotPhotoTagsTable : FSpotDatabaseTable<FSpotPhotoTagRow> {
+ public static const string TABLE_NAME = "Photo_Tags";
+
+ public FSpotPhotoTagsTable(Sqlite.Database db, FSpotDatabaseBehavior db_behavior) {
+ base(db);
+ set_behavior(db_behavior.get_photo_tags_behavior());
+ }
+}
+
+public class FSpotPhotoTagsV0Behavior : FSpotTableBehavior<FSpotPhotoTagRow>, Object {
+ private static FSpotPhotoTagsV0Behavior instance;
+
+ private FSpotPhotoTagsV0Behavior() {
+ }
+
+ public static FSpotPhotoTagsV0Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoTagsV0Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoTagsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "tag_id" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoTagRow row, int offset = 0) {
+ row = new FSpotPhotoTagRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.tag_id = stmt.column_int64(offset + 1);
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotPhotoVersionsTable.vala b/plugins/shotwell-data-imports/FSpotPhotoVersionsTable.vala
new file mode 100644
index 0000000..8378884
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotPhotoVersionsTable.vala
@@ -0,0 +1,271 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "photo_versions" table, representing a single database row.
+ */
+public class FSpotPhotoVersionRow : Object {
+ public int64 photo_id;
+ public int64 version_id;
+ public string name;
+ public File? base_path;
+ public string? filename;
+ public string md5_sum;
+ public bool is_protected;
+}
+
+/**
+ * This class represents the F-Spot photo_versions table.
+ */
+public class FSpotPhotoVersionsTable : FSpotDatabaseTable<FSpotPhotoVersionRow> {
+ public static const string TABLE_NAME = "Photo_versions";
+
+ public FSpotPhotoVersionsTable(Sqlite.Database db, FSpotDatabaseBehavior db_behavior) {
+ base(db);
+ set_behavior(db_behavior.get_photo_versions_behavior());
+ }
+
+ public Gee.ArrayList<FSpotPhotoVersionRow> get_by_photo_id(int64 photo_id) throws DatabaseError {
+ Gee.ArrayList<FSpotPhotoVersionRow> rows = new Gee.ArrayList<FSpotPhotoVersionRow?>();
+
+ Sqlite.Statement stmt;
+
+ string column_list = get_joined_column_list();
+ string sql = "SELECT %s FROM %s WHERE photo_id=?".printf(
+ column_list, table_name
+ );
+
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.bind_int64(1, photo_id);
+ if (res != Sqlite.OK)
+ throw_error("Bind failed for photo_id", res);
+
+ res = stmt.step();
+ while (res == Sqlite.ROW) {
+ FSpotPhotoVersionRow row;
+ behavior.build_row(stmt, out row);
+ rows.add(row);
+ res = stmt.step();
+ }
+
+ return rows;
+ }
+}
+
+// Photo_versions table behavior for v0-8
+// Note: there is a change in the URI format in version 8 but the File.new_for_uri
+// constructor should be able to deal with the variation, so the v8 behavior should
+// be handled in a way identical to v0-7
+public class FSpotPhotoVersionsV0Behavior : FSpotTableBehavior<FSpotPhotoVersionRow>, Object {
+ private static FSpotPhotoVersionsV0Behavior instance;
+
+ private FSpotPhotoVersionsV0Behavior() {
+ }
+
+ public static FSpotPhotoVersionsV0Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoVersionsV0Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoVersionsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "version_id", "name", "uri" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoVersionRow row, int offset = 0) {
+ row = new FSpotPhotoVersionRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.version_id = stmt.column_int64(offset + 1);
+ row.name = stmt.column_text(offset + 2);
+
+ string? full_path = stmt.column_text(offset + 3);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.md5_sum = "";
+ row.is_protected = false;
+ }
+}
+
+// Photo_versions table behavior for v9-15
+// add protected field
+public class FSpotPhotoVersionsV9Behavior : FSpotTableBehavior<FSpotPhotoVersionRow>, Object {
+ private static FSpotPhotoVersionsV9Behavior instance;
+
+ private FSpotPhotoVersionsV9Behavior() {
+ }
+
+ public static FSpotPhotoVersionsV9Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoVersionsV9Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoVersionsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "version_id", "name", "uri",
+ "protected" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoVersionRow row, int offset = 0) {
+ row = new FSpotPhotoVersionRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.version_id = stmt.column_int64(offset + 1);
+ row.name = stmt.column_text(offset + 2);
+
+ string? full_path = stmt.column_text(offset + 3);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.md5_sum = "";
+ row.is_protected = (stmt.column_int(offset + 4) > 0);
+ }
+}
+
+// Photo_versions table behavior for v16
+// add md5_sum in photo_versions
+public class FSpotPhotoVersionsV16Behavior : FSpotTableBehavior<FSpotPhotoVersionRow>, Object {
+ private static FSpotPhotoVersionsV16Behavior instance;
+
+ private FSpotPhotoVersionsV16Behavior() {
+ }
+
+ public static FSpotPhotoVersionsV16Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoVersionsV16Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoVersionsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "version_id", "name", "uri",
+ "md5_sum", "protected" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoVersionRow row, int offset = 0) {
+ row = new FSpotPhotoVersionRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.version_id = stmt.column_int64(offset + 1);
+ row.name = stmt.column_text(offset + 2);
+
+ string? full_path = stmt.column_text(offset + 3);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.md5_sum = stmt.column_text(offset + 4);
+ row.is_protected = (stmt.column_int(offset + 5) > 0);
+ }
+}
+
+// Photo_versions table behavior for v17
+// v17 split the URI into base_uri and filename (reverting back to the original
+// design introduced in v0, albeit with a URI rather than a file system path)
+public class FSpotPhotoVersionsV17Behavior : FSpotTableBehavior<FSpotPhotoVersionRow>, Object {
+ private static FSpotPhotoVersionsV17Behavior instance;
+
+ private FSpotPhotoVersionsV17Behavior() {
+ }
+
+ public static FSpotPhotoVersionsV17Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoVersionsV17Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoVersionsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "version_id", "name", "base_uri", "filename",
+ "md5_sum", "protected" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoVersionRow row, int offset = 0) {
+ row = new FSpotPhotoVersionRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.version_id = stmt.column_int64(offset + 1);
+ row.name = stmt.column_text(offset + 2);
+
+ string? base_path = stmt.column_text(offset + 3);
+ string? filename = stmt.column_text(offset + 4);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.md5_sum = stmt.column_text(offset + 5);
+ row.is_protected = (stmt.column_int(offset + 6) > 0);
+ }
+}
+
+// Photo_versions table behavior for v18
+// md5_sum renamed import_md5
+public class FSpotPhotoVersionsV18Behavior : FSpotTableBehavior<FSpotPhotoVersionRow>, Object {
+ private static FSpotPhotoVersionsV18Behavior instance;
+
+ private FSpotPhotoVersionsV18Behavior() {
+ }
+
+ public static FSpotPhotoVersionsV18Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotoVersionsV18Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotoVersionsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "photo_id", "version_id", "name", "base_uri", "filename",
+ "import_md5", "protected" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoVersionRow row, int offset = 0) {
+ row = new FSpotPhotoVersionRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.version_id = stmt.column_int64(offset + 1);
+ row.name = stmt.column_text(offset + 2);
+
+ string? base_path = stmt.column_text(offset + 3);
+ string? filename = stmt.column_text(offset + 4);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.md5_sum = stmt.column_text(offset + 5);
+ row.is_protected = (stmt.column_int(offset + 6) > 0);
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotPhotosTable.vala b/plugins/shotwell-data-imports/FSpotPhotosTable.vala
new file mode 100644
index 0000000..4231102
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotPhotosTable.vala
@@ -0,0 +1,356 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "photos" table, representing a single database row.
+ */
+public class FSpotPhotoRow : Object {
+ public int64 photo_id;
+ public time_t time;
+ public File? base_path;
+ public string? filename;
+ public string description;
+ public int64 roll_id;
+ public int64 default_version_id;
+ public int rating;
+ public string md5_sum;
+}
+
+/**
+ * This class represents the F-Spot photos table.
+ */
+public class FSpotPhotosTable : FSpotDatabaseTable<FSpotPhotoRow> {
+ public static const string TABLE_NAME = "Photos";
+
+ public FSpotPhotosTable(Sqlite.Database db, FSpotDatabaseBehavior db_behavior) {
+ base(db);
+ set_behavior(db_behavior.get_photos_behavior());
+ }
+
+ public Gee.ArrayList<FSpotPhotoRow> get_all() throws DatabaseError {
+ Gee.ArrayList<FSpotPhotoRow> all = new Gee.ArrayList<FSpotPhotoRow?>();
+
+ Sqlite.Statement stmt;
+ int res = select_all(out stmt);
+ while (res == Sqlite.ROW) {
+ FSpotPhotoRow row;
+ behavior.build_row(stmt, out row);
+ all.add(row);
+ res = stmt.step();
+ }
+
+ return all;
+ }
+}
+
+// Photos table behavior for v0-4
+// The original table format
+public class FSpotPhotosV0Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV0Behavior instance;
+
+ private FSpotPhotosV0Behavior() {
+ }
+
+ public static FSpotPhotosV0Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV0Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "directory_path", "name", "description",
+ "default_version_id" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? base_path = stmt.column_text(offset + 2);
+ string? filename = stmt.column_text(offset + 3);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.description = stmt.column_text(offset + 4);
+ row.roll_id = INVALID_ID;
+ row.default_version_id = stmt.column_int64(offset + 5);
+ row.rating = 0;
+ row.md5_sum = "";
+ }
+}
+
+// Photos table behavior for v5-6
+// v5 introduced a roll_id to reference the imported roll (rolls were a new
+// table migrated from imports)
+public class FSpotPhotosV5Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV5Behavior instance;
+
+ private FSpotPhotosV5Behavior() {
+ }
+
+ public static FSpotPhotosV5Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV5Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "directory_path", "name", "description", "roll_id",
+ "default_version_id" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? base_path = stmt.column_text(offset + 2);
+ string? filename = stmt.column_text(offset + 3);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.description = stmt.column_text(offset + 4);
+ row.roll_id = stmt.column_int64(offset + 5);
+ row.default_version_id = stmt.column_int64(offset + 6);
+ row.rating = 0;
+ row.md5_sum = "";
+ }
+}
+
+// Photos table behavior for v7-10
+// v7 merged directory_path and name into a single URI value with a file://
+// prefix; presumaly this is meant to be able to handle remote files using a
+// different URI prefix such as remote files
+public class FSpotPhotosV7Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV7Behavior instance;
+
+ private FSpotPhotosV7Behavior() {
+ }
+
+ public static FSpotPhotosV7Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV7Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "uri", "description", "roll_id",
+ "default_version_id" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? full_path = stmt.column_text(offset + 2);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.description = stmt.column_text(offset + 3);
+ row.roll_id = stmt.column_int64(offset + 4);
+ row.default_version_id = stmt.column_int64(offset + 5);
+ row.rating = 0;
+ row.md5_sum = "";
+ }
+}
+
+// Photos table behavior for v11-15
+// v11 introduced the concept of rating so add this to the list of fields
+public class FSpotPhotosV11Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV11Behavior instance;
+
+ private FSpotPhotosV11Behavior() {
+ }
+
+ public static FSpotPhotosV11Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV11Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "uri", "description", "roll_id",
+ "default_version_id", "rating" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? full_path = stmt.column_text(offset + 2);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.description = stmt.column_text(offset + 3);
+ row.roll_id = stmt.column_int64(offset + 4);
+ row.default_version_id = stmt.column_int64(offset + 5);
+ row.rating = stmt.column_int(offset + 6);
+ row.md5_sum = "";
+ }
+}
+
+// Photos table behavior for v16
+// v16 introduced the MD5 sum so add this to the list of fields
+public class FSpotPhotosV16Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV16Behavior instance;
+
+ private FSpotPhotosV16Behavior() {
+ }
+
+ public static FSpotPhotosV16Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV16Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "uri", "description", "roll_id",
+ "default_version_id", "rating", "md5_sum" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? full_path = stmt.column_text(offset + 2);
+ if (full_path != null) {
+ File uri = File.new_for_uri(full_path);
+ row.base_path = uri.get_parent();
+ row.filename = uri.get_basename();
+ }
+
+ row.description = stmt.column_text(offset + 3);
+ row.roll_id = stmt.column_int64(offset + 4);
+ row.default_version_id = stmt.column_int64(offset + 5);
+ row.rating = stmt.column_int(offset + 6);
+ row.md5_sum = stmt.column_text(offset + 7);
+ }
+}
+
+// Photos table behavior for v17
+// v17 split the URI into base_uri and filename (reverting back to the original
+// design introduced in v0, albeit with a URI rather than a file system path)
+public class FSpotPhotosV17Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV17Behavior instance;
+
+ private FSpotPhotosV17Behavior() {
+ }
+
+ public static FSpotPhotosV17Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV17Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "base_uri", "filename", "description", "roll_id",
+ "default_version_id", "rating", "md5_sum" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? base_path = stmt.column_text(offset + 2);
+ string? filename = stmt.column_text(offset + 3);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.description = stmt.column_text(offset + 4);
+ row.roll_id = stmt.column_int64(offset + 5);
+ row.default_version_id = stmt.column_int64(offset + 6);
+ row.rating = stmt.column_int(offset + 7);
+ row.md5_sum = stmt.column_text(offset + 8);
+ }
+}
+
+// v18: no more MD5 hash in the photos table: moved to photo_versions table
+public class FSpotPhotosV18Behavior : FSpotTableBehavior<FSpotPhotoRow>, Object {
+ private static FSpotPhotosV18Behavior instance;
+
+ private FSpotPhotosV18Behavior() {
+ }
+
+ public static FSpotPhotosV18Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotPhotosV18Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotPhotosTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time", "base_uri", "filename", "description", "roll_id",
+ "default_version_id", "rating" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotPhotoRow row, int offset = 0) {
+ row = new FSpotPhotoRow();
+ row.photo_id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+
+ string? base_path = stmt.column_text(offset + 2);
+ string? filename = stmt.column_text(offset + 3);
+ if (base_path != null && filename != null) {
+ row.base_path = File.new_for_uri(base_path);
+ row.filename = filename;
+ }
+
+ row.description = stmt.column_text(offset + 4);
+ row.roll_id = stmt.column_int64(offset + 5);
+ row.default_version_id = stmt.column_int64(offset + 6);
+ row.rating = stmt.column_int(offset + 7);
+ row.md5_sum = "";
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotRollsTable.vala b/plugins/shotwell-data-imports/FSpotRollsTable.vala
new file mode 100644
index 0000000..fd5362d
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotRollsTable.vala
@@ -0,0 +1,111 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "rolls" table, representing a single database row.
+ */
+public class FSpotRollRow : Object {
+ public int64 id;
+ public time_t time;
+}
+
+/**
+ * This class represents the F-Spot rolls table.
+ */
+public class FSpotRollsTable : FSpotDatabaseTable<FSpotRollRow> {
+ public static const string TABLE_NAME = "Rolls";
+ public static const string TABLE_NAME_PRE_V5 = "Imports";
+
+ public FSpotRollsTable(Sqlite.Database db, FSpotDatabaseBehavior db_behavior) {
+ base(db);
+ set_behavior(db_behavior.get_rolls_behavior());
+ }
+
+ public FSpotRollRow? get_by_id(int64 roll_id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ FSpotRollRow? row = null;
+ string column_list = get_joined_column_list();
+ string sql = "SELECT %s FROM %s WHERE id=?".printf(column_list, table_name);
+
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.bind_int64(1, roll_id);
+ if (res != Sqlite.OK)
+ throw_error("Bind failed for roll_id", res);
+
+ res = stmt.step();
+ if (res == Sqlite.ROW)
+ behavior.build_row(stmt, out row);
+ else if (res == Sqlite.DONE)
+ message("Could not find roll row with ID %d", (int)roll_id);
+
+ return row;
+ }
+}
+
+// Rolls table behavior for v0-4
+public class FSpotRollsV0Behavior : FSpotTableBehavior<FSpotRollRow>, Object {
+ private static FSpotRollsV0Behavior instance;
+
+ private FSpotRollsV0Behavior() {
+ }
+
+ public static FSpotRollsV0Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotRollsV0Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotRollsTable.TABLE_NAME_PRE_V5;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotRollRow row, int offset = 0) {
+ row = new FSpotRollRow();
+ row.id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+ }
+}
+
+// Rolls table behavior for v5+
+// Table name changed from "imports" to "rolls"
+public class FSpotRollsV5Behavior : FSpotTableBehavior<FSpotRollRow>, Object {
+ private static FSpotRollsV5Behavior instance;
+
+ private FSpotRollsV5Behavior() {
+ }
+
+ public static FSpotRollsV5Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotRollsV5Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotRollsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "time" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotRollRow row, int offset = 0) {
+ row = new FSpotRollRow();
+ row.id = stmt.column_int64(offset + 0);
+ row.time = (time_t) stmt.column_int64(offset + 1);
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotTableBehavior.vala b/plugins/shotwell-data-imports/FSpotTableBehavior.vala
new file mode 100644
index 0000000..2d94427
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotTableBehavior.vala
@@ -0,0 +1,28 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * This class defines a generic table behavior. In practice, it implements
+ * the concept of a DAO (Data Access Object) in ORM terms and is responsible
+ * for transforming the data extracted from a relational statement into a
+ * lightweight value object.
+ *
+ * The type T defined in the generic is the value object type a behavior
+ * implementation is designed to handle. Value object types are designed to
+ * contain the data for a single database row.
+ */
+public interface FSpotTableBehavior<T> : Object {
+ public abstract string get_table_name();
+
+ public abstract string[] list_columns();
+
+ public abstract void build_row(Sqlite.Statement stmt, out T row, int offset = 0);
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/FSpotTagsTable.vala b/plugins/shotwell-data-imports/FSpotTagsTable.vala
new file mode 100644
index 0000000..07045cf
--- /dev/null
+++ b/plugins/shotwell-data-imports/FSpotTagsTable.vala
@@ -0,0 +1,129 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImports.FSpot.Db {
+
+/**
+ * The value object for the "tags" table, representing a single database row.
+ */
+public class FSpotTagRow : Object {
+ public int64 tag_id;
+ public string name;
+ public int64 category_id;
+ public bool is_category;
+ public int sort_priority;
+ public string stock_icon; // only store stock icons
+}
+
+/**
+ * This class represents the F-Spot tags table.
+ */
+public class FSpotTagsTable : FSpotDatabaseTable<FSpotTagRow> {
+ public static const string TABLE_NAME = "Tags";
+
+ public static const string PREFIX_STOCK_ICON = "stock_icon:";
+ public static const string STOCK_ICON_FAV = "stock_icon:emblem-favorite";
+ public static const string STOCK_ICON_PEOPLE = "stock_icon:emblem-people";
+ public static const string STOCK_ICON_PLACES = "stock_icon:emblem-places";
+ public static const string STOCK_ICON_EVENTS = "stock_icon:emblem-event";
+
+ private FSpotTableBehavior<FSpotPhotoTagRow> photo_tags_behavior;
+
+ public FSpotTagsTable(Sqlite.Database db, FSpotDatabaseBehavior db_behavior) {
+ base(db);
+ set_behavior(db_behavior.get_tags_behavior());
+ photo_tags_behavior = db_behavior.get_photo_tags_behavior();
+ }
+
+ public FSpotTagRow? get_by_id(int64 tag_id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ FSpotTagRow? row = null;
+ string column_list = get_joined_column_list();
+ string sql = "SELECT %s FROM %s WHERE id=?".printf(column_list, table_name);
+
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.bind_int64(1, tag_id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res == Sqlite.ROW)
+ behavior.build_row(stmt, out row);
+ else if (res == Sqlite.DONE)
+ message("Could not find tag row with ID %d", (int)tag_id);
+
+ return row;
+ }
+
+ public Gee.ArrayList<FSpotTagRow> get_by_photo_id(int64 photo_id) throws DatabaseError {
+ Gee.ArrayList<FSpotTagRow> rows = new Gee.ArrayList<FSpotTagRow?>();
+
+ Sqlite.Statement stmt;
+
+ string column_list = get_joined_column_list(true);
+ string sql = "SELECT %1$s FROM %2$s, %3$s WHERE %3$s.photo_id=? AND %3$s.tag_id = %2$s.id".printf(
+ column_list, table_name, photo_tags_behavior.get_table_name()
+ );
+
+ int res = fspot_db.prepare_v2(sql, -1, out stmt);
+ if (res != Sqlite.OK)
+ throw_error("Statement failed: %s".printf(sql), res);
+
+ res = stmt.bind_int64(1, photo_id);
+ if (res != Sqlite.OK)
+ throw_error("Bind failed for photo_id", res);
+
+ res = stmt.step();
+ while (res == Sqlite.ROW) {
+ FSpotTagRow row;
+ behavior.build_row(stmt, out row);
+ rows.add(row);
+ res = stmt.step();
+ }
+
+ return rows;
+ }
+}
+
+public class FSpotTagsV0Behavior : FSpotTableBehavior<FSpotTagRow>, Object {
+ private static FSpotTagsV0Behavior instance;
+
+ private FSpotTagsV0Behavior() {
+ }
+
+ public static FSpotTagsV0Behavior get_instance() {
+ if (instance == null)
+ instance = new FSpotTagsV0Behavior();
+ return instance;
+ }
+
+ public string get_table_name() {
+ return FSpotTagsTable.TABLE_NAME;
+ }
+
+ public string[] list_columns() {
+ return { "id", "name", "category_id", "is_category", "sort_priority", "icon" };
+ }
+
+ public void build_row(Sqlite.Statement stmt, out FSpotTagRow row, int offset = 0) {
+ row = new FSpotTagRow();
+ row.tag_id = stmt.column_int64(offset + 0);
+ row.name = stmt.column_text(offset + 1);
+ row.category_id = stmt.column_int64(offset + 2);
+ row.is_category = (stmt.column_int(offset + 3) > 0);
+ row.sort_priority = stmt.column_int(offset + 4);
+ string icon_str = stmt.column_text(offset + 5);
+ if (icon_str != null && icon_str.has_prefix(FSpotTagsTable.PREFIX_STOCK_ICON))
+ row.stock_icon = icon_str;
+ else
+ row.stock_icon = "";
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-data-imports/Makefile b/plugins/shotwell-data-imports/Makefile
new file mode 100644
index 0000000..52329e7
--- /dev/null
+++ b/plugins/shotwell-data-imports/Makefile
@@ -0,0 +1,30 @@
+
+PLUGIN := shotwell-data-imports
+
+PLUGIN_PKGS := \
+ gtk+-3.0 \
+ gexiv2 \
+ gee-0.8 \
+ sqlite3
+
+SRC_FILES := \
+ shotwell-data-imports.vala \
+ ../common/VersionNumber.vala \
+ ../common/SqliteSupport.vala \
+ FSpotImporter.vala \
+ FSpotDatabaseBehavior.vala \
+ FSpotDatabase.vala \
+ FSpotDatabaseTable.vala \
+ FSpotTableBehavior.vala \
+ FSpotMetaTable.vala \
+ FSpotPhotosTable.vala \
+ FSpotPhotoTagsTable.vala \
+ FSpotPhotoVersionsTable.vala \
+ FSpotRollsTable.vala \
+ FSpotTagsTable.vala
+
+RC_FILES := \
+ f-spot-24.png
+
+include ../Makefile.plugin.mk
+
diff --git a/plugins/shotwell-data-imports/f-spot-24.png b/plugins/shotwell-data-imports/f-spot-24.png
new file mode 100644
index 0000000..fda9672
--- /dev/null
+++ b/plugins/shotwell-data-imports/f-spot-24.png
Binary files differ
diff --git a/plugins/shotwell-data-imports/shotwell-data-imports.vala b/plugins/shotwell-data-imports/shotwell-data-imports.vala
new file mode 100644
index 0000000..c6e7d46
--- /dev/null
+++ b/plugins/shotwell-data-imports/shotwell-data-imports.vala
@@ -0,0 +1,46 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern const string _VERSION;
+
+// "core services" are: F-Spot
+private class ShotwellDataImportsCoreServices : Object, Spit.Module {
+ private Spit.Pluggable[] pluggables = new Spit.Pluggable[0];
+
+ // we need to get a module file handle because our pluggables have to load resources from the
+ // module file directory
+ public ShotwellDataImportsCoreServices(GLib.File module_file) {
+ GLib.File resource_directory = module_file.get_parent();
+
+ pluggables += new FSpotService(resource_directory);
+ }
+
+ public unowned string get_module_name() {
+ return _("Core Data Import Services");
+ }
+
+ public unowned string get_version() {
+ return _VERSION;
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.data_imports.core_services";
+ }
+
+ public unowned Spit.Pluggable[]? get_pluggables() {
+ return pluggables;
+ }
+}
+
+// This entry point is required for all SPIT modules.
+public Spit.Module? spit_entry_point(Spit.EntryPointParams *params) {
+ params->module_spit_interface = Spit.negotiate_interfaces(params->host_min_spit_interface,
+ params->host_max_spit_interface, Spit.CURRENT_INTERFACE);
+
+ return (params->module_spit_interface != Spit.UNSUPPORTED_INTERFACE)
+ ? new ShotwellDataImportsCoreServices(params->module_file) : null;
+}
+
diff --git a/plugins/shotwell-publishing-extras/Makefile b/plugins/shotwell-publishing-extras/Makefile
new file mode 100644
index 0000000..51f649f
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/Makefile
@@ -0,0 +1,27 @@
+
+PLUGIN := shotwell-publishing-extras
+
+PLUGIN_PKGS := \
+ gtk+-3.0 \
+ libsoup-2.4 \
+ libxml-2.0 \
+ webkitgtk-3.0 \
+ gee-0.8 \
+ rest-0.7 \
+ json-glib-1.0
+
+SRC_FILES := \
+ shotwell-publishing-extras.vala \
+ YandexPublishing.vala \
+ TumblrPublishing.vala \
+ ../../src/util/string.vala \
+ ../common/RESTSupport.vala
+
+RC_FILES := \
+ yandex_publish_model.glade \
+ tumblr.png \
+ tumblr_authentication_pane.glade \
+ tumblr_publishing_options_pane.glade
+
+include ../Makefile.plugin.mk
+
diff --git a/plugins/shotwell-publishing-extras/TumblrPublishing.vala b/plugins/shotwell-publishing-extras/TumblrPublishing.vala
new file mode 100644
index 0000000..6bafb21
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/TumblrPublishing.vala
@@ -0,0 +1,1157 @@
+/* Copyright 2012 BJA Electronics
+ * Author: Jeroen Arnoldus (b.j.arnoldus@bja-electronics.nl)
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+
+extern string hmac_sha1(string key, string message);
+public class TumblrService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "tumblr.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public TumblrService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.tumblr";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Tumblr";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Jeroen Arnoldus";
+ info.copyright = _("Copyright 2012 BJA Electronics");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Tumblr.TumblrPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO |
+ Spit.Publishing.Publisher.MediaType.VIDEO);
+ }
+}
+
+namespace Publishing.Tumblr {
+
+internal const string SERVICE_NAME = "Tumblr";
+internal const string ENDPOINT_URL = "http://www.tumblr.com/";
+internal const string API_KEY = "NdXvXQuKVccOsCOj0H4k9HUJcbcjDBYSo2AkaHzXFECHGNuP9k";
+internal const string API_SECRET = "BN0Uoig0MwbeD27OgA0IwYlp3Uvonyfsrl9pf1cnnMj1QoEUvi";
+internal const string ENCODE_RFC_3986_EXTRA = "!*'();:@&=+$,/?%#[] \\";
+internal const int ORIGINAL_SIZE = -1;
+
+
+
+private class BlogEntry {
+ public string blog;
+ public string url;
+ public BlogEntry(string creator_blog, string creator_url) {
+ blog = creator_blog;
+ url = creator_url;
+ }
+}
+
+private class SizeEntry {
+ public string title;
+ public int size;
+
+ public SizeEntry(string creator_title, int creator_size) {
+ title = creator_title;
+ size = creator_size;
+ }
+}
+
+public class TumblrPublisher : Spit.Publishing.Publisher, GLib.Object {
+ private Spit.Publishing.Service service;
+ private Spit.Publishing.PluginHost host;
+ private Spit.Publishing.ProgressCallback progress_reporter = null;
+ private bool running = false;
+ private bool was_started = false;
+ private Session session = null;
+ private PublishingOptionsPane publishing_options_pane = null;
+ private SizeEntry[] sizes = null;
+ private BlogEntry[] blogs = null;
+ private string username = "";
+
+
+ private SizeEntry[] create_sizes() {
+ SizeEntry[] result = new SizeEntry[0];
+
+ result += new SizeEntry(_("500 x 375 pixels"), 500);
+ result += new SizeEntry(_("1024 x 768 pixels"), 1024);
+ result += new SizeEntry(_("1280 x 853 pixels"), 1280);
+//Larger images make no sense for Tumblr
+// result += new SizeEntry(_("2048 x 1536 pixels"), 2048);
+// result += new SizeEntry(_("4096 x 3072 pixels"), 4096);
+// result += new SizeEntry(_("Original size"), ORIGINAL_SIZE);
+
+ return result;
+ }
+
+ private BlogEntry[] create_blogs() {
+ BlogEntry[] result = new BlogEntry[0];
+
+
+ return result;
+ }
+
+ public TumblrPublisher(Spit.Publishing.Service service,
+ Spit.Publishing.PluginHost host) {
+ debug("TumblrPublisher instantiated.");
+ this.service = service;
+ this.host = host;
+ this.session = new Session();
+ this.sizes = this.create_sizes();
+ this.blogs = this.create_blogs();
+ session.authenticated.connect(on_session_authenticated);
+ }
+
+ ~TumblrPublisher() {
+ session.authenticated.disconnect(on_session_authenticated);
+ }
+
+ private void invalidate_persistent_session() {
+ set_persistent_access_phase_token("");
+ set_persistent_access_phase_token_secret("");
+ }
+ // Publisher interface implementation
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+
+ public Spit.Publishing.PluginHost get_host() {
+ return host;
+ }
+
+ public bool is_running() {
+ return running;
+ }
+
+ private bool is_persistent_session_valid() {
+ string? access_phase_token = get_persistent_access_phase_token();
+ string? access_phase_token_secret = get_persistent_access_phase_token_secret();
+
+ bool valid = ((access_phase_token != null) && (access_phase_token_secret != null));
+
+ if (valid)
+ debug("existing Tumblr session found in configuration database; using it.");
+ else
+ debug("no persisted Tumblr session exists.");
+
+ return valid;
+ }
+
+
+
+
+ public string? get_persistent_access_phase_token() {
+ return host.get_config_string("token", null);
+ }
+
+ private void set_persistent_access_phase_token(string? token) {
+ host.set_config_string("token", token);
+ }
+
+ public string? get_persistent_access_phase_token_secret() {
+ return host.get_config_string("token_secret", null);
+ }
+
+ private void set_persistent_access_phase_token_secret(string? token_secret) {
+ host.set_config_string("token_secret", token_secret);
+ }
+
+ internal int get_persistent_default_size() {
+ return host.get_config_int("default_size", 1);
+ }
+
+ internal void set_persistent_default_size(int size) {
+ host.set_config_int("default_size", size);
+ }
+
+ internal int get_persistent_default_blog() {
+ return host.get_config_int("default_blog", 0);
+ }
+
+ internal void set_persistent_default_blog(int blog) {
+ host.set_config_int("default_blog", blog);
+ }
+
+ // Actions and events implementation
+
+ /**
+ * Action that shows the authentication pane.
+ *
+ * This action method shows the authentication pane. It is shown at the
+ * very beginning of the interaction when no persistent parameters are found
+ * or after a failed login attempt using persisted parameters. It can be
+ * given a mode flag to specify whether it should be displayed in initial
+ * mode or in any of the error modes that it supports.
+ *
+ * @param mode the mode for the authentication pane
+ */
+ private void do_show_authentication_pane(AuthenticationPane.Mode mode = AuthenticationPane.Mode.INTRO) {
+ debug("ACTION: installing authentication pane");
+
+ host.set_service_locked(false);
+ AuthenticationPane authentication_pane =
+ new AuthenticationPane(this, mode);
+ authentication_pane.login.connect(on_authentication_pane_login_clicked);
+ host.install_dialog_pane(authentication_pane, Spit.Publishing.PluginHost.ButtonMode.CLOSE);
+ host.set_dialog_default_widget(authentication_pane.get_default_widget());
+ }
+
+ /**
+ * Event triggered when the login button in the authentication panel is
+ * clicked.
+ *
+ * This event is triggered when the login button in the authentication
+ * panel is clicked. It then triggers a network login interaction.
+ *
+ * @param username the name of the Tumblr user as entered in the dialog
+ * @param password the password of the Tumblr as entered in the dialog
+ */
+ private void on_authentication_pane_login_clicked( string username, string password ) {
+ debug("EVENT: on_authentication_pane_login_clicked");
+ if (!running)
+ return;
+
+ do_network_login(username, password);
+ }
+
+ /**
+ * Action to perform a network login to a Tumblr blog.
+ *
+ * This action performs a network login a Tumblr blog specified the given user name and password as credentials.
+ *
+ * @param username the name of the Tumblr user used to login
+ * @param password the password of the Tumblr user used to login
+ */
+ private void do_network_login(string username, string password) {
+ debug("ACTION: logging in");
+ host.set_service_locked(true);
+ host.install_login_wait_pane();
+
+
+ AccessTokenFetchTransaction txn = new AccessTokenFetchTransaction(session,username,password);
+ txn.completed.connect(on_auth_request_txn_completed);
+ txn.network_error.connect(on_auth_request_txn_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+
+ private void on_auth_request_txn_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_auth_request_txn_completed);
+ txn.network_error.disconnect(on_auth_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: OAuth authentication request transaction completed; response = '%s'",
+ txn.get_response());
+
+ do_parse_token_info_from_auth_request(txn.get_response());
+ }
+
+ private void on_auth_request_txn_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_auth_request_txn_completed);
+ txn.network_error.disconnect(on_auth_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: OAuth authentication request transaction caused a network error");
+ host.post_error(err);
+ }
+
+
+ private void do_parse_token_info_from_auth_request(string response) {
+ debug("ACTION: parsing authorization request response '%s' into token and secret", response);
+
+ string? oauth_token = null;
+ string? oauth_token_secret = null;
+
+ string[] key_value_pairs = response.split("&");
+ foreach (string pair in key_value_pairs) {
+ string[] split_pair = pair.split("=");
+
+ if (split_pair.length != 2)
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ _("'%s' isn't a valid response to an OAuth authentication request")));
+
+ if (split_pair[0] == "oauth_token")
+ oauth_token = split_pair[1];
+ else if (split_pair[0] == "oauth_token_secret")
+ oauth_token_secret = split_pair[1];
+ }
+
+ if (oauth_token == null || oauth_token_secret == null)
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ _("'%s' isn't a valid response to an OAuth authentication request")));
+
+ session.set_access_phase_credentials(oauth_token, oauth_token_secret);
+ }
+
+
+
+ private void on_session_authenticated() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: a fully authenticated session has become available");
+ set_persistent_access_phase_token(session.get_access_phase_token());
+ set_persistent_access_phase_token_secret(session.get_access_phase_token_secret());
+ do_get_blogs();
+
+}
+
+ private void do_get_blogs() {
+ debug("ACTION: obtain all blogs of the tumblr user");
+ UserInfoFetchTransaction txn = new UserInfoFetchTransaction(session);
+ txn.completed.connect(on_info_request_txn_completed);
+ txn.network_error.connect(on_info_request_txn_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+
+
+ }
+
+
+ private void on_info_request_txn_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_info_request_txn_completed);
+ txn.network_error.disconnect(on_info_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user info request transaction completed; response = '%s'",
+ txn.get_response());
+ do_parse_token_info_from_user_request(txn.get_response());
+ do_show_publishing_options_pane();
+ }
+
+
+ private void do_parse_token_info_from_user_request(string response) {
+ debug("ACTION: parsing info request response '%s' into list of available blogs", response);
+ try {
+ var parser = new Json.Parser();
+ parser.load_from_data (response, -1);
+ var root_object = parser.get_root().get_object();
+ this.username = root_object.get_object_member("response").get_object_member("user").get_string_member ("name");
+ debug("Got user name: %s",username);
+ foreach (var blognode in root_object.get_object_member("response").get_object_member("user").get_array_member("blogs").get_elements ()) {
+ var blog = blognode.get_object ();
+ string name = blog.get_string_member ("name");
+ string url = blog.get_string_member ("url").replace("http://","").replace("/","");
+ debug("Got blog name: %s and url: %s", name, url);
+ this.blogs += new BlogEntry(name,url);
+ }
+ } catch (Error err) {
+ host.post_error(err);
+ }
+ }
+
+ private void on_info_request_txn_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_info_request_txn_completed);
+ txn.network_error.disconnect(on_info_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ session.deauthenticate();
+ invalidate_persistent_session();
+ debug("EVENT: user info request transaction caused a network error");
+ host.post_error(err);
+ }
+
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: displaying publishing options pane");
+ host.set_service_locked(false);
+ PublishingOptionsPane publishing_options_pane =
+ new PublishingOptionsPane(this, host.get_publishable_media_type(), this.sizes, this.blogs, this.username);
+ publishing_options_pane.publish.connect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.connect(on_publishing_options_pane_logout);
+ host.install_dialog_pane(publishing_options_pane);
+ }
+
+
+
+ private void on_publishing_options_pane_publish() {
+ if (publishing_options_pane != null) {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+ }
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked the 'Publish' button in the publishing options pane");
+ do_publish();
+ }
+
+ private void on_publishing_options_pane_logout() {
+ if (publishing_options_pane != null) {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+ }
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked the 'Logout' button in the publishing options pane");
+
+ do_logout();
+ }
+
+ public static int tumblr_date_time_compare_func(Spit.Publishing.Publishable a,
+ Spit.Publishing.Publishable b) {
+ return a.get_exposure_date_time().compare(b.get_exposure_date_time());
+ }
+
+ private void do_publish() {
+ debug("ACTION: uploading media items to remote server.");
+
+ host.set_service_locked(true);
+
+ progress_reporter = host.serialize_publishables(sizes[get_persistent_default_size()].size);
+
+ // Serialization is a long and potentially cancellable operation, so before we use
+ // the publishables, make sure that the publishing interaction is still running. If it
+ // isn't the publishing environment may be partially torn down so do a short-circuit
+ // return
+ if (!is_running())
+ return;
+
+ // Sort publishables in reverse-chronological order.
+ Spit.Publishing.Publishable[] publishables = host.get_publishables();
+ Gee.ArrayList<Spit.Publishing.Publishable> sorted_list =
+ new Gee.ArrayList<Spit.Publishing.Publishable>();
+ foreach (Spit.Publishing.Publishable p in publishables) {
+ debug("ACTION: add publishable");
+ sorted_list.add(p);
+ }
+ sorted_list.sort(tumblr_date_time_compare_func);
+ string blog_url = this.blogs[get_persistent_default_blog()].url;
+
+ Uploader uploader = new Uploader(session, sorted_list.to_array(),blog_url);
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void do_show_success_pane() {
+ debug("ACTION: showing success pane.");
+
+ host.set_service_locked(false);
+ host.install_success_pane();
+ }
+
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader,
+ int num_published) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload complete; %d items published.", num_published);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ do_show_success_pane();
+ }
+
+ private void on_upload_error(Publishing.RESTSupport.BatchUploader uploader,
+ Spit.Publishing.PublishingError err) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload error = '%s'.", err.message);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ host.post_error(err);
+ }
+
+
+ private void do_logout() {
+ debug("ACTION: logging user out, deauthenticating session, and erasing stored credentials");
+
+ session.deauthenticate();
+ invalidate_persistent_session();
+
+ running = false;
+
+ attempt_start();
+ }
+
+ public void attempt_start() {
+ if (is_running())
+ return;
+
+ debug("TumblrPublisher: starting interaction.");
+
+ running = true;
+ if (is_persistent_session_valid()) {
+ debug("attempt start: a persistent session is available; using it");
+
+ session.authenticate_from_persistent_credentials(get_persistent_access_phase_token(),
+ get_persistent_access_phase_token_secret());
+ } else {
+ debug("attempt start: no persistent session available; showing login welcome pane");
+
+ do_show_authentication_pane();
+ }
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ if (was_started)
+ error(_("TumblrPublisher: start( ): can't start; this publisher is not restartable."));
+
+ debug("TumblrPublisher: starting interaction.");
+
+ attempt_start();
+ }
+
+ public void stop() {
+ debug("TumblrPublisher: stop( ) invoked.");
+
+// if (session != null)
+// session.stop_transactions();
+
+ running = false;
+ }
+
+
+// UI elements
+
+/**
+ * The authentication pane used when asking service URL, user name and password
+ * from the user.
+ */
+internal class AuthenticationPane : Spit.Publishing.DialogPane, Object {
+ public enum Mode {
+ INTRO,
+ FAILED_RETRY_USER
+ }
+ private static string INTRO_MESSAGE = _("Enter the username and password associated with your Tumblr account.");
+ private static string FAILED_RETRY_USER_MESSAGE = _("Username and/or password invalid. Please try again");
+
+ private Gtk.Box pane_widget = null;
+ private Gtk.Builder builder;
+ private Gtk.Entry username_entry;
+ private Gtk.Entry password_entry;
+ private Gtk.Button login_button;
+
+ public signal void login(string user, string password);
+
+ public AuthenticationPane(TumblrPublisher publisher, Mode mode = Mode.INTRO) {
+ this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ File ui_file = publisher.get_host().get_module_file().get_parent().
+ get_child("tumblr_authentication_pane.glade");
+
+ try {
+ builder = new Gtk.Builder();
+ builder.add_from_file(ui_file.get_path());
+ builder.connect_signals(null);
+ Gtk.Alignment align = builder.get_object("alignment") as Gtk.Alignment;
+
+ Gtk.Label message_label = builder.get_object("message_label") as Gtk.Label;
+ switch (mode) {
+ case Mode.INTRO:
+ message_label.set_text(INTRO_MESSAGE);
+ break;
+
+ case Mode.FAILED_RETRY_USER:
+ message_label.set_markup("<b>%s</b>\n\n%s".printf(_(
+ "Invalid User Name or Password"), FAILED_RETRY_USER_MESSAGE));
+ break;
+ }
+
+ username_entry = builder.get_object ("username_entry") as Gtk.Entry;
+
+ password_entry = builder.get_object ("password_entry") as Gtk.Entry;
+
+
+
+ login_button = builder.get_object("login_button") as Gtk.Button;
+
+ username_entry.changed.connect(on_user_changed);
+ password_entry.changed.connect(on_password_changed);
+ login_button.clicked.connect(on_login_button_clicked);
+
+ align.reparent(pane_widget);
+ publisher.get_host().set_dialog_default_widget(login_button);
+ } catch (Error e) {
+ warning(_("Could not load UI: %s"), e.message);
+ }
+ }
+
+ public Gtk.Widget get_default_widget() {
+ return login_button;
+ }
+
+ private void on_login_button_clicked() {
+ login(username_entry.get_text(),
+ password_entry.get_text());
+ }
+
+
+ private void on_user_changed() {
+ update_login_button_sensitivity();
+ }
+
+ private void on_password_changed() {
+ update_login_button_sensitivity();
+ }
+
+ private void update_login_button_sensitivity() {
+ login_button.set_sensitive(
+ !is_string_empty(username_entry.get_text()) &&
+ !is_string_empty(password_entry.get_text())
+ );
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ username_entry.grab_focus();
+ password_entry.set_activates_default(true);
+ login_button.can_default = true;
+ update_login_button_sensitivity();
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+
+/**
+ * The publishing options pane.
+ */
+
+
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object {
+
+
+
+ private Gtk.Builder builder;
+ private Gtk.Box pane_widget = null;
+ private Gtk.Label upload_info_label = null;
+ private Gtk.Label size_label = null;
+ private Gtk.Label blog_label = null;
+ private Gtk.Button logout_button = null;
+ private Gtk.Button publish_button = null;
+ private Gtk.ComboBoxText size_combo = null;
+ private Gtk.ComboBoxText blog_combo = null;
+ private SizeEntry[] sizes = null;
+ private BlogEntry[] blogs = null;
+ private string username = "";
+ private TumblrPublisher publisher = null;
+ private Spit.Publishing.Publisher.MediaType media_type;
+
+ public signal void publish();
+ public signal void logout();
+
+ public PublishingOptionsPane(TumblrPublisher publisher, Spit.Publishing.Publisher.MediaType media_type, SizeEntry[] sizes, BlogEntry[] blogs, string username) {
+
+ this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ this.username = username;
+ this.publisher = publisher;
+ this.media_type = media_type;
+ this.sizes = sizes;
+ this.blogs=blogs;
+ File ui_file = publisher.get_host().get_module_file().get_parent().
+ get_child("tumblr_publishing_options_pane.glade");
+
+ try {
+ builder = new Gtk.Builder();
+ builder.add_from_file(ui_file.get_path());
+ builder.connect_signals(null);
+
+ // pull in the necessary widgets from the glade file
+ pane_widget = (Gtk.Box) this.builder.get_object("tumblr_pane");
+ upload_info_label = (Gtk.Label) this.builder.get_object("upload_info_label");
+ logout_button = (Gtk.Button) this.builder.get_object("logout_button");
+ publish_button = (Gtk.Button) this.builder.get_object("publish_button");
+ size_combo = (Gtk.ComboBoxText) this.builder.get_object("size_combo");
+ size_label = (Gtk.Label) this.builder.get_object("size_label");
+ blog_combo = (Gtk.ComboBoxText) this.builder.get_object("blog_combo");
+ blog_label = (Gtk.Label) this.builder.get_object("blog_label");
+
+
+ string upload_label_text = _("You are logged into Tumblr as %s.\n\n").printf(this.username);
+ upload_info_label.set_label(upload_label_text);
+
+ populate_blog_combo();
+ blog_combo.changed.connect(on_blog_changed);
+
+ if ((media_type != Spit.Publishing.Publisher.MediaType.VIDEO)) {
+ populate_size_combo();
+ size_combo.changed.connect(on_size_changed);
+ } else {
+ // publishing -only- video - don't let the user manipulate the photo size choices.
+ size_combo.set_sensitive(false);
+ size_label.set_sensitive(false);
+ }
+
+ logout_button.clicked.connect(on_logout_clicked);
+ publish_button.clicked.connect(on_publish_clicked);
+ } catch (Error e) {
+ warning(_("Could not load UI: %s"), e.message);
+ }
+ }
+
+
+
+
+
+ private void on_logout_clicked() {
+ logout();
+ }
+
+ private void on_publish_clicked() {
+
+
+ publish();
+ }
+
+
+ private void populate_blog_combo() {
+ if (blogs != null) {
+ foreach (BlogEntry b in blogs)
+ blog_combo.append_text(b.blog);
+ blog_combo.set_active(publisher.get_persistent_default_blog());
+ }
+ }
+
+ private void on_blog_changed() {
+ publisher.set_persistent_default_blog(blog_combo.get_active());
+ }
+
+ private void populate_size_combo() {
+ if (sizes != null) {
+ foreach (SizeEntry e in sizes)
+ size_combo.append_text(e.title);
+ size_combo.set_active(publisher.get_persistent_default_size());
+ }
+ }
+
+ private void on_size_changed() {
+ publisher.set_persistent_default_size(size_combo.get_active());
+ }
+
+
+ protected void notify_publish() {
+ publish();
+ }
+
+ protected void notify_logout() {
+ logout();
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ publish.connect(notify_publish);
+ logout.connect(notify_logout);
+ }
+
+ public void on_pane_uninstalled() {
+ publish.disconnect(notify_publish);
+ logout.disconnect(notify_logout);
+ }
+}
+
+
+// REST support classes
+internal class Transaction : Publishing.RESTSupport.Transaction {
+ public Transaction(Session session, Publishing.RESTSupport.HttpMethod method =
+ Publishing.RESTSupport.HttpMethod.POST) {
+ base(session, method);
+
+ }
+
+ public Transaction.with_uri(Session session, string uri,
+ Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.POST) {
+ base.with_endpoint_url(session, uri, method);
+
+ add_argument("oauth_nonce", session.get_oauth_nonce());
+ add_argument("oauth_signature_method", "HMAC-SHA1");
+ add_argument("oauth_version", "1.0");
+ add_argument("oauth_timestamp", session.get_oauth_timestamp());
+ add_argument("oauth_consumer_key", API_KEY);
+ if (session.get_access_phase_token() != null) {
+ add_argument("oauth_token", session.get_access_phase_token());
+ }
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ ((Session) get_parent_session()).sign_transaction(this);
+
+ base.execute();
+ }
+
+}
+
+
+internal class AccessTokenFetchTransaction : Transaction {
+ public AccessTokenFetchTransaction(Session session, string username, string password) {
+ base.with_uri(session, "https://www.tumblr.com/oauth/access_token",
+ Publishing.RESTSupport.HttpMethod.POST);
+ add_argument("x_auth_username", Soup.URI.encode(username, ENCODE_RFC_3986_EXTRA));
+ add_argument("x_auth_password", password);
+ add_argument("x_auth_mode", "client_auth");
+ }
+}
+
+internal class UserInfoFetchTransaction : Transaction {
+ public UserInfoFetchTransaction(Session session) {
+ base.with_uri(session, "http://api.tumblr.com/v2/user/info",
+ Publishing.RESTSupport.HttpMethod.POST);
+ }
+}
+
+
+internal class UploadTransaction : Publishing.RESTSupport.UploadTransaction {
+ private Session session;
+ private Publishing.RESTSupport.Argument[] auth_header_fields;
+
+
+//Workaround for Soup.URI.encode() to support binary data (i.e. string with \0)
+ private string encode( uint8[] data ){
+ var s = new StringBuilder();
+ char[] bytes = new char[2];
+ bytes[1] = 0;
+ foreach( var byte in data )
+ {
+ if(byte == 0) {
+ s.append( "%00" );
+ } else {
+ bytes[0] = (char)byte;
+ s.append( Soup.URI.encode((string) bytes, ENCODE_RFC_3986_EXTRA) );
+ }
+ }
+ return s.str;
+ }
+
+
+ public UploadTransaction(Session session,Spit.Publishing.Publishable publishable, string blog_url) {
+ debug("Init upload transaction");
+ base.with_endpoint_url(session, publishable,"http://api.tumblr.com/v2/blog/%s/post".printf(blog_url) );
+ this.session = session;
+
+ }
+
+
+
+ public void add_authorization_header_field(string key, string value) {
+ auth_header_fields += new Publishing.RESTSupport.Argument(key, value);
+ }
+
+ public Publishing.RESTSupport.Argument[] get_authorization_header_fields() {
+ return auth_header_fields;
+ }
+
+ public string get_authorization_header_string() {
+ string result = "OAuth ";
+
+ for (int i = 0; i < auth_header_fields.length; i++) {
+ result += auth_header_fields[i].key;
+ result += "=";
+ result += ("\"" + auth_header_fields[i].value + "\"");
+
+ if (i < auth_header_fields.length - 1)
+ result += ", ";
+ }
+
+ return result;
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ add_authorization_header_field("oauth_nonce", session.get_oauth_nonce());
+ add_authorization_header_field("oauth_signature_method", "HMAC-SHA1");
+ add_authorization_header_field("oauth_version", "1.0");
+ add_authorization_header_field("oauth_timestamp", session.get_oauth_timestamp());
+ add_authorization_header_field("oauth_consumer_key", API_KEY);
+ add_authorization_header_field("oauth_token", session.get_access_phase_token());
+
+
+ string payload;
+ size_t payload_length;
+ try {
+ FileUtils.get_contents(base.publishable.get_serialized_file().get_path(), out payload,
+ out payload_length);
+
+ string reqdata = this.encode(payload.data[0:payload_length]);
+
+
+
+ add_argument("data[0]", reqdata);
+ add_argument("type", "photo");
+ string[] keywords = base.publishable.get_publishing_keywords();
+ string tags = "";
+ if (keywords != null) {
+ foreach (string tag in keywords) {
+ if (!is_string_empty(tags)) {
+ tags += ",";
+ }
+ tags += tag;
+ }
+ }
+ add_argument("tags", Soup.URI.encode(tags, ENCODE_RFC_3986_EXTRA));
+
+ } catch (FileError e) {
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A temporary file needed for publishing is unavailable"));
+
+ }
+
+
+ session.sign_transaction(this);
+
+ string authorization_header = get_authorization_header_string();
+
+ debug("executing upload transaction: authorization header string = '%s'",
+ authorization_header);
+ add_header("Authorization", authorization_header);
+
+ Publishing.RESTSupport.Argument[] request_arguments = get_arguments();
+ assert(request_arguments.length > 0);
+
+ string request_data = "";
+ for (int i = 0; i < request_arguments.length; i++) {
+ request_data += (request_arguments[i].key + "=" + request_arguments[i].value);
+ if (i < request_arguments.length - 1)
+ request_data += "&";
+ }
+ Soup.Message outbound_message = new Soup.Message( "POST", get_endpoint_url());
+ outbound_message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, request_data.data);
+
+ // TODO: there must be a better way to iterate over a map
+ Gee.MapIterator<string, string> i = base.message_headers.map_iterator();
+ bool cont = i.next();
+ while(cont) {
+ outbound_message.request_headers.append(i.get_key(), i.get_value());
+ cont = i.next();
+ }
+ set_message(outbound_message);
+
+ set_is_executed(true);
+
+ send();
+ }
+}
+
+
+
+internal class Uploader : Publishing.RESTSupport.BatchUploader {
+ private string blog_url = "";
+ public Uploader(Session session, Spit.Publishing.Publishable[] publishables, string blog_url) {
+ base(session, publishables);
+ this.blog_url=blog_url;
+
+ }
+
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(
+ Spit.Publishing.Publishable publishable) {
+ debug("Create upload transaction");
+ return new UploadTransaction((Session) get_session(), get_current_publishable(), this.blog_url);
+
+ }
+}
+
+/**
+ * Session class that keeps track of the authentication status and of the
+ * user token tumblr.
+ */
+internal class Session : Publishing.RESTSupport.Session {
+ private string? access_phase_token = null;
+ private string? access_phase_token_secret = null;
+
+
+ public Session() {
+ base(ENDPOINT_URL);
+ }
+
+ public override bool is_authenticated() {
+ return (access_phase_token != null && access_phase_token_secret != null);
+ }
+
+ public void authenticate_from_persistent_credentials(string token, string secret) {
+ this.access_phase_token = token;
+ this.access_phase_token_secret = secret;
+
+
+ authenticated();
+ }
+
+ public void deauthenticate() {
+ access_phase_token = null;
+ access_phase_token_secret = null;
+ }
+
+ public void sign_transaction(Publishing.RESTSupport.Transaction txn) {
+ string http_method = txn.get_method().to_string();
+
+ debug("signing transaction with parameters:");
+ debug("HTTP method = " + http_method);
+ string? signing_key = null;
+ if (access_phase_token_secret != null) {
+ debug("access phase token secret available; using it as signing key");
+
+ signing_key = API_SECRET + "&" + this.get_access_phase_token_secret();
+ } else {
+ debug("Access phase token secret not available; using API " +
+ "key as signing key");
+
+ signing_key = API_SECRET + "&";
+ }
+
+
+ Publishing.RESTSupport.Argument[] base_string_arguments = txn.get_arguments();
+
+ UploadTransaction? upload_txn = txn as UploadTransaction;
+ if (upload_txn != null) {
+ debug("this transaction is an UploadTransaction; including Authorization header " +
+ "fields in signature base string");
+
+ Publishing.RESTSupport.Argument[] auth_header_args =
+ upload_txn.get_authorization_header_fields();
+
+ foreach (Publishing.RESTSupport.Argument arg in auth_header_args)
+ base_string_arguments += arg;
+ }
+
+ Publishing.RESTSupport.Argument[] sorted_args =
+ Publishing.RESTSupport.Argument.sort(base_string_arguments);
+
+ string arguments_string = "";
+ for (int i = 0; i < sorted_args.length; i++) {
+ arguments_string += (sorted_args[i].key + "=" + sorted_args[i].value);
+ if (i < sorted_args.length - 1)
+ arguments_string += "&";
+ }
+
+
+ string signature_base_string = http_method + "&" + Soup.URI.encode(
+ txn.get_endpoint_url(), ENCODE_RFC_3986_EXTRA) + "&" +
+ Soup.URI.encode(arguments_string, ENCODE_RFC_3986_EXTRA);
+
+ debug("signature base string = '%s'", signature_base_string);
+ debug("signing key = '%s'", signing_key);
+
+ // compute the signature
+ string signature = hmac_sha1(signing_key, signature_base_string);
+ debug("signature = '%s'", signature);
+ signature = Soup.URI.encode(signature, ENCODE_RFC_3986_EXTRA);
+
+ debug("signature after RFC encode = '%s'", signature);
+
+ if (upload_txn != null)
+ upload_txn.add_authorization_header_field("oauth_signature", signature);
+ else
+ txn.add_argument("oauth_signature", signature);
+
+
+ }
+
+ public void set_access_phase_credentials(string token, string secret) {
+ this.access_phase_token = token;
+ this.access_phase_token_secret = secret;
+
+
+ authenticated();
+ }
+
+ public string get_access_phase_token() {
+ return access_phase_token;
+ }
+
+
+ public string get_access_phase_token_secret() {
+ return access_phase_token_secret;
+ }
+
+ public string get_oauth_nonce() {
+ TimeVal currtime = TimeVal();
+ currtime.get_current_time();
+
+ return Checksum.compute_for_string(ChecksumType.MD5, currtime.tv_sec.to_string() +
+ currtime.tv_usec.to_string());
+ }
+
+ public string get_oauth_timestamp() {
+ return GLib.get_real_time().to_string().substring(0, 10);
+ }
+
+}
+
+
+} //class TumblrPublisher
+
+} //namespace Publishing.Tumblr
+
diff --git a/plugins/shotwell-publishing-extras/YandexPublishing.vala b/plugins/shotwell-publishing-extras/YandexPublishing.vala
new file mode 100644
index 0000000..36a3ede
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/YandexPublishing.vala
@@ -0,0 +1,665 @@
+/* Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class YandexService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface, Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.yandex-fotki";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Yandex.Fotki";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Evgeniy Polyakov <zbr@ioremap.net>";
+ info.copyright = _("Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = _("Visit the Yandex.Fotki web site");
+ info.website_url = "http://fotki.yandex.ru/";
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Yandex.YandexPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO);
+ }
+
+ public void activation(bool enabled) {
+ }
+}
+
+namespace Publishing.Yandex {
+
+internal const string SERVICE_NAME = "Yandex.Fotki";
+
+private const string client_id = "52be4756dee3438792c831a75d7cd360";
+
+internal class Transaction: Publishing.RESTSupport.Transaction {
+ public Transaction.with_url(Session session, string url, Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.GET) {
+ base.with_endpoint_url(session, url, method);
+ add_headers();
+ }
+
+ private void add_headers() {
+ if (((Session) get_parent_session()).is_authenticated()) {
+ add_header("Authorization", "OAuth %s".printf(((Session) get_parent_session()).get_auth_token()));
+ add_header("Connection", "close");
+ }
+ }
+
+ public Transaction(Session session, Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.GET) {
+ base(session, method);
+ add_headers();
+ }
+
+ public void add_data(string type, string data) {
+ set_custom_payload(data, type);
+ }
+}
+
+internal class Session : Publishing.RESTSupport.Session {
+ private string? auth_token = null;
+
+ public Session() {
+ }
+
+ public override bool is_authenticated() {
+ return (auth_token != null);
+ }
+
+ public void deauthenticate() {
+ auth_token = null;
+ }
+
+ public void set_auth_token(string token) {
+ this.auth_token = token;
+ }
+
+ public string? get_auth_token() {
+ return auth_token;
+ }
+}
+
+internal class WebAuthPane : Spit.Publishing.DialogPane, GLib.Object {
+ private WebKit.WebView webview = null;
+ private Gtk.Box pane_widget = null;
+ private Gtk.ScrolledWindow webview_frame = null;
+
+ private Regex re;
+ private string? login_url = null;
+
+ public signal void login_succeeded(string success_url);
+ public signal void login_failed();
+
+ public WebAuthPane(string login_url) {
+ this.login_url = login_url;
+
+ try {
+ this.re = new Regex("(.*)#access_token=([a-zA-Z0-9]*)&");
+ } catch (RegexError e) {
+ critical("%s", e.message);
+ }
+
+ pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ webview_frame = new Gtk.ScrolledWindow(null, null);
+ webview_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN);
+ webview_frame.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+
+ webview = new WebKit.WebView();
+ webview.get_settings().enable_plugins = false;
+ webview.get_settings().enable_default_context_menu = false;
+
+ webview.load_finished.connect(on_page_load);
+ webview.load_started.connect(on_load_started);
+ webview.navigation_requested.connect(navigation_requested);
+
+ webview_frame.add(webview);
+ pane_widget.pack_start(webview_frame, true, true, 0);
+ }
+
+ private void on_page_load(WebKit.WebFrame origin_frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+ }
+
+ private WebKit.NavigationResponse navigation_requested (WebKit.WebFrame frame, WebKit.NetworkRequest req) {
+ debug("Navigating to '%s'", req.uri);
+
+ MatchInfo info = null;
+
+ if (re.match(req.uri, 0, out info)) {
+ string access_token = info.fetch_all()[2];
+
+ debug("Load completed: %s", access_token);
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+ if (access_token != null) {
+ login_succeeded(access_token);
+ return WebKit.NavigationResponse.IGNORE;
+ } else
+ login_failed();
+ }
+ return WebKit.NavigationResponse.ACCEPT;
+ }
+
+ private void on_load_started(WebKit.WebFrame frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.WATCH));
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.RESIZABLE;
+ }
+
+ public void on_pane_installed() {
+ webview.open(login_url);
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+internal class PublishOptions {
+ public bool disable_comments = false;
+ public bool hide_original = false;
+ public string access_type;
+
+ public string destination_album = null;
+ public string destination_album_url = null;
+}
+
+internal class PublishingOptionsPane: Spit.Publishing.DialogPane, GLib.Object {
+ private Gtk.Box box;
+ private Gtk.Builder builder;
+ private Gtk.Button logout_button;
+ private Gtk.Button publish_button;
+ private Gtk.ComboBoxText album_list;
+
+ private weak PublishOptions options;
+
+ public signal void publish();
+ public signal void logout();
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+ public void on_pane_installed() {
+ }
+ public void on_pane_uninstalled() {
+ }
+ public Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public PublishingOptionsPane(PublishOptions options, Gee.HashMap<string, string> list,
+ Spit.Publishing.PluginHost host) {
+ this.options = options;
+
+ box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ File ui_file = host.get_module_file().get_parent().get_child("yandex_publish_model.glade");
+
+ try {
+ builder = new Gtk.Builder();
+ builder.add_from_file(ui_file.get_path());
+ builder.connect_signals(null);
+ Gtk.Alignment align = builder.get_object("alignment") as Gtk.Alignment;
+
+ album_list = builder.get_object ("album_list") as Gtk.ComboBoxText;
+ foreach (string key in list.keys)
+ album_list.append_text(key);
+
+ album_list.set_active(0);
+
+ publish_button = builder.get_object("publish_button") as Gtk.Button;
+ logout_button = builder.get_object("logout_button") as Gtk.Button;
+
+ publish_button.clicked.connect(on_publish_clicked);
+ logout_button.clicked.connect(on_logout_clicked);
+
+ align.reparent(box);
+ box.set_child_packing(align, true, true, 0, Gtk.PackType.START);
+ } catch (Error e) {
+ warning("Could not load UI: %s", e.message);
+ }
+ }
+
+ private void on_logout_clicked() {
+ logout();
+ }
+
+ private void on_publish_clicked() {
+ options.destination_album = album_list.get_active_text();
+
+ Gtk.CheckButton tmp = builder.get_object("hide_original_check") as Gtk.CheckButton;
+ options.hide_original = tmp.active;
+
+ tmp = builder.get_object("disable_comments_check") as Gtk.CheckButton;
+ options.disable_comments = tmp.active;
+
+ Gtk.ComboBoxText access_type = builder.get_object("access_type_list") as Gtk.ComboBoxText;
+ options.access_type = access_type.get_active_text();
+
+ publish();
+ }
+}
+
+private class Uploader: Publishing.RESTSupport.BatchUploader {
+ private weak PublishOptions options;
+
+ public Uploader(Session session, PublishOptions options, Spit.Publishing.Publishable[] photos) {
+ base(session, photos);
+
+ this.options = options;
+ }
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(Spit.Publishing.Publishable publishable) {
+ debug("create transaction");
+ return new UploadTransaction(((Session) get_session()), options, get_current_publishable());
+ }
+}
+
+private class UploadTransaction: Transaction {
+ public UploadTransaction(Session session, PublishOptions options, Spit.Publishing.Publishable photo) {
+ base.with_url(session, options.destination_album_url, Publishing.RESTSupport.HttpMethod.POST);
+
+ set_custom_payload("qwe", "image/jpeg", 1);
+
+ debug("Uploading '%s' -> %s : %s", photo.get_publishing_name(), options.destination_album, options.destination_album_url);
+
+ Soup.Multipart message_parts = new Soup.Multipart("multipart/form-data");
+ message_parts.append_form_string("title", photo.get_publishing_name());
+ message_parts.append_form_string("hide_original", options.hide_original.to_string());
+ message_parts.append_form_string("disable_comments", options.disable_comments.to_string());
+ message_parts.append_form_string("access", options.access_type.down());
+
+ string photo_data;
+ size_t data_length;
+
+ try {
+ FileUtils.get_contents(photo.get_serialized_file().get_path(), out photo_data, out data_length);
+ } catch (GLib.FileError e) {
+ critical("Failed to read data file '%s': %s", photo.get_serialized_file().get_path(), e.message);
+ }
+
+ int image_part_num = message_parts.get_length();
+
+ Soup.Buffer bindable_data = new Soup.Buffer(Soup.MemoryUse.COPY, photo_data.data[0:data_length]);
+ message_parts.append_form_file("", photo.get_serialized_file().get_path(), "image/jpeg", bindable_data);
+
+ unowned Soup.MessageHeaders image_part_header;
+ unowned Soup.Buffer image_part_body;
+ message_parts.get_part(image_part_num, out image_part_header, out image_part_body);
+
+ GLib.HashTable<string, string> result = new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
+ result.insert("name", "image");
+ result.insert("filename", "unused");
+
+ image_part_header.set_content_disposition("form-data", result);
+
+ Soup.Message outbound_message = soup_form_request_new_from_multipart(get_endpoint_url(), message_parts);
+ outbound_message.request_headers.append("Authorization", ("OAuth %s").printf(session.get_auth_token()));
+ outbound_message.request_headers.append("Connection", "close");
+ set_message(outbound_message);
+ }
+}
+
+public class YandexPublisher : Spit.Publishing.Publisher, GLib.Object {
+ private weak Spit.Publishing.PluginHost host = null;
+ private Spit.Publishing.ProgressCallback progress_reporter = null;
+ private weak Spit.Publishing.Service service = null;
+
+ private string service_url = null;
+
+ private Gee.HashMap<string, string> album_list = null;
+ private PublishOptions options;
+
+ private bool running = false;
+
+ private WebAuthPane web_auth_pane = null;
+
+ private Session session;
+
+ public YandexPublisher(Spit.Publishing.Service service, Spit.Publishing.PluginHost host) {
+ this.service = service;
+ this.host = host;
+ this.session = new Session();
+ this.album_list = new Gee.HashMap<string, string>();
+ this.options = new PublishOptions();
+ }
+
+ internal string? get_persistent_auth_token() {
+ return host.get_config_string("auth_token", null);
+ }
+
+ internal void set_persistent_auth_token(string auth_token) {
+ host.set_config_string("auth_token", auth_token);
+ }
+
+ internal void invalidate_persistent_session() {
+ host.unset_config_key("auth_token");
+ }
+
+ internal bool is_persistent_session_available() {
+ return (get_persistent_auth_token() != null);
+ }
+
+ public bool is_running() {
+ return running;
+ }
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+
+ private new string? check_response(Publishing.RESTSupport.XmlDocument doc) {
+ return null;
+ }
+
+ private void parse_album_entry(Xml.Node *e) throws Spit.Publishing.PublishingError {
+ string title = null;
+ string link = null;
+
+ for (Xml.Node* c = e->children ; c != null; c = c->next) {
+ if (c->name == "title")
+ title = c->get_content();
+
+ if ((c->name == "link") && (c->get_prop("rel") == "photos"))
+ link = c->get_prop("href");
+
+ if (title != null && link != null) {
+ debug("Added album: '%s', link: %s", title, link);
+ album_list.set(title, link);
+ title = null;
+ link = null;
+ break;
+ }
+ }
+ }
+
+ public void parse_album_creation(string data) throws Spit.Publishing.PublishingError {
+ Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string(data, check_response);
+ Xml.Node *root = doc.get_root_node();
+
+ parse_album_entry(root);
+ }
+
+ public void parse_album_list(string data) throws Spit.Publishing.PublishingError {
+ Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string(data, check_response);
+ Xml.Node *root = doc.get_root_node();
+
+ for (Xml.Node *e = root->children ; e != null; e = e->next) {
+ if (e->name != "entry")
+ continue;
+
+ parse_album_entry(e);
+ }
+ }
+
+ private void album_creation_error(Publishing.RESTSupport.Transaction t, Spit.Publishing.PublishingError err) {
+ t.completed.disconnect(album_creation_complete);
+ t.network_error.disconnect(album_creation_error);
+
+ warning("Album creation error: %s", err.message);
+ }
+
+ private void album_creation_complete(Publishing.RESTSupport.Transaction t) {
+ t.completed.disconnect(album_creation_complete);
+ t.network_error.disconnect(album_creation_error);
+
+ try {
+ parse_album_creation(t.get_response());
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ return;
+ }
+
+ if (album_list.get(options.destination_album) != null)
+ start_upload();
+ else
+ host.post_error(new Spit.Publishing.PublishingError.PROTOCOL_ERROR("Server did not create album"));
+ }
+
+ private void create_destination_album() {
+ string album = options.destination_album;
+ string data = "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:f=\"yandex:fotki\"><title>%s</title></entry>".printf(album);
+
+ Transaction t = new Transaction.with_url(session, service_url, Publishing.RESTSupport.HttpMethod.POST);
+
+ t.add_data("application/atom+xml; charset=utf-8; type=entry", data);
+
+ t.completed.connect(album_creation_complete);
+ t.network_error.connect(album_creation_error);
+
+ try {
+ t.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader, int num_published) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ if (num_published == 0)
+ host.post_error(new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(""));
+
+ host.set_service_locked(false);
+
+ host.install_success_pane();
+ }
+
+ private void on_upload_error(Publishing.RESTSupport.BatchUploader uploader, Spit.Publishing.PublishingError err) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ warning("Photo upload error: %s", err.message);
+ }
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void start_upload() {
+ host.set_service_locked(true);
+
+ progress_reporter = host.serialize_publishables(0);
+
+ options.destination_album_url = album_list.get(options.destination_album);
+ Spit.Publishing.Publishable[] publishables = host.get_publishables();
+ Uploader uploader = new Uploader(session, options, publishables);
+
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void on_logout() {
+ if (!is_running())
+ return;
+
+ session.deauthenticate();
+ invalidate_persistent_session();
+
+ running = false;
+
+ start();
+ }
+
+ private void on_publish() {
+ debug("Going to publish to '%s' : %s", options.destination_album, album_list.get(options.destination_album));
+ if (album_list.get(options.destination_album) == null)
+ create_destination_album();
+ else
+ start_upload();
+ }
+
+ public void service_get_album_list_error(Publishing.RESTSupport.Transaction t, Spit.Publishing.PublishingError err) {
+ t.completed.disconnect(service_get_album_list_complete);
+ t.network_error.disconnect(service_get_album_list_error);
+
+ invalidate_persistent_session();
+ warning("Failed to get album list: %s", err.message);
+ }
+
+ public void service_get_album_list_complete(Publishing.RESTSupport.Transaction t) {
+ t.completed.disconnect(service_get_album_list_complete);
+ t.network_error.disconnect(service_get_album_list_error);
+
+ debug("service_get_album_list_complete: %s", t.get_response());
+ try {
+ parse_album_list(t.get_response());
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+
+ PublishingOptionsPane publishing_options_pane = new PublishingOptionsPane(options, album_list,
+ host);
+
+ publishing_options_pane.publish.connect(on_publish);
+ publishing_options_pane.logout.connect(on_logout);
+ host.install_dialog_pane(publishing_options_pane);
+ }
+
+ public void service_get_album_list(string url) {
+ service_url = url;
+
+ Transaction t = new Transaction.with_url(session, url);
+ t.completed.connect(service_get_album_list_complete);
+ t.network_error.connect(service_get_album_list_error);
+
+ try {
+ t.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ public void fetch_account_error(Publishing.RESTSupport.Transaction t, Spit.Publishing.PublishingError err) {
+ t.completed.disconnect(fetch_account_complete);
+ t.network_error.disconnect(fetch_account_error);
+
+ warning("Failed to fetch account info: %s", err.message);
+ }
+
+ public void fetch_account_complete(Publishing.RESTSupport.Transaction t) {
+ t.completed.disconnect(fetch_account_complete);
+ t.network_error.disconnect(fetch_account_error);
+
+ debug("account info: %s", t.get_response());
+ try {
+ Publishing.RESTSupport.XmlDocument doc = Publishing.RESTSupport.XmlDocument.parse_string(t.get_response(), check_response);
+ Xml.Node* root = doc.get_root_node();
+
+ for (Xml.Node* work = root->children ; work != null; work = work->next) {
+ if (work->name != "workspace")
+ continue;
+ for (Xml.Node* c = work->children ; c != null; c = c->next) {
+ if (c->name != "collection")
+ continue;
+
+ if (c->get_prop("id") == "album-list") {
+ string url = c->get_prop("href");
+
+ set_persistent_auth_token(session.get_auth_token());
+ service_get_album_list(url);
+ break;
+ }
+ }
+ }
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ public void fetch_account_information(string auth_token) {
+ session.set_auth_token(auth_token);
+
+ Transaction t = new Transaction.with_url(session, "http://api-fotki.yandex.ru/api/me/");
+ t.completed.connect(fetch_account_complete);
+ t.network_error.connect(fetch_account_error);
+
+ try {
+ t.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void web_auth_login_succeeded(string access_token) {
+ debug("login succeeded with token %s", access_token);
+
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ fetch_account_information(access_token);
+ }
+
+ private void web_auth_login_failed() {
+ debug("login failed");
+ }
+
+ private void start_web_auth() {
+ host.set_service_locked(false);
+
+ web_auth_pane = new WebAuthPane(("http://oauth.yandex.ru/authorize?client_id=%s&response_type=token").printf(client_id));
+ web_auth_pane.login_succeeded.connect(web_auth_login_succeeded);
+ web_auth_pane.login_failed.connect(web_auth_login_failed);
+
+ host.install_dialog_pane(web_auth_pane, Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+ }
+
+ private void show_welcome_page() {
+ host.install_welcome_pane(_("You are not currently logged into Yandex.Fotki."),
+ start_web_auth);
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ if (host == null)
+ error("YandexPublisher: start( ): can't start; this publisher is not restartable.");
+
+ debug("YandexPublisher: starting interaction.");
+
+ running = true;
+
+ if (is_persistent_session_available()) {
+ session.set_auth_token(get_persistent_auth_token());
+
+ fetch_account_information(get_persistent_auth_token());
+ } else {
+ show_welcome_page();
+ }
+ }
+
+ public void stop() {
+ debug("YandexPublisher: stop( ) invoked.");
+
+ host = null;
+ running = false;
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala b/plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala
new file mode 100644
index 0000000..c83acf1
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala
@@ -0,0 +1,42 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern const string _VERSION;
+
+private class ShotwellPublishingExtraServices : Object, Spit.Module {
+ private Spit.Pluggable[] pluggables = new Spit.Pluggable[0];
+
+ public ShotwellPublishingExtraServices(GLib.File module_file) {
+ pluggables += new YandexService();
+ pluggables += new TumblrService(module_file.get_parent());
+ }
+
+ public unowned string get_module_name() {
+ return _("Shotwell Extra Publishing Services");
+ }
+
+ public unowned string get_version() {
+ return _VERSION;
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.extras";
+ }
+
+ public unowned Spit.Pluggable[]? get_pluggables() {
+ return pluggables;
+ }
+}
+
+// This entry point is required for all SPIT modules.
+public Spit.Module? spit_entry_point(Spit.EntryPointParams *params) {
+ params->module_spit_interface = Spit.negotiate_interfaces(params->host_min_spit_interface,
+ params->host_max_spit_interface, Spit.CURRENT_INTERFACE);
+
+ return (params->module_spit_interface != Spit.UNSUPPORTED_INTERFACE)
+ ? new ShotwellPublishingExtraServices(params->module_file) : null;
+}
+
diff --git a/plugins/shotwell-publishing-extras/tumblr.png b/plugins/shotwell-publishing-extras/tumblr.png
new file mode 100644
index 0000000..d5bf02b
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/tumblr.png
Binary files differ
diff --git a/plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade b/plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade
new file mode 100644
index 0000000..9b43309
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkWindow" id="authentication_pane">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xscale">0.5</property>
+ <property name="yscale">0.5</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">30</property>
+ <property name="margin_right">30</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="message_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="field_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Email address</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">username_entry</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password_entry</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="username_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">Login</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade b/plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade
new file mode 100644
index 0000000..102e260
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="tumblr_pane">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">16</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="inner_wrapper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">40</property>
+ <child>
+ <object class="GtkLabel" id="upload_info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="no">You are logged into Tumblr as (name).
+
+(this label's string is populated and set inside the code,
+so changes made here will not display)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">16</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="visibility_and_size_grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">24</property>
+ <child>
+ <object class="GtkLabel" id="blog_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Blogs:</property>
+ <property name="use_underline">True</property>
+ <property name="justify">right</property>
+ <property name="mnemonic_widget">blog_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Photo _size:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">size_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="blog_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="size_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">18</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="spacing">48</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="use_action_appearance">False</property>
+ <property name="width_request">96</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">24</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="use_action_appearance">False</property>
+ <property name="width_request">96</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">24</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing-extras/yandex_publish_model.glade b/plugins/shotwell-publishing-extras/yandex_publish_model.glade
new file mode 100644
index 0000000..175bafd
--- /dev/null
+++ b/plugins/shotwell-publishing-extras/yandex_publish_model.glade
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="publish_options_window">
+ <child>
+ <object class="GtkAlignment" id="alignment">
+ <property name="visible">True</property>
+ <property name="xalign">0.30000001192092896</property>
+ <property name="xscale">0.10000000149011612</property>
+ <property name="yscale">0.10000000149011612</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="xalign">0.30000001192092896</property>
+ <property name="label" translatable="yes">_Albums (or write new):</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">album_list</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">6</property>
+ <property name="label" translatable="yes">Access _type:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">access_type_list</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="access_type_list">
+ <property name="visible">True</property>
+ <property name="model">liststore1</property>
+ <property name="active">0</property>
+ <property name="text_column">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_padding">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="album_list">
+ <property name="visible">True</property>
+ <property name="model">liststore2</property>
+ <property name="active">0</property>
+ <property name="text_column">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_padding">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="disable_comments_check">
+ <property name="label" translatable="yes">Disable _comments</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.30000001192092896</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="padding">2</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="hide_original_check">
+ <property name="label" translatable="yes">_Forbid downloading original photo</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.30000001192092896</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <property name="layout_style">spread</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">12</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Public</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Friends</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Private</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="liststore2">
+ <columns>
+ <!-- column-name gchararray1 -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/FacebookPublishing.vala b/plugins/shotwell-publishing/FacebookPublishing.vala
new file mode 100644
index 0000000..d3f5a0f
--- /dev/null
+++ b/plugins/shotwell-publishing/FacebookPublishing.vala
@@ -0,0 +1,1676 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class FacebookService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "facebook.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public FacebookService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.facebook";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Facebook";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Lucas Beeler";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Facebook.FacebookPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO |
+ Spit.Publishing.Publisher.MediaType.VIDEO);
+ }
+}
+
+namespace Publishing.Facebook {
+// global parameters for the Facebook publishing plugin -- don't touch these (unless you really,
+// truly, deep-down know what you're doing)
+public const string SERVICE_NAME = "facebook";
+internal const string USER_VISIBLE_NAME = "Facebook";
+internal const string APPLICATION_ID = "162702932093";
+internal const string DEFAULT_ALBUM_NAME = _("Shotwell Connect");
+internal const string SERVICE_WELCOME_MESSAGE =
+ _("You are not currently logged into Facebook.\n\nIf you don't yet have a Facebook account, you can create one during the login process. During login, Shotwell Connect may ask you for permission to upload photos and publish to your feed. These permissions are required for Shotwell Connect to function.");
+internal const string RESTART_ERROR_MESSAGE =
+ _("You have already logged in and out of Facebook during this Shotwell session.\nTo continue publishing to Facebook, quit and restart Shotwell, then try publishing again.");
+internal const string USER_AGENT = "Java/1.6.0_16";
+internal const int EXPIRED_SESSION_STATUS_CODE = 400;
+
+internal class Album {
+ public string name;
+ public string id;
+
+ public Album(string name, string id) {
+ this.name = name;
+ this.id = id;
+ }
+}
+
+internal enum Resolution {
+ STANDARD,
+ HIGH;
+
+ public string get_name() {
+ switch (this) {
+ case STANDARD:
+ return _("Standard (720 pixels)");
+
+ case HIGH:
+ return _("Large (2048 pixels)");
+
+ default:
+ error("Unknown resolution %s", this.to_string());
+ }
+ }
+
+ public int get_pixels() {
+ switch (this) {
+ case STANDARD:
+ return 720;
+
+ case HIGH:
+ return 2048;
+
+ default:
+ error("Unknown resolution %s", this.to_string());
+ }
+ }
+}
+
+internal class PublishingParameters {
+ public const int UNKNOWN_ALBUM = -1;
+
+ public bool strip_metadata;
+ public Album[] albums;
+ public int target_album;
+ public string? new_album_name; // the name of the new album being created during this
+ // publishing interaction or null if publishing to an existing
+ // album
+
+ public string? privacy_object; // a serialized JSON object encoding the privacy settings of the
+ // published resources
+ public Resolution resolution;
+
+ public PublishingParameters() {
+ this.albums = null;
+ this.privacy_object = null;
+ this.target_album = UNKNOWN_ALBUM;
+ this.new_album_name = null;
+ this.strip_metadata = false;
+ this.resolution = Resolution.HIGH;
+ }
+
+ public void add_album(string name, string id) {
+ if (albums == null)
+ albums = new Album[0];
+
+ Album new_album = new Album(name, id);
+ albums += new_album;
+ }
+
+ public void set_target_album_by_name(string? name) {
+ if (name == null) {
+ target_album = UNKNOWN_ALBUM;
+ return;
+ }
+
+ for (int i = 0; i < albums.length; i++) {
+
+ if (albums[i].name == name) {
+ target_album = i;
+ return;
+ }
+ }
+
+ target_album = UNKNOWN_ALBUM;
+ }
+
+ public string? get_target_album_name() {
+ if (albums == null || target_album == UNKNOWN_ALBUM)
+ return null;
+
+ return albums[target_album].name;
+ }
+
+ public string? get_target_album_id() {
+ if (albums == null || target_album == UNKNOWN_ALBUM)
+ return null;
+
+ return albums[target_album].id;
+ }
+}
+
+public class FacebookPublisher : Spit.Publishing.Publisher, GLib.Object {
+ private PublishingParameters publishing_params;
+ private weak Spit.Publishing.PluginHost host = null;
+ private WebAuthenticationPane web_auth_pane = null;
+ private Spit.Publishing.ProgressCallback progress_reporter = null;
+ private weak Spit.Publishing.Service service = null;
+ private bool running = false;
+ private GraphSession graph_session;
+ private PublishingOptionsPane? publishing_options_pane = null;
+ private Uploader? uploader = null;
+ private string? uid = null;
+ private string? username = null;
+
+ public FacebookPublisher(Spit.Publishing.Service service,
+ Spit.Publishing.PluginHost host) {
+ debug("FacebookPublisher instantiated.");
+
+ this.service = service;
+ this.host = host;
+
+ this.publishing_params = new PublishingParameters();
+
+ this.graph_session = new GraphSession();
+ graph_session.authenticated.connect(on_session_authenticated);
+ }
+
+ private bool is_persistent_session_valid() {
+ string? token = get_persistent_access_token();
+
+ if (token != null)
+ debug("existing Facebook session found in configuration database (access_token = %s).",
+ token);
+ else
+ debug("no existing Facebook session available.");
+
+ return token != null;
+ }
+
+ private string? get_persistent_access_token() {
+ return host.get_config_string("access_token", null);
+ }
+
+ private bool get_persistent_strip_metadata() {
+ return host.get_config_bool("strip_metadata", false);
+ }
+
+ private void set_persistent_access_token(string access_token) {
+ host.set_config_string("access_token", access_token);
+ }
+
+ private void set_persistent_strip_metadata(bool strip_metadata) {
+ host.set_config_bool("strip_metadata", strip_metadata);
+ }
+
+ // Part of the fix for #3232. These have to be
+ // public so the legacy options pane may use them.
+ public int get_persistent_default_size() {
+ return host.get_config_int("default_size", 0);
+ }
+
+ public void set_persistent_default_size(int size) {
+ host.set_config_int("default_size", size);
+ }
+
+ private void invalidate_persistent_session() {
+ debug("invalidating saved Facebook session.");
+
+ set_persistent_access_token("");
+ }
+
+ private void do_show_service_welcome_pane() {
+ debug("ACTION: showing service welcome pane.");
+
+ host.install_welcome_pane(SERVICE_WELCOME_MESSAGE, on_login_clicked);
+ host.set_service_locked(false);
+ }
+
+ private void do_test_connection_to_endpoint() {
+ debug("ACTION: testing connection to Facebook endpoint.");
+ host.set_service_locked(true);
+
+ host.install_static_message_pane(_("Testing connection to Facebook..."));
+
+ GraphMessage endpoint_test_message = graph_session.new_endpoint_test();
+ endpoint_test_message.completed.connect(on_endpoint_test_completed);
+ endpoint_test_message.failed.connect(on_endpoint_test_error);
+
+ graph_session.send_message(endpoint_test_message);
+ }
+
+ private void do_fetch_user_info() {
+ debug("ACTION: fetching user information.");
+
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ GraphMessage user_info_message = graph_session.new_query("/me");
+
+ user_info_message.completed.connect(on_fetch_user_info_completed);
+ user_info_message.failed.connect(on_fetch_user_info_error);
+
+ graph_session.send_message(user_info_message);
+ }
+
+ private void do_fetch_album_descriptions() {
+ debug("ACTION: fetching album list.");
+
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ GraphMessage albums_message = graph_session.new_query("/%s/albums".printf(uid));
+
+ albums_message.completed.connect(on_fetch_albums_completed);
+ albums_message.failed.connect(on_fetch_albums_error);
+
+ graph_session.send_message(albums_message);
+ }
+
+ private void do_extract_user_info_from_json(string json) {
+ debug("ACTION: extracting user info from JSON response.");
+
+ try {
+ Json.Parser parser = new Json.Parser();
+ parser.load_from_data(json);
+
+ Json.Node root = parser.get_root();
+ Json.Object response_object = root.get_object();
+ uid = response_object.get_string_member("id");
+ username = response_object.get_string_member("name");
+ } catch (Error error) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(error.message));
+ return;
+ }
+
+ on_user_info_extracted();
+ }
+
+ private void do_extract_albums_from_json(string json) {
+ debug("ACTION: extracting album info from JSON response.");
+
+ try {
+ Json.Parser parser = new Json.Parser();
+ parser.load_from_data(json);
+
+ Json.Node root = parser.get_root();
+ Json.Object response_object = root.get_object();
+ Json.Array album_list = response_object.get_array_member("data");
+
+ publishing_params.albums = new Album[0];
+
+ for (int i = 0; i < album_list.get_length(); i++) {
+ Json.Object current_album = album_list.get_object_element(i);
+ string album_id = current_album.get_string_member("id");
+ string album_name = current_album.get_string_member("name");
+
+ // Note that we are completely ignoring the "can_upload" flag in the list of albums
+ // that we pulled from facebook eariler -- effectively, we add every album to the
+ // publishing_params album list regardless of the value of its can_upload flag. In
+ // the future we may wish to make adding to the publishing_params album list
+ // conditional on the value of the can_upload flag being true
+ publishing_params.add_album(album_name, album_id);
+ }
+ } catch (Error error) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(error.message));
+ return;
+ }
+
+ on_albums_extracted();
+ }
+
+ private void do_create_new_album() {
+ debug("ACTION: creating a new album named \"%s\".\n", publishing_params.new_album_name);
+
+ host.set_service_locked(true);
+ host.install_static_message_pane(_("Creating album..."));
+
+ GraphMessage create_album_message = graph_session.new_create_album(
+ publishing_params.new_album_name, publishing_params.privacy_object);
+
+ create_album_message.completed.connect(on_create_album_completed);
+ create_album_message.failed.connect(on_create_album_error);
+
+ graph_session.send_message(create_album_message);
+ }
+
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: showing publishing options pane.");
+
+ host.set_service_locked(false);
+ Gtk.Builder builder = new Gtk.Builder();
+
+ try {
+ // the trailing get_path() is required, since add_from_file can't cope
+ // with File objects directly and expects a pathname instead.
+ builder.add_from_file(
+ host.get_module_file().get_parent().
+ get_child("facebook_publishing_options_pane.glade").get_path());
+ } catch (Error e) {
+ warning("Could not parse UI file! Error: %s.", e.message);
+ host.post_error(
+ new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A file required for publishing is unavailable. Publishing to Facebook can't continue.")));
+ return;
+ }
+
+ publishing_options_pane = new PublishingOptionsPane(username, publishing_params.albums,
+ host.get_publishable_media_type(), this, builder, get_persistent_strip_metadata());
+ publishing_options_pane.logout.connect(on_publishing_options_pane_logout);
+ publishing_options_pane.publish.connect(on_publishing_options_pane_publish);
+ host.install_dialog_pane(publishing_options_pane,
+ Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+ }
+
+ private void do_logout() {
+ debug("ACTION: clearing persistent session information and restaring interaction.");
+
+ invalidate_persistent_session();
+
+ running = false;
+ start();
+ }
+
+ private void do_add_new_local_album_from_json(string album_name, string json) {
+ try {
+ Json.Parser parser = new Json.Parser();
+ parser.load_from_data(json);
+
+ Json.Node root = parser.get_root();
+ Json.Object response_object = root.get_object();
+ string album_id = response_object.get_string_member("id");
+
+ publishing_params.add_album(album_name, album_id);
+ } catch (Error error) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(error.message));
+ return;
+ }
+
+ publishing_params.set_target_album_by_name(album_name);
+ do_upload();
+ }
+
+ private void do_hosted_web_authentication() {
+ debug("ACTION: doing hosted web authentication.");
+
+ host.set_service_locked(false);
+
+ web_auth_pane = new WebAuthenticationPane();
+ web_auth_pane.login_succeeded.connect(on_web_auth_pane_login_succeeded);
+ web_auth_pane.login_failed.connect(on_web_auth_pane_login_failed);
+
+ host.install_dialog_pane(web_auth_pane,
+ Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+
+ }
+
+ private void do_authenticate_session(string good_login_uri) {
+ debug("ACTION: preparing to extract session information encoded in uri = '%s'",
+ good_login_uri);
+
+ // the raw uri is percent-encoded, so decode it
+ string decoded_uri = Soup.URI.decode(good_login_uri);
+
+ // locate the access token within the URI
+ string? access_token = null;
+ int index = decoded_uri.index_of("#access_token=");
+ if (index >= 0)
+ access_token = decoded_uri[index:decoded_uri.length];
+ if (access_token == null) {
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "Server redirect URL contained no access token"));
+ return;
+ }
+
+ // remove any trailing parameters from the session description string
+ string? trailing_params = null;
+ index = access_token.index_of_char('&');
+ if (index >= 0)
+ trailing_params = access_token[index:access_token.length];
+ if (trailing_params != null)
+ access_token = access_token.replace(trailing_params, "");
+
+ // remove the key from the session description string
+ access_token = access_token.replace("#access_token=", "");
+
+ // we've got an access token!
+ graph_session.authenticated.connect(on_session_authenticated);
+ graph_session.authenticate(access_token);
+ }
+
+ private void do_save_session_information() {
+ debug("ACTION: saving session information to configuration system.");
+
+ set_persistent_access_token(graph_session.get_access_token());
+ }
+
+ private void do_upload() {
+ debug("ACTION: uploading photos to album '%s'",
+ publishing_params.target_album == PublishingParameters.UNKNOWN_ALBUM ? "(none)" :
+ publishing_params.get_target_album_name());
+
+ host.set_service_locked(true);
+
+ progress_reporter = host.serialize_publishables(publishing_params.resolution.get_pixels(),
+ publishing_params.strip_metadata);
+
+ // Serialization is a long and potentially cancellable operation, so before we use
+ // the publishables, make sure that the publishing interaction is still running. If it
+ // isn't the publishing environment may be partially torn down so do a short-circuit
+ // return
+ if (!is_running())
+ return;
+
+ Spit.Publishing.Publishable[] publishables = host.get_publishables();
+ uploader = new Uploader(graph_session, publishing_params, publishables);
+
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void do_show_success_pane() {
+ debug("ACTION: showing success pane.");
+
+ host.set_service_locked(false);
+ host.install_success_pane();
+ }
+
+ private void on_generic_error(Spit.Publishing.PublishingError error) {
+ if (error is Spit.Publishing.PublishingError.EXPIRED_SESSION)
+ do_logout();
+ else
+ host.post_error(error);
+ }
+
+ private void on_login_clicked() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Login' on welcome pane.");
+
+ do_test_connection_to_endpoint();
+ }
+
+ private void on_endpoint_test_completed(GraphMessage message) {
+ message.completed.disconnect(on_endpoint_test_completed);
+ message.failed.disconnect(on_endpoint_test_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: endpoint test transaction detected that the Facebook endpoint is alive.");
+
+ do_hosted_web_authentication();
+ }
+
+ private void on_endpoint_test_error(GraphMessage message,
+ Spit.Publishing.PublishingError error) {
+ message.completed.disconnect(on_endpoint_test_completed);
+ message.failed.disconnect(on_endpoint_test_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: endpoint test transaction failed to detect a connection to the Facebook " +
+ "endpoint");
+
+ on_generic_error(error);
+ }
+
+ private void on_web_auth_pane_login_succeeded(string success_url) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: hosted web login succeeded.");
+
+ do_authenticate_session(success_url);
+ }
+
+
+
+ private void on_web_auth_pane_login_failed() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: hosted web login failed.");
+
+ // In this case, "failed" doesn't mean that the user didn't enter the right username and
+ // password -- Facebook handles that case inside the Facebook Connect web control. Instead,
+ // it means that no session was initiated in response to our login request. The only
+ // way this happens is if the user clicks the "Cancel" button that appears inside
+ // the web control. In this case, the correct behavior is to return the user to the
+ // service welcome pane so that they can start the web interaction again.
+ do_show_service_welcome_pane();
+ }
+
+ private void on_session_authenticated() {
+ graph_session.authenticated.disconnect(on_session_authenticated);
+
+ if (!is_running())
+ return;
+
+ assert(graph_session.is_authenticated());
+ debug("EVENT: an authenticated session has become available.");
+
+ do_save_session_information();
+ do_fetch_user_info();
+ }
+
+ private void on_fetch_user_info_completed(GraphMessage message) {
+ message.completed.disconnect(on_fetch_user_info_completed);
+ message.failed.disconnect(on_fetch_user_info_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user info fetch completed; response = '%s'.", message.get_response_body());
+
+ do_extract_user_info_from_json(message.get_response_body());
+ }
+
+ private void on_fetch_user_info_error(GraphMessage message,
+ Spit.Publishing.PublishingError error) {
+ message.completed.disconnect(on_fetch_user_info_completed);
+ message.failed.disconnect(on_fetch_user_info_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: fetching user info generated and error.");
+
+ on_generic_error(error);
+ }
+
+ private void on_user_info_extracted() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: user info extracted from JSON response: uid = %s; name = %s.", uid, username);
+
+ do_fetch_album_descriptions();
+ }
+
+ private void on_fetch_albums_completed(GraphMessage message) {
+ message.completed.disconnect(on_fetch_albums_completed);
+ message.failed.disconnect(on_fetch_albums_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: album descriptions fetch transaction completed; response = '%s'.",
+ message.get_response_body());
+
+ do_extract_albums_from_json(message.get_response_body());
+ }
+
+ private void on_fetch_albums_error(GraphMessage message,
+ Spit.Publishing.PublishingError err) {
+ message.completed.disconnect(on_fetch_albums_completed);
+ message.failed.disconnect(on_fetch_albums_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: album description fetch attempt generated an error.");
+
+ on_generic_error(err);
+ }
+
+ private void on_albums_extracted() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: successfully extracted %d albums from JSON response",
+ publishing_params.albums.length);
+
+ do_show_publishing_options_pane();
+ }
+
+ private void on_publishing_options_pane_logout() {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Logout' in publishing options pane.");
+
+ do_logout();
+ }
+
+ private void on_publishing_options_pane_publish(string? target_album, string privacy_setting,
+ Resolution resolution, bool strip_metadata) {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Publish' in publishing options pane.");
+
+ publishing_params.strip_metadata = strip_metadata;
+ set_persistent_strip_metadata(strip_metadata);
+ publishing_params.resolution = resolution;
+ set_persistent_default_size(resolution);
+ publishing_params.privacy_object = privacy_setting;
+
+ if (target_album != null) {
+ // we are publishing at least one photo so we need the name of an album to which
+ // we'll upload the photo(s)
+ publishing_params.set_target_album_by_name(target_album);
+ if (publishing_params.target_album != PublishingParameters.UNKNOWN_ALBUM) {
+ do_upload();
+ } else {
+ publishing_params.new_album_name = target_album;
+ do_create_new_album();
+ }
+ } else {
+ // we're publishing only videos and we don't need an album name
+ do_upload();
+ }
+ }
+
+ private void on_create_album_completed(GraphMessage message) {
+ message.completed.disconnect(on_create_album_completed);
+ message.failed.disconnect(on_create_album_error);
+
+ assert(publishing_params.new_album_name != null);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: created new album resource on remote host; response body = %s.\n",
+ message.get_response_body());
+
+ do_add_new_local_album_from_json(publishing_params.new_album_name,
+ message.get_response_body());
+ }
+
+ private void on_create_album_error(GraphMessage message, Spit.Publishing.PublishingError err) {
+ message.completed.disconnect(on_create_album_completed);
+ message.failed.disconnect(on_create_album_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: attempt to create new album generated an error.");
+
+ on_generic_error(err);
+ }
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void on_upload_complete(Uploader uploader, int num_published) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload complete; %d items published.", num_published);
+
+ do_show_success_pane();
+ }
+
+ private void on_upload_error(Uploader uploader, Spit.Publishing.PublishingError err) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload error = '%s'.", err.message);
+
+ host.post_error(err);
+ }
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+
+ public string get_service_name() {
+ return SERVICE_NAME;
+ }
+
+ public string get_user_visible_name() {
+ return USER_VISIBLE_NAME;
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ debug("FacebookPublisher: starting interaction.");
+
+ running = true;
+
+ // reset all publishing parameters to their default values -- in case this start is
+ // actually a restart
+ publishing_params = new PublishingParameters();
+
+ // Do we have saved user credentials? If so, go ahead and authenticate the session
+ // with the saved credentials and proceed with the publishing interaction. Otherwise, show
+ // the Welcome pane
+ if (is_persistent_session_valid()) {
+ graph_session.authenticate(get_persistent_access_token());
+ } else {
+ if (WebAuthenticationPane.is_cache_dirty()) {
+ host.set_service_locked(false);
+ host.install_static_message_pane(RESTART_ERROR_MESSAGE,
+ Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+ } else {
+ do_show_service_welcome_pane();
+ }
+ }
+ }
+
+ public void stop() {
+ debug("FacebookPublisher: stop( ) invoked.");
+
+ if (graph_session != null)
+ graph_session.stop_transactions();
+
+ host = null;
+ running = false;
+ }
+
+ public bool is_running() {
+ return running;
+ }
+}
+
+internal class WebAuthenticationPane : Spit.Publishing.DialogPane, Object {
+ private WebKit.WebView webview = null;
+ private Gtk.Box pane_widget = null;
+ private Gtk.ScrolledWindow webview_frame = null;
+ private static bool cache_dirty = false;
+
+ public signal void login_succeeded(string success_url);
+ public signal void login_failed();
+
+ public WebAuthenticationPane() {
+ pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ webview_frame = new Gtk.ScrolledWindow(null, null);
+ webview_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN);
+ webview_frame.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+
+ webview = new WebKit.WebView();
+ webview.get_settings().enable_plugins = false;
+ webview.get_settings().enable_default_context_menu = false;
+
+ webview.load_finished.connect(on_page_load);
+ webview.load_started.connect(on_load_started);
+
+ webview_frame.add(webview);
+ pane_widget.pack_start(webview_frame, true, true, 0);
+ }
+
+ private class LocaleLookup {
+ public string prefix;
+ public string translation;
+ public string? exception_code;
+ public string? exception_translation;
+ public string? exception_code_2;
+ public string? exception_translation_2;
+
+ public LocaleLookup(string prefix, string translation, string? exception_code = null,
+ string? exception_translation = null, string? exception_code_2 = null,
+ string? exception_translation_2 = null) {
+ this.prefix = prefix;
+ this.translation = translation;
+ this.exception_code = exception_code;
+ this.exception_translation = exception_translation;
+ this.exception_code_2 = exception_code_2;
+ this.exception_translation_2 = exception_translation_2;
+ }
+
+ }
+
+ private LocaleLookup[] locale_lookup_table = {
+ new LocaleLookup( "es", "es-la", "ES", "es-es" ),
+ new LocaleLookup( "en", "en-gb", "US", "en-us" ),
+ new LocaleLookup( "fr", "fr-fr", "CA", "fr-ca" ),
+ new LocaleLookup( "pt", "pt-br", "PT", "pt-pt" ),
+ new LocaleLookup( "zh", "zh-cn", "HK", "zh-hk", "TW", "zh-tw" ),
+ new LocaleLookup( "af", "af-za" ),
+ new LocaleLookup( "ar", "ar-ar" ),
+ new LocaleLookup( "nb", "nb-no" ),
+ new LocaleLookup( "no", "nb-no" ),
+ new LocaleLookup( "id", "id-id" ),
+ new LocaleLookup( "ms", "ms-my" ),
+ new LocaleLookup( "ca", "ca-es" ),
+ new LocaleLookup( "cs", "cs-cz" ),
+ new LocaleLookup( "cy", "cy-gb" ),
+ new LocaleLookup( "da", "da-dk" ),
+ new LocaleLookup( "de", "de-de" ),
+ new LocaleLookup( "tl", "tl-ph" ),
+ new LocaleLookup( "ko", "ko-kr" ),
+ new LocaleLookup( "hr", "hr-hr" ),
+ new LocaleLookup( "it", "it-it" ),
+ new LocaleLookup( "lt", "lt-lt" ),
+ new LocaleLookup( "hu", "hu-hu" ),
+ new LocaleLookup( "nl", "nl-nl" ),
+ new LocaleLookup( "ja", "ja-jp" ),
+ new LocaleLookup( "nb", "nb-no" ),
+ new LocaleLookup( "no", "nb-no" ),
+ new LocaleLookup( "pl", "pl-pl" ),
+ new LocaleLookup( "ro", "ro-ro" ),
+ new LocaleLookup( "ru", "ru-ru" ),
+ new LocaleLookup( "sk", "sk-sk" ),
+ new LocaleLookup( "sl", "sl-si" ),
+ new LocaleLookup( "sv", "sv-se" ),
+ new LocaleLookup( "th", "th-th" ),
+ new LocaleLookup( "vi", "vi-vn" ),
+ new LocaleLookup( "tr", "tr-tr" ),
+ new LocaleLookup( "el", "el-gr" ),
+ new LocaleLookup( "bg", "bg-bg" ),
+ new LocaleLookup( "sr", "sr-rs" ),
+ new LocaleLookup( "he", "he-il" ),
+ new LocaleLookup( "hi", "hi-in" ),
+ new LocaleLookup( "bn", "bn-in" ),
+ new LocaleLookup( "pa", "pa-in" ),
+ new LocaleLookup( "ta", "ta-in" ),
+ new LocaleLookup( "te", "te-in" ),
+ new LocaleLookup( "ml", "ml-in" )
+ };
+
+ private string get_system_locale_as_facebook_locale() {
+ unowned string? raw_system_locale = Intl.setlocale(LocaleCategory.ALL, "");
+ if (raw_system_locale == null || raw_system_locale == "")
+ return "www";
+
+ string system_locale = raw_system_locale.split(".")[0];
+
+ foreach (LocaleLookup locale_lookup in locale_lookup_table) {
+ if (!system_locale.has_prefix(locale_lookup.prefix))
+ continue;
+
+ if (locale_lookup.exception_code != null) {
+ assert(locale_lookup.exception_translation != null);
+
+ if (system_locale.contains(locale_lookup.exception_code))
+ return locale_lookup.exception_translation;
+ }
+
+ if (locale_lookup.exception_code_2 != null) {
+ assert(locale_lookup.exception_translation_2 != null);
+
+ if (system_locale.contains(locale_lookup.exception_code_2))
+ return locale_lookup.exception_translation_2;
+ }
+
+ return locale_lookup.translation;
+ }
+
+ // default
+ return "www";
+ }
+
+ private string get_login_url() {
+ string facebook_locale = get_system_locale_as_facebook_locale();
+
+ return "https://%s.facebook.com/dialog/oauth?client_id=%s&redirect_uri=https://www.facebook.com/connect/login_success.html&scope=publish_actions,user_photos,user_videos&response_type=token".printf(facebook_locale, APPLICATION_ID);
+ }
+
+ private void on_page_load(WebKit.WebFrame origin_frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+
+ string loaded_url = origin_frame.get_uri().dup();
+
+ // strip parameters from the loaded url
+ if (loaded_url.contains("?")) {
+ int index = loaded_url.index_of_char('?');
+ string params = loaded_url[index:loaded_url.length];
+ loaded_url = loaded_url.replace(params, "");
+ }
+
+ // were we redirected to the facebook login success page?
+ if (loaded_url.contains("login_success")) {
+ cache_dirty = true;
+ login_succeeded(origin_frame.get_uri());
+ return;
+ }
+
+ // were we redirected to the login total failure page?
+ if (loaded_url.contains("login_failure")) {
+ login_failed();
+ return;
+ }
+ }
+
+ private void on_load_started(WebKit.WebFrame frame) {
+ pane_widget.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.WATCH));
+ }
+
+ public static bool is_cache_dirty() {
+ return cache_dirty;
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ webview.open(get_login_url());
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object {
+ private Gtk.Builder builder;
+ private Gtk.Box pane_widget = null;
+ private Gtk.RadioButton use_existing_radio = null;
+ private Gtk.RadioButton create_new_radio = null;
+ private Gtk.ComboBoxText existing_albums_combo = null;
+ private Gtk.ComboBoxText visibility_combo = null;
+ private Gtk.Entry new_album_entry = null;
+ private Gtk.CheckButton strip_metadata_check = null;
+ private Gtk.Button publish_button = null;
+ private Gtk.Button logout_button = null;
+ private Gtk.Label how_to_label = null;
+ private Album[] albums = null;
+ private FacebookPublisher publisher = null;
+ private PrivacyDescription[] privacy_descriptions;
+
+ private Resolution[] possible_resolutions;
+ private Gtk.ComboBoxText resolution_combo = null;
+
+ private Spit.Publishing.Publisher.MediaType media_type;
+
+ private const string HEADER_LABEL_TEXT = _("You are logged into Facebook as %s.\n\n");
+ private const string PHOTOS_LABEL_TEXT = _("Where would you like to publish the selected photos?");
+ private const string RESOLUTION_LABEL_TEXT = _("Upload _size:");
+ private const int CONTENT_GROUP_SPACING = 32;
+ private const int STANDARD_ACTION_BUTTON_WIDTH = 128;
+
+ public signal void logout();
+ public signal void publish(string? target_album, string privacy_setting,
+ Resolution target_resolution, bool strip_metadata);
+
+ private class PrivacyDescription {
+ public string description;
+ public string privacy_setting;
+
+ public PrivacyDescription(string description, string privacy_setting) {
+ this.description = description;
+ this.privacy_setting = privacy_setting;
+ }
+ }
+
+ public PublishingOptionsPane(string username, Album[] albums,
+ Spit.Publishing.Publisher.MediaType media_type, FacebookPublisher publisher,
+ Gtk.Builder builder, bool strip_metadata) {
+
+ this.builder = builder;
+ assert(builder != null);
+ assert(builder.get_objects().length() > 0);
+
+ this.albums = albums;
+ this.privacy_descriptions = create_privacy_descriptions();
+
+ this.possible_resolutions = create_resolution_list();
+ this.publisher = publisher;
+
+ // we'll need to know if the user is importing video or not when sorting out visibility.
+ this.media_type = media_type;
+
+ pane_widget = (Gtk.Box) builder.get_object("facebook_pane_box");
+ pane_widget.set_border_width(16);
+
+ use_existing_radio = (Gtk.RadioButton) this.builder.get_object("use_existing_radio");
+ create_new_radio = (Gtk.RadioButton) this.builder.get_object("create_new_radio");
+ existing_albums_combo = (Gtk.ComboBoxText) this.builder.get_object("existing_albums_combo");
+ visibility_combo = (Gtk.ComboBoxText) this.builder.get_object("visibility_combo");
+ publish_button = (Gtk.Button) this.builder.get_object("publish_button");
+ logout_button = (Gtk.Button) this.builder.get_object("logout_button");
+ new_album_entry = (Gtk.Entry) this.builder.get_object("new_album_entry");
+ resolution_combo = (Gtk.ComboBoxText) this.builder.get_object("resolution_combo");
+ how_to_label = (Gtk.Label) this.builder.get_object("how_to_label");
+ strip_metadata_check = (Gtk.CheckButton) this.builder.get_object("strip_metadata_check");
+
+ create_new_radio.clicked.connect(on_create_new_toggled);
+ use_existing_radio.clicked.connect(on_use_existing_toggled);
+
+ string label_text = HEADER_LABEL_TEXT.printf(username);
+ if ((media_type & Spit.Publishing.Publisher.MediaType.PHOTO) != 0)
+ label_text += PHOTOS_LABEL_TEXT;
+ how_to_label.set_label(label_text);
+ strip_metadata_check.set_active(strip_metadata);
+
+ setup_visibility_combo();
+ visibility_combo.set_active(0);
+
+ publish_button.clicked.connect(on_publish_button_clicked);
+ logout_button.clicked.connect(on_logout_button_clicked);
+
+ setup_resolution_combo();
+ resolution_combo.set_active(publisher.get_persistent_default_size());
+ resolution_combo.changed.connect(on_size_changed);
+
+ // Ticket #3175, part 2: make sure this widget starts out sensitive
+ // if it needs to by checking whether we're starting with a video
+ // or a new gallery.
+ visibility_combo.set_sensitive(
+ (create_new_radio != null && create_new_radio.active) ||
+ ((media_type & Spit.Publishing.Publisher.MediaType.VIDEO) != 0));
+
+ // if publishing only videos, disable all photo-specific controls
+ if (media_type == Spit.Publishing.Publisher.MediaType.VIDEO) {
+ strip_metadata_check.set_active(false);
+ strip_metadata_check.set_sensitive(false);
+ resolution_combo.set_sensitive(false);
+ use_existing_radio.set_sensitive(false);
+ create_new_radio.set_sensitive(false);
+ existing_albums_combo.set_sensitive(false);
+ new_album_entry.set_sensitive(false);
+ }
+ }
+
+ private bool publishing_photos() {
+ return (media_type & Spit.Publishing.Publisher.MediaType.PHOTO) != 0;
+ }
+
+ private void setup_visibility_combo() {
+ foreach (PrivacyDescription p in privacy_descriptions)
+ visibility_combo.append_text(p.description);
+ }
+
+ private void setup_resolution_combo() {
+ foreach (Resolution res in possible_resolutions)
+ resolution_combo.append_text(res.get_name());
+ }
+
+ private void on_use_existing_toggled() {
+ if (use_existing_radio.active) {
+ existing_albums_combo.set_sensitive(true);
+ new_album_entry.set_sensitive(false);
+
+ // Ticket #3175 - if we're not adding a new gallery
+ // or a video, then we shouldn't be allowed tof
+ // choose visibility, since it has no effect.
+ visibility_combo.set_sensitive((media_type & Spit.Publishing.Publisher.MediaType.VIDEO) != 0);
+
+ existing_albums_combo.grab_focus();
+ }
+ }
+
+ private void on_create_new_toggled() {
+ if (create_new_radio.active) {
+ existing_albums_combo.set_sensitive(false);
+ new_album_entry.set_sensitive(true);
+ new_album_entry.grab_focus();
+
+ // Ticket #3175 - if we're creating a new gallery, make sure this is
+ // active, since it may have possibly been set inactive.
+ visibility_combo.set_sensitive(true);
+ }
+ }
+
+ private void on_size_changed() {
+ publisher.set_persistent_default_size(resolution_combo.get_active());
+ }
+
+ private void on_logout_button_clicked() {
+ logout();
+ }
+
+ private void on_publish_button_clicked() {
+ string album_name;
+ string privacy_setting = privacy_descriptions[visibility_combo.get_active()].privacy_setting;
+
+ Resolution resolution_setting;
+
+ if (publishing_photos()) {
+ resolution_setting = possible_resolutions[resolution_combo.get_active()];
+ if (use_existing_radio.active) {
+ album_name = existing_albums_combo.get_active_text();
+ } else {
+ album_name = new_album_entry.get_text();
+ }
+ } else {
+ resolution_setting = Resolution.STANDARD;
+ album_name = null;
+ }
+
+ publish(album_name, privacy_setting, resolution_setting, strip_metadata_check.get_active());
+ }
+
+ private PrivacyDescription[] create_privacy_descriptions() {
+ PrivacyDescription[] result = new PrivacyDescription[0];
+
+ result += new PrivacyDescription(_("Just me"), "{ 'value' : 'SELF' }");
+ result += new PrivacyDescription(_("Friends"), "{ 'value' : 'ALL_FRIENDS' }");
+ result += new PrivacyDescription(_("Everyone"), "{ 'value' : 'EVERYONE' }");
+
+ return result;
+ }
+
+ private Resolution[] create_resolution_list() {
+ Resolution[] result = new Resolution[0];
+
+ result += Resolution.STANDARD;
+ result += Resolution.HIGH;
+
+ return result;
+ }
+
+ public void installed() {
+ if (publishing_photos()) {
+ if (albums.length == 0) {
+ create_new_radio.set_active(true);
+ new_album_entry.set_text(DEFAULT_ALBUM_NAME);
+ existing_albums_combo.set_sensitive(false);
+ use_existing_radio.set_sensitive(false);
+ } else {
+ int default_album_seq_num = -1;
+ int ticker = 0;
+ foreach (Album album in albums) {
+ existing_albums_combo.append_text(album.name);
+ if (album.name == DEFAULT_ALBUM_NAME)
+ default_album_seq_num = ticker;
+ ticker++;
+ }
+ if (default_album_seq_num != -1) {
+ existing_albums_combo.set_active(default_album_seq_num);
+ use_existing_radio.set_active(true);
+ new_album_entry.set_sensitive(false);
+ }
+ else {
+ create_new_radio.set_active(true);
+ existing_albums_combo.set_active(0);
+ existing_albums_combo.set_sensitive(false);
+ new_album_entry.set_text(DEFAULT_ALBUM_NAME);
+ }
+ }
+ }
+
+ publish_button.grab_focus();
+ }
+
+ private void notify_logout() {
+ logout();
+ }
+
+ private void notify_publish(string? target_album, string privacy_setting, Resolution target_resolution) {
+ publish(target_album, privacy_setting, target_resolution, strip_metadata_check.get_active());
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ logout.connect(notify_logout);
+ publish.connect(notify_publish);
+
+ installed();
+ }
+
+ public void on_pane_uninstalled() {
+ logout.disconnect(notify_logout);
+ publish.disconnect(notify_publish);
+ }
+}
+
+internal enum Endpoint {
+ DEFAULT,
+ VIDEO,
+ TEST_CONNECTION;
+
+ public string to_uri() {
+ switch (this) {
+ case DEFAULT:
+ return "https://graph.facebook.com/";
+
+ case VIDEO:
+ return "https://graph-video.facebook.com/";
+
+ case TEST_CONNECTION:
+ return "https://www.facebook.com/";
+
+ default:
+ assert_not_reached();
+ }
+ }
+}
+
+internal abstract class GraphMessage {
+ public signal void completed();
+ public signal void failed(Spit.Publishing.PublishingError err);
+ public signal void data_transmitted(int bytes_sent_so_far, int total_bytes);
+
+ public abstract string get_uri();
+ public abstract string get_response_body();
+}
+
+internal class GraphSession {
+ private abstract class GraphMessageImpl : GraphMessage {
+ public Publishing.RESTSupport.HttpMethod method;
+ public string uri;
+ public string access_token;
+ public Soup.Message soup_message;
+ public weak GraphSession host_session;
+ public int bytes_so_far;
+
+ public GraphMessageImpl(GraphSession host_session, Publishing.RESTSupport.HttpMethod method,
+ string relative_uri, string access_token, Endpoint endpoint = Endpoint.DEFAULT) {
+ this.method = method;
+ this.access_token = access_token;
+ this.host_session = host_session;
+ this.bytes_so_far = 0;
+
+ string endpoint_uri = endpoint.to_uri();
+ try {
+ Regex starting_slashes = new Regex("^/+");
+ this.uri = endpoint_uri + starting_slashes.replace(relative_uri, -1, 0, "");
+ } catch (RegexError err) {
+ assert_not_reached();
+ }
+ }
+
+ public virtual bool prepare_for_transmission() {
+ return true;
+ }
+
+ public override string get_uri() {
+ return uri;
+ }
+
+ public override string get_response_body() {
+ return (string) soup_message.response_body.data;
+ }
+
+ public void on_wrote_body_data(Soup.Buffer chunk) {
+ bytes_so_far += (int) chunk.length;
+
+ data_transmitted(bytes_so_far, (int) soup_message.request_body.length);
+ }
+ }
+
+ private class GraphQueryMessage : GraphMessageImpl {
+ public GraphQueryMessage(GraphSession host_session, string relative_uri,
+ string access_token) {
+ base(host_session, Publishing.RESTSupport.HttpMethod.GET, relative_uri, access_token);
+
+ Soup.URI destination_uri = new Soup.URI(uri + "?access_token=" + access_token);
+ soup_message = new Soup.Message.from_uri(method.to_string(), destination_uri);
+ soup_message.wrote_body_data.connect(on_wrote_body_data);
+ }
+ }
+
+ private class GraphEndpointProbeMessage : GraphMessageImpl {
+ public GraphEndpointProbeMessage(GraphSession host_session) {
+ base(host_session, Publishing.RESTSupport.HttpMethod.GET, "/", "",
+ Endpoint.TEST_CONNECTION);
+
+ soup_message = new Soup.Message.from_uri(method.to_string(), new Soup.URI(uri));
+ soup_message.wrote_body_data.connect(on_wrote_body_data);
+ }
+ }
+
+ private class GraphUploadMessage : GraphMessageImpl {
+ private MappedFile mapped_file = null;
+ private Spit.Publishing.Publishable publishable;
+
+ public GraphUploadMessage(GraphSession host_session, string access_token,
+ string relative_uri, Spit.Publishing.Publishable publishable,
+ bool suppress_titling, string? resource_privacy = null) {
+ base(host_session, Publishing.RESTSupport.HttpMethod.POST, relative_uri, access_token,
+ (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO) ?
+ Endpoint.VIDEO : Endpoint.DEFAULT);
+
+ // Video uploads require a privacy string at the per-resource level. Since they aren't
+ // placed in albums, they can't inherit their privacy settings from their containing
+ // album like photos do
+ assert(publishable.get_media_type() != Spit.Publishing.Publisher.MediaType.VIDEO ||
+ resource_privacy != null);
+
+ this.publishable = publishable;
+
+ // attempt to map the binary payload from disk into memory
+ try {
+ this.mapped_file = new MappedFile(publishable.get_serialized_file().get_path(),
+ false);
+ } catch (FileError e) {
+ return;
+ }
+
+ this.soup_message = new Soup.Message.from_uri(method.to_string(), new Soup.URI(uri));
+ soup_message.wrote_body_data.connect(on_wrote_body_data);
+
+ unowned uint8[] payload = (uint8[]) mapped_file.get_contents();
+ payload.length = (int) mapped_file.get_length();
+
+ Soup.Buffer image_data = new Soup.Buffer(Soup.MemoryUse.TEMPORARY, payload);
+
+ Soup.Multipart mp_envelope = new Soup.Multipart("multipart/form-data");
+
+ mp_envelope.append_form_string("access_token", access_token);
+
+ if (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO)
+ mp_envelope.append_form_string("privacy", resource_privacy);
+
+ string publishable_title = publishable.get_publishing_name();
+ if (!suppress_titling && publishable_title != "")
+ mp_envelope.append_form_string("name", publishable_title);
+
+ string source_file_mime_type =
+ (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO) ?
+ "video" : "image/jpeg";
+ mp_envelope.append_form_file("source", publishable.get_serialized_file().get_basename(),
+ source_file_mime_type, image_data);
+
+ mp_envelope.to_message(soup_message.request_headers, soup_message.request_body);
+ }
+
+ public override bool prepare_for_transmission() {
+ if (mapped_file == null) {
+ failed(new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ "File %s is unavailable.".printf(publishable.get_serialized_file().get_path())));
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ private class GraphCreateAlbumMessage : GraphMessageImpl {
+ public GraphCreateAlbumMessage(GraphSession host_session, string access_token,
+ string album_name, string album_privacy) {
+ base(host_session, Publishing.RESTSupport.HttpMethod.POST, "/me/albums", access_token);
+
+ assert(album_privacy != null && album_privacy != "");
+
+ this.soup_message = new Soup.Message.from_uri(method.to_string(), new Soup.URI(uri));
+
+ Soup.Multipart mp_envelope = new Soup.Multipart("multipart/form-data");
+
+ mp_envelope.append_form_string("access_token", access_token);
+ mp_envelope.append_form_string("name", album_name);
+ mp_envelope.append_form_string("privacy", album_privacy);
+
+ mp_envelope.to_message(soup_message.request_headers, soup_message.request_body);
+ }
+ }
+
+ public signal void authenticated();
+
+ private Soup.Session soup_session;
+ private string? access_token;
+ private GraphMessage? current_message;
+
+ public GraphSession() {
+ this.soup_session = new Soup.SessionAsync();
+ this.soup_session.request_unqueued.connect(on_request_unqueued);
+ this.soup_session.timeout = 15;
+ this.access_token = null;
+ this.current_message = null;
+ }
+
+ ~GraphSession() {
+ soup_session.request_unqueued.disconnect(on_request_unqueued);
+ }
+
+ private void manage_message(GraphMessage msg) {
+ assert(current_message == null);
+
+ current_message = msg;
+ }
+
+ private void unmanage_message(GraphMessage msg) {
+ assert(current_message != null);
+
+ current_message = null;
+ }
+
+ private void on_request_unqueued(Soup.Message msg) {
+ assert(current_message != null);
+ GraphMessageImpl real_message = (GraphMessageImpl) current_message;
+ assert(real_message.soup_message == msg);
+
+ // these error types are always recoverable given the unique behavior of the Facebook
+ // endpoint, so try again
+ if (msg.status_code == Soup.KnownStatusCode.IO_ERROR ||
+ msg.status_code == Soup.KnownStatusCode.MALFORMED ||
+ msg.status_code == Soup.KnownStatusCode.TRY_AGAIN) {
+ real_message.bytes_so_far = 0;
+ soup_session.queue_message(msg, null);
+ return;
+ }
+
+ unmanage_message(real_message);
+ msg.wrote_body_data.disconnect(real_message.on_wrote_body_data);
+
+ Spit.Publishing.PublishingError? error = null;
+ switch (msg.status_code) {
+ case Soup.KnownStatusCode.OK:
+ case Soup.KnownStatusCode.CREATED: // HTTP code 201 (CREATED) signals that a new
+ // resource was created in response to a PUT
+ // or POST
+ break;
+
+ case EXPIRED_SESSION_STATUS_CODE:
+ error = new Spit.Publishing.PublishingError.EXPIRED_SESSION(
+ "OAuth Access Token has Expired. Logout user.", real_message.get_uri(), msg.status_code);
+ break;
+
+ case Soup.KnownStatusCode.CANT_RESOLVE:
+ case Soup.KnownStatusCode.CANT_RESOLVE_PROXY:
+ error = new Spit.Publishing.PublishingError.NO_ANSWER(
+ "Unable to resolve %s (error code %u)", real_message.get_uri(), msg.status_code);
+ break;
+
+ case Soup.KnownStatusCode.CANT_CONNECT:
+ case Soup.KnownStatusCode.CANT_CONNECT_PROXY:
+ error = new Spit.Publishing.PublishingError.NO_ANSWER(
+ "Unable to connect to %s (error code %u)", real_message.get_uri(), msg.status_code);
+ break;
+
+ default:
+ // status codes below 100 are used by Soup, 100 and above are defined HTTP
+ // codes
+ if (msg.status_code >= 100) {
+ error = new Spit.Publishing.PublishingError.NO_ANSWER(
+ "Service %s returned HTTP status code %u %s", real_message.get_uri(),
+ msg.status_code, msg.reason_phrase);
+ } else {
+ error = new Spit.Publishing.PublishingError.NO_ANSWER(
+ "Failure communicating with %s (error code %u)", real_message.get_uri(),
+ msg.status_code);
+ }
+ break;
+ }
+
+ // All valid communication with Facebook involves body data in the response
+ if (error == null)
+ if (msg.response_body.data == null || msg.response_body.data.length == 0)
+ error = new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "No response data from %s", real_message.get_uri());
+
+ if (error == null)
+ real_message.completed();
+ else
+ real_message.failed(error);
+ }
+
+ public void authenticate(string access_token) {
+ this.access_token = access_token;
+ authenticated();
+ }
+
+ public bool is_authenticated() {
+ return access_token != null;
+ }
+
+ public string get_access_token() {
+ assert(is_authenticated());
+ return access_token;
+ }
+
+ public GraphMessage new_endpoint_test() {
+ return new GraphEndpointProbeMessage(this);
+ }
+
+ public GraphMessage new_query(string resource_path) {
+ return new GraphQueryMessage(this, resource_path, access_token);
+ }
+
+ public GraphMessage new_upload(string resource_path, Spit.Publishing.Publishable publishable,
+ bool suppress_titling, string? resource_privacy = null) {
+ return new GraphUploadMessage(this, access_token, resource_path, publishable,
+ suppress_titling, resource_privacy);
+ }
+
+ public GraphMessage new_create_album(string album_name, string privacy) {
+ return new GraphSession.GraphCreateAlbumMessage(this, access_token, album_name, privacy);
+ }
+
+ public void send_message(GraphMessage message) {
+ GraphMessageImpl real_message = (GraphMessageImpl) message;
+
+ debug("making HTTP request to URI: " + real_message.soup_message.uri.to_string(false));
+
+ if (real_message.prepare_for_transmission()) {
+ manage_message(message);
+ soup_session.queue_message(real_message.soup_message, null);
+ }
+ }
+
+ public void stop_transactions() {
+ soup_session.abort();
+ }
+}
+
+internal class Uploader {
+ private int current_file;
+ private Spit.Publishing.Publishable[] publishables;
+ private GraphSession session;
+ private PublishingParameters publishing_params;
+ private unowned Spit.Publishing.ProgressCallback? status_updated = null;
+
+ public signal void upload_complete(int num_photos_published);
+ public signal void upload_error(Spit.Publishing.PublishingError err);
+
+ public Uploader(GraphSession session, PublishingParameters publishing_params,
+ Spit.Publishing.Publishable[] publishables) {
+ this.current_file = 0;
+ this.publishables = publishables;
+ this.session = session;
+ this.publishing_params = publishing_params;
+ }
+
+ private void send_current_file() {
+ Spit.Publishing.Publishable publishable = publishables[current_file];
+ GLib.File? file = publishable.get_serialized_file();
+
+ // if the current publishable hasn't been serialized, then skip it
+ if (file == null) {
+ current_file++;
+ return;
+ }
+
+ string resource_uri =
+ (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.PHOTO) ?
+ "/%s/photos".printf(publishing_params.get_target_album_id()) : "/me/videos";
+ string? resource_privacy =
+ (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO) ?
+ publishing_params.privacy_object : null;
+ GraphMessage upload_message = session.new_upload(resource_uri, publishable,
+ publishing_params.strip_metadata, resource_privacy);
+
+ upload_message.data_transmitted.connect(on_chunk_transmitted);
+ upload_message.completed.connect(on_message_completed);
+ upload_message.failed.connect(on_message_failed);
+
+ session.send_message(upload_message);
+ }
+
+ private void send_files() {
+ current_file = 0;
+ send_current_file();
+ }
+
+ private void on_chunk_transmitted(int bytes_written_so_far, int total_bytes) {
+ double file_span = 1.0 / publishables.length;
+ double this_file_fraction_complete = ((double) bytes_written_so_far) / total_bytes;
+ double fraction_complete = (current_file * file_span) + (this_file_fraction_complete *
+ file_span);
+
+ if (status_updated != null)
+ status_updated(current_file + 1, fraction_complete);
+ }
+
+ private void on_message_completed(GraphMessage message) {
+ message.data_transmitted.disconnect(on_chunk_transmitted);
+ message.completed.disconnect(on_message_completed);
+ message.failed.disconnect(on_message_failed);
+
+ current_file++;
+ if (current_file < publishables.length) {
+ send_current_file();
+ } else {
+ upload_complete(current_file);
+ }
+ }
+
+ private void on_message_failed(GraphMessage message, Spit.Publishing.PublishingError error) {
+ message.data_transmitted.disconnect(on_chunk_transmitted);
+ message.completed.disconnect(on_message_completed);
+ message.failed.disconnect(on_message_failed);
+
+ upload_error(error);
+ }
+
+ public void upload(Spit.Publishing.ProgressCallback? status_updated = null) {
+ this.status_updated = status_updated;
+
+ if (publishables.length > 0)
+ send_files();
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-publishing/FlickrPublishing.vala b/plugins/shotwell-publishing/FlickrPublishing.vala
new file mode 100644
index 0000000..dc483cc
--- /dev/null
+++ b/plugins/shotwell-publishing/FlickrPublishing.vala
@@ -0,0 +1,1371 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern string hmac_sha1(string key, string message);
+
+public class FlickrService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "flickr.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public FlickrService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.flickr";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Flickr";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Lucas Beeler";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Flickr.FlickrPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO |
+ Spit.Publishing.Publisher.MediaType.VIDEO);
+ }
+}
+
+namespace Publishing.Flickr {
+
+internal const string SERVICE_NAME = "Flickr";
+internal const string SERVICE_WELCOME_MESSAGE =
+ _("You are not currently logged into Flickr.\n\nClick Login to log into Flickr in your Web browser. You will have to authorize Shotwell Connect to link to your Flickr account.");
+internal const string RESTART_ERROR_MESSAGE =
+ _("You have already logged in and out of Flickr during this Shotwell session.\nTo continue publishing to Flickr, quit and restart Shotwell, then try publishing again.");
+internal const string ENDPOINT_URL = "https://api.flickr.com/services/rest";
+internal const string API_KEY = "60dd96d4a2ad04888b09c9e18d82c26f";
+internal const string API_SECRET = "d0960565e03547c1";
+internal const int ORIGINAL_SIZE = -1;
+internal const string EXPIRED_SESSION_ERROR_CODE = "98";
+internal const string ENCODE_RFC_3986_EXTRA = "!*'();:@&=+$,/?%#[] \\";
+
+internal enum UserKind {
+ PRO,
+ FREE,
+}
+
+internal class VisibilitySpecification {
+ public int friends_level;
+ public int family_level;
+ public int everyone_level;
+
+ public VisibilitySpecification(int friends_level, int family_level, int everyone_level) {
+ this.friends_level = friends_level;
+ this.family_level = family_level;
+ this.everyone_level = everyone_level;
+ }
+}
+
+// not a struct because we want reference semantics
+internal class PublishingParameters {
+ public UserKind user_kind;
+ public int quota_free_mb;
+ public int photo_major_axis_size;
+ public string username;
+ public VisibilitySpecification visibility_specification;
+
+ public PublishingParameters() {
+ }
+}
+
+public class FlickrPublisher : Spit.Publishing.Publisher, GLib.Object {
+ private Spit.Publishing.Service service;
+ private Spit.Publishing.PluginHost host;
+ private Spit.Publishing.ProgressCallback progress_reporter = null;
+ private bool running = false;
+ private bool was_started = false;
+ private Session session = null;
+ private PublishingOptionsPane publishing_options_pane = null;
+
+ private PublishingParameters parameters = null;
+
+ public FlickrPublisher(Spit.Publishing.Service service,
+ Spit.Publishing.PluginHost host) {
+ debug("FlickrPublisher instantiated.");
+ this.service = service;
+ this.host = host;
+ this.session = new Session();
+ this.parameters = new PublishingParameters();
+
+ session.authenticated.connect(on_session_authenticated);
+ }
+
+ ~FlickrPublisher() {
+ session.authenticated.disconnect(on_session_authenticated);
+ }
+
+ private void invalidate_persistent_session() {
+ set_persistent_access_phase_token("");
+ set_persistent_access_phase_token_secret("");
+ set_persistent_access_phase_username("");
+ }
+
+ private bool is_persistent_session_valid() {
+ return (get_persistent_access_phase_username() != null &&
+ get_persistent_access_phase_token() != null &&
+ get_persistent_access_phase_token_secret() != null);
+ }
+
+ private string? get_persistent_access_phase_username() {
+ return host.get_config_string("access_phase_username", null);
+ }
+
+ private void set_persistent_access_phase_username(string username) {
+ host.set_config_string("access_phase_username", username);
+ }
+
+ private string? get_persistent_access_phase_token() {
+ return host.get_config_string("access_phase_token", null);
+ }
+
+ private void set_persistent_access_phase_token(string token) {
+ host.set_config_string("access_phase_token", token);
+ }
+
+ private string? get_persistent_access_phase_token_secret() {
+ return host.get_config_string("access_phase_token_secret", null);
+ }
+
+ private void set_persistent_access_phase_token_secret(string secret) {
+ host.set_config_string("access_phase_token_secret", secret);
+ }
+
+ private bool get_persistent_strip_metadata() {
+ return host.get_config_bool("strip_metadata", false);
+ }
+
+ private void set_persistent_strip_metadata(bool strip_metadata) {
+ host.set_config_bool("strip_metadata", strip_metadata);
+ }
+
+ private void on_welcome_pane_login_clicked() {
+ if (!running)
+ return;
+
+ debug("EVENT: user clicked 'Login' button in the welcome pane");
+
+ do_run_authentication_request_transaction();
+ }
+
+ private void on_auth_request_txn_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_auth_request_txn_completed);
+ txn.network_error.disconnect(on_auth_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: OAuth authentication request transaction completed; response = '%s'",
+ txn.get_response());
+
+ do_parse_token_info_from_auth_request(txn.get_response());
+ }
+
+ private void on_auth_request_txn_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_auth_request_txn_completed);
+ txn.network_error.disconnect(on_auth_request_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: OAuth authentication request transaction caused a network error");
+ host.post_error(err);
+ }
+
+ private void on_authentication_token_available(string token, string token_secret) {
+ debug("EVENT: OAuth authentication token (%s) and token secret (%s) available",
+ token, token_secret);
+
+ session.set_request_phase_credentials(token, token_secret);
+
+ do_launch_system_browser(token);
+ }
+
+ private void on_system_browser_launched() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: system browser launched.");
+
+ do_show_pin_entry_pane();
+ }
+
+ private void on_pin_entry_proceed(PinEntryPane sender, string pin) {
+ sender.proceed.disconnect(on_pin_entry_proceed);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Continue' in PIN entry pane.");
+
+ do_verify_pin(pin);
+ }
+
+ private void on_access_token_fetch_txn_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_access_token_fetch_txn_completed);
+ txn.network_error.disconnect(on_access_token_fetch_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: fetching OAuth access token over the network succeeded");
+
+ do_extract_access_phase_credentials_from_reponse(txn.get_response());
+ }
+
+ private void on_access_token_fetch_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_access_token_fetch_txn_completed);
+ txn.network_error.disconnect(on_access_token_fetch_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: fetching OAuth access token over the network caused an error.");
+
+ host.post_error(err);
+ }
+
+ private void on_session_authenticated() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: a fully authenticated session has become available");
+
+ parameters.username = session.get_username();
+
+ set_persistent_access_phase_token(session.get_access_phase_token());
+ set_persistent_access_phase_token_secret(session.get_access_phase_token_secret());
+ set_persistent_access_phase_username(session.get_username());
+
+ do_fetch_account_info();
+ }
+
+ private void on_account_fetch_txn_completed(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_account_fetch_txn_completed);
+ txn.network_error.disconnect(on_account_fetch_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: account fetch transaction response received over the network");
+ do_parse_account_info_from_xml(txn.get_response());
+ }
+
+ private void on_account_fetch_txn_error(Publishing.RESTSupport.Transaction txn,
+ Spit.Publishing.PublishingError err) {
+ txn.completed.disconnect(on_account_fetch_txn_completed);
+ txn.network_error.disconnect(on_account_fetch_txn_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: account fetch transaction caused a network error");
+ host.post_error(err);
+ }
+
+ private void on_account_info_available() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: account information has become available");
+ do_show_publishing_options_pane();
+ }
+
+ private void on_publishing_options_pane_publish(bool strip_metadata) {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked the 'Publish' button in the publishing options pane");
+ do_publish(strip_metadata);
+ }
+
+ private void on_publishing_options_pane_logout() {
+ publishing_options_pane.publish.disconnect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.disconnect(on_publishing_options_pane_logout);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked the 'Logout' button in the publishing options pane");
+
+ do_logout();
+ }
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader,
+ int num_published) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload complete; %d items published.", num_published);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ do_show_success_pane();
+ }
+
+ private void on_upload_error(Publishing.RESTSupport.BatchUploader uploader,
+ Spit.Publishing.PublishingError err) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload error = '%s'.", err.message);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ host.post_error(err);
+ }
+
+ private void do_show_login_welcome_pane() {
+ debug("ACTION: installing login welcome pane");
+
+ host.set_service_locked(false);
+ host.install_welcome_pane(SERVICE_WELCOME_MESSAGE, on_welcome_pane_login_clicked);
+ }
+
+ private void do_run_authentication_request_transaction() {
+ debug("ACTION: running authentication request transaction");
+
+ host.set_service_locked(true);
+ host.install_static_message_pane(_("Preparing for login..."));
+
+ AuthenticationRequestTransaction txn = new AuthenticationRequestTransaction(session);
+ txn.completed.connect(on_auth_request_txn_completed);
+ txn.network_error.connect(on_auth_request_txn_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_parse_token_info_from_auth_request(string response) {
+ debug("ACTION: parsing authorization request response '%s' into token and secret", response);
+
+ string? oauth_token = null;
+ string? oauth_token_secret = null;
+
+ string[] key_value_pairs = response.split("&");
+ foreach (string pair in key_value_pairs) {
+ string[] split_pair = pair.split("=");
+
+ if (split_pair.length != 2)
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "'%s' isn't a valid response to an OAuth authentication request"));
+
+ if (split_pair[0] == "oauth_token")
+ oauth_token = split_pair[1];
+ else if (split_pair[0] == "oauth_token_secret")
+ oauth_token_secret = split_pair[1];
+ }
+
+ if (oauth_token == null || oauth_token_secret == null)
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "'%s' isn't a valid response to an OAuth authentication request"));
+
+
+ on_authentication_token_available(oauth_token, oauth_token_secret);
+ }
+
+ private void do_launch_system_browser(string token) {
+ string login_uri = "https://www.flickr.com/services/oauth/authorize?oauth_token=" + token +
+ "&perms=write";
+
+ debug("ACTION: launching system browser with uri = '%s'", login_uri);
+
+ try {
+ Process.spawn_command_line_async("xdg-open " + login_uri);
+ } catch (SpawnError e) {
+ host.post_error(new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ "couldn't launch system web browser to complete Flickr login"));
+ return;
+ }
+
+ on_system_browser_launched();
+ }
+
+ private void do_show_pin_entry_pane() {
+ debug("ACTION: showing PIN entry pane");
+
+ Gtk.Builder builder = new Gtk.Builder();
+
+ try {
+ builder.add_from_file(host.get_module_file().get_parent().get_child("flickr_pin_entry_pane.glade").get_path());
+ } catch (Error e) {
+ warning("Could not parse UI file! Error: %s.", e.message);
+ host.post_error(
+ new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A file required for publishing is unavailable. Publishing to Flickr can't continue.")));
+ return;
+ }
+
+ PinEntryPane pin_entry_pane = new PinEntryPane(builder);
+ pin_entry_pane.proceed.connect(on_pin_entry_proceed);
+ host.install_dialog_pane(pin_entry_pane);
+ }
+
+ private void do_verify_pin(string pin) {
+ debug("ACTION: validating authorization PIN %s", pin);
+
+ host.set_service_locked(true);
+ host.install_static_message_pane(_("Verifying authorization..."));
+
+ AccessTokenFetchTransaction txn = new AccessTokenFetchTransaction(session, pin);
+ txn.completed.connect(on_access_token_fetch_txn_completed);
+ txn.network_error.connect(on_access_token_fetch_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_extract_access_phase_credentials_from_reponse(string response) {
+ debug("ACTION: extracting access phase credentials from '%s'", response);
+
+ string[] key_value_pairs = response.split("&");
+
+ string? token = null;
+ string? token_secret = null;
+ string? username = null;
+ foreach (string key_value_pair in key_value_pairs) {
+ string[] split_pair = key_value_pair.split("=");
+
+ if (split_pair.length != 2)
+ continue;
+
+ string key = split_pair[0];
+ string value = split_pair[1];
+
+ if (key == "oauth_token")
+ token = value;
+ else if (key == "oauth_token_secret")
+ token_secret = value;
+ else if (key == "username")
+ username = value;
+ }
+
+ debug("access phase credentials: { token = '%s'; token_secret = '%s'; username = '%s' }",
+ token, token_secret, username);
+
+ if (token == null || token_secret == null || username == null)
+ host.post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("expected " +
+ "access phase credentials to contain token, token secret, and username but at " +
+ "least one of these is absent"));
+
+ session.set_access_phase_credentials(token, token_secret, username);
+ }
+
+ private void do_fetch_account_info() {
+ debug("ACTION: running network transaction to fetch account information");
+
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ AccountInfoFetchTransaction txn = new AccountInfoFetchTransaction(session);
+ txn.completed.connect(on_account_fetch_txn_completed);
+ txn.network_error.connect(on_account_fetch_txn_error);
+
+ try {
+ txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ host.post_error(err);
+ }
+ }
+
+ private void do_parse_account_info_from_xml(string xml) {
+ debug("ACTION: parsing account information from xml = '%s'", xml);
+ try {
+ Publishing.RESTSupport.XmlDocument response_doc = Transaction.parse_flickr_response(xml);
+ Xml.Node* root_node = response_doc.get_root_node();
+
+ Xml.Node* user_node = response_doc.get_named_child(root_node, "user");
+
+ string is_pro_str = response_doc.get_property_value(user_node, "ispro");
+
+ Xml.Node* bandwidth_node = response_doc.get_named_child(user_node, "bandwidth");
+
+ string remaining_kb_str = response_doc.get_property_value(bandwidth_node, "remainingkb");
+
+ UserKind user_kind;
+ if (is_pro_str == "0")
+ user_kind = UserKind.FREE;
+ else if (is_pro_str == "1")
+ user_kind = UserKind.PRO;
+ else
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "Unable to determine if user has free or pro account");
+
+ int quota_mb_left = int.parse(remaining_kb_str) / 1024;
+
+ parameters.quota_free_mb = quota_mb_left;
+ parameters.user_kind = user_kind;
+
+ } catch (Spit.Publishing.PublishingError err) {
+ // expired session errors are recoverable, so handle it and then short-circuit return.
+ // don't call post_error( ) on the plug-in host because that's intended for
+ // unrecoverable errors and will halt publishing
+ if (err is Spit.Publishing.PublishingError.EXPIRED_SESSION) {
+ do_logout();
+ return;
+ }
+
+ host.post_error(err);
+ return;
+ }
+
+ on_account_info_available();
+ }
+
+ private void do_logout() {
+ debug("ACTION: logging user out, deauthenticating session, and erasing stored credentials");
+
+ session.deauthenticate();
+ invalidate_persistent_session();
+
+ running = false;
+
+ attempt_start();
+ }
+
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: displaying publishing options pane");
+
+ host.set_service_locked(false);
+
+ Gtk.Builder builder = new Gtk.Builder();
+
+ try {
+ // the trailing get_path() is required, since add_from_file can't cope
+ // with File objects directly and expects a pathname instead.
+ builder.add_from_file(
+ host.get_module_file().get_parent().
+ get_child("flickr_publishing_options_pane.glade").get_path());
+ } catch (Error e) {
+ warning("Could not parse UI file! Error: %s.", e.message);
+ host.post_error(
+ new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A file required for publishing is unavailable. Publishing to Flickr can't continue.")));
+ return;
+ }
+
+ publishing_options_pane = new PublishingOptionsPane(this, parameters,
+ host.get_publishable_media_type(), builder, get_persistent_strip_metadata());
+ publishing_options_pane.publish.connect(on_publishing_options_pane_publish);
+ publishing_options_pane.logout.connect(on_publishing_options_pane_logout);
+ host.install_dialog_pane(publishing_options_pane);
+ }
+
+ public static int flickr_date_time_compare_func(Spit.Publishing.Publishable a,
+ Spit.Publishing.Publishable b) {
+ return a.get_exposure_date_time().compare(b.get_exposure_date_time());
+ }
+
+ private void do_publish(bool strip_metadata) {
+ set_persistent_strip_metadata(strip_metadata);
+ debug("ACTION: uploading media items to remote server.");
+
+ host.set_service_locked(true);
+ progress_reporter = host.serialize_publishables(parameters.photo_major_axis_size, strip_metadata);
+
+ // Serialization is a long and potentially cancellable operation, so before we use
+ // the publishables, make sure that the publishing interaction is still running. If it
+ // isn't the publishing environment may be partially torn down so do a short-circuit
+ // return
+ if (!is_running())
+ return;
+
+ // Sort publishables in reverse-chronological order.
+ Spit.Publishing.Publishable[] publishables = host.get_publishables();
+ Gee.ArrayList<Spit.Publishing.Publishable> sorted_list =
+ new Gee.ArrayList<Spit.Publishing.Publishable>();
+ foreach (Spit.Publishing.Publishable p in publishables) {
+ sorted_list.add(p);
+ }
+ sorted_list.sort(flickr_date_time_compare_func);
+
+ Uploader uploader = new Uploader(session, sorted_list.to_array(), parameters, strip_metadata);
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void do_show_success_pane() {
+ debug("ACTION: showing success pane.");
+
+ host.set_service_locked(false);
+ host.install_success_pane();
+ }
+
+ internal int get_persistent_visibility() {
+ return host.get_config_int("visibility", 0);
+ }
+
+ internal void set_persistent_visibility(int vis) {
+ host.set_config_int("visibility", vis);
+ }
+
+ internal int get_persistent_default_size() {
+ return host.get_config_int("default_size", 1);
+ }
+
+ internal void set_persistent_default_size(int size) {
+ host.set_config_int("default_size", size);
+ }
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+
+ public bool is_running() {
+ return running;
+ }
+
+ // this helper doesn't check state, merely validates and authenticates the session and installs
+ // the proper panes
+ private void attempt_start() {
+ running = true;
+ was_started = true;
+
+ if (is_persistent_session_valid()) {
+ debug("attempt start: a persistent session is available; using it");
+
+ session.authenticate_from_persistent_credentials(get_persistent_access_phase_token(),
+ get_persistent_access_phase_token_secret(), get_persistent_access_phase_username());
+ } else {
+ debug("attempt start: no persistent session available; showing login welcome pane");
+
+ do_show_login_welcome_pane();
+ }
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ if (was_started)
+ error("FlickrPublisher: start( ): can't start; this publisher is not restartable.");
+
+ debug("FlickrPublisher: starting interaction.");
+
+ attempt_start();
+ }
+
+ public void stop() {
+ debug("FlickrPublisher: stop( ) invoked.");
+
+ if (session != null)
+ session.stop_transactions();
+
+ running = false;
+ }
+}
+
+internal class PinEntryPane : Spit.Publishing.DialogPane, GLib.Object {
+ private Gtk.Box pane_widget = null;
+ private Gtk.Button continue_button = null;
+ private Gtk.Entry pin_entry = null;
+ private Gtk.Label pin_entry_caption = null;
+ private Gtk.Label explanatory_text = null;
+ private Gtk.Builder builder = null;
+
+ public signal void proceed(PinEntryPane sender, string authorization_pin);
+
+ public PinEntryPane(Gtk.Builder builder) {
+ this.builder = builder;
+ assert(builder != null);
+ assert(builder.get_objects().length() > 0);
+
+ explanatory_text = builder.get_object("explanatory_text") as Gtk.Label;
+ pin_entry_caption = builder.get_object("pin_entry_caption") as Gtk.Label;
+ pin_entry = builder.get_object("pin_entry") as Gtk.Entry;
+ continue_button = builder.get_object("continue_button") as Gtk.Button;
+
+ pane_widget = builder.get_object("pane_widget") as Gtk.Box;
+
+ pane_widget.show_all();
+
+ on_pin_entry_contents_changed();
+ }
+
+ private void on_continue_clicked() {
+ proceed(this, pin_entry.get_text());
+ }
+
+ private void on_pin_entry_contents_changed() {
+ continue_button.set_sensitive(pin_entry.text_length > 0);
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ continue_button.clicked.connect(on_continue_clicked);
+ pin_entry.changed.connect(on_pin_entry_contents_changed);
+ }
+
+ public void on_pane_uninstalled() {
+ continue_button.clicked.disconnect(on_continue_clicked);
+ pin_entry.changed.disconnect(on_pin_entry_contents_changed);
+ }
+}
+
+internal class Transaction : Publishing.RESTSupport.Transaction {
+ public Transaction(Session session, Publishing.RESTSupport.HttpMethod method =
+ Publishing.RESTSupport.HttpMethod.POST) {
+ base(session, method);
+
+ add_argument("oauth_nonce", session.get_oauth_nonce());
+ add_argument("oauth_signature_method", "HMAC-SHA1");
+ add_argument("oauth_version", "1.0");
+ add_argument("oauth_callback", "oob");
+ add_argument("oauth_timestamp", session.get_oauth_timestamp());
+ add_argument("oauth_consumer_key", API_KEY);
+ }
+
+ public Transaction.with_uri(Session session, string uri,
+ Publishing.RESTSupport.HttpMethod method = Publishing.RESTSupport.HttpMethod.POST) {
+ base.with_endpoint_url(session, uri, method);
+
+ add_argument("oauth_nonce", session.get_oauth_nonce());
+ add_argument("oauth_signature_method", "HMAC-SHA1");
+ add_argument("oauth_version", "1.0");
+ add_argument("oauth_callback", "oob");
+ add_argument("oauth_timestamp", session.get_oauth_timestamp());
+ add_argument("oauth_consumer_key", API_KEY);
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ ((Session) get_parent_session()).sign_transaction(this);
+
+ base.execute();
+ }
+
+ public static string? validate_xml(Publishing.RESTSupport.XmlDocument doc) {
+ Xml.Node* root = doc.get_root_node();
+ string? status = root->get_prop("stat");
+
+ // treat malformed root as an error condition
+ if (status == null)
+ return "No status property in root node";
+
+ if (status == "ok")
+ return null;
+
+ Xml.Node* errcode;
+ try {
+ errcode = doc.get_named_child(root, "err");
+ } catch (Spit.Publishing.PublishingError err) {
+ return "No error code specified";
+ }
+
+ // this error format is mandatory, because the parse_flickr_response( ) expects error
+ // messages to be in this format. If you want to change the error reporting format, you
+ // need to modify parse_flickr_response( ) to parse the new format too.
+ return "%s (error code %s)".printf(errcode->get_prop("msg"), errcode->get_prop("code"));
+ }
+
+ // Flickr responses have a special flavor of expired session reporting. Expired sessions
+ // are reported as just another service error, so they have to be converted from
+ // service errors. Always use this wrapper function to parse Flickr response XML instead
+ // of the generic Publishing.RESTSupport.XmlDocument.parse_string( ) from the Yorba
+ // REST support classes. While using Publishing.RESTSupport.XmlDocument.parse_string( ) won't
+ // cause anything really bad to happen, it will make expired session errors unrecoverable,
+ // which is annoying for users.
+ public static Publishing.RESTSupport.XmlDocument parse_flickr_response(string xml)
+ throws Spit.Publishing.PublishingError {
+ Publishing.RESTSupport.XmlDocument? result = null;
+
+ try {
+ result = Publishing.RESTSupport.XmlDocument.parse_string(xml, validate_xml);
+ } catch (Spit.Publishing.PublishingError e) {
+ if (e.message.contains("(error code %s)".printf(EXPIRED_SESSION_ERROR_CODE))) {
+ throw new Spit.Publishing.PublishingError.EXPIRED_SESSION(e.message);
+ } else {
+ throw e;
+ }
+ }
+
+ return result;
+ }
+}
+
+internal class AuthenticationRequestTransaction : Transaction {
+ public AuthenticationRequestTransaction(Session session) {
+ base.with_uri(session, "https://www.flickr.com/services/oauth/request_token",
+ Publishing.RESTSupport.HttpMethod.GET);
+ }
+}
+
+internal class AccessTokenFetchTransaction : Transaction {
+ public AccessTokenFetchTransaction(Session session, string user_verifier) {
+ base.with_uri(session, "https://www.flickr.com/services/oauth/access_token",
+ Publishing.RESTSupport.HttpMethod.GET);
+ add_argument("oauth_verifier", user_verifier);
+ add_argument("oauth_token", session.get_request_phase_token());
+ }
+}
+
+internal class AccountInfoFetchTransaction : Transaction {
+ public AccountInfoFetchTransaction(Session session) {
+ base(session, Publishing.RESTSupport.HttpMethod.GET);
+ add_argument("method", "flickr.people.getUploadStatus");
+ add_argument("oauth_token", session.get_access_phase_token());
+ }
+}
+
+private class UploadTransaction : Publishing.RESTSupport.UploadTransaction {
+ private PublishingParameters parameters;
+ private Session session;
+ private Publishing.RESTSupport.Argument[] auth_header_fields;
+
+ public UploadTransaction(Session session, PublishingParameters parameters,
+ Spit.Publishing.Publishable publishable) {
+ base.with_endpoint_url(session, publishable, "https://api.flickr.com/services/upload");
+
+ this.parameters = parameters;
+ this.session = session;
+ this.auth_header_fields = new Publishing.RESTSupport.Argument[0];
+
+ add_authorization_header_field("oauth_nonce", session.get_oauth_nonce());
+ add_authorization_header_field("oauth_signature_method", "HMAC-SHA1");
+ add_authorization_header_field("oauth_version", "1.0");
+ add_authorization_header_field("oauth_callback", "oob");
+ add_authorization_header_field("oauth_timestamp", session.get_oauth_timestamp());
+ add_authorization_header_field("oauth_consumer_key", API_KEY);
+ add_authorization_header_field("oauth_token", session.get_access_phase_token());
+
+ add_argument("is_public", ("%d".printf(parameters.visibility_specification.everyone_level)));
+ add_argument("is_friend", ("%d".printf(parameters.visibility_specification.friends_level)));
+ add_argument("is_family", ("%d".printf(parameters.visibility_specification.family_level)));
+
+ GLib.HashTable<string, string> disposition_table =
+ new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
+ string? filename = publishable.get_publishing_name();
+ if (filename == null || filename == "")
+ filename = publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME);
+
+ /// TODO: This may need to be revisited to send the title separately; please see
+ /// http://www.flickr.com/services/api/upload.api.html for more details.
+ disposition_table.insert("filename", Soup.URI.encode(
+ publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME), null));
+
+ disposition_table.insert("name", "photo");
+
+ set_binary_disposition_table(disposition_table);
+ }
+
+ public void add_authorization_header_field(string key, string value) {
+ auth_header_fields += new Publishing.RESTSupport.Argument(key, value);
+ }
+
+ public Publishing.RESTSupport.Argument[] get_authorization_header_fields() {
+ return auth_header_fields;
+ }
+
+ public string get_authorization_header_string() {
+ string result = "OAuth ";
+
+ for (int i = 0; i < auth_header_fields.length; i++) {
+ result += auth_header_fields[i].key;
+ result += "=";
+ result += ("\"" + auth_header_fields[i].value + "\"");
+
+ if (i < auth_header_fields.length - 1)
+ result += ", ";
+ }
+
+ return result;
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ session.sign_transaction(this);
+
+ string authorization_header = get_authorization_header_string();
+
+ debug("executing upload transaction: authorization header string = '%s'",
+ authorization_header);
+ add_header("Authorization", authorization_header);
+
+ base.execute();
+ }
+}
+
+internal class Session : Publishing.RESTSupport.Session {
+ private string? request_phase_token = null;
+ private string? request_phase_token_secret = null;
+ private string? access_phase_token = null;
+ private string? access_phase_token_secret = null;
+ private string? username = null;
+
+ public Session() {
+ base(ENDPOINT_URL);
+ }
+
+ public override bool is_authenticated() {
+ return (access_phase_token != null && access_phase_token_secret != null &&
+ username != null);
+ }
+
+ public void authenticate_from_persistent_credentials(string token, string secret,
+ string username) {
+ this.access_phase_token = token;
+ this.access_phase_token_secret = secret;
+ this.username = username;
+
+ authenticated();
+ }
+
+ public void deauthenticate() {
+ access_phase_token = null;
+ access_phase_token_secret = null;
+ username = null;
+ }
+
+ public void sign_transaction(Publishing.RESTSupport.Transaction txn) {
+ string http_method = txn.get_method().to_string();
+
+ debug("signing transaction with parameters:");
+ debug("HTTP method = " + http_method);
+
+ Publishing.RESTSupport.Argument[] base_string_arguments = txn.get_arguments();
+
+ UploadTransaction? upload_txn = txn as UploadTransaction;
+ if (upload_txn != null) {
+ debug("this transaction is an UploadTransaction; including Authorization header " +
+ "fields in signature base string");
+
+ Publishing.RESTSupport.Argument[] auth_header_args =
+ upload_txn.get_authorization_header_fields();
+
+ foreach (Publishing.RESTSupport.Argument arg in auth_header_args)
+ base_string_arguments += arg;
+ }
+
+ Publishing.RESTSupport.Argument[] sorted_args =
+ Publishing.RESTSupport.Argument.sort(base_string_arguments);
+
+ string arguments_string = "";
+ for (int i = 0; i < sorted_args.length; i++) {
+ arguments_string += (sorted_args[i].key + "=" + sorted_args[i].value);
+ if (i < sorted_args.length - 1)
+ arguments_string += "&";
+ }
+
+ string? signing_key = null;
+ if (access_phase_token_secret != null) {
+ debug("access phase token secret available; using it as signing key");
+
+ signing_key = API_SECRET + "&" + access_phase_token_secret;
+ } else if (request_phase_token_secret != null) {
+ debug("request phase token secret available; using it as signing key");
+
+ signing_key = API_SECRET + "&" + request_phase_token_secret;
+ } else {
+ debug("neither access phase nor request phase token secrets available; using API " +
+ "key as signing key");
+
+ signing_key = API_SECRET + "&";
+ }
+
+ string signature_base_string = http_method + "&" + Soup.URI.encode(
+ txn.get_endpoint_url(), ENCODE_RFC_3986_EXTRA) + "&" +
+ Soup.URI.encode(arguments_string, ENCODE_RFC_3986_EXTRA);
+
+ debug("signature base string = '%s'", signature_base_string);
+
+ debug("signing key = '%s'", signing_key);
+
+ // compute the signature
+ string signature = hmac_sha1(signing_key, signature_base_string);
+ signature = Soup.URI.encode(signature, ENCODE_RFC_3986_EXTRA);
+
+ debug("signature = '%s'", signature);
+
+ if (upload_txn != null)
+ upload_txn.add_authorization_header_field("oauth_signature", signature);
+ else
+ txn.add_argument("oauth_signature", signature);
+ }
+
+ public void set_request_phase_credentials(string token, string secret) {
+ this.request_phase_token = token;
+ this.request_phase_token_secret = secret;
+ }
+
+ public void set_access_phase_credentials(string token, string secret, string username) {
+ this.access_phase_token = token;
+ this.access_phase_token_secret = secret;
+ this.username = username;
+
+ authenticated();
+ }
+
+ public string get_oauth_nonce() {
+ TimeVal currtime = TimeVal();
+ currtime.get_current_time();
+
+ return Checksum.compute_for_string(ChecksumType.MD5, currtime.tv_sec.to_string() +
+ currtime.tv_usec.to_string());
+ }
+
+ public string get_oauth_timestamp() {
+ return GLib.get_real_time().to_string().substring(0, 10);
+ }
+
+ public string get_request_phase_token() {
+ assert(request_phase_token != null);
+ return request_phase_token;
+ }
+
+ public string get_access_phase_token() {
+ assert(access_phase_token != null);
+ return access_phase_token;
+ }
+
+ public string get_access_phase_token_secret() {
+ assert(access_phase_token_secret != null);
+ return access_phase_token_secret;
+ }
+
+ public string get_username() {
+ assert(is_authenticated());
+ return username;
+ }
+}
+
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object {
+ private class SizeEntry {
+ public string title;
+ public int size;
+
+ public SizeEntry(string creator_title, int creator_size) {
+ title = creator_title;
+ size = creator_size;
+ }
+ }
+
+ private class VisibilityEntry {
+ public VisibilitySpecification specification;
+ public string title;
+
+ public VisibilityEntry(string creator_title, VisibilitySpecification creator_specification) {
+ specification = creator_specification;
+ title = creator_title;
+ }
+ }
+
+ private Gtk.Builder builder;
+ private Gtk.Box pane_widget = null;
+ private Gtk.Label visibility_label = null;
+ private Gtk.Label upload_info_label = null;
+ private Gtk.Label size_label = null;
+ private Gtk.Button logout_button = null;
+ private Gtk.Button publish_button = null;
+ private Gtk.ComboBoxText visibility_combo = null;
+ private Gtk.ComboBoxText size_combo = null;
+ private Gtk.CheckButton strip_metadata_check = null;
+ private VisibilityEntry[] visibilities = null;
+ private SizeEntry[] sizes = null;
+ private PublishingParameters parameters = null;
+ private FlickrPublisher publisher = null;
+ private Spit.Publishing.Publisher.MediaType media_type;
+
+ public signal void publish(bool strip_metadata);
+ public signal void logout();
+
+ public PublishingOptionsPane(FlickrPublisher publisher, PublishingParameters parameters,
+ Spit.Publishing.Publisher.MediaType media_type, Gtk.Builder builder, bool strip_metadata) {
+ this.builder = builder;
+ assert(builder != null);
+ assert(builder.get_objects().length() > 0);
+
+ // pull in the necessary widgets from the glade file
+ pane_widget = (Gtk.Box) this.builder.get_object("flickr_pane");
+ visibility_label = (Gtk.Label) this.builder.get_object("visibility_label");
+ upload_info_label = (Gtk.Label) this.builder.get_object("upload_info_label");
+ logout_button = (Gtk.Button) this.builder.get_object("logout_button");
+ publish_button = (Gtk.Button) this.builder.get_object("publish_button");
+ visibility_combo = (Gtk.ComboBoxText) this.builder.get_object("visibility_combo");
+ size_combo = (Gtk.ComboBoxText) this.builder.get_object("size_combo");
+ size_label = (Gtk.Label) this.builder.get_object("size_label");
+ strip_metadata_check = (Gtk.CheckButton) this.builder.get_object("strip_metadata_check");
+
+ this.parameters = parameters;
+ this.publisher = publisher;
+ this.media_type = media_type;
+
+ visibilities = create_visibilities();
+ sizes = create_sizes();
+
+ string upload_label_text = _("You are logged into Flickr as %s.\n\n").printf(parameters.username);
+ if (parameters.user_kind == UserKind.FREE) {
+ upload_label_text += _("Your free Flickr account limits how much data you can upload per month.\nThis month, you have %d megabytes remaining in your upload quota.").printf(parameters.quota_free_mb);
+ } else {
+ upload_label_text += _("Your Flickr Pro account entitles you to unlimited uploads.");
+ }
+
+ upload_info_label.set_label(upload_label_text);
+
+ string visibility_label_text = _("Photos _visible to:");
+ if ((media_type == Spit.Publishing.Publisher.MediaType.VIDEO)) {
+ visibility_label_text = _("Videos _visible to:");
+ } else if ((media_type == (Spit.Publishing.Publisher.MediaType.PHOTO |
+ Spit.Publishing.Publisher.MediaType.VIDEO))) {
+ visibility_label_text = _("Photos and videos _visible to:");
+ }
+
+ visibility_label.set_label(visibility_label_text);
+
+ populate_visibility_combo();
+ visibility_combo.changed.connect(on_visibility_changed);
+
+ if ((media_type != Spit.Publishing.Publisher.MediaType.VIDEO)) {
+ populate_size_combo();
+ size_combo.changed.connect(on_size_changed);
+ } else {
+ // publishing -only- video - don't let the user manipulate the photo size choices.
+ size_combo.set_sensitive(false);
+ size_label.set_sensitive(false);
+ }
+
+ strip_metadata_check.set_active(strip_metadata);
+
+ logout_button.clicked.connect(on_logout_clicked);
+ publish_button.clicked.connect(on_publish_clicked);
+ }
+
+ private void on_logout_clicked() {
+ logout();
+ }
+
+ private void on_publish_clicked() {
+ parameters.visibility_specification =
+ visibilities[visibility_combo.get_active()].specification;
+
+ if ((media_type & Spit.Publishing.Publisher.MediaType.PHOTO) != 0)
+ parameters.photo_major_axis_size = sizes[size_combo.get_active()].size;
+
+ publish(strip_metadata_check.get_active());
+ }
+
+ private VisibilityEntry[] create_visibilities() {
+ VisibilityEntry[] result = new VisibilityEntry[0];
+
+ result += new VisibilityEntry(_("Everyone"), new VisibilitySpecification(1, 1, 1));
+ result += new VisibilityEntry(_("Friends & family only"), new VisibilitySpecification(1, 1, 0));
+ result += new VisibilityEntry(_("Family only"), new VisibilitySpecification(0, 1, 0));
+ result += new VisibilityEntry(_("Friends only"), new VisibilitySpecification(1, 0, 0));
+ result += new VisibilityEntry(_("Just me"), new VisibilitySpecification(0, 0, 0));
+
+ return result;
+ }
+
+ private void populate_visibility_combo() {
+ if (visibilities == null)
+ visibilities = create_visibilities();
+
+ foreach (VisibilityEntry v in visibilities)
+ visibility_combo.append_text(v.title);
+
+ visibility_combo.set_active(publisher.get_persistent_visibility());
+ }
+
+ private SizeEntry[] create_sizes() {
+ SizeEntry[] result = new SizeEntry[0];
+
+ result += new SizeEntry(_("500 x 375 pixels"), 500);
+ result += new SizeEntry(_("1024 x 768 pixels"), 1024);
+ result += new SizeEntry(_("2048 x 1536 pixels"), 2048);
+ result += new SizeEntry(_("4096 x 3072 pixels"), 4096);
+ result += new SizeEntry(_("Original size"), ORIGINAL_SIZE);
+
+ return result;
+ }
+
+ private void populate_size_combo() {
+ if (sizes == null)
+ sizes = create_sizes();
+
+ foreach (SizeEntry e in sizes)
+ size_combo.append_text(e.title);
+
+ size_combo.set_active(publisher.get_persistent_default_size());
+ }
+
+ private void on_size_changed() {
+ publisher.set_persistent_default_size(size_combo.get_active());
+ }
+
+ private void on_visibility_changed() {
+ publisher.set_persistent_visibility(visibility_combo.get_active());
+ }
+
+ protected void notify_publish() {
+ publish(strip_metadata_check.get_active());
+ }
+
+ protected void notify_logout() {
+ logout();
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ publish.connect(notify_publish);
+ logout.connect(notify_logout);
+ }
+
+ public void on_pane_uninstalled() {
+ publish.disconnect(notify_publish);
+ logout.disconnect(notify_logout);
+ }
+}
+
+internal class Uploader : Publishing.RESTSupport.BatchUploader {
+ private PublishingParameters parameters;
+ private bool strip_metadata;
+
+ public Uploader(Session session, Spit.Publishing.Publishable[] publishables,
+ PublishingParameters parameters, bool strip_metadata) {
+ base(session, publishables);
+
+ this.parameters = parameters;
+ this.strip_metadata = strip_metadata;
+ }
+
+ private void preprocess_publishable(Spit.Publishing.Publishable publishable) {
+ if (publishable.get_media_type() != Spit.Publishing.Publisher.MediaType.PHOTO)
+ return;
+
+ GExiv2.Metadata publishable_metadata = new GExiv2.Metadata();
+ try {
+ publishable_metadata.open_path(publishable.get_serialized_file().get_path());
+ } catch (GLib.Error err) {
+ warning("couldn't read metadata from file '%s' for upload preprocessing.",
+ publishable.get_serialized_file().get_path());
+ }
+
+ // Flickr internationalization issues only affect IPTC tags; XMP, being an XML
+ // grammar and using standard XML internationalization mechanisms, doesn't need any i18n
+ // massaging before upload, so if the publishable doesn't have any IPTC metadata, then
+ // just do a short-circuit return
+ if (!publishable_metadata.has_iptc())
+ return;
+
+ if (publishable_metadata.has_tag("Iptc.Application2.Caption"))
+ publishable_metadata.set_tag_string("Iptc.Application2.Caption",
+ Publishing.RESTSupport.asciify_string(publishable_metadata.get_tag_string(
+ "Iptc.Application2.Caption")));
+
+ if (publishable_metadata.has_tag("Iptc.Application2.Headline"))
+ publishable_metadata.set_tag_string("Iptc.Application2.Headline",
+ Publishing.RESTSupport.asciify_string(publishable_metadata.get_tag_string(
+ "Iptc.Application2.Headline")));
+
+ if (publishable_metadata.has_tag("Iptc.Application2.Keywords")) {
+ Gee.Set<string> keyword_set = new Gee.HashSet<string>();
+ string[] iptc_keywords = publishable_metadata.get_tag_multiple("Iptc.Application2.Keywords");
+ if (iptc_keywords != null)
+ foreach (string keyword in iptc_keywords)
+ keyword_set.add(keyword);
+
+ string[] xmp_keywords = publishable_metadata.get_tag_multiple("Xmp.dc.subject");
+ if (xmp_keywords != null)
+ foreach (string keyword in xmp_keywords)
+ keyword_set.add(keyword);
+
+ string[] all_keywords = keyword_set.to_array();
+ // append a null pointer to the end of all_keywords -- this is a necessary workaround
+ // for http://trac.yorba.org/ticket/3264. See also http://trac.yorba.org/ticket/3257,
+ // which describes the user-visible behavior seen in the Flickr Connector as a result
+ // of the former bug.
+ all_keywords += null;
+
+ string[] no_keywords = new string[1];
+ // append a null pointer to the end of no_keywords -- this is a necessary workaround
+ // for http://trac.yorba.org/ticket/3264. See also http://trac.yorba.org/ticket/3257,
+ // which describes the user-visible behavior seen in the Flickr Connector as a result
+ // of the former bug.
+ no_keywords[0] = null;
+
+ publishable_metadata.set_tag_multiple("Xmp.dc.subject", all_keywords);
+ publishable_metadata.set_tag_multiple("Iptc.Application2.Keywords", no_keywords);
+
+ try {
+ publishable_metadata.save_file(publishable.get_serialized_file().get_path());
+ } catch (GLib.Error err) {
+ warning("couldn't write metadata to file '%s' for upload preprocessing.",
+ publishable.get_serialized_file().get_path());
+ }
+ }
+ }
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(
+ Spit.Publishing.Publishable publishable) {
+ preprocess_publishable(get_current_publishable());
+ return new UploadTransaction((Session) get_session(), parameters,
+ get_current_publishable());
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-publishing/Makefile b/plugins/shotwell-publishing/Makefile
new file mode 100644
index 0000000..639fa88
--- /dev/null
+++ b/plugins/shotwell-publishing/Makefile
@@ -0,0 +1,39 @@
+
+PLUGIN := shotwell-publishing
+
+PLUGIN_PKGS := \
+ gtk+-3.0 \
+ libsoup-2.4 \
+ libxml-2.0 \
+ webkitgtk-3.0 \
+ gexiv2 \
+ rest-0.7 \
+ gee-0.8 \
+ json-glib-1.0
+
+SRC_FILES := \
+ shotwell-publishing.vala \
+ FacebookPublishing.vala \
+ PicasaPublishing.vala \
+ FlickrPublishing.vala \
+ YouTubePublishing.vala \
+ PiwigoPublishing.vala \
+ ../../src/util/string.vala \
+ ../common/RESTSupport.vala
+
+RC_FILES := \
+ facebook.png \
+ facebook_publishing_options_pane.glade \
+ flickr.png \
+ flickr_publishing_options_pane.glade \
+ flickr_pin_entry_pane.glade \
+ picasa.png \
+ picasa_publishing_options_pane.glade \
+ piwigo.png \
+ piwigo_authentication_pane.glade \
+ piwigo_publishing_options_pane.glade \
+ youtube.png \
+ youtube_publishing_options_pane.glade
+
+include ../Makefile.plugin.mk
+
diff --git a/plugins/shotwell-publishing/PicasaPublishing.vala b/plugins/shotwell-publishing/PicasaPublishing.vala
new file mode 100644
index 0000000..c360e59
--- /dev/null
+++ b/plugins/shotwell-publishing/PicasaPublishing.vala
@@ -0,0 +1,940 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class PicasaService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "picasa.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public PicasaService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.picasa";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Picasa Web Albums";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Lucas Beeler";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Picasa.PicasaPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO |
+ Spit.Publishing.Publisher.MediaType.VIDEO);
+ }
+
+ public void activation(bool enabled) {
+ }
+}
+
+namespace Publishing.Picasa {
+
+internal const string SERVICE_WELCOME_MESSAGE =
+ _("You are not currently logged into Picasa Web Albums.\n\nClick Login to log into Picasa Web Albums in your Web browser. You will have to authorize Shotwell Connect to link to your Picasa Web Albums account.");
+internal const string DEFAULT_ALBUM_NAME = _("Shotwell Connect");
+
+public class PicasaPublisher : Publishing.RESTSupport.GooglePublisher {
+ private bool running;
+ private Spit.Publishing.ProgressCallback progress_reporter;
+ private PublishingParameters publishing_parameters;
+ private string? refresh_token;
+
+ public PicasaPublisher(Spit.Publishing.Service service,
+ Spit.Publishing.PluginHost host) {
+ base(service, host, "http://picasaweb.google.com/data/");
+
+ this.publishing_parameters = new PublishingParameters();
+ load_parameters_from_configuration_system(publishing_parameters);
+
+ Spit.Publishing.Publisher.MediaType media_type = Spit.Publishing.Publisher.MediaType.NONE;
+ foreach(Spit.Publishing.Publishable p in host.get_publishables())
+ media_type |= p.get_media_type();
+ publishing_parameters.set_media_type(media_type);
+
+ this.refresh_token = host.get_config_string("refresh_token", null);
+ this.progress_reporter = null;
+ }
+
+ private Album[] extract_albums_helper(Xml.Node* document_root)
+ throws Spit.Publishing.PublishingError {
+ Album[] result = new Album[0];
+
+ Xml.Node* doc_node_iter = null;
+ if (document_root->name == "feed")
+ doc_node_iter = document_root->children;
+ else if (document_root->name == "entry")
+ doc_node_iter = document_root;
+ else
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("response root node " +
+ "isn't a <feed> or <entry>");
+
+ for ( ; doc_node_iter != null; doc_node_iter = doc_node_iter->next) {
+ if (doc_node_iter->name != "entry")
+ continue;
+
+ string name_val = null;
+ string url_val = null;
+ Xml.Node* album_node_iter = doc_node_iter->children;
+ for ( ; album_node_iter != null; album_node_iter = album_node_iter->next) {
+ if (album_node_iter->name == "title") {
+ name_val = album_node_iter->get_content();
+ } else if (album_node_iter->name == "id") {
+ // we only want nodes in the default namespace -- the feed that we get back
+ // from Google also defines <entry> child nodes named <id> in the gphoto and
+ // media namespaces
+ if (album_node_iter->ns->prefix != null)
+ continue;
+ url_val = album_node_iter->get_content();
+ }
+ }
+
+ result += new Album(name_val, url_val);
+ }
+
+ return result;
+ }
+
+ private void load_parameters_from_configuration_system(PublishingParameters parameters) {
+ parameters.set_major_axis_size_selection_id(get_host().get_config_int("default-size", 0));
+ parameters.set_strip_metadata(get_host().get_config_bool("strip-metadata", false));
+ parameters.set_target_album_name(get_host().get_config_string("last-album", null));
+ }
+
+ private void save_parameters_to_configuration_system(PublishingParameters parameters) {
+ get_host().set_config_int("default-size", parameters.get_major_axis_size_selection_id());
+ get_host().set_config_bool("strip_metadata", parameters.get_strip_metadata());
+ get_host().set_config_string("last-album", parameters.get_target_album_name());
+ }
+
+ private void on_service_welcome_login() {
+ debug("EVENT: user clicked 'Login' in welcome pane.");
+
+ if (!is_running())
+ return;
+
+ start_oauth_flow(refresh_token);
+ }
+
+ protected override void on_login_flow_complete() {
+ debug("EVENT: OAuth login flow complete.");
+
+ get_host().set_config_string("refresh_token", get_session().get_refresh_token());
+
+ publishing_parameters.set_user_name(get_session().get_user_name());
+
+ do_fetch_account_information();
+ }
+
+ private void on_initial_album_fetch_complete(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_initial_album_fetch_complete);
+ txn.network_error.disconnect(on_initial_album_fetch_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: finished fetching account and album information.");
+
+ do_parse_and_display_account_information((AlbumDirectoryTransaction) txn);
+ }
+
+ private void on_initial_album_fetch_error(Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err) {
+ bad_txn.completed.disconnect(on_initial_album_fetch_complete);
+ bad_txn.network_error.disconnect(on_initial_album_fetch_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: fetching account and album information failed; response = '%s'.",
+ bad_txn.get_response());
+
+ if (bad_txn.get_status_code() == 403 || bad_txn.get_status_code() == 404) {
+ do_logout();
+ } else {
+ // If we get any other kind of error, we can't recover, so just post it to the user
+ get_host().post_error(err);
+ }
+ }
+
+ private void on_publishing_options_logout() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Logout' in the publishing options pane.");
+
+ do_logout();
+ }
+
+ private void on_publishing_options_publish() {
+ if (!is_running())
+ return;
+
+ debug("EVENT: user clicked 'Publish' in the publishing options pane.");
+
+ save_parameters_to_configuration_system(publishing_parameters);
+
+ if (publishing_parameters.is_to_new_album()) {
+ do_create_album();
+ } else {
+ do_upload();
+ }
+ }
+
+ private void on_album_creation_complete(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_album_creation_complete);
+ txn.network_error.disconnect(on_album_creation_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: finished creating album on remote server.");
+
+ AlbumCreationTransaction downcast_txn = (AlbumCreationTransaction) txn;
+ Publishing.RESTSupport.XmlDocument response_doc;
+ try {
+ response_doc = Publishing.RESTSupport.XmlDocument.parse_string(
+ downcast_txn.get_response(), AlbumDirectoryTransaction.validate_xml);
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ Album[] response_albums;
+ try {
+ response_albums = extract_albums_helper(response_doc.get_root_node());
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ if (response_albums.length != 1) {
+ get_host().post_error(new Spit.Publishing.PublishingError.MALFORMED_RESPONSE("album " +
+ "creation transaction responses must contain one and only one album directory " +
+ "entry"));
+ return;
+ }
+
+ publishing_parameters.set_target_album_entry_url(response_albums[0].url);
+
+ do_upload();
+ }
+
+ private void on_album_creation_error(Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err) {
+ bad_txn.completed.disconnect(on_album_creation_complete);
+ bad_txn.network_error.disconnect(on_album_creation_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: creating album on remote server failed; response = '%s'.",
+ bad_txn.get_response());
+
+ get_host().post_error(err);
+ }
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader,
+ int num_published) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload complete; %d items published.", num_published);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ do_show_success_pane();
+ }
+
+ private void on_upload_error(Publishing.RESTSupport.BatchUploader uploader,
+ Spit.Publishing.PublishingError err) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload error = '%s'.", err.message);
+
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ get_host().post_error(err);
+ }
+
+ private void do_show_service_welcome_pane() {
+ debug("ACTION: showing service welcome pane.");
+
+ get_host().install_welcome_pane(SERVICE_WELCOME_MESSAGE, on_service_welcome_login);
+ }
+
+ private void do_fetch_account_information() {
+ debug("ACTION: fetching account and album information.");
+
+ get_host().install_account_fetch_wait_pane();
+ get_host().set_service_locked(true);
+
+ AlbumDirectoryTransaction directory_trans =
+ new AlbumDirectoryTransaction(get_session());
+ directory_trans.network_error.connect(on_initial_album_fetch_error);
+ directory_trans.completed.connect(on_initial_album_fetch_complete);
+
+ try {
+ directory_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ // don't post the error here -- some errors are recoverable so let's let the error
+ // handler function sort out whether the error is recoverable or not. If the error
+ // isn't recoverable, the error handler will post the error to the host
+ on_initial_album_fetch_error(directory_trans, err);
+ }
+ }
+
+ private void do_parse_and_display_account_information(AlbumDirectoryTransaction transaction) {
+ debug("ACTION: parsing account and album information from server response XML");
+
+ Publishing.RESTSupport.XmlDocument response_doc;
+ try {
+ response_doc = Publishing.RESTSupport.XmlDocument.parse_string(
+ transaction.get_response(), AlbumDirectoryTransaction.validate_xml);
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ try {
+ publishing_parameters.set_albums(extract_albums_helper(response_doc.get_root_node()));
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ do_show_publishing_options_pane();
+ }
+
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: showing publishing options pane.");
+ Gtk.Builder builder = new Gtk.Builder();
+
+ try {
+ // the trailing get_path() is required, since add_from_file can't cope
+ // with File objects directly and expects a pathname instead.
+ builder.add_from_file(
+ get_host().get_module_file().get_parent().
+ get_child("picasa_publishing_options_pane.glade").get_path());
+ } catch (Error e) {
+ warning("Could not parse UI file! Error: %s.", e.message);
+ get_host().post_error(
+ new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A file required for publishing is unavailable. Publishing to Picasa can't continue.")));
+ return;
+ }
+
+ PublishingOptionsPane opts_pane = new PublishingOptionsPane(builder, publishing_parameters);
+ opts_pane.publish.connect(on_publishing_options_publish);
+ opts_pane.logout.connect(on_publishing_options_logout);
+ get_host().install_dialog_pane(opts_pane);
+
+ get_host().set_service_locked(false);
+ }
+
+ private void do_create_album() {
+ assert(publishing_parameters.is_to_new_album());
+
+ debug("ACTION: creating new album '%s' on remote server.",
+ publishing_parameters.get_target_album_name());
+
+ get_host().install_static_message_pane(_("Creating album..."));
+
+ get_host().set_service_locked(true);
+
+ AlbumCreationTransaction creation_trans = new AlbumCreationTransaction(get_session(),
+ publishing_parameters);
+ creation_trans.network_error.connect(on_album_creation_error);
+ creation_trans.completed.connect(on_album_creation_complete);
+ try {
+ creation_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ }
+ }
+
+ private void do_upload() {
+ debug("ACTION: uploading media items to remote server.");
+
+ get_host().set_service_locked(true);
+
+ progress_reporter = get_host().serialize_publishables(
+ publishing_parameters.get_major_axis_size_pixels(),
+ publishing_parameters.get_strip_metadata());
+
+ // Serialization is a long and potentially cancellable operation, so before we use
+ // the publishables, make sure that the publishing interaction is still running. If it
+ // isn't the publishing environment may be partially torn down so do a short-circuit
+ // return
+ if (!is_running())
+ return;
+
+ Spit.Publishing.Publishable[] publishables = get_host().get_publishables();
+ Uploader uploader = new Uploader(get_session(), publishables, publishing_parameters);
+
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void do_show_success_pane() {
+ debug("ACTION: showing success pane.");
+
+ get_host().set_service_locked(false);
+ get_host().install_success_pane();
+ }
+
+ protected override void do_logout() {
+ debug("ACTION: logging out user.");
+
+ get_session().deauthenticate();
+ refresh_token = null;
+ get_host().unset_config_key("refresh_token");
+
+
+ do_show_service_welcome_pane();
+ }
+
+ public override bool is_running() {
+ return running;
+ }
+
+ public override void start() {
+ debug("PicasaPublisher: start( ) invoked.");
+
+ if (is_running())
+ return;
+
+ running = true;
+
+ if (refresh_token == null)
+ do_show_service_welcome_pane();
+ else
+ start_oauth_flow(refresh_token);
+ }
+
+ public override void stop() {
+ debug("PicasaPublisher: stop( ) invoked.");
+
+ get_session().stop_transactions();
+
+ running = false;
+ }
+}
+
+internal class Album {
+ public string name;
+ public string url;
+
+ public Album(string name, string url) {
+ this.name = name;
+ this.url = url;
+ }
+}
+
+internal class AlbumDirectoryTransaction :
+ Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction {
+ private const string ENDPOINT_URL = "http://picasaweb.google.com/data/feed/api/user/" +
+ "default";
+
+ public AlbumDirectoryTransaction(Publishing.RESTSupport.GoogleSession session) {
+ base(session, ENDPOINT_URL, Publishing.RESTSupport.HttpMethod.GET);
+ }
+
+ public static string? validate_xml(Publishing.RESTSupport.XmlDocument doc) {
+ Xml.Node* document_root = doc.get_root_node();
+ if ((document_root->name == "feed") || (document_root->name == "entry"))
+ return null;
+ else
+ return "response root node isn't a <feed> or <entry>";
+ }
+}
+
+private class AlbumCreationTransaction :
+ Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction {
+ private const string ENDPOINT_URL = "http://picasaweb.google.com/data/feed/api/user/" +
+ "default";
+ private const string ALBUM_ENTRY_TEMPLATE = "<?xml version='1.0' encoding='utf-8'?><entry xmlns='http://www.w3.org/2005/Atom' xmlns:gphoto='http://schemas.google.com/photos/2007'><title type='text'>%s</title><gphoto:access>%s</gphoto:access><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#album'></category></entry>";
+
+ public AlbumCreationTransaction(Publishing.RESTSupport.GoogleSession session,
+ PublishingParameters parameters) {
+ base(session, ENDPOINT_URL, Publishing.RESTSupport.HttpMethod.POST);
+
+ string post_body = ALBUM_ENTRY_TEMPLATE.printf(Publishing.RESTSupport.decimal_entity_encode(
+ parameters.get_target_album_name()), parameters.is_new_album_public() ?
+ "public" : "private");
+
+ set_custom_payload(post_body, "application/atom+xml");
+ }
+}
+
+internal class UploadTransaction :
+ Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction {
+ private PublishingParameters parameters;
+ private const string METADATA_TEMPLATE = "<?xml version=\"1.0\" ?><atom:entry xmlns:atom='http://www.w3.org/2005/Atom' xmlns:mrss='http://search.yahoo.com/mrss/'> <atom:title>%s</atom:title> %s <atom:category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#photo'/> %s </atom:entry>";
+ private Publishing.RESTSupport.GoogleSession session;
+ private string mime_type;
+ private Spit.Publishing.Publishable publishable;
+ private MappedFile mapped_file;
+
+ public UploadTransaction(Publishing.RESTSupport.GoogleSession session,
+ PublishingParameters parameters, Spit.Publishing.Publishable publishable) {
+ base(session, parameters.get_target_album_feed_url(),
+ Publishing.RESTSupport.HttpMethod.POST);
+ assert(session.is_authenticated());
+ this.session = session;
+ this.parameters = parameters;
+ this.publishable = publishable;
+ this.mime_type = (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO) ?
+ "video/mpeg" : "image/jpeg";
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ // create the multipart request container
+ Soup.Multipart message_parts = new Soup.Multipart("multipart/related");
+
+ string summary = "";
+ if (publishable.get_publishing_name() != "") {
+ summary = "<atom:summary>%s</atom:summary>".printf(
+ Publishing.RESTSupport.decimal_entity_encode(publishable.get_publishing_name()));
+ }
+
+ string[] keywords = publishable.get_publishing_keywords();
+ string keywords_string = "";
+ if (keywords.length > 0) {
+ for (int i = 0; i < keywords.length; i++) {
+ string[] tmp;
+
+ if (keywords[i].has_prefix("/"))
+ tmp = keywords[i].substring(1).split("/");
+ else
+ tmp = keywords[i].split("/");
+
+ if (keywords_string.length > 0)
+ keywords_string = string.join(", ", keywords_string, string.joinv(", ", tmp));
+ else
+ keywords_string = string.joinv(", ", tmp);
+ }
+
+ keywords_string = Publishing.RESTSupport.decimal_entity_encode(keywords_string);
+ keywords_string = "<mrss:group><mrss:keywords>%s</mrss:keywords></mrss:group>".printf(keywords_string);
+ }
+
+ string metadata = METADATA_TEMPLATE.printf(Publishing.RESTSupport.decimal_entity_encode(
+ publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME)),
+ summary, keywords_string);
+ Soup.Buffer metadata_buffer = new Soup.Buffer(Soup.MemoryUse.COPY, metadata.data);
+ message_parts.append_form_file("", "", "application/atom+xml", metadata_buffer);
+
+ // attempt to map the binary image data from disk into memory
+ try {
+ mapped_file = new MappedFile(publishable.get_serialized_file().get_path(), false);
+ } catch (FileError e) {
+ string msg = "Picasa: couldn't read data from %s: %s".printf(
+ publishable.get_serialized_file().get_path(), e.message);
+ warning("%s", msg);
+
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(msg);
+ }
+ unowned uint8[] photo_data = (uint8[]) mapped_file.get_contents();
+ photo_data.length = (int) mapped_file.get_length();
+
+ // bind the binary image data read from disk into a Soup.Buffer object so that we
+ // can attach it to the multipart request, then actaully append the buffer
+ // to the multipart request. Then, set the MIME type for this part.
+ Soup.Buffer bindable_data = new Soup.Buffer(Soup.MemoryUse.TEMPORARY, photo_data);
+
+ message_parts.append_form_file("", publishable.get_serialized_file().get_path(), mime_type,
+ bindable_data);
+ // create a message that can be sent over the wire whose payload is the multipart container
+ // that we've been building up
+ Soup.Message outbound_message =
+ soup_form_request_new_from_multipart(get_endpoint_url(), message_parts);
+ outbound_message.request_headers.append("Authorization", "Bearer " +
+ session.get_access_token());
+ set_message(outbound_message);
+
+ // send the message and get its response
+ set_is_executed(true);
+ send();
+ }
+}
+
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object {
+ private class SizeDescription {
+ public string name;
+ public int major_axis_pixels;
+
+ public SizeDescription(string name, int major_axis_pixels) {
+ this.name = name;
+ this.major_axis_pixels = major_axis_pixels;
+ }
+ }
+
+ private const string DEFAULT_SIZE_CONFIG_KEY = "default_size";
+ private const string LAST_ALBUM_CONFIG_KEY = "last_album";
+
+ private Gtk.Builder builder = null;
+ private Gtk.Box pane_widget = null;
+ private Gtk.Label login_identity_label = null;
+ private Gtk.Label publish_to_label = null;
+ private Gtk.RadioButton use_existing_radio = null;
+ private Gtk.ComboBoxText existing_albums_combo = null;
+ private Gtk.RadioButton create_new_radio = null;
+ private Gtk.Entry new_album_entry = null;
+ private Gtk.CheckButton public_check = null;
+ private Gtk.ComboBoxText size_combo = null;
+ private Gtk.CheckButton strip_metadata_check = null;
+ private Gtk.Button publish_button = null;
+ private Gtk.Button logout_button = null;
+ private SizeDescription[] size_descriptions;
+ private PublishingParameters parameters;
+
+ public signal void publish();
+ public signal void logout();
+
+ public PublishingOptionsPane(Gtk.Builder builder, PublishingParameters parameters) {
+ size_descriptions = create_size_descriptions();
+
+ this.builder = builder;
+ assert(builder != null);
+ assert(builder.get_objects().length() > 0);
+
+ this.parameters = parameters;
+
+ // pull in all widgets from builder.
+ pane_widget = (Gtk.Box) builder.get_object("picasa_pane_widget");
+ login_identity_label = (Gtk.Label) builder.get_object("login_identity_label");
+ publish_to_label = (Gtk.Label) builder.get_object("publish_to_label");
+ use_existing_radio = (Gtk.RadioButton) builder.get_object("use_existing_radio");
+ existing_albums_combo = (Gtk.ComboBoxText) builder.get_object("existing_albums_combo");
+ create_new_radio = (Gtk.RadioButton) builder.get_object("create_new_radio");
+ new_album_entry = (Gtk.Entry) builder.get_object("new_album_entry");
+ public_check = (Gtk.CheckButton) builder.get_object("public_check");
+ size_combo = (Gtk.ComboBoxText) builder.get_object("size_combo");
+ strip_metadata_check = (Gtk.CheckButton) this.builder.get_object("strip_metadata_check");
+ publish_button = (Gtk.Button) builder.get_object("publish_button");
+ logout_button = (Gtk.Button) builder.get_object("logout_button");
+
+ // populate any widgets whose contents are programmatically-generated.
+ login_identity_label.set_label(_("You are logged into Picasa Web Albums as %s.").printf(
+ parameters.get_user_name()));
+ strip_metadata_check.set_active(parameters.get_strip_metadata());
+
+
+ if((parameters.get_media_type() & Spit.Publishing.Publisher.MediaType.PHOTO) == 0) {
+ publish_to_label.set_label(_("Videos will appear in:"));
+ size_combo.set_visible(false);
+ size_combo.set_sensitive(false);
+ }
+ else {
+ publish_to_label.set_label(_("Photos will appear in:"));
+ foreach(SizeDescription desc in size_descriptions) {
+ size_combo.append_text(desc.name);
+ }
+ size_combo.set_visible(true);
+ size_combo.set_sensitive(true);
+ size_combo.set_active(parameters.get_major_axis_size_selection_id());
+ }
+
+ // connect all signals.
+ use_existing_radio.clicked.connect(on_use_existing_radio_clicked);
+ create_new_radio.clicked.connect(on_create_new_radio_clicked);
+ new_album_entry.changed.connect(on_new_album_entry_changed);
+ logout_button.clicked.connect(on_logout_clicked);
+ publish_button.clicked.connect(on_publish_clicked);
+ }
+
+ private void on_publish_clicked() {
+ // size_combo won't have been set to anything useful if this is the first time we've
+ // published to Picasa, and/or we've only published video before, so it may be negative,
+ // indicating nothing was selected. Clamp it to a valid value...
+ int size_combo_last_active = (size_combo.get_active() >= 0) ? size_combo.get_active() : 0;
+
+ parameters.set_major_axis_size_selection_id(size_combo_last_active);
+ parameters.set_major_axis_size_pixels(
+ size_descriptions[size_combo_last_active].major_axis_pixels);
+ parameters.set_strip_metadata(strip_metadata_check.get_active());
+
+ Album[] albums = parameters.get_albums();
+
+ if (create_new_radio.get_active()) {
+ parameters.set_target_album_name(new_album_entry.get_text());
+ parameters.set_is_to_new_album(true);
+ parameters.set_is_new_album_public(public_check.get_active());
+ publish();
+ } else {
+ parameters.set_target_album_name(albums[existing_albums_combo.get_active()].name);
+ parameters.set_is_to_new_album(false);
+ parameters.set_target_album_entry_url(albums[existing_albums_combo.get_active()].url);
+ publish();
+ }
+ }
+
+ private void on_use_existing_radio_clicked() {
+ existing_albums_combo.set_sensitive(true);
+ new_album_entry.set_sensitive(false);
+ existing_albums_combo.grab_focus();
+ update_publish_button_sensitivity();
+ public_check.set_sensitive(false);
+ }
+
+ private void on_create_new_radio_clicked() {
+ new_album_entry.set_sensitive(true);
+ existing_albums_combo.set_sensitive(false);
+ new_album_entry.grab_focus();
+ update_publish_button_sensitivity();
+ public_check.set_sensitive(true);
+ }
+
+ private void on_logout_clicked() {
+ logout();
+ }
+
+ private void update_publish_button_sensitivity() {
+ string album_name = new_album_entry.get_text();
+ publish_button.set_sensitive(!(album_name.strip() == "" &&
+ create_new_radio.get_active()));
+ }
+
+ private void on_new_album_entry_changed() {
+ update_publish_button_sensitivity();
+ }
+
+ private SizeDescription[] create_size_descriptions() {
+ SizeDescription[] result = new SizeDescription[0];
+
+ result += new SizeDescription(_("Small (640 x 480 pixels)"), 640);
+ result += new SizeDescription(_("Medium (1024 x 768 pixels)"), 1024);
+ result += new SizeDescription(_("Recommended (1600 x 1200 pixels)"), 1600);
+ result += new SizeDescription(_("Google+ (2048 x 1536 pixels)"), 2048);
+ result += new SizeDescription(_("Original Size"), PublishingParameters.ORIGINAL_SIZE);
+
+ return result;
+ }
+
+ public void installed() {
+ int default_album_id = -1;
+ string last_album = parameters.get_target_album_name();
+
+ Album[] albums = parameters.get_albums();
+
+ for (int i = 0; i < albums.length; i++) {
+ existing_albums_combo.append_text(albums[i].name);
+ if (albums[i].name == last_album ||
+ (albums[i].name == DEFAULT_ALBUM_NAME && default_album_id == -1))
+ default_album_id = i;
+ }
+
+ if (albums.length == 0) {
+ existing_albums_combo.set_sensitive(false);
+ use_existing_radio.set_sensitive(false);
+ create_new_radio.set_active(true);
+ new_album_entry.grab_focus();
+ new_album_entry.set_text(DEFAULT_ALBUM_NAME);
+ } else {
+ if (default_album_id >= 0) {
+ use_existing_radio.set_active(true);
+ existing_albums_combo.set_active(default_album_id);
+ new_album_entry.set_sensitive(false);
+ public_check.set_sensitive(false);
+ } else {
+ create_new_radio.set_active(true);
+ existing_albums_combo.set_active(0);
+ new_album_entry.set_text(DEFAULT_ALBUM_NAME);
+ new_album_entry.grab_focus();
+ public_check.set_sensitive(true);
+ }
+ }
+ update_publish_button_sensitivity();
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ installed();
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+internal class PublishingParameters {
+ public const int ORIGINAL_SIZE = -1;
+
+ private string? target_album_name;
+ private string? target_album_url;
+ private bool album_public;
+ private bool strip_metadata;
+ private int major_axis_size_pixels;
+ private int major_axis_size_selection_id;
+ private string user_name;
+ private Album[] albums;
+ private Spit.Publishing.Publisher.MediaType media_type;
+ private bool to_new_album;
+
+ public PublishingParameters() {
+ this.user_name = "[unknown]";
+ this.target_album_name = null;
+ this.major_axis_size_selection_id = 0;
+ this.major_axis_size_pixels = ORIGINAL_SIZE;
+ this.target_album_url = null;
+ this.album_public = false;
+ this.albums = null;
+ this.strip_metadata = false;
+ this.media_type = Spit.Publishing.Publisher.MediaType.PHOTO;
+ this.to_new_album = true;
+ }
+
+ public bool is_to_new_album() {
+ return to_new_album;
+ }
+
+ public void set_is_to_new_album(bool to_new_album) {
+ this.to_new_album = to_new_album;
+ }
+
+ public void set_is_new_album_public(bool album_public) {
+ this.album_public = album_public;
+ }
+
+ public bool is_new_album_public() {
+ return album_public;
+ }
+
+ public string get_target_album_name() {
+ return target_album_name;
+ }
+
+ public void set_target_album_name(string target_album_name) {
+ this.target_album_name = target_album_name;
+ }
+
+ public void set_target_album_entry_url(string target_album_url) {
+ this.target_album_url = target_album_url;
+ }
+
+ public string get_target_album_entry_url() {
+ return target_album_url;
+ }
+
+ public string get_target_album_feed_url() {
+ string entry_url = get_target_album_entry_url();
+ string feed_url = entry_url.replace("entry", "feed");
+
+ return feed_url;
+ }
+
+ public string get_user_name() {
+ return user_name;
+ }
+
+ public void set_user_name(string user_name) {
+ this.user_name = user_name;
+ }
+
+ public Album[] get_albums() {
+ return albums;
+ }
+
+ public void set_albums(Album[] albums) {
+ this.albums = albums;
+ }
+
+ public void set_major_axis_size_pixels(int pixels) {
+ this.major_axis_size_pixels = pixels;
+ }
+
+ public int get_major_axis_size_pixels() {
+ return major_axis_size_pixels;
+ }
+
+ public void set_major_axis_size_selection_id(int selection_id) {
+ this.major_axis_size_selection_id = selection_id;
+ }
+
+ public int get_major_axis_size_selection_id() {
+ return major_axis_size_selection_id;
+ }
+
+ public void set_strip_metadata(bool strip_metadata) {
+ this.strip_metadata = strip_metadata;
+ }
+
+ public bool get_strip_metadata() {
+ return strip_metadata;
+ }
+
+ public void set_media_type(Spit.Publishing.Publisher.MediaType media_type) {
+ this.media_type = media_type;
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_media_type() {
+ return media_type;
+ }
+}
+
+internal class Uploader : Publishing.RESTSupport.BatchUploader {
+ private PublishingParameters parameters;
+
+ public Uploader(Publishing.RESTSupport.GoogleSession session,
+ Spit.Publishing.Publishable[] publishables, PublishingParameters parameters) {
+ base(session, publishables);
+
+ this.parameters = parameters;
+ }
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(
+ Spit.Publishing.Publishable publishable) {
+ return new UploadTransaction((Publishing.RESTSupport.GoogleSession) get_session(),
+ parameters, get_current_publishable());
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-publishing/PiwigoPublishing.vala b/plugins/shotwell-publishing/PiwigoPublishing.vala
new file mode 100644
index 0000000..8deada4
--- /dev/null
+++ b/plugins/shotwell-publishing/PiwigoPublishing.vala
@@ -0,0 +1,1736 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class PiwigoService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "piwigo.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public PiwigoService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.piwigo";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "Piwigo";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Bruno Girin";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.Piwigo.PiwigoPublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return (Spit.Publishing.Publisher.MediaType.PHOTO);
+ }
+}
+
+namespace Publishing.Piwigo {
+
+internal const string SERVICE_NAME = "Piwigo";
+internal const string PIWIGO_WS = "ws.php";
+internal const int ORIGINAL_SIZE = -1;
+
+internal class Category {
+ public int id;
+ public string name;
+ public string comment;
+ public string display_name;
+ public string uppercats;
+ public static const int NO_ID = -1;
+
+ public Category(int id, string name, string uppercats, string? comment = "") {
+ this.id = id;
+ this.name = name;
+ this.uppercats = uppercats;
+ this.comment = comment;
+ }
+
+ public Category.local(string name, int parent_id, string? comment = "") {
+ this.id = NO_ID;
+ this.name = name;
+ // for new categories abuse the uppercats value for
+ // the id of the new parent!
+ this.uppercats = parent_id.to_string();
+ this.comment = comment;
+ }
+
+ public bool is_local() {
+ return this.id == NO_ID;
+ }
+}
+
+internal class PermissionLevel {
+ public int id;
+ public string name;
+
+ public PermissionLevel(int id, string name) {
+ this.id = id;
+ this.name = name;
+ }
+}
+
+internal class SizeEntry {
+ public int id;
+ public string name;
+
+ public SizeEntry(int id, string name) {
+ this.id = id;
+ this.name = name;
+ }
+}
+
+internal class PublishingParameters {
+ public Category category = null;
+ public PermissionLevel perm_level = null;
+ public SizeEntry photo_size = null;
+ public bool title_as_comment = false;
+ public bool no_upload_tags = false;
+
+ public PublishingParameters() {
+ }
+}
+
+public class PiwigoPublisher : Spit.Publishing.Publisher, GLib.Object {
+ private Spit.Publishing.Service service;
+ private Spit.Publishing.PluginHost host;
+ private bool running = false;
+ private bool strip_metadata = false;
+ private Session session;
+ private Category[] categories = null;
+ private PublishingParameters parameters = null;
+ private Spit.Publishing.ProgressCallback progress_reporter = null;
+
+ public PiwigoPublisher(Spit.Publishing.Service service,
+ Spit.Publishing.PluginHost host) {
+ debug("PiwigoPublisher instantiated.");
+ this.service = service;
+ this.host = host;
+ session = new Session();
+ }
+
+ // Publisher interface implementation
+
+ public Spit.Publishing.Service get_service() {
+ return service;
+ }
+
+ public Spit.Publishing.PluginHost get_host() {
+ return host;
+ }
+
+ public bool is_running() {
+ return running;
+ }
+
+ public void start() {
+ if (is_running())
+ return;
+
+ debug("PiwigoPublisher: starting interaction.");
+
+ running = true;
+
+ if (session.is_authenticated()) {
+ debug("PiwigoPublisher: session is authenticated.");
+ do_fetch_categories();
+ } else {
+ debug("PiwigoPublisher: session is not authenticated.");
+ string? persistent_url = get_persistent_url();
+ string? persistent_username = get_persistent_username();
+ string? persistent_password = get_persistent_password();
+ if (persistent_url != null && persistent_username != null && persistent_password != null)
+ do_network_login(persistent_url, persistent_username,
+ persistent_password, get_remember_password());
+ else
+ do_show_authentication_pane();
+ }
+ }
+
+ public void stop() {
+ running = false;
+ }
+
+ // Session and persistent data
+
+ public string? get_persistent_url() {
+ return host.get_config_string("url", null);
+ }
+
+ private void set_persistent_url(string url) {
+ host.set_config_string("url", url);
+ }
+
+ public string? get_persistent_username() {
+ return host.get_config_string("username", null);
+ }
+
+ private void set_persistent_username(string username) {
+ host.set_config_string("username", username);
+ }
+
+ public string? get_persistent_password() {
+ return host.get_config_string("password", null);
+ }
+
+ private void set_persistent_password(string? password) {
+ host.set_config_string("password", password);
+ }
+
+ public bool get_remember_password() {
+ return host.get_config_bool("remember-password", false);
+ }
+
+ private void set_remember_password(bool remember_password) {
+ host.set_config_bool("remember-password", remember_password);
+ }
+
+ public int get_last_category() {
+ return host.get_config_int("last-category", -1);
+ }
+
+ private void set_last_category(int last_category) {
+ host.set_config_int("last-category", last_category);
+ }
+
+ public int get_last_permission_level() {
+ return host.get_config_int("last-permission-level", -1);
+ }
+
+ private void set_last_permission_level(int last_permission_level) {
+ host.set_config_int("last-permission-level", last_permission_level);
+ }
+
+ public int get_last_photo_size() {
+ return host.get_config_int("last-photo-size", -1);
+ }
+
+ private void set_last_photo_size(int last_photo_size) {
+ host.set_config_int("last-photo-size", last_photo_size);
+ }
+
+ private bool get_last_title_as_comment() {
+ return host.get_config_bool("last-title-as-comment", false);
+ }
+
+ private void set_last_title_as_comment(bool title_as_comment) {
+ host.set_config_bool("last-title-as-comment", title_as_comment);
+ }
+
+ private bool get_last_no_upload_tags() {
+ return host.get_config_bool("last-no-upload-tags", false);
+ }
+
+ private void set_last_no_upload_tags(bool no_upload_tags) {
+ host.set_config_bool("last-no-upload-tags", no_upload_tags);
+ }
+
+ private bool get_metadata_removal_choice() {
+ return host.get_config_bool("strip_metadata", false);
+ }
+
+ private void set_metadata_removal_choice(bool strip_metadata) {
+ host.set_config_bool("strip_metadata", strip_metadata);
+ }
+
+ // Actions and events implementation
+
+ /**
+ * Action that shows the authentication pane.
+ *
+ * This action method shows the authentication pane. It is shown at the
+ * very beginning of the interaction when no persistent parameters are found
+ * or after a failed login attempt using persisted parameters. It can be
+ * given a mode flag to specify whether it should be displayed in initial
+ * mode or in any of the error modes that it supports.
+ *
+ * @param mode the mode for the authentication pane
+ */
+ private void do_show_authentication_pane(AuthenticationPane.Mode mode = AuthenticationPane.Mode.INTRO) {
+ debug("ACTION: installing authentication pane");
+
+ host.set_service_locked(false);
+ AuthenticationPane authentication_pane =
+ new AuthenticationPane(this, mode);
+ authentication_pane.login.connect(on_authentication_pane_login_clicked);
+ host.install_dialog_pane(authentication_pane, Spit.Publishing.PluginHost.ButtonMode.CLOSE);
+ host.set_dialog_default_widget(authentication_pane.get_default_widget());
+ }
+
+ /**
+ * Event triggered when the login button in the authentication panel is
+ * clicked.
+ *
+ * This event is triggered when the login button in the authentication
+ * panel is clicked. It then triggers a network login interaction.
+ *
+ * @param url the URL of the Piwigo service as entered in the dialog
+ * @param username the name of the Piwigo user as entered in the dialog
+ * @param password the password of the Piwigo as entered in the dialog
+ */
+ private void on_authentication_pane_login_clicked(
+ string url, string username, string password, bool remember_password
+ ) {
+ debug("EVENT: on_authentication_pane_login_clicked");
+ if (!running)
+ return;
+
+ do_network_login(url, username, password, remember_password);
+ }
+
+ /**
+ * Action to perform a network login to a Piwigo service.
+ *
+ * This action performs a network login a Piwigo service specified by a
+ * URL and using the given user name and password as credentials.
+ *
+ * @param url the URL of the Piwigo service; this URL will be normalised
+ * before being used
+ * @param username the name of the Piwigo user used to login
+ * @param password the password of the Piwigo user used to login
+ */
+ private void do_network_login(string url, string username, string password, bool remember_password) {
+ debug("ACTION: logging in");
+ host.set_service_locked(true);
+ host.install_login_wait_pane();
+
+ set_remember_password(remember_password);
+ if (remember_password)
+ set_persistent_password(password);
+ else
+ set_persistent_password(null);
+
+ SessionLoginTransaction login_trans = new SessionLoginTransaction(
+ session, normalise_url(url), username, password);
+ login_trans.network_error.connect(on_login_network_error);
+ login_trans.completed.connect(on_login_network_complete);
+
+ try {
+ login_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: do_network_login");
+ do_show_error(err);
+ }
+ }
+
+ public static string normalise_url(string url) {
+ string norm_url = url;
+
+ if(!norm_url.has_suffix(".php")) {
+ if(!norm_url.has_suffix("/")) {
+ norm_url = norm_url + "/";
+ }
+ norm_url = norm_url + PIWIGO_WS;
+ }
+
+ if(!norm_url.has_prefix("http://") && !norm_url.has_prefix("https://")) {
+ norm_url = "http://" + norm_url;
+ }
+
+ return norm_url;
+ }
+
+ /**
+ * Event triggered when the network login action is complete and successful.
+ *
+ * This event is triggered on successful completion of a network login.
+ * Calling this event implies that the URL, user name and password provided
+ * in the authentication pane are valid and that the transaction should
+ * contain a Set-Cookie header that includes the value pwg_id for that
+ * user. As a result, this event will also authenticate the session and
+ * persist all values so that they can be re-used during the next publishing
+ * interaction.
+ *
+ * @param txn the received REST transaction
+ */
+ private void on_login_network_complete(Publishing.RESTSupport.Transaction txn) {
+ debug("EVENT: on_login_network_complete");
+ txn.completed.disconnect(on_login_network_complete);
+ txn.network_error.disconnect(on_login_network_error);
+
+ try {
+ Publishing.RESTSupport.XmlDocument.parse_string(
+ txn.get_response(), Transaction.validate_xml);
+ } catch (Spit.Publishing.PublishingError err) {
+ // Get error code first
+ try {
+ Publishing.RESTSupport.XmlDocument.parse_string(
+ txn.get_response(), Transaction.get_error_code);
+ } catch (Spit.Publishing.PublishingError code) {
+ int code_int = int.parse(code.message);
+ if (code_int == 999) {
+ debug("ERROR: on_login_network_complete, code 999");
+ do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_USER);
+ } else {
+ debug("ERROR: on_login_network_complete");
+ do_show_error(err);
+ }
+ }
+ return;
+ }
+ // Get session ID and authenticate the session
+ string endpoint_url = txn.get_endpoint_url();
+ debug("Setting endpoint URL to %s", endpoint_url);
+ string pwg_id = get_pwg_id_from_transaction(txn);
+ debug("Setting session pwg_id to %s", pwg_id);
+ session = new Session();
+ session.set_pwg_id(pwg_id);
+
+ do_fetch_session_status(endpoint_url, pwg_id);
+ }
+
+ /**
+ * Event triggered when a network login action fails due to a network error.
+ *
+ * This event triggered as a result of a network error during the login
+ * transaction. As a result, it assumes that the service URL entered in the
+ * authentication dialog is incorrect and re-presents the authentication
+ * dialog with FAILED_RETRY_URL mode.
+ *
+ * @param bad_txn the received REST transaction
+ * @param err the received error
+ */
+ private void on_login_network_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_login_network_error");
+ bad_txn.completed.disconnect(on_login_network_complete);
+ bad_txn.network_error.disconnect(on_login_network_error);
+
+ if (session.is_authenticated()) // ignore these events if the session is already auth'd
+ return;
+
+ do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_URL);
+ }
+
+ /**
+ * Action to fetch the session status for a known Piwigo user.
+ *
+ * This action fetches the session status for a Piwigo user for whom the
+ * pwg_id is known. If triggered after a network login, it should just
+ * confirm that the session is OK. It can also be triggered as the first
+ * action of the interaction for users for who the pwg_id was previously
+ * persisted. In this case, it will log the user in and confirm the
+ * identity.
+ */
+ private void do_fetch_session_status(string url = "", string pwg_id = "") {
+ debug("ACTION: fetching session status");
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ if (!session.is_authenticated()) {
+ SessionGetStatusTransaction status_txn = new SessionGetStatusTransaction.unauthenticated(session, url, pwg_id);
+ status_txn.network_error.connect(on_session_get_status_error);
+ status_txn.completed.connect(on_session_get_status_complete);
+
+ try {
+ status_txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: do_fetch_session_status, not authenticated");
+ do_show_error(err);
+ }
+ } else {
+ SessionGetStatusTransaction status_txn = new SessionGetStatusTransaction(session);
+ status_txn.network_error.connect(on_session_get_status_error);
+ status_txn.completed.connect(on_session_get_status_complete);
+
+ try {
+ status_txn.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: do_fetch_session_status, authenticated");
+ do_show_error(err);
+ }
+ }
+ }
+
+ /**
+ * Event triggered when the get session status action completes successfully.
+ *
+ * This event being triggered confirms that the session is valid and can becyclonic enema
+ * used. If the session is not fully authenticated yet, this event finalises
+ * session authentication. It then triggers the fetch categories action.
+ */
+ private void on_session_get_status_complete(Publishing.RESTSupport.Transaction txn) {
+ debug("EVENT: on_session_get_status_complete");
+ txn.completed.disconnect(on_session_get_status_complete);
+ txn.network_error.disconnect(on_session_get_status_error);
+
+ if (!session.is_authenticated()) {
+ string endpoint_url = txn.get_endpoint_url();
+ string pwg_id = session.get_pwg_id();
+ debug("Fetching session status for pwg_id %s", pwg_id);
+ // Parse the response
+ try {
+ Publishing.RESTSupport.XmlDocument doc =
+ Publishing.RESTSupport.XmlDocument.parse_string(
+ txn.get_response(), Transaction.validate_xml);
+ Xml.Node* root = doc.get_root_node();
+ Xml.Node* username_node;
+ try {
+ username_node = doc.get_named_child(root, "username");
+ string username = username_node->get_content();
+ debug("Returned username is %s", username);
+ session.authenticate(endpoint_url, username, pwg_id);
+ set_persistent_url(session.get_pwg_url());
+ set_persistent_username(session.get_username());
+ do_fetch_categories();
+ } catch (Spit.Publishing.PublishingError err2) {
+ debug("ERROR: on_session_get_status_complete, inner");
+ do_show_error(err2);
+ return;
+ }
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: on_session_get_status_complete, outer");
+ do_show_error(err);
+ return;
+ }
+ } else {
+ // This should never happen as the session should not be
+ // authenticated at that point so this call is a safeguard
+ // against the interaction not happening properly.
+ do_fetch_categories();
+ }
+ }
+
+ /**
+ * Event triggered when the get session status fails due to a network error.
+ */
+ private void on_session_get_status_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_session_get_status_error");
+ bad_txn.completed.disconnect(on_session_get_status_complete);
+ bad_txn.network_error.disconnect(on_session_get_status_error);
+ on_network_error(bad_txn, err);
+ }
+
+ /**
+ * Action that fetches all available categories from the Piwigo service.
+ *
+ * This action fetches all categories from the Piwigo service in order
+ * to populate the publishing pane presented to the user.
+ */
+ private void do_fetch_categories() {
+ debug("ACTION: fetching categories");
+ host.set_service_locked(true);
+ host.install_account_fetch_wait_pane();
+
+ CategoriesGetListTransaction cat_trans = new CategoriesGetListTransaction(session);
+ cat_trans.network_error.connect(on_category_fetch_error);
+ cat_trans.completed.connect(on_category_fetch_complete);
+
+ try {
+ cat_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: do_fetch_categories");
+ do_show_error(err);
+ }
+ }
+
+ /**
+ * Event triggered when the fetch categories action completes successfully.
+ *
+ * This event retrieves all categories from the received transaction and
+ * populates the categories list. It then triggers the display of the
+ * publishing options pane.
+ */
+ private void on_category_fetch_complete(Publishing.RESTSupport.Transaction txn) {
+ debug("EVENT: on_category_fetch_complete");
+ txn.completed.disconnect(on_category_fetch_complete);
+ txn.network_error.disconnect(on_category_fetch_error);
+ debug("PiwigoConnector: list of categories: %s", txn.get_response());
+ // Empty the categories
+ if (categories != null) {
+ categories = null;
+ }
+ // Parse the response
+ try {
+ Publishing.RESTSupport.XmlDocument doc =
+ Publishing.RESTSupport.XmlDocument.parse_string(
+ txn.get_response(), Transaction.validate_xml);
+ Xml.Node* root = doc.get_root_node();
+ Xml.Node* categories_node = root->first_element_child();
+ Xml.Node* category_node_iter = categories_node->children;
+ Xml.Node* name_node;
+ Xml.Node* uppercats_node;
+ string name = "";
+ string id_string = "";
+ string uppercats = "";
+ for ( ; category_node_iter != null; category_node_iter = category_node_iter->next) {
+ name_node = doc.get_named_child(category_node_iter, "name");
+ name = name_node->get_content();
+ uppercats_node = doc.get_named_child(category_node_iter, "uppercats");
+ uppercats = (string)uppercats_node->get_content();
+ id_string = category_node_iter->get_prop("id");
+ if (categories == null) {
+ categories = new Category[0];
+ }
+ categories += new Category(int.parse(id_string), name, uppercats);
+ }
+ // compute the display name for the categories
+ // currently done by an unnecessary triple loop
+ // one could make a loop that goes over the categories
+ // and creates a list of back references cat_id -> index
+ // but since cat_ids are not guaranteed to be continuous
+ // that needs a perl hash ;-)
+ for(int i = 0; i < categories.length; i++) {
+ string[] upcatids = categories[i].uppercats.split(",");
+ var builder = new StringBuilder();
+ for (int j=0; j < upcatids.length; j++) {
+ builder.append ("/ ");
+ // search for the upper category
+ for (int k=0; k < categories.length; k++) {
+ if (upcatids[j] == categories[k].id.to_string()) {
+ builder.append (categories[k].name);
+ break;
+ }
+ }
+ builder.append (" ");
+ }
+ categories[i].display_name = builder.str;
+ }
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: on_category_fetch_complete");
+ do_show_error(err);
+ return;
+ }
+
+ do_show_publishing_options_pane();
+ }
+
+ /**
+ * Event triggered when the fetch categories transaction fails due to a
+ * network error.
+ */
+ private void on_category_fetch_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_category_fetch_error");
+ bad_txn.completed.disconnect(on_category_fetch_complete);
+ bad_txn.network_error.disconnect(on_category_fetch_error);
+ on_network_error(bad_txn, err);
+ }
+
+ /**
+ * Action that shows the publishing options pane.
+ *
+ * This action method shows the publishing options pane.
+ */
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: installing publishing options pane");
+
+ host.set_service_locked(false);
+ PublishingOptionsPane opts_pane = new PublishingOptionsPane(
+ this, categories, get_last_category(), get_last_permission_level(), get_last_photo_size(),
+ get_last_title_as_comment(), get_last_no_upload_tags(), get_metadata_removal_choice());
+ opts_pane.logout.connect(on_publishing_options_pane_logout_clicked);
+ opts_pane.publish.connect(on_publishing_options_pane_publish_clicked);
+ host.install_dialog_pane(opts_pane, Spit.Publishing.PluginHost.ButtonMode.CLOSE);
+ host.set_dialog_default_widget(opts_pane.get_default_widget());
+ }
+
+ /**
+ * Event triggered when the user clicks logout in the publishing options pane.
+ */
+ private void on_publishing_options_pane_logout_clicked() {
+ debug("EVENT: on_publishing_options_pane_logout_clicked");
+ SessionLogoutTransaction logout_trans = new SessionLogoutTransaction(session);
+ logout_trans.network_error.connect(on_logout_network_error);
+ logout_trans.completed.connect(on_logout_network_complete);
+
+ try {
+ logout_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: on_publishing_options_pane_logout_clicked");
+ do_show_error(err);
+ }
+ }
+
+ /**
+ * Event triggered when the logout action completes successfully.
+ *
+ * This event de-authenticates the session and shows the authentication
+ * pane again.
+ */
+ private void on_logout_network_complete(Publishing.RESTSupport.Transaction txn) {
+ debug("EVENT: on_logout_network_complete");
+ txn.completed.disconnect(on_logout_network_complete);
+ txn.network_error.disconnect(on_logout_network_error);
+
+ session.deauthenticate();
+
+ do_show_authentication_pane(AuthenticationPane.Mode.INTRO);
+ }
+
+ /**
+ * Event triggered when the logout action fails due to a network error.
+ */
+ private void on_logout_network_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_logout_network_error");
+ bad_txn.completed.disconnect(on_logout_network_complete);
+ bad_txn.network_error.disconnect(on_logout_network_error);
+ on_network_error(bad_txn, err);
+ }
+
+ /**
+ * Event triggered when the user clicks publish in the publishing options pane.
+ *
+ * This event first saves the parameters so that they can re-used later.
+ * If the publishing parameters indicate that the user wants to create a new
+ * category, the create category action is called. Otherwise, the upload
+ * action is called.
+ *
+ * @param parameters the publishing parameters
+ */
+ private void on_publishing_options_pane_publish_clicked(PublishingParameters parameters,
+ bool strip_metadata) {
+ debug("EVENT: on_publishing_options_pane_publish_clicked");
+ this.parameters = parameters;
+ this.strip_metadata = strip_metadata;
+
+ if (parameters.category.is_local()) {
+ do_create_category(parameters.category);
+ } else {
+ do_upload(this.strip_metadata);
+ }
+ }
+
+ /**
+ * Action that creates a new category in the Piwigo library.
+ *
+ * This actions runs a REST transaction to create a new category in the
+ * Piwigo library. It displays a wait pane with an information message
+ * while the transaction is running. This action should only be called with
+ * a local cateogory, i.e. one that does not exist on the server and does
+ * not yet have an ID.
+ *
+ * @param category the new category to create on the server
+ */
+ private void do_create_category(Category category) {
+ debug("ACTION: creating a new category: %s".printf(category.name));
+ assert(category.is_local());
+
+ host.set_service_locked(true);
+ host.install_static_message_pane(_("Creating album %s...").printf(category.name));
+
+ CategoriesAddTransaction creation_trans = new CategoriesAddTransaction(
+ session, category.name.strip(), int.parse(category.uppercats), category.comment);
+ creation_trans.network_error.connect(on_category_add_error);
+ creation_trans.completed.connect(on_category_add_complete);
+
+ try {
+ creation_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: do_create_category");
+ do_show_error(err);
+ }
+ }
+
+ /**
+ * Event triggered when the add category action completes successfully.
+ *
+ * This event parses the ID assigned to new category out of the received
+ * transaction and assigns that ID to the category currently held in
+ * the publishing parameters. It then calls the upload action.
+ */
+ private void on_category_add_complete(Publishing.RESTSupport.Transaction txn) {
+ debug("EVENT: on_category_add_complete");
+ txn.completed.disconnect(on_category_add_complete);
+ txn.network_error.disconnect(on_category_add_error);
+
+ // Parse the response
+ try {
+ Publishing.RESTSupport.XmlDocument doc =
+ Publishing.RESTSupport.XmlDocument.parse_string(
+ txn.get_response(), Transaction.validate_xml);
+ Xml.Node* rsp = doc.get_root_node();
+ Xml.Node* id_node;
+ id_node = doc.get_named_child(rsp, "id");
+ string id_string = id_node->get_content();
+ int id = int.parse(id_string);
+ parameters.category.id = id;
+ do_upload(strip_metadata);
+ } catch (Spit.Publishing.PublishingError err) {
+ debug("ERROR: on_category_add_complete");
+ do_show_error(err);
+ }
+ }
+
+ /**
+ * Event triggered when the add category action fails due to a network error.
+ */
+ private void on_category_add_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_category_add_error");
+ bad_txn.completed.disconnect(on_category_add_complete);
+ bad_txn.network_error.disconnect(on_category_add_error);
+ on_network_error(bad_txn, err);
+ }
+
+ /**
+ * Upload action: the big one, the one we've been waiting for!
+ */
+ private void do_upload(bool strip_metadata) {
+ this.strip_metadata = strip_metadata;
+ debug("ACTION: uploading pictures");
+
+ host.set_service_locked(true);
+ // Save last category, permission level and size for next use
+ set_last_category(parameters.category.id);
+ set_last_permission_level(parameters.perm_level.id);
+ set_last_photo_size(parameters.photo_size.id);
+ set_last_title_as_comment(parameters.title_as_comment);
+ set_last_no_upload_tags(parameters.no_upload_tags);
+ set_metadata_removal_choice(strip_metadata);
+
+ progress_reporter = host.serialize_publishables(parameters.photo_size.id, this.strip_metadata);
+ Spit.Publishing.Publishable[] publishables = host.get_publishables();
+
+ Uploader uploader = new Uploader(session, publishables, parameters);
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+ uploader.upload(on_upload_status_updated);
+ }
+
+ /**
+ * Event triggered when the batch uploader reports that at least one of the
+ * network transactions encapsulating uploads has completed successfully
+ */
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader, int num_published) {
+ debug("EVENT: on_upload_complete");
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ // TODO: should a message be displayed to the user if num_published is zero?
+
+ do_show_success_pane();
+ }
+
+ /**
+ * Event triggered when the batch uploader reports that at least one of the
+ * network transactions encapsulating uploads has caused a network error
+ */
+ private void on_upload_error(
+ Publishing.RESTSupport.BatchUploader uploader,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_upload_error");
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ do_show_error(err);
+ }
+
+ /**
+ * Event triggered when upload progresses and the status needs to be updated.
+ */
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ /**
+ * Action to display the success pane in the publishing dialog.
+ */
+ private void do_show_success_pane() {
+ debug("ACTION: installing success pane");
+
+ host.set_service_locked(false);
+ host.install_success_pane();
+ }
+
+ /**
+ * Helper event to handle network errors.
+ */
+ private void on_network_error(
+ Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err
+ ) {
+ debug("EVENT: on_network_error");
+ do_show_error(err);
+ }
+
+ /**
+ * Action to display an error to the user.
+ */
+ private void do_show_error(Spit.Publishing.PublishingError e) {
+ debug("ACTION: do_show_error");
+ string error_type = "UNKNOWN";
+ if (e is Spit.Publishing.PublishingError.NO_ANSWER) {
+ do_show_authentication_pane(AuthenticationPane.Mode.FAILED_RETRY_URL);
+ return;
+ } else if(e is Spit.Publishing.PublishingError.COMMUNICATION_FAILED) {
+ error_type = "COMMUNICATION_FAILED";
+ } else if(e is Spit.Publishing.PublishingError.PROTOCOL_ERROR) {
+ error_type = "PROTOCOL_ERROR";
+ } else if(e is Spit.Publishing.PublishingError.SERVICE_ERROR) {
+ error_type = "SERVICE_ERROR";
+ } else if(e is Spit.Publishing.PublishingError.MALFORMED_RESPONSE) {
+ error_type = "MALFORMED_RESPONSE";
+ } else if(e is Spit.Publishing.PublishingError.LOCAL_FILE_ERROR) {
+ error_type = "LOCAL_FILE_ERROR";
+ } else if(e is Spit.Publishing.PublishingError.EXPIRED_SESSION) {
+ error_type = "EXPIRED_SESSION";
+ }
+
+ debug("Unhandled error: type=%s; message='%s'".printf(error_type, e.message));
+ do_show_error_message(_("An error message occurred when publishing to Piwigo. Please try again."));
+ }
+
+ /**
+ * Action to display an error message to the user.
+ */
+ private void do_show_error_message(string message) {
+ debug("ACTION: do_show_error_message");
+ host.install_static_message_pane(message,
+ Spit.Publishing.PluginHost.ButtonMode.CLOSE);
+ }
+
+ // Helper methods
+
+ /**
+ * Retrieves session ID from a REST Transaction received
+ *
+ * This helper method extracts the pwg_id out of the Set-Cookie header if
+ * present in the received transaction.
+ *
+ * @param txn the received transaction
+ * @return the value of pwg_id if present or null if not found
+ */
+ private new string? get_pwg_id_from_transaction(Publishing.RESTSupport.Transaction txn) {
+ string cookie = txn.get_response_headers().get_list("Set-Cookie");
+ string pwg_id = null;
+ debug("Full cookie string: %s".printf(cookie));
+ if (!is_string_empty(cookie)) {
+ string[] cookie_segments = cookie.split(";");
+ debug("Split full string into %d individual segments".printf(cookie_segments.length));
+ foreach(string cookie_segment in cookie_segments) {
+ debug("Individual cookie segment: %s".printf(cookie_segment));
+ string[] cookie_sub_segments = cookie_segment.split(",");
+ debug("Split segment into %d individual sub-segments".printf(cookie_sub_segments.length));
+ foreach(string cookie_sub_segment in cookie_sub_segments) {
+ debug("Individual cookie sub-segment: %s".printf(cookie_sub_segment));
+ string[] cookie_kv = cookie_sub_segment.split("=");
+ debug("Split sub-segment into %d chunks".printf(cookie_kv.length));
+ if (cookie_kv.length > 1 && cookie_kv[0].strip() == "pwg_id") {
+ debug("Found pwg_id: %s".printf(cookie_kv[1].strip()));
+ pwg_id = cookie_kv[1].strip();
+ }
+ }
+ }
+ }
+
+ return pwg_id;
+ }
+}
+
+// The uploader
+
+internal class Uploader : Publishing.RESTSupport.BatchUploader {
+ private PublishingParameters parameters;
+
+ public Uploader(Session session, Spit.Publishing.Publishable[] publishables,
+ PublishingParameters parameters) {
+ base(session, publishables);
+
+ this.parameters = parameters;
+ }
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(
+ Spit.Publishing.Publishable publishable) {
+ return new ImagesAddTransaction((Session) get_session(), parameters,
+ publishable);
+ }
+}
+
+// UI elements
+
+/**
+ * The authentication pane used when asking service URL, user name and password
+ * from the user.
+ */
+internal class AuthenticationPane : Spit.Publishing.DialogPane, Object {
+ public enum Mode {
+ INTRO,
+ FAILED_RETRY_URL,
+ FAILED_RETRY_USER
+ }
+ private static string INTRO_MESSAGE = _("Enter the URL of your Piwigo photo library as well as the username and password associated with your Piwigo account for that library.");
+ private static string FAILED_RETRY_URL_MESSAGE = _("Shotwell cannot contact your Piwigo photo library. Please verify the URL you entered");
+ private static string FAILED_RETRY_USER_MESSAGE = _("Username and/or password invalid. Please try again");
+
+ private Gtk.Box pane_widget = null;
+ private Gtk.Builder builder;
+ private Gtk.Entry url_entry;
+ private Gtk.Entry username_entry;
+ private Gtk.Entry password_entry;
+ private Gtk.CheckButton remember_password_checkbutton;
+ private Gtk.Button login_button;
+
+ public signal void login(string url, string user, string password, bool remember_password);
+
+ public AuthenticationPane(PiwigoPublisher publisher, Mode mode = Mode.INTRO) {
+ this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ File ui_file = publisher.get_host().get_module_file().get_parent().
+ get_child("piwigo_authentication_pane.glade");
+
+ try {
+ builder = new Gtk.Builder();
+ builder.add_from_file(ui_file.get_path());
+ builder.connect_signals(null);
+ Gtk.Alignment align = builder.get_object("alignment") as Gtk.Alignment;
+
+ Gtk.Label message_label = builder.get_object("message_label") as Gtk.Label;
+ switch (mode) {
+ case Mode.INTRO:
+ message_label.set_text(INTRO_MESSAGE);
+ break;
+
+ case Mode.FAILED_RETRY_URL:
+ message_label.set_markup("<b>%s</b>\n\n%s".printf(_(
+ "Invalid URL"), FAILED_RETRY_URL_MESSAGE));
+ break;
+
+ case Mode.FAILED_RETRY_USER:
+ message_label.set_markup("<b>%s</b>\n\n%s".printf(_(
+ "Invalid User Name or Password"), FAILED_RETRY_USER_MESSAGE));
+ break;
+ }
+
+ url_entry = builder.get_object ("url_entry") as Gtk.Entry;
+ string? persistent_url = publisher.get_persistent_url();
+ if (persistent_url != null) {
+ url_entry.set_text(persistent_url);
+ }
+ username_entry = builder.get_object ("username_entry") as Gtk.Entry;
+ string? persistent_username = publisher.get_persistent_username();
+ if (persistent_username != null) {
+ username_entry.set_text(persistent_username);
+ }
+ password_entry = builder.get_object ("password_entry") as Gtk.Entry;
+ string? persistent_password = publisher.get_persistent_password();
+ if (persistent_password != null) {
+ password_entry.set_text(persistent_password);
+ }
+ remember_password_checkbutton =
+ builder.get_object ("remember_password_checkbutton") as Gtk.CheckButton;
+ remember_password_checkbutton.set_active(publisher.get_remember_password());
+
+ login_button = builder.get_object("login_button") as Gtk.Button;
+
+ username_entry.changed.connect(on_user_changed);
+ url_entry.changed.connect(on_url_changed);
+ password_entry.changed.connect(on_password_changed);
+ login_button.clicked.connect(on_login_button_clicked);
+
+ align.reparent(pane_widget);
+ publisher.get_host().set_dialog_default_widget(login_button);
+ } catch (Error e) {
+ warning("Could not load UI: %s", e.message);
+ }
+ }
+
+ public Gtk.Widget get_default_widget() {
+ return login_button;
+ }
+
+ private void on_login_button_clicked() {
+ login(url_entry.get_text(), username_entry.get_text(),
+ password_entry.get_text(), remember_password_checkbutton.get_active());
+ }
+
+ private void on_url_changed() {
+ update_login_button_sensitivity();
+ }
+
+ private void on_user_changed() {
+ update_login_button_sensitivity();
+ }
+
+ private void on_password_changed() {
+ update_login_button_sensitivity();
+ }
+
+ private void update_login_button_sensitivity() {
+ login_button.set_sensitive(
+ !is_string_empty(url_entry.get_text()) &&
+ !is_string_empty(username_entry.get_text()) &&
+ !is_string_empty(password_entry.get_text())
+ );
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ url_entry.grab_focus();
+ password_entry.set_activates_default(true);
+ login_button.can_default = true;
+ update_login_button_sensitivity();
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+/**
+ * The publishing options pane.
+ */
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, Object {
+
+ private static string DEFAULT_CATEGORY_NAME = _("Shotwell Connect");
+
+ private Gtk.Box pane_widget = null;
+ private Gtk.Builder builder;
+ private Gtk.RadioButton use_existing_radio;
+ private Gtk.RadioButton create_new_radio;
+ private Gtk.ComboBoxText existing_categories_combo;
+ private Gtk.Entry new_category_entry;
+ private Gtk.Label within_existing_label;
+ private Gtk.ComboBoxText within_existing_combo;
+ private Gtk.ComboBoxText perms_combo;
+ private Gtk.ComboBoxText size_combo;
+ private Gtk.CheckButton strip_metadata_check = null;
+ private Gtk.CheckButton title_as_comment_check = null;
+ private Gtk.CheckButton no_upload_tags_check = null;
+ private Gtk.Button logout_button;
+ private Gtk.Button publish_button;
+ private Gtk.TextView album_comment;
+ private Gtk.Label album_comment_label;
+
+ private Category[] existing_categories;
+ private PermissionLevel[] perm_levels;
+ private SizeEntry[] photo_sizes;
+
+ private int last_category;
+ private int last_permission_level;
+ private int last_photo_size;
+ private bool last_title_as_comment;
+ private bool last_no_upload_tags;
+
+ public signal void publish(PublishingParameters parameters, bool strip_metadata);
+ public signal void logout();
+
+ public PublishingOptionsPane(
+ PiwigoPublisher publisher, Category[] categories,
+ int last_category, int last_permission_level, int last_photo_size,
+ bool last_title_as_comment, bool last_no_upload_tags, bool strip_metadata_enabled
+ ) {
+ this.pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ this.last_category = last_category;
+ this.last_permission_level = last_permission_level;
+ this.last_photo_size = last_photo_size;
+ this.last_title_as_comment = last_title_as_comment;
+ this.last_no_upload_tags = last_no_upload_tags;
+
+ File ui_file = publisher.get_host().get_module_file().get_parent().
+ get_child("piwigo_publishing_options_pane.glade");
+
+ try {
+ builder = new Gtk.Builder();
+ builder.add_from_file(ui_file.get_path());
+ builder.connect_signals(null);
+ Gtk.Alignment align = builder.get_object("alignment") as Gtk.Alignment;
+
+ use_existing_radio = builder.get_object("use_existing_radio") as Gtk.RadioButton;
+ create_new_radio = builder.get_object("create_new_radio") as Gtk.RadioButton;
+ existing_categories_combo = builder.get_object("existing_categories_combo") as Gtk.ComboBoxText;
+ new_category_entry = builder.get_object ("new_category_entry") as Gtk.Entry;
+ within_existing_label = builder.get_object ("within_existing_label") as Gtk.Label;
+ within_existing_combo = builder.get_object ("within_existing_combo") as Gtk.ComboBoxText;
+
+ album_comment = builder.get_object ("album_comment") as Gtk.TextView;
+ album_comment.buffer = new Gtk.TextBuffer(null);
+ album_comment_label = builder.get_object ("album_comment_label") as Gtk.Label;
+
+ perms_combo = builder.get_object("perms_combo") as Gtk.ComboBoxText;
+ size_combo = builder.get_object("size_combo") as Gtk.ComboBoxText;
+
+ strip_metadata_check = builder.get_object("strip_metadata_check") as Gtk.CheckButton;
+ strip_metadata_check.set_active(strip_metadata_enabled);
+
+ title_as_comment_check = builder.get_object("title_as_comment_check") as Gtk.CheckButton;
+ title_as_comment_check.set_active(last_title_as_comment);
+
+ no_upload_tags_check = builder.get_object("no_upload_tags_check") as Gtk.CheckButton;
+ no_upload_tags_check.set_active(last_no_upload_tags);
+
+ logout_button = builder.get_object("logout_button") as Gtk.Button;
+ logout_button.clicked.connect(on_logout_button_clicked);
+
+ publish_button = builder.get_object("publish_button") as Gtk.Button;
+ publish_button.clicked.connect(on_publish_button_clicked);
+
+ use_existing_radio.clicked.connect(on_use_existing_radio_clicked);
+ create_new_radio.clicked.connect(on_create_new_radio_clicked);
+ new_category_entry.changed.connect(on_new_category_entry_changed);
+ within_existing_combo.changed.connect(on_existing_combo_changed);
+
+ align.reparent(pane_widget);
+ pane_widget.set_child_packing(align, true, true, 0, Gtk.PackType.START);
+ } catch (Error e) {
+ warning("Could not load UI: %s", e.message);
+ }
+
+ this.existing_categories = categories;
+ this.perm_levels = create_perm_levels();
+ this.photo_sizes = create_sizes();
+ this.album_comment.buffer.set_text(get_common_comment_if_possible(publisher));
+ }
+
+ public Gtk.Widget get_default_widget() {
+ return publish_button;
+ }
+
+ private PermissionLevel[] create_perm_levels() {
+ PermissionLevel[] result = new PermissionLevel[0];
+
+ result += new PermissionLevel(0, _("Everyone"));
+ result += new PermissionLevel(1, _("Admins, Family, Friends, Contacts"));
+ result += new PermissionLevel(2, _("Admins, Family, Friends"));
+ result += new PermissionLevel(4, _("Admins, Family"));
+ result += new PermissionLevel(8, _("Admins"));
+
+ return result;
+ }
+
+ private SizeEntry[] create_sizes() {
+ SizeEntry[] result = new SizeEntry[0];
+
+ result += new SizeEntry(500, _("500 x 375 pixels"));
+ result += new SizeEntry(1024, _("1024 x 768 pixels"));
+ result += new SizeEntry(2048, _("2048 x 1536 pixels"));
+ result += new SizeEntry(4096, _("4096 x 3072 pixels"));
+ result += new SizeEntry(ORIGINAL_SIZE, _("Original size"));
+
+ return result;
+ }
+
+ private void on_logout_button_clicked() {
+ logout();
+ }
+
+ private void on_publish_button_clicked() {
+ PublishingParameters params = new PublishingParameters();
+ params.perm_level = perm_levels[perms_combo.get_active()];
+ params.photo_size = photo_sizes[size_combo.get_active()];
+ params.title_as_comment = title_as_comment_check.get_active();
+ params.no_upload_tags = no_upload_tags_check.get_active();
+ if (create_new_radio.get_active()) {
+ string uploadcomment = album_comment.buffer.text.strip();
+ int a = within_existing_combo.get_active();
+ if (a == 0) {
+ params.category = new Category.local(new_category_entry.get_text(), 0, uploadcomment);
+ } else {
+ // the list in existing_categories and in the within_existing_combo are shifted
+ // by 1, since we add the root
+ a--;
+ params.category = new Category.local(new_category_entry.get_text(),
+ existing_categories[a].id, uploadcomment);
+ }
+ } else {
+ params.category = existing_categories[existing_categories_combo.get_active()];
+ }
+ publish(params, strip_metadata_check.get_active());
+ }
+
+ // UI interaction
+ private void on_use_existing_radio_clicked() {
+ existing_categories_combo.set_sensitive(true);
+ new_category_entry.set_sensitive(false);
+ within_existing_label.set_sensitive(false);
+ within_existing_combo.set_sensitive(false);
+ existing_categories_combo.grab_focus();
+ album_comment_label.set_sensitive(false);
+ album_comment.set_sensitive(false);
+ update_publish_button_sensitivity();
+ }
+
+ private void on_create_new_radio_clicked() {
+ new_category_entry.set_sensitive(true);
+ within_existing_label.set_sensitive(true);
+ within_existing_combo.set_sensitive(true);
+ album_comment_label.set_sensitive(true);
+ album_comment.set_sensitive(true);
+ existing_categories_combo.set_sensitive(false);
+ new_category_entry.grab_focus();
+ update_publish_button_sensitivity();
+ }
+
+ private void on_new_category_entry_changed() {
+ update_publish_button_sensitivity();
+ }
+
+ private void on_existing_combo_changed() {
+ update_publish_button_sensitivity();
+ }
+
+ private void update_publish_button_sensitivity() {
+ string category_name = new_category_entry.get_text().strip();
+ int a = within_existing_combo.get_active();
+ string search_name;
+ if (a <= 0) {
+ search_name = "/ " + category_name;
+ } else {
+ a--;
+ search_name = existing_categories[a].display_name + "/ " + category_name;
+ }
+ publish_button.set_sensitive(
+ !(
+ create_new_radio.get_active() &&
+ (
+ is_string_empty(category_name) ||
+ category_already_exists(search_name)
+ )
+ )
+ );
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ create_categories_combo();
+ create_within_categories_combo();
+ create_permissions_combo();
+ create_size_combo();
+
+ publish_button.can_default = true;
+ update_publish_button_sensitivity();
+ }
+
+ private string get_common_comment_if_possible(PiwigoPublisher publisher) {
+ // we have to determine whether all the publishing items
+ // belong to the same event
+ Spit.Publishing.Publishable[] publishables = publisher.get_host().get_publishables();
+ string common = "";
+ bool isfirst = true;
+ if (publishables != null) {
+ foreach (Spit.Publishing.Publishable pub in publishables) {
+ string cur = pub.get_param_string(
+ Spit.Publishing.Publishable.PARAM_STRING_EVENTCOMMENT);
+ if (isfirst) {
+ common = cur;
+ isfirst = false;
+ } else {
+ if (cur != common) {
+ common = "";
+ break;
+ }
+ }
+ }
+ }
+ debug("PiwigoConnector: found common event comment %s\n", common);
+ return common;
+ }
+
+ private void create_categories_combo() {
+ foreach (Category cat in existing_categories) {
+ existing_categories_combo.append_text(cat.display_name);
+ }
+ if (existing_categories.length == 0) {
+ // if no existing categories, disable the option to choose one
+ existing_categories_combo.set_sensitive(false);
+ use_existing_radio.set_sensitive(false);
+ create_new_radio.set_active(true);
+ album_comment.set_sensitive(true);
+ album_comment_label.set_sensitive(true);
+ new_category_entry.grab_focus();
+ } else {
+ int last_category_index = find_category_index(last_category);
+ if (last_category_index < 0) {
+ existing_categories_combo.set_active(0);
+ } else {
+ existing_categories_combo.set_active(last_category_index);
+ }
+ new_category_entry.set_sensitive(false);
+ album_comment.set_sensitive(false);
+ album_comment_label.set_sensitive(false);
+ }
+ if (!category_already_exists(DEFAULT_CATEGORY_NAME))
+ new_category_entry.set_text(DEFAULT_CATEGORY_NAME);
+ }
+
+ private void create_within_categories_combo() {
+ // root menu
+ within_existing_combo.append_text("/ ");
+ foreach (Category cat in existing_categories) {
+ within_existing_combo.append_text(cat.display_name);
+ }
+ // by default select root album as target
+ within_existing_label.set_sensitive(false);
+ within_existing_combo.set_active(0);
+ within_existing_combo.set_sensitive(false);
+ }
+
+ private void create_permissions_combo() {
+ foreach (PermissionLevel perm in perm_levels) {
+ perms_combo.append_text(perm.name);
+ }
+ int last_permission_level_index = find_permission_level_index(last_permission_level);
+ if (last_permission_level_index < 0) {
+ perms_combo.set_active(0);
+ } else {
+ perms_combo.set_active(last_permission_level_index);
+ }
+ }
+
+ private void create_size_combo() {
+ foreach (SizeEntry size in photo_sizes) {
+ size_combo.append_text(size.name);
+ }
+ int last_size_index = find_size_index(last_photo_size);
+ if (last_size_index < 0) {
+ size_combo.set_active(find_size_index(ORIGINAL_SIZE));
+ } else {
+ size_combo.set_active(last_size_index);
+ }
+ }
+
+ public void on_pane_uninstalled() {
+ }
+
+ private int find_category_index(int category_id) {
+ int result = -1;
+ for(int i = 0; i < existing_categories.length; i++) {
+ if (existing_categories[i].id == category_id) {
+ result = i;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private int find_permission_level_index(int permission_level_id) {
+ int result = -1;
+ for(int i = 0; i < perm_levels.length; i++) {
+ if (perm_levels[i].id == permission_level_id) {
+ result = i;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private int find_size_index(int size_id) {
+ int result = -1;
+ for(int i = 0; i < photo_sizes.length; i++) {
+ if (photo_sizes[i].id == size_id) {
+ result = i;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private bool category_already_exists(string category_name) {
+ bool result = false;
+ foreach(Category category in existing_categories) {
+ if (category.display_name.strip() == category_name) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+}
+
+// REST support classes
+
+/**
+ * Session class that keeps track of the authentication status and of the
+ * user token pwg_id.
+ */
+internal class Session : Publishing.RESTSupport.Session {
+ private string? pwg_url = null;
+ private string? pwg_id = null;
+ private string? username = null;
+
+ public Session() {
+ base("");
+ }
+
+ public override bool is_authenticated() {
+ return (pwg_id != null && pwg_url != null && username != null);
+ }
+
+ public void authenticate(string url, string username, string id) {
+ this.pwg_url = url;
+ this.username = username;
+ this.pwg_id = id;
+ }
+
+ public void deauthenticate() {
+ pwg_url = null;
+ pwg_id = null;
+ username = null;
+ }
+
+ public string get_username() {
+ return username;
+ }
+
+ public string get_pwg_url() {
+ return pwg_url;
+ }
+
+ public string get_pwg_id() {
+ return pwg_id;
+ }
+
+ public void set_pwg_id(string id) {
+ pwg_id = id;
+ }
+}
+
+/**
+ * Generic REST transaction class.
+ *
+ * This class implements the generic logic for all REST transactions used
+ * by the Piwigo publishing plugin. In particular, it ensures that if the
+ * session has been authenticated, the pwg_id token is included in the
+ * transaction header.
+ */
+internal class Transaction : Publishing.RESTSupport.Transaction {
+ public Transaction(Session session) {
+ base(session);
+ if (session.is_authenticated()) {
+ add_header("Cookie", "pwg_id=".concat(session.get_pwg_id()));
+ }
+ }
+
+ public Transaction.authenticated(Session session) {
+ base.with_endpoint_url(session, session.get_pwg_url());
+ add_header("Cookie", "pwg_id=".concat(session.get_pwg_id()));
+ }
+
+ public static string? validate_xml(Publishing.RESTSupport.XmlDocument doc) {
+ Xml.Node* root = doc.get_root_node();
+ string? status = root->get_prop("stat");
+
+ // treat malformed root as an error condition
+ if (status == null)
+ return "No status property in root node";
+
+ if (status == "ok")
+ return null;
+
+ Xml.Node* errcode;
+ try {
+ errcode = doc.get_named_child(root, "err");
+ } catch (Spit.Publishing.PublishingError err) {
+ return "No error code specified";
+ }
+
+ return "%s (error code %s)".printf(errcode->get_prop("msg"), errcode->get_prop("code"));
+ }
+
+ public static new string? get_error_code(Publishing.RESTSupport.XmlDocument doc) {
+ Xml.Node* root = doc.get_root_node();
+ Xml.Node* errcode;
+ try {
+ errcode = doc.get_named_child(root, "err");
+ } catch (Spit.Publishing.PublishingError err) {
+ return "0";
+ }
+ return errcode->get_prop("code");
+ }
+}
+
+/**
+ * Transaction used to implement the network login interaction.
+ */
+internal class SessionLoginTransaction : Transaction {
+ public SessionLoginTransaction(Session session, string url, string username, string password) {
+ base.with_endpoint_url(session, url);
+
+ add_argument("method", "pwg.session.login");
+ add_argument("username", username);
+ add_argument("password", password);
+ }
+}
+
+/**
+ * Transaction used to implement the get status interaction.
+ */
+internal class SessionGetStatusTransaction : Transaction {
+ public SessionGetStatusTransaction.unauthenticated(Session session, string url, string pwg_id) {
+ base.with_endpoint_url(session, url);
+ add_header("Cookie", "pwg_id=".concat(session.get_pwg_id()));
+
+ add_argument("method", "pwg.session.getStatus");
+ }
+
+ public SessionGetStatusTransaction(Session session) {
+ base.authenticated(session);
+
+ add_argument("method", "pwg.session.getStatus");
+ }
+}
+
+/**
+ * Transaction used to implement the fetch categories interaction.
+ */
+private class CategoriesGetListTransaction : Transaction {
+ public CategoriesGetListTransaction(Session session) {
+ base.authenticated(session);
+
+ add_argument("method", "pwg.categories.getList");
+ add_argument("recursive", "true");
+ }
+}
+
+private class SessionLogoutTransaction : Transaction {
+ public SessionLogoutTransaction(Session session) {
+ base.authenticated(session);
+
+ add_argument("method", "pwg.session.logout");
+ }
+}
+
+private class CategoriesAddTransaction : Transaction {
+ public CategoriesAddTransaction(Session session, string category, int parent_id = 0, string? comment = "") {
+ base.authenticated(session);
+
+ add_argument("method", "pwg.categories.add");
+ add_argument("name", category);
+
+ if (parent_id != 0) {
+ add_argument("parent", parent_id.to_string());
+ }
+
+ if (comment != "") {
+ add_argument("comment", comment);
+ }
+ }
+}
+
+private class ImagesAddTransaction : Publishing.RESTSupport.UploadTransaction {
+ private PublishingParameters parameters = null;
+
+ public ImagesAddTransaction(Session session, PublishingParameters parameters, Spit.Publishing.Publishable publishable) {
+ base.with_endpoint_url(session, publishable, session.get_pwg_url());
+ if (session.is_authenticated()) {
+ add_header("Cookie", "pwg_id=".concat(session.get_pwg_id()));
+ }
+ this.parameters = parameters;
+
+ string[] keywords = publishable.get_publishing_keywords();
+ string tags = "";
+ if (keywords != null) {
+ foreach (string tag in keywords) {
+ if (!is_string_empty(tags)) {
+ tags += ",";
+ }
+ tags += tag;
+ }
+ }
+
+ debug("PiwigoConnector: Uploading photo %s to category id %d with perm level %d",
+ publishable.get_serialized_file().get_basename(),
+ parameters.category.id, parameters.perm_level.id);
+ string name = publishable.get_publishing_name();
+ string comment = publishable.get_param_string(
+ Spit.Publishing.Publishable.PARAM_STRING_COMMENT);
+ if (is_string_empty(name)) {
+ name = publishable.get_param_string(
+ Spit.Publishing.Publishable.PARAM_STRING_BASENAME);
+ add_argument("name", name);
+ if (!is_string_empty(comment)) {
+ add_argument("comment", comment);
+ }
+ } else {
+ // name is set
+ if (!is_string_empty(comment)) {
+ add_argument("name", name);
+ add_argument("comment", comment);
+ } else {
+ // name is set, comment is unset
+ // for backward compatibility with people having used
+ // the title as comment field, keep this option
+ if (parameters.title_as_comment) {
+ add_argument("comment", name);
+ } else {
+ add_argument("name", name);
+ }
+ }
+ }
+ add_argument("method", "pwg.images.addSimple");
+ add_argument("category", parameters.category.id.to_string());
+ add_argument("level", parameters.perm_level.id.to_string());
+ if (!parameters.no_upload_tags)
+ if (!is_string_empty(tags))
+ add_argument("tags", tags);
+ // TODO: update the Publishable interface so that it gives access to
+ // the image's meta-data where the author (artist) is kept
+ /*if (!is_string_empty(author))
+ add_argument("author", author);*/
+
+ // TODO: implement description in APIGlue
+ /*if (!is_string_empty(publishable.get_publishing_description()))
+ add_argument("comment", publishable.get_publishing_description());*/
+
+ GLib.HashTable<string, string> disposition_table =
+ new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
+ disposition_table.insert("filename", Soup.URI.encode(
+ publishable.get_param_string(
+ Spit.Publishing.Publishable.PARAM_STRING_BASENAME), null));
+ disposition_table.insert("name", "image");
+
+ set_binary_disposition_table(disposition_table);
+ }
+}
+
+} // namespace
+
diff --git a/plugins/shotwell-publishing/YouTubePublishing.vala b/plugins/shotwell-publishing/YouTubePublishing.vala
new file mode 100644
index 0000000..c84240b
--- /dev/null
+++ b/plugins/shotwell-publishing/YouTubePublishing.vala
@@ -0,0 +1,627 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class YouTubeService : Object, Spit.Pluggable, Spit.Publishing.Service {
+ private const string ICON_FILENAME = "youtube.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public YouTubeService(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Publishing.CURRENT_INTERFACE);
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.youtube";
+ }
+
+ public unowned string get_pluggable_name() {
+ return "YouTube";
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Jani Monoses, Lucas Beeler";
+ info.copyright = _("Copyright 2009-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
+ return new Publishing.YouTube.YouTubePublisher(this, host);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_supported_media() {
+ return Spit.Publishing.Publisher.MediaType.VIDEO;
+ }
+
+ public void activation(bool enabled) {
+ }
+}
+
+namespace Publishing.YouTube {
+
+private const string SERVICE_WELCOME_MESSAGE =
+ _("You are not currently logged into YouTube.\n\nYou must have already signed up for a Google account and set it up for use with YouTube to continue. You can set up most accounts by using your browser to log into the YouTube site at least once.");
+private const string DEVELOPER_KEY =
+ "AI39si5VEpzWK0z-pzo4fonEj9E4driCpEs9lK8y3HJsbbebIIRWqW3bIyGr42bjQv-N3siAfqVoM8XNmtbbp5x2gpbjiSAMTQ";
+
+private enum PrivacySetting {
+ PUBLIC,
+ UNLISTED,
+ PRIVATE
+}
+
+private class PublishingParameters {
+ private PrivacySetting privacy;
+ private string? channel_name;
+ private string? user_name;
+
+ public PublishingParameters() {
+ this.privacy = PrivacySetting.PRIVATE;
+ this.channel_name = null;
+ this.user_name = null;
+ }
+
+ public PrivacySetting get_privacy() {
+ return this.privacy;
+ }
+
+ public void set_privacy(PrivacySetting privacy) {
+ this.privacy = privacy;
+ }
+
+ public string? get_channel_name() {
+ return channel_name;
+ }
+
+ public void set_channel_name(string? channel_name) {
+ this.channel_name = channel_name;
+ }
+
+ public string? get_user_name() {
+ return user_name;
+ }
+
+ public void set_user_name(string? user_name) {
+ this.user_name = user_name;
+ }
+}
+
+public class YouTubePublisher : Publishing.RESTSupport.GooglePublisher {
+ private class ChannelDirectoryTransaction :
+ Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction {
+ private const string ENDPOINT_URL = "http://gdata.youtube.com/feeds/users/default";
+
+ public ChannelDirectoryTransaction(Publishing.RESTSupport.GoogleSession session) {
+ base(session, ENDPOINT_URL, Publishing.RESTSupport.HttpMethod.GET);
+ }
+
+ public static string? validate_xml(Publishing.RESTSupport.XmlDocument doc) {
+ Xml.Node* document_root = doc.get_root_node();
+ if ((document_root->name == "feed") || (document_root->name == "entry"))
+ return null;
+ else
+ return "response root node isn't a <feed> or <entry>";
+ }
+ }
+
+ private bool running;
+ private string? refresh_token;
+ private PublishingParameters publishing_parameters;
+ private Spit.Publishing.ProgressCallback? progress_reporter;
+
+ public YouTubePublisher(Spit.Publishing.Service service, Spit.Publishing.PluginHost host) {
+ base(service, host, "https://gdata.youtube.com/");
+
+ this.running = false;
+ this.refresh_token = host.get_config_string("refresh_token", null);
+ this.publishing_parameters = new PublishingParameters();
+ this.progress_reporter = null;
+ }
+
+ public override bool is_running() {
+ return running;
+ }
+
+ public override void start() {
+ debug("YouTubePublisher: started.");
+
+ if (is_running())
+ return;
+
+ running = true;
+
+ if (refresh_token == null)
+ do_show_service_welcome_pane();
+ else
+ start_oauth_flow(refresh_token);
+ }
+
+ public override void stop() {
+ debug("YouTubePublisher: stopped.");
+
+ running = false;
+
+ get_session().stop_transactions();
+ }
+
+ private string extract_channel_name_helper(Xml.Node* document_root) throws
+ Spit.Publishing.PublishingError {
+ string result = "";
+
+ Xml.Node* doc_node_iter = null;
+ if (document_root->name == "feed")
+ doc_node_iter = document_root->children;
+ else if (document_root->name == "entry")
+ doc_node_iter = document_root;
+ else
+ throw new Spit.Publishing.PublishingError.MALFORMED_RESPONSE(
+ "response root node isn't a <feed> or <entry>");
+
+ for ( ; doc_node_iter != null; doc_node_iter = doc_node_iter->next) {
+ if (doc_node_iter->name != "entry")
+ continue;
+
+ string name_val = null;
+ string url_val = null;
+ Xml.Node* channel_node_iter = doc_node_iter->children;
+ for ( ; channel_node_iter != null; channel_node_iter = channel_node_iter->next) {
+ if (channel_node_iter->name == "title") {
+ name_val = channel_node_iter->get_content();
+ } else if (channel_node_iter->name == "id") {
+ // we only want nodes in the default namespace -- the feed that we get back
+ // from Google also defines <entry> child nodes named <id> in the media
+ // namespace
+ if (channel_node_iter->ns->prefix != null)
+ continue;
+ url_val = channel_node_iter->get_content();
+ }
+ }
+
+ result = name_val;
+ break;
+ }
+
+ debug("YouTubePublisher: extracted channel name '%s' from response XML.", result);
+
+ return result;
+ }
+
+ private void on_service_welcome_login() {
+ debug("EVENT: user clicked 'Login' in welcome pane.");
+
+ if (!is_running())
+ return;
+
+ start_oauth_flow(refresh_token);
+ }
+
+ protected override void on_login_flow_complete() {
+ debug("EVENT: OAuth login flow complete.");
+
+ get_host().set_config_string("refresh_token", get_session().get_refresh_token());
+
+ publishing_parameters.set_user_name(get_session().get_user_name());
+
+ do_fetch_account_information();
+ }
+
+ private void on_initial_channel_fetch_complete(Publishing.RESTSupport.Transaction txn) {
+ txn.completed.disconnect(on_initial_channel_fetch_complete);
+ txn.network_error.disconnect(on_initial_channel_fetch_error);
+
+ debug("EVENT: finished fetching account and channel information.");
+
+ if (!is_running())
+ return;
+
+ do_parse_and_display_account_information((ChannelDirectoryTransaction) txn);
+ }
+
+ private void on_initial_channel_fetch_error(Publishing.RESTSupport.Transaction bad_txn,
+ Spit.Publishing.PublishingError err) {
+ bad_txn.completed.disconnect(on_initial_channel_fetch_complete);
+ bad_txn.network_error.disconnect(on_initial_channel_fetch_error);
+
+ debug("EVENT: fetching account and channel information failed; response = '%s'.",
+ bad_txn.get_response());
+
+ if (!is_running())
+ return;
+
+ get_host().post_error(err);
+ }
+
+ private void on_publishing_options_logout() {
+ debug("EVENT: user clicked 'Logout' in the publishing options pane.");
+
+ if (!is_running())
+ return;
+
+ do_logout();
+ }
+
+ private void on_publishing_options_publish() {
+ debug("EVENT: user clicked 'Publish' in the publishing options pane.");
+
+ if (!is_running())
+ return;
+
+ do_upload();
+ }
+
+ private void on_upload_status_updated(int file_number, double completed_fraction) {
+ debug("EVENT: uploader reports upload %.2f percent complete.", 100.0 * completed_fraction);
+
+ assert(progress_reporter != null);
+
+ if (!is_running())
+ return;
+
+ progress_reporter(file_number, completed_fraction);
+ }
+
+ private void on_upload_complete(Publishing.RESTSupport.BatchUploader uploader,
+ int num_published) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ debug("EVENT: uploader reports upload complete; %d items published.", num_published);
+
+ if (!is_running())
+ return;
+
+ do_show_success_pane();
+ }
+
+ private void on_upload_error(Publishing.RESTSupport.BatchUploader uploader,
+ Spit.Publishing.PublishingError err) {
+ uploader.upload_complete.disconnect(on_upload_complete);
+ uploader.upload_error.disconnect(on_upload_error);
+
+ if (!is_running())
+ return;
+
+ debug("EVENT: uploader reports upload error = '%s'.", err.message);
+
+ get_host().post_error(err);
+ }
+
+ private void do_show_service_welcome_pane() {
+ debug("ACTION: showing service welcome pane.");
+
+ get_host().install_welcome_pane(SERVICE_WELCOME_MESSAGE, on_service_welcome_login);
+ }
+
+ private void do_fetch_account_information() {
+ debug("ACTION: fetching channel information.");
+
+ get_host().install_account_fetch_wait_pane();
+ get_host().set_service_locked(true);
+
+ ChannelDirectoryTransaction directory_trans =
+ new ChannelDirectoryTransaction(get_session());
+ directory_trans.network_error.connect(on_initial_channel_fetch_error);
+ directory_trans.completed.connect(on_initial_channel_fetch_complete);
+
+ try {
+ directory_trans.execute();
+ } catch (Spit.Publishing.PublishingError err) {
+ on_initial_channel_fetch_error(directory_trans, err);
+ }
+ }
+
+ private void do_parse_and_display_account_information(ChannelDirectoryTransaction transaction) {
+ debug("ACTION: extracting account and channel information from body of server response");
+
+ Publishing.RESTSupport.XmlDocument response_doc;
+ try {
+ response_doc = Publishing.RESTSupport.XmlDocument.parse_string(
+ transaction.get_response(), ChannelDirectoryTransaction.validate_xml);
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ try {
+ publishing_parameters.set_channel_name(extract_channel_name_helper(
+ response_doc.get_root_node()));
+ } catch (Spit.Publishing.PublishingError err) {
+ get_host().post_error(err);
+ return;
+ }
+
+ do_show_publishing_options_pane();
+ }
+
+ private void do_show_publishing_options_pane() {
+ debug("ACTION: showing publishing options pane.");
+
+ Gtk.Builder builder = new Gtk.Builder();
+
+ try {
+ builder.add_from_file(
+ get_host().get_module_file().get_parent().get_child("youtube_publishing_options_pane.glade").get_path());
+ } catch (Error e) {
+ warning("Could not parse UI file! Error: %s.", e.message);
+ get_host().post_error(
+ new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ _("A file required for publishing is unavailable. Publishing to Youtube can't continue.")));
+ return;
+ }
+
+ PublishingOptionsPane opts_pane = new PublishingOptionsPane(get_host(), builder,
+ publishing_parameters);
+ opts_pane.publish.connect(on_publishing_options_publish);
+ opts_pane.logout.connect(on_publishing_options_logout);
+ get_host().install_dialog_pane(opts_pane);
+
+ get_host().set_service_locked(false);
+ }
+
+ private void do_upload() {
+ debug("ACTION: uploading media items to remote server.");
+
+ get_host().set_service_locked(true);
+ get_host().install_account_fetch_wait_pane();
+
+
+ progress_reporter = get_host().serialize_publishables(-1);
+
+ // Serialization is a long and potentially cancellable operation, so before we use
+ // the publishables, make sure that the publishing interaction is still running. If it
+ // isn't the publishing environment may be partially torn down so do a short-circuit
+ // return
+ if (!is_running())
+ return;
+
+ Spit.Publishing.Publishable[] publishables = get_host().get_publishables();
+ Uploader uploader = new Uploader(get_session(), publishables, publishing_parameters);
+
+ uploader.upload_complete.connect(on_upload_complete);
+ uploader.upload_error.connect(on_upload_error);
+
+ uploader.upload(on_upload_status_updated);
+ }
+
+ private void do_show_success_pane() {
+ debug("ACTION: showing success pane.");
+
+ get_host().set_service_locked(false);
+ get_host().install_success_pane();
+ }
+
+ protected override void do_logout() {
+ debug("ACTION: logging out user.");
+
+ get_session().deauthenticate();
+ refresh_token = null;
+ get_host().unset_config_key("refresh_token");
+
+
+ do_show_service_welcome_pane();
+ }
+}
+
+internal class PublishingOptionsPane : Spit.Publishing.DialogPane, GLib.Object {
+ private class PrivacyDescription {
+ public string description;
+ public PrivacySetting privacy_setting;
+
+ public PrivacyDescription(string description, PrivacySetting privacy_setting) {
+ this.description = description;
+ this.privacy_setting = privacy_setting;
+ }
+ }
+
+ public signal void publish();
+ public signal void logout();
+
+ private Gtk.Box pane_widget = null;
+ private Gtk.ComboBoxText privacy_combo = null;
+ private Gtk.Label publish_to_label = null;
+ private Gtk.Label login_identity_label = null;
+ private Gtk.Button publish_button = null;
+ private Gtk.Button logout_button = null;
+ private Gtk.Builder builder = null;
+ private Gtk.Label privacy_label = null;
+ private PrivacyDescription[] privacy_descriptions;
+ private PublishingParameters publishing_parameters;
+
+ public PublishingOptionsPane(Spit.Publishing.PluginHost host, Gtk.Builder builder,
+ PublishingParameters publishing_parameters) {
+ this.privacy_descriptions = create_privacy_descriptions();
+ this.publishing_parameters = publishing_parameters;
+
+ this.builder = builder;
+ assert(builder != null);
+ assert(builder.get_objects().length() > 0);
+
+ login_identity_label = this.builder.get_object("login_identity_label") as Gtk.Label;
+ privacy_combo = this.builder.get_object("privacy_combo") as Gtk.ComboBoxText;
+ publish_to_label = this.builder.get_object("publish_to_label") as Gtk.Label;
+ publish_button = this.builder.get_object("publish_button") as Gtk.Button;
+ logout_button = this.builder.get_object("logout_button") as Gtk.Button;
+ pane_widget = this.builder.get_object("youtube_pane_widget") as Gtk.Box;
+ privacy_label = this.builder.get_object("privacy_label") as Gtk.Label;
+
+ login_identity_label.set_label(_("You are logged into YouTube as %s.").printf(
+ publishing_parameters.get_user_name()));
+ publish_to_label.set_label(_("Videos will appear in '%s'").printf(
+ publishing_parameters.get_channel_name()));
+
+ foreach(PrivacyDescription desc in privacy_descriptions) {
+ privacy_combo.append_text(desc.description);
+ }
+
+ privacy_combo.set_active(PrivacySetting.PUBLIC);
+ privacy_label.set_mnemonic_widget(privacy_combo);
+
+ logout_button.clicked.connect(on_logout_clicked);
+ publish_button.clicked.connect(on_publish_clicked);
+ }
+
+ private void on_publish_clicked() {
+ publishing_parameters.set_privacy(
+ privacy_descriptions[privacy_combo.get_active()].privacy_setting);
+
+ publish();
+ }
+
+ private void on_logout_clicked() {
+ logout();
+ }
+
+ private void update_publish_button_sensitivity() {
+ publish_button.set_sensitive(true);
+ }
+
+ private PrivacyDescription[] create_privacy_descriptions() {
+ PrivacyDescription[] result = new PrivacyDescription[0];
+
+ result += new PrivacyDescription(_("Public listed"), PrivacySetting.PUBLIC);
+ result += new PrivacyDescription(_("Public unlisted"), PrivacySetting.UNLISTED);
+ result += new PrivacyDescription(_("Private"), PrivacySetting.PRIVATE);
+
+ return result;
+ }
+
+ public Gtk.Widget get_widget() {
+ assert (pane_widget != null);
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ update_publish_button_sensitivity();
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+internal class UploadTransaction : Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction {
+ private const string ENDPOINT_URL = "http://uploads.gdata.youtube.com/feeds/api/users/default/uploads";
+ private const string UNLISTED_XML = "<yt:accessControl action='list' permission='denied'/>";
+ private const string PRIVATE_XML = "<yt:private/>";
+ private const string METADATA_TEMPLATE ="""<?xml version='1.0'?>
+ <entry xmlns='http://www.w3.org/2005/Atom'
+ xmlns:media='http://search.yahoo.com/mrss/'
+ xmlns:yt='http://gdata.youtube.com/schemas/2007'>
+ <media:group>
+ <media:title type='plain'>%s</media:title>
+ <media:category
+ scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>People
+ </media:category>
+ %s
+ </media:group>
+ %s
+ </entry>""";
+ private PublishingParameters parameters;
+ private Publishing.RESTSupport.GoogleSession session;
+ private Spit.Publishing.Publishable publishable;
+
+ public UploadTransaction(Publishing.RESTSupport.GoogleSession session,
+ PublishingParameters parameters, Spit.Publishing.Publishable publishable) {
+ base(session, ENDPOINT_URL, Publishing.RESTSupport.HttpMethod.POST);
+ assert(session.is_authenticated());
+ this.session = session;
+ this.parameters = parameters;
+ this.publishable = publishable;
+ }
+
+ public override void execute() throws Spit.Publishing.PublishingError {
+ // create the multipart request container
+ Soup.Multipart message_parts = new Soup.Multipart("multipart/related");
+
+ string unlisted_video =
+ (parameters.get_privacy() == PrivacySetting.UNLISTED) ? UNLISTED_XML : "";
+
+ string private_video =
+ (parameters.get_privacy() == PrivacySetting.PRIVATE) ? PRIVATE_XML : "";
+
+ // Set title to publishing name, but if that's empty default to filename.
+ string title = publishable.get_publishing_name();
+ if (title == "") {
+ title = publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME);
+ }
+
+ string metadata = METADATA_TEMPLATE.printf(Publishing.RESTSupport.decimal_entity_encode(title),
+ private_video, unlisted_video);
+ Soup.Buffer metadata_buffer = new Soup.Buffer(Soup.MemoryUse.COPY, metadata.data);
+ message_parts.append_form_file("", "", "application/atom+xml", metadata_buffer);
+
+ // attempt to read the binary video data from disk
+ string video_data;
+ size_t data_length;
+ try {
+ FileUtils.get_contents(publishable.get_serialized_file().get_path(), out video_data,
+ out data_length);
+ } catch (FileError e) {
+ string msg = "YouTube: couldn't read data from %s: %s".printf(
+ publishable.get_serialized_file().get_path(), e.message);
+ warning("%s", msg);
+
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(msg);
+ }
+
+ // bind the binary video data read from disk into a Soup.Buffer object so that we
+ // can attach it to the multipart request, then actaully append the buffer
+ // to the multipart request. Then, set the MIME type for this part.
+ Soup.Buffer bindable_data = new Soup.Buffer(Soup.MemoryUse.COPY,
+ video_data.data[0:data_length]);
+
+ message_parts.append_form_file("", publishable.get_serialized_file().get_path(),
+ "video/mpeg", bindable_data);
+ // create a message that can be sent over the wire whose payload is the multipart container
+ // that we've been building up
+ Soup.Message outbound_message =
+ soup_form_request_new_from_multipart(get_endpoint_url(), message_parts);
+ outbound_message.request_headers.append("X-GData-Key", "key=%s".printf(DEVELOPER_KEY));
+ outbound_message.request_headers.append("Slug",
+ publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME));
+ outbound_message.request_headers.append("Authorization", "Bearer " +
+ session.get_access_token());
+ set_message(outbound_message);
+
+ // send the message and get its response
+ set_is_executed(true);
+ send();
+ }
+}
+
+internal class Uploader : Publishing.RESTSupport.BatchUploader {
+ private PublishingParameters parameters;
+
+ public Uploader(Publishing.RESTSupport.GoogleSession session,
+ Spit.Publishing.Publishable[] publishables, PublishingParameters parameters) {
+ base(session, publishables);
+
+ this.parameters = parameters;
+ }
+
+ protected override Publishing.RESTSupport.Transaction create_transaction(
+ Spit.Publishing.Publishable publishable) {
+ return new UploadTransaction((Publishing.RESTSupport.GoogleSession) get_session(),
+ parameters, get_current_publishable());
+ }
+}
+
+}
+
diff --git a/plugins/shotwell-publishing/facebook.png b/plugins/shotwell-publishing/facebook.png
new file mode 100644
index 0000000..384609f
--- /dev/null
+++ b/plugins/shotwell-publishing/facebook.png
Binary files differ
diff --git a/plugins/shotwell-publishing/facebook_publishing_options_pane.glade b/plugins/shotwell-publishing/facebook_publishing_options_pane.glade
new file mode 100644
index 0000000..7eb30f6
--- /dev/null
+++ b/plugins/shotwell-publishing/facebook_publishing_options_pane.glade
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="facebook_pane_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="facebook_pane_inner_box">
+ <property name="width_request">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">16</property>
+ <child>
+ <object class="GtkLabel" id="how_to_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0.30000001192092896</property>
+ <property name="ypad">16</property>
+ <property name="label" translatable="no"> (text depends on fb username and is modified in the app -
+anything put into this field won't display)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">32</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkRadioButton" id="use_existing_radio">
+ <property name="label" translatable="yes">Publish to an e_xisting album:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">create_new_radio</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="create_new_radio">
+ <property name="label" translatable="yes">Create a _new album named:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="margin_bottom">8</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="new_album_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_bottom">8</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="existing_albums_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Upload _size:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">resolution_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="resolution_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="visibility_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Videos and new photo albums _visible to:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">visibility_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="visibility_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="strip_metadata_check">
+ <property name="label" translatable="yes">_Remove location, camera, and other identifying information before uploading</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.10000000149011612</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">32</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">80</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">80</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/flickr.png b/plugins/shotwell-publishing/flickr.png
new file mode 100644
index 0000000..b6cae3e
--- /dev/null
+++ b/plugins/shotwell-publishing/flickr.png
Binary files differ
diff --git a/plugins/shotwell-publishing/flickr_pin_entry_pane.glade b/plugins/shotwell-publishing/flickr_pin_entry_pane.glade
new file mode 100644
index 0000000..e20fb38
--- /dev/null
+++ b/plugins/shotwell-publishing/flickr_pin_entry_pane.glade
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="explanatory_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">16</property>
+ <property name="margin_right">16</property>
+ <property name="margin_top">48</property>
+ <property name="margin_bottom">16</property>
+ <property name="label" translatable="yes">Enter the confirmation number which appears after you log into Flickr in your Web browser.</property>
+ <property name="angle">0.0099999997764825821</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="margin_bottom">80</property>
+ <child>
+ <object class="GtkLabel" id="pin_entry_caption">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xpad">1</property>
+ <property name="ypad">1</property>
+ <property name="label" translatable="yes">Authorization _Number:</property>
+ <property name="use_underline">True</property>
+ <property name="justify">right</property>
+ <property name="mnemonic_widget">pin_entry</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="pin_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_left">8</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="continue_button">
+ <property name="label" translatable="yes">Con_tinue</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="margin_left">240</property>
+ <property name="margin_right">240</property>
+ <property name="margin_bottom">160</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/flickr_publishing_options_pane.glade b/plugins/shotwell-publishing/flickr_publishing_options_pane.glade
new file mode 100644
index 0000000..995f2c2
--- /dev/null
+++ b/plugins/shotwell-publishing/flickr_publishing_options_pane.glade
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="flickr_pane">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">16</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="inner_wrapper">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkLabel" id="upload_info_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="no">You are logged into Flickr as (name).
+
+(this label's string is populated and set inside the code,
+so changes made here will not display)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">16</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="visibility_and_size_grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin_bottom">8</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">24</property>
+ <child>
+ <object class="GtkLabel" id="visibility_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="no">_visibility label (populated in the code)</property>
+ <property name="use_underline">True</property>
+ <property name="justify">right</property>
+ <property name="mnemonic_widget">visibility_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Photo _size:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">size_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="visibility_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="size_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="strip_metadata_check">
+ <property name="label" translatable="yes">_Remove location, camera, and other identifying information before uploading</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">center</property>
+ <property name="margin_top">16</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.17000000178813934</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">18</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="margin_bottom">8</property>
+ <property name="spacing">64</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="width_request">96</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">24</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="width_request">96</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">24</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/picasa.png b/plugins/shotwell-publishing/picasa.png
new file mode 100644
index 0000000..999be78
--- /dev/null
+++ b/plugins/shotwell-publishing/picasa.png
Binary files differ
diff --git a/plugins/shotwell-publishing/picasa_publishing_options_pane.glade b/plugins/shotwell-publishing/picasa_publishing_options_pane.glade
new file mode 100644
index 0000000..adee4d2
--- /dev/null
+++ b/plugins/shotwell-publishing/picasa_publishing_options_pane.glade
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="picasa_pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">1</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkLabel" id="login_identity_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">32</property>
+ <property name="label" translatable="no">'you are logged in as $name'
+(populated in the application code)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="album_gallery_layout_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">32</property>
+ <property name="margin_right">32</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkGrid" id="album_choice_area_grid">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_right">24</property>
+ <property name="row_spacing">8</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkComboBoxText" id="existing_albums_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="new_album_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="use_existing_radio">
+ <property name="label" translatable="yes">An _existing album:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">create_new_radio</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="create_new_radio">
+ <property name="label" translatable="yes">A _new album named:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.47999998927116394</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="public_check">
+ <property name="label" translatable="yes">L_ist album in public gallery</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="publish_to_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">32</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="no">$mediatype will appear in
+(populated in code)</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">32</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Photo _size preset:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">size_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="size_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">32</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="strip_metadata_check">
+ <property name="label" translatable="yes">_Remove location, camera, and other identifying information before uploading</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="halign">center</property>
+ <property name="margin_top">16</property>
+ <property name="hexpand">True</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.20000000298023224</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">5</property>
+ <property name="width">2</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox" id="button_area_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">112</property>
+ <property name="margin_right">112</property>
+ <property name="margin_top">48</property>
+ <property name="margin_bottom">24</property>
+ <property name="spacing">128</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/piwigo.png b/plugins/shotwell-publishing/piwigo.png
new file mode 100644
index 0000000..cf9dbc3
--- /dev/null
+++ b/plugins/shotwell-publishing/piwigo.png
Binary files differ
diff --git a/plugins/shotwell-publishing/piwigo_authentication_pane.glade b/plugins/shotwell-publishing/piwigo_authentication_pane.glade
new file mode 100644
index 0000000..367f957
--- /dev/null
+++ b/plugins/shotwell-publishing/piwigo_authentication_pane.glade
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <object class="GtkWindow" id="authentication_pane">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xscale">0.5</property>
+ <property name="yscale">0.5</property>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">30</property>
+ <property name="margin_right">30</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <object class="GtkLabel" id="message_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">label</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="field_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_URL of your Piwigo photo library</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">url_entry</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">User _name</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">username_entry</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password_entry</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="url_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="username_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="remember_password_checkbutton">
+ <property name="label" translatable="yes">_Remember Password</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">Login</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/piwigo_publishing_options_pane.glade b/plugins/shotwell-publishing/piwigo_publishing_options_pane.glade
new file mode 100644
index 0000000..7197603
--- /dev/null
+++ b/plugins/shotwell-publishing/piwigo_publishing_options_pane.glade
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkWindow" id="publishing_options_pane">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xscale">0.5</property>
+ <property name="yscale">0.5</property>
+ <child>
+ <object class="GtkBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">10</property>
+ <property name="margin_right">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Photos will appear in:</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkTable" id="field_table">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">7</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkRadioButton" id="use_existing_radio">
+ <property name="label" translatable="yes">An _existing category:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">1</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="create_new_radio">
+ <property name="label" translatable="yes">A _new album named:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">1</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">use_existing_radio</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="existing_categories_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="new_category_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="within_existing_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">Photos will be _visible by:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">perms_combo</property>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="perms_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">Photo size:</property>
+ </object>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="size_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="within_existing_label">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">within category:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="album_comment_scroll">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="album_comment">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="album_comment_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">Album comment:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="strip_metadata_check">
+ <property name="label" translatable="yes">_Remove location, camera, and other identifying information before uploading</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="title_as_comment_check">
+ <property name="label" translatable="yes">_If a title is set and comment unset, use title as comment</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="no_upload_tags_check">
+ <property name="label" translatable="yes">_Do no upload tags</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">Logout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">Publish</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-publishing/shotwell-publishing.vala b/plugins/shotwell-publishing/shotwell-publishing.vala
new file mode 100644
index 0000000..f9f2080
--- /dev/null
+++ b/plugins/shotwell-publishing/shotwell-publishing.vala
@@ -0,0 +1,50 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern const string _VERSION;
+
+// "core services" are: Facebook, Flickr, Picasa Web Albums, Piwigo and YouTube
+private class ShotwellPublishingCoreServices : Object, Spit.Module {
+ private Spit.Pluggable[] pluggables = new Spit.Pluggable[0];
+
+ // we need to get a module file handle because our pluggables have to load resources from the
+ // module file directory
+ public ShotwellPublishingCoreServices(GLib.File module_file) {
+ GLib.File resource_directory = module_file.get_parent();
+
+ pluggables += new FacebookService(resource_directory);
+ pluggables += new PicasaService(resource_directory);
+ pluggables += new FlickrService(resource_directory);
+ pluggables += new YouTubeService(resource_directory);
+ pluggables += new PiwigoService(resource_directory);
+ }
+
+ public unowned string get_module_name() {
+ return _("Core Publishing Services");
+ }
+
+ public unowned string get_version() {
+ return _VERSION;
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.publishing.core_services";
+ }
+
+ public unowned Spit.Pluggable[]? get_pluggables() {
+ return pluggables;
+ }
+}
+
+// This entry point is required for all SPIT modules.
+public Spit.Module? spit_entry_point(Spit.EntryPointParams *params) {
+ params->module_spit_interface = Spit.negotiate_interfaces(params->host_min_spit_interface,
+ params->host_max_spit_interface, Spit.CURRENT_INTERFACE);
+
+ return (params->module_spit_interface != Spit.UNSUPPORTED_INTERFACE)
+ ? new ShotwellPublishingCoreServices(params->module_file) : null;
+}
+
diff --git a/plugins/shotwell-publishing/youtube.png b/plugins/shotwell-publishing/youtube.png
new file mode 100644
index 0000000..214e1de
--- /dev/null
+++ b/plugins/shotwell-publishing/youtube.png
Binary files differ
diff --git a/plugins/shotwell-publishing/youtube_publishing_options_pane.glade b/plugins/shotwell-publishing/youtube_publishing_options_pane.glade
new file mode 100644
index 0000000..cdf82af
--- /dev/null
+++ b/plugins/shotwell-publishing/youtube_publishing_options_pane.glade
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkBox" id="youtube_pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">1</property>
+ <child>
+ <object class="GtkLabel" id="login_identity_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">24</property>
+ <property name="margin_bottom">32</property>
+ <property name="label" comments="This string is altered in the code, so it's safe to ignore it during translation.">'you are logged in as $name'
+(populated in the application code)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="publish_to_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">8</property>
+ <property name="margin_bottom">64</property>
+ <property name="label" comments="This string does not require translation and may be safely skipped.">videos will appear in
+(populated in the application code.)</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">40</property>
+ <property name="margin_right">40</property>
+ <property name="margin_top">16</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">16</property>
+ <property name="margin_right">16</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">Video privacy _setting:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="privacy_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">16</property>
+ <property name="margin_right">32</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="button_area_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">112</property>
+ <property name="margin_right">112</property>
+ <property name="margin_top">48</property>
+ <property name="margin_bottom">24</property>
+ <property name="spacing">128</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkButton" id="logout_button">
+ <property name="label" translatable="yes">_Logout</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="publish_button">
+ <property name="label" translatable="yes">_Publish</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/plugins/shotwell-transitions/BlindsEffect.vala b/plugins/shotwell-transitions/BlindsEffect.vala
new file mode 100644
index 0000000..6fdcf18
--- /dev/null
+++ b/plugins/shotwell-transitions/BlindsEffect.vala
@@ -0,0 +1,96 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class BlindsEffectDescriptor : ShotwellTransitionDescriptor {
+ public BlindsEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.blinds";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Blinds");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new BlindsEffect();
+ }
+}
+
+private class BlindsEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 30;
+ private const int MIN_FPS = 15;
+
+ private const int BLIND_WIDTH = 50;
+ private int current_blind_width;
+
+ private Cairo.ImageSurface[] to_blinds;
+ private int blind_count;
+
+ public BlindsEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = BlindsEffect.DESIRED_FPS;
+ min_fps = BlindsEffect.MIN_FPS;
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ if (visuals.from_pixbuf != null) {
+ blind_count = visuals.to_pixbuf.width / BLIND_WIDTH;
+ current_blind_width =
+ (int) Math.ceil((double) visuals.to_pixbuf.width / (double) blind_count);
+
+ to_blinds = new Cairo.ImageSurface[blind_count];
+
+ for (int i = 0; i < blind_count; ++i) {
+ to_blinds[i] = new Cairo.ImageSurface(Cairo.Format.RGB24, current_blind_width,
+ visuals.to_pixbuf.height);
+ Cairo.Context ctx = new Cairo.Context(to_blinds[i]);
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf, -i * current_blind_width, 0);
+ ctx.paint();
+ }
+ }
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ int y = visuals.to_pos.y;
+ int x = visuals.to_pos.x;
+
+ if (visuals.from_pixbuf != null){
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha * 2);
+ }
+
+ for (int i = 0; i < blind_count; ++i) {
+ ctx.set_source_surface(to_blinds[i], x + i * current_blind_width, y);
+ ctx.rectangle(x + i * current_blind_width, y, current_blind_width * (alpha + 0.5),
+ visuals.to_pixbuf.height);
+ ctx.fill();
+ }
+
+ ctx.clip();
+ ctx.paint();
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
diff --git a/plugins/shotwell-transitions/ChessEffect.vala b/plugins/shotwell-transitions/ChessEffect.vala
new file mode 100644
index 0000000..37c9fd2
--- /dev/null
+++ b/plugins/shotwell-transitions/ChessEffect.vala
@@ -0,0 +1,88 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class ChessEffectDescriptor : ShotwellTransitionDescriptor {
+ public ChessEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.chess";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Chess");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new ChessEffect();
+ }
+}
+
+private class ChessEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 10;
+ private const int SQUARE_SIZE = 100;
+ private double square_count_x;
+ private double square_count_y;
+
+ public ChessEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = ChessEffect.DESIRED_FPS;
+ min_fps = ChessEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ square_count_y = visuals.to_pos.height / SQUARE_SIZE + 2;
+ square_count_x = visuals.to_pos.width / SQUARE_SIZE + 2;
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ double size = 2 * alpha * SQUARE_SIZE;
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+ for (double y = 0; y <= square_count_y; y++) {
+ for (double x = 0; x <= square_count_x; x++) {
+ double translation = (x+y) % 2 == 0 ? -1.5 * SQUARE_SIZE : 1.5 * SQUARE_SIZE;
+ if (motion.direction == Transitions.Direction.FORWARD) {
+ ctx.rectangle(visuals.to_pos.x + translation + x * SQUARE_SIZE,
+ visuals.to_pos.y + y * SQUARE_SIZE, size, SQUARE_SIZE);
+ } else {
+ ctx.rectangle(visuals.to_pos.x + visuals.to_pos.width + translation - x
+ * SQUARE_SIZE - size, visuals.to_pos.y + y * SQUARE_SIZE, size,
+ SQUARE_SIZE);
+ }
+ }
+ }
+
+ ctx.clip();
+ ctx.paint_with_alpha(alpha);
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
diff --git a/plugins/shotwell-transitions/CircleEffect.vala b/plugins/shotwell-transitions/CircleEffect.vala
new file mode 100644
index 0000000..11e7631
--- /dev/null
+++ b/plugins/shotwell-transitions/CircleEffect.vala
@@ -0,0 +1,71 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class CircleEffectDescriptor : ShotwellTransitionDescriptor {
+ public CircleEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.circle";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Circle");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new CircleEffect();
+ }
+}
+
+private class CircleEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 15;
+
+ public CircleEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = CircleEffect.DESIRED_FPS;
+ min_fps = CircleEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ int radius = (int)((alpha) * Math.fmax(width,height));
+
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+ ctx.arc ((int) width / 2, (int) height / 2, radius, 0, 2 * Math.PI);
+ ctx.clip();
+ ctx.paint();
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
diff --git a/plugins/shotwell-transitions/CirclesEffect.vala b/plugins/shotwell-transitions/CirclesEffect.vala
new file mode 100644
index 0000000..b01e06f
--- /dev/null
+++ b/plugins/shotwell-transitions/CirclesEffect.vala
@@ -0,0 +1,86 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class CirclesEffectDescriptor : ShotwellTransitionDescriptor {
+ public CirclesEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.circles";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Circles");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new CirclesEffect();
+ }
+}
+
+private class CirclesEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 15;
+ private const double SPEED = 2.5;
+
+ public CirclesEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = CirclesEffect.DESIRED_FPS;
+ min_fps = CirclesEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ int distance = 60, radius;
+ int circleCountX = width / (2 * distance);
+ int circleCountY = height / distance;
+ double maxRadius = SPEED * distance;
+
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+
+ for(int y = 0; y <= circleCountY; y++){
+ for(int x = 0; x <= circleCountX; x++){
+ radius = (int) (Math.fmax(0,Math.fmin(1, alpha-((double) (x + y)/(double)
+ ((circleCountY + circleCountX) * SPEED)))) * maxRadius);
+ ctx.arc(2 * distance * x, 2 * distance * y, radius, 0, 2 * Math.PI);
+ ctx.fill();
+ }
+ }
+
+ ctx.clip();
+ ctx.paint_with_alpha(alpha);
+ }
+
+
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
diff --git a/plugins/shotwell-transitions/ClockEffect.vala b/plugins/shotwell-transitions/ClockEffect.vala
new file mode 100644
index 0000000..78b39a6
--- /dev/null
+++ b/plugins/shotwell-transitions/ClockEffect.vala
@@ -0,0 +1,83 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class ClockEffectDescriptor : ShotwellTransitionDescriptor {
+ public ClockEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.clock";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Clock");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new ClockEffect();
+ }
+}
+
+private class ClockEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 15;
+ private const double TOP_RADIANT = 0.5 * Math.PI;
+
+ public ClockEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = ClockEffect.DESIRED_FPS;
+ min_fps = ClockEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ double start_angle = -TOP_RADIANT, stop_angle = -TOP_RADIANT;
+
+ if (motion.direction == Transitions.Direction.FORWARD)
+ stop_angle = alpha*Math.PI * 2 - TOP_RADIANT;
+ else
+ start_angle = (2 * (1-alpha)) * Math.PI - TOP_RADIANT;
+
+ int radius = (int) Math.fmax(visuals.to_pos.width, visuals.to_pos.height);
+
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+
+ int x = visuals.to_pos.x + (int) visuals.to_pos.width / 2;
+ int y = visuals.to_pos.y + (int) visuals.to_pos.height / 2;
+
+ ctx.move_to(x, y);
+ ctx.arc (x, y, radius, start_angle, stop_angle);
+ ctx.fill_preserve();
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
diff --git a/plugins/shotwell-transitions/CrumbleEffect.vala b/plugins/shotwell-transitions/CrumbleEffect.vala
new file mode 100644
index 0000000..a458811
--- /dev/null
+++ b/plugins/shotwell-transitions/CrumbleEffect.vala
@@ -0,0 +1,103 @@
+/* Copyright 2010 Maxim Kartashev
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class CrumbleEffectDescriptor : ShotwellTransitionDescriptor {
+ public CrumbleEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.crumble";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Crumble");
+ }
+
+ public override Transitions.Effect create(Spit.HostInterface host) {
+ return new CrumbleEffect();
+ }
+}
+
+private class CrumbleEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 15;
+
+ private const int STRIPE_WIDTH = 10;
+
+ private Cairo.ImageSurface[] from_stripes;
+ private double[] accelerations;
+ private int stripes_count;
+
+ public CrumbleEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = CrumbleEffect.DESIRED_FPS;
+ min_fps = CrumbleEffect.MIN_FPS;
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ Rand rand = new Rand();
+
+ // Cut original image into stripes of STRIPE_WIDTH width; also prepare
+ // acceleration for each stripe.
+ if (visuals.from_pixbuf != null) {
+ stripes_count = visuals.from_pixbuf.width / STRIPE_WIDTH;
+ from_stripes = new Cairo.ImageSurface[stripes_count];
+ accelerations = new double[stripes_count];
+ for (int i = 0; i < stripes_count; ++i) {
+ from_stripes[i] = new Cairo.ImageSurface(Cairo.Format.RGB24, STRIPE_WIDTH,
+ visuals.from_pixbuf.height);
+ Cairo.Context ctx = new Cairo.Context(from_stripes[i]);
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, - i * STRIPE_WIDTH, 0);
+ ctx.paint();
+ accelerations[i] = rand.next_double();
+ }
+ }
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+
+ if (alpha < 0.5) {
+ // First part: draw stripes that go down with pre-calculated acceleration
+ alpha = alpha * 2; // stretch alpha to [0, 1]
+
+ // tear down from_pixbuf first
+ for (int i = 0; i < stripes_count; ++i) {
+ int x = visuals.from_pos.x + i * STRIPE_WIDTH;
+ double a = alpha + alpha * accelerations[i];
+ int y = visuals.from_pos.y + (int) (visuals.from_pixbuf.height * a * a);
+
+ ctx.set_source_surface(from_stripes[i], x, y);
+ ctx.paint();
+ }
+ } else if (visuals.to_pixbuf != null) {
+ // Second part: fade in next image ("to_pixbuf")
+ alpha = (alpha - 0.5) * 2; // stretch alpha to [0, 1]
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf, visuals.to_pos.x, visuals.to_pos.y);
+ ctx.paint_with_alpha(alpha);
+ } else {
+ // TODO: fade in background color
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+
diff --git a/plugins/shotwell-transitions/FadeEffect.vala b/plugins/shotwell-transitions/FadeEffect.vala
new file mode 100644
index 0000000..efe1d74
--- /dev/null
+++ b/plugins/shotwell-transitions/FadeEffect.vala
@@ -0,0 +1,70 @@
+/* Copyright 2010 Maxim Kartashev
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class FadeEffectDescriptor : ShotwellTransitionDescriptor {
+ public FadeEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.fade";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Fade");
+ }
+
+ public override Transitions.Effect create(Spit.HostInterface host) {
+ return new FadeEffect();
+ }
+}
+
+private class FadeEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 30;
+ private const int MIN_FPS = 20;
+
+ public FadeEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = FadeEffect.DESIRED_FPS;
+ min_fps = FadeEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+
+ // blend the two pixbufs using an alpha of the appropriate level depending on how far
+ // the cycle has progressed
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x, visuals.from_pos.y);
+ ctx.paint_with_alpha(1.0 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf, visuals.to_pos.x, visuals.to_pos.y);
+ ctx.paint_with_alpha(alpha);
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+
diff --git a/plugins/shotwell-transitions/Makefile b/plugins/shotwell-transitions/Makefile
new file mode 100644
index 0000000..043891c
--- /dev/null
+++ b/plugins/shotwell-transitions/Makefile
@@ -0,0 +1,21 @@
+
+PLUGIN := shotwell-transitions
+
+SRC_FILES := \
+ shotwell-transitions.vala \
+ FadeEffect.vala \
+ SlideEffect.vala \
+ CrumbleEffect.vala \
+ BlindsEffect.vala \
+ CircleEffect.vala \
+ CirclesEffect.vala \
+ SquaresEffect.vala \
+ StripesEffect.vala \
+ ChessEffect.vala \
+ ClockEffect.vala
+
+RC_FILES := \
+ slideshow-plugin.png
+
+include ../Makefile.plugin.mk
+
diff --git a/plugins/shotwell-transitions/SlideEffect.vala b/plugins/shotwell-transitions/SlideEffect.vala
new file mode 100644
index 0000000..1019f62
--- /dev/null
+++ b/plugins/shotwell-transitions/SlideEffect.vala
@@ -0,0 +1,75 @@
+/* Copyright 2010 Maxim Kartashev
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class SlideEffectDescriptor : ShotwellTransitionDescriptor {
+ public SlideEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.slide";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Slide");
+ }
+
+ public override Transitions.Effect create(Spit.HostInterface host) {
+ return new SlideEffect();
+ }
+}
+
+private class SlideEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 15;
+
+ public SlideEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = SlideEffect.DESIRED_FPS;
+ min_fps = SlideEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+
+ if (visuals.from_pixbuf != null) {
+ int from_target_x = (motion.direction == Transitions.Direction.FORWARD)
+ ? -visuals.from_pixbuf.width : width;
+ int from_current_x = (int) (visuals.from_pos.x * (1 - alpha) + from_target_x * alpha);
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, from_current_x, visuals.from_pos.y);
+ ctx.paint();
+ }
+
+ if (visuals.to_pixbuf != null) {
+ int to_target_x = (width - visuals.to_pixbuf.width) / 2;
+ int from_x = (motion.direction == Transitions.Direction.FORWARD)
+ ? width : -visuals.to_pixbuf.width;
+ int to_current_x = (int) (from_x * (1 - alpha) + to_target_x * alpha);
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf, to_current_x, visuals.to_pos.y);
+ ctx.paint();
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+
diff --git a/plugins/shotwell-transitions/SquaresEffect.vala b/plugins/shotwell-transitions/SquaresEffect.vala
new file mode 100644
index 0000000..c5a0163
--- /dev/null
+++ b/plugins/shotwell-transitions/SquaresEffect.vala
@@ -0,0 +1,86 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class SquaresEffectDescriptor : ShotwellTransitionDescriptor {
+ public SquaresEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.squares";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Squares");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new SquaresEffect();
+ }
+}
+
+private class SquaresEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 10;
+ private const int SQUARE_SIZE = 100;
+ private double square_count_x;
+ private double square_count_y;
+
+ public SquaresEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = SquaresEffect.DESIRED_FPS;
+ min_fps = SquaresEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ square_count_x = visuals.to_pos.width/SQUARE_SIZE + 1;
+ square_count_y = visuals.to_pos.height/SQUARE_SIZE + 1;
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - alpha);
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+ for (double y = 0; y<=square_count_y; y++) {
+ for (double x = 0; x <=square_count_x; x++) {
+ double size = SQUARE_SIZE * (Math.fmin(1, alpha + ((square_count_x - x)
+ / square_count_x + (square_count_y - y)/square_count_y)/2.5));
+
+ ctx.rectangle(visuals.to_pos.x + x * SQUARE_SIZE, visuals.to_pos.y + y
+ * SQUARE_SIZE, size, size);
+
+ ctx.fill();
+ }
+ }
+
+ ctx.clip();
+ ctx.paint_with_alpha(alpha);
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+
diff --git a/plugins/shotwell-transitions/StripesEffect.vala b/plugins/shotwell-transitions/StripesEffect.vala
new file mode 100644
index 0000000..2edbdfe
--- /dev/null
+++ b/plugins/shotwell-transitions/StripesEffect.vala
@@ -0,0 +1,84 @@
+/* Copyright 2013 Jens Bav
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+using Spit;
+
+private class StripesEffectDescriptor : ShotwellTransitionDescriptor {
+ public StripesEffectDescriptor(GLib.File resource_directory) {
+ base(resource_directory);
+ }
+
+ public override unowned string get_id() {
+ return "org.yorba.shotwell.transitions.stripes";
+ }
+
+ public override unowned string get_pluggable_name() {
+ return _("Stripes");
+ }
+
+ public override Transitions.Effect create(HostInterface host) {
+ return new StripesEffect();
+ }
+}
+
+private class StripesEffect : Object, Transitions.Effect {
+ private const int DESIRED_FPS = 25;
+ private const int MIN_FPS = 10;
+ private const int STRIPE_HEIGHT = 100;
+ private int stripe_count;
+
+ public StripesEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = StripesEffect.DESIRED_FPS;
+ min_fps = StripesEffect.MIN_FPS;
+ }
+
+ public void start(Transitions.Visuals visuals, Transitions.Motion motion) {
+ stripe_count = visuals.to_pos.height / STRIPE_HEIGHT + 1;
+ }
+
+ public bool needs_clear_background() {
+ return true;
+ }
+
+ public void paint(Transitions.Visuals visuals, Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ double alpha = motion.get_alpha(frame_number);
+ if (visuals.from_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.from_pixbuf, visuals.from_pos.x,
+ visuals.from_pos.y);
+ ctx.paint_with_alpha(1 - Math.fmin(1, alpha * 2));
+ }
+
+ if (visuals.to_pixbuf != null) {
+ Gdk.cairo_set_source_pixbuf(ctx, visuals.to_pixbuf,visuals.to_pos.x, visuals.to_pos.y);
+ int x = visuals.to_pos.x;
+ int y = visuals.to_pos.y;
+ for (int i = 0; i <= stripe_count; i++) {
+ if (i % 2 == motion.direction) {
+ ctx.rectangle(x + visuals.to_pos.width - alpha * visuals.to_pos.width,
+ y + i * STRIPE_HEIGHT, x + visuals.to_pos.width, STRIPE_HEIGHT);
+ } else {
+ ctx.rectangle(x, y + STRIPE_HEIGHT * i, visuals.to_pos.width * alpha,
+ STRIPE_HEIGHT);
+ }
+ }
+
+ ctx.clip();
+ ctx.paint_with_alpha(alpha);
+ }
+ }
+
+ public void advance(Transitions.Visuals visuals, Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+
diff --git a/plugins/shotwell-transitions/shotwell-transitions.vala b/plugins/shotwell-transitions/shotwell-transitions.vala
new file mode 100644
index 0000000..bd358c3
--- /dev/null
+++ b/plugins/shotwell-transitions/shotwell-transitions.vala
@@ -0,0 +1,90 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern const string _VERSION;
+
+private class ShotwellTransitions : Object, Spit.Module {
+ private Spit.Pluggable[] pluggables = new Spit.Pluggable[0];
+
+ public ShotwellTransitions(GLib.File module_file) {
+ GLib.File resource_directory = module_file.get_parent();
+
+ pluggables += new FadeEffectDescriptor(resource_directory);
+ pluggables += new SlideEffectDescriptor(resource_directory);
+ pluggables += new CrumbleEffectDescriptor(resource_directory);
+ pluggables += new BlindsEffectDescriptor(resource_directory);
+ pluggables += new CircleEffectDescriptor(resource_directory);
+ pluggables += new CirclesEffectDescriptor(resource_directory);
+ pluggables += new ClockEffectDescriptor(resource_directory);
+ pluggables += new SquaresEffectDescriptor(resource_directory);
+ pluggables += new ChessEffectDescriptor(resource_directory);
+ pluggables += new StripesEffectDescriptor(resource_directory);
+ }
+
+ public unowned string get_module_name() {
+ return _("Core Slideshow Transitions");
+ }
+
+ public unowned string get_version() {
+ return _VERSION;
+ }
+
+ public unowned string get_id() {
+ return "org.yorba.shotwell.transitions";
+ }
+
+ public unowned Spit.Pluggable[]? get_pluggables() {
+ return pluggables;
+ }
+}
+
+// This entry point is required for all SPIT modules.
+public Spit.Module? spit_entry_point(Spit.EntryPointParams *params) {
+ params->module_spit_interface = Spit.negotiate_interfaces(params->host_min_spit_interface,
+ params->host_max_spit_interface, Spit.CURRENT_INTERFACE);
+
+ return (params->module_spit_interface != Spit.UNSUPPORTED_INTERFACE)
+ ? new ShotwellTransitions(params->module_file) : null;
+}
+
+// Base class for all transition descriptors in this module
+public abstract class ShotwellTransitionDescriptor : Object, Spit.Pluggable, Spit.Transitions.Descriptor {
+ private const string ICON_FILENAME = "slideshow-plugin.png";
+
+ private static Gdk.Pixbuf[] icon_pixbuf_set = null;
+
+ public ShotwellTransitionDescriptor(GLib.File resource_directory) {
+ if (icon_pixbuf_set == null)
+ icon_pixbuf_set = Resources.load_icon_set(resource_directory.get_child(ICON_FILENAME));
+ }
+
+ public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
+ return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
+ Spit.Transitions.CURRENT_INTERFACE);
+ }
+
+ public abstract unowned string get_id();
+
+ public abstract unowned string get_pluggable_name();
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ info.authors = "Maxim Kartashev";
+ info.copyright = _("Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation");
+ info.translators = Resources.TRANSLATORS;
+ info.version = _VERSION;
+ info.website_name = Resources.WEBSITE_NAME;
+ info.website_url = Resources.WEBSITE_URL;
+ info.is_license_wordwrapped = false;
+ info.license = Resources.LICENSE;
+ info.icons = icon_pixbuf_set;
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public abstract Spit.Transitions.Effect create(Spit.HostInterface host);
+}
+
diff --git a/plugins/shotwell-transitions/slideshow-plugin.png b/plugins/shotwell-transitions/slideshow-plugin.png
new file mode 100755
index 0000000..cb4a497
--- /dev/null
+++ b/plugins/shotwell-transitions/slideshow-plugin.png
Binary files differ
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..08bb238
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,62 @@
+af
+ar
+as
+ast
+bg
+bn
+bn_IN
+ca
+cs
+da
+de
+el
+en_GB
+eo
+es
+et
+eu
+fi
+fr
+gl
+gu
+he
+hi
+hr
+hu
+ia
+id
+it
+ja
+kk
+km
+kn
+ko
+ky
+lt
+lv
+mk
+ml
+mr
+nb
+nl
+nn
+or
+pa
+pl
+pt
+pt_BR
+ro
+ru
+sk
+sl
+sr
+sv
+ta
+te
+th
+tr
+uk
+vi
+zh_CN
+zh_HK
+zh_TW
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..807e53c
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,222 @@
+[encoding: UTF-8]
+plugins/common/RESTSupport.vala
+plugins/common/Resources.vala
+plugins/common/SqliteSupport.vala
+plugins/common/VersionNumber.vala
+plugins/shotwell-data-imports/FSpotDatabase.vala
+plugins/shotwell-data-imports/FSpotDatabaseBehavior.vala
+plugins/shotwell-data-imports/FSpotDatabaseTable.vala
+plugins/shotwell-data-imports/FSpotImporter.vala
+plugins/shotwell-data-imports/FSpotMetaTable.vala
+plugins/shotwell-data-imports/FSpotPhotoTagsTable.vala
+plugins/shotwell-data-imports/FSpotPhotoVersionsTable.vala
+plugins/shotwell-data-imports/FSpotPhotosTable.vala
+plugins/shotwell-data-imports/FSpotRollsTable.vala
+plugins/shotwell-data-imports/FSpotTableBehavior.vala
+plugins/shotwell-data-imports/FSpotTagsTable.vala
+plugins/shotwell-data-imports/shotwell-data-imports.vala
+plugins/shotwell-publishing-extras/TumblrPublishing.vala
+plugins/shotwell-publishing-extras/YandexPublishing.vala
+plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala
+[type: gettext/glade]plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing-extras/yandex_publish_model.glade
+plugins/shotwell-publishing/FacebookPublishing.vala
+plugins/shotwell-publishing/FlickrPublishing.vala
+plugins/shotwell-publishing/PicasaPublishing.vala
+plugins/shotwell-publishing/PiwigoPublishing.vala
+plugins/shotwell-publishing/YouTubePublishing.vala
+[type: gettext/glade]plugins/shotwell-publishing/facebook_publishing_options_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing/flickr_pin_entry_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing/flickr_publishing_options_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing/picasa_publishing_options_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing/piwigo_authentication_pane.glade
+[type: gettext/glade]plugins/shotwell-publishing/piwigo_publishing_options_pane.glade
+plugins/shotwell-publishing/shotwell-publishing.vala
+[type: gettext/glade]plugins/shotwell-publishing/youtube_publishing_options_pane.glade
+plugins/shotwell-transitions/BlindsEffect.vala
+plugins/shotwell-transitions/ChessEffect.vala
+plugins/shotwell-transitions/CircleEffect.vala
+plugins/shotwell-transitions/CirclesEffect.vala
+plugins/shotwell-transitions/ClockEffect.vala
+plugins/shotwell-transitions/CrumbleEffect.vala
+plugins/shotwell-transitions/FadeEffect.vala
+plugins/shotwell-transitions/SlideEffect.vala
+plugins/shotwell-transitions/SquaresEffect.vala
+plugins/shotwell-transitions/StripesEffect.vala
+plugins/shotwell-transitions/shotwell-transitions.vala
+src/AppDirs.vala
+src/AppWindow.vala
+src/Application.vala
+src/BatchImport.vala
+src/Box.vala
+src/CheckerboardLayout.vala
+src/CollectionPage.vala
+src/ColorTransformation.vala
+src/CommandManager.vala
+src/Commands.vala
+src/CustomComponents.vala
+src/Debug.vala
+src/DesktopIntegration.vala
+src/Dialogs.vala
+src/Dimensions.vala
+src/DirectoryMonitor.vala
+src/Event.vala
+src/Exporter.vala
+src/International.vala
+src/LibraryFiles.vala
+src/LibraryMonitor.vala
+src/MediaDataRepresentation.vala
+src/MediaInterfaces.vala
+src/MediaMetadata.vala
+src/MediaMonitor.vala
+src/MediaPage.vala
+src/MediaViewTracker.vala
+src/MetadataWriter.vala
+src/Orientation.vala
+src/Page.vala
+src/Photo.vala
+src/PhotoMonitor.vala
+src/PhotoPage.vala
+src/PixbufCache.vala
+src/Printing.vala
+src/Properties.vala
+src/Resources.vala
+src/Screensaver.vala
+src/SearchFilter.vala
+src/SlideshowPage.vala
+src/SortedList.vala
+src/Tag.vala
+src/Thumbnail.vala
+src/ThumbnailCache.vala
+src/TimedQueue.vala
+src/Tombstone.vala
+src/UnityProgressBar.vala
+src/Upgrades.vala
+src/VideoMetadata.vala
+src/VideoMonitor.vala
+src/VideoSupport.vala
+src/camera/Branch.vala
+src/camera/Camera.vala
+src/camera/CameraTable.vala
+src/camera/GPhoto.vala
+src/camera/ImportPage.vala
+src/config/Config.vala
+src/config/ConfigurationInterfaces.vala
+src/config/GSettingsEngine.vala
+src/core/Alteration.vala
+src/core/ContainerSourceCollection.vala
+src/core/Core.vala
+src/core/DataCollection.vala
+src/core/DataObject.vala
+src/core/DataSet.vala
+src/core/DataSource.vala
+src/core/DataSourceTypes.vala
+src/core/DataView.vala
+src/core/DataViewTypes.vala
+src/core/DatabaseSourceCollection.vala
+src/core/SourceCollection.vala
+src/core/SourceHoldingTank.vala
+src/core/SourceInterfaces.vala
+src/core/Tracker.vala
+src/core/ViewCollection.vala
+src/core/util.vala
+src/data_imports/DataImportJob.vala
+src/data_imports/DataImportSource.vala
+src/data_imports/DataImports.vala
+src/data_imports/DataImportsPluginHost.vala
+src/data_imports/DataImportsUI.vala
+src/db/DatabaseTable.vala
+src/db/Db.vala
+src/db/EventTable.vala
+src/db/PhotoTable.vala
+src/db/SavedSearchDBTable.vala
+src/db/TagTable.vala
+src/db/TombstoneTable.vala
+src/db/VersionTable.vala
+src/db/VideoTable.vala
+src/direct/Direct.vala
+src/direct/DirectPhoto.vala
+src/direct/DirectPhotoPage.vala
+src/direct/DirectView.vala
+src/direct/DirectWindow.vala
+src/editing_tools/EditingTools.vala
+src/editing_tools/StraightenTool.vala
+src/events/Branch.vala
+src/events/EventDirectoryItem.vala
+src/events/EventPage.vala
+src/events/Events.vala
+src/events/EventsDirectoryPage.vala
+src/folders/Branch.vala
+src/folders/Folders.vala
+src/folders/Page.vala
+src/library/Branch.vala
+src/library/FlaggedBranch.vala
+src/library/FlaggedPage.vala
+src/library/ImportQueueBranch.vala
+src/library/ImportQueuePage.vala
+src/library/LastImportBranch.vala
+src/library/LastImportPage.vala
+src/library/Library.vala
+src/library/LibraryWindow.vala
+src/library/OfflineBranch.vala
+src/library/OfflinePage.vala
+src/library/TrashBranch.vala
+src/library/TrashPage.vala
+src/main.vala
+src/photos/BmpSupport.vala
+src/photos/GRaw.vala
+src/photos/GdkSupport.vala
+src/photos/JfifSupport.vala
+src/photos/PhotoFileAdapter.vala
+src/photos/PhotoFileFormat.vala
+src/photos/PhotoFileSniffer.vala
+src/photos/PhotoMetadata.vala
+src/photos/Photos.vala
+src/photos/PngSupport.vala
+src/photos/RawSupport.vala
+src/photos/TiffSupport.vala
+src/plugins/DataImportsInterfaces.vala
+src/plugins/ManifestWidget.vala
+src/plugins/Plugins.vala
+src/plugins/PublishingInterfaces.vala
+src/plugins/SpitInterfaces.vala
+src/plugins/StandardHostInterface.vala
+src/plugins/TransitionsInterfaces.vala
+src/publishing/APIGlue.vala
+src/publishing/Publishing.vala
+src/publishing/PublishingPluginHost.vala
+src/publishing/PublishingUI.vala
+src/searches/Branch.vala
+src/searches/SavedSearchDialog.vala
+src/searches/SavedSearchPage.vala
+src/searches/SearchBoolean.vala
+src/searches/Searches.vala
+src/sidebar/Branch.vala
+src/sidebar/Entry.vala
+src/sidebar/Sidebar.vala
+src/sidebar/Tree.vala
+src/sidebar/common.vala
+src/slideshow/Slideshow.vala
+src/slideshow/TransitionEffects.vala
+src/tags/Branch.vala
+src/tags/HierarchicalTagIndex.vala
+src/tags/HierarchicalTagUtilities.vala
+src/tags/TagPage.vala
+src/tags/Tags.vala
+src/threads/BackgroundJob.vala
+src/threads/Semaphore.vala
+src/threads/Threads.vala
+src/threads/Workers.vala
+src/unit/Unit.vala
+src/unit/rc/template.vala
+src/util/KeyValueMap.vala
+src/util/Util.vala
+src/util/file.vala
+src/util/image.vala
+src/util/misc.vala
+src/util/string.vala
+src/util/system.vala
+src/util/ui.vala
+[type: gettext/glade]ui/set_background_dialog.glade
+[type: gettext/glade]ui/shotwell.glade
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/po/POTFILES.skip
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..cfcf706
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,4250 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# lombaardcj <lombaardcj@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:13+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/shotwell/language/af_ZA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af_ZA\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Gebeurtenis %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr ""
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr ""
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Hou"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural ""
+"Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Speel skyfie vertoning"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Voer Foto en Video uit"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Voer Foto uit"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Voer Fotos uit"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotasie"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Maak ongedaan Rotasie"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Horisontaal Omgekeer"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Maak ongedaan Horisontaal Omgekeer"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vertikaal Omgekeer"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Maak ongedaan Vertikaal Omgekeer"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr ""
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr ""
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr ""
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Foto"
+msgstr[1] "%d Fotos"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr ""
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr ""
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr ""
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr ""
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Grootte:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Blootstelling:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "Kanseleer"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Verwyder"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Voer Video uit"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr "Kon die volgende foto nie uitvoer te danke aan 'n lêer fout.\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr "\n\nWil jy voortgaan met uitvoer proses?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinue"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Onveranderd"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Huidige"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formaat:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kwaliteit:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skalerings beperking:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_pixels"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(En %d meer)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid ""
+"Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 duplikaat foto was nie ingevoer:\n"
+msgstr[1] "%d duplikaat fotos was nie ingevoer:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 duplikaat video was nie ingevoer:\n"
+msgstr[1] "%d duplikaat videos was nie ingevoer:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 duplikaat fotos / videos was nie ingevoer:\n"
+msgstr[1] " %d duplikaat fotos / videos was nie ingevoer:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 foto kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+msgstr[1] "%d fotos kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 video kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+msgstr[1] "%d videos kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 foto/video kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+msgstr[1] "%d fotos/videos kon nie ingevoer word as gevolg van 'n lêer of hardeware fout:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 foto kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+msgstr[1] "%d fotos kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+msgstr[1] "%d videos kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 fotos/video kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+msgstr[1] "%d fotos/videos kon nie ingevoer word as gevolg van 'n kamera fout:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 foto oorgeslaan wat nie ondersteun word:\n"
+msgstr[1] "%d fotos oorgeslaan wat nie ondersteun word:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 nie-beeld-lêer oorgeslaan.\n"
+msgstr[1] "%d nie-beeld-lêers oorgeslaan.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 foto oorgeslaan as gevolg van gebruiker kanselasie:\n"
+msgstr[1] "%d fotos oorgeslaan as gevolg van gebruiker kanselasie:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video oorgeslaan as gevolg van gebruiker kanselasie:\n"
+msgstr[1] "%d videos oorgeslaan as gevolg van gebruiker kanselasie:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 foto/video oorgeslaan as gevolg van gebruiker kanselasie:\n"
+msgstr[1] "%d fotos/videos oorgeslaan as gevolg van gebruiker kanselasie:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto suksekvol ingevoer.\n"
+msgstr[1] "%d fotos suksesvol ingevoer.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video suksekvol ingevoer.\n"
+msgstr[1] "%d videos suksesvol ingevoer.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto/video suksesvol ingevoer.\n"
+msgstr[1] "%d fotos/videos suksesvol ingevoer.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Geen fotos or videos ingevoer.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Invoer Volledig"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekonde"
+msgstr[1] "%d sekondes"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuut"
+msgstr[1] "%d minute"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d uur"
+msgstr[1] "%d ure"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dag"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Herbenoem Gebeurtenis"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Naam:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Verander Titel"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Trash Lêer"
+msgstr[1] "_Trash Lêers"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Alleenlik_Verwyder_"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "Die sal alle veranderinge vernietig wat gemaak word na eksterne lêer. Gaan voort?"
+msgstr[1] "Die sal alle veranderinge vernietig wat gemaak word na %d eksterne lêers. Gaan voort?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_vert Eksterne Wysiging"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Dit sal die foto verwyder uit die biblioteek. Gaan voort?"
+msgstr[1] "Dit sal %d fotos verwyder uit die biblioteek. Gaan voort?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Verwyder"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Verwyder Foto van die biblioteek"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "VM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "NM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Uur"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Wysig Oorspronklike lêer"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Oorspronklike:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr "Ontwikkelings tyd sal vorentoe geskuif word met\n%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr "Ontwikkeling tyd sal agtertoe geskuif word met\n%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dae"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uur"
+msgstr[1] "ure"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuut"
+msgstr[1] "minute"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekonde"
+msgstr[1] "sekondes"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] "\n\nEn %d ander."
+msgstr[1] "\n\nEn %d andere."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Welkom!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Welkom by Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Om te begin, voer fotos op enige van die volgende maniere in:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Kies <span weight=\"bold\">Lêer %s Voer in vanaf lêerhouer</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Koppel die kamera aan jou rekenaar om invoer te begin"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Jy kan ook fotos invoer op enige van die volgende maniere:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Moenie die boodskap weer vertoon"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Eie"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr "Shotwell kan foto kopieer na d biblioteek of invoer sonder om te kopieer."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_py Fotos"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Invoer in Plek"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Invoer na Biblioteek"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr ""
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr ""
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Kyk"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr ""
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Databasis"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have at least one data imports plugin enabled. Plugins can be enabled in the Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr ""
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Keer terug"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Maak ongedaan Terugkeer"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Verbeter"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Maak ongedaan Verbeter"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Skep Nuwe Gebeurtenis"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Verwyder Gebeurtenis"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Skuif Fotos na nuwe Gebeurtenis"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Stel Fotos na vorige Gebeurtenis"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Kombineer"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Ongekombineer"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Dupliseer fotos"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Verwyder duplikaat Fotos"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kon nie foto dupliseer as gevolg van lêerfout"
+msgstr[1] "Kon nie %d fotos dupliseer as gevolg van lêerfoute"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Herstel van vorige gradering"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Vermeerdering van graderings"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Vermindering van graderings"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Oorspronklike foto kon nie aangepas word nie."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Pas Datum en Tyd aan"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Maak ongedaan Datum en Tyd aanpassing"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Een oorspronklike foto kon nie aangepas word"
+msgstr[1] "Die volgende oorspronkilke fotos kon nie aangepas word."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Tyd Aanpassings Fout"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Tyd aanpassings kon nie ongedaan gemaak word op die volgende foto lêer."
+msgstr[1] "Tyd aanpassings kon nie ongedaan gemaak word op die volgende foto lêers."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Skuif Fotos na die Asblik"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Haal Fotos uit die Asblik"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Skuif die fotos na die Shotwell asblik"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Haal fotos uit die Shotwell asblik terug in die biblioteek"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Besig om Fotos na Asblik te skuif"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Besig om Fotos uit Asblik te haal"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Merk geselekteerde fotos"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Verwyder Merk van geselekteerde fotos"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Merk"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Verwyder Merk"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr ""
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr ""
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Beursie (2 x 3 duim)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notaboek (3 x 5 duim)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 duim"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 duim"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 duim"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 duim"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 duim"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrieke Beursie (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Poskaart (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Kon nie foto databasis %s maak of skep: fout kode %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Kon nie van Nautilus Stuur-Aan Funksie gebruik: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Stuur Aan"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Kon nie agtergrond uitvoer %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Kon nie lessenaar skyfievertoning voor berei: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Lêer"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Verander"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_ts"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ta_gs"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hulp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kan nie %s monitor nie: Nie 'n lêergids (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Foto Organiseerder"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Besigtig Foto"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr ""
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Reset"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Terug na die huidige foto dimensies"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Stel die inkorting vir hierdie foto op"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Verander inkorting reghoek tussen die portret en landskap oriëntasies"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Onbeperkte"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Vierkant"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Skerm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Oorspronklike grootte"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Maak die rooi-oog-instrument toe"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Verwyder enige rooi-oë-effekte in die streek"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Versadiging:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tint:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatuur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Skaduwees:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Herstel Kleure"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Herstel alle kleur veranderinge na die oorspronklike"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatuur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tint"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Versadiging"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Blootstelling"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Skaduwees"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontras Uitbreiding"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Speld die nutsbalk vas"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Speld die nutsbalk oop"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Verlaat Volskerm"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Verlaat_Volskerm"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Verlaat"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Omtrent"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Volskerm"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Inhoud"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot continue.\n"
+"\n"
+"%s"
+msgstr "'n Fatale fout het voorgekom terwyl toegang tot Shotwell se biblioteek. Shotwell kan nie voortgaan nie. \n\n%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Besoek die Yorba webwerf"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "vertaler-krediete"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Kan nie hulp vertoon: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Oorspronklike grootte"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Wydte of hoogte"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Wydte"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Hoogte"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr ""
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Gebeurtenisse"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Kan nie skryf na foto-databasis lêer:% s"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Geen Gebeurtenis"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Onsuksesvol om foto databasis te skep of oop te maak %s : fout kode %s "
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Prentjies"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Konnie tydelike lêergids skep %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Konnie data sub lêergids skep %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Onsuksesvol om tydelike lêer te skep vir %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Besig om uit te voer"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Lêer %s bestaan ​​reeds. Vervang?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Slaanoor"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Vervang"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Vervang _Alles"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Voer uit"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Prentjies"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use with YouTube to continue. You can set up most accounts by using your browser to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you"
+" entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Nuwe album ..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the login process. During login, Shotwell Connect may ask you for permission to upload photos and publish to your feed. These permissions are required for Shotwell Connect to function."
+msgstr "Jy is tans nie in geteken in Facebook nie. As jy nog nie 'n Facebook-rekening het, kan u een skep tydens die aanmelding. Tydens die inskrywing, kan Shotwell Connect u vra vir toestemming om fotos te laai en publiseer. Hierdie regte is nodig vir Shotwell Connect om te funksioneer."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try publishing again."
+msgstr "Jy het reeds in en uit geteken na Facebook tydens hierdie Shotwell sessie. Om voort te gaan met die publikasie na Facebook af te sluit en weer Shotwell te begin, probeer om dan weer te publiseer."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Aansluiting by Facebook toets ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr "U is aangeteken in Facebook as %s.\n\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Waar wil jy die geselekteerde fotos heen publiseer?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing libraries found by Shotwell or by selecting an alternative F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is"
+" not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr ""
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr ""
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr ""
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekondes"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+msgid "_Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+msgid "_Publish"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..f0cef8d
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,4845 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Muhammad Azmi Al Hashemi <bilarabiahla@gmail.com>, 2012
+# Muhammad Azmi Al Hashemi <bilarabiahla@gmail.com>, 2012
+# Dylan Gattey <dylan.gattey@gmail.com>, 2011
+# Ibrahim Saed <ibraheem5000@gmail.com>, 2012
+# Ibrahim Saed <ibraheem5000@hotmail.com>, 2012-2013
+# Muhammad Azmi Al Hashemi <bilarabiahla@gmail.com>, 2012
+# alassiry <osama@alassiry.com>, 2011
+# alassiry <osama@alassiry.com>, 2011
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Ibrahim Saed <ibraheem5000@hotmail.com>\n"
+"Language-Team: Arabic (http://www.transifex.com/projects/p/shotwell/language/"
+"ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "حدث %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "الكاميرات"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "كاميرا"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "تعذّر فصل الكاميرا. حاول فصل الكاميرا من مدير الملفات."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "أخفِ الصور التي تم استيرادها"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "اعرض الصور الغير مستوردة فقط"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "يبدأ الاستيراد، يرجى الانتظار..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "ال_عناوين"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "أظهر عنوان كل صورة"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "استورد ال_مختار"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "استورد الصور المختارة إلى مكتبتك"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "استورد ال_كل"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "استورد جميع الصور إلى مكتبتك"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"يحتاج شُتْ‌وِل لفصل الكاميرا من نظام الملفات لكي يستطيع الوصول إليها. هل ترغب "
+"بالاستمرار؟"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "ا_فصل"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "من فضلك افصل الكاميرا."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"الكاميرا موصدة من قبل تطبيق آخر. يمكن لـ شُتْ‌وِل الوصول للكاميرا فقط عندما تكون "
+"غير موصدة. من فضلك أغلق أي تطبيقات أخرى تستخدم الكاميرا وحاول مجددا."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "من فضلك أغلق أي تطبيق آخر يستخدم الكاميرا."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"تعذّر جلب المعاينات من الكاميرا:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "يفصل..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "جلب معلومات الصورة"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "جلب المعاينة لـ %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "تعذّر إيصاد الكاميرا: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "لا صور لحذفها."
+msgstr[1] "هل ترغب بحذف هذه الصورة من الكاميرا؟"
+msgstr[2] "هل ترغب بحذف هاتين الصورتين من الكاميرا؟"
+msgstr[3] "هل ترغب بحذف هذه الصور الـ%d من الكاميرا؟"
+msgstr[4] "هل ترغب بحذف هذه الصور الـ%d من الكاميرا؟"
+msgstr[5] "هل ترغب بحذف هذه الصور الـ%d من الكاميرا؟"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "لا فيديوهات لحذفها."
+msgstr[1] "هل ترغب بحذف هذا الفيديو من الكاميرا؟"
+msgstr[2] "هل ترغب بحذف هذين الفيديوهين من الكاميرا؟"
+msgstr[3] "هل ترغب بحذف هذه الفيديوهات الـ%d من الكاميرا؟"
+msgstr[4] "هل ترغب بحذف هذه الفيديوهات الـ%d من الكاميرا؟"
+msgstr[5] "هل ترغب بحذف هذه الفيديوهات الـ%d من الكاميرا؟"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "لا صور/فيديوهات لحذفها."
+msgstr[1] "هل ترغب بحذف هذه الصورة/الفيديو من الكاميرا؟"
+msgstr[2] "هل ترغب بحذف هاتين الصورتين/الفيديوهين من الكاميرا؟"
+msgstr[3] "هل ترغب بحذف هذه الصور/الفيديوهات الـ%d من الكاميرا؟"
+msgstr[4] "هل ترغب بحذف هذه الصور/الفيديوهات الـ%d من الكاميرا؟"
+msgstr[5] "هل ترغب بحذف هذه الصور/الفيديوهات الـ%d من الكاميرا؟"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "لا ملفات لحذفها"
+msgstr[1] "هل ترغب بحذف هذا الملف من الكاميرا؟"
+msgstr[2] "هل ترغب بحذف هذين الملفين من الكاميرا؟"
+msgstr[3] "هل ترغب بحذف هذه الملفات الـ%d من الكاميرا؟"
+msgstr[4] "هل ترغب بحذف هذه الملفات الـ%d من الكاميرا؟"
+msgstr[5] "هل ترغب بحذف هذه الملفات الـ%d من الكاميرا؟"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "أ_بقِ"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "حذف صور/فيديوهات من الكاميرا"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "لا صور/فيديوهات لحذفها."
+msgstr[1] "تعذّر حذف صورة واحدة من الكاميرا بسبب أخطاء."
+msgstr[2] "تعذّر حذف صورتين من الكاميرا بسبب أخطاء."
+msgstr[3] "تعذّر حذف %d صور من الكاميرا بسبب أخطاء."
+msgstr[4] "تعذّر حذف %d صورة من الكاميرا بسبب أخطاء."
+msgstr[5] "تعذّر حذف %d صورة من الكاميرا بسبب أخطاء."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "عرض ال_شرائح"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "شغّل عرض شرائح"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "صدّر صورة/فيديو"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "صدّر الصور/الفيديوهات"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "صدّر صورة"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "صدّر صور"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "تدوير"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "تراجع عن التدوير"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "قلب أفقي"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "تراجع عن القلب الأفقي"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "قلب رأسي"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "تراجع عن القلب الرأسي"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "أي نص"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "عنوان"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "وسم"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "اسم حدث"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "اسم ملف"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "نوع الوسط"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "حالة التعليم"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "تقييم"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "تاريخ"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "يحتوي"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "يطابق تمامًا"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "يبدء بـ"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ينتهى بـ"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "لا يحتوي"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "دون تعيين"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "هو"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ليس"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "أي صورة"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "صورة RAW"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "فيديو"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "معلّم"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "غير معلّم"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "وأعلى"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "فقط"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "وأدنى"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "بعد"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "قبل"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "بين"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "و"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "أي"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "كل"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "لا شيء"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "البحوث المحفوظة"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "بحث محفوظ _جديد..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"إن مكتبة الصور غير متوافقة مع هذا الإصدار من شُتْ‌وِل. يبدو أنها أنشئت باستخدام "
+"شُتْ‌وِل %s (النموذج %d). بينما هذا الإصدار %s (النموذج %d). الرجاء استخدام "
+"آخر إصدار من شُتْ‌وِل."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"تعذّر على شُتْ‌وِل تحديث مكتبة الصور من الإصدار %s (النموذج %d) إلى الإصدار %s "
+"(النموذج %d). لمزيد من المعلومات يرجى زيارة صفحة الويكي لبرنامج شُتْ‌وِل على %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"إن مكتبة الصور غير متوافقة مع هذا الإصدار من شُتْ‌وِل. يبدو أنها أنشئت باستخدام "
+"شُتْ‌وِل %s (النموذج %d). بينما هذا الإصدار %s (النموذج %d). الرجاء مسح مكتبتك "
+"عن طريق حذف %s وإعادة استيراد الصور."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "خطأ مجهول أثناء محاولة التحقق من قاعدة بيانات شُتْ‌وِل: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "يُحمّل شُتْ‌وِل"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ملف]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"نفّذ \"%s --help\" لرؤية قائمة كاملة من الخيارات المتوفرة لسطر الأوامر.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "اليوم"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "البارحة"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "العنوان:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "العناصر:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "لا أحداث"
+msgstr[1] "حدث واحد"
+msgstr[2] "حدثين"
+msgstr[3] "%d أحداث"
+msgstr[4] "%d حدثا"
+msgstr[5] "%d حدث"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "لا صور"
+msgstr[1] "صورة واحدة"
+msgstr[2] "صورتين"
+msgstr[3] "%d صور"
+msgstr[4] "%d صورة"
+msgstr[5] "%d صورة"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "لا فيديوهات"
+msgstr[1] "فيديو واحد"
+msgstr[2] "فيديوهين"
+msgstr[3] "%d فيديوهات"
+msgstr[4] "%d فيديو"
+msgstr[5] "%d فيديو"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "التاريخ:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "الوقت:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "من:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "إلى:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "المقاس:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "المُدة:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f ثانية/ثوان"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "المطور:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "التعرض:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "المكان:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "حجم الملف:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "الأبعاد الأصلية:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "صانع الكاميرا:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "طراز الكاميرا:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "الوميض:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "البعد البؤري:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "معامل التعرض:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "خط العرض في GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "خط الطول في GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "الفنان:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "حقوق النسخ:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "البرنامج:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "التعليق:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "معلومات إضافية"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "هذا سيزيل الوسم \"%s\" من الصور. هل ترغب بالاستمرار؟"
+msgstr[1] "هذا سيزيل الوسم \"%s\" من صورة واحدة. هل ترغب بالاستمرار؟"
+msgstr[2] "هذا سيزيل الوسم \"%s\" من صورتين. هل ترغب بالاستمرار؟"
+msgstr[3] "هذا سيزيل الوسم \"%s\" من %d صور. هل ترغب بالاستمرار؟"
+msgstr[4] "هذا سيزيل الوسم \"%s\" من %d صورة. هل ترغب بالاستمرار؟"
+msgstr[5] "هذا سيزيل الوسم \"%s\" من %d صورة. هل ترغب بالاستمرار؟"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "أ_لغِ"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "ا_حذف"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "هذا سيزيل البحث المحفوظ \"%s\". هل ترغب بالاستمرار؟"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "صدّر فيديو"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"لا يمكن لـ شُتْ‌وِل إنشاء ملف لتعديل هذه الصورة لأنك لا تملك الصلاحيات للكتابة "
+"إلى %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"تعذّر تصدير الصورة التالية بسبب خطأ في الملف.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"هل ترغب باستكمال التصدير؟"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "ا_ستمر"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "دون تعديل"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "الحالية"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "ال_صيغة:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "ال_جودة:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "ال_حجم:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _بكسل"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "تصدير البيانات الوصفية"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "احفظ التفاصيل..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "حفظ التفاصيل"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(بالإضافة إلى %d أخرى)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "رسالة خطأ:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"غير قادر على نسخ %s\n"
+"» إلى %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "لا صور مكررة:\n"
+msgstr[1] "صورة واحدة مكررة لم يتم استيرادها:\n"
+msgstr[2] "صورتين مكررتين لم يتم استيرادهما:\n"
+msgstr[3] "%d صور مكررة لم يتم استيرادهم:\n"
+msgstr[4] "%d صورة مكررة لم يتم استيرادهم:\n"
+msgstr[5] "%d صورة مكررة لم يتم استيرادهم:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "لا فيديوهات مكررة تم استيرادها:\n"
+msgstr[1] "فيديو واحد مكرر لم يتم استيراده:\n"
+msgstr[2] "فيديوهين مكررين لم يتم استيرادهما:\n"
+msgstr[3] "%d فيديوهات مكررة لم يتم استيرادهم:\n"
+msgstr[4] "%d فيديو مكررا لم يتم استيرادهم:\n"
+msgstr[5] "%d فيديو مكرر لم يتم استيرادهم:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "لا صور أو فيديوهات مكررة تم استيرادها:\n"
+msgstr[1] "صورة/فيديو واحد مكرر لم يتم استيراده:\n"
+msgstr[2] "صورتين/فيديوهين مكررين لم يتم استيرادهما:\n"
+msgstr[3] "%d صور/فيديوهات مكررة لم يتم استيرادهم:\n"
+msgstr[4] "%d صورة/فيديو مكررا لم يتم استيرادهم:\n"
+msgstr[5] "%d صورة/فيديو مكرر لم يتم استيرادهم:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "لا صور فشل استيرادها:\n"
+msgstr[1] "فشل استيراد صورة واحدة بسبب خطأ في ملف أو في العتاد:\n"
+msgstr[2] "فشل استيراد صورتين بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[3] "فشل استيراد %d صور بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[4] "فشل استيراد %d صورة بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[5] "فشل استيراد %d صورة بسبب أخطاء في الملفات أو في العتاد:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "لا فيديوهات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد فيديو واحد بسبب خطأ في ملف أو في العتاد:\n"
+msgstr[2] "فشل استيراد فيديوهين بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[3] "فشل استيراد %d فيديوهات بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[4] "فشل استيراد %d فيديو بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[5] "فشل استيراد %d فيديو بسبب أخطاء في الملفات أو في العتاد:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "لا صور أو فيديوهات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد صورة/فيديو واحد بسبب خطأ في ملف أو في العتاد:\n"
+msgstr[2] "فشل استيراد صورتين/فيديوهين بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[3] "فشل استيراد %d صور/فيديوهات بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[4] "فشل استيراد %d صورة/فيديو بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[5] "فشل استيراد %d صورة/فيديو بسبب أخطاء في الملفات أو في العتاد:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "لا ملفات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد ملف واحد بسبب خطأ في ملف أو في العتاد:\n"
+msgstr[2] "فشل استيراد ملفين بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[3] "فشل استيراد %d ملفات بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[4] "فشل استيراد %d ملفا بسبب أخطاء في الملفات أو في العتاد:\n"
+msgstr[5] "فشل استيراد %d ملف بسبب أخطاء في الملفات أو في العتاد:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "فشل استيراد صور بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[1] "فشل استيراد صورة واحدة بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[2] "فشل استيراد صورتين بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[3] "فشل استيراد %d صور بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[4] "فشل استيراد %d صورة بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[5] "فشل استيراد %d صورة بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "فشل استيراد فيديوهات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[1] "فشل استيراد فيديو واحد بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[2] "فشل استيراد فيديوهين بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[3] ""
+"فشل استيراد %d فيديوهات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[4] "فشل استيراد %d فيديو بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[5] "فشل استيراد %d فيديو بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"فشل استيراد صور/فيديوهات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[1] ""
+"فشل استيراد صورة/فيديو واحد بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[2] ""
+"فشل استيراد صورتين/فيديوهين بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[3] ""
+"فشل استيراد %d صور/فيديوهات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[4] ""
+"فشل استيراد %d صورة/فيديو بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[5] ""
+"فشل استيراد %d صورة/فيديو بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "فشل استيراد ملفات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[1] "فشل استيراد ملف واحد بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[2] "فشل استيراد ملفين بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[3] "فشل استيراد %d ملفات بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[4] "فشل استيراد %d ملفا بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+msgstr[5] "فشل استيراد %d ملف بسبب أن مجلد مكتبة الصور غير قابل للكتابة:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "لا صور فشل استيرادها:\n"
+msgstr[1] "فشل استيراد صورة واحدة بسبب خطأ في الكاميرا:\n"
+msgstr[2] "فشل استيراد صورتين بسبب خطأ في الكاميرا:\n"
+msgstr[3] "فشل استيراد %d صور بسبب خطأ في الكاميرا:\n"
+msgstr[4] "فشل استيراد %d صورة بسبب خطأ في الكاميرا:\n"
+msgstr[5] "فشل استيراد %d صورة بسبب خطأ في الكاميرا:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "لا فيديوهات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد فيديو واحد بسبب خطأ في الكاميرا:\n"
+msgstr[2] "فشل استيراد فيديوهين بسبب خطأ في الكاميرا:\n"
+msgstr[3] "فشل استيراد %d فيديوهات بسبب خطأ في الكاميرا:\n"
+msgstr[4] "فشل استيراد %d فيديو بسبب خطأ في الكاميرا:\n"
+msgstr[5] "فشل استيراد %d فيديو بسبب خطأ في الكاميرا:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "لا صور/فيديوهات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد صورة/فيديو واحد بسبب خطأ في الكاميرا:\n"
+msgstr[2] "فشل استيراد صورتين/فيديوهين بسبب خطأ في الكاميرا:\n"
+msgstr[3] "فشل استيراد %d صور/فيديوهات بسبب خطأ في الكاميرا:\n"
+msgstr[4] "فشل استيراد %d صورة/فيديو بسبب خطأ في الكاميرا:\n"
+msgstr[5] "فشل استيراد %d صورة/فيديو بسبب خطأ في الكاميرا:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "لا ملفات فشل استيرادها:\n"
+msgstr[1] "فشل استيراد ملف واحد بسبب خطأ في الكاميرا:\n"
+msgstr[2] "فشل استيراد ملفين بسبب خطأ في الكاميرا:\n"
+msgstr[3] "فشل استيراد %d ملفات بسبب خطأ في الكاميرا:\n"
+msgstr[4] "فشل استيراد %d ملفا بسبب خطأ في الكاميرا:\n"
+msgstr[5] "فشل استيراد %d ملف بسبب خطأ في الكاميرا:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "صور غير مدعومة تم تجاهلها:\n"
+msgstr[1] "تم تجاهل صورة واحدة غير مدعومة:\n"
+msgstr[2] "تم تجاهل صورتين غير مدعومتين:\n"
+msgstr[3] "تم تجاهل %d صور غير مدعومة:\n"
+msgstr[4] "تم تجاهل %d صورة غير مدعومة:\n"
+msgstr[5] "تم تجاهل %d صورة غير مدعومة:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "ملفات ليست صور تم تجاهلها:\n"
+msgstr[1] "تم تجاهل ملف واحد ليس بصورة:\n"
+msgstr[2] "تم تجاهل ملفين ليسا ملفي صور:\n"
+msgstr[3] "تم تجاهل %d ملفات ليست بملفات صور:\n"
+msgstr[4] "تم تجاهل %d ملفا ليست بملفات صور:\n"
+msgstr[5] "تم تجاهل %d ملف ليست بملفات صور:\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "لا صور تم تخطيها:\n"
+msgstr[1] "صورة واحدة تم تخطيها بسبب إلغاء المستخدم:\n"
+msgstr[2] "صورتين تم تخطيهما بسبب إلغاء المستخدم:\n"
+msgstr[3] "%d صور تم تخطيها بسبب إلغاء المستخدم:\n"
+msgstr[4] "%d صورة تم تخطيها بسبب إلغاء المستخدم:\n"
+msgstr[5] "%d صورة تم تخطيها بسبب إلغاء المستخدم:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "لا فيديوهات تم تخطيها:\n"
+msgstr[1] "فيديو واحد تم تخطيه بسبب إلغاء المستخدم:\n"
+msgstr[2] "فيديوهين تم تخطيهما بسبب إلغاء المستخدم:\n"
+msgstr[3] "%d فيديوهات تم تخطيها بسبب إلغاء المستخدم:\n"
+msgstr[4] "%d فيديو تم تخطيه بسبب إلغاء المستخدم:\n"
+msgstr[5] "%d فيديو تم تخطيه بسبب إلغاء المستخدم:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "لا صور/فيديوهات تم تخطيها:\n"
+msgstr[1] "صورة/فيديو واحد تم تخطيه بسبب إلغاء المستخدم:\n"
+msgstr[2] "صورتين/فيديوهين تم تخطيهما بسبب إلغاء المستخدم:\n"
+msgstr[3] "%d صور/فيديوهات تم تخطيها بسبب إلغاء المستخدم:\n"
+msgstr[4] "%d صورة/فيديو تم تخطيه بسبب إلغاء المستخدم:\n"
+msgstr[5] "%d صورة/فيديو تم تخطيه بسبب إلغاء المستخدم:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "لا ملفات تم تجاهلها.\n"
+msgstr[1] "تم تجاهل ملف واحد بسبب إلغاء المستخدم له:\n"
+msgstr[2] "تم تجاهل ملفين بسبب إلغاء المستخدم لهما:\n"
+msgstr[3] "تم تجاهل %d ملفات بسبب إلغاء المستخدم لهم:\n"
+msgstr[4] "تم تجاهل %d ملفا بسبب إلغاء المستخدم لهم:\n"
+msgstr[5] "تم تجاهل %d ملف بسبب إلغاء المستخدم لهم:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "لا صور تم استيرادها.\n"
+msgstr[1] "تم استيراد صورة واحدة بنجاح.\n"
+msgstr[2] "تم استيراد صورتين بنجاح.\n"
+msgstr[3] "تم استيراد %d صور بنجاح.\n"
+msgstr[4] "تم استيراد %d صورة بنجاح.\n"
+msgstr[5] "تم استيراد %d صورة بنجاح.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "لا فيديوهات تم استيرادها.\n"
+msgstr[1] "تم استيراد فيديو واحد.\n"
+msgstr[2] "تم استيراد فيديوهين.\n"
+msgstr[3] "تم استيراد %d فيديوهات.\n"
+msgstr[4] "تم استيراد %d فيديو.\n"
+msgstr[5] "تم استيراد %d فيديو.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "لا صور/فيديوهات تم استيرادها.\n"
+msgstr[1] "تم استيراد صورة/فيديو واحد بنجاح.\n"
+msgstr[2] "تم استيراد صورتين/فيديوهين بنجاح.\n"
+msgstr[3] "تم استيراد %d صور/فيديوهات بنجاح.\n"
+msgstr[4] "تم استيراد %d صورة/فيديو بنجاح.\n"
+msgstr[5] "تم استيراد %d صورة/فيديو بنجاح.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "لم يتم استيراد أي صور أو فيديوهات.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "تم الاستيراد"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d ثانية"
+msgstr[1] "ثانية واحدة"
+msgstr[2] "ثانيتان"
+msgstr[3] "%d ثوان"
+msgstr[4] "%d ثانية"
+msgstr[5] "%d ثانية"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d دقيقة"
+msgstr[1] "دقيقة واحدة"
+msgstr[2] "دقيقتان"
+msgstr[3] "%d دقائق"
+msgstr[4] "%d دقيقة"
+msgstr[5] "%d دقيقة"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ساعة"
+msgstr[1] "ساعة واحدة"
+msgstr[2] "ساعتان"
+msgstr[3] "%d ساعات"
+msgstr[4] "%d ساعة"
+msgstr[5] "%d ساعة"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "يوم 1"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "تغيير تسمية الحدث"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "الاسم:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "تعديل العنوان"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "انقل إلى ال_مهملات"
+msgstr[1] "انقل إلى ال_مهملات"
+msgstr[2] "انقل إلى ال_مهملات"
+msgstr[3] "انقل إلى ال_مهملات"
+msgstr[4] "انقل إلى ال_مهملات"
+msgstr[5] "انقل إلى ال_مهملات"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "أ_زل فقط"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "العودة عن التعديل الخارجي؟"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "العودة عن التعديلات الخارجية؟"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"سيلغي هذا جميع التغييرات التي أجريت عن طريق البرامج الخارجية. هل ترغب "
+"بالاستمرار؟"
+msgstr[1] ""
+"سيلغي هذا جميع التغييرات الخارجية التي أجريت على ملف واحد. هل ترغب "
+"بالاستمرار؟"
+msgstr[2] ""
+"سيلغي هذا جميع التغييرات الخارجية التي أجريت على ملفين. هل ترغب بالاستمرار؟"
+msgstr[3] ""
+"سيلغي هذا جميع التغييرات الخارجية التي أجريت على %d ملفات. هل ترغب "
+"بالاستمرار؟"
+msgstr[4] ""
+"سيلغي هذا جميع التغييرات الخارجية التي أجريت على %d ملفا. هل ترغب بالاستمرار؟"
+msgstr[5] ""
+"سيلغي هذا جميع التغييرات الخارجية التي أجريت على %d ملف. هل ترغب بالاستمرار؟"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_عودة عن التعديل الخارجي"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_عودة عن التعديلات الخارجية"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "هذا سيزيل الصور من المكتبة. هل ترغب بالاستمرار؟"
+msgstr[1] "هذا سيزيل صورة واحدة من المكتبة. هل ترغب بالاستمرار؟"
+msgstr[2] "هذا سيزيل صورتين من المكتبة. هل ترغب بالاستمرار؟"
+msgstr[3] "هذا سيزيل %d صور من المكتبة. هل ترغب بالاستمرار؟"
+msgstr[4] "هذا سيزيل %d صورة من المكتبة. هل ترغب بالاستمرار؟"
+msgstr[5] "هذا سيزيل %d صورة من المكتبة. هل ترغب بالاستمرار؟"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "أ_زل"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "أزِل الصورة من المكتبة"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "أزِل الصور من المكتبة"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "ص"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "م"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ساعة"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_نقل الصور/الفيديوهات بنفس المقدار"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "ضبط _جميع الصور/الفيديوهات إلى هذا الوقت"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr " ت_عديل ملف الصورة الأصلي"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_عدّل ملفات الصور الأصلية"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "ت_عديل الملف الأصلي"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_عدّل الملفات الأصلية"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "الأصل: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y، %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y، %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"سيتقدم تاريخ التقاط الصورة بمقدار:\n"
+"%d %s و %d %s و %d %s و %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"سيتأخر تاريخ التقاط الصورة بمقدار:\n"
+"%d %s و %d %s و %d %s و %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "يوم"
+msgstr[1] "يوم"
+msgstr[2] "يومان"
+msgstr[3] "أيام"
+msgstr[4] "يوما"
+msgstr[5] "يوم"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ساعة"
+msgstr[1] "ساعة"
+msgstr[2] "ساعتان"
+msgstr[3] "ساعات"
+msgstr[4] "ساعة"
+msgstr[5] "ساعة"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "دقيقة"
+msgstr[1] "دقيقة"
+msgstr[2] "دقيقتان"
+msgstr[3] "دقائق"
+msgstr[4] "دقيقة"
+msgstr[5] "دقيقة"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "ثانية"
+msgstr[1] "ثانية"
+msgstr[2] "ثانيتان"
+msgstr[3] "ثوان"
+msgstr[4] "ثانية"
+msgstr[5] "ثانية"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"بالإضافة إلى %d أخرى"
+msgstr[1] ""
+"\n"
+"\n"
+"بالإضافة إلى %d آخر"
+msgstr[2] ""
+"\n"
+"\n"
+"بالإضافة إلى %d آخرين"
+msgstr[3] ""
+"\n"
+"\n"
+"بالإضافة إلى %d آخرى"
+msgstr[4] ""
+"\n"
+"\n"
+"بالإضافة إلى %d آخرى"
+msgstr[5] ""
+"\n"
+"\n"
+"بالإضافة إلى %d آخرى"
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "الوسوم (يفصل بينها بفواصل \",\"):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "مرحبا بك!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "مرحبا بك في شُتْ‌وِل!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "لتبدأ، استورد الصور بأي طريقة من الطرق التالية:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "اختر <span weight=\"bold\">ملف %s استورد من مجلد</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "اسحب الصور وأفلتها داخل نافذة شُتْ‌وِل"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "أوصل كاميرا بجهازك الحاسوب واستورد"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "ا_ستورد صور من مجلد %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "يمكنك أيضًا استيراد الصور بأي طريقة من الطرق التالية:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_لا تُظهر هذه الرسالة مجددا"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "استورد صور من مكتبتك %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(مساعدة)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "السنة%sالشهر%sاليوم"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "السنة%sالشهر"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "السنة%sالشهر-اليوم"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "السنة-الشهر-اليوم"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "مخصّص"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "نمط غير سليم"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr "يمكن لـ شُتْ‌وِل نسخ الصور إلى مجلد مكتبتك أو يمكنه استيرادها بدون نسخها."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ا_نسخ الصور"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "ا_ستورد في المكان"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "استورد إلى المكتبة"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "أزِل من المكتبة"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "إزالة الصورة من المكتبة"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "إزالة الصور من المكتبة"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"هذا سيزيل الصور/الفيديوهات من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[1] ""
+"هذا سيزيل صورة/فيديو واحد من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملف إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[2] ""
+"هذا سيزيل صورتين/فيديوهين من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفين إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[3] ""
+"هذا سيزيل %d صور/فيديوهات من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[4] ""
+"هذا سيزيل %d صورة/فيديو من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[5] ""
+"هذا سيزيل %d صورة/فيديو من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"هذا سيزيل الفيديوهات من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[1] ""
+"هذا سيزيل فيديو واحد من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملف إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[2] ""
+"هذا سيزيل فيديوهين من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفين إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[3] ""
+"هذا سيزيل %d فيديوهات من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة "
+"مهملات النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[4] ""
+"هذا سيزيل %d فيديو من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[5] ""
+"هذا سيزيل %d فيديو من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"هذا سيزيل الصور من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[1] ""
+"هذا سيزيل صورة واحدة من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملف إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[2] ""
+"هذا سيزيل صورتين من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفين إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[3] ""
+"هذا سيزيل %d صور من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[4] ""
+"هذا سيزيل %d صورة من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+msgstr[5] ""
+"هذا سيزيل %d صورة من مكتبة شُتْ‌وِل. هل ترغب أيضًا بنقل الملفات إلى سلة مهملات "
+"النظام؟\n"
+"\n"
+"هذا الإجراء لا يمكن التراجع عنه."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"تعذّر نقل الصور/الفيديوهات إلى مهملات النظام. هل ترغب بحذف هذا الملف؟"
+msgstr[1] "تعذّر نقل صورة/فيديو واحد إلى مهملات النظام. هل ترغب بحذف هذا الملف؟"
+msgstr[2] ""
+"تعذّر نقل صورتين/فيديوهين إلى مهملات النظام. هل ترغب بحذف هذين الملفين؟"
+msgstr[3] ""
+"تعذّر نقل %d صور/فيديوهات إلى مهملات النظام. هل ترغب بحذف هذه الملفات؟"
+msgstr[4] "تعذّر نقل %d صورة/فيديو إلى مهملات النظام. هل ترغب بحذف هذه الملفات؟"
+msgstr[5] "تعذّر نقل %d صورة/فيديو إلى مهملات النظام. هل ترغب بحذف هذه الملفات؟"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "لا صور أو فيديوهات لحذفها"
+msgstr[1] "لا يمكن حذف صورة/فيديو واحد"
+msgstr[2] "لا يمكن حذف صورتين/فيديوهين"
+msgstr[3] "لا يمكن حذف %d صور/فيديوهات"
+msgstr[4] "لا يمكن حذف %d صورة/فيديو"
+msgstr[5] "لا يمكن حذف %d صورة/فيديو"
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "المجلدات"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "الوسوم"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "تم بنجاح"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "خطأ في ملف"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "تعذّر فك تشفير الملف"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "خطأ في قاعدة البيانات"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "أوقف المستخدم الاستيراد"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ليس ملفا"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "الملف موجود حاليًا في قاعدة البيانات"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "صيغة ملف غير مدعومة"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ليس ملف صورة"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "فشل القرص"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "القرص ممتلئ"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "خطأ في الكاميرا"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "خطأ في كتابة ملف"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "فشل الاستيراد (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "تم تعديله"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "الصورة السابقة"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "الصورة التالية"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ملف المصدر للصورة مفقود: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_عرض"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "أ_دوات"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "الصورة ال_سابقة"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "الصورة السابقة"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "الصورة ال_تالية"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "الصورة التالية"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_كبّر"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "كبّر الصورة"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_صغّر"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "صغّر الصورة"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "لائم على مقاس ال_صفحة"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "حجّم الصورة لتلائم أبعاد الشاشة"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "حجّم إلى _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "عدّل حجم الصورة إلى 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "حجّم إلى _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "عدّل حجم الصورة إلى 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ال_مطوّر"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "تعذّر تصدير %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "قاعدة بيانات %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "لا يمكن متابعة الاستيراد من %s بسبب حدوث خطأ:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "للاستيراد من خدمة أخرى، اختر واحدة من القائمة في الأعلى."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "استيراد البيانات"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"ليس لديك أي إضافة مُفعلة لاستيراد البيانات.\n"
+"\n"
+"يجب أن تفعّل إضافة واحدة على الأقل من هذا النوع لتتمكن من استخدام ميزة "
+"استيراد البيانات في البرنامج. يمكن تفعيل الإضافات من نافذة التفضيلات."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ملف قاعدة البيانات:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "ا_ستورد"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "استيراد من تطبيق"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "استيراد وسائط _من:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "أ_غلق"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "الإعدادات"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "عرض الشرائح"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "خلف"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "انتقل إلى الصورة السابقة"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "ألبث"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "ألبِث عرض الشرائح"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "التالي"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "انتقل إلى الصورة التالية"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "غيّر إعدادات عرض الشرائح"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "جميع ملفات مصادر الصور مفقودة."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "شغّل"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "واصل عرض الشرائح"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "الاسترجاع"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "تراجع عن الاسترجاع"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "التحسين"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "تراجع عن التحسين"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "إنشاء حدث جديد"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "إزالة الحدث"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "نقل الصور إلى حدث جديد"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "إعداد الصور إلى الحدث السابق"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "يدمج"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "يفك الدمج"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "تكرار الصور"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "إزالة الصور المكررة"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "لا صور لتكرارها"
+msgstr[1] "تعذّر تكرار صورة واحدة بسبب خطأ في الملف"
+msgstr[2] "تعذّر تكرار صورتين بسبب أخطاء في الملفات"
+msgstr[3] "تعذّر تكرار %d صور بسبب أخطاء في الملفات"
+msgstr[4] "تعذّر تكرار %d صورة بسبب أخطاء في الملفات"
+msgstr[5] "تعذّر تكرار %d صورة بسبب أخطاء في الملفات"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "استرجاع التقييم السابق"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "زيادة التقييم"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "خفض التقييم"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "إعداد مطور RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "استعادة مُطوّر RAW السابق"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "عيّن مطور"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "لا يمكن تعديل الصورة الأصلية."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "تعديل الوقت والتاريخ"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "تراجع عن تعديل التاريخ والوقت"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "لم يتم تحديد صورة لتعديلها."
+msgstr[1] "لا يمكن تعديل الصورة الأصلية التالية."
+msgstr[2] "لا يمكن تعديل الصورتين الأصليتين التاليتين."
+msgstr[3] "لا يمكن تعديل الصور الأصلية التالية."
+msgstr[4] "لا يمكن تعديل الصور الأصلية التالية."
+msgstr[5] "لا يمكن تعديل الصور الأصلية التالية."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "خطأ في تعديل الوقت"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "لا يمكن التراجع عن تعديلات الوقت في ملفات الصور التالية."
+msgstr[1] "لا يمكن التراجع عن تعديلات الوقت في ملف الصورة التالي."
+msgstr[2] "لا يمكن التراجع عن تعديلات الوقت في ملفا الصورتين التاليتين."
+msgstr[3] "لا يمكن التراجع عن تعديلات الوقت في ملفات الصور التالية."
+msgstr[4] "لا يمكن التراجع عن تعديلات الوقت في ملفات الصور التالية."
+msgstr[5] "لا يمكن التراجع عن تعديلات الوقت في ملفات الصور التالية."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "أنشئ وسم"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "انقل الوسم \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "انقل الصور إلى المهملات"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "استرجع الصور من المهملات"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "انقل الصور إلى مهملات شُتْ‌وِل"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "استرجع الصور مرة أخرى إلى مكتبة شُتْ‌وِل"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ينقل الصور إلى المهملات"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "استرجاع الصور من المهملات"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "علّم الصور المختارة"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "أزِل التعليم عن الصورة المختارة"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "علّم"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "أزِل التعليم"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "شُتْ‌وِل"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "منخفض (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "متوسط (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "مرتفع (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "أقصى (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "لا صور/فيديوهات"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "لم يُعثر على صور/فيديوهات"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "لا يمكن تصدير الصور إلى هذا المجلد."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "تعذّر التحقق من وجود تحديثات: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "ملء الصفحة بالكامل"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "صورتين في الصفحة"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 صور في الصفحة"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 صور في الصفحة"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 صور في الصفحة"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 صورة في الصفحة"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 صورة في الصفحة"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "بوصة"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "سم"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "محفظة (2 × 3 بوصة)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "بطاقة ملاحظات (3 × 5 بوصة)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 × 6 بوصة"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 × 7 بوصة"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 × 10 بوصة"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 × 14 بوصة"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 × 20 بوصة"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "محفظة مترية (9 × 13 سم)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "بطاقة بريدية (10 × 15 سم)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 × 18 سم"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 × 24 سم"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 × 30 سم"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 × 40 سم"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 × 40 سم"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "إعدادات الصورة"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "يطبع..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"تعذّر طباعة الصورة:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "تعذّر فتح أو إنشاء قاعدة بيانات الصورة %s: رقم الخطأ %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"تعذّرت الكتابة على ملف قاعدة بيانات الصورة:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"خطأ في الوصول إلى ملف قاعدة البيانات:\n"
+"%s\n"
+"\n"
+"الخطأ كان:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "صدّر الفيديوهات"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "تعذّر تشغيل عملية \"أرسل إلى\" في مُستعرض الملفات نوتلس: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "إرسال إلى"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "تعذّر تصدير الخلفية إلى %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "تعذّر تحضير عرض شرائح سطح المكتب: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "المعلّم"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "المهملات"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "سلة المهملات فارغة"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "احذف"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "يحذف الصور"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "الملفات المفقودة"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "يحذف..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "آخر استيراد"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ا_ستورد من مجلد..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "استورد صور من القرص إلى مكتبتك"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "استورد من ت_طبيق..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "رتّب الأ_حداث"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "أفرغ سلة ال_مهملات"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "احذف جميع الصور الموجودة في المهملات"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "اعرض ال_حدث للصورة"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "ا_بحث"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "اعثر على الصور والفيديوهات عن طريق الفئة"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_ملف"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "ت_حرير"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_صورة"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ال_صور"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "الأ_حداث"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "الو_سوم"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "م_ساعدة"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "المعلومات الأ_ساسية"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "عرض المعلومات الأساسية للمختار"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "المعلومات الإ_ضافية"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "عرض معلومات إضافية للمختار"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "شريط ال_بحث"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "عرض شريط البحث"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "الشريط ال_جانبي"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "عرض الشريط الجانبي"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "ت_صاعديا"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "رتّب الصور تصاعديا"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "ت_نازليا"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "رتّب الصور تنازليا"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "استيراد من مجلد"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "إفراغ سلة المهملات"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "يُفرغ سلة المهملات..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "شُتْ‌وِل مُعدّ لاستيراد الصور إلى المجلد المنزل خاصتك.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "مجلد المكتبة"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "الصور لا يمكن استيرادها من هذا المجلد."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "يُحدّث المكتبة..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "يُحضّر للاستيراد الآلي للصور..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "الاستيراد الآلي للصور..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "يكتب البيانات الوصفية إلى الملفات..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "المكتبة"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "يستورد..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "أو_قف الاستيراد"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "أوقف استيراد الصور"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "يُحضّر للاستيراد..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "تم استيراد %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "ا_حفظ"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "احفظ الصورة"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "احفظ _كـ..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "احفظ الصورة باسم مختلف"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "اطبع الصورة بالطابعة المتصلة بحاسبك"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s غير موجود."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ليس ملفا."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s لا يدعم صيغة الملف لـ\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "ا_حفظ نسخة"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "هل ترغب بفقدان التغيرات على %s؟"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "أغلق _دون حفظ"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "حال خطأ دون الحفظ في %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "احفظ كـ"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "تعذّر مراقبة %s لأنه ليس مجلدًا (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "مدير الصور"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "عارض الصور"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "حقوق النسخ محفوظة 2009-2013 مؤسسة يوربا"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "دوّر ي_مينا"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "دوّر"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "دوّر يمينا"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "دوّر الصور إلى اليمين (اضغط Ctrl لتدويرها إلى اليسار)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "دوّر ي_سارا"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "دوّر يسارا"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "دوّر الصور إلى اليسار"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "اقلب أف_قيا"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "اقلب أفقيا"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "اقلب رأ_سيا"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "اقلب رأسيا"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_حسّن"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "حسّن"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "حسّن مظهر الصورة تلقائيًا"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "ا_قتص"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "اقتص"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "اقتص من الصورة"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "ا_عتدل"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "اعتدل"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "اعتدل الصورة"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "أزل ا_حمرار العين"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "أزل احمرار العين"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "خفّض أو أزِل تأثير احمرار العين من الصورة"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "ا_ضبط"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "اضبط"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "اضبط ألوان الصورة وتناغمها"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "ا_سترجع إلى الأصل"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "استرجع إلى الأصل"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "عودة عن الت_عديلات الخارجية"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "عُد إلى الصورة الرئيسية"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "عيّن كخلفية ل_سطح المكتب"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "عيّن الصورة المختارة كخلفية جديدة لسطح المكتب"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "عيّن كعرض شرائح ل_سطح المكتب..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_تراجع عن"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "تراجع عن"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "أ_عد"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "أعِد"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_غيّر تسمية الحدث..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "اجعلها صورة ال_غلاف للحدث"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "اجعلها صورة الغلاف للحدث"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "حدث _جديد"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "حدث جديد"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "انقل الصور"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "انقل الصور إلى حدث"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ا_دمج الأحداث"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "الدمج"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "ادمج الأحداث داخل حدث واحد"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_ضع تقييم"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "ضع تقييم"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "غيّر تقييم الصورة"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_زد"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "زِد التقييم"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "ا_خفض"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "اخفض التقييم"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_دون تقييم"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "غير مقيّم"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "تقييم غير المقيّم"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "الضبط كغير مقيّم"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "إزالة أي تقييم"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "م_رفوض"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "مرفوض"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "التقييم مرفوض"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "الضبط كمرفوض"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "عيّن التقييم كمرفوض"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "المرفوض _فقط"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "المرفوض فقط"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "عرض الصور المرفوضة فقط"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "الكل + الم_رفوض"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "عرض كل الصور، إضافة إلى المرفوضة"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_كل الصور"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "عرض جميع الصور"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "الت_قييمات"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "اعرض التقييم لكل صورة"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ت_رشّيح الصور"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ترشيح الصور"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "الحد من عدد الصور المعروضة بناءً على مرشّح"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_كرّر"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "كرّر"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "كرّر الصورة"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_صدّر..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "ا_طبع..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "ا_نشر..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "انشر"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "أنشر إلى عدة مواقع وِب"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "عدّل ال_عنوان..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "عدّل الت_عليق..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "تعديل التعليق"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "عدّل الوقت والتاريخ..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "تعديل الوقت والتاريخ"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "أضف و_سوم..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "أضف _وسوم..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "إضافة وسوم"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "الت_فضيلات"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "افتح باستخدام المُحرّر ال_خارجي"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "افتح باستخدام محرر RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "أ_رسل إلى..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "أر_سل إلى..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "ا_بحث..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "ابحث"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "اعثر على صورة عن طريق البحث بالاسم أو بالوسوم"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_علّم"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "أ_زل العلامة"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "تعذّر تشغيل المُحرّر: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "أضف الوسم \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "أضف وسمي \"%s\" و \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "ا_حذف الوسم \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "احذف الوسم \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "احذف الوسم"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_جديد"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_غيّر تسمية الوسم \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "غيّر تسمية الوسم \"%s\" إلى \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_غيّر التسمية..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ع_دّل الوسوم..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "تعديل الوسوم"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "اوسم الصورة بـ \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "وسم الصور بـ \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "وسم الصورة المختارة كـ \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "وسم الصور المختارة بـ \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "أزِل الوسم \"%s\" من ال_صورة"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "إزالة الوسم \"%s\" من ال_صور"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "أزل الوسم \"%s\" من الصورة"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "إزالة الوسم \"%s\" من الصور"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "تعذّر تغيير تسمية الوسم إلى \"%s\" بسبب وجود وسم آخر بهذا الاسم."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "تعذّر تغيير تسمية البحث إلى \"%s\" بسبب وجود بحث بهذا الاسم."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "بحث محفوظ"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "احذف البحث"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_عدّل..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "غيّر ال_تسمية..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "غيّر تسمية البحث \"%s\" إلى \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "احذف البحث \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "قيّم %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "عيّن تقييم لـ %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "يعيّن التقييم لـ %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "اعرض %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "فقط عرض الصور ذات التقييم %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s أو أفضل"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "اعرض %s أو أفضل"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "فقط عرض الصور ذات التقييم %s أو أفضل"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "أزِل الصور المختارة من المهملات"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "احذف الصور المختارة من المكتبة"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "ا_سترجع"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "انقل الصور المختارة إلى المكتبة من جديد"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "اعرض في _مدير الملفّات"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "افتح مجلد الصور المختارة في مدير الملفات"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "تعذّر الفتح في مدير الملفات: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "أ_زل من المكتبة"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ا_نقل إلى المهملات"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "اختر ال_كل"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "اختر كل العناصر"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "الزاوية:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "أ_عد الضبط"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "عودة إلى أبعاد الصورة الحالية"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "طبّق الاقتصاص لهذه الصورة"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "اعكس المحاور"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "بلا قيود"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "مربع"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "شاشة"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "المقاس الأصلي"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "فيديو ذو دقة قياسية (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "فيديو ذو دقة عالية (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "رسالة (8.5 × 11 بوصة)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "صحيفة (11 × 17 بوصة)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "أغلق أداة إحمرار العين"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "أزل أي تأثير لاحمرار العيون في المنطقة المحددة"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "التشبع:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "الصبغة:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "الحرارة:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "الظلال:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "أعد ضبط الألوان"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "إعادة ضبط كل تعديلات الألوان إلى أصلها"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "الحرارة"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "الصبغة"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "التشبع"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "التعرض"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "الظلال"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "زيادة التباين"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ثبّت شريط الأدوات"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ثبّت شريط الأدوات ليبقى ظاهرا"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "غادر ملء الشاشة"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "غادر _ملء الشاشة"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "أ_غلق"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_عن"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "ملء ال_شاشة"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "ال_محتويات"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "الأسئلة المتكررة ب_كثرة"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "أ_بلغ عن مشكلة..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"حدث خطأ فادح عند الوصول إلى مكتبة شُتْ‌وِل. لا يمكن لشُتْ‌وِل الاستمرار.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "زُر موقع يوربا الإلكتروني"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"خالد حسني <khaledhosny@eglug.org>\n"
+"إبراهيم سعيد <ibraheem5000@gmail.com>\n"
+"محمد عزمي الهاشمي <bilarabiahla@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "تعذّر عرض المساعدة: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "تعذّر الانتقال إلى قاعدة بيانات العلل: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "تعذّر عرض الأسئلة المتكررة بكثرة: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "دون عنوان"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "المقاس الأصلي"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "العرض أو الارتفاع"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "العرض"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "الارتفاع"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "اضبط مقاس المصغرات"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "كبّر المصغّرات"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "صغّر المصغّرات"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "رتّب ال_صور"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_شغّل الفيديو"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "افتح ملفات الفيديو المختارة في مشغل الفيديو الافتراضي."
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "الت_عليقات"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "عرض التعليق لكل صورة"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "اعرض وسم كل صورة"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "حسب ال_عنوان"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "ترتيب الصور حسب عناوينها"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "حسب _تاريخ الالتقاط"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "ترتيب الصور حسب تاريخ الالتقاط"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "حسب الت_قييم"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "ترتيب الصور حسب التقييم"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"تعذّر على شُتْ‌وِل تشغيل الفيديو المختار:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "لا صور أو فيديوهات"
+msgstr[1] "صورة/فيديو"
+msgstr[2] "صورتين/فيديوهين"
+msgstr[3] "%d صور/فيديوهات"
+msgstr[4] "%d صورة/فيديو"
+msgstr[5] "%d صورة/فيديو"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "عرض التعليق لكل حدث"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "لا أحداث"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "لم يُعثر على أحداث"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "الأحداث"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "غير مؤرخة"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "لا حدث"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "تعذّر إنشاء مجلد الخبئية %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "تعذّر إنشاء مجلد بيانات %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "الصور"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "تعذّر إنشاء مجلد مؤقت %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "تعذّر إنشاء مجلد بيانات فرعي %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(بدون)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "بدون"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "عشوائي"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "انتقالات عرض الشرائح"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "تعذّر توليد ملف مؤقت لـ %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "يصدّر"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "الملف \"%s\" موجود حاليًا. هل ترغب باستبداله؟"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "ت_خطَ"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "است_بدل"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "استبدل ال_كل"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "صدّر"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "صور"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "فيديوهات"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "صور RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "صور RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "حال خطأ دون تحميل ملف واجهة الاستخدام %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "النوع"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "النشر"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "نُشرت الصور/الفيديوهات المختارة بنجاح."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "نُشرت الفيديوهات المختارة بنجاح."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "نُشرت الصور المختارة بنجاح."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "نُشر الفيديو المختار بنجاح."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "نُشرت الصورة المختارة بنجاح."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "يجلب معلومات الحساب..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "يلج..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "انشر الصور"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "نشر الصور _في:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "انشر الفيديوهات"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "انشر الفيديوهات إ_لى"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "انشر الصور والفيديوهات"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "انشر الصور والفيديوهات إ_لى"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "تعذّر النشر"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"لا يمكن لشُتْ‌وِل نشر العناصر المختارة بسبب عدم وجود إضافات نشر مُفعّلة. لإصلاح "
+"ذلك توجه إلى <b>تحرير %s التفضيلات</b> وفعّل واحدة أو أكثر من إضافات النشر "
+"الموجودة في لسان <b>الإضافات</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "يحضّر للرفع"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "يرفع %d من %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "لا يمكن متابعة النشر في %s بسبب حدوث خطأ:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "لمحاولة النشر في خدمة أخرى، اختر واحدة من القائمة أعلاه."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "_وسم جديد..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "يلزم للنشر ملف مؤقت إلا أنه غير متوفر"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"لم تسجّل دخولك بعد إلى يوتيوب.\n"
+"\n"
+"لا بد من الحصول على حساب لدى غوغل وإعداده لاستخدام يوتيوب قبل المتابعة. "
+"يمكنك إعداد معظم الحسابات بتسجيل الدخول إلى موقع يوتيوب مرة واحدة على الأقل "
+"من المتصفح."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"هناك ملف مطلوب لإكمال عملية النشر ولكنه غير متوفر. لا يمكن مواصلة عملية "
+"النشر على يوتيوب."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "أنت والج حاليا إلى يوتيوب باسم %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "الفيديوهات ستظهر في '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "عام مُدرج"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "عام غير مدرج"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "خاص"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "أساس خدمات النشر"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"لم تلج بعد إلى فليكر.\n"
+"\n"
+"انقر على زر الولوج في فليكر في متصفح الوِب. ستحتاج لمصادقة شُتْ‌وِل كونيكت لربطه "
+"بحساب فليكر الخاص بك."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"لقد ولجت إلى فليكر وخرجت منه خلال هذه الجلسة في شُتْ‌وِل.\n"
+"لمتابعة النشر في فليكر، أغلق شُتْ‌وِل وأعد تشغيله ثم حاول النشر مجددًا."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "يُحضّر للولوج..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"هناك ملف مطلوب لإكمال عملية النشر ولكنه غير متوفر. لا يمكن مواصلة عملية "
+"النشر على فليكر."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "يتحقق من الأذونات..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"أنت والج حاليا إلى فليكر باسم %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"يحدد الحساب المجاني لدى فليكر حجم البيانات التي تستطيع رفعها كل شهر.\n"
+"بقي لديك %d ميغا بايت من حصتك للرفع لهذا الشهر."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "يخوّلك حسابك المدفوع لدى فليكر من القيام بعمليات رفع غير محدودة."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "الصور _مرئية لـ:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "الفيديوهات _مرئية لـ:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "الصور والفيديوهات _مرئية لـ:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "الجميع"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "الأصدقاء والعائلة فقط"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "العائلة فقط"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "الأصدقاء فقط"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "أنا فقط"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 × 375 بكسل"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 × 768 بكسل"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 × 1536 بكسل"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 × 3072 بكسل"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "يُنشئ ألبوم %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr " حالت رسالة خطأ دون النشر على Piwigo، الرجاء المحاولة لاحقًا. "
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"أدخل عنوان مكتبة صورك على Piwigo بالإضافة إلى اسم المستخدم وكلمة السر الخاصة "
+"بالحساب المرتبط بتلك المكتبة."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"لم يتمكن شُتْ‌وِل من الاتصال بمكتبة صورك على Piwigo. برجاء التحقق من العنوان "
+"المُدخل."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"اسم المستخدم أو كلمة السر أو كلاهما غير صحيح. يرجى المحاولة مجددا"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "رابط غير سليم"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "اسم مستخدم غير صحيح أو كلمة سر غير صحيحة"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "شُتْ‌وِل كونيكت"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "المدراء، العائلة، الأصدقاء، جهات الاتصال"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "المدراء، العائلة، الأصدقاء"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "المدراء، العائلة"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "المدراء"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"لم تلج بعد إلى ألبومات بيكاسا.\n"
+"\n"
+"انقر على زرّ الولوج في متصفح الويب لتلج إلى ألبومات بيكاسا على الإنترنت. "
+"أثناء الولوج قد يطلب منك شُتْ‌وِل كونيكت الاستيثاق للوصول إلى صورك على الحساب."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"هناك ملف مطلوب لإكمال عملية النشر ولكنه غير متوفر. لا يمكن مواصلة عملية "
+"النشر على ألبومات بيكاسا."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "يُنشئ الألبوم..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "أنت الآن والج إلى ألبومات بيكاسا على الإنترنت باسم %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "ستظهر الفيديوهات في:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ستظهر الصور في:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "صغير (640 × 480 بكسل)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "متوسط (1024 × 768 بكسل)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "مستحسن (1600 × 1200 بكسل)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "جوجل + (2048 × 1536بكسل)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"لم تلج بعد إلى فيسبوك.\n"
+"\n"
+"إذا لم يكن لديك حساب فيسبوك، تستطيع إنشاء حساب جديد أثناء عملية الولوج. "
+"أثناء الولوج قد يطلب منك شُتْ‌وِل كونيكت الإذن لرفع الصور ونشرها ضمن يومياتك، "
+"يطلب شُتْ‌وِل كونيكت هذه الأذونات ليعمل."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"لقد ولجت إلى فيسبوك وخرجت منه خلال هذه الجلسة في شُتْ‌وِل.\n"
+"لمتابعة النشر في فيسبوك، أغلق شُتْ‌وِل وأعد تشغيله ثم حاول النشر مجددًا."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "قياسي (720 بكسل)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "كبير (2048 بكسل)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "يختبر الاتصال بالفيسبوك..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"هناك ملف مطلوب لإكمال عملية النشر ولكنه غير متوفر. لا يمكن مواصلة عملية "
+"النشر على فيسبوك."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"أنت والج حاليا إلى فيسبوك باسم %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "أين ترغب أن تنشر الصور المختارة؟"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_مقاس الرفع:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "تفتت"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "لوح شطرنج"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "دوائر"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ستائر"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "شرائط"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "دورة ساعة"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "دائرة"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "أساس انتقالات عرض الشرائح"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"جميع الحقوق محفوظة لعام 2010 لصالح ماكسيم كارتاشيف، جميع الحقوق محفوظة خلال "
+"2011-2013 لصالح مؤسسة يوربا"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "انزلاق"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "تلاشي وظهور"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "مربعات"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "أساس خدمات استيراد البيانات"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"أهلًا بك في خدمة الاستيراد من مكتبة إف-سبوت.\n"
+"\n"
+"الرجاء تحديد مكتبة لاستيرادها، إما بتحديد إحدى المكتبات الموجودة والتي وجدها "
+"شُتْ‌وِل، أو بتحديد ملف قاعدة بيانات إف-سبوت بديلة."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"أهلًا بك في خدمة الاستيراد من مكتبة إف-سبوت.\n"
+"\n"
+"الرجاء تحديد ملف قاعدة بيانات لإف-سبوت."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "اختر يدويًا ملف قاعدة بيانات لبرنامج إف-سبوت:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"غير قادر على فتح ملف قاعدة البيانات المحدد لـ إف-سبوت، إما أن الملف غير "
+"موجود أو أنه ليس قاعدة بيانات لـ إف-سبوت."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"غير قادر على فتح ملف قاعدة بيانات إف-سبوت المُحدّد لأن شُتْ‌وِل لا يدعم هذا "
+"الإصدار من قاعدة بيانات إف-سبوت"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"غير قادر على فتح ملف قاعدة بيانات إف-سبوت المُحدّد، حدث خطأ أثناء قراءة جدول "
+"الوسوم"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"غير قادر على فتح ملف قاعدة بيانات إف-سبوت المُحدّد، حدث خطأ أثناء قراءة جدول "
+"الصور"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"وجد شُتْ‌وِل %d صورة في مكتبة إف-سبوت ويعمل الآن على استيرادها، سيتم اكتشاف "
+"الصور المكرّرة تلقائيًا وإزالتها.\n"
+"\n"
+"بإمكانك إغلاق هذه النافذة والبدء باستخدام شُتْ‌وِل بينما ينتهي الاستيراد في "
+"الخلفية."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "مكتبة إف-سبوت: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "يُحضّر للاستيراد"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "تعيين كعرض شرائح لسطح المكتب"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "توليد عرض شرائح خلفية سطح المكتب"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "عرض كل صورة لـ"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "الفترة الزمنية"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "ما هي مدة عرض كل صورة كخلفية لسطح المكتب"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "ابحث"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "ا_سم البحث:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "ي_طابق"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "من التالي:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>حجم الصورة المطبوعة</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "استخدام مقاس _قياسي:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "استخدام مقاس م_خصّص:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "م_طابقة نسبة الارتفاع إلى العرض"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "مقاس _تلقائي:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>العناوين</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "طباعة _عنوان الصورة"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "إ_خراج الصورة بـ:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "بكسل لكل بوصة"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "التسمية"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "تفضيلات شُتْ‌وِل"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "أبيض"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "أسود"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_مراقبة مجلد المكتبة للملفات الجديدة"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "البيانات الوصفية"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"كتابة الوسوم، والعناوين، وبقية البيانات الو_صفية الأخرى إلى ملفات الصور"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "العرض"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "ا_ستورد الصور إلى:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "ال_خلفية:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "الاستيراد"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "بُنية الو_جهة:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ال_نمط:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "مثال:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "ت_غيير تسمية الملفات المستوردة إلى أحرف صغيرة"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "مطور RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "الا_فتراضي:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "محرّر الصور ال_خارجي:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "محرر _RAW الخارجي:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "المحرّرات الخارجية"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "الإضافات"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "ال_تأخير:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "تأثير الا_نتقال:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "_فترة الانتقال:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "عرض ال_عنوان"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "ثانية/ثوان"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "و_لوج"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "النشر في ألبوم _موجود:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "إنشاء ألبوم _جديد باسم:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "الفيديوهات وألبومات الصور الجديدة تكون _مرئية لـ:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "ا_خرج"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "ا_نشر"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "أدخل رقم التأكيد الذي سيظهر لك بعد الولوج إلى فليكر من المتصفح."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_رقم التأكيد:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "م_قاس الصورة:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "ألبوم _موجود:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "ألبوم _جديد باسم:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_سرد الألبوم في المجلد العام"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "م_قاس الصورة:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_عنوان URL لمكتبة صورك على Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "ا_سم المستخدم"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "كلمة ال_سر"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "ت_ذكّر كلمة السر"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "ولوج"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "تصنيف _موجود:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "الصور ستكون م_رئية لـ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "مقاس الصورة:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "خروج"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "إ_عدادات الخصوصية للفيديو:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "حقوق النسخ محفوظة 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 بكسل"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "أدخِل اسم المستخدم وكلمة السر المرتبطان بحسابك على Tumblr."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "تعذّر تحميل واجهة المستخدم: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"أنت والج حاليا إلى حسابك على Tumblr باسم %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "حقوق النشر محفوظة 2010+ لصالح إفجيني بوليكوف <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "زوروا موقع ياندكس فوتكي على الإنترنت"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "لم تلج بعد إلى ياندكس فوتكي."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "عنوان ال_بريد الإلكتروني"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "المدونات:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "الأ_لبومات (أو اكتب واحدا جديدا):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_نوع الوصول:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "تعطيل الت_عليقات"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_حظر تنزيل الصورة الأصلية"
diff --git a/po/as.po b/po/as.po
new file mode 100644
index 0000000..4c9395f
--- /dev/null
+++ b/po/as.po
@@ -0,0 +1,4738 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# ngoswami <ngoswami@redhat.com>, 2012.
+# ngoswami <ngoswami@redhat.com>, 2012-2013, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-02-05 00:58+0000\n"
+"PO-Revision-Date: 2014-02-06 15:47+0630\n"
+"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
+"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
+"language/as/)\n"
+"Language: as\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "প্ৰকাশ কৰাৰ বাবে এটা অস্থায়ী ফাইল অনুপস্থিত"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"আপুনি এই Shotwell অধিবেশনৰ সময়ত ইতিমধ্যে এটা Google সেৱাৰ পৰা লগিন আৰু লগআউট "
+"কৰিছে।\n"
+"\n"
+"Google সেৱাসমূহলৈ প্ৰকাশ কৰা অব্যাহত ৰাখিবলে, Shotwell প্ৰস্থান কৰি পুনাৰম্ভ "
+"কৰক, "
+"তাৰ পিছত পুনৰ প্ৰকাশ কৰাৰ চেষ্টা কৰক।"
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Yorba ৱেব ছাইট ভ্ৰমণ কৰক"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr "নীলমদ্যুতি গোস্বামী (ngoswami@redhat.com)"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+#| msgid "Copyright 2009-2013 Yorba Foundation"
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "স্বত্বাধিকাৰ ২০০৯-২০১৪ Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot লাইব্ৰেৰী ইমপোৰ্ট সেৱালে স্বাগতম।\n"
+"\n"
+"অনুগ্ৰহ কৰি ইমপোৰ্ট কৰিবলে এটা লাইব্ৰেৰী বাছক, হয় Shotwell দ্বাৰা সন্ধান কৰা "
+"লাইব্ৰেৰীসমূহৰ এটা নিৰ্বাচন কৰি অথবা এটা বৈকল্পিক F-Spot ডাটাবেইচ ফাইল "
+"নিৰ্বাচন "
+"কৰি।"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot লাইব্ৰেৰী ইমপোৰ্ট সেৱালে স্বাগতম।\n"
+"\n"
+"অনুগ্ৰহ কৰি এটা F-Spot ডাটাবেইচ ফাইল বাছক।"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "ইমপোৰ্ট কৰিবলে এটা F-Spot ডাটাবেইচ হস্তচালিতভাৱে বাছক:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"নিৰ্বাচিত F-Spot ডাটাবেইচ ফাইল খোলিব নোৱাৰি: ফাইল অস্তিত্ববান নহয় অথবা এটা F-"
+"Spot ডাটাবেইচ নহয়"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"নিৰ্বাচিত F-Spot ডাটাবেইচ ফাইল খোলিব নোৱাৰি: F-Spot ডাটাবেইচৰ এই সংস্কৰণ "
+"Shotwell দ্বাৰা সমৰ্থিত নহয়"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "নিৰ্বাচিত F-Spot ডাটাবেইচ ফাইল পঢ়িব নোৱাৰি: টেগসমূহ টেবুল পঢ়োতে ত্ৰুটি"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"নিৰ্বাচিত F-Spot ডাটাবেইচ ফাইল পঢ়িব নোৱাৰি: ফ'টোসমূহ টেবুল পঢ়োতে ত্ৰুটি"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell এ F-Spot লাইব্ৰেৰীত %d ফ'টোসমূহ পাইছে আৰু বৰ্তমানে সিহতক ইমপোৰ্ট কৰি "
+"আছে। প্ৰতিলিপিসমূহ স্বচালিতভাৱে চিনাক্ত কৰি আতৰোৱা হব।\n"
+"\n"
+"আপুনি এই ডাইলগ বন্ধ কৰি Shotwell ব্যৱহাৰ কৰা আৰম্ভ কৰিব পাৰে যি সময়ত ইমপোৰ্ট "
+"পটভূমিত চলি থাকিব।"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot লাইব্ৰেৰী: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "ইমপোৰ্ট কৰাৰ প্ৰস্তুতি লোৱা হৈছে"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "কেন্দ্ৰীয় তথ্য ইমপোৰ্ট সেৱাসমূহ"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "স্বত্বাধিকাৰ 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 পিক্সেলসমূহ"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 পিক্সেলসমূহ"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 পিক্সেলসমূহ"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' এটা OAuth প্ৰমাণীকৰণ অনুৰোধলে এটা বৈধ প্ৰতিক্ৰিয়া নহয়"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): আৰম্ভ হব নোৱাৰে; এই প্ৰকাশকক পুনৰাম্ভ কৰিব নোৱাৰি।"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "আপোনাৰ Tumblr একাওন্টৰ সৈতে জড়িত ব্যৱহাৰকাৰীনাম আৰু পাছৱাৰ্ড সুমুৱাওক।"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "ব্যৱহাৰকাৰীনাম আৰু/অথবা পাছৱাৰ্ড অবৈধ। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "অবৈধ ব্যৱহাৰকাৰী নাম অথবা পাছৱাৰ্ড"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI ল'ড কৰিব পৰা নগল: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"আপুনি Tumblr ত %s হিচাপে লগ্গড ইন আছে।\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "স্বত্বাধিকাৰ ২০১০+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki ৱেব ছাইট ভ্ৰমণ কৰক"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "আপুনি বৰ্তমানে Yandex.Fotki ত লগ্গড ইন নাই।"
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+#| msgid "Core Publishing Services"
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell ৰ অতিৰিক্ত প্ৰকাশ সেৱা"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "লেবেল"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "ই-মেইল ঠিকনা (_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "পাছৱাৰ্ড (_P)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "লগিন"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "ব্লগসমূহ:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "ফ'টোৰ আকাৰ (_s):"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "লগআউট কৰক (_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "প্ৰকাশ কৰক (_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "এলবামসমূহ (অথবা নতুন লিখক) (_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "অভিগমৰ ধৰণ (_t):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "মন্তব্যসমূহ অসামৰ্থবান কৰক (_c)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "প্ৰকৃত ফ'টো ডাউনল'ড কৰাৰ পৰা বাধা দিয়ক (_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+#| msgid "Publish"
+msgid "Public"
+msgstr "ৰাজহুৱা"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "বন্ধুসকল"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "ব্যক্তিগত"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell সংযোগ"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"আপুনি বৰ্তমানে Facebook ত লগিন আছে।\n"
+"\n"
+"আপোনাৰ যদি এতিয়াও এটা Facebook একাওন্ট নাই, আপুনি লগিন কৰি থাকোতে এটা সৃষ্টি "
+"কৰিব পাৰিব। লগিনৰ সময়ত, Shotwell সংযোগে আপোনাক ফ'টোসমূহ আপল'ড কৰাৰ আৰু আপোনাৰ "
+"ফিডলে প্ৰকাশ কৰাৰ অনুমতি বিচাৰিব পাৰে। Shotwell সংযোগ কাৰ্য্য কৰিবলে এই "
+"অনুমতিসমূহৰ প্ৰয়োজন।"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"আপুনি এই Shotwell অধিবেশনৰ সময়ত ইতিমধ্যে Facebook ৰ পৰা লগিন আৰু লগআউট "
+"কৰিছে।\n"
+"Facebook ত প্ৰকাশ কৰা অব্যাহত ৰাখিবলে, Shotwell প্ৰস্থান কৰি পুনাৰম্ভ কৰক, "
+"তাৰ "
+"পিছত পুনৰ প্ৰকাশ কৰাৰ চেষ্টা কৰক।"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "প্ৰামাণিক (720 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "ডাঙৰ (2048 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook লে সংযোগ পৰিক্ষা কৰা হৈছে..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "এলবাম সৃষ্টি কৰা হৈছে..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"প্ৰকাশ কৰাৰ বাবে প্ৰয়োজনীয় এটা ফাইল অনুপস্থিত। Facebook লে প্ৰকাশ কৰাটো "
+"অব্যাহত "
+"ৰাখিব নোৱাৰি।"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"আপুনি Facebook লে %s হিচাপে লগিন আছে।\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "আপুনি নিৰ্বাচিত ফ'টোসমূহ কিধৰণে প্ৰকাশ কৰিব বিচাৰে?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "আপল'ডৰ আকাৰ (_s):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "কেৱল মই"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "সকলো"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"আপুনি বৰ্তমানে Flickr ত লগিন আছে।\n"
+"\n"
+"আপোনাৰ ৱেব ব্ৰাউছাৰত Flickr ত লগিন কৰিবলে লগিন ক্লিক কৰক। আপোনাৰ Flickr "
+"একাওন্টৰ সৈতে সংযেগ কৰিবলে আপুনি Shotwell সংযোগক প্ৰমাণীত কৰিব লাগিব।"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"আপুনি এই Shotwell অধিবেশনৰ সময়ত ইতিমধ্যে Flickr ৰ পৰা লগিন আৰু লগআউট কৰিছে।\n"
+"Flickr ত প্ৰকাশ কৰা অব্যাহত ৰাখিবলে, Shotwell প্ৰস্থান কৰি পুনাৰম্ভ কৰক, তাৰ "
+"পিছত "
+"পুনৰ প্ৰকাশ কৰাৰ চেষ্টা কৰক।"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "লগিনৰ বাবে প্ৰস্তুত কৰা হৈছে..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"প্ৰকাশ কৰাৰ বাবে প্ৰয়োজনীয় এটা ফাইল অনুপস্থিত। Flickr লে প্ৰকাশ কৰাটো অব্যাহত "
+"ৰাখিব নোৱাৰি।"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "অনুমোদন সতাসত্য নিৰূপণ কৰা হৈছে..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"আপুনি Flickr লে %s হিচাপে লগিন আছে।\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"আপোনাৰ বিনামূলীয়া Flickr একাওন্টে আপুনি কিমান তথ্য প্ৰতি মাহে আপল'ড কৰিব সেয়া "
+"সীমিত কৰে।\n"
+"এই মাহত, আপোনাৰ আপল'ড কুটাৰ %d মেগাবাইট অৱশিষ্ট আছে।"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "আপোনাৰ Flickr Pro একাওন্টে আপোনাক অসীমিত আপল'ড কৰাৰ সুবিধা দিয়ে।"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ফ'টোসমূহ দৃশ্যমান (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "ভিডিঅ'সমূহ দৃশ্যমান (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ফ'টোসমূহ আৰু ভিডিঅ'সমূহ দৃশ্যমান (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "কেৱল বন্ধুসকল আৰু পৰিয়াল সদস্যসকল"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "কেৱল পৰিয়াল সদস্যসকল"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "কেৱল বন্ধুসকল"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 পিক্সেলসমূহ"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 পিক্সেলসমূহ"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "প্ৰকৃত আকাৰ"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"আপুনি বৰ্তমানে Picasa ৱেব এলবামসমূহত লগিন আছে।\n"
+"\n"
+"আপোনাৰ ৱেব ব্ৰাউছাৰত Picasa ৱেব এলবামসমূহত লগিন কৰিবলে লগিন ক্লিক কৰক। "
+"আপোনাৰ "
+"Picasa ৱেব এলবামসমূহ একাওন্টৰ সৈতে সংযেগ কৰিবলে আপুনি Shotwell ক প্ৰমাণীত "
+"কৰিব "
+"লাগিব।"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"প্ৰকাশ কৰাৰ বাবে প্ৰয়োজনীয় এটা ফাইল অনুপস্থিত। Picasa লে প্ৰকাশ কৰাটো অব্যাহত "
+"ৰাখিব নোৱাৰি।"
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "আপুনি Picasa ৱেব এলবামসমূহলে %s হিচাপে লগিন আছে।"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "ভিডিঅ'সমূহ উপস্থিত হব:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "ফ'টোসমূহ উপস্থিত হব:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "সৰু (640 x 480 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "মধ্যম (1024 x 768 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "উপদেশিত (1600 x 1200 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 পিক্সেলসমূহ)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "প্ৰকৃত আকাৰ"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "এলবাম %s সৃষ্টি কৰা হৈছে..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Piwigo লে প্ৰকাশ কৰোতে এটা ত্ৰুটি বাৰ্তা দেখা দিলে। অনুগ্ৰহ কৰি পুনৰ চেষ্টা "
+"কৰক।"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"আপোনাৰ Piwigo ফ'টো লাইব্ৰেৰীৰ URL সুমুৱাওক লগতে সেই লাইব্ৰেৰীৰ বাবে আপোনাৰ "
+"Piwigo একাওন্টৰ সৈতে সংযুক্ত ব্যৱহাৰকাৰীনাম আৰু পাছৱাৰ্ড সুমুৱাওক।"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell এ আপোনাৰ Piwigo ফ'টো লাইব্ৰেৰীৰ সৈতে সংযোগ কৰিব নোৱাৰে। অনুগ্ৰহ কৰি "
+"আপুনি সুমুৱা URL সতাসত্য নিৰূপণ কৰক"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "অবৈধ URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "প্ৰশাসকসমূহ, পৰিয়াল, বন্ধুসকল, পৰিচয়সমূহ"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "প্ৰশাসকসমূহ, পৰিয়াল, বন্ধুসকল"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "প্ৰশাসকসমূহ, পৰিয়াল"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "প্ৰশাসকসমূহ"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"আপুনি বৰ্তমানে Youtube ত লগিন আছে।\n"
+"\n"
+"আপুনি হয়তো ইতিমধ্যে এটা Google একাওন্টৰ বাবে ছাইন আপ কৰিছে আৰু আগবাঢ়িবলে "
+"Youtube "
+"ৰ সৈতে ব্যৱহাৰৰ বাবে সংস্থাপন কৰিছে। আপুনি বেছিৰভাগ একাওন্টক আপোনাৰ ব্ৰাউছাৰ "
+"ব্যৱহাৰ কৰি Youtube ছাইটত অন্তত এবাৰ লগিন কৰি সংস্থাপন কৰিব পাৰিব।"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"প্ৰকাশ কৰাৰ বাবে প্ৰয়োজনীয় এটা ফাইল অনুপস্থিত। Youtube লে প্ৰকাশ কৰাটো "
+"অব্যাহত "
+"ৰাখিব নোৱাৰি।"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "আপুনি YouTube লে %s হিচাপে লগিন আছে।"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "ভিডিঅ'সমূহ '%s' ত উপস্থিত হব"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "ৰাজহুৱাভাৱে তালিকাভুক্ত"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "ৰাজহুৱাভাৱে তালিকাৰ বাহিৰ"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "এটা অস্তিত্ববান এলবামলৈ প্ৰকাশ কৰক (_x):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "চিহ্নিত নামৰ এটা নতুন এলবাম সৃষ্টি কৰক (_n):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "ভিডিঅ'সমূহ আৰু নতুন ফ'টো এলবামসমূহ চিহ্নিত বস্তুলৈ দৃশ্যমান:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"আপল'ড কৰাৰ আগত অৱস্থান, কেমেৰা, আৰু অন্য চিনাক্ত কৰিব পৰা তথ্য আতৰাওক (_R)"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"আপুনি আপোনাৰ ৱেব ব্ৰাউছাৰত Flickr ত লগিন কৰাৰ পিছত উপস্থিত হোৱা নিশ্চিতকৰণ "
+"সংখ্যা "
+"সুমুৱাওক।"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "প্ৰমাণীকৰণ সংখ্যা (_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "অব্যাহত ৰাখক (_t)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "এটা অস্তিত্ববান এলবাম (_e):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "চিহ্নিত নামৰ এটা নতুন এলবাম (_n):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "ৰাজহুৱা গেলাৰিত এলবাম তালিকাভুক্ত কৰক (_i)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "ফ'টোৰ আকাৰ পুৰ্বসংহতি (_s):"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "আপোনাৰ Piwigo ফ'টো লাইব্ৰেৰীৰ URL (_U)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "ব্যৱহাৰকাৰী নাম (_n)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "পাছৱাৰ্ড মনত ৰাখক (_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "এটা অস্তিত্ববান বিভাগ (_e):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "ফ'টোসমূহ চিহ্নিত ব্যক্তিসকল দ্বাৰা দৃশ্যমান হব (_v):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "ফ'টোৰ আকাৰ:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "চিহ্নিত বিভাগৰ অন্তৰ্গত:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "এলবাম মন্তব্য:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"যদি এটা শীৰ্ষক সংহতি আৰু মন্তব্য অসংহতি কৰা আছে, শীৰ্ষকক মন্তব্য ৰূপে ব্যৱহাৰ "
+"কৰক (_I)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "টেগসমূহ আপল'ড নকৰিব (_D)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "লগআউট কৰক"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "প্ৰকাশ কৰক"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "কেন্দ্ৰীয় প্ৰকাশ কৰা সেৱাসমূহ"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "ভিডিঅ' গোপনীয়তা সংহতি (_s):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ব্লাইণ্ডচ্"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "দবা"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "বৃত্ত"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "বৃত্তবোৰ"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ঘড়ী"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "ক্ৰাম্বুল"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "নিস্তেজ"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "স্লাইড"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "বৰ্গসমূহ"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "স্ট্ৰাইপ্চ"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "কেন্দ্ৰীয় স্লাইডশ্ব পৰিবৰ্তনসমূহ"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+#| msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr ""
+"স্বত্বাধিকাৰ ২০১০ মেক্সিম কাৰ্টাশেভ, স্বত্বাধিকাৰ ২০১১-২০১৪ Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "ক্যাশ ডাইৰেকটৰি %s সৃষ্টি কৰিবলে অক্ষম: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "তথ্য ডাইৰেকটৰি %s সৃষ্টি কৰিবলে অক্ষম: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ছবিসমূহ"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "অস্থায়ী ডাইৰেকটৰি %s সৃষ্টি কৰিবলে অক্ষম: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "তথ্য চাবডাইৰেকটৰি %s সৃষ্টি কৰিবলে অক্ষম: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "পিন টুলবাৰ"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "টুলবাৰক খোলিবলে পিন কৰক"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "পূৰ্ণপৰ্দা ত্যাগ কৰক"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "পূৰ্ণপৰ্দা ত্যাগ কৰক (_F)"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "প্ৰস্থান কৰক (_Q)"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "বিষয়ে (_A)"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "পূৰ্ণপৰ্দা (_c)"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "সমলসমূহ (_C)"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "সঘনে সোধা প্ৰশ্নসমূহ (_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "এটা সমস্যা সংবাদন কৰক (_R)..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "বাতিল কৰক (_C)"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell ৰ লাইব্ৰেৰী অভিগম কৰোতে এটা মাৰাত্মক ত্ৰুটি দেখা দিলে। Shotwell "
+"আগবাঢ়িব নোৱাৰে।\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "সহায় প্ৰদৰ্শন কৰিবলে অক্ষম: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ডাটাবেইচ বাগ কৰিবলে দিশনিৰ্ণয় কৰিবলে অক্ষম: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ প্ৰদৰ্শন কৰিবলে অক্ষম: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "সফলতা"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "ফাইল ত্ৰুটি"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ফাইল ডিক'ড কৰিবলে অক্ষম"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ডাটাবেইচ ত্ৰুটি"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ব্যৱহাৰকাৰীয়ে ইমপোৰ্ট বাতিল কৰিলে"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "এটা ফাইল নহয়"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ফাইল ডাটাবেইচত ইতিমধ্যে অস্তিত্ববান"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "অসমৰ্থিত ফাইল বিন্যাস"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "এটা ছবি ফাইল নহয়"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ডিস্ক ব্যৰ্থতা"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ডিস্ক ভৰ্তি"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "কেমেৰা ত্ৰুটি"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ফাইল লিখা ত্ৰুটি"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "ক্ষতিগ্ৰস্থ ছবি ফাইল"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "ইমপোৰ্টেড ব্যৰ্থ হল (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "স্লাইডশ্ব' (_l)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "এটা স্লাইডশ্ব চলাওক"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ফ'টো/ভিডিঅ' এক্সপোৰ্ট কৰক"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ফ'টোসমূহ/ভিডিঅ'সমূহ এক্সপোৰ্ট কৰক"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "ফ'টো এক্সপোৰ্ট কৰক"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ফ'টোসমূহ এক্সপোৰ্ট কৰক"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ঘুৰোৱা হৈছে"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "ঘূৰ্ণন বাতিল কৰা হৈছে"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "আনুভুমিকভাৱে উলোটোৱা হৈছে"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "আনুভুমিকভাৱে উলোটোৱা বাতিল কৰা হৈছে"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "উলম্বভাৱে উলোটোৱা হৈছে"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "উলম্বভাৱে উলোটোৱা বাতিল কৰা হৈছে"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "উলোটা কৰা হৈছে"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "উলোটোৱা কাৰ্য্য বাতিল কৰা হৈছে"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "বৃদ্ধি কৰা হৈছে"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "বৃদ্ধি কৰা কাৰ্য্য বাতিল কৰা হৈছে"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "ৰঙৰ পৰিবৰ্তনসমূহ প্ৰয়োগ কৰা হৈছে"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "প্ৰয়োগ কৰা ৰঙৰ পৰিবৰ্তনসমূহ আতৰোৱা হৈছে"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "নতুন ঘটনা সৃষ্টি কৰা হৈছে"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ঘটনা আতৰোৱা হৈছে"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ফ'টোসমূহক নতুন ঘটনাত স্থানান্তৰ কৰা হৈছে"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ফ'টোসমূহক পূৰ্বৱৰ্তী ঘটনালে সংহতি কৰা হৈছে"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "একত্ৰিকৰণ কৰা হৈছে"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "একত্ৰিকৰণ আতৰোৱা হৈছে"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ফ'টোসমূহ প্ৰতিলিপিত কৰা হৈছে"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "প্ৰতিলিপিত ফ'টোসমূহ আতৰোৱা হৈছে"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "এটা ফাইল ত্ৰুটিৰ বাবে এটা ফ'টো প্ৰতিলিপি কৰিবলে অক্ষম"
+msgstr[1] "ফাইল ত্ৰুটিসমূহৰ বাবে %d ফ'টোসমূহ প্ৰতিলিপি কৰিবলে অক্ষম"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "পূৰ্বৱৰ্তী ৰেটিংসমূহ পুনৰুদ্ধাৰ কৰা হৈছে"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "ৰেটিংসমূহ বৃদ্ধি কৰা হৈছে"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "ৰেটিংসমূহ কম কৰা হৈছে"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW উন্নয়নকাৰী সংহতি কৰা হৈছে"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "পূৰ্বৱৰ্তী RAW উন্নয়নকাৰী পুনৰুদ্ধাৰ কৰা হৈছে"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "উন্নয়নকাৰী সংহতি কৰক"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "প্ৰকৃত ফ'টো ব্যৱস্থাপনা কৰিব পৰা নগল।"
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "তাৰিখ আৰু সময় ব্যৱস্থাপনা কৰা হৈছে"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "তাৰিখ আৰু সময় ব্যৱস্থাপনা কৰা বাতিল কৰা হৈছে"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "এটা প্ৰকৃত ফ'টো ব্যৱস্থাপনা কৰিব পৰা নগল।"
+msgstr[1] "নিম্নলিখিত প্ৰকৃত ফ'টোসমূহ ব্যৱস্থাপনা কৰিব পৰা নগল।"
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "সময় ব্যৱস্থাপনা ত্ৰুটি"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "নিম্নলিখিত ফ'টো ফাইলত সময় ব্যৱস্থাপনাসমূহ কৰিব পৰা নগল।"
+msgstr[1] "নিম্নলিখিত ফ'টো ফাইলসমূহত সময় ব্যৱস্থাপনাসমূহ কৰিব পৰা নগল।"
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "টেগ সৃষ্টি কৰক"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "টেগ \"%s\" স্থানান্তৰ কৰক"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ফ'টোসমূহক আবৰ্জনালে স্থানান্তৰ কৰক"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ফ'টোসমূহক আবৰ্জনাৰ পৰা পুনৰুদ্ধাৰ কৰক"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ফ'টোসমূহক Shotwell আবৰ্জনালে স্থানান্তৰ কৰক"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ফ'টোসমূহক Shotwell লাইব্ৰেৰীলে পুনৰ স্থাপন কৰক"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ফ'টোসমূহক আবৰ্জনালে স্থানান্তৰ কৰা হৈছে"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "ফ'টোসমূহক আবৰ্জনাৰ পৰা পুনৰুদ্ধাৰ কৰা হৈছে"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ ফ্লেগ কৰক"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ আনফ্লেগ কৰক"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ ফ্লেগ কৰা হৈছে"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ আনফ্লেগ কৰা হৈছে"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "ফ্লেগ"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "আনফ্লেগ কৰক"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To আৰম্ভ কৰিবলে অক্ষম: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "লে পঠাওক"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "পটভূমিক %s লে এক্সপোৰ্ট কৰিবলে অক্ষম: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ডেস্কটপ স্লাইডশ্ব প্ৰস্তুত কৰিবলে অক্ষম: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "ই এটা ফ'টোৰ পৰা টেগ \"%s\" আতৰাব। আগবাঢ়িব নে?"
+msgstr[1] "ই টেগ \"%s\" আতৰাব %d ফ'টোসমূহৰ পৰা । আগবাঢ়িব নে?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "মচি পেলাওক (_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "ই সংৰক্ষিত সন্ধান \"%s\" আতৰাব। আগবাঢ়িব নে?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"উন্নয়নকাৰী পৰিবৰ্তন কৰিলে আপুনি Shotwell ত এই ফ'টোৰ বাবে কৰা সকলো পৰিবৰ্তন "
+"বাতিল "
+"হব"
+msgstr[1] ""
+"উন্নয়নকাৰীসমূহ পৰিবৰ্তন কৰিলে আপুনি Shotwell ত এই ফ'টোৰ বাবে কৰা সকলো "
+"পৰিবৰ্তন "
+"বাতিল হব"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "উন্নয়নকাৰী পৰিবৰ্তন কৰক (_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ভিডিঅ' এক্সপোৰ্ট কৰক"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell এ এই ফ'টো সম্পাদন কৰাৰ বাবে এটা ফাইল সৃষ্টি কৰিব নোৱাৰিলে কাৰণ "
+"আপোনাৰ "
+"ওচৰত %s লে লিখাৰ অনুমতি নাই।"
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"এটা ফাইল ত্ৰুটিৰ বাবে নিম্নলিখিত ফ'টো এক্সপোৰ্ট কৰিবলে অক্ষম।\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"আপুনি এক্সপোৰ্ট কৰাটো অব্যাহত ৰাখিব বিচাৰে নে"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "অপৰিবৰ্তিত"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "বৰ্তমান"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "বিন্যাস (_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "গুণ (_Q):"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "স্কেইলিংৰ বাধা (_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " পিক্সেলসমূহ (_p)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "মেটাডাটা এক্সপোৰ্ট কৰক"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "বিৱৰণসমূহ সংৰক্ষণ কৰক..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "বিৱৰণসমূহ সংৰক্ষণ কৰক"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(আৰু %d অধিক)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "পৰিণামসমূহৰ সংবাদ ইমপোৰ্ট কৰক"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ফাইল ইমপোৰ্ট কৰাৰ চেষ্টা কৰা হৈছিল।"
+msgstr[1] "%d ফাইলসমূহ ইমপোৰ্ট কৰাৰ চেষ্টা কৰা হৈছিল।"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "ইয়াৰ মাজত, %d ফাইল সফলভাৱে ইমপোৰ্ট কৰা হৈছিল।"
+msgstr[1] "ইয়াৰ মাজত, %d ফাইলসমূহ সফলভাৱে ইমপোৰ্ট কৰা হৈছিল।"
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "প্ৰতিলিপিত ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা হোৱা নাই:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "প্ৰতিলিপি স্থায়ী মাধ্যম বস্তু"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "কেমেৰা ত্ৰুটিসমূহৰ বাবে ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা হোৱা নাছিল:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "ত্ৰুটি বাৰ্তা:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"ফাইলসমূহ ইমপোৰ্ট কৰা নহল কাৰণ সিহতক ফ'টো অথবা ভিডিঅ' হিচাপে চিনাক্ত কৰা হোৱা "
+"নাছিল:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা হোৱা নাছিল কাৰণ সিহত Shotwell এ বুজিব পৰা এটা "
+"বিন্যাসত নাছিল:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা হোৱা নাছিল কাৰণ Shotwell এ সিহতক নিজৰ "
+"লাইব্ৰেৰীত "
+"কপি কৰিব নোৱাৰিলে:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"কপি কৰিব পৰা নগল %s\n"
+"\tto %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+"ফাইলসমূহ ক্ষতিগ্ৰস্থ হোৱা বাবে ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা হোৱা নাই:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "অন্য কাৰণসমূহৰ বাবে ফ'টোসমূহ/ভিডিঅ'সমূহ ইমপোৰ্ট কৰা নহল:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "১ টা প্ৰতিলিপিত ফ'টো ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+msgstr[1] "%d প্ৰতিলিপিত ফ'টো ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "১ টা প্ৰতিলিপিত ভিডিঅ' ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+msgstr[1] "%d প্ৰতিলিপিত ভিডিঅ' ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "১ টা প্ৰতিলিপিত ফ'টো/ভিডিঅ' ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+msgstr[1] "%d প্ৰতিলিপিত ফ'টো/ভিডিঅ' ইমপোৰ্ট কৰা হোৱা নাছিল:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে ১ টা ফ'টো ইমপোৰ্ট ব্যৰ্থ হল:\n"
+msgstr[1] "এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে %d ফ'টো ইমপোৰ্ট ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে ১ টা ভিডিঅ' ইমপোৰ্ট ব্যৰ্থ হল:\n"
+msgstr[1] "এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে %d ভিডিঅ' ইমপোৰ্ট ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে ১ টা ফ'টো/ভিডিঅ' ইমপোৰ্ট ব্যৰ্থ হল:\n"
+msgstr[1] ""
+"এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে %d ফ'টো/ভিডিঅ' ইমপোৰ্ট ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে ১ টা ফাইল ইমপোৰ্ট ব্যৰ্থ হল:\n"
+msgstr[1] "এটা ফাইল অথবা হাৰ্ডৱেৰ ত্ৰুটিৰ বাবে %d ফাইল ইমপোৰ্ট ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"১ টা ফ'টো ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+msgstr[1] ""
+"%d ফ'টো ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত নাছিল:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"১ টা ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+msgstr[1] ""
+"%d ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"১ টা ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+msgstr[1] ""
+"%d ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"১ টা ফাইল ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত "
+"নাছিল:\n"
+msgstr[1] ""
+"%d ফাইল ইমপোৰ্ট হবলে ব্যৰ্থ হল কাৰণ ফ'টো লাইব্ৰেৰী লিখিব পৰা অৱস্থাত নাছিল:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "এটা কেমেৰা ত্ৰুটিৰ বাবে ১ টা ফ'টো ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+msgstr[1] "এটা কেমেৰা ত্ৰুটিৰ বাবে %d ফ'টো ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "এটা কেমেৰা ত্ৰুটিৰ বাবে ১ টা ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+msgstr[1] "এটা কেমেৰা ত্ৰুটিৰ বাবে %d ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "এটা কেমেৰা ত্ৰুটিৰ বাবে ১ টা ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+msgstr[1] "এটা কেমেৰা ত্ৰুটিৰ বাবে %d ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "এটা কেমেৰা ত্ৰুটিৰ বাবে ১ টা ফাইল ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+msgstr[1] "এটা কেমেৰা ত্ৰুটিৰ বাবে %d ফাইল ইমপোৰ্ট হবলে ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "ক্ষতিগ্ৰস্থ হোৱা বাবে এটা ফ'টো ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+msgstr[1] "%d ফ'টোসমূহ ক্ষতিগ্ৰস্থ হোৱা বাবে ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "ক্ষতিগ্ৰস্থ হোৱা বাবে এটা ভিডিঅ' ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+msgstr[1] "ক্ষতিগ্ৰস্থ হোৱা বাবে %d ভিডিঅ' ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "ক্ষতিগ্ৰস্থ হোৱা বাবে এটা ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+msgstr[1] "ক্ষতিগ্ৰস্থ হোৱা বাবে %d ফ'টো/ভিডিঅ' ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "ক্ষতিগ্ৰস্থ হোৱা বাবে এটা ফাইল ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+msgstr[1] "ক্ষতিগ্ৰস্থ হোৱা বাবে %d ফাইলসমূহ ইমপোৰ্ট হবলৈ ব্যৰ্থ হল:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "১ টা অসমৰ্থিত ফ'টো বাদ দিয়া হল:\n"
+msgstr[1] "%d অসমৰ্থিত ফ'টো বাদ দিয়া হল:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "১ টা অ-ছবি ফাইল বাদ দিয়া হল।\n"
+msgstr[1] "%d অ-ছবি ফাইল বাদ দিয়া হল।\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে ১ টা ফ'টো বাদ দিয়া হল:\n"
+msgstr[1] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে %d ফ'টো বাদ দিয়া হল:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে ১ টা ভিডিঅ' বাদ দিয়া হল:\n"
+msgstr[1] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে %d ভিডিঅ' বাদ দিয়া হল:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে ১ টা ফ'টো/ভিডিঅ' বাদ দিয়া হল:\n"
+msgstr[1] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে %d ফ'টো/ভিডিঅ' বাদ দিয়া হল:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে ১ টা ফাইল বাদ দিয়া হল:\n"
+msgstr[1] "ব্যৱহাৰকাৰী দ্বাৰা বাতিল কৰা বাবে %d ফাইল বাদ দিয়া হল:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "১ টা ফ'টো সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+msgstr[1] "%d ফ'টো সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "১ টা ভিডিঅ' সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+msgstr[1] "%d ভিডিঅ' সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "১ টা ফ'টো/ভিডিঅ' সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+msgstr[1] "%d ফ'টো/ভিডিঅ' সফলভাৱে ইমপোৰ্ট কৰা হল।\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "কোনো ফ'টো অথবা ভিডিঅ' ইমপোৰ্ট কৰা হোৱা নাই।\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "ইমপোৰ্ট সম্পূৰ্ণ"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d ছেকেণ্ড"
+msgstr[1] "%d ছেকেণ্ড"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d মিনিট"
+msgstr[1] "%d মিনিট"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ঘন্টা"
+msgstr[1] "%d ঘন্টা"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "১ দিন"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "ঘটনা পুনৰ নামকৰণ কৰক"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "নাম:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "শীৰ্ষক সম্পাদন কৰক"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "শীৰ্ষক:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "ঘটনাৰ মন্তব্য সম্পাদন কৰক"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "ফ'টো/ভিডিঅ' মন্তব্য সম্পাদন কৰক"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "মন্তব্য:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ফাইল আবৰ্জনাত পঠাওক (_T)"
+msgstr[1] "ফাইলসমূহ আবৰ্জনাত পঠাওক (_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "কেৱল আতৰাওক (_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "ৰাখক (_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "বহিৰ্তম সম্পাদন উলোটাওক?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "বহিৰ্তম সম্পাদনসমূহ উলোটাব নে?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "ই বহিৰ্তম ফাইললে কৰা সকলো পৰিবৰ্তন ধ্বংস কৰিব। আগবাঢ়িব নে?"
+msgstr[1] "ই %d বহিৰ্তম ফাইলসমূহলে কৰা সকলো পৰিবৰ্তন ধ্বংস কৰিব। আগবাঢ়িব নে?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "বহিৰ্তম সম্পাদন উলোটাওক (_v)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "বহিৰ্তম সম্পাদনসমূহ উলোটাওক (_v)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ই লাইব্ৰেৰীৰ পৰা ফ'টো আতৰাব। অব্যাহত ৰাখিব নে?"
+msgstr[1] "ই লাইব্ৰেৰীৰ পৰা %d ফ'টো আতৰাব। অব্যাহত ৰাখিব নে?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "আতৰাওক (_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ফ'টোক লাইব্ৰেৰীৰ পৰা আতৰাওক"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "ফ'টোসমূহক লাইব্ৰেৰীৰ পৰা আতৰাওক"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "২৪ Hr"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "একে পৰিমাণত ফ'টোসমূহ/ভিডিঅ'সমূহ স্থানান্তৰ কৰক (_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "সকলো ফ'টো/ভিডিঅ'ক এই সময়ত সংহতি কৰক (_a)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "প্ৰকৃত ফ'টো ফাইল পৰিবৰ্তন কৰক (_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "প্ৰকৃত ফ'টো ফাইলসমূহ পৰিবৰ্তন কৰক (_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "প্ৰকৃত ফাইল পৰিবৰ্তন কৰক (_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "প্ৰকৃত ফাইলসমূহ পৰিবৰ্তন কৰক (_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "প্ৰকৃত: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"উদঙা সময় %d %s, %d %s, %d %s, আৰু %d %s ৰে\n"
+"আগবঢ়োৱা হব।"
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"উদঙা সময় %d %s, %d %s, %d %s, আৰু %d %s ৰে\n"
+"পিছলৈ নিয়া হব।"
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "দিন"
+msgstr[1] "দিনবোৰ"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ঘন্টা"
+msgstr[1] "ঘন্টা"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "মিনিট"
+msgstr[1] "মিনিট"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "ছেকেণ্ড"
+msgstr[1] "ছেকেণ্ড"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"আৰু %d অন্য।"
+msgstr[1] ""
+"\n"
+"\n"
+"আৰু %d অন্য।"
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "টেগসমূহ (কমা দ্বাৰা পৃথকিত):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "স্বাগতম!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell লে স্বাগতম!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "আৰম্ভ কৰিবলে, এই পদ্ধতিসমূহৰ যিকোনো এটাৰে ফ'টোসমূহ ইমপোৰ্ট কৰক:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">ফোল্ডাৰৰ পৰা ফাইল %s ৰ ইমপোৰ্ট</span> বাছক"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "ফ'টোসমূহক Shotwell উইন্ডোলে ড্ৰেগ আৰু ড্ৰপ কৰক"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "আপোনাৰ কমপিউটাৰত এটা কেমেৰা সংযোগ কৰক আৰু ইমপোৰ্ট কৰক"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "আপোনাৰ %s ফোল্ডাৰৰ পৰা ফ'টোসমূহ ইমপোৰ্ট কৰক (_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"আপুনি লগতে এই পদ্ধতিসমূহৰ যিকোনো এটাৰ সহায়ত ফ'টোসমূহ ইমপোৰ্ট কৰিব পাৰিব:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "এই বাৰ্তা আকৌ নেদেখুৱাব (_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "আপোনাৰ %s লাইব্ৰেৰীৰ পৰা ফ'টোসমূহ ইমপোৰ্ট কৰক"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Help)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Year%sMonth%sDay"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Year%sMonth"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Year%sMonth-Day"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Year-Month-Day"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "স্বনিৰ্বাচিত"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "অবৈধ বিন্যাস"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell ফ'টোসমূহক আপোনাৰ লাইব্ৰেৰী ফোল্ডাৰলে কপি কৰিব পাৰিব অথবা ই কপি "
+"নকৰাকৈ "
+"সিহতক ইমপোৰ্ট কৰিব পাৰিব।"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ফ'টোসমূহ কপি কৰক (_p)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "স্থানত ইমপোৰ্ট কৰক (_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "লাইব্ৰেৰীলে ইমপোৰ্ট কৰক"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "লাইব্ৰেৰীৰ পৰা আতৰাওক"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "ফ'টোক লাইব্ৰেৰীৰ পৰা আতৰোৱা হৈছে"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "ফ'টোসমূহক লাইব্ৰেৰীৰ পৰা আতৰোৱা হৈছে"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা ফ'টো/ভিডিঅ' মচি পেলাব। আপুনি আপোনাৰ ফাইলক "
+"ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+msgstr[1] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা %d ফ'টো/ভিডিঅ' মচি পেলাব। আপুনি আপোনাৰ "
+"ফাইলক ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা ভিডিঅ' মচি পেলাব। আপুনি আপোনাৰ ফাইলক "
+"ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+msgstr[1] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা %d ভিডিঅ' মচি পেলাব। আপুনি আপোনাৰ ফাইলক "
+"ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা ফ'টো মচি পেলাব। আপুনি আপোনাৰ ফাইলক "
+"ডেস্কটপ "
+"আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+msgstr[1] ""
+"ই আপোনাৰ Shotwell লাইব্ৰেৰীৰ পৰা %d ফ'টোসমূহ মচি পেলাব। আপুনি আপোনাৰ ফাইলক "
+"ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব বিচাৰে নে?\n"
+"\n"
+"এই কাৰ্য্যক নহোৱা কৰিব নোৱাৰি।"
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ফ'টো অথবা ভিডিঅ'ক আপোনাৰ ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব নোৱাৰি। এই ফাইল "
+"মচি "
+"পেলাব নে?"
+msgstr[1] ""
+"%d ফ'টোসমূহ/ভিডিঅ'সমূহক আপোনাৰ ডেস্কটপ আবৰ্জনালে স্থানান্তৰ কৰিব নোৱাৰি। এই "
+"ফাইলসমূহ মচি পেলাব নে?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ফ'টো অথবা ভিডিঅ' মচিব নোৱাৰি।"
+msgstr[1] "%d ফ'টো/ভিডিঅ' মচিব নোৱাৰি।"
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "প্ৰস্থ অথবা উচ্চতা"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "প্ৰস্থ"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "উচ্চতা"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s পৰ্যবেক্ষণ কৰিবলে অক্ষম: এটা ডাইৰেকটৰি নহয় (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "ঘটনা %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s ৰ বাবে এটা অস্থায়ী ফাইল সৃজন কৰিবলে অক্ষম: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "এক্সপোৰ্ট কৰা হৈছে"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ফাইল %s ইতিমধ্যে অস্তিত্ববান। প্ৰতিস্থাপন কৰিব নে?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "বাদ দিয়ক (_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "প্ৰতিস্থাপন কৰক (_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "সকলো প্ৰতিস্থাপন কৰক (_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "এক্সপোৰ্ট কৰক"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "আপডেইটসমূহ পৰ্যবেক্ষণ কৰা প্ৰক্ৰিয়াকৰণ কৰিবলে অক্ষম: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "থাম্বনেইলসমূহৰ আকাৰ আয়োজিত কৰক"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "জুম ইন কৰক (_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "থাম্বনেইলসমূহৰ মেগ্নিফিকেষণ বৃদ্ধি কৰক"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "জুম আউট কৰক (_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "থাম্বনেইলসমূহৰ মেগ্নিফিকেষণ কম কৰক"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ফ'টোসমূহ সজাওক (_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "ভিডিঅ' চলাওক (_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "চিস্টেম ভিডিঅ' প্লেয়াৰত নিৰ্বাচিত ভিডিঅ'সমূহ খোলক"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "উন্নয়নকাৰী (_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "কেমেৰা"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "শীৰ্ষকসমূহ (_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "প্ৰতিটো ফ'টোৰ শীৰ্ষক প্ৰদৰ্শন কৰক"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "মন্তব্যসমূহ (_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "প্ৰতিটো ফ'টোৰ মন্তব্য প্ৰদৰ্শন কৰক"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "টেগসমূহ (_g)"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "প্ৰতিটো ফ'টোৰ টেগ প্ৰদৰ্শন কৰক"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "শীৰ্ষকৰে (_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "শীৰ্ষকৰ সহায়ত ফ'টোসমূহ সজাওক"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "উদঙাৰ তাৰিখৰে (_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "উদঙাৰ তাৰিখৰে ফ'টোসমূহ সজাওক"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "ৰেইটিংৰে (_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "ৰেইটিংৰে ফ'টোসমূহ সজাওক"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "উৰ্দ্ধমূখী (_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "উৰ্দ্ধমূখী ক্ৰমত ফ'টোসমূহ সজাওক"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "নিম্নগামী (_e)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "ফ'টোসমূহক নিম্নগামী ক্ৰমত সজাওক"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell এ নিৰ্বাচিত ভিডিঅ' চলাবলে অক্ষম আছিল:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "কোনো ফ'টো/ভিডিঅ' নাই"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "কোনো ফ'টো/ভিডিঅ' পোৱা নগল"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ফ'টোসমূহ এই ডাইৰেকটৰিত এক্সপোৰ্ট কৰিব নোৱাৰি।"
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "পৰিবৰ্তিত"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "পূৰ্বৱৰ্তী ফ'টো"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "পৰৱৰ্তী ফ'টো"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ফ'টো উৎস ফাইল সন্ধানহিন: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "দৰ্শন কৰক (_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "সঁজুলিসমূহ (_o)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "পূৰ্ববৰ্তী ফ'টো (_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "পূৰ্বৱৰ্তী ফ'টো"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "পৰবৰ্তী ফ'টো (_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "পৰৱৰ্তী ফ'টো"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ফ'টোৰ মেগনিফিকেষণ বৃদ্ধি কৰক"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ফ'টোৰ মেগ্নিফিকেষণ কম কৰক"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "পৃষ্ঠাৰ সৈতে খাপ খুৱাওক (_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "ফ'টোক পৰ্দাত খাপ খাবলে জুম কৰক"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "জুম কৰক ১০০% (_1)"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ফ'টোক ১০০% মেগ্নিফিকেষণলৈ জুম কৰক"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "জুম কৰক ২০০% (_2)"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ফ'টোক ২০০% মেগ্নিফিকেষণলৈ জুম কৰক"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s এক্সপোৰ্ট কৰিবলে অক্ষম: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "সম্পূৰ্ণ পৃষ্ঠা পুৰন কৰক"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ২ টা ছবি"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ৪ টা ছবি"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ৬ টা ছবি"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ৮ টা ছবি"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ১৬ টা ছবি"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "প্ৰতি পৃষ্ঠা ৩২ টা ছবি"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "ছে.মি."
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "ৱালেট (2 x 3 in.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "ন'টকাৰ্ড (3 x 5 in.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "মেট্ৰিক ৱালেট (9 x 13 ছে.মি)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "পস্টকাৰ্ড (10 x 15 ছে.মি)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 ছে.মি"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 ছে.মি"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 ছে.মি"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 ছে.মি"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 ছে.মি"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ছবি সংহতিসমূহ"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "প্ৰিন্ট কৰা হৈছে..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ফ'টো প্ৰিন্ট কৰিবলে অক্ষম:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "আজি"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "যোৱাকালী"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "বস্তুবোৰ:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ঘটনা"
+msgstr[1] "%d ঘটনাসমূহ"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ফ'টো"
+msgstr[1] "%d ফ'টোসমূহ"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d ভিডিঅ'"
+msgstr[1] "%d ভিডিঅ'সমূহ"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "তাৰিখ:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "সময়:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "পৰা:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "লৈ:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "আকাৰ:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "অৱধি:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f ছেকেণ্ড"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "উন্নয়নকাৰী:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "উদঙা:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "অবস্থান:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "ফাইলৰ আকাৰ:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "বৰ্তমান উন্নয়ন:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "প্ৰকৃত পৰিসৰসমূহ:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "কেমেৰাৰ নিৰ্মাতা:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "কেমেৰাৰ আৰ্হি:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "ফ্লেশ:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ফ'কেল দৈৰ্ঘ্য:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "উদঙাৰ তাৰিখ:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "উদুঙাই ৰখাৰ সময়:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "উদঙাৰ প্ৰৱণতা:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS অক্ষাংশ:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS দ্ৰাঘিমা:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "শিল্পী:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "স্বত্বাধিকাৰ:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "চফ্টৱেৰ:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "প্ৰসাৰিত তথ্য"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ফ'টো ব্যৱস্থাপক"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ফ'টো দৰ্শক"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "সোঁফালে ঘুৰাওক (_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "ঘুৰাওক"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "সোঁফালে ঘুৰাওক"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "অনুগ্ৰহ কৰি ফ'টোসমূহ ঘুৰাওক (বাঁওফালে ঘুৰাবলে Ctrl টিপক)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "বাঁওফালে ঘুৰাওক (_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "বাঁওফালে ঘুৰাওক"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ফ'টোসমূহ বাঁওফালে ঘুৰাওক"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "আনুভূমিকভাৱে লুটিৱাওক (_z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "আনুভূমিকভাৱে লুটিৱাওক"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "উলম্বভাৱে লুটিৱাওক (_c)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "উলম্বভাৱে লুটিৱাওক"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "বৃদ্ধি কৰক (_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "বৃদ্ধি কৰক"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "ফ'টোৰ উপস্থিতি স্বচালিতভাৱে উন্নত কৰক"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "ৰঙৰ আয়োজন কপি কৰক (_C)"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "ৰঙৰ আয়োজন কপি কৰক"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "ফ'টোত প্ৰয়োগ কৰা ৰঙৰ আয়োজন কপি কৰক"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "ৰঙৰ আয়োজন পেইস্ট কৰক (_P)"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "ৰঙৰ আয়োজন পেইস্ট কৰক"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "নিৰ্বাচিত ফ'টোসমূহলৈ কপি কৰা ৰঙৰ আয়োজন প্ৰয়োগ কৰক"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "ক্ৰপ কৰক (_C)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "ক্ৰপ কৰক"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ফ'টোৰ আকাৰ ক্ৰপ কৰক"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "পোন কৰক (_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "পোন কৰক"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "ফ'টো পোন কৰক"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "ৰেড-আই (_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "ৰেড-আই"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ফ'টোত কোনো ৰেড-আই প্ৰভাৱ কম কৰক অথবা নাইকিয়া কৰক"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "আয়োজিত কৰক (_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "আয়োজিত কৰক"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ফ'টোৰ ৰঙ আৰু টৌন ঠিক কৰক"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "প্ৰকৃতলে উভতি যাওক (_v)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "প্ৰকৃতলে উভতি যাওক"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "বহিৰ্তম সম্পাদনসমূহ উলোটাওক (_d)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "মাস্টাৰ ফ'টোলে ঘুৰি যাওক"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ডেস্কটপ পটভূমি হিচাপে সংহতি কৰক (_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "নিৰ্বাচিত ছবিক নতুন ডেস্কটপ পটভূমি হিচাপে সংহতি কৰক"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "ডেস্কটপ স্লাইতশ্ব হিচাপে সংহতি কৰক (_D)..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "বাতিল কৰক (_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "বাতিল কৰক"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "পুনৰ কৰক (_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "পুনৰ কৰক"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "পুনৰ নামকৰণ ঘটনা (_n)..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "ঘটনাৰ বাবে কি' ফ'টো নিৰ্মাণ কৰক (_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "ঘটনাৰ বাবে কি' ফ'টো নিৰ্মাণ কৰক"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "নতুন ঘটনা (_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "নতুন ঘটনা"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ফ'টোসমূহ স্থানান্তৰ কৰক"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ফ'টোসমূহক এটা ঘটনালে স্থানান্তৰ কৰক"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ঘটনাসমূহ একত্ৰিত কৰক (_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "একত্ৰিত কৰক"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "ঘটনাসমূহক এটা ঘটনালে একত্ৰিত কৰক"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "ৰেটিং সংহতি কৰক (_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "ৰেটিং সংহতি কৰক"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "আপোনাৰ ফ'টোৰ ৰেটিং পৰিবৰ্তন কৰক"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "বৃদ্ধি কৰক (_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "ৰেটিং বৃদ্ধি কৰক"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "কম কৰক (_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "ৰেটিং কম কৰক"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "আনৰেটেড (_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "আনৰেটেড"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "আনৰেটেড ৰেইট কৰক"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "আৰেইটেড হিচাপে সংহতি কৰা হৈছে"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "কোনো ৰেইটিং আতৰাওক"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "নাকচ কৰা হৈছে (_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "নাকচ কৰা হৈছে"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "ৰেইট নাকচ কৰা হল"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "নাকচ কৰা হিচাপে সংহতি কৰা হৈছে"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "ৰেইটিংক নাকচ কৰা হিচাপে সংহতি কৰক"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "কেৱল নাকচ কৰা (_O)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "কেৱল নাকচ কৰা হৈছে"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "কেৱল নাকচ কৰা ফ'টোসমূহ দেখুৱাওক"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "All + নাকচ কৰা (_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "সকলো ফ'টো দেখুৱাওক, নাকচ কৰাটো অন্তৰ্ভুক্ত কৰাকৈ"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "সকলো ফ'টো (_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "সকলো ফ'টো দেখুৱাওক"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "ৰেইটিংসমূহ (_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "প্ৰতিটো ফ'টোৰ ৰেইটিং প্ৰদৰ্শন কৰক"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ফ'টোসমূহ ফিল্টাৰ কৰক (_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ফ'টোসমূহ ফিল্টাৰ কৰক"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "এটা ফিল্টাৰৰ ওপৰত ভিত্তি কৰি প্ৰদৰ্শিত ফ'টোসমূহৰ সংখ্যা সীমিত কৰক"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "প্ৰতিলিপি (_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "প্ৰতিলিপি"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ফ'টোৰ এটা প্ৰতিলিপি কৰক"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "এক্সপোৰ্ট কৰক (_E)..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "প্ৰিন্ট কৰক (_P)..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "প্ৰকাশ কৰক (_b)..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "বিভিন্ন ৱেবছাইটলে প্ৰকাশ কৰক"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "শীৰ্ষক সম্পাদন কৰক (_T)..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "মন্তব্য সম্পাদনা কৰক (_C)..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "মন্তব্য সম্পাদনা কৰক"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "ঘটনা মন্তব্য সম্পাদন কৰক (_C)..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "তাৰিখ আৰু সময় আয়োজিত কৰক (_A)..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "তাৰিখ আৰু সময় আয়োজিত কৰক"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "টেগসমূহ যোগ কৰক (_T)..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "টেগসমূহ যোগ কৰক (_A)..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "টেগসমূহ যোগ কৰক"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "পছন্দসমূহ (_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "বহিৰ্তম সম্পাদকৰ সৈতে খোলক (_x)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW সম্পাদকৰ সৈতে খোলক (_A)"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "লে পঠাওক (_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "লে পঠাওক (_o)..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "সন্ধান কৰক (_F)..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "সন্ধান কৰক"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "এটা ছবিক তাৰ নাম অথবা টেগসমূহত উপস্থিত হোৱা লিখনী টাইপ কৰি সন্ধান কৰক"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "ফ্লেগ (_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "আনফ্লেগ (_f)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "সম্পাদল আৰম্ভ কৰিবলে অক্ষম: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "টেগ \"%s\" যোগ কৰক"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "টেগসমূহ \"%s\" আৰু \"%s\" যোগ কৰক"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "টেগ \"%s\" মচি পেলাওক (_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "টেগ \"%s\" মচি পেলাওক"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "টেগ মচি পেলাওক"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "নতুন (_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "টেগ \"%s\" পুনৰ নামকৰণ কৰক (_n)..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "টেগ \"%s\" ক \"%s\" লে পুনৰ নামকৰণ কৰক"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "পুনৰ নামকৰণ কৰক (_R)..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "টেগসমূহ পৰিবৰ্তন কৰক (_y)..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "টেগসমূহ পৰিবৰ্তন কৰক"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ফ'টোক \"%s\" হিচাপে টেগ কৰক"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ফ'টোসমূহক \"%s\" হিচাপে টেগ কৰক"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "নিৰ্বাচিত ফ'টোক \"%s\" হিচাপে টেগ কৰক"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "নিৰ্বাচিত ফ'টোসমূহক \"%s\" হিচাপে টেগ কৰক"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ফ'টোৰ পৰা টেগ \"%s\" আতৰাওক (_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ফ'টোসমূহৰ পৰা টেগ \"%s\" আতৰোৱা হৈছে (_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ফ'টোৰ পৰা টেগ \"%s\" আতৰোৱা হৈছে"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ফ'টোসমূহৰ পৰা টেগ \"%s\" আতৰোৱা হৈছে"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "টেগক \"%s\" লে পুনৰ নামকৰণ কৰিবলে অক্ষম কাৰণ টেগ ইতিমধ্যে অস্তিত্ববান।"
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"\"%s\" লে সন্ধান পুনৰ নামাকৰণ কৰিবলে অক্ষম কাৰণ সন্ধান ইতিমধ্যে অস্তিত্ববান।"
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "সংৰক্ষিত সন্ধান"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "সন্ধান মচি পেলাওক"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "সম্পাদনা কৰক (_E)..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "পুনৰ নামকৰণ (_n)..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "সন্ধানক \"%s\" ৰ পৰা \"%s\" লে পুনৰ নামকৰণ কৰক"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "সন্ধান \"%s\" মচি পেলাওক"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "ৰেইট %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "ৰেইটিংক %s লে সংহতি কৰক"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "ৰেইটিংক %s লে সংহতি কৰক"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s প্ৰদৰ্শন কৰক"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "কেৱল ৰেইটিং %s থকা ফ'টোসমূহ দেখুৱাওক"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s অথবা আৰু ভাল"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s অথবা আৰু ভাল প্ৰদৰ্শন কৰক"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "কেৱল ৰেইটিং %s অথবা আৰু ভাল থকা ফ'টোসমূহ দেখুৱাব"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ আবৰ্জনাৰ পৰা আতৰাওক"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "নিৰ্বাচিত ফ'টোসমূহ লাইব্ৰেৰীৰ পৰা আতৰাওক"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "পুনৰুদ্ধাৰ কৰক (_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "নিৰ্বাচিত ফ'টোসমূহক লাইব্ৰেৰীলে পুনৰ স্থানান্তৰ কৰক"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ফাইল ব্যৱস্থাপকত দেখুৱাওক (_g)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "নিৰ্বাচিত ফ'টোৰ ডাইৰেকটৰি ফাইল ব্যৱস্থাপকত খোলক"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ফাইল ব্যৱস্থাপকত খোলিবলে অক্ষম: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "লাইব্ৰেৰীৰ পৰা আতৰাওক (_e)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "আবৰ্জনালে স্থানান্তৰ কৰক (_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "সকলো নিৰ্বাচন কৰক (_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "সকলো বস্তু নিৰ্বাচন কৰক"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "স্লাইডশ্ব"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "ফ্লেগ্গড"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ফ'টোসমূহ"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "ভিডিঅ'সমূহ"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ফ'টোসমূহ"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ফ'টোসমূহ"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ফাইল %s ল'ড কৰোতে ত্ৰুটি: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "ধৰণ"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "ৰেটিং"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "সংহতিসমূহ"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "পিছলৈ"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "পূৰ্বৱৰ্তী ফ'টোলে যাওক"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "বিৰাম দিয়ক"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "স্লাইডশ্বক বিৰাম দিয়ক"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "পৰৱৰ্তী"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "পৰৱৰ্তী ফ'টোলে যাওক"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "স্লাইডশ্ব সংহতিসমূহ সলনি কৰক"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "সকলো ফ'টো উৎস ফাইলসমূহ সন্ধানহিন।"
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "চলাওক"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "স্লাইডশ্বক চলাই নিয়ক"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "শীৰ্ষকবিহিন"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "ভিডিঅ'সমূহ এক্সপোৰ্ট কৰক"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "কেমেৰাসমূহ"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"কেমেৰা আনমাউন্ট কৰিবলে অক্ষম। ফাইল ব্যৱস্থাপকৰ পৰা কেমেৰা আনমাউন্ট কৰাৰ "
+"চেষ্টা "
+"কৰি চাওক।"
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ইতিমধ্যে ইমপোৰ্ট কৰা ফ'টোসমূহ লুকাওক"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "কেৱল ইমপোৰ্ট নহোৱা ফ'টোসমূহ প্ৰদৰ্শন কৰক"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "ইমপোৰ্ট আৰম্ভ কৰা হৈছে, অনুগ্ৰহ কৰি অপেক্ষা কৰক..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "নিৰ্বাচিতক ইমপোৰ্ট কৰক (_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "নিৰ্বাচিত ফ'টোসমূহক আপোনাৰ লাইব্ৰেৰীলে ইমপোৰ্ট কৰক"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "সকলো ইমপোৰ্ট কৰক (_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "সকলো ফ'টোক আপোনাৰ লাইব্ৰেৰীত ইমপোৰ্ট কৰক"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell এ কেমেৰা অভিগম কৰিবলে ইয়াক ফাইলচিস্টেমৰ পৰা আনমাউন্ট কৰিব লাগিব। "
+"আগবাঢ়িব নে?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "আনমাউন্ট কৰক (_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "অনুগ্ৰহ কৰি কেমেৰা আনমাউন্ট কৰক।"
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"কেমেৰা অন্য এপ্লিকেচন দ্বাৰা লক কৰা আছে। Shotwell এ কেমেৰা কেৱল তেতিয়াহে "
+"অভিগম কৰিব পাৰিব যেতিয়া ই আনলক অৱস্থাত থাকে। অনুগ্ৰহ কৰি কেমেৰাক ব্যৱহাৰ কৰি "
+"থকা অন্য যিকোনো এপ্লিকেচন বন্ধ কৰক আৰু পুনৰ চেষ্টা কৰক।"
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "অনুগ্ৰহ কৰি কেমেৰাক ব্যৱহাৰ কৰি থকা অন্য যিকোনো এপ্লিকেচন বন্ধ কৰক।"
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"কেমেৰাৰ পৰা পূৰ্বদৰ্শনসমূহ প্ৰাপ্ত কৰিবলে অক্ষম:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "আনমাউন্ট কৰা হৈছে..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ফ'টোৰ তথ্য প্ৰাপ্ত কৰা হৈছে"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s ৰ বাবে পূৰ্বদৰ্শন প্ৰাপ্ত কৰা হৈছে"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "কেমেৰা লক কৰিবলে অক্ষম: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "এই ফ'টোক কেমেৰাৰ পৰা মচিব নে?"
+msgstr[1] "এই %d ফ'টোসমূহক কেমেৰাৰ পৰা মচিব নে?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "এই ভিডিঅ'ক কেমেৰাৰ পৰা মচিব নে?"
+msgstr[1] "এই %d ভিডিঅ'সমূহক কেমেৰাৰ পৰা মচিব নে?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "এই ফ'টো/ভিডিঅ'ক কেমেৰাৰ পৰা মচিব নে?"
+msgstr[1] "এই %d ফ'টো/ভিডিঅ'ক কেমেৰাৰ পৰা মচিব নে?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "এই ফাইলসমূহক কেমেৰাৰ পৰা মচিব নে?"
+msgstr[1] "এই %d ফাইলসমূহক কেমেৰাৰ পৰা মচিব নে?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "কেমেৰাৰ পৰা ফ'টোসমূহ/ভিডিঅ'সমূহ আতৰোৱা হৈছে"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "ত্ৰুটিসমূহৰ বাবে কেমেৰাৰ পৰা %d ফ'টো/ভিডিঅ' মচি পেলাবলে অক্ষম।"
+msgstr[1] ""
+"ত্ৰুটিসমূহৰ বাবে কেমেৰাৰ পৰা %d ফ'টোসমূহ/ভিডিঅ'সমূহ মচি পেলাবলে অক্ষম।"
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "তথ্য ইমপোৰ্টসমূহ"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ডাটাবেইচ"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s ৰ পৰা ইমপোৰ্ট অব্যাহত ৰাখিব নোৱাৰি কাৰণ এটা ত্ৰুটি দেখা দিলে:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "অন্য সেৱাৰ পৰা ইমপোৰ্ট কৰাৰ চেষ্টা কৰোতে, ওপৰৰ মেনুৰ পৰা এটা বাছক।"
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"আপোনাৰ ওচৰত কোনো তথ্য ইমপোৰ্ট প্লাগিন সামৰ্থবান নাই।\n"
+"\n"
+"এপ্লিকেচনৰ পৰা ইমপোৰ্ট কৰক কাৰ্য্যকৰীতা ব্যৱহাৰ কৰিবলে, আপোনাৰ ওচৰত অন্তত এটা "
+"তথ্য "
+"ইমপোৰ্ট প্লাগিন সামৰ্থবান থাকিব লাগিব। প্লাগিনসমূহক পছন্দসমূহ ডাইলগত "
+"সামৰ্থবান কৰিব "
+"পাৰি।"
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ডাটাবেইচ ফাইল:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "ইমপোৰ্ট কৰক (_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "এপ্লিকেচনৰ পৰা ইমপোৰ্ট কৰক"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "পৰা মিডিয়া ইমপোৰ্ট কৰক (_f):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "বন্ধ কৰক (_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ফ'টো ডাটাবেইচ %s খোলিবলে/সৃষ্টি কৰিবলে অক্ষম: ত্ৰুটি ক'ড %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ফ'টো ডাটাবেইচ ফাইললে লিখিবলে অক্ষম:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ডাটাবেইচ ফাইল অভিগম কৰোতে ত্ৰুটি:\n"
+" %s\n"
+"\n"
+"ত্ৰুটি আছিল: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "ফাইল (_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "সংৰক্ষণ কৰক (_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ফ'টো সংৰক্ষণ কৰক"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "এই ধৰণে সংৰক্ষণ কৰক (_A)..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "এটা ভিন্ন নামৰ সৈতে ফ'টো সংৰক্ষণ কৰক"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "ফ'টোক আপোনাৰ কমপিউটাৰৰ সৈতে সংযুক্ত এটা প্ৰিন্টাৰত প্ৰিন্ট কৰক"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "সম্পাদনা কৰক (_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "ফ'টো (_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "সহায় (_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ৰ অস্তিত্ব নাই।"
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s এটা ফাইল নহয়।"
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s এ ফাইল বিন্যাস সমৰ্থন নকৰে\n"
+"%s ৰ।"
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "এটা কপি সংৰক্ষণ কৰক (_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s লে পৰিবৰ্তনসমূহ হেৰুৱাব নে?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "সংৰক্ষণ নকৰি বন্ধ কৰক (_w)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%sলে সংৰক্ষণ কৰোতে ত্ৰুটি: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "এই ধৰণে সংৰক্ষণ কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "বৰ্তমান ফ'টো পৰিসৰসমূহলে ঘুৰি যাওক"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "এই ফ'টোৰ বাবে ক্ৰপ সংহতি কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "ক্ৰপ আয়তক পট্ৰেইট আৰু লেণ্ডস্কেইপ দিশৰ মাজত পিভট কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "বাধাবিহিন"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "বৰ্গ"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "পৰ্দা"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD ভিডিঅ' (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD ভিডিঅ' (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "ৰেড-আই সঁজুলি বন্ধ কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "নিৰ্বাচিত স্থানত কোনো ৰেড-আই প্ৰভাৱ আতৰাওক"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "পুনৰ সংহতি কৰক (_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "সংপৃক্তকৰণ:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "টিন্ট:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "তাপমাত্ৰা:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "ছায়াসমূহ:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "উজ্জ্বল:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "ৰঙবোৰ পুনৰ সংহতি কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "সকলো ৰঙৰ আয়োজনক প্ৰকৃতলে পুনৰ সংহতি কৰক"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "তাপমাত্ৰা"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "টিন্ট"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "সংপৃক্তকৰণ"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "উদঙা"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "ছায়াসমূহ"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "উজ্জ্বল"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "কনট্ৰাস্টৰ সম্প্ৰসাৰন"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "কোণ:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ফ'টো/ভিডিঅ'"
+msgstr[1] "%d ফ'টোসমূহ/ভিডিঅ'সমূহ"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "কোনো ঘটনা নাই"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "প্ৰতিটো ঘটনাৰ মন্তব্য প্ৰদৰ্শন কৰক"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "কোনো ঘটনা নাই"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "কোনো ঘটনা নাই"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ঘটনাসমূহ"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "আপডেইট কৰা হল"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "ফোল্ডাৰসমূহ"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "লাইব্ৰেৰী"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "ইমপোৰ্ট কৰা হৈছে..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ইমপোৰ্ট বন্ধ কৰক (_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ফ'টোসমূহ ইমপোৰ্ট কৰা বন্ধ কৰক"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "ইমপোৰ্ট কৰাৰ প্ৰস্তুতি লোৱা হৈছে..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s ইমপোৰ্ট কৰা হল"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "সৰ্বশেষ ইমপোৰ্ট"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ফোল্ডাৰৰ পৰা ইমপোৰ্ট কৰক (_I)..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ফ'টোসমূহক ডিস্কৰ পৰা লাইব্ৰেৰীলে ইমপোৰ্ট কৰক"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "এপ্লিকেচনৰ পৰা ইমপোৰ্ট কৰক (_A)..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "ঘটনাসমূহ সজাওক (_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "আবৰ্জনা খালি কৰক (_r)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "আবৰ্জনাত থকা সকলো ফ'টো মচি পেলাওক"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ফ'টোৰ বাবে ঘটনা দৰ্শন কৰক (_n)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "সন্ধান কৰক (_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "সন্ধানৰ মাপকাঠিৰ সহায়ত ফ'টোসমূহ আৰু ভিডিঅ'সমূহ সন্ধান কৰক"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "নতুন সংৰক্ষিত সন্ধান (_w)..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ফ'টোসমূহ (_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ঘটনাসমূহ (_t)"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "মৌলিক তথ্য (_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "নিৰ্বাচনৰ বাবে মৌলিক তথ্য প্ৰদৰ্শন কৰক"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "প্ৰসাৰিত তথ্য (_x)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "নিৰ্বাচনৰ সহায়ত প্ৰসাৰিত তথ্য প্ৰদৰ্শন কৰক"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "সন্ধান বাৰ (_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "সন্ধান বাৰ প্ৰদৰ্শন কৰক"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "কাষবাৰ (_i)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "কাষবাৰ প্ৰদৰ্শন কৰক"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ফোল্ডাৰৰ পৰা ইমপোৰ্ট কৰক"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "আবৰ্জনা খালি কৰক"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "আবৰ্জনা খালি কৰা হৈছে..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell ফ'টোসমূহক আপোনাৰ ঘৰ ডাইৰেকটৰিলে ইমপোৰ্ট কৰিবলে সংৰূপিত।\n"
+"আমি ইয়াক <span weight=\"bold\">%s পছন্দসমূহ সম্পাদন কৰক</=span> ত পৰিবৰ্তন "
+"কৰাৰ অনুমতি দিও।\n"
+"আপুনি ফ'টো ইমপোৰ্ট কৰাটো অব্যাহত ৰাখিব খোজে নে?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "লাইব্ৰেৰীৰ অবস্থান"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ফ'টোসমূহক এই ডাইৰেকটৰিৰ পৰা ইমপোৰ্ট কৰিব নোৱাৰি।"
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "লাইব্ৰেৰী আপডেইট কৰা হৈছে..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "ফ'টোসমূহ স্ব-ইমপোৰ্ট কৰিবলে প্ৰস্তুত কৰা হৈছে..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "ফ'টোসমূহ স্ব-ইমপোৰ্ট কৰা হৈছে..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "মেটাডাটাক ফাইলসমূহলে লিখা হৈছে..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "সন্ধানহিন ফাইলসমূহ"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "মচি পেলোৱা হৈছে..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "আবৰ্জনা"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "আবৰ্জনা খালি"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "মচি পেলাওক"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ফ'টোসমূহ মচি পেলোৱা হৈছে"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"আপোনাৰ ফ'টো লাইব্ৰেৰী Shotwell ৰ এই সংস্কৰণৰ সৈতে সংগত নহয়। ইয়াক Shotwell %"
+"s "
+"(schema %d) দ্বাৰা সৃষ্টি কৰা হৈছিল যেন লাগিছে। এই সংস্কৰণ হল %s (schema "
+"%d)। অনুগ্ৰহ কৰি Shotwell ৰ শেহতীয়া সংস্কৰণ ব্যৱহাৰ কৰক।"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell এ আপোনাৰ ফ'টো লাইব্ৰেৰীক সংস্কৰণ %s (schema %d) ৰ পৰা %s (schema %d) "
+"লৈ উন্নত কৰিবলে সক্ষম নাছিল। অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি %s ত Shotwell Wiki "
+"নীৰিক্ষণ কৰক"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"আপোনাৰ ফ'টো লাইব্ৰেৰী Shotwell ৰ এই সংস্কৰণৰ সৈতে সংগত নহয়। ইয়াক Shotwell %s "
+"(schema %d) দ্বাৰা সৃষ্টি কৰা হৈছিল যেন লাগিছে। এই সংস্কৰণ হল %s (schema %"
+"d)। "
+"অনুগ্ৰহ কৰি %s ক মচি আপোনাৰ লাইব্ৰেৰী পৰিষ্কাৰ কৰক আৰু আপোনাৰ ফ'টোসমূহ পুনৰ "
+"ইমপোৰ্ট "
+"কৰক।"
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell ৰ ডাটাবেইচ সতা সত্য নিৰূপণ কৰোতে অজ্ঞাত ত্ৰুটি: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell ল'ড কৰা হৈছে"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell ৰ ব্যক্তিগত তথ্যলে পথ"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ডাইৰেকটৰি"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "পৰিবৰ্তনসমূহৰ বাবে চলনসময়ত লাইব্ৰেৰি ডাইৰেকটৰি পৰ্যবেক্ষণ নকৰিব"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "আৰম্ভণি প্ৰগতি মিটাৰ প্ৰদৰ্শন নকৰিব"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "এপ্লিকেচনৰ সংস্কৰণ দেখুৱাওক"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"উপলব্ধ কমান্ড শাৰী বিকল্পসমূহৰ এটা সম্পূৰ্ণ তালিকা চাবলে '%s --help' চাওক।\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "নিম্ন (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "মজলীয়া (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "উচ্চ (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "সৰ্বাধিক (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "প্ৰকাশ কৰা হৈছে"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "আপল'ড কৰাৰ বাবে প্ৰস্তুত কৰা হৈছে"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d ৰ %d আপল'ড কৰা হৈছে"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s লে প্ৰকাশ কৰাটো এটা ত্ৰুটিৰ বাবে অব্যাহত নাথাকে:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "অন্য সেৱালে প্ৰকাশ কৰাৰ চেষ্টা কৰিবলে, ওপৰৰ মেনুৰ পৰা এটা বাছক।"
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "নিৰ্বাচিত ফ'টোসমূহ/ভিডিঅ'সমূহ সফলভাৱে প্ৰকাশ কৰা হৈছিল।"
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "নিৰ্বাচিত ভিডিঅ'সমূহ সফলভাৱে প্ৰকাশ কৰা হৈছিল।"
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "নিৰ্বাচিত ফ'টোসমূহ সফলভাৱে প্ৰকাশ কৰা হৈছিল।"
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "নিৰ্বাচিত ভিডিঅ' সফলভাৱে প্ৰকাশ কৰা হৈছিল।"
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "নিৰ্বাচিত ফ'টো সফলভাৱে প্ৰকাশ কৰা হৈছিল।"
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "একাওন্ট তথ্য প্ৰাপ্ত কৰা হৈছে..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "লগিন কৰা হৈছে..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ফ'টোসমূহ প্ৰকাশ কৰক"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "লে ফ'টোসমূহ প্ৰকাশ কৰক (_t):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "ভিডিঅ'সমূহ প্ৰকাশ কৰক"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "লে ভিডিঅ'সমূহ প্ৰকাশ কৰক (_t)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ফ'টোসমূহ আৰু ভিডিঅ'সমূহ প্ৰকাশ কৰক"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ফ'টোসমূহ আৰু ভিডিঅ'সমূহ লৈ প্ৰকাশ কৰক (_t)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "প্ৰকাশ কৰিবলে অক্ষম"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell এ নিৰ্বাচিত বস্তুবোৰ প্ৰকাশ কৰিব নোৱাৰে কাৰণ আপোনাৰ ওচৰত এটা সংগত "
+"প্ৰকাশ "
+"কৰিব পৰা প্লাগিন সামৰ্থবান নাই। ইয়াক শুদ্ধ কৰিবলে, <b>%s পছন্দসমূহ সম্পাদন "
+"কৰক</b> "
+"বাছক আৰু <b>প্লাগিনসমূহ</b> টেবত এটা বা অধিক প্ৰকাশ কৰা প্লাগিনসমূহ সামৰ্থবান "
+"কৰক।"
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "সংৰক্ষিত সন্ধানসমূহ"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "অন্তৰ্ভুক্ত কৰে"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "ঠিক"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "সৈতে আৰম্ভ হয়"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "সৈতে শেষ হয়"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "অন্তৰ্ভুক্ত নকৰে"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "সংহিত নহয়"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "হয়"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "নহয়"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "যিকোনো ফ'টো"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "এটা raw ফ'টো"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "এটা ভিডিঅ'"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "চিহ্নিত বস্তুৰ আছে"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "চিহ্নিত বস্তুৰ নাই"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "পৰিবৰ্তনসমূহ"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "অভ্যন্তৰীক পৰিবৰ্তনসমূহ"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "বহিৰ্তম পৰিবৰ্তনসমূহ"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ফ্লেগ্গড"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ফ্লেগ্গড নহয়"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "আৰু উচ্চ"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "কেৱল"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "আৰু নিম্ন"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "পিছত"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "আগত"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "মাজত"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "আৰু"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "যিকোনো"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "সকলো"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "কোনো নহয়"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "যিকোনো লিখনী"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "শীৰ্ষক"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "টেগ"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "মন্তব্য"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ঘটনা নাম"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ফাইল নাম"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "মিডিয়া ধৰণ"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ফ্লেগৰ অৱস্থা"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "ফ'টোৰ অৱস্থা"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "তাৰিখ"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "নতুন টেগ (_T)..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "স্লাইডশ্ব পৰিবৰ্তনসমূহ"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(None)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "কোনো নহয়"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "যাদৃচ্ছিক"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "টেগসমূহ"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "ডেস্কটপ স্লাইডশ্ব হিচাপে সংহতি কৰক"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "ডেস্কটপ পটভূমি স্লাইডশ্ব সৃজন কৰক"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "প্ৰতিখন ছবি দেখুৱাওক"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "সময়ৰ অৱধি"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "ডেস্কটপ পটভূমিত প্ৰতিটো ফ'টো কিমান দেৰি দেখুৱা হব"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "সন্ধান কৰক"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "সন্ধানৰ নাম (_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "মিলাওক (_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "নিম্নলিখিতৰ:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>প্ৰিন্ট কৰা ছবিৰ আকাৰ</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "এটা প্ৰামাণিক আকাৰ ব্যৱহাৰ কৰক (_s):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "এটা স্বনিৰ্বাচিত আকাৰ ব্যৱহাৰ কৰক (_u):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "ফ'টোৰ আপেক্ষিক অনুপাতৰ সৈতে মিল খুৱাওক (_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "স্বআকাৰ দিয়ক (_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>শীৰ্ষকসমূহ</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "ছবি শীৰ্ষক প্ৰিন্ট কৰক (_t)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>পিক্সেল বিভেদন</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "ত আউটপুট ফ'টো (_O):"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "প্ৰতি ইঞ্চি পিক্সেলসমূহ"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell পছন্দসমূহ"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "বগা"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "কলা"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "নতুন ফাইলসমূহৰ বাবে লাইব্ৰেৰী ডাইৰেকটৰি চাওক (_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "মেটাডাটা"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "লিখা টেগসমূহ, শীৰ্ষকসমূহ, আৰু ফ'টো ফাইলসমূহলে অন্য মেটাডাটা (_m)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "প্ৰদৰ্শন"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "ফ'টোসমূহ ইমপোৰ্ট কৰক (_I)"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "পটভূমি (_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "ইমপোৰ্ট কৰা হৈছে"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "ডাইৰেকটৰি গঠন (_D):"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "বিন্যাস (_P):"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "উদাহৰণ:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "ইমপোৰ্ট কৰা ফাইলসমূহ তলৰফলালে পুনৰ নামকৰণ কৰক (_e)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW উন্নয়নকাৰী"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "অবিকল্পিত (_f):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "বহিৰ্তম ফ'টো সম্পাদক (_x):"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "বহিৰ্তম RAW সম্পাদক (_R):"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "বহিৰ্তম সম্পাদকসমূহ"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "প্লাগিনসমূহ"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "বিলম্ব (_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "পৰিবৰ্তনৰ প্ৰভাৱ (_T):"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "পৰিবৰ্তন বিলম্ব (_e):"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "শীৰ্ষক দেখুৱাওক (_i)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "ছেকেণ্ড"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "লগিন (_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr "Shotwell ফ'টোসমূহক আপোনাৰ ঘৰ ডাইৰেকটৰিলে ইমপোৰ্ট কৰিবলে সংৰূপিত।\n"
+
+#~ msgid ""
+#~ " (text depends on fb username and is modified in the app - \n"
+#~ "anything put into this field won't display)"
+#~ msgstr ""
+#~ " (লিখনী fb ব্যৱহাৰকাৰীনামৰ ওপৰত নিৰ্ভৰ কৰে আৰু এপ্লিকেচনত পৰিবৰ্তিত - \n"
+#~ "এই ফিল্ডত দিয়া একো বস্তু প্ৰদৰ্শিত নহয়)"
+
+#~ msgid ""
+#~ "You are logged into Flickr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "আপুনি Flickr ত (name) হিচাপে লগ্গড ইন আছে। \n"
+#~ "\n"
+#~ "(এই লেবেলৰ স্ট্ৰিং ভৰ্তি আৰু ক'ডৰ ভিতৰত সংহিত, \n"
+#~ "সেয়েহে ইয়াত কৰা পৰিবৰ্তনসমূহ প্ৰদৰ্শিত নহব)"
+
+#~ msgid "_visibility label (populated in the code)"
+#~ msgstr "দৃশ্যমানতা লেবেল (ক'ডত ভৰ্তি) (_v)"
+
+#~ msgid ""
+#~ "'you are logged in as $name'\n"
+#~ "(populated in the application code)"
+#~ msgstr ""
+#~ "'আপুনি $name হিচাপে লগ্গড ইন আছে'\n"
+#~ "(এপ্লিকেচন ক'ডত ভৰ্তি)"
+
+#~ msgid ""
+#~ "$mediatype will appear in\n"
+#~ "(populated in code)"
+#~ msgstr ""
+#~ "$mediatype উপস্থিত হব\n"
+#~ "(ক'ডত ভৰ্তি)"
+
+#~ msgid ""
+#~ "You are logged into Tumblr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "আপুনি Tumblr ত (name) হিচাপে লগ্গড ইন আছে। ⏎ ⏎ (এই লেবেলৰ স্ট্ৰিং ভৰ্তি আৰু "
+#~ "ক'ডৰ ভিতৰত সংহিত, ⏎ সেয়েহে ইয়াত কৰা পৰিবৰ্তনসমূহ প্ৰদৰ্শিত নহব)"
diff --git a/po/ast.po b/po/ast.po
new file mode 100644
index 0000000..a1a2079
--- /dev/null
+++ b/po/ast.po
@@ -0,0 +1,4447 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# verayin <vera@yorba.org>, 2011
+# Xuacu Saturio <xuacusk8@gmail.com>, 2013
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
+"Language-Team: Asturian (http://www.transifex.com/projects/p/shotwell/"
+"language/ast/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ast\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Cámares"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Cámara"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Nun puede desmontase la cámara. Tenta de desmontala dende'l xestor de "
+"ficheros."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Anubrir semeyes yá importaes"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Amosar namái les semeyes que nun s'importaron"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "Tí_tulos"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Amosar el títulu de cada semeya"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importar _Seleionaes"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importar _tpp"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell necesita desmontar la cámara del sistema de ficheros col envís "
+"d'acceder a ella. ¿Siguir?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmontando"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Por favor, desmonta la cámara"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"La cámara ta bloquiada por otra aplicación. Shotwell namái puede acceder a "
+"la cámara cuando ta desbloquiada. Zarra cualesquier otra aplicación que tea "
+"usando la cámara y vuelvi a tentalo."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Por favor zarra cualesquier otra aplicación que tea usando la cámara."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nun pueden recoyese vistes previes de la cámara:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Desmontando..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Obteniendo información de la semeya"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Obtención de vista previa pa %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Nun puede bloquease la cámara: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Desaniciar esta semeya de la cámara?"
+msgstr[1] "Desaniciar estes %d semeyes de la cámara?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Caltener"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Aniciar presentación"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Esportar foto/videu"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Esportar Semeyes"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Esportar Fotos"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotando"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Desfaciendo rotar"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Espeyando horizontalmente"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Desfacer espeyáu horizontal"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Espeyando verticalmente"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Desfacer espeyáu vertical"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Cargando Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FICHERU]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Executar '%s --help' pa ver una llista completa d'opciones de llinia de "
+"comandos.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Güei"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ayeri"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Títulu:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementos:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d Eventu"
+msgstr[1] "%d Eventos"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d semeya"
+msgstr[1] "%d semeyes"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "De:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "A:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Tamañu:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Esposición:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Allugamientu:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Tamañu de ficheru:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensiones orixinales:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Cámara:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modelu de cámara:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Llonxitú focal:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Esposición:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Llatitú GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Llonxitú GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Información estendía"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Esto va desaniciar la etiqueta «%s» d'una semeya. ¿Siguir?"
+msgstr[1] "Esto va desaniciar la etiqueta «%s» de %d semeyes. ¿Siguir?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Encaboxar"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "D_esaniciar"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Esportar videu"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nun puede esportase la siguiente semeya darréu d'un fallu de ficheru.\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"¿Prestaríate siguir esportando?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuar"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Ensin camudar"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actual"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formatu:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Calidá:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Re_stricción d'escala:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixels"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(y %d más)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Nun s'importó 1 semeya que taba duplicada:\n"
+msgstr[1] "Nun s'importaron %d semeyes que taben duplicaes:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 videu duplicáu nun s'importó:\n"
+msgstr[1] "%d videos duplicaos nun s'importaron:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 foto/videu duplicáu nun s'importó:\n"
+msgstr[1] "%d fotos/videos duplicaos nun s'importaron:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"nun pudo importase 1 semeya, darréu d'un fallu de ficheru o hardware\n"
+msgstr[1] ""
+"nun pudieron importase %d semeyes, darréu d'un fallu de ficheru o hardware\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"nun pudo importase 1 videu, darréu d'un fallu de ficheru o hardware\n"
+msgstr[1] ""
+"nun pudieron importase %d videos, darréu d'un fallu de ficheru o hardware\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"nun pudo importase 1 semeya/videu, darréu d'un fallu de ficheru o hardware\n"
+msgstr[1] ""
+"nun pudieron importase %d semeyes/videos, darréu d'un fallu de ficheru o "
+"hardware\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "nun pudo importase 1 semeya, darréu d'un fallu de la cámara:\n"
+msgstr[1] ""
+"nun pudieron importase %d semeyes, darréu d'un fallu de la cámara:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "nun pudio importase 1 videu, darréu d'un fallu de la cámara:\n"
+msgstr[1] "nun pudieron importase %d videos, darréu d'un fallu de la cámara:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"nun pudo importase 1 semeya/videu, darréu d'un fallu de la cámara:\n"
+msgstr[1] ""
+"nun pudieron importase %d semeyes/videos, darréu d'un fallu de la cámara:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 semeya non sofitada saltada:\n"
+msgstr[1] "%d semeyes non sofitaes saltaes:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "saltóse 1 ficheru que nun yera una imaxe.\n"
+msgstr[1] "saltáronse %d ficheros que nun yeren imáxenes.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "omitióse 1 semeya darréu de qu'encaboxóse pol usuariu:\n"
+msgstr[1] "omitiéronse %d semeyes darréu de qu'encaboxáronse pol usuariu:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 semeya importada correchamente.\n"
+msgstr[1] "%d semeyes importaes correchamente.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importación completa"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundu"
+msgstr[1] "%d segundos"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minutu"
+msgstr[1] "%d minutos"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d hores"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 día"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Renomar eventu"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editar Títulu"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Esborrar ficheru"
+msgstr[1] "_Esborrar ficheros"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Namái de_saniciar"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Esto va desaniciar tolos cambeos fechos nel ficheru esternu. ¿Siguir?"
+msgstr[1] ""
+"Esto va desaniciar tolos cambeos fechos nos %d ficheros esternos. ¿Siguir?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_vertir ediciones esternes"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Esto va desaniciar la semeya de la biblioteca. ¿Siguir?"
+msgstr[1] "Esto va desaniciar %d semeyes de la biblioteca. ¿Siguir?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "De_saniciar"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Desaniciando semeyes de la biblioteca"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modificar ficheros orixinales"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Orixinal: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El tiempu d'esposición va allanciase por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El tiempu d'esposición va desplazase haza darrera por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "díes"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "hores"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutu"
+msgstr[1] "minutos"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundu"
+msgstr[1] "segundos"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Y %d más."
+msgstr[1] ""
+"\n"
+"\n"
+"Y otres %d más."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetes (separtaes por comes):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bienllegáu!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Afáyate en Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Pa escomencipiar, importa semeyes de cualesquiera de les siguientes formes:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Esbillar <span weight=\"bold\">Importar ficheru %s dende la carpeta</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arrastrar y soltar semeyes na ventana de Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Coneutar una cámara al equipu ya importar"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Importar semeyes dende la carpeta %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"Tamién puedes importar semeyes de cualesquiera de les siguientes formes:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Nun a_mosar más esti mensaxe"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalizar"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_piar fotos"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importar a la biblioteca"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Desaniciar de la biblioteca"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Desaniciando semeyes de la biblioteca"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Esto va desaniciar la semeya de la biblioteca Shotwell. ¿Prestaríate mover "
+"el ficheru a la papelera del escritoriu?\r\n"
+"\r\n"
+"Esta aición nun puede desfacese."
+msgstr[1] ""
+"Esto va desaniciar %d semeyes de la biblioteca Shotwell. ¿Prestaríate mover "
+"los ficheros a la papelera del escritoriu?\r\n"
+"\r\n"
+"Esta aición nun puede desfacese."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetes"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Éxitu"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Fallu de ficheru"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nun puede descodificase'l ficheru"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Fallu de la base de datos"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Usuariu encaboxó la importación"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nun ye un ficheru"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "El ficheru yá esiste na base de datos"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Formatu de ficheru non sofitáu"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nun ye un ficheru d'imaxe"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Fallu en discu"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Discu enllén"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Fallu de la cámara"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Fallu d'importación (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificada"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Semeya anterior"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Semeya siguiente"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Ficheru d'orixe perdíu: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Ver"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Semeya _anterior"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Semeya anterior"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Semeya _siguiente"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Semeya siguiente"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Aumentar"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumentar el tamañu de la semeya"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Amenorgar"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Decrementar el tamañu de la semeya"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Axus_tar a páxina"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Enantar la semeya y axustala a la pantalla"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Enantar la semeya al 100% magnification"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Enantar la semeya al 200% magnification"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nun puede esportase %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de datos %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importar"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Zarrar"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Configuración"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Presentación diapositives"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Atrás"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Dir a la semeya anterior"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Posar"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Posar la presentación"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Siguiente"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Dir a la semeya siguiente"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Camudar la configuración de la presentación"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Perdiéronse tolos oríxenes de les semeyes."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reproducir"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continuar la presentación"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Revertir"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Desfacer revertir"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Meyorar"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Desfacer meyorar"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Creando nuevu eventu"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Desaniciar eventu"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Mover semeyes a un nuevu eventu"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Establecer semeyes al eventu anterior"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Combinar"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Desfacer combinación"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicar semeyes"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Quitando semeyes duplicaes"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Nun puede duplicase una semeya darréu d'un fallu nun ficheru"
+msgstr[1] "Nun pueden duplicase %d semeyes darréu de fallos en ficheros"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Restaurando puntuación previa"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Incrementando puntuaciones"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Decrementando puntuaciones"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "La semeya orixinal nun puede axustase."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Axustar data y hora"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Desfacer axuste de data y hora"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "La semeya orixinal nun puede modificase."
+msgstr[1] "Les siguientes semeyes orixinales nun pueden modificase."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Fallu al axustar hora"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"L'axuste de la hora nun puede desfacese nel ficheru de la semeya siguiente."
+msgstr[1] ""
+"L'axuste de la hora nun puede desfacese nos ficheros de les semeyes "
+"siguiente."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mover semeyes a la papelera"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurar semeyes dende la papelera"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mover les semeyes a la papelera de Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurar les semeyes a la biblioteca de Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Mover semeyes a la papelera"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restaurar semeyes dende la papelera"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marcar les fotos seleicionaes"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Desmarcar les fotos seleicionaes"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcar"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Desmarcar"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baxu (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Mediu (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Altu (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Máximu (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Les semeyes nun pueden esportase a esti direutoriu."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "pulg."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Cartera (2 x 3 pulgaes)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Tarxeta de notes (3 x 5 pulgaes)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 pulg."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 pulg."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 pulg."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 pulg."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 pulg."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Tarxeta postal (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Axustes d'imaxe"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nun ye dable imprentar semeya:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Nun se pudo abrir/crear la base de datos de fotos %s: códigu d'error %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nun pudo llanzase Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Unviar a"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Nun puede esportase'l fondu de pantalla a %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nun pudo preparase'l carrusel d'escritoriu: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Papelera"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Desaniciar"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Ficheros perdíos"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Desaniciando..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Cabera Importación"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importar dende la carpeta..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importar semeyes dende'l discu a la biblioteca"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Axeitar ev_entos"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Vaciar Papelera"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Desaniciar toles semeyes de la papelera"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Ficheru"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Editar"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Semeya"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Semeyes"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_tos"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Et_iquetes"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "A_ida"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "I_nformación básica"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Amosar la información básica de la seleición"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Información est_endía"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Amosar información estendía de la seleición"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Ascendente"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Axeitar semeyes n'orde ascendente"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escendente"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Axeitar semeyes n'orde descendente"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importar dende carpeta"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Vaciar papelera"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Vaciando papelera..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell ta configuráu pa importar semeyes dende'l to direutoriu home.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Allugamientu de la biblioteca"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Les semeyes nun pueden importase dende esti direutoriu."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importando..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Detener Importación"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Detener importación de semeyes"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importáronse %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Guardar"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Guardar semeya"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Guardar _como..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Guardar semeya con un nome distintu"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprentar la semeya nuna imprentadora coneutada al equipu"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s nun esiste."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nun ye un ficheru."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s nun ye compatible col formato de ficheru de\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Gua_rdar una copia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "¿Perder los cambeos de %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Z_arrar ensin guardar"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Fallu al guardar en %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Guardar como"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Xestor de semeyes"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visor de semeyes"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotar a la _Drecha"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotar"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotar a la drecha"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotar a la _Esquierda"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotar a la esquierda"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotar les semeyes a la esquierda"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Espeyar h_orizontalmente"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Espeyar horizontalmente"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Espeyar v_erticalmente"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Espeyar verticalmente"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "M_eyorar"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Meyorar"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Meyorar automáticamente l'aspeutu de la semeya"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Re_cortar"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Recortar"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Recortar el tamañu de la semeya"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Güeyos _bermeyos"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Güeyos bermeyos"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Amenorgar o desaniciar cualesquier efeutu de güeyos bermeyos na semeya"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Axustar"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Axustar"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Axustar el color y el tonu de la semeya"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Re_vertir al orixinal"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Revertir al orixinal"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Revertir e_diciones esternes"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Volver a la semeya original"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Afitar como fondu d'_escritoriu"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Afitar la imaxe esbillada como nuevu fondu d'escritoriu"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Desfacer"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Desfacer"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refacer"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Refacer"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_nomar Eventu..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Facer semeya clave pal eventu"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Facer semeya clave pal eventu"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nuevu Eventu"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Nuevu Eventu"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mover Semeyes"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mover semeyes d'un eventu"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Combinar eventos"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Combinar"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Afitar puntuación"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Afitar puntuación"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Camudar la puntuación de la semeya"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Incrementar"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Incrementar puntuación"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "D_ecrementar"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Decrementar puntuación"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Non puntuaes"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Puntuar non puntuaes"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Afitanco como ensin puntuar"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Desaniciar puntuaciones"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Refugao"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Puntuación refugada"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Afitando como refugao"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Axustar puntuación a refugada"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Toes + _Refugaes"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Amosar toles semeyes, inclusu les refugaes"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Toles semeyes"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Amosar toles semeyes"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Puntuaciones"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Amosar la puntuación de cada semeya"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Peñerar semeyes"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Peñerar semeyes"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Llendar el númberu de semeyes amosaes según una peñera"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicar"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Facer un duplicáu de la semeya"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Esportar..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Imprentar..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Espu_blizar..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Espublizar"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Espublizar en dellos sitios web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Axustar hora y data..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Axustar hora y data"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Amestar _Etiquetes..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Amestar Etiquetes"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferencies"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Abrir con editor RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nun puede lanzase l'editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Amestar Etiqueta \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Amestar Etiquetes \"%s\" y \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Desaniciar Etiqueta \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Desaniciar Etiqueta \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Desaniciar etiqueta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_nomar etiqueta «%s»..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Renomar la etiqueta «%s» a «%s»"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modif_icar etiquetes..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificar etiquetes"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etiquetar semeyes como «%s»"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etiquetar les semeyes esbillaes como «%s»"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Desaniciar etiqueta «%s» de les _semeyes"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Desaniciar etiqueta «%s» de les semeyes"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Nun puede renomase la etiqueta a «%s» porque la etiqueta yá esiste."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Puntuar %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Afitar puntuación a %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Afitando puntuación a %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Amosar %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Namái amosar semeyes con puntuación de %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s o meyor"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Amosar %s o meyor"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Namái amosar semeyes con puntuación de %s o meyor"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Desaniciar les semeyes esbillaes de la papelera"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Desaniciar les semeyes esbillaes de la biblioteca"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurar"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mover les semeyes esbillaes de vuelta a la biblioteca"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Amosar en X_estor de Ficheros"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Abrir el direutoriu de la semeya esbillada nel xestor de ficheros"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nun puede abrise'l xestor de ficheros: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Desaniciar de la biblioteca"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mover a la Papelera"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Seleicionar _Too"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Seleicionar tolos elementos"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Reset"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Volver a les dimensiones actuales de la semeya"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Afitar el corte d'esta semeya"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Xira'l reutángulu ente les orientaciones del retratu y el paisaxe"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Ensin restricciones"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Cuadráu"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Pantalla"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Tamañu orixinal"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Videu (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Videu (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Zarrar la ferramienta de güeyos bermeyos"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Retirar cualesquier efeutu de güeyos bermeyos na rexón esbillada"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturación:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Matiz:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Solombres:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Resetear collores"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Restablecer tolos axustes de color a la orixinal"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Matiz"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturación"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Esposición"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Solombres"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Espansión de contraste"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Colar de Pantalla Completa"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Colar de P_antalla Completa"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Colar"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Tocante a"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "P_antalla completa"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Conteníos"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Hebo un fallu fatal al acceder a la biblioteca de Shotwell. Shotwell nun pue "
+"continuar.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Visita'l sitiu web Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Iñigo Varela < ivarela@softastur.org>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Imposible amosar l'aida: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Tamañu orixinal"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Anchor o altor"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Anchor"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altor"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Axustar el tamañu de les miniatures"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Aumentar les miniatures"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Amenorgar les miniatures"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Axeitar _semeyes"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Amosar les etiquetes de cada semeya"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Por Tít_ulu"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Axeitar semeyes por títulu"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Por data d'esposición"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Axeitar semeyes por data d'esposición"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Por p_untuación"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Axeitar semeyes por puntuación"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Eventos"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Ensin data"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nun se pue crear el direutoriu de datos %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Imáxenes"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nun se pue crear el direutoriu temporal %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nun se pue crear el subdireutoriu de datos %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Esportando"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "El ficheru %s yá esiste. ¿Trocar?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Om_itir"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Trocar"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Trocar t_oo"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Esportar"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Semeyes"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Les semeyes esbillaes espublizáronse con éxitu."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Obteniendo información de la cuenta..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Ingresando en..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Espublizar semeyes"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Espublizar se_meyes a:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Pa intentar espublizar n'otru serviciu, esbilla ún nel menú d'arriba."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Yá aniciaste y zarraste sesión de Flickr durante esta sesión de Shotwell.\n"
+"Para siguir espublizando en Flickr, zarra ya reanicia Shotwell, ya intenta "
+"espublizar de nueves."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Tas coneutáu en Flickr como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"La to cuenta de baldre de Flickr llenda la cantidá de datos que puedes xubir "
+"al mes.\n"
+"Esti mes, tienes %d megabytes restantes de la to cuota de carga."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "La to cuenta de Flickr Pro date drechu a xubes illimitaes."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Semeyes _visibles pa:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Toos"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Namái collacios y familia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Yo namái"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Nome d'usuariu y/o contraseña inválidu. Vuelva a intentalo"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Creando álbum..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Tas coneutáu a Álbumes web de Picasa como %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Les semeyes apaecen en:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pequeñu (640 x 480 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mediu (1024 x 768 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Encamentáu (1600 x 1200 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Anguaño nun tas rexistráu en Facebook.\n"
+"\n"
+"Si entá nun tienes una de Facebook, puedes creala durante'l procesu d'aniciu "
+"de sesión. Durante l'aniciu de la sesión, Shotwell Connect puede pedite "
+"permisu pa xubir semeyes ya espublizales nel to feed. Estos permisos son "
+"necesarios pa que Shotwell Connect funcione."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Yá aniciaste y zarraste sesión de Facebook durante esta sesión de Shotwell.\n"
+"Para siguir espublizando en Facebook, zarra ya reanicia Shotwell, ya intenta "
+"espublizar de nueves."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Comprobando la conexón a Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Tas coneutáu en Facebook como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Usar tam_añu estándar:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Usar tamañu personali_záu:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "Concasar rellación d'aspeutu de la semeya"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "Salida de semeya en:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixels por pulgada"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiqueta"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "segundos"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Coneutase"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Espublizar nun álbum e_sistente:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Crear un álbum _nuevu con nome:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Zarrar sesión"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "Es_publizar"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Tamañu _semeya:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Un álbum _esistente:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Un _nuevu álbum denomáu:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "Ll_istar álbum na galería pública"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Tamañu de semeya predefiníu:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "Contrase_ña"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Aniciar sesión"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visite'l sitiu web Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Anguaño nun anició sesión en Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Álbumes (o escribir nuevu):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Triba d'accesu:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Desactivar _comentarios"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Torgar la descarga de la _foto orixinal"
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..be4c305
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,4431 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# svetlisashkov <svetlisashkov@yahoo.com>, 2011
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Bulgarian (http://www.transifex.com/projects/p/shotwell/"
+"language/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Фотоапарати"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Фотоапарат"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Грешка при демонтиране на фотоапарата. Опитайте да го демонтирате от "
+"файловия мениджър."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Скриване на снимките, които вече са внесени"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Показване само на снимките, които не са внесени"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Имена"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Показва името на всяка снимка"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Внасяне на _избраните"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Внасяне на _всички"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell трябва да демонтира фотоапарата от файловата система, за да "
+"осъществи достъп до него. Продължаване?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "Демонтиране"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Моля демонтирайте фотоапарата."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Фотоапаратът е заключен от друго приложение. Shotwell може да има достъп до "
+"него само когато е отключен. Моля затворете всяко друго приложение, "
+"използващо фотоапарата и опитайте отново."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Моля затворете всяко друго приложение, използващо фотоапарата."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Грешка при получаване на предварителни прегледи от фотоапарата:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Демонтиране…"
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Получаване на информация за снимката"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Получаване на предварителен преглед за %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Грешка при заключване на фотоапарата: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Да се изтрие ли тази снимка от фотоапарата?"
+msgstr[1] "Да се изтрият ли тези %d снимки от фотоапарата?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Запазване"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Стартиране на прожекция"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Изнасяне на Снимки/Видеа"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Изнасяне на снимки"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Изнасяне на снимки"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Завъртане"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Отмяна на завъртане"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Хоризонтално обръщане"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Отмяна на хоризонтално обръщане"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Вертикално обръщане"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Отмяна на вертикално обръщане"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Зареждане на Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ФАЙЛ]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Изпълнете „%s --help“, за да видите пълния списък с опции за командния ред.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Днес"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Заглавие:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Записи:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d събитие"
+msgstr[1] "%d събития"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d снимка"
+msgstr[1] "%d снимки"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Дата:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Време:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "От:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "До:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Размер:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Експонация:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Местоположение:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Размер на файла:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Оригинални размери:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Производител на фотоапарата:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Модел на фотоапарата:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Светкавица:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Фокусно разстояние:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Експонация:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS географска ширина:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS географска дължина:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Изпълнител:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Авторски права:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Софтуер."
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Разширена информация"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Това ще премахне етикета \"%s\" от една снимка. Продължаване?"
+msgstr[1] "Това ще премахне етикета \"%s\" от %d снимки. Продължаване?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Отказ"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Изтриване"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Изнасяне на видео"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Снимката не може да бъде изнесена поради файлова грешка.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Желаете ли да продължите изнасянето?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Продължи"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr ""
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Качество:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Ограничение за _мащабиране:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_пиксела"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(и още %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 повтаряща се снимка не е внесена:\n"
+msgstr[1] "%d повтарящи се снимки не са внесени:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 снимка не е внесена успешно поради файлова или хардуерна грешка.\n"
+msgstr[1] ""
+"%d снимки не са внесени успешно поради файлова или хардуерна грешка.\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 снимка не е внесена успешно поради грешка във фотоапарата.\n"
+msgstr[1] "%d снимки не са внесени успешно поради грешка във фотоапарата.\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 неподдържана снимка е пропусната.\n"
+msgstr[1] "%d неподдържани снимки са пропуснати.\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Пропуснат е 1 файл, който не е снимка.\n"
+msgstr[1] "Пропуснати са %d файла, който не са снимки.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 снимка е пропусната поради отказ на потребителя.\n"
+msgstr[1] "%d снимки са пропуснати поради отказ на потребителя.\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 снимка е внесена успешно.\n"
+msgstr[1] "%d снимки са внесени успешно.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Внасянето завърши"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr ""
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Преименуване на събитието"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Име:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Редактиране на заглавие"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Файл в кошчето"
+msgstr[1] "_Файла в кошчето"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Само _премахване"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Това ще унищожи всички промени, направени на външния файл. Продължаване?"
+msgstr[1] ""
+"Това ще унищожи всички промени, направени на %d външни файла. Продължаване?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Връщане към оригинала"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Това ще премахне снимката от библиотеката. Продължаване?"
+msgstr[1] "Това ще премахне %d снимки от библиотеката. Продължаване?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Премахване"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Премахване на снимките от библиотеката"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ч."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Промяна на оригиналните файлове"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Оригинал:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Времето на експонация ще бъде изместено напред с\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Времето на експонация ще бъде изместено назад с\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ден"
+msgstr[1] "дни"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минути"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунда"
+msgstr[1] "секунди"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"И %d друг."
+msgstr[1] ""
+"\n"
+"\n"
+"И %d други."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Етикети (разделени със запетая):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Добре дошли!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Добре дошли в Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "За да започнете, внесете снимки по един от следните начини:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Изберете <span weight=\"bold\">Файл %s Внасяне от папка</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Влачете и пуснете снимки върху прозореца на Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Свържете фотоапарат към компютъра си и внесете"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Внасяне на снимки от вашата папка %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Също така можете да внесете снимки по един от следните начини:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Това съобщение да _не се показва повече"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Потребителско"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Внасяне в библиотеката"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Премахване от библиотеката"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Премахва снимката от вашата библиотека"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Това ще премахне снимката от вашата библиотека на Shotwell. Желаете ли да "
+"също така да преместите файла към кошчето на работната среда?\n"
+"\n"
+"Това действие не може да бъде върнато."
+msgstr[1] ""
+"Това ще премахне %d от вашата библиотека на Shotwell. Желаете ли да също "
+"така да преместите файловете към кошчето на работната среда??\n"
+"\n"
+"Това действие не може да бъде върнато.."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Етикети"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Успех"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Грешка във файл"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Невъзможност за дешифриране на файл"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Грешка в базата данни"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Внасянето е прекъснато от потребителя"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Не е файл"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Файлът вече съществува в базата данни"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Неподдържан формат на файл"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Не е файл с изображение"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Повреда на диска"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Дискът е пълен"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Фотоапарат във фотоапарата"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Неуспешно внасяне (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "променено"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Предишна снимка"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Следваща снимка"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Липсва файлът-първоизточник на снимката: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Изглед"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Предишна снимка"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Предишна снимка"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Следваща снимка"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Следваща снимка"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Увеличаване"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Увеличава приближението на снимката"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Намаляване"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Намалява приближението на снимката"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Мащабиране до размера на _страницата"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Увеличаване на снимката до побиране в екрана"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_100% увеличение"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Увеличение на снимката до 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_200% увеличение"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Увеличение на снимката до 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Невъзможност за изнасяне на %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "База данни %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Внасяне"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Затваряне"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Настройки"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Прожекция"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Назад"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Към предишното изображение"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Пауза"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Пауза на прожекцията"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Напред"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Към следващото изображение"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Промяна настройките на прожекцията"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Лисват всички файлове-първоизточници на снимки."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Изпълнение"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Продължава прожекцията"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Възстановяване"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Отмяна на възстановяване"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Подобряване"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Отмяна на подобряване"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Създаване на ново събитие"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Премахване на събитие"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Преместване на снимки към ново събитие"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Връщане на снимки към предишно събитие"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Сливане"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Разделяне на сливане"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Дублиране на снимки"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Премахване на дублирани снимки"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Една снимка не може да се дублира поради файлова грешка"
+msgstr[1] "%d снимки не могат да се дублират поради файлови грешки"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Възстановяване на предишната оценка"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Увеличаване на оценката"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Намаляване на оценката"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Оригиналната снимка не може да бъде настроена."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Настройване на датата и часа"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Отмяна настройване на датата и часа"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Една оригинална снимка не може да бъде настроена."
+msgstr[1] "Следните оригинални снимки не могат да бъдат настроени."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Грешка при настройването на времето"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Настройването на времето на тази снимка не може да бъде отменено."
+msgstr[1] "Настройването на времето на тези снимки не може да бъде отменено."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Преместване на снимките в кошчето"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Възстановяване на снимки от кошчето"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Премества снимките в кошчето на Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Възстановява снимките обратно в библиотеката на Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Преместване на снимките в кошчето"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Възстановяване на снимки от кошчето"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr ""
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Ниско (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Средно (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Високо (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Максимално (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Снимките не могат да бъдат изнесени в тази папка."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Wallet (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postcard (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Настройки на изображението"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Снимката не може да се отпечата:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Не може да се стартира Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Изпращане до"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Фонът не можа да се изнесе в %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Прожекцията не може да бъде подготвена: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Кошче"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Изтриване"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Липсващи файлове"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Изтриване…"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Последно внасяне"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Внасяне от папка"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Внася снимки от диска в библиотеката"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Сортиране на _събития"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Изпразване на _кошчето"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Изтриване на всички снимки от кошчето"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Файл"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Редактиране"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Снимка"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "Снимки"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Събития"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Етикети"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Помощ"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Основна информация"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Показва основна информация за избраното"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Разширена информация"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Показва разширена информация за избраното"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Възходящо"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Подрежда снимките във възходящ ред"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Низходящо"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Подрежда снимките в низходящ ред"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Внасяне от папка"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Изпразване на кошчето"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Изпразване на кошчето"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell е настроена да внася снимки в домашната ви папка.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Местоположение на библиотеката:"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Снимките не могат да бъдат внесени от тази папка."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Внасяне…"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Спиране на внасянето"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Спира внасянето на снимки"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Внесени %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Запазване"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Запазване на снимка"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Запазване _като…"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Запазване на снимката под различно име"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Отпечатва снимката на принтер, свързан към компютъра ви"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s не съществува."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s не е файл."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s не поддържа файловия формат на\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Запазване на копие"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Загуба на промените на %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Затваряне без _запазване"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Грешка при запазване на %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Запазване като"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Мениджър на снимки"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Визуализатор на снимки"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Завъртане на_дясно"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Завъртане"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Завъртане надясно"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Завъртане на_ляво"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Завъртане наляво"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Завърта снимките наляво"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "_Хоризонтално обръщане"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Хоризонтално обръщане"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "_Вертикално обръщане"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Вертикално обръщане"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Подобряване"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Подобряване"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Автоматично подобрява вида на снимката"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "И_зрязване"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Отрязване"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Отрязва размера на изображението"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Червени очи"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Червени очи"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Намаля или елиминира всякакви ефекти на червените очи в снимката"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "Настройване"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Настройване"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Настройва цветовете и тона на снимката"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Връщане към оригинала"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Връщане към оригинала"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Връщане към оригинала"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Връщане към оригиналното изображение"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Задаване като фон на работния плот"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Задава избраното изображение като фон на работния плот"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Отмяна"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Отмяна"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Повтаряне"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Повтаряне"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Преименуване на събитие..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "_Ключова снимка за събитието"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Ключова снимка за събитието"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Ново събитие"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Ново събитие"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Преместване на снимки"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Премества снимките към събитие"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Сливане на събития"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Сливане"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Оценяване"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Оценяване"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Промяна оценката на вашата снимка"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Увеличаване"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "С по-висока оценка"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Намаляване"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "С по-ниска оценка"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Неоценена"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Оценяване като неоценена"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Задаване като неоценена"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Премахване на всички оценки"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Отхвърлена"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Оценка Отхвърлена"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Оценяване като отхвърлена"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Задаване на оценка Отхвърлена"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Всички + _Отхвърлени"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Показване на всички снимки, включително отхвърлените"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Всички снимки"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Показване на всички снимки"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Оценки"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Показва оценката на всяка снимка"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Филтриране на снимки"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Филтриране на снимки"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ограничаване броя на показваните снимки на база филтър"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Дублиране"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Дублиране"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Създава дубликат на снимката"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Изнасяне..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Печат..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "П_убликуване..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Публикуване"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Публикуване в различни уеб сайтове"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Настройки на дата и час"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Настройки на дата и час"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Добавяне на _етикети..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Добавяне на етикети"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Предпочитания"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Отваряне с RAW _редактор"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Грешка при стартиране на редактора: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Добавяне на етикет \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Добавяне на етикети \"%s\" и \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Изтриване на етикет \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Изтриване на етикет \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Изтриване на етикет"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Преименуване на етикет \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Преименуване на етикет \"%s\" на \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Промяна на _етикети..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Промяна на етикети"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Задаване на етикет \"%s\" на снимките"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Задава етикет \"%s\" за избраните снимки"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Премахване на етикет \"%s\" от снимките"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Премахване на етикет \"%s\" от снимките"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Името на етикета не може да се смени на \"%s\", защото вече има такъв етикет."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Оценка на %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Задаване оценка на %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Задаване оценка на %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Показване на %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Показване само на снимки с оценка %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s или по-добра"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "По-казване на %s или по-добра"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Показване само на снимки с оценка %s или по-висока"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Премахва избраните снимки от кошчето"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Премахва избраните снимки от библиотеката"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Възстановяване"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Премества избраните снимки обратно в библиотеката"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Отваряне с файловия мениджър"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Отваря папката на избраните снимки във файловия мениджър"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Грешка при отваряне във файловия мениджър: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Премахване от библиотеката"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Преместване в кошчето"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Избиране на _всички"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Избиране на всички елементи"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Възстановяване"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Връща към размерите на текущата снимка"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Задава отрязването за тази снимка"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Завърта рамката на отразяването в позиция пейзаж или портрет"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Неограничено"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Квадрат"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Екран"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Оригинален размер"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Затваряне на инструмента за корекция на червени очи"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Премахва всякакви ефекти на червени очи в избрания регион"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Насищане:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Нюанс:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Температура:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Сенки:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Възстановяване на цветове"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Връща всички настройки на цветовете към началното им състояние"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Температура"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Нюанс"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Насищане"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Експонация"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Сенки"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Разширяване на контраста"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Задържане на лентата с инструменти"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Задържане на лентата с инструменти отворена"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Изход от цял екран"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Изход от цял екран"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Изход"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Относно"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Цял екран"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Съдържание"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"При достъп до библиотеката на Shotwell се появи фатална грешка. Shotwell не "
+"може да продължи.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Посетете уеб страницата на Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Svetoslav Stefanov <lfu.project@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Помощта не може да бъде показана: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Оригинален размер"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ширина или височина"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ширина"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Височина"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Регулиране размера на миниатюрите"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Увеличава размера на миниатюрите"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Намалява размера на миниатюрите"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Сортиране на _Снимки"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Показва името на всяка снимка"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "По _име"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Подрежда снимките по име"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "По _дата на експонация"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Сортира снимките по дата на експонация"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "По _оценка"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Подреждане на снимките по оценка"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Събития"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Обновено"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Не може да се създаде папка с данни %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Изображения"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Не може да се създаде временна папак %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Изнасяне"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Файлът %s вече съществува. Да се презапише ли?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Пропускане"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Замяна"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Замяна на _всички"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr ""
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Снимки"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Избраните снимки са публикувани успешно."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Получаване на информация за профила..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Вписване..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Публикуване на снимки"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Публикуване на снимки _в:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "За да публикувате в друга услуга, изберете една от горното меню."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Вече сте се вписали и отписали от Flickr по време на тази сесия на "
+"Shotwell.\n"
+"За да продължите да публикувате във Flickr, излезте и рестартирайте "
+"Shotwell, след което се опитайте отново да публикувате."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Вписан сте във Flickr като %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Вашият свободен профил във Flickr ви ограничава колко данни може да качвате "
+"месечно.\n"
+"Този месец ви остават %d мегабайта в квотата ви за качване."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Вашият профил във Flickr Pro позволява неограничено качване."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Снимките са видими за:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Всички"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Само приятели и семейство"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Само аз"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 пиксела"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 пиксела"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 пиксела"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 пиксела"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Създаване на албум..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Вписан сте в Picasa Уеб Албуми като %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Снимките ще се появят в:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Малка (640 x 480 пиксела)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Средна (1024 x 768 пиксела)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Препоръчително (1600 x 1200 пиксела)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Не сте вписан във Facebook.\n"
+"\n"
+"Ако нямате профил във Facebook, можете да създадете по време на вписването. "
+"Shotwell Connect може да изисква достъп за качване и публикуване на снимки. "
+"Това е необходимо за да работи правило програмата."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Вече сте се вписали и отписали от Facebook по време на тази сесия на "
+"Shotwell.\n"
+"За да продължите да публикувате във Facebook, излезте и рестартирайте "
+"Shotwell, след което се опитайте отново да публикувате."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Пробване на връзката с Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Използване на _стандартен размер:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Използване на _потребителски размер:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Запазване пропорцията на снимката"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Извеждане на снимката в:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "пиксели на инч"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "секунди"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Вписване"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Публикуване в _съществуващ албум:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Създаване на _нов албум с име:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "Излизане"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Публикуване"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Големина на _снимка:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Съществуващ албум:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Нов албум с име:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Изброяване на албума в публична галерия"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Размер на снимка:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..85f8ae9
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,4367 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Rahul Ghose <hansum.rahul@gmail.com>, 2012
+# Sucheta Ghoshal <sucheta.ghoshal@gmail.com>, 2012
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Bengali (http://www.transifex.com/projects/p/shotwell/"
+"language/bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "ক্যামেরা"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "শিরোনাম(_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "একটি Slideshow চালান"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr ""
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr ""
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ঘুড়িয়ে নেওয়া হচ্ছে"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "পূর্বাবস্থায় ঘোরান"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr ""
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr ""
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr ""
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr ""
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr ""
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr ""
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr ""
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr ""
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr ""
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr ""
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr ""
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "বাতিল করুন(_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr ""
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr ""
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr ""
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr ""
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr ""
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr ""
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "পিক্সেল (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr ""
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr ""
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "নাম:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "আবর্জনার ফাইল(_T)"
+msgstr[1] "আবর্জনার ফাইল(_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr ""
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr ""
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr ""
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "দিন"
+msgstr[1] "দিন"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ঘন্টা"
+msgstr[1] "ঘন্টা"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "মিনিট"
+msgstr[1] "মিনিট"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "সেকেন্ড"
+msgstr[1] "সেকেন্ড"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "স্বাগতম!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "শটওয়েল(Shotwell) এ স্বাগতম!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr ""
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr ""
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ডিস্ক ভরে গেছে"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr ""
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "প্রদর্শন করুন(_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr ""
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s তথ্যভাণ্ডার"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "বন্ধ করুন(_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "স্লাইডশো"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr ""
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr ""
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr ""
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr ""
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr ""
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr ""
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr ""
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr ""
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr ""
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr ""
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr ""
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr ""
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr ""
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr ""
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr ""
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr ""
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr ""
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ফাইল(_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "সম্পাদন(_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ছবি(_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ta_gs"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ফটো ম্যানেজার"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ছবি প্রদর্শক"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "আবর্জনার বাক্সে স্থানান্তর করো"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr ""
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "সম্পূর্ণ পর্দা থেকে প্রস্থান"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "সম্পূর্ণ পর্দা থেকে প্রস্থান (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "প্রস্থান করুন(_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "পরিচিতি(_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr ""
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "বিষয়বস্তু(_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba ওয়েব সাইট দেখে নিন"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Sankarshan Mukhopadhyay <sankarshan@fedoraproject.org>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "সাহায্য প্রদর্শনে ব্যর্থ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr ""
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr ""
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr ""
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr ""
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "এক একটি ছবির tag প্রদর্শন"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Data Directory তৈরি করতে ব্যর্থ %s: %s "
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ছবি"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "সাময়িক Directory তৈরি করতে ব্যর্থ %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Data Subdirectory তৈরি করতে ব্যর্থ %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr ""
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "এগিয়ে চলুন(_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr ""
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ছবি"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "সকলে"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 পিক্সেল"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr ""
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr ""
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr ""
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "সেকেন্ড"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "লগ-ইন(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "লগ-আউট(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/bn_IN.po b/po/bn_IN.po
new file mode 100644
index 0000000..121e475
--- /dev/null
+++ b/po/bn_IN.po
@@ -0,0 +1,4407 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# samratb <mails.samrat@gmail.com>, 2012
+# Rahul Ghose <hansum.rahul@gmail.com>, 2012
+# runab <runab@redhat.com>, 2012
+# runa <runabh@gmail.com>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: runa <runabh@gmail.com>\n"
+"Language-Team: Bengali (India) (http://www.transifex.com/projects/p/shotwell/"
+"language/bn_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "ক্যামেরা"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "ক্যামেরা"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "শিরোনাম (_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "স্লাইড-শো (_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "একটি স্লাইড-শো চালু করুন"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ছবি/ভিডিও রপ্তানি"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ফটো/ভিডিও এক্সপোর্ট করুন"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ছবি রপ্তানি"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ছবি রফতানি করুন"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ঘোরানো"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "আবর্তন বাতিল করছে"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "অনুভূমিকভাবে ওলটাচ্ছে"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "অনুভূমিকভাবে ওলটান বাতিল করছে "
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "উলম্বভাবে ওলটাচ্ছে"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "উলম্বভাবে ওলটান বাতিল করছে "
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "যে কোনো লেখা"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "শিরোনাম"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ট্যাগ"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ইভেন্টের নাম"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ফাইমের নাম"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "মিডিয়ার ধরন"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ফ্ল্যাগের অবস্থা"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "হার"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "তারিখ"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "অন্তর্ভুক্ত"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "সম্পূর্ণ মিল"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "প্রারম্ভে রয়েছে"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "শেষে রয়েছে"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "অন্তর্ভুক্ত নয়"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "নির্ধারিত নয়"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "রয়েছে"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "নয়"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "যে কোনো ফটো"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "একটি raw ফটো"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "একটি ভিডিও"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ফ্ল্যাগ করা হয়েছে"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ফ্ল্যাগ করা হয়নি"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ও ঊর্ধ্বতন"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "শুধুমাত্র"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "অথবা কম"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "এর পরে"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "এর পূর্বে"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "এর মধ্যে"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "এবং"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "যে কোনো"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "সকল"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "শূণ্য"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "সংরক্ষিত অনুসন্ধান"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "নতুন সংরক্ষিত অনুসন্ধান...(_w)"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell-র ডাটাবেস নিশ্চিত করার প্রচেষ্টাকালে অজানা সমস্যা দেখা দিয়েছে: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell লোড করা হচ্ছে"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"কমান্ড-লাইন থেকে ব্যবহারযোগ্য সকল বিকল্পের তালিকা দেখার জন্য '%s --help' প্রয়োগ "
+"করুন।\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "আজ"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "গতকাল"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "শিরোনাম"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "বস্তু:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d-টি ইভেন্ট"
+msgstr[1] "%d-টি ইভেন্ট"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d-টি ফটো"
+msgstr[1] "%d-টি ফটো"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d-টি ভিডিও"
+msgstr[1] "%d-টি ভিডিও"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "তারিখ:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "সময়:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "আরম্ভ:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "সমাপ্তি:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "মাপ:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "অবকাল:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f সেকেন্ড"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "ডিভেলপর:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "এক্সপোসার:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "অবস্থান:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ফাইলের মাপ:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "ক্যামেরার ধরন:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "ক্যামেরার মডেল:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ফ্ল্যাশ:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ফোকাল দৈর্ঘ্যের মাপ:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS-র অক্ষাংশ:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS-র দ্রাঘিমাংশ:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "শিল্পী:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "স্বত্বাধিকার:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "সফ্টওয়্যার:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "অতিরিক্ত তথ্য"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"এর ফলে একটি ফটো থেকে \"%s\" ট্যাগ সরিয়ে ফেলা হবে। এগিয়ে যাওয়া হবে কি?"
+msgstr[1] ""
+"এর ফলে \"%s\" ট্যাগটি %d-টি ফটো থেকে সরিয়ে ফেলা হবে। এগিয়ে যাওয়া হবে কি?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "বাতিল করুন(_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "মুছে ফেলুন (_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "এর ফলে \"%s\" সংরক্ষিত অনুসন্ধানটি মুছে ফেলা হবে। এগিয়ে যাওয়া হবে কি?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ডিভেলপর পরিবর্তন করুন (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ভিডিও রফতানি করুন"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ফাইলের ত্রুটির কারণে নিম্নলিখিত ফটো এক্সপোর্ট করতে ব্যর্থ।\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"রফতানি কি চালিয়ে যেতে চান?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "এগিয়ে চলুন (_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "অবিকৃত"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "বর্তমান"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "বিন্যাস: (_F)"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "গুণমান (_Q)"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "পিক্সেল (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "মিটা-ডাটা এক্সপোর্ট করুন"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(অারো %d খানা)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 টি ছবির প্রতিলিপি আমদানি করা হয়নি\n"
+msgstr[1] "%d ছবি গুলির প্রতিলিপি আমদানি করা হয়নি \n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে ১-টি ফটো ইম্পোর্ট করতে ব্যর্থ:\n"
+msgstr[1] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে %d-টি ফটো ইম্পোর্ট করতে ব্যর্থ:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে ১-টি ভিডিও ইম্পোর্ট করতে ব্যর্থ:\n"
+msgstr[1] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে %d-টি ভিডিও ইম্পোর্ট করতে ব্যর্থ:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে ১-টি ফটো/ভিডিও ইম্পোর্ট করতে ব্যর্থ:\n"
+msgstr[1] ""
+"ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে %d-টি ফটো/ভিডিও ইম্পোর্ট করতে ব্যর্থ:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে ১-টি ফাইল ইম্পোর্ট করতে ব্যর্থ:\n"
+msgstr[1] "ফাইল অথবা হার্ডওয়্যারের ত্রুটির কারণে %d-টি ফাইল ইম্পোর্ট করতে ব্যর্থ:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr ""
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d সেকেন্ড"
+msgstr[1] "%d সেকেন্ড"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d মিনিট"
+msgstr[1] "%d মিনিট"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ঘন্টা"
+msgstr[1] "%d ঘন্টা"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "১ দিন"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "নাম:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "শিরোনাম সম্পাদন করুন"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "আবর্জনার ফাইল (_T)"
+msgstr[1] "আবর্জনার ফাইল (_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr ""
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "দিন"
+msgstr[1] "দিন"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ঘন্টা"
+msgstr[1] "ঘন্টা"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "মিনিট"
+msgstr[1] "মিনিট"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "সেকেন্ড"
+msgstr[1] "সেকেন্ড"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "স্বাগতম!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "শটওয়েল এ স্বাগতম!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr ""
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "লাইব্রেরি থেকে সরিয়ে নিন"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "লাইব্রেরি থেকে ফটো সরিয়ে নিন"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ট্যাগ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ফাইলের ত্রুটি"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ডেটাবেশে ত্রুটি"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "এটি ফাইল নয়"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "এই ফাইলটি চিত্র নয়"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "ক্যামেরার ত্রুটি"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "পরির্তিত"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "পূর্ববর্তী ফটো"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "পরবর্তী ফটো"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ফটোর উৎসের ফাইল অনুপস্থিত: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "প্রদর্শন (_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "সরঞ্জাম (_o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "পূর্ববর্তী ফটো (_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "পূর্ববর্তী ফটো"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "পরবর্তী ফটো (_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "পরবর্তী ফটো"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "বড় মাপে প্রদর্শন (_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ফটো প্রদর্শনের মাপ বৃদ্ধি করুন"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "ছোট মাপে প্রদর্শন (_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ফটো প্রদর্শনের মাপ হ্রাস করুন"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "পৃষ্ঠার মাপ অনুযায়ী (_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "পর্দার মাপ অনুসারে ফটো প্রদর্শনের মাপ নির্ধারণ করা হবে"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "১০০% প্রদর্শনের মাপ (_1)"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "১০০% প্রদর্শনের মাপ ফটো নির্ধারণ করা হবে"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "২০০% প্রদর্শনের মাপ (_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "২০০% প্রদর্শনের মাপ ফটো নির্ধারণ করা হবে"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ডিভেলপর (_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s এক্সপোর্ট করতে ব্যর্থ: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ডেটাবেস"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "ইম্পোর্ট করুন (_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "বন্ধ (_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "বিবিধ বৈশিষ্ট্য"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "স্লাইড-শো"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "পূর্ববর্তী"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "পূর্ববর্তী ফটোতে চলুন"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "বিরতি"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "স্লাইড-শো স্থগিত করুন"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "পরবর্তী"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "পরবর্তী ফটোতে চলুন"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "স্লাইড-শোয়ের বৈশিষ্ট্য পরিবর্তন করুন"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ফটোর উৎসের সকল ফাইল অনুপস্থিত।"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "চালান"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "স্লাইড-শো এগিয়ে নিন"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "পুনরাবৃত্তি"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "পুনরাবৃত্তি বাতিল করা হচছে"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "উন্নত করা হচ্ছে"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "উন্নতি বাতিল করা হচ্ছে"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "নতুন ইভেন্ট প্রস্তুত করা হচ্ছে"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ইভেন্ট মুছে ফেলা হচ্ছে"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ফটোগুলি নতুন ইভেন্টে সরানো হচ্ছে"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ফটোগুলি পূর্ববর্তী ইভেন্টে স্থাপন করা হচ্ছে"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "যুক্ত করা হচ্ছে"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "বিচ্ছিন্ন করা হচ্ছে"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "চিত্র প্রতিলিপি করা করা হচ্ছে"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "অনুরূপ ছবি সরানো হচ্ছে"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ফাইলের ত্রুটির কারণে একটি ফটোর প্রতিলিপি প্রস্তুত করতে ব্যর্থ"
+msgstr[1] "ফাইলের ত্রুটির কারণে %d-টি ফটোর প্রতিলিপি প্রস্তুত করতে ব্যর্থ"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "পূর্ববর্তী হার পুনরায় স্থাপন করা হচ্ছে"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "হার বৃদ্ধি করা হচ্ছে"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "হার হ্রাস করা হচ্ছে"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW ডিভেলপর নির্ধারণ করা হচ্ছে"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "পূর্ববর্তী RAW ডিভেলপর পুনরায় স্থাপন করা হচ্ছে"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "ডিভেলপর নির্ধারণ করুন"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "মূল ফটো পরিবর্তন করা যায়নি।"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "তারিখ ও সময় পরিবর্তন করা হচ্ছে"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "তারিখ ও সময়ের পরিবর্তন নাকচ করা হচ্ছে"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "একটি মূল ফটোয় পরিবর্তন করা যায়নি।"
+msgstr[1] "নিম্নলিখিত মূল ফটোগুলোয় পরিবর্তন করা যায়নি।"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "সময় নিয়ন্ত্রণে ত্রুটি"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "নিম্নলিখিত ফটোর ফাইলের মধ্যে করা সময়ের পরিবর্তন নাকচ করা যায়নি।"
+msgstr[1] "নিম্নলিখিত ফটোর ফাইলগুলির মধ্যে করা সময়ের পরিবর্তন নাকচ করা যায়নি।"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ট্যাগ প্রস্তুত করুন"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" ট্যাগ স্থানান্তর করুন"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ফটোগুলি আবর্জনার বাক্সে সরিয়ে নিন"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "আবর্জনার বাক্স থেকে ফটো উদ্ধার করুন"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Shotwell-র আবর্জনার বাক্সে ফটো স্থানান্তর করা হবে"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Shotwell-র আবর্জনার বাক্স থেকে ফটো উদ্ধার করুন"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ফটোগুলি আবর্জনার বাক্সে সরিয়ে নিন"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "আবর্জনার বাক্স থেকে ফটো উদ্ধার করা হচ্ছে"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "নির্বাচিত ফটো ফ্ল্যাগ করুন"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "নির্বাচিত ফটো থেকে ফ্ল্যাগ সরিয়ে নিন"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "নিশান"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "ফ্ল্যাগ সরিয়ে নিন"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "কোনো ফটো/ভিডিও উপস্থিত নেই"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "কোনো ফটো/ভিডিও পাওয়া যায়নি"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "এই ডিরেক্টরির মধ্যে ফটো এক্সপোর্ট করা যাবে না।"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "নিরীক্ষণ সংক্রান্ত আপডেট প্রসেস করতে ব্যর্থ: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "সম্পূর্ণ পৃষ্ঠা ভরে ফেলা হবে"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "প্রতি পৃষ্ঠায় ২-টি ছবি"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "প্রতি পৃষ্ঠায় ৪-টি ছবি"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "প্রতি পৃষ্ঠায় ৬-টি ছবি"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "প্রতি পৃষ্ঠায় ৮-টি ছবি"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "প্রতি পৃষ্ঠায় ১৬-টি ছবি"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "প্রতি পৃষ্ঠায় ৩২-টি ছবি"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "ইঞ্চি"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "সেন্টিমিটার"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "ওয়ালেট (২x ৩ ইঞ্চি)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "নোট-কার্ড (৩x ৫ ইঞ্চি)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "৪ x ৬ ইঞ্চি"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "৫ x ৭ ইঞ্চি"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "৮ x ১০ ইঞ্চি"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "১১ x ১৪ ইঞ্চি"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "১৬ x ২০ ইঞ্চি"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "মেট্রিক ওয়ালেট (৯ x ১৩ সেন্টিমিটার)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "পোস্টকার্ড (১০ x ১৫ সেন্টিমিটার)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "১৩ x ১৮ সেন্টিমিটার"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "১৮ x ২৪ সেন্টিমিটার"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "২০ x ৩০ সেন্টিমিটার"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "২৪ x ৪০ সেন্টিমিটার"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "৩০ x ৪০ সেন্টিমিটার"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ছবি সম্পর্কিত বৈশিষ্ট্য"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "প্রিন্ট করা হচ্ছে..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ফটো প্রিন্ট করতে ব্যর্থ:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ফটোর ডাটাবেস %s খুলতে/প্রস্তুত করতে ব্যর্থ: ত্রুটির কোড %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ফটো ডাটাবেস ফাইলের মধ্যে লিখতে ব্যর্থ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ডাটাবেস ফাইল ব্যবহার করতে ত্রুটি:\n"
+" %s\n"
+"\n"
+"ত্রুটি: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "ভিডিও এক্সপোর্ট করুন"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To আরম্ভ করতে ব্যর্থ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "পাঠান"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s-এ পটভূমি এক্সপোর্ট করতে ব্যর্থ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ডেস্কটপ স্লাইড-শো প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "ফ্ল্যাগ করা"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "আবর্জনা"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "আবর্জনা ফাঁকা"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "মুছে ফেলুন"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ফটো মুছে ফেলুন"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "অনুপস্থিত ফাইল"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "মুছে ফেলা হচ্ছে..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "সর্বশেষ ইম্পোর্ট"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ফোল্ডার থেকে ইম্পোর্ট করুন...(_I)"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ডিস্ক থেকে ফটো লাইব্রেরির মধ্যে ইম্পোর্ট করুন"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "অ্যাপ্লিকেশন থেকে ইম্পোর্ট করুন...(_A)"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "ইভেন্ট সুবিন্যস্ত করুন (_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "আবর্জনার বাক্স ফাঁকা করুন (_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "আবর্জনার বাক্সে উপস্থিত সকল ফটো মুছে ফেলুন"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ছবির সাথে জড়িত ইভেন্ট দেখুন (_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "অনুসন্ধান (_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "অনুসন্ধানের মান অনুযায়ী ফটো ও ভিডিও সন্ধান করুন"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ফাইল(_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "সম্পাদনা (_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "ফটো (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ফটো (_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ঘটনা (_T)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ট্যাগ (_G)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "সাহায্য (_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "মৌলিক তথ্য (_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "নির্বাচিত বস্তু সম্পর্কে মৌলিক তথ্য প্রদর্শন করা হবে"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "অতিরিক্ত তথ্য (_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "নির্বাচিত বস্তু সম্পর্কে অতিরিক্ত তথ্য প্রদর্শন করা হবে"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "অনুসন্ধানের বার (_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "অনুসন্ধানের বার প্রদর্শন করা হবে"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "ছোট থেকে বড় (_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "ছোট থেকে বড় ক্রমে ফটোর বিন্যাস নির্ধারণ করুন"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "বড় থেকে ছোট (_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "বড় থেকে ছোট ক্রমে ফটোর বিন্যাস নির্ধারণ করুন"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ফোল্ডার থেকে ইম্পোর্ট করুন"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "আবর্জনার বাক্স ফাঁকা করুন"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "আবর্জনার বাক্স ফাঁকা করা হচ্ছে..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"আপনার ব্যক্তিগত ডিরেক্টরির মধ্যে ফটো ইম্পোর্ট করার জন্য Shotwell কনফিগার করা "
+"হয়েছে।\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "লাইব্রেরির অবস্থান"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "এই ডিরেক্টরি থেকে ফটো ইম্পোর্ট করা যাবে না।"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "লাইব্রেরি আপডেট করা হচ্ছে..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "স্বয়ংক্রিয়ভাবে ফটো ইম্পোর্ট করার প্রস্তুতি চলছে..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "স্বয়ংক্রিয়ভাবে ফটো ইম্পোর্ট করা হচ্ছে..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "ফাইলের মধ্যে মিটা-ডাটা লেখা হচ্ছে..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "লাইব্রেরি"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "ইম্পোর্ট করা হচ্ছে..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ইম্পোর্ট বন্ধ করুন (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ফটো ইম্পোর্টের কাজ বন্ধ করুন"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "ইম্পোর্টের প্রস্তুতি চলছে..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s ইম্পোর্ট করা হয়েছে"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "সংরক্ষণ (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ফটো সংরক্ষণ করুন"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "নতুন রূপে সংরক্ষণ...(_A)"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ভিন্ন নামে একই ফটো"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "কম্পিউটারের সাথে যুক্ত একটি প্রিন্টারে ফটো প্রিন্ট করুন"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s উপস্থিত নেই।"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ফাইল নয়।"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s দ্বারা নিম্নলিখিত ফাইল বিন্যাস সমর্থন করা হয় না\n"
+"%s।"
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "একটি প্রতিলিপি সংরক্ষণ করুন (_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s-র পরিবর্তনগুলি সরিয়ে নেওয়া হবে কি?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "সংরক্ষণ না করে বন্ধ করুন (_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s-এ সংরক্ষণ করতে ত্রুটি: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "নতুন রূপে সংরক্ষণ"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ছবি পরিচালন ব্যবস্থা"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "চিত্র দর্শক"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "উন্নতি করুন (_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "উন্নতি করুন"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "পূর্বাবস্থা (_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "পূর্বাবস্থা"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "প্রিন্ট করুন... (_P)"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "প্রকাশ"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "অনুসন্ধান... (_F)"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "অনুসন্ধান"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "সম্পাদনা... (_E)"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "আবর্জনার বাক্সে স্থানান্তর করুন"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr ""
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "টুল-বার আটক করুন"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "খোলা অবস্থায় টুল-বার আটক করুন"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "পুরোপর্দা প্রদর্শন ছাড়ুন"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "সম্পূর্ণ পর্দা থেকে প্রস্থান (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "প্রস্থান করুন (_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "পরিচিতি (_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "পুরোপর্দা প্রদর্শন (_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "বিষয়বস্তু (_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "সাধারণ প্রশ্নোত্তর (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "সমস্যার তথ্য দায়ের করুন...(_R)"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell‌এর লাইব্রেরি একসেস করাতে একটি মারাত্মক সমস্যা হয়েছে। Shotwell চলতে "
+"পারবে না।\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba ওয়েবসিইটে যান"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Rahul Ghose (hansum.rahul@gmail.com)\n"
+"রুণা ভট্টাচার্য (runab@fedoraproject.org)"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "সহায়তার তথ্য প্রদর্শন করতে ব্যর্থ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "বাগ ডাটাবেস অব্দি পরিদর্শন করা যায়নি: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ প্রদর্শন করতে ব্যর্থ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "নামহীন"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "মূল মাপ"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "প্রস্থ অথবা উচ্চতা"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "প্রস্থ"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "উচ্চতা"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "প্রতিটি ছবির ট্যাগ দেখান"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "শিরোনাম অনুসারে (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "ক্যাশে ডিরেক্টরি %s প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "তথ্যের ডিরেক্টরি %s প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ছবি"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "অস্থায়ী ডিরেক্টরি %s প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "তথ্যের সাবডিরেক্টরি %s প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(শূণ্য)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "শূণ্য"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "স্লাইড-শোয়ের পরিবর্তন"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s-র জন্য অস্থায়ী ফাইল প্রস্তুত করতে ব্যর্থ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "এক্সপোর্ট করা হচ্ছে"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s ফাইলটি বর্তমানে উপস্থিত রয়েছে। প্রতিস্থাপন করা হবে কি?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "এগিয়ে চলুন (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "প্রতিস্থাপন (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "সমস্ত প্রতিস্থাপন করুন (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "এক্সপোর্ট করুন"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ছবি"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "ভিডিও"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ফটো"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ফটো"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ফাইল %s লোড করতে ত্রুটি: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "ধরন"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "নতুন ট্যাগ...(_T)"
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "প্রকাশনার জন।য আবশ্যক একটি অস্থায়ী ফাইল বর্তমানে উপস্থিত নেই"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "সকলে"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "৫০০ x ৩৭৫ পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "১০২৪ x ৭৬৮ পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "২০৪৮ x ১৫৩৬ পিক্সেল"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "৪০৯৬ x ৩০৭২ পিক্সেল"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"ব্যবহারকারী অ্যাকাউন্টের নাম অথবা পাসওয়ার্ড বৈধ নয়। অনুগ্রহ করে পুনরায় চেষ্টা করুন।"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "অবৈধ ব্যবহারকারী অ্যাকাউন্টের নাম অথবা পাসওয়ার্ড"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "ছোট (৬৪০ x ৪৮০ পিক্সেল)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "মাঝারি (১০২৪ x ৭৬৮ পিক্সেল)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "প্রস্তাবিত (১৬০০ x ১২০০ পিক্সেল)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "বড় (২০৪৮ পিক্সেল)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "প্রমিত মান ব্যবহার করা হবে: (_s)"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "স্বনির্ধারিত মাপ ব্যবহার করুন: (_u)"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ফটোর অ্যাস্পক্ট অনুপাত মেলানো হবে (_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "স্বয়ংক্রিয় মাপ:(_A)"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ছবির শিরোনাম প্রিন্ট করা হবে (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "চিহ্নিত স্থানে ফটোর আউটপুট করা হবে (_O)"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "পিক্সেল প্রতি ইঞ্চি"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "লেবেল"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "প্লাগ-ইন"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "বিলম্ব: (_D)"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "পরিবর্তনে ব্যবহৃত ইফেক্ট: (_T)"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "পরিবর্তনের বিলম্ব: (_e)"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "শিরোনাম প্রদর্শন (_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "সেকেন্ড"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "লগ-আউট করুন (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "প্রকাশ (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "ফটোর মাপ: (_s)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "পাসওয়ার্ড (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "পাসওয়ার্ড মনে রাখুন (_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "লগ-ইন করুন"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "স্বত্বাধিকার ২০১২ BJA ইলেকট্রোনিক্স"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "১২৮০ x ৮৫৩ পিক্সেল"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "OAuth অনুমতি অনুরোধের ক্ষেত্রে '%s' বৈধ প্রত্যুত্তর নয়"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "আপনার Tumblr অ্যাকাউন্টের ক্ষেত্রে প্রযোজ্য ব্যবহারকারীর নাম ও পাসওয়ার্ড লিখুন।"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI লোড করতে ব্যর্থ: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"%s পরিচয়ে আপনি Tumblr-এ লগ-ইন করেছেন\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "স্বত্বাধিকার ২০১০+ ইয়েভগেনি পোলয়াকোভ <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki ওয়েব-সাইট পরিদর্শন করুন"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "আপনি বর্তনমানে Yandex.Fotki-তে লগ-ইন করেননি।"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "ই-মেইল ঠিকানা (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"আপনি (name) পরিচয়ে Tumblr-এ লগ-ইন করেছেন।\n"
+"\n"
+"(এই লেবেলের মধ্যে উপস্থিত পংক্তিটির মধ্যে মান লিখে কোডের মধ্যে স্থাপন করা হবে। \n"
+"এর ফলে, এখানে করা পরিবর্তনগুলি প্রদর্শিত হবে না)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ব্লগ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "সংকলন (অথবা নতুন তৈরি করুন): (_A)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "অনুমতির ধরন: ( _t)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "মন্তব্য সংযোজন নিষ্ক্রিয়: (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "মূল ফটো ডাউনলোড করা নিষেধ করা হবে (_F)"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..41c0145
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,4599 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# jesjimher <jesjimenez@gmail.com>, 2012
+# jodufi <jodufi@gmail.com>, 2011, 2012
+# prottoman <marc@marcrafols.com>, 2013
+# verayin <vera@yorba.org>, 2011
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2012
+# jodufi <jodufi@gmail.com>, 2012
+# jodufi <jodufi@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Adolfo Jayme Barrientos <fitoschido@ubuntu.com>\n"
+"Language-Team: Catalan (http://www.transifex.com/projects/p/shotwell/"
+"language/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Esdeveniment %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Càmeres"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Càmera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"No s'ha pogut desmuntar la càmera. Intenteu desmuntar-la des del gestor de "
+"fitxers."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Amaga les fotografies que ja s'hagin importat"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Mostra només les fotografies que no s'hagin importat"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "S'està iniciant la importació, espereu..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Títols"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Mostra el títol de cada fotografia"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importa les _seleccionades"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importa les fotografies seleccionades a la biblioteca"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importa-les _totes"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importa totes les fotografies a la biblioteca"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Cal que el Shotwell desmunti la càmera del sistema de fitxers per poder-hi "
+"accedir. Voleu continuar?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmunta-la"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Desmunteu la càmera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Una altra aplicació està blocant la càmera. El Shotwell només pot accedir a "
+"la càmera si no està blocada. Tanqueu qualsevol altra aplicació que "
+"l'estigui utilitzant i torneu-ho a intentar."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Tanqueu qualsevol altra aplicació que estigui utilitzant la càmera."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"No es poden obtenir previsualitzacions de la càmera:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "S'està desmuntant..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "S'està recollint la informació de les fotografies"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "S'està recollint la previsualització de %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "No es pot blocar la càmera: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Voleu suprimir aquesta fotografia de la càmera?"
+msgstr[1] "Voleu suprimir aquestes %d fotografies de la càmera?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Voleu suprimir aquest vídeo de la càmera?"
+msgstr[1] "Voleu suprimir aquests %d vídeos de la càmera?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Voleu suprimir aquesta fotografia/vídeo de la càmera?"
+msgstr[1] "Voleu suprimir aquestes %d fotografies/vídeos de la càmera?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Voleu suprimir aquest fitxer de la càmera?"
+msgstr[1] "Voleu suprimir aquests %d fitxers de la càmera?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Manté"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "S'estan suprimint les fotografies/vídeos de la càmera"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"No s'ha pogut suprimir %d fotografia/vídeo de la càmera degut a errors."
+msgstr[1] ""
+"No s'han pogut suprimir %d fotografies/vídeos de la càmera degut a errors."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Presentació de diapositives"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Reprodueix una presentació de diapositives"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exporta la fotografia/vídeo"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exporta les fotografies/vídeos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exporta les fotografies"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exporta les fotografies"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "S'està girant"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "S'està desfent la rotació"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "S'està invertint horitzontalment"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "S'està desfent la inversió horitzontal"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "S'està invertint verticalment"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "S'està desfent la inversió verticalment"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Qualsevol text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Títol"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nom de l'esdeveniment"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nom del fitxer"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipus de suport"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Estat del senyalador"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Valoració"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "conté"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "és exactament"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "comença amb"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "acaba amb"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "no conté"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "no està establert"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "és"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "no és"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "qualsevol fotografia"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "una fotografia RAW"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "un vídeo"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "senyalat"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "sense senyalar"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "i superior"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "només"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "i inferior"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "està després"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "està abans"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "està entre"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "i"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "qualsevol"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "tots"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "cap"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Cerques desades"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"La biblioteca de fotografies no és compatible amb aquesta versió del "
+"Shotwell. Sembla que es va crear amb el Shotwell %s (esquema %d). Aquesta "
+"versió és la %s (esquema %d). Utilitzeu l'última versió del Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"El Shotwell no ha pogut actualitzar la biblioteca de fotografies de la "
+"versió %s (esquema %d) a la %s (esquema %d). Per obtenir més informació "
+"comproveu el Wiki del Shotwell a %s."
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"La biblioteca de fotografies no és compatible amb aquesta versió del "
+"Shotwell. Sembla que es va crear amb el Shotwell %s (esquema %d). Aquesta "
+"versió és la %s (esquema %d). Netegeu la biblioteca mitjançant la supressió "
+"de %s i torneu a importar les fotografies."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"S'ha produït un error desconegut en intentar verificar la base de dades del "
+"Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "S'està carregant el Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FITXER]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Executeu «%s --help» per veure una llista completa de les opcions "
+"disponibles de la línia d'ordres.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Avui"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ahir"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Títol:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elements:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d esdeveniment"
+msgstr[1] "%d esdeveniments"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "Una fotografia"
+msgstr[1] "%d fotografies"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vídeo"
+msgstr[1] "%d vídeos"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Des de:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "A:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Mida:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Durada:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segons"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Revelador:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Exposició:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Ubicació:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Mida del fitxer:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Mida original:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Fabricant de la càmera:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model de la càmera:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flaix:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Distància focal:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Desplaçament de l'exposició:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitud GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitud GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Programari:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informació ampliada"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Això suprimirà l'etiqueta «%s» d'una fotografia. Voleu continuar?"
+msgstr[1] "Això suprimirà l'etiqueta «%s» de %d fotografies. Voleu continuar?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancel·la"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Suprimeix"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Això suprimirà la cerca desada «%s». Voleu continuar?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exporta vídeos"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"El Shotwell no ha pogut crear un fitxer per editar aquesta fotografia perquè "
+"no teniu permís per escriure a %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"No s'ha pogut exportar la fotografia següent degut a un error en el fitxer.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Voleu continuar exportant?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinua"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Sense modificar"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actual"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualitat:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Constant d'e_scala:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _píxels"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exporta les metadades"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(i %d més)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "No s'ha importat una fotografia duplicada:\n"
+msgstr[1] "No s'han importat %d fotografies duplicades:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "No s'ha importat un vídeo duplicat:\n"
+msgstr[1] "No s'han importat %d vídeos duplicats:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "No s'ha importat una fotografia/vídeo duplicat:\n"
+msgstr[1] "No s'han importat %d fotografies/vídeos duplicats:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia degut a un error de fitxer o de "
+"maquinari:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies degut a un error de fitxer o de "
+"maquinari:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'un vídeo degut a un error de fitxer o de "
+"maquinari:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d vídeos degut a un error de fitxer o de "
+"maquinari:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia/vídeo degut a un error de fitxer o "
+"de maquinari:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies/vídeos degut a un error de fitxer "
+"o de maquinari:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'un fitxer degut a un error de fitxer o de "
+"maquinari:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fitxers degut a un error de fitxer o de "
+"maquinari:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia perquè no es pot escriure a la "
+"carpeta de la biblioteca de fotografies:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies perquè no es pot escriure a la "
+"carpeta de la biblioteca de fotografies:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ha fallat la importació d'un vídeo perquè no es pot escriure a la carpeta de "
+"la biblioteca de fotografies:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d vídeos perquè no es pot escriure a la carpeta "
+"de la biblioteca de fotografies:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia/vídeo perquè no es pot escriure a "
+"la carpeta de la biblioteca de fotografies:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies/vídeos perquè no es pot escriure a "
+"la carpeta de la biblioteca de fotografies:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ha fallat la importació d'un fitxer perquè no es pot escriure a la carpeta "
+"de la biblioteca de fotografies:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fitxers perquè no es pot escriure a la carpeta "
+"de la biblioteca de fotografies:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia degut a un error de la càmera:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies degut a un error de la càmera:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Ha fallat la importació d'un vídeo degut a un error de la càmera:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d vídeos degut a un error de la càmera:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'una fotografia/vídeo degut a un error de la "
+"càmera:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fotografies/vídeos degut a un error de la "
+"càmera:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ha fallat la importació d'un fitxer degut a un error de la càmera:\n"
+msgstr[1] ""
+"Ha fallat la importació de %d fitxers degut a un error de la càmera:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "S'ha omès una fotografia no compatible:\n"
+msgstr[1] "S'han omès %d fotografies no compatibles:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "S'ha omès un fitxer que no era d'imatge:\n"
+msgstr[1] "S'han omès %d fitxers que no eren d'imatge:\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "S'ha omès una fotografia degut a la cancel·lació de l'usuari:\n"
+msgstr[1] "S'han omès %d fotografies degut a la cancel·lació de l'usuari:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "S'ha omès un vídeo degut a la cancel·lació de l'usuari:\n"
+msgstr[1] "S'han omès %d vídeos degut a la cancel·lació de l'usuari:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"S'ha omès una fotografia/vídeo degut a la cancel·lació de l'usuari:\n"
+msgstr[1] ""
+"S'han omès %d fotografies/vídeos degut a la cancel·lació de l'usuari:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "S'ha omès un fitxer degut a la cancel·lació de l'usuari:\n"
+msgstr[1] "S'han omès %d fitxers degut a la cancel·lació de l'usuari:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "S'ha importat una fotografia correctament.\n"
+msgstr[1] "S'han importat %d fotografies correctament.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "S'ha importat un vídeo correctament.\n"
+msgstr[1] "S'han importat %d vídeos correctament.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "S'ha importat una fotografia/vídeo correctament.\n"
+msgstr[1] "S'han importat %d fotografies/vídeos correctament.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "No s'ha importat cap vídeo o fotografia.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "S'ha completat la importació"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segon"
+msgstr[1] "%d segons"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minuts"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d hores"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dia"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Canvia el nom de l'esdeveniment"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nom:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Edita el títol"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Envia el fitxer a la paperera"
+msgstr[1] "_Envia els fitxers a la paperera"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Suprimeix només"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Voleu revertir l'edició externa?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Voleu revertir les edicions externes?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Això suprimirà tots els canvis fets al fitxer extern. Voleu continuar?"
+msgstr[1] ""
+"Això suprimirà tots els canvis fets als %d fitxers externs. Voleu continuar?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Reverteix l'edició externa"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Reverteix les edicions externes"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Això suprimirà la fotografia de la biblioteca. Voleu continuar?"
+msgstr[1] "Això suprimirà %d fotografies de la biblioteca. Voleu continuar?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Suprimeix"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Suprimeix la fotografia de la biblioteca"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Suprimeix les fotografies de la biblioteca"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 h"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Desplaça les fotografies/vídeos amb la mateixa quantitat"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Estableix _totes les fotografies/vídeos a aquesta hora"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modificar el fitxer d'imatge original"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modificar els fitxers d'imatges originals"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modifica el fitxer original"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifica els fitxers originals"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El temps d'exposició es desplaçarà cap endavant per\n"
+"%d %s, %d %s, %d %s i %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El temps d'exposició es desplaçarà cap enrere per\n"
+"%d %s, %d %s, %d %s i %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dies"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "hores"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuts"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segon"
+msgstr[1] "segons"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"I una altra."
+msgstr[1] ""
+"\n"
+"\n"
+"I %d altres."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetes (separades per comes):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Us donem la benvinguda"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Us donem la benvinguda al Shotwell"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Per començar, podeu importar fotografies de qualsevol de les maneres "
+"següents:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Trieu <span weight=\"bold\">Fitxer %s Importa des d'una carpeta</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arrossegueu i deixeu anar fotografies a la finestra del Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Connecteu una càmera al vostre ordinador i importeu-ne les fotografies"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importa les fotografies de la carpeta %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "També podeu importar fotografies de qualsevol d'aquestes maneres:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_No tornis a mostrar aquest missatge"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importa fotografies de la biblioteca %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(ajuda)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Any%sMes%sDia"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Any%sMes"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Any%sMes-Dia"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Any-Mes-Dia"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalitzat"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Patró no vàlid"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"El Shotwell pot copiar les fotografies a la carpeta de la biblioteca o les "
+"pot importar sense copiar-les."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_pia les fotografies"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importa-les a la ubicació"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importa a la biblioteca"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Suprimeix de la biblioteca"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "S'està suprimint la fotografia de la biblioteca"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "S'estan suprimint les fotografies de la biblioteca"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Això suprimirà la fotografia/vídeo de la biblioteca del Shotwell. Voleu "
+"moure el fitxer a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+msgstr[1] ""
+"Això suprimirà %d fotografies/vídeos de la biblioteca del Shotwell. Voleu "
+"moure els fitxers a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Això suprimirà el vídeo de la biblioteca del Shotwell. Voleu moure el fitxer "
+"a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+msgstr[1] ""
+"Això suprimirà %d vídeos de la biblioteca del Shotwell. Voleu moure els "
+"fitxers a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Això suprimirà la fotografia de la biblioteca del Shotwell. Voleu moure el "
+"fitxer a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+msgstr[1] ""
+"Això suprimirà %d fotografies de la biblioteca del Shotwell. Voleu moure els "
+"fitxers a la paperera de l'escriptori?\n"
+"\n"
+"Aquesta acció no es pot desfer."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"La fotografia o el vídeo no es pot moure a la paperera de l'escriptori. "
+"Voleu suprimir aquest fitxer?"
+msgstr[1] ""
+"%d fotografies/vídeos no es poden moure a la paperera de l'escriptori. Voleu "
+"suprimir aquests fitxers?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "La fotografia o vídeo no es pot suprimir."
+msgstr[1] "%d fotografies/vídeos no es poden suprimir."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetes"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Correcte"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "S'ha produït un error de fitxer"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "No s'ha pogut descodificar el fitxer"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "S'ha produït un error de la base de dades"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "L'usuari ha interromput la importació"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "No és un fitxer"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "El fitxer ja existeix a la base de dades"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "El format de fitxer no és compatible"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "No és un fitxer d'imatge"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Ha fallat el disc"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "El disc està ple"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "S'ha produït un error a la càmera"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "S'ha produït un error en escriure el fitxer"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Ha fallat la importació (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificat"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Fotografia anterior"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Fotografia següent"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Manca el fitxer font de la fotografia: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Visualitza"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Ei_nes"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Fotografia an_terior"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Fotografia anterior"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Fotografia _següent"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Fotografia següent"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Amplia"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Incrementa l'ampliació de la fotografia"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Redueix"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Redueix l'ampliació de la fotografia"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Ajusta a l'amplada de la _pàgina"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Amplia la fotografia per ajustar-la a la pantalla"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Ampliació _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Amplia la fotografia al 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Ampliació _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Amplia la fotografia al 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Desenvolupador"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "No s'ha pogut exportar %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de dades %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "No pot continuar la importació des de %s perquè s'ha produït un error:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Intenteu importar des d'un altre servei, seleccioneu-ne un del menú següent."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Dades de les importacions"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"No teniu cap connector d'importació de dades activat.\n"
+"\n"
+"Per poder utilitzar la funcionalitat d'importació des d'una aplicació, heu "
+"de tenir com a mínim un connector d'importació de dades habilitat. Podeu "
+"habilitar els connectors al diàleg de preferències."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Fitxer de base de dades:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importa"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importa des de l'aplicació"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importar mitjans _de:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Tanca"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Paràmetres"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Projecció de diapositives"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Enrere"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Vés a la fotografia anterior"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Fes una pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Fes una pausa a la presentació de diapositives"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Següent"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Vés a la fotografia següent"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Canvia els paràmetres de la presentació de diapositives"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Manquen tots els fitxers d'origen de les fotografies."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reprodueix"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continua la presentació de diapositives"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "S'està revertint"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "S'està desfent la reversió"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "S'està millorant"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "S'està desfent la millora"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "S'està creant un esdeveniment nou"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "S'està suprimint l'esdeveniment"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "S'estan movent les fotografies a l'esdeveniment nou"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "S'estan establint les fotografies a l'esdeveniment anterior"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "S'està combinant"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "S'està desfent la combinació"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "S'estan duplicant les fotografies"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "S'estan suprimint les fotografies duplicades"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "No s'ha pogut duplicar una fotografia degut a un error en el fitxer"
+msgstr[1] ""
+"No s'han pogut duplicar %d fotografies degut a errors en els fitxers"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "S'està restaurant la valoració anterior"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "S'estan incrementant les puntuacions"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "S'estan reduint les puntuacions"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "S'està establint el revelador RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "S'està restaurant el revelador RAW anterior"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Estableix el desenvolupador"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "La fotografia original no s'ha pogut ajustar."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "S'està ajustant la data i l'hora"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "S'està desfent l'ajustament de la data i l'hora"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "La fotografia original no s'ha pogut ajustar."
+msgstr[1] "Les fotografies originals no s'han pogut ajustar."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "S'ha produït un error en ajustar l'hora"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"L'ajustament de l'hora no s'ha pogut desfer en el fitxer de fotografia "
+"següent."
+msgstr[1] ""
+"Els ajustaments de l'hora no s'han pogut desfer en els fitxers de "
+"fotografies següents."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Crea un etiqueta"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mou l'etiqueta «%s»"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mou les fotografies a la paperera"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaura les fotografies de la paperera"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mou les fotografies a la paperera del Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaura les fotografies cap a la biblioteca del Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "S'estan movent les fotografies a la paperera"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "S'estan restaurant les fotografies de la paperera"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Senyala les fotografies seleccionades"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Treu el senyalador a les fotografies seleccionades"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Senyala"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Treu el senyalador"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baixa (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Mitjana (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alta (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Màxima (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Cap fotografia/vídeo"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "No s'ha trobat cap fotografia/vídeo"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "No es poden exportar fotografies a aquest directori."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "No s'han pogut processar les actualitzacions de seguiment: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Omple tota la pàgina"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imatges per pàgina"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imatges per pàgina"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imatges per pàgina"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imatges per pàgina"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 imatges per pàgina"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imatges per pàgina"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "polzades"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Cartera (2 x 3 polzades)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Targeta (3 x 5 polzades)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 polzades"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 polzades"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 polzades"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 polzades"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 polzades"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Cartera en sistema mètric (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postal (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Paràmetres de la imatge"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "S'està imprimint..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"No s'ha pogut imprimir la fotografia:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"No s'ha pogut obrir o crear la base de dades de fotografies %s: codi d'error "
+"%d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"No s'ha pogut escriure al fitxer de la base de dades de fotografies:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"S'ha produït un error en accedir al fitxer de la base de dades:\n"
+" %s\n"
+"\n"
+"L'error ha estat: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exporta vídeos"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "No s'ha pogut executar el Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Envia a"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "No s'ha pogut exportar el fons a %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+"No s'ha pogut preparar la presentació de diapositives de l'escriptori: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Senyalat"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Paperera"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "La paperera està buida"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Suprimeix"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "S'estan suprimint les fotografies"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Manquen fitxers"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "S'està suprimint..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Darrera importació"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importa des d'una carpeta..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importa fotografies des del disc a la biblioteca"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importa des de l'_aplicació..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordena els es_deveniments"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Buida la _paperera"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Suprimeix totes les fotografies de la paperera"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Visualitza l'_esdeveniment de la fotografia"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Cerca"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Cerca fotografies i vídeos per criteri de cerca"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fitxer"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Edita"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotografia"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografies"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "E_sdeveniments"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Eti_quetes"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "A_juda"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informació _bàsica"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Mostra informació bàsica sobre la selecció"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informació am_pliada"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Mostra informació ampliada sobre la selecció"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Barra de _cerca"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Mostra la barra de cerca"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Ascendent"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Ordena les fotografies en ordre ascendent"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escendent"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Ordena les fotografies en ordre descendent"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importa des d'una carpeta"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Buida la paperera"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "S'està buidant la paperera..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"El Shotwell està configurat per importar fotografies a la vostra carpeta "
+"d'usuari.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Ubicació de la biblioteca"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "No es poden importar fotografies des d'aquest directori."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "S'està actualitzant la biblioteca..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "S'està preparant la importació automàtica de fotografies..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "S'estan important automàticament les fotografies..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "S'estan escrivint les metadades als fitxers..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Biblioteca"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "S'està important..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "A_tura la importació"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Atura la importació de fotografies"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "S'està preparant per importar..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "S'ha importat %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "De_sa"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Desa la fotografia"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Anomena i _desa..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Desa la fotografia amb un nom diferent"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprimeix la fotografia a una impressora connectada a l'ordinador"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "No existeix %s."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s no és un fitxer."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s no és compatible amb el format de fitxer de\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "De_sa'n una còpia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Voleu descartar els canvis a %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Tanca _sense desar"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "S'ha produït un error en desar a %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Anomena i desa"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "No s'ha pogut fer un seguiment de %s: no és un directori (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Gestor fotogràfic"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visualitzador fotogràfic"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Gi_ra a la dreta"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Gira"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Gira a la dreta"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Gira les fotografies cap a la dreta (premeu Ctrl per girar cap a l'esquerra)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Gira a _l'esquerra"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Gira a l'esquerra"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Gira les fotografies cap a l'esquerra"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Inverteix horit_zontalment"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Inverteix horitzontalment"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Inverteix verti_calment"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Inverteix verticalment"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Millora"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Millora"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Millora automàticament l'aparença de la fotografia"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Es_capça"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Escapça"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Escapça la mida de la fotografia"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Adreça"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Adreça"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Adreça la fotografia"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Ulls vermells"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Ulls vermells"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Redueix o suprimeix qualsevol efecte d'ulls vermells a la fotografia"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ajusta"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ajusta"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ajusta el color i el to de la fotografia"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Reverteix a l'original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Reverteix a l'original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Reverteix les edicions e_xternes"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Reverteix a la fotografia mestra"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Estableix com a fons d'_escriptori"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Estableix la imatge seleccionada com a fons de l'escriptori"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Estableix com a presentació de _diapositives de l'escriptori..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Desfés"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Desfés"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refés"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Refés"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Can_via el nom de l'esdeveniment..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Fes-la la fotografia _principal de l'esdeveniment"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Fes-la la fotografia principal de l'esdeveniment"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Esdeveniment _nou"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Esdeveniment nou"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mou les fotografies"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mou les fotografies cap a un esdeveniment"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Combina els esdeveniments"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Combina"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combinar events en un únic event"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Estableix la puntuació"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Estableix la puntuació"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Canvia la puntuació de la fotografia"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Incrementa"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Incrementa la puntuació"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Redueix"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Redueix la puntuació"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Sense puntuació"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sense puntuació"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Puntua les fotografies sense puntuació"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "S'està establint com sense puntuació"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Suprimeix totes les puntuacions"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rebutjada"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rebutjada"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Puntua com a rebutjada"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "S'està establint com a rebutjada"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Estableix la puntuació com a rebutjada"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Només les _rebutjades"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Només les rebutjades"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Mostra només les fotografies rebutjades"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Totes més les _rebutjades"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Mostra totes les fotografies, incloses les rebutjades"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Totes les fotografies"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Mostra totes les fotografies"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Puntuacions"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Mostra la puntuació de cada fotografia"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtra les fotografies"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtra les fotografies"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limita el nombre de fotografies mostrades basant-se en un filtre"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplica"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplica"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Fes un duplicat de la fotografia"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exporta..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Imprimeix..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blica..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publica"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publica a diversos llocs web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Edita el _títol..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Ajusta la data i l'hora..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ajusta la data i l'hora"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Afegeix e_tiquetes..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Afegir etiquetes..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Afegeix etiquetes"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "Preferè_ncies"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Obre amb un editor e_xtern"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Obre amb un editor d'imatges RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Envia _a..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Enviar _a..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Cerca..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Cerca"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Cerqueu una imatge escrivint text que aparegui en el seu nom o les seves "
+"etiquetes"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Senyala"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Treu el senyalador"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "No s'ha pogut executar l'editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Afegeix l'etiqueta «%s»"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Afegeix les etiquetes «%s» i «%s»"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Suprimeix l'etiqueta «%s»"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Suprimeix l'etiqueta «%s»"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Suprimeix l'etiqueta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nova"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Can_via el nom de l'etiqueta «%s»..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Canvia el nom de l'etiqueta «%s» a «%s»"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Canvia el nom..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modi_fica les etiquetes..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modifica les etiquetes"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etiqueta la fotografia com a «%s»"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etiqueta les fotografies com a «%s»"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etiqueta la fotografia seleccionada com a «%s»"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etiqueta les fotografies seleccionades com a «%s»"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Suprimeix l'etiqueta «%s» de la _fotografia"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Suprimeix l'etiqueta «%s» de les _fotografies"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Suprimeix l'etiqueta «%s» de la fotografia"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Suprimeix l'etiqueta «%s» de les fotografies"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"No s'ha pogut canviar el nom de l'etiqueta a «%s» perquè l'etiqueta ja "
+"existeix."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"No s'ha pogut canviar el nom de la cerca a «%s» perquè aquesta ja existeix."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Cerca desada"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Suprimeix la cerca"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Edita..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Ca_nvia el nom..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Canvia el nom de la cerca «%s» a «%s»"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Suprimeix la cerca «%s»"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Puntua com a %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Estableix la puntuació a %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "S'està establint la puntuació a %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Mostra %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Mostra només les fotografies amb una puntuació de %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s o millor"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Mostra només les de %s o millors"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Mostra només les fotografies amb una puntuació de %s o millor"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Suprimeix les fotografies seleccionades de la paperera"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Suprimeix les fotografies seleccionades de la biblioteca"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaura"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Torna les fotografies seleccionades a la biblioteca"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Mostra al nave_gador de fitxers"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Obre el directori de la fotografia seleccionada al gestor de fitxers"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "No s'ha pogut obrir en el gestor de fitxers: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Suprimeix de la biblioteca"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mou a la paperera"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Selecciona-ho _tot"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Selecciona tots els elements"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a, %l de %b de %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a, %l de %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%l de %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Angle:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Reinicia"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Torna a la mida actual de la fotografia"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Estableix l'escapçament d'aquesta fotografia"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Pivota el rectangle d'escapçament entre les orientacions vertical i apaïsada"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Sense límits"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Quadrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Pantalla"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Mida original"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Vídeo SD (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Vídeo HD (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Tanca l'eina d'ulls vermells"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Suprimeix tots els efectes d'ulls vermells de la regió seleccionada"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturació:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tint:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Ombres:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Reinicialitza els colors"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Reinicialitza tots els ajustaments de color a l'original"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tint"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturació"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Exposició"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Ombres"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Expansió del contrast"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Mantén la barra d'eines"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Mantén la barra d'eines oberta"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Surt de la pantalla completa"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Surt de la _pantalla completa"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Surt"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Quant a"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Pantalla completa"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "C_ontingut"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Preguntes més freqüents"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Reportar problema..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"S'ha produït un error fatal en accedir a la biblioteca del Shotwell. El "
+"Shotwell no pot continuar.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Vés al lloc web d'en Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Credits de traducció"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "No s'ha pogut mostrar l'ajuda: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Incapaç de navegar per un bug a la base de dades: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "No s'han pogut mostrar les PMF: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "sense títol"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Mida original"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Amplada o alçada"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Amplada"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Alçada"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Ajusta la mida de les miniatures"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Augmenta la mida de les miniatures"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Redueix la mida de les miniatures"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordena les _fotografies"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Reprodueix el vídeo"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Obre els vídeos seleccionats en el reproductor de vídeo del sistema"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Mostra les etiquetes de cada fotografia"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Per _títol"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordena les fotografies per títol"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Per _data d'exposició"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordena les fotografies per data d'exposició"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Per _puntuació"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordena les fotografies per puntuació"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"El Shotwell no ha pogut reproduir el vídeo seleccionat:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotografia/vídeo"
+msgstr[1] "%d fotografies/vídeos"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Sense esdeveniments"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "No s'han trobat esdeveniments"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Esdeveniments"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Sense data"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Cap esdeveniment"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Imposible crear el directori de caché %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "No s'ha pogut crear el directori de dades %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Imatges"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "No s'ha pogut crear el directori temporal %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "No s'ha pogut crear el subdirectori de dades %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Cap)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Cap"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transicions de la presentació de diapositives"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "No s'ha pogut generar un fitxer temporal per a %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "S'està exportant"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Ja existeix el fitxer %s. Voleu reemplaçar-lo?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Omet-lo"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Reemplaça'l"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Reempl_aça'ls tots"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exporta"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografies"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vídeos"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotografies RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotografies RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+"S'ha produït un error en carregar el fitxer d'interfície d'usuari %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipus"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "S'està publicant"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "S'han publicat correctament les fotografies/vídeos seleccionats."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "S'han publicat correctament els vídeos seleccionats."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "S'han publicat correctament les fotografies seleccionades."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "S'ha publicat correctament el vídeo seleccionat."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "S'ha publicat correctament la fotografia seleccionada."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "S'està recollint la informació del compte..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "S'està entrant..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publica les fotografies"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publica les fotografies _a:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publica vídeos"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publica vídeos _a:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publica fotografies i vídeos"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publica fotografies i vídeos _a"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "No s'ha pogut publicar"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"El Shotwell no pot publicar els elements seleccionats perquè no teniu un "
+"connector de publicació compatible habilitat. Per corregir-ho, trieu "
+"<b>Edita les preferències de %s</b> i habiliteu un o més dels connectors de "
+"publicació a la pestanya <b>Connectors</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "S'està preparant per pujar"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "S'està pujant %d de %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "La publicació a %s no pot continuar perquè s'ha produït un error:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Si voleu intentar publicar les fotografies a un altre servei, seleccioneu-ne "
+"un del menú de sobre."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "_Etiqueta nova..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "No està disponible un fitxer temporal que cal per publicar"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Actualment no esteu connectat al YouTube.\n"
+"\n"
+"Per continuar heu de tenir un compte al Google i configurar-lo per poder "
+"utilitzar-lo amb el YoutTube. Podeu configurar la majoria de comtes "
+"utilitzant el navegador i entrant almenys un cop al lloc YouTube."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Actualment esteu connectat al YouTube com a %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Els vídeos apareixeran a «%s»"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Llistat públicament"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Sense llistar públicament"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Serveis de publicació principals"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Actualment no esteu connectat al Flickr.\n"
+"\n"
+"Feu clic a connecta per connectar-vos al Flickr en el navegador web. Haureu "
+"d'autoritzar al Shotwell Connect per enllaçar el vostre compte del Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ja us heu connectat i desconnectat al Flickr en aquesta sessió del "
+"Shotwell.\n"
+"Per continuar publicant al Flickr, sortiu, reinicieu el Shotwell i torneu a "
+"intentar-ho."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "S'està preparant per connectar..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "S'està verificant l'autorització..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Heu entrat al Flickr com a %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"El vostre compte gratuït del Flickr restringeix la quantitat de dades que "
+"podeu pujar cada mes.\n"
+"Aquest mes, us queden %d megabytes de quota de pujada."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "El vostre compte del Flickr Pro us permet pujades il·limitades."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Les fotografies són _visibles per:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Els vídeos són _visibles per:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Les fotografies i els vídeos són _visibles per:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Tothom"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Només els amics i la família"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Només família"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Només amics"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Només jo"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 × 375 píxels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 × 768 píxels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 píxels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 píxels"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Creant àlbum %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Adreça incorrecta"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Nom d'usuari o contrasenya incorrectes"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Un fitxer necessari per la publicació no està disponible. No es pot dur a "
+"terme la publicació cap a Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "S'està creant l'àlbum..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Heu entrant als àlbums web del Picasa com a %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Els vídeos apareixeran a:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Les fotografies apareixeran a:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Petita (640 x 480 píxels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mitjana (1024 x 768 píxels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomanada (1600 x 1200 píxels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Actualment no esteu connectat al Facebook.\n"
+"\n"
+"Si encara no teniu un compte al Facebook, podeu crear-ne un durant el procés "
+"de connexió. Durant la connexió, el Shotwell Connect pot ser que us demani "
+"permís per pujar fotografies i publicar-les al mur. Aquests permisos són "
+"necessaris perquè el Shotwell Connect funcioni."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ja us heu connectat i desconnectat al Facebook en aquesta sessió del "
+"Shotwell.\n"
+"Per continuar publicant al Facebook, sortiu, reinicieu el Shotwell i torneu "
+"a intentar-ho."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Estàndard (720 píxels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Gran (2048 píxels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "S'està comprovant la connexió amb el Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Actualment esteu connectat al Facebook com a %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "On us agradaria publicar les fotografies seleccionades?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Mida de _pujada:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Esmicolament"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transicions principals de la projecció de diapositives"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapositiva"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Esvaïment"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Benvingut al servei d'importació de biblioteques de F-Spot\n"
+"\n"
+"Per favor triau una biblioteca a importar, ja sigui triant una de les "
+"biblioteques trobades per Shotwell o bé seleccionant un fitxer de biblioteca "
+"F-Spot alternatiu."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Benvingut al servei d'importació de biblioteques de F-Spot.\n"
+"\n"
+"Per favir seleccionau un fitxer de biblioteca F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Seleccionar manualment un fitxer de biblioteca F-Spot a importar:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"No es pot obrir el fitxer de base de dades F-Spot seleccionat: el fitxer no "
+"existeix o no és una base de dades F-Spot correcta"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"No es pot obrir el fitxer de base de dades F-Spot seleccionat: Shotwell no "
+"suporta aquesta versió de F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"No es pot llegir el fitxer de base de dades F-Spot seleccionat: error "
+"llegint taula d'etiquetes"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"No es pot llegir el fitxer de base de dades F-Spot seleccionat: error "
+"llegint taula d'imatges"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell ha trobat %d imatges dins la biblioteca F-Spot i les està "
+"important. Els duplicats seran automàticament detectats i eliminats.\n"
+"\n"
+"Podeu tancar aquest diàleg i començar a emprar Shotwell mentres la "
+"importació té lloc en segon pla."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Biblioteca F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparant per importar"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Estableix coma a presentació de diapositives de l'escriptori"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Genera la presentació de diapositives del fons de l'escriptori"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Mostra cada fotografia durant"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "període de temps"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Quan de temps es mostra cada fotografia en el fons de l'escriptori"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Cerca"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Nom de la cerca:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Coincideix"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "amb el següent:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Utilitza una mida es_tàndard:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Utilitza una mida _personalitzada:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Coincideix la relació d'aspecte de la fotografia"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "Mida _automàtica:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Imprimeix el _títol de la imatge"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Imprimeix la fotografia en:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "píxels per polzada"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiqueta"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Preferències del Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "blanc"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "negre"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Vigila si hi ha fitxers nous al directori de la biblioteca"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadades"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Escrius etiquetes, títols i altres _metadades als fitxers de fotografies"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Mostra"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importa fotografies a:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Fons:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "S'està important"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Estructura dels directoris:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Patró:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Exemple:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "_Canvia el nom dels fitxers importats a minúscules"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Revelador RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Per de_fecte:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Editor fotogràfic e_xtern:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Editor extern d'imatges _RAW:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Editors externs"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Connectors"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Retard:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Efecte de _transició:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "R_etard de transició:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Mostrar t_ítol"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "segons"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Connecta"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Public_a a un àlbum existent:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Crea un àlbum _nou anomenat:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Els vídeos i els àlbums de fotografies nous són _visibles per a:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Surt"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publica"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Introduïu el número de confirmació que apareix després que us connecteu al "
+"Flickr en el navegador web."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Número d'autorització:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Mida de la fotografia:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Un àlbum e_xistent:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Un àlbum _nou anomenat:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Llista l'àlbum en una galeria pública"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Mida p_redeterminada de les fotografies:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL de la biblioteca de fotografies Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Nom d'usuari"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Contrasenya"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Recorda la contrasenya"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Entra"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Una categoria _existent:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Les fotografies seran _visibles per a:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Mida de la fotografia:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Surt"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "_Paràmetres de la privacitat dels vídeos:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 píxels"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Vés al lloc web d'en Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Actualment no esteu connectat al Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "À_lbums (o escriviu-ne un de nou):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tipus d'accés:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Inhabilita els _comentaris"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Prohibeix baixar la fotografia original"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..7f1eb22
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,4757 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+# Translators:
+# jui <appukonrad@gmail.com>, 2012
+# David Štancl <dstancl@gmail.com>, 2011, 2012
+# David Štancl <dstancl@gmail.com>, 2011
+# Lukáš Zapletal, 2011
+# petr.simacek <petr.simacek@gmail.com>, 2012
+# petr.simacek <petr.simacek@gmail.com>, 2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Marek Černocký <marek@manet.cz>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-03-04 22:34+0000\n"
+"PO-Revision-Date: 2014-03-06 12:28+0100\n"
+"Last-Translator: Marek Černocký <marek@manet.cz>\n"
+"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Dočasný soubor potřebný pro zveřejnění není k dispozici"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"V průběhu práce s aplikací Shotwell jste již byli přihlášeni a odhlášeni od "
+"služby Google.\n"
+"\n"
+"Pro pokračování ve zveřejňování na službě Google ukončete a opět spusťte "
+"Shotwell a pak zkuste zveřejnění znovu."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:688
+msgid "Visit the Yorba web site"
+msgstr "Navštivte webové stránky Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:691
+msgid "translator-credits"
+msgstr ""
+"David Štancl <dstancl@dstancl.cz>\n"
+"Blonďák <blondak@neser.cz>\n"
+"Lukáš Zapletal <lzap@seznam.cz>\n"
+"Petr Šimáček <petr.simacek@gmail.com>\n"
+"Marek Černocký <marek@manet.cz>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2009 – 2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Vítejte ve službě sloužící k importu knihoven z aplikace F-Spot. \n"
+"\n"
+"Vyberte prosím knihovnu pro import, a to buď výběrem jedné ze stávajících "
+"knihoven nalezených aplikací Shotwell nebo výběrem souboru s alternativní "
+"databází F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Vítejte ve službě pro import knihoven z aplikace F-Spot. \n"
+"\n"
+"Vyberte prosím soubor s databází F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Ručně vybrat soubor s databází F-Spot k importu:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nelze otevřít vybraný soubor s databází F-Spot: soubor neexistuje nebo se "
+"nejedná o databázi F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nelze otevřít vybraný soubor s databází F-Spot: tato verze databáze F-Spot "
+"není v aplikaci Shotwell podporována"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nelze číst vybraný soubor s databází F-Spot: chyba při čtení tabulky se "
+"štítky"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nelze číst vybraný soubor s databází F-Spot: chyba při čtení tabulky s "
+"fotografiemi"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell našel %d fotek v knihovně F-Spot a momentálne je importuje. "
+"Duplikáty budou automaticky zjištěny a vynechány.\n"
+"\n"
+"Můžete zavřít toto okno a začít používat aplikaci Shotwell, zatím co import "
+"bude probíhat na pozadí."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Knihovna F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Připravuje se k importu"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Hlavní služby importu dat"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 × 375 pixelů"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 × 768 pixelů"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 pixelů"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "„%s“ není platná odpověď na požadavek ověření OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start (): Nelze spustit a tuto zveřejňovací službu nelze "
+"restartovat."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Zadejte uživatelské jméno a heslo ke svému účtu Tumblr."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "Neplatné uživatelské jméno a/nebo heslo. Zkuste to prosím znovu"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Neplatné uživatelské jméno nebo heslo"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nelze načíst uživatelské rozhraní: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Jste přihlášeni k Tumblr jako %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Navštivte webové stránky Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Momentálně nejste k Yandex.Fotki přihlášeni."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Doplňkové zveřejňovací služby Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "štítek"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_E-mailová adresa"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Heslo"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Přihlásit"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogy:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Veliko_st fotografie:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Odhlásit"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Zveřejnit"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Alba (nebo napište nové):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "_Typ přístupu:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Zakázat _komentáře"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "Ne_dovolit stahovat originální fotografii"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Veřejné"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Přátelé"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Soukromé"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Připojení Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Momentálně nejste k Facebooku přihlášeni.\n"
+"\n"
+"Jestliže ještě nemáte vytvořen na Facebooku účet, můžete si jej vytvořit "
+"během přihlašování. Během přihlašování se může zobrazit žádost o povolení k "
+"nahrávání fotografií a jejich zveřejnění v kanále. Povolení je pro připojení "
+"aplikace Shotwell nutné."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"V průběhu práce s aplikací Shotwell jste již byli přihlášeni a odhlášeni od "
+"Facebooku.\n"
+"Pro pokračování ve zveřejňování na Facebooku ukončete a opět spusťte "
+"Shotwell a pak zkuste zveřejnění znovu."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standardní (720 pixelů)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Velké (2048 pixelů)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testuje se připojení k Facebooku…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Vytváří se album…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Soubor potřebný pro zveřejnění není k dispozici. Zveřejnění na Facebook "
+"nemůže pokračovat."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Jste přihlášeni k Facebooku jako %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kde chcete vybrané fotografie zveřejnit?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "Nahrávaná veliko_st:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "mě výhradně"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "všem"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Momentálně nejste ke službě Flickr přihlášeni.\n"
+"\n"
+"Pro přihlášení ke službě Flickr klikněte na Přihlásit se ve webovém "
+"prohlížeči. Pak musíte ve svém účtu Flickr povolit přístup pro Shotwell "
+"Connect."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Již jste se přihlásili a odhlásili během tohoto sezení programu Shotwell.\n"
+"Abyste mohli fotky zveřejnit na Flickr, ukončete a znovu spusťte Shotwell a "
+"zkuste zveřejnění znovu."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Připravuje se přihlášení…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Soubor potřebný pro zveřejnění není k dispozici. Zveřejnění na Flickr nemůže "
+"pokračovat."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Ověřuje se autorizace…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Jste přihlášeni ke službě Flickr jako %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Váš bezplatný účet Flickr má omezení na množství nahraných dat za měsíc.\n"
+"Tento měsíc vám z přidělené kvóty zbývá %d megabajtů."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Účet Flickr Pro umožňuje nahrávat neomezeně."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotky _viditelné pro:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videa _viditelná pro:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotky a videa _viditelná pro:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "přátele a rodinu výhradně"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "rodinu výhradně"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "přátele výhradně"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 × 1536 pixelů"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 × 3072 pixelů"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Původní velikost"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Nejste přihlášeni ke službě Picasa Web Albums.\n"
+"\n"
+"Pro přihlášení k webovým albům Picasa klikněte na Přihlásit se ve webovém "
+"prohlížeči. Pak musíte ve svém účtu Picasa Web Albums povolit přístup pro "
+"Shotwell Connect."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Soubor potřebný pro zveřejnění není k dispozici. Zveřejnění na Picasa nemůže "
+"pokračovat."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Jste přihlášeni ke službě Picasa Web Albums jako %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videa se objeví:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Fotky se objeví:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "malá (640 × 480 pixelů)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "střední (1024 × 768 pixelů)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "doporučená (1600 × 1200 pixelů)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 × 1536 pixelů)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Původní velikost"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Vytváří se album %s…"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Při zveřejňování na Piwigo došlo k chybě. Zkuste to prosím znovu."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Zadejte adresu URL fotoknihovny Piwigo a k tomu uživatelské jméno a heslo "
+"spojené s vaším účtem Piwigo pro danou knihovnu."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell se nemůže připojit k vaší fotoknihovně Piwigo. Ověřte prosím adresu "
+"URL, kterou jste zadali"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Neplatná adresa URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administrátoři, rodina, přátelé, kontakty"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administrátoři, rodina, přátelé"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administrátoři, rodina"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administrátoři"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Nejste přihlášeni ke službě YouTube.\n"
+"\n"
+"Aby bylo možné pokračovat, musíte být přihlášeni k účtu Google a mít jej "
+"nastavený pro používání s YouTube. Ve svém webovém prohlížeči můžete "
+"nastavit většinu účtů, aby se přihlašovaly ke službě YouTube naráz."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Soubor potřebný pro zveřejnění není k dispozici. Zveřejnění na Youtube "
+"nemůže pokračovat."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Jste přihlášeni ke službě YouTube jako %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videa se objeví v „%s“"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Veřejné"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Neveřejné"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Zveřejnit ve stáva_jícím albu:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Vytvořit _nové album s názvem:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videa a nová fotoalba jsou viditelná:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"Před nahráním odstranit identifikační údaje, jako místo, model fotoaparátu "
+"apod."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Vložte ověřovací kód, který se vám zobrazí po přihlášení ke službě Flickr."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "Ověřovací _kód:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Pokračova_t"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "_Stávající album:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "_Nové album s názvem:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "_Uvést album ve veřejném seznamu"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Předvolená veliko_st fotek:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "Adresa _URL vaší fotoknihovny Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "Uživatelské jmé_no"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "Zapamatovat si _heslo"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Stávající kategori_e:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Fotky budou _viditelné:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Velikost fotky:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "v rámci kategorie:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Komentář k albu:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"Když je nastaven název a není nastaven komentář, použít název jako komentář"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Nenahrávat štítky"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Odhlásit"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Zveřejnit"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Základní zveřejňovací služby"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Na_stavení soukromí videa:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Žaluzie"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Šachovnice"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Kruh"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Kruhy"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Hodiny"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Rozpadání"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Slábnutí"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Snímek"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Čtverce"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Pruhy"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Základní přechody prezentace"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011 – 2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nelze vytvořit složku %s pro mezipaměť: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nelze vytvořit složku %s pro data: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Obrázky"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nelze vytvořit složku %s pro dočasné soubory: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nelze vytvořit podsložku %s pro data: %s"
+
+#. restore pin state
+#: ../src/AppWindow.vala:52
+msgid "Pin Toolbar"
+msgstr "Připíchnout lištu"
+
+#: ../src/AppWindow.vala:53
+msgid "Pin the toolbar open"
+msgstr "Připíchnout otevřenou nástrojovou lištu"
+
+#: ../src/AppWindow.vala:57 ../src/AppWindow.vala:135
+msgid "Leave fullscreen"
+msgstr "Opustit režim celé obrazovky"
+
+#: ../src/AppWindow.vala:134
+msgid "Leave _Fullscreen"
+msgstr "Opustit _celou obrazovku"
+
+#: ../src/AppWindow.vala:496
+msgid "_Quit"
+msgstr "U_končit"
+
+#: ../src/AppWindow.vala:501
+msgid "_About"
+msgstr "O _aplikaci"
+
+#: ../src/AppWindow.vala:506
+msgid "Fulls_creen"
+msgstr "_Celá obrazovka"
+
+#: ../src/AppWindow.vala:511
+msgid "_Contents"
+msgstr "_Obsah"
+
+#: ../src/AppWindow.vala:516
+msgid "_Frequently Asked Questions"
+msgstr "Ča_sté dotazy a odpovědi"
+
+#: ../src/AppWindow.vala:521
+msgid "_Report a Problem..."
+msgstr "_Nahlásit problém…"
+
+#: ../src/AppWindow.vala:620 ../src/AppWindow.vala:641
+#: ../src/AppWindow.vala:658 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Zrušit"
+
+#: ../src/AppWindow.vala:668
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Při přístupu ke knihovně aplikace došlo ke kritické chybě. Shotwell nemůže "
+"pokračovat.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:700
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nelze zobrazit nápovědu: %s"
+
+#: ../src/AppWindow.vala:708
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nelze se připojit k databázi chyb: %s"
+
+#: ../src/AppWindow.vala:716
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nelze zobrazit časté dotazy a odpovědi: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Podařilo se"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Chyba souboru"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nelze dekódovat soubor"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Chyba databáze"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Import byl přerušen uživatelem"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nejedná se o soubor"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Soubor je již v databázi"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nepodporovaný formát souboru"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nejedná se o soubor s obrázkem"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Selhání disku"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk je plný"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Chyba fotoaparátu"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Chyba při zápisu souboru"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Soubor s obrázkem je poškozený"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Import selhal (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "P_romítat"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Spustit promítání snímků"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Export fotografie/videa"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Export fotografií/videí"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Export fotografie"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Export fotografií"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Otáčí se"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Vrací se zpět otočení"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Překlápí se vodorovně"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Vrací se zpět vodorovné překlopení"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Překlápí se svisle"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Vrací se zpět svislé překlopení"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Vrací se původní"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Vrací se zpět vrácení původního"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Vylepšuje se"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Vrací se zpět vylepšení"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Transformují se barvy"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Vrací se zpět transformace barev"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Vytváří se nová událost"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Odstraňuje se událost"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Přesouvá se fotografie do nové události"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Nastavuje se fotografie na předchozí událost"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Spojuje se"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Ruší se spojení"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Zdvojují se fotografie"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Odstraňují se zdvojené fotografie"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kvůli chybě souboru nelze zdvojit fotografii"
+msgstr[1] "Kvůli chybě souboru nelze zdvojit %d fotografie"
+msgstr[2] "Kvůli chybě souboru nelze zdvojit %d fotografií"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Obnovuje se předchozí hodnocení"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Zvyšuje se hodnocení"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Snižuje se hodnocení"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Nastavuje se vývojka RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Obnovuje se předchozí vývojka RAW"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Nastavit vývojku"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Původní fotka nemůže být upravována."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Nastavuje se datum a čas"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Vrací se zpět nastavení data a času"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Jednu původní fotografii nebylo možné upravit."
+msgstr[1] "Následující původní fotografie nebylo možné upravit."
+msgstr[2] "Následující původní fotografie nebylo možné upravit."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Chyba při nastavování času"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"U následujícího souboru s fotkou nebylo možné vrátit zpět nastavení času."
+msgstr[1] ""
+"U následujících souborů s fotkou nebylo možné vrátit zpět nastavení času."
+msgstr[2] ""
+"U následujících souborů s fotkou nebylo možné vrátit zpět nastavení času."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Vytvořit štítek"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Přesunout štítek „%s“"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Přesunout fotky do koše"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Obnovit fotky z koše"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Přesunout fotky do koše aplikace Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Obnovit fotky zpět do knihovny Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Přesouvají se fotky do koše"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Obnovují se fotky z koše"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Označit vybrané fotky"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Zrušit označení vybraných fotek"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Označují se vybrané fotky"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Ruší se označení vybraných fotek"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Označit"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Zrušit označení"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nelze spustit Nautilus / Odeslat do: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Odeslání"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Nelze exportovat pozadí do %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nelze připravit promítání snímků na ploše: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Tím odstraníte štítek „%s“ z jedné fotografie. Pokračovat?"
+msgstr[1] "Tím odstraníte štítek „%s“ ze %d fotografií. Pokračovat?"
+msgstr[2] "Tím odstraníte štítek „%s“ z %d fotografií. Pokračovat?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "S_mazat"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Tím bude odstraněno uložené hledání „%s“. Pokračovat?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Přepínání vývoje vrátí zpět všechny změny, které jste provedli na této "
+"fotografii v Shotwellu"
+msgstr[1] ""
+"Přepínání vývoje vrátí zpět všechny změny, které jste provedli na těchto "
+"fotografiích v Shotwellu"
+msgstr[2] ""
+"Přepínání vývoje vrátí zpět všechny změny, které jste provedli na těchto "
+"fotografiích v Shotwellu"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Přepnout vývojku"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Export videa"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell nemůže vytvořit soubor pro úpravy této fotografie, protože nemá "
+"oprávnění zapisovat do %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nelze exportovat následující fotografii kvůli chybě souboru.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Chcete v exportu pokračovat?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Beze změny"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Stávající"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formát:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalita:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Přešká_lovat:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_pixely"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportovat metadata"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Uložit podrobnosti…"
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Uložit podrobnosti"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(a %d dalších)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Zpráva o výsledcích importu"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Pokus o import %d souboru."
+msgstr[1] "Pokus o import %d souborů."
+msgstr[2] "Pokus o import %d souborů"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Z toho byl %d soubor úspěšně importován."
+msgstr[1] "Z toho byly %d soubory úspěšně importovány."
+msgstr[2] "Z toho bylo %d souborů úspěšně importováno."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplicitní fotografie/videa nejsou importovány:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "Zduplikuje existující položky"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Fotografie/videa nelze importovat kvůli chybě fotoaparátu:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "chybová zpráva:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Soubory nebyly importovány, protože nejde o fotografie nebo videa:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotografie/videa nelze importovat, protože nejde o formát, který Shotwell "
+"podporuje:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotografie/videa nelze importovat, protože Shotwell je nemůže zkopírovat do "
+"své knihovny:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"nelze zkopírovat %s\n"
+"\tto %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Fotografie/videa nelze importovat, protože soubory jsou poškozené:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotografie/videa nelze importovat z jiných důvodů:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Jedna duplicitní fotografie nebyla naimportována:\n"
+msgstr[1] "%d duplicitní fotografie nebyly naimportovány:\n"
+msgstr[2] "%d duplicitních fotografií nebylo naimportováno:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Jedno duplicitní video nebylo naimportováno:\n"
+msgstr[1] "%d duplicitní videa nebyla naimportováno:\n"
+msgstr[2] "%d duplicitních videí nebylo naimportováno:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Jedna duplicitní fotografie/video nebylo naimportováno:\n"
+msgstr[1] "%d duplicitní fotografie/videa nebyly naimportovány:\n"
+msgstr[2] "%d duplicitní fotografií/videí nebylo naimportováno:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"U jedné fotografie selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[1] ""
+"U %d fotografií selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[2] ""
+"U %d fotografií selhal import kvůli chybě souboru nebo hardwaru:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"U jednoho videa selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[1] "U %d videí selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[2] "U %d videí selhal import kvůli chybě souboru nebo hardwaru:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"U jedné fotografie/videa selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[1] ""
+"U %d fotografií/videí selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[2] ""
+"U %d fotografií/videí selhal import kvůli chybě souboru nebo hardwaru:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"U jednoho souboru selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[1] "U %d souborů selhal import kvůli chybě souboru nebo hardwaru:\n"
+msgstr[2] "U %d souborů selhal import kvůli chybě souboru nebo hardwaru:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"U jedné fotografie selhal import, protože složka knihovny neumožňila zápis:"
+"\n"
+msgstr[1] ""
+"U %d fotografií selhal import, protože složka knihovny neumožňila zápis:\n"
+msgstr[2] ""
+"U %d fotografií selhal import, protože složka knihovny neumožňila zápis:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"U jednoho videa selhal import, protože složka knihovny neumožňila zápis:\n"
+msgstr[1] ""
+"U %d videí selhal import, protože složka knihovny neumožňila zápis:\n"
+msgstr[2] ""
+"U %d videí selhal import, protože složka knihovny neumožňila zápis:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"U jedné fotografie/videa selhal import, protože složka knihovny neumožňila "
+"zápis:\n"
+msgstr[1] ""
+"U %d fotografií/videí selhal import, protože složka knihovny neumožňila "
+"zápis:\n"
+msgstr[2] ""
+"U %d fotografií/videí selhal import, protože složka knihovny neumožňila "
+"zápis:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"U jednoho souboru selhal import, protože složka knihovny neumožňila zápis:"
+"\n"
+msgstr[1] ""
+"U %d souborů selhal import, protože složka knihovny neumožňila zápis:\n"
+msgstr[2] ""
+"U %d souborů selhal import, protože složka knihovny neumožňila zápis:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "U jedné fotografie selhal import kvůli chybě fotoaparátu:\n"
+msgstr[1] "U %d fotografií selhal import kvůli chybě fotoaparátu:\n"
+msgstr[2] "U %d fotografií selhal import kvůli chybě fotoaparátu:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "U jednoho videa selhal import kvůli chybě fotoaparátu:\n"
+msgstr[1] "U %d videí selhal import kvůli chybě fotoaparátu:\n"
+msgstr[2] "U %d videí selhal import kvůli chybě fotoaparátu:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "U jedné fotografie/videa selhal import kvůli chybě fotoaparátu:\n"
+msgstr[1] "U %d fotografií/videí selhal import kvůli chybě fotoaparátu:\n"
+msgstr[2] "U %d fotografií/videí selhal import kvůli chybě fotoaparátu:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "U jednoho souboru selhal import kvůli chybě fotoaparátu:\n"
+msgstr[1] "U %d souborů selhal import kvůli chybě fotoaparátu:\n"
+msgstr[2] "U %d souborů selhal import kvůli chybě fotoaparátu:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "U jedné fotografie selhal import protože byla poškozená:\n"
+msgstr[1] "U %d fotografií selhal import protože byly poškozené:\n"
+msgstr[2] "U %d fotografií selhal import protože byly poškozené:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "U jednoho videa selhal import protože bylo poškozené:\n"
+msgstr[1] "U %d videí selhal import protože byly poškozená:\n"
+msgstr[2] "U %d videí selhal import protože byly poškozená:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "U jedné fotografie/videa selhal import protože bylo poškozené:\n"
+msgstr[1] "U %d fotografií/videí selhal import protože byly poškozené:\n"
+msgstr[2] "U %d fotografií/videí selhal import protože byly poškozené:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "U jednoho souboru selhal import protože byl poškozený:\n"
+msgstr[1] "U %d souborů selhal import protože byly poškozené:\n"
+msgstr[2] "U %d souborů selhal import protože byly poškozené:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Jedna nepodporovaná fotografie byla vynechána:\n"
+msgstr[1] "%d nepodporované fotografie byly vynechány:\n"
+msgstr[2] "%d nepodporovaných fotografií bylo vynecháno:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Jeden neobrázkový soubor byl vynechán.\n"
+msgstr[1] "%d neobrázkové soubory byly vynechány.\n"
+msgstr[2] "%d neobrázkových souborů bylo vynecháno.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+"Jedna fotografie byla vynechána kvůli zrušení ze strany uživatele:\n"
+msgstr[1] "%d fotografie byly vynechány kvůli zrušení ze strany uživatele:\n"
+msgstr[2] "%d fotografií bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Jedno video bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+msgstr[1] "%d videa byla vynechána kvůli zrušení ze strany uživatele:\n"
+msgstr[2] "%d videí bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"Jedna fotografie/video bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+msgstr[1] ""
+"%d fotografie/videa byly vynechány kvůli zrušení ze strany uživatele:\n"
+msgstr[2] ""
+"%d fotografií/videí bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Jeden soubor byl vynechán kvůli zrušení ze strany uživatele:\n"
+msgstr[1] "%d soubory byly vynechány kvůli zrušení ze strany uživatele:\n"
+msgstr[2] "%d souborů bylo vynecháno kvůli zrušení ze strany uživatele:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Jedna fotografie byla úspěšně naimportována.\n"
+msgstr[1] "%d fotografie byly úspěšně naimportovány.\n"
+msgstr[2] "%d fotografií bylo úspěšně naimportováno.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Jedno video bylo úspěšně naimportováno.\n"
+msgstr[1] "%d videa byla úspěšně naimportována.\n"
+msgstr[2] "%d videí bylo úspěšně naimportováno.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Jedna fotografie/video bylo úspěšně naimportováno.\n"
+msgstr[1] "%d fotografie/videa byly úspěšně naimportovány.\n"
+msgstr[2] "%d fotografií/videí bylo úspěšně naimportováno.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Žádné fotografie ani videa nebyly naimportovány.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import dokončen"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d vteřina"
+msgstr[1] "%d vteřiny"
+msgstr[2] "%d vteřin"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuty"
+msgstr[2] "%d minut"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hodina"
+msgstr[1] "%d hodiny"
+msgstr[2] "%d hodin"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 den"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Přejmenovat událost"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Název:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Úprava názvu"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Název:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Úprava komentáře k události"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Úprava komentáře k fotografii/videu"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Komentář:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Přesunou_t do koše"
+msgstr[1] "Přesunou_t do koše"
+msgstr[2] "Přesunou_t do koše"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Jen _odsranit"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Zachovat"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Vrátit zpět externí úpravu?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Vrátit zpět externí úpravy?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Tím se odstraní všechny změny provedené v externím souboru. Pokračovat?"
+msgstr[1] ""
+"Tím se odstraní všechny změny provedené v %d externích souborech. Pokračovat?"
+msgstr[2] ""
+"Tím se odstraní všechny změny provedené v %d externích souborech. Pokračovat?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Vrátit zpět externí úpravu"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Vrátit zpět externí úpravy"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Tím se fotka odebere z knihovny. Pokračovat?"
+msgstr[1] "Tím se odeberou %d fotky z knihovny. Pokračovat?"
+msgstr[2] "Tím se odebere %d fotek z knihovny. Pokračovat?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "Odeb_rat"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Odstranit fotografii z knihovny"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Odstranit fotografie z knihovny"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d %%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "dop."
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "odp."
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24hod"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Posunout fotografie/videa o tu samou hodnotu"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Nastavit tento čas _všem fotkám/videím"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Z_měnit původní soubor s fotkou"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Z_měnit původní soubory s fotkami"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Z_měnit původní soubor"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Z_měnit původní soubory"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Původní:"
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %k∶%M∶%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %l∶%M∶%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Čas expozice bude posunut dopředu\n"
+"o %d %s, %d %s, %d %s a %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Čas expozice bude posunut dozadu\n"
+"o %d %s, %d %s, %d %s a %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "den"
+msgstr[1] "dny"
+msgstr[2] "dní"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodinu"
+msgstr[1] "hodiny"
+msgstr[2] "hodin"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutu"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "vteřinu"
+msgstr[1] "vteřiny"
+msgstr[2] "vteřin"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"A %d další."
+msgstr[1] ""
+"\n"
+"\n"
+"A %d další."
+msgstr[2] ""
+"\n"
+"\n"
+"A %d dalších."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Štítky (oddělené čárkou):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Vítejte!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Vítejte v aplikaci Shotwell"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "Pro začátek naimportujte fotky libovolným postupem:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"výběrem z nabídky <span weight=\"bold\">Soubor %s Importovat ze složky</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "přetažením a upuštěním souborů nad oknem aplikace"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "připojením fotoaparátu k počítači a importem z něj"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importovat fotografie ze složky %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Můžete také některým z těchto způsobů importovat fotky:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Příště _nezobrazovat"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importovat fotky z knihovny %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(nápověda)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "rok%směsíc%sden"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "rok%směsíc"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "rok%směsíc-den"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "rok-měsíc-den"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Vlastní"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Neplatný vzor"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell může zkopírovat fotky do knihovny nebo je může importovat bez "
+"kopírování."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_pírovat fotky"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importovat bez kopírování"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Import do knihovny"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Odstranění z knihovny"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Odstraňuje se fotografie z knihovny"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Odstraňují se fotografie z knihovny"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tím odstraníte fotografii/video z knihovny Shotwell. Chcete také příslušný "
+"soubor přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[1] ""
+"Tím odstraníte %d fotografie/videa z knihovny Shotwell. Chcete také "
+"příslušné soubory přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[2] ""
+"Tím odstraníte %d fotografií/videí z knihovny Shotwell. Chcete také "
+"příslušné soubory přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tím odstraníte video z knihovny Shotwell. Chcete také příslušné soubory "
+"přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[1] ""
+"Tím odstraníte %d videa z knihovny Shotwell. Chcete také příslušné soubory "
+"přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[2] ""
+"Tím odstraníte %d videí z knihovny Shotwell. Chcete také příslušné soubory "
+"přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tím odstraníte fotografii z knihovny Shotwell. Chcete také příslušný soubory "
+"přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[1] ""
+"Tím odstraníte %d fotografie z knihovny Shotwell. Chcete také příslušné "
+"soubory přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+msgstr[2] ""
+"Tím odstraníte %d fotografií z knihovny Shotwell. Chcete také příslušné "
+"soubory přesunout do systémového koše?\n"
+"\n"
+"Tuto operaci nelze vrátit zpět."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "Fotografii či video nelze přesunout do koše. Má se soubor smazat?"
+msgstr[1] ""
+"%d fotografie/videa nelze přesunout do koše. Mají se soubory smazat?"
+msgstr[2] ""
+"%d fotografií/videí nelze přesunout do koše. Mají se soubory smazat?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Fotografii či video nelze smazat."
+msgstr[1] "%d fotografie/videa nelze smazat."
+msgstr[2] "%d fotografií/videí nelze smazat."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Šířka nebo výška"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Šířka"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Výška"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Nelze sledovat %s: nejedná se o složku (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:753
+#, c-format
+msgid "Event %s"
+msgstr "Událost %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nelze vytvořit dočasný soubor pro %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportuje se"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Soubor %s již existuje. Přepsat?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Pře_skočit"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Přepsat"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Přepsat _vše"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Export"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nelze sledovat změny: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Nastavit velikost náhledů"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Přiblíž_it"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Zvětšit velikost náhledů"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "_Oddálit"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Zmenšit velikost náhledů"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Seřadit _fotky"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Přehrát video"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Otevřít vybraná videa v systémovém přehrávači videí"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Vývojka"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Fotoaparát"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Názvy"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "U každé fotografie zobrazit název"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Komentáře"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "U každé fotografie zobrazit komentář"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "Štít_ky"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "U každé fotografie zobrazit štítky"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Podle _názvu"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Seřadit fotografie podle názvu"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Podle _data pořízení"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Seřadit fotografie podle data pořízení"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Podle _hodnocení"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Seřadit fotografie podle hodnocení"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Vzestupně"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Seřadit fotografie ve vzestupném pořadí"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "_Sestupně"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Seřadit fotografie v sestupném pořadí"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Nelze přehrát vybrané video:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Žádné fotografie/videa"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nebyla nalezena žádná fotografie ani video"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotografie nelze exportovat do této složky."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "změněno"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Předchozí fotografie"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Následující fotografie"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Chybí zdrojový soubor s fotografií: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Zobrazit"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Nástr_oje"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Předchozí fotka"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Předchozí fotografie"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Následující fotka"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Následující fotografie"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Zvýšit přiblížení fotografie"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Snížit přiblížení fotografie"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Přizpůsobit _stránce"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Přizpůsobit přiblížení fotografie velikosti obrazovky"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Přiblížení _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zobrazit fotografii v původní velikosti"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Přiblížení _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zobrazit fotografii v dvojnásobku původní velikosti"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nelze exportovat %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "vyplnit celou stránku"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 obrázky na stránku"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 obrázky na stránku"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 obrázků na stránku"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 obrázků na stránku"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 obrázků na stránku"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 obrázků na stránku"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "palců"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Do peněženky (2 × 3 palce)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Poznámková karta (3 × 5 palců)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 × 6 palců"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 × 7 palců"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 × 10 palců"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 × 14 palců"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 × 20 palců"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Do peněženky (9 × 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Pohlednice (10 × 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 × 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 × 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 × 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 × 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 × 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Nastavení obrázku"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Tiskne se…"
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nelze vytisknout fotografii:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Dnes"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Včera"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW + JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Položky:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d událost"
+msgstr[1] "%d události"
+msgstr[2] "%d událostí"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotografie"
+msgstr[1] "%d fotografie"
+msgstr[2] "%d fotografií"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videa"
+msgstr[2] "%d videí"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Čas:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Od:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Pro:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Velikost:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Délka:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f vteřin"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Vývojka:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Expozice:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Místo:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Velikost souboru:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Aktuální vývojka:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Původní velikost:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Výrobce fotoaparátu:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model fotoaparátu:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blesk:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Ohnisko:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Datum expozice:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Čas expozice:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Expoziční korekce:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Zeměpisná šířka:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Zeměpisná délka:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Umělec:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Doplňující informace"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Správce fotografií"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Prohlížeč fotografií"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Otočit dop_rava"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Otočit"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Otočit doprava"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Otočit fotografii doprava (pro otočení doleva zmáčkněte Ctrl)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Otočit do_leva"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Otočit doleva"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Otočí fotografii doleva"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Překlopit vo_dorovně"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Překlopit vodorovně"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Překlopit s_visle"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Překlopit svisle"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Vylepšit"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Vylepšit"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automaticky vylepšit vzhled fotografie"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Kopírovat úpravu barev"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Kopírovat úpravu barev"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Kopírovat parametry úpravy barev použité u fotografie"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Vložit ú_pravu barev"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Vložit úpravu barev"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Použít u vybraných fotografií zkopírované parametry úpravy barev"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Oříznout"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Oříznout"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Oříznout rozměry fotografie"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Vyrovnat"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Vyrovnat"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Vyrovnat fotografii"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Če_rvené oči"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Červené oči"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Odstranit nebo potlačit efekt červených očí ve fotografii"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Upravit"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Upravit"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Upravit barvy a tón fotografie"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Vrátit zpět na původní"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Vrátit zpět na původní"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Vrátit zpět e_xterní úpravy"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Zrušit změny a vrátit se zpět k původní fotografii"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Nastavit jako poza_dí plochy"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Nastavit vybranou fotografii jako obrázek na pozadí pracovní plochy"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Nastavit jako prezentaci na p_loše…"
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Zpět"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Zpět"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "Zn_ovu"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Znovu"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Přejme_novat událost…"
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Použít jako _klíčovou fotku pro událost"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Nastavit jako klíčovou fotografii pro událost"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nová událost"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Nová událost"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Přesunout fotky"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Přiřadit fotografie k události"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "S_pojit události"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Spojit"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Sloučit události do jedné"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Hodnotit"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Nastavit hodnocení"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Změnit hodnocení své fotografie"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "Z_výšit"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Zvýšení hodnocení"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "S_nížit"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Snížení hodnocení"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Bez ohodnocení"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Nehodnoceno"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Bez ohodnocení"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Nastavuje se jako nehodnocené"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Odebrat hodnocení"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Zamítnout"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Zamítnuto"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Zamítavé hodnocení"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Nastavuje se na zamítnuté"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Nastavit hodnocení na zamítnuté"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Jen _zamítnuté"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Jen zamítnuté"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Zobrazit je zamítnuté fotografie"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Všechny + _zamítnuté"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Zobrazit všechny fotografie, včetně zamítnutých"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Všechny fotografie"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Zobrazit všechny fotografie"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Hodnocení"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "U každé fotografie zobrazit hodnocení"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrovat fotografie"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrovat fotografie"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Omezit počet zobrazených fotografií pomocí filtru"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplikovat"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplikovat"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Vytvořit kopii této fotografie"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Export…"
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Tisk…"
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Zveře_jnit…"
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Zveřejnit na různých webových stránkách"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Upravi_t název…"
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Upravit _komentář…"
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Upravit komentář"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Upravit _komentář události…"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Nastavit d_atum a čas…"
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Nastavení data a času"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Přidat š_títky…"
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Přid_at štítky…"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Přidání štítků"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Předvolby"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Otevřít v e_xterním editoru"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Otevřít v editoru RA_W"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Odesla_t…"
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_Odeslat…"
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "Na_jít…"
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Najít"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Najít obrázky, jejichž název nebo štítek obsahují napsaný text"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Označit"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Zrušit _označení"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nelze spustit editor: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Přidat štítek „%s“"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Přidat štítky „%s“ a „%s“"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "S_mazat štítek „%s“"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Smazat štítek „%s“"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Smazat štítek"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Nový"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Přejme_novat štítek „%s“…"
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Přejmenovat štítek „%s“ na „%s“"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Přejmenovat…"
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Změnit štítk_y…"
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Změnit štítky"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Oštítkovat fotku jak „%s“"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Oštítkovat fotku jak „%s“"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Oštítkovat vybranou fotku jako „%s“"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Oštítkovat vybrané fotky jako „%s“"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Odstranit z _fotky štítek „%s“"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Odstranit z _fotek štítek „%s“"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Odstranit z fotky šítek „%s“"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Odstranit z fotek štítek „%s“"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Nelze přejmenovat šítek na „%s“, protože takový už existuje."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Nelze přejmenovat hledání na „%s“, protože takové už existuje."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Uložené hledání"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Smazat hledání"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Upravit…"
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Přejme_novat…"
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Přejmenovat hledání „%s“ na „%s“"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Smazat hledání „%s“"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Hodnocení %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Nastavit ohodnocení na %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Nastavuje se ohodnocení na %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Zobrazit %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Zobrazit jen fotografie s ohodnocením %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s nebo lepší"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Zobrazit %s nebo lepší"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Zobrazit jen fotografie s hodnocením %s nebo lepším"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Odstranit vybrané fotografie z koše"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Odstraní vybrané fotografie z knihovny"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "O_bnovit"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Přesunout vybrané fotografie zpět do knihovny"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Otevřít ve _správci souborů"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Otevřít vybranou složku s fotografiemi ve správci souborů"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nelze otevřít ve správci souborů: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "O_dstranit z knihovny"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Přesu_nout do koše"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Vybrat _vše"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Vybrat všechny položky"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%l∶%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%l∶%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a, %e. %B %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a, %e. %B"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%e. %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Prezentace"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Označeno"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografie"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videa"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotografie RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotografie RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Chyba při čtení souboru %s s uživatelským rozhraním: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Typ"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Hodnocení"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Nastavení"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Předchozí"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Přejít na předchozí fotografii"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pozastavit"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pozastavit promítání"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Následující"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Přejít na následující fotografii"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Změnit nastavení prezentace"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Chybí všechny zdrojové soubory s fotografiemi."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Přehrát"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Pokračovat v promítání"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "bez názvu"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:486
+msgid "Export Videos"
+msgstr "Export videí"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fotoaparáty"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Nepodařilo se odpojit fotoaparát. Pokuste se odpojit fotoaparát pomocí "
+"správce souborů."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skrýt již naimportované fotky"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Zobrazit jen fotografie, které ještě nebyly naimportovány"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Začíná import, čekejte prosím…"
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importovat vy_brané"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importovat vybrané fotografie do knihovny"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importovat _vše"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importovat všechny fotografie do knihovny"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell potřebuje kvůli přístupu odpojit fotoaparát ze souborového systému. "
+"Pokračovat?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Odpojit"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Odpojte prosím fotoaparát."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Fotoaparát je používán jinou aplikací. Shotwell může použít jen fotoaparát, "
+"který není blokovaný jinou aplikací. Ukončete všechny aplikace, které ho "
+"používají, a zkuste to znovu."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Ukončete prosím ostatní aplikace používající fotoaparát."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nelze načíst náhledy z fotoaparátu:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Odpojuje se…"
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Získávají se informace o fotografii"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Získává se náhled pro %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Nelze uzamknout fotoaparát: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Smazat tuto fotografii z fotoaparátu?"
+msgstr[1] "Smazat tyto %d fotografie z fotoaparátu?"
+msgstr[2] "Smazat těchto %d fotografií z fotoaparátu?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Smazat toto video z fotoaparátu?"
+msgstr[1] "Smazat tato %d videa z fotoaparátu?"
+msgstr[2] "Smazat těchto %d videí z fotoaparátu?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Smazat tuto fotografii/video z fotoaparátu?"
+msgstr[1] "Smazat tyto %d fotografie/videa z fotoaparátu?"
+msgstr[2] "Smazat těchto %d fotografií/videí z fotoaparátu?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Smazat tento soubor z fotoaparátu?"
+msgstr[1] "Smazat tyto %d soubory z fotoaparátu?"
+msgstr[2] "Smazat těchto %d souborů z fotoaparátu?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Odstraňují se fotografie/videa z fotoaparátu"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Kvůli chybě nelze smazat fotografii/video z fotoaparátu."
+msgstr[1] "Kvůli chybě nelze smazat %d fotografie/videa z fotoaparátu."
+msgstr[2] "Kvůli chybě nelze smazat %d fotografií/videí z fotoaparátu."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Import dat"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Databáze %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Import z %s nemůže pokračovat kvůli chybě:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "V nabídce výše vyberte jinou službu, ze které se má zkusit import."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nemáte zapnutý žádný zásuvný modul sloužící k importu.\n"
+"\n"
+"Pokud chcete používat funkci Importovat z aplikace, musíte mít alespoň jeden "
+"zásuvný modul zapnutý. Zapínají se v dialogovém okně předvoleb."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Databázový soubor:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Import"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Import z aplikace"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importovat média _z:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Zavřít"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nepodařilo se otevřít/vytvořit databázi fotografií %s: kód chyby %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nelze zapisovat do databázového souboru s fotografiemi:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Chyba při přístupu k databázovému souboru:\n"
+"%s\n"
+"\n"
+"Chyba:\n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Soubor"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "_Uložit"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Uložit fotografii"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Uložit j_ako…"
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Uložit fotografii pod jiným názvem"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Vytisknout fotografii na tiskárně připojené k počítači"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Upravit"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Fotografie"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Nápověda"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s neexistuje."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s není soubor."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s nepodporuje formát %s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "Uložit _kopii"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Zahodit změny v %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Zavřít _bez uložení"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Chyba při ukládání %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Uložení jako"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Vrátit se k původním rozměrům fotky"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Nastaví oříznutí fotografie"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Přetočit ořezový rám mezi orientací na výšku a na šířku"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Neomezeně"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Čtverec"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Obrazovka"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD video (4:3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD video (16:9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8,5 x 11 palců)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 × 17 palců)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 × 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 × 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Zavřít nástroj pro odstranění červených očí"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Odstranit efekt červených očí ve vybrané oblasti"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Původní"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Sytost:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Odstín:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Teplota:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Tmavé tóny:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Světlé tóny:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Původní barvy"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Obnovit nastavení barev na původní"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Teplota"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Odstín"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Sytost"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Expozice"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Tmavé tóny"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Světlé tóny"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Zvýšení kontrastu"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Úhel:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotka/video"
+msgstr[1] "%d fotky/videa"
+msgstr[2] "%d fotek/videí"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Žádná událost"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "U každé události zobrazit komentář"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Žádné události"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nebyly nalezeny žádné události"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Události"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Bez data"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Složky"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Knihovna"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importuje se…"
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Za_stavit import"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Zastavit import fotografií"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Připravuje se na import…"
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Naimportováno %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Poslední import"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importovat ze složky…"
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importovat fotografie z disku do knihovny"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importovat z _aplikace…"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "S_eřadit události"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Vyp_rázdnit koš"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Vymazat všechny fotografie v koši"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Zobrazit u_dálosti pro fotku"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "Na_jít"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Najít fotografie nebo videa podle zadaných kritérií"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "No_vé uložené vyhledávání…"
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografie"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Událos_ti"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Základní informace"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Zobrazit základní informace o vybrané fotografii"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Rozšiřující informace"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Zobrazit více informací o vybrané fotografii"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Vy_hledávací lišta"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Zobrazit vyhledávací lištu"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "P_ostranní panel"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Zobrazit postranní panel"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Import ze složky"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Vyprázdnění koše"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Vyprazdňuje se koš…"
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell je nastaven, aby importovat fotografie do vaší domovské složky.\n"
+"Doporučujeme to v <span weight=\"bold\">Upravit %s Předvolby</span> změnit.\n"
+"Chcete pokračovat v importu fotografií?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Umístění knihovny"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Z této složky nemohou být fotografie importovány."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d %%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Aktualizuje se knihovna…"
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Připravuje se automatický import fotografií…"
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Provádí se automatický import fotografií…"
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Zapisují se metadata do souborů…"
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Chybějící soubory"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Maže se…"
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Koš"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Koš je prázdný"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Smazání"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Mažou se fotografie"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Vaše knihovna fotografií není kompatibilní s touto verzí aplikace Shotwell. "
+"Knihovna je vytvořena ve verzi %s (schéma %d). Spuštěná verze je %s (schéma "
+"%d). Použijte prosím nejnovější verzi programu."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Aplikaci Shotwell se nepodařilo aktualizovat knihovnu fotografií z verze %s "
+"(schéma %d) na verzi %s (schéma %d). Více informací naleznete na "
+"wikistránkách %s (anglicky)"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Vaše knihovna fotografií není kompatibilní s touto verzí aplikace Shotwell. "
+"Knihovna je vytvořena ve verzi %s (schéma %d). Spuštěná verze je %s (schéma "
+"%d). Smažte prosím %s a znovu naimportujte své fotografie."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Neznámá chyba při přístupu k databázi Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Načítá se Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Cesta k soukromým datům aplikace Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "SLOŽKA"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Nesledovat průběžné změny ve složce s knihovnou"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Při spuštění nezobrazovat ukazatel průběhu"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Zobrazit verzi aplikace"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[SOUBOR]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Spuštěním „%s --help“ si zobrazíte všechny přepínače příkazového řádku.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "nízká (%d %%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "střední (%d %%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "vysoká (%d %%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "maximální (%d %%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Zveřejňování"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Připravuje se k nahrání"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Nahrává se %d z %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Zveřejnění na %s nemůže pokračovat kvůli chybě:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "V nabídce výše vyberte jinou službu, na které se má zkusit zveřejnit."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Vybrané fotografie/videa byla úspěšně zveřejněna."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Vybraná videa byla úspěšně zveřejněna."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Vybrané fotografie byly úspěšně zveřejněny."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Vybrané video bylo úspěšně zveřejněno."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Vybraná fotografie byla úspěšně zveřejněna."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Získávají se informace o účtu…"
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Přihlašuje se…"
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Zveřejnit fotografie"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Zveřejni_t fotografie na"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Zveřejnit videa"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Zveřejni_t videa na"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Zveřejnit fotografie a videa"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Zveřejni_t fotografie a videa na"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nelze zveřejnit"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell nemůže zveřejnit vybrané položky, protože nemáte povolen "
+"kompatibilní zásuvný modul pro zveřejňování. Chcete-li tento problém "
+"vyřešit, zvolte <b>Upravit %s Předvolby</b> a pak kartu <b>Zásuvné moduly</"
+"b> pro výběr jednoho či více zásuvných modulů pro zveřejňování."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Uložená hledání"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "obsahuje"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "je přesně"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "začíná"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "končí"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "neobsahuje"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "není nastaveno"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "je"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "není"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "libovolná fotka"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "fotka RAW"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "má"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "nemá"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "změny"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "interní změny"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "externí změny"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "označeno"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "neoznačeno"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "a více"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "jen"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "a méně"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "je po"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "je před"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "je mezi"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "a"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "cokoliv"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "vše"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nic"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Kterýkoliv text"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Název"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Štítek"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Komentář"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Název události"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Název souboru"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Typ média"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Stav označení"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Stav fotky"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datum"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nový š_títek…"
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Přechody mezi snímky"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(žádný)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Žádný"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Náhodně"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Štítky"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Nastavit jako prezentaci na ploše"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Vytvořit promítání snímků na pozadí plochy"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Každou fotku zobrazit na"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "násobků času"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Na jak dlouho se má zobrazit jedna fotografie"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Hledání"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Název hledání:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Shoduje se"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "z následujícího:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Velikost tištěného obrázku</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Použít _standardní velikost:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Použít _vlastní velikost:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "Zachovat po_měr stran"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Automatická velikost:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Názvy</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Tisknout _název obrázku"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Rozlišení</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "Vytiskn_out v rozlišení:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "bodů na palec"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Předvolby Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "bílé"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "černé"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "S_ledovat, jestli nejsou do knihovny přidány nové soubory"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Zapisovat štítky, názvy a další _metadata do souborů s fotografiemi"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Zobrazení"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importovat fotografie do:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Pozadí:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Import"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Struktura _složek:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Vzor:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Příklad:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "Př_evádět názvy importovaných souborů na malá písmena"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Vývojka RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Výchozí:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "E_xterní editor fotografií:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Externí editor _RAW:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Externí editory"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Zásuvné moduly"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Doba zobrazení:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Efek_t přechodu:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Trvání př_echodu:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Zobrazovat n_ázev"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "vteřin"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Přihlásit se"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..1e4110e
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,4514 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Aputsiaĸ Niels Janussen <aj@isit.gl>, 2011
+# Aputsiaĸ Niels Janussen <aj@isit.gl>, 2012
+# <johanneswilm@gmail.com>, 2011
+# johanneswilm <johanneswilm@gmail.com>, 2011
+# Kris Thomsen <lakristho@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Danish (http://www.transifex.com/projects/p/shotwell/language/"
+"da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Begivenhed %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameraer"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kunne ikke afmontere kameraet. Forsøg afmontering af kameraet fra "
+"filhåndteringen."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skjul billeder der allerede er importeret"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Vis kun billeder som endnu ikke er blevet importeret"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Starter import, vent venligst..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titler"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Vis titlen på hvert billede"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importer _valgte"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importer de valgte billeder til dit bibliotek"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importer _alle"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importere alle billeder ind i dit bibliotek"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell har brug for at afmontere kameraet fra filsystemet for at få adgang "
+"til det. Fortsæt?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Afmonter"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Afmonter venligst kameraet."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kameraet er låst af et andet program. Shotwell kan kun tilgå kameraet når "
+"det er ulåst. Luk venligst alle andre programmer som bruger kameraet og "
+"forsøg igen."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Luk venligst alle andre programmer som bruger kameraet."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kunne ikke indhente forhåndsvisninger fra kameraet:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Afmonterer..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Indhenter billedinformation"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Indhenter forhåndsvisning for %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kan ikke låse kamera: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Slet dette billede fra kameraet?"
+msgstr[1] "Slet disse %d billeder fra kameraet?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "%d Slet denne video fra kameraet?"
+msgstr[1] "Slet disse %d videoer fra kameraet?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "%d Slet dette billede/denne video fra kameraet?"
+msgstr[1] "Slet disse %d billeder/videoer fra kameraet?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Slette disse filer fra kameraet?"
+msgstr[1] "Slette disse %d filer fra kameraet?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Behold"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fjern billeder/videoer fra kameraet"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Kan ikke slette %d billede/video fra kameraet på grund af fejl."
+msgstr[1] "Kan ikke slette %d billeder/videoer fra kameraet på grund af fejl."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diasshow"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Afspil et diasshow"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksporter billeder/videoer"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksporter billeder/videoer"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Eksporter billeder"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksporter billeder"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Roterer"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Fortryder rotering"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Vender vandret"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Fortryder vandret vending"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vender lodret"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Fortryder lodret vending"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Hvilken som helst tekst"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Mærke"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Begivenhedens navn"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Filnavn"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Medietype"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Mærkatstatus"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Bedømmelse"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dato"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "indeholder"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "er nøjaktig"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "starter med"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "slutter med"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "indeholder ikke"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "er ikke sat"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "er"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "er ikke"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "et hvilket som helst foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "et raw billede"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "en video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "mærkat"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "uden mærkat"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "og højere"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "kun"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "og lavere"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "er efter"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "er før"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "er mellem"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "og"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "enhver"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alle"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ingen"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Gemte søgninger"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "N_y gemt søgning..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Dit fotobibliotek er ikke kompatibelt med denne version af Shotwell. Det "
+"ser ud til det blev oprettet af Shotwell %s (skema %d). Dette er version %s "
+"(skema %d). Brug venligst den nyeste version af Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell var ude af stand til at opgradere dit fotobibliotek fra version %s "
+"(skema %d) til %s (skema %d). For mere information, se Shotwellwiki'en: %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Dit fotobibliotek er ikke kompatibelt med denne version af Shotwell. Det "
+"ser ud til det blev oprettet af Shotwell %s (skema %d). Dette er version %s "
+"(skema %d). Brug venligst den nyeste version af Shotwell. Venligst rengør "
+"dit bibliotek ved at slette %s og re-importere dine billeder."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Ukendt fejl under forsøg på at kontrollere Shotwells database: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Indlæser Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FIL]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Kør '%s --help' for at se en fuldstændig liste af tilgængelige kommandolinie "
+"kommandoer.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "I dag"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "I går"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Punkter:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d hændelse"
+msgstr[1] "%d hændelser"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d billede"
+msgstr[1] "%d billeder"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d Video"
+msgstr[1] "%d Videoer"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Dato:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Tid:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Fra:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Til:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Størrelse:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Varighed:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekunder"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Udvikler:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Belysning:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Placering:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Filstørrelse:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Oprindelige dimensioner:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kameraproducent:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kameramodel:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blitz:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Brændvidde:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Belysningskompensation:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS-breddegrad:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS-længdegrad:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Kunstner:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Ophavsret:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Program:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Udvidet information"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Dette vil fjerne mærket »%s« fra et billede. Fortsæt?"
+msgstr[1] "Dette vil fjerne mærket »%s« fra %d billeder. Fortsæt?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Afbryd"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Slet"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Dette vil fjerne den gemte søgning \"%s\". Fortsætte?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Skift udvikler"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Eksporter Video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell kunne ikke oprette en fil for redigering af dette foto, fordi du "
+"ikke har skriverettigheder for %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Kunne ikke eksportere følgende billede på grund af en filfejl.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Vil du fortsætte med at eksportere?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "For_tsæt"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Umodificeret"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Nuværende"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalitet:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skaleringsbegrænsning:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _billedpunkter"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Eksportér metadata"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(og %d flere)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 duplikatbillede blev ikke importeret:\n"
+msgstr[1] "%d duplikatbilleder blev ikke importeret:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 video blev ikke importeret:\n"
+msgstr[1] "%d duplikate videoer blev ikke importeret:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 duplikat foto/video blev ikke importeret:\n"
+msgstr[1] "%d duplikate fotoer/videoer blev ikke importeret:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 billede kunne ikke importeres på grund af en fil- eller hardwarefejl.\n"
+msgstr[1] ""
+"%d billeder kunne ikke importeres på grund af en fil- eller hardwarefejl.\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 video kunne ikke importeres pga. en fil- eller hardwarefejl:\n"
+msgstr[1] "%d videoer kunne ikke importeres pga. en fil- eller hardwarefejl:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 billede/video kunne ikke importeres pga. en fil- eller hardwarefejl:\n"
+msgstr[1] ""
+"%d billeder/videoer kunne ikke importeres pga. en fil- eller hardwarefejl:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "1 fil kunne ikke importeres pga. en fil eller hardware fejl:\n"
+msgstr[1] "%d filer kunne ikke importeres pga. en fil eller hardware fejl:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 foto fejlede under import da fotomappen var skrivebeskyttet:\n"
+msgstr[1] "%d fotos fejlede under import da fotomappen var skrivebeskyttet:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 video fejlede under import, da fotomappen er skrivebeskyttet:\n"
+msgstr[1] ""
+"%d videoer fejlede under import, da fotomappen er skrivebeskyttet:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto/video fejlede under import, da fotomappen var skrivebeskyttet:\n"
+msgstr[1] ""
+"%d fotos/videoer fejlede under import, da fotomappen var skrivebeskyttet:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 fil kunne ikke importeres pga. der ikke kunne skrives til "
+"billedbiblioteksfoldere:\n"
+msgstr[1] ""
+"%d filer kunne ikke importeres pga. der ikke kunne skrives til "
+"billedbiblioteksfoldere:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 billede kunne ikke importeres på grund af en kamerafejl.\n"
+msgstr[1] "%d billeder kunne ikke importeres på grund af en kamerafejl.\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video kunne ikke importeres pga. en kamerafejl:\n"
+msgstr[1] "%d videoer kunne ikke importeres pga. en kamerafejl:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 billede/video kunne ikke importeres pga. en kamerafejl:\n"
+msgstr[1] "%d billeder/videoer kunne ikke importeres pga. en kamerafejl:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 fil kunne ikke importeres pga. kamerafejl:\n"
+msgstr[1] "%d filer kunne ikke importeres pga. kamerafejl:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 billede der ikke er understøttet blev udeladt.\n"
+msgstr[1] "%d billeder der ikke er understøttet blev udeladt.\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 fil der ikke var et billede sprunget over.\n"
+msgstr[1] "%d filer der ikke var billeder sprunget over.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 billede udeladt på grund af brugerafbrydelse:\n"
+msgstr[1] "%d billeder udeladt på grund af brugerafbrydelse_\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video sprunget over på grund af brugeren annullerede:\n"
+msgstr[1] "%d videoer sprunget over på grund af brugeren annullerede:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 billede/video sprunget over på grund af brugeren annullerede:\n"
+msgstr[1] ""
+"%d billeder/videoer sprunget over på grund af brugeren annullerede:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 fil sprunget over pga. annulling fra brugeren:\n"
+msgstr[1] "%d filer sprunget over pga. annulling fra brugeren:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 billede importeret.\n"
+msgstr[1] "%d billeder importeret.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video importeret succesfuldt.\n"
+msgstr[1] "%d videoer importeret succesfuldt.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 billede/video importeret succesfuldt.\n"
+msgstr[1] "%d billeder/videoer importeret succesfuldt.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ingen billeder eller videoer importeret.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import færdig"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minutter"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d time"
+msgstr[1] "%d timer"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dag"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Omdøb hændelse"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Navn:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Rediger titel"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Slet fil"
+msgstr[1] "_Slet filer"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Fjern kun"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Fortryd ekstern redigering?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Fortryd eksterne redigeringer?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "Dette vil ødelægge alle forandringer i den eksterne fil. Fortsæt?"
+msgstr[1] "Dette vil ødelægge alle forandringer i %d eksterne filer. Fortsæt?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Omg_ør eksterne editeringer"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "For_tryd eksterne redigeringer"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Dette vil fjerne billedet fra biblioteket. Fortsæt?"
+msgstr[1] "Dette vil fjerne %d billeder fra biblioteket. Fortsæt?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Fjern"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Fjerner billeder fra biblioteket"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Fjern billeder fra bibliotek"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 t."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Flyt billeder/videoer på samme måde"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Sæt _alle billeder til denne tid"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Ændr oprindelige filer"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifiser originale filer"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Oprindelig: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Belysningstidspunkt vil blive flyttet fremad med\n"
+"%d %s, %d %s, %d %s, og %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Belysningstidspunkt vil blive flyttet tilbage med\n"
+"%d %s, %d %s, %d %s, og %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dage"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "time"
+msgstr[1] "timer"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minutter"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekund"
+msgstr[1] "sekunder"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Og 1 anden."
+msgstr[1] ""
+"\n"
+"\n"
+"Og %d andre."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Mærker (adskilt af kommaer):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Velkommen!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Velkommen til Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "For at komme i gang importeres billeder på en af følgende måder:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Vælg <span weight=\"bold\">Import af fil %s fra mappe</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Træk og slip billeder i Shotwellvinduet"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Forbind et kamera til din computer og importer"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importer billeder fra din mappe %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Du kan også importere billeder på en af følgende måder:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Vis ikke denne besked igen"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importér billeder fra dit %s-bibliotek"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Hjælp)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "År%småned%sdag"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "År%småned"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "År%småned-dag"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "År-måned-dag"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Tilpasset"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Ugyldigt mønster"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell kan kopiere billederne ind i din biblioteksmappe eller det kan "
+"importere dem uden at kopiere."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_pier billeder"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importer uden at kopiere"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importer til bibliotek"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Fjern fra biblioteket"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Fjerner billeder fra biblioteket"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Fjernelse billeder fra bibliotek"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne %d billede/video fra dit Shotwell biblioteket. Vil du også "
+"flytte filen til papirkurven?\n"
+"\n"
+"Denne handling kan ikke fortrydes."
+msgstr[1] ""
+"Dette vil fjerne %d billederne/videoerne fra dit Shotwell biblioteket. Vil "
+"du også flytte filerne til papirkurven?\n"
+"\n"
+"Denne handling kan ikke fortrydes."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne video fra dit Shotwell-bibliotek. Ønsker du også at flytte "
+"filerne til dit skrivebords affaldskurv?\n"
+"\n"
+"Denne handling kan ikke omgøres."
+msgstr[1] ""
+"Dette vil fjerne %d videoer fra dit Shotwell-bibliotek. Ønsker du også at "
+"flytte filerne til dit skrivebords affaldskurv?\n"
+"\n"
+"Denne handling kan ikke omgøres."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne billedet fra dit Shotwellbibliotek. Ønsker du også at "
+"flytte filen til skraldespanden?\n"
+"\n"
+"Denne handling kan ikke fortrydes."
+msgstr[1] ""
+"Dette vil fjerne %d billeder fra dit Shotwellbibliotek. Ønsker du også at "
+"flytte filerne til skraldespanden?\n"
+"\n"
+"Denne handling kan ikke fortrydes."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"1 foto/video kan ikke flyttes til dit skrivebords affaldskurv. Slet disse "
+"filer?"
+msgstr[1] ""
+"%d fotos/videoer kan ikke flyttes til dit skrivebords affaldskurv. Slet "
+"disse filer?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Billedet eller videoen kan ikke slettes."
+msgstr[1] "%d billeder/videoer kan ikke slettes."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Mærker"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Succes"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Filfejl"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Kunne ikke afkode fil"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Databasefejl"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Bruger afbrød import"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ikke en fil"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Fil findes allerede i database"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Filformat ikke understøttet"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ikke en billedfil"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Diskfejl"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk fuld"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamerafejl"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Filskrivningsfejl"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Import mislykkedes (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "forandret"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Forrige billede"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Næste billede"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Kildefil for billede mangler: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Vis"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Værktøjer"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Forrige billede"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Forrige billede"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Næste billede"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Næste billede"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Zoom _ind"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Øg forstørrelsen af billedet"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Zoom _ud"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Formindsk forstørrelsen af billedet"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Tilpas _side"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoom billedet så det passer til skærmen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100 %"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zoom billedet til 100 %"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200 %"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zoom billedet til 200 %"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Udvikler"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Kunne ikke eksportere %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Databasen %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Import fra %s kan ikke fortsætte, fordi der opstod en fejl:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"For at forsøge at importere fra en anden tjeneste, så vælg én fra menuen "
+"ovenfor."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Data-importer"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Database-fil:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importer"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importér fra program"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importér medie _fra:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Luk"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Opsætning"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diasshow"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Tilbage"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Gå til det forrige billede"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pause"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Sæt diasshow på pause"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Næste"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Gå til det næste billede"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Ændr diasshowopsætning"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Alle billedkildefiler mangler."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Afspil"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Fortsæt diasshowet"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Forkaster"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Fortryder forkastelse"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Gør skarpere"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Fortryder gør skarpere"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Opretter ny hændelse"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Fjerner hændelse"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Flytter billeder til ny hændelse"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Angiv billeder til forrige hændelse"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Fletter"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Fjerner fletning"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplikerer billeder"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Fjerner duplikerede billeder"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kunne ikke duplikere et billede på grund af en filfejl"
+msgstr[1] "Kunne ikke duplikere %d billeder på grund af filfejl"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Gendanner forrige bedømmelse"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Højere bedømmelser"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Mindre bedømmelser"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Angiver RAW-udvikler"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Gendanner forrige RAW-udvikler"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Angiv udvikler"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Originalt billede kunne ikke justeres."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Justerer dato og tid"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Fjerner justering af dato og tid"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Et oprindeligt billede kunne ikke justeres."
+msgstr[1] "De følgende oprindelige billeder kunne ikke justeres."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Fejl ved tidsjustering"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Tidsjustering kunne ikke fortrydes på den følgende billedfil."
+msgstr[1] "Tidsjusteringer kunne ikke fortrydes på de følgende billedfiler."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Opret mærke"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Flyt mærket \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Flyt billeder til skraldespanden"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Genopret billeder fra skraldespanden"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Flyt billeder til Shotwell skraldespanden"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Genopret billederne tilbage i Shotwellbiblioteket"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Flytter billeder til skraldespanden"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Genopret billeder fra skraldespanden"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marker disse billder"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Fjern markering fra disse billeder"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Sæt mærke"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Fjern mærke"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Lav (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Mellem (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Høj (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksimum (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Ingen fotos/videoer"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Fandt ingen fotos/videoer"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Billeder kan ikke blive eksporteret til denne mappe."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Kan ikke behandle overvågningsopdateringer: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Udfyld hele siden"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 billeder per side"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 billeder per side"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 billeder per side"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 billeder per side"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 billeder per side"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 billeder per side"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "tommer"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Pengepung (2 x 3 tommer)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notekort (3 x 5 tommer)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 tommer"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 tommer"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 tommer"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 tommer"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 tommer"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrisk tegnebog (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postkort (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Billedopsætning"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Udskriver..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Kunne ikke udskrive billede:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Ikke i stand til at åbne/oprette fotodatabase %s: fejlkode %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr "Kan ikke skrive til foto databasefil:%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Fejl med at få tilgang til databasefil:\n"
+"%s \n"
+"\n"
+"Fejl var:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Eksporter Videoer"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Kan ikke starte Nautilus Send-til: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Send til"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Kan ikke eksportere baggrund til %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Ikke i stand til at forberede desktop slideshow: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Markeret"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Skraldespanden"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Affaldskurv er tom"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Slet"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Sletter billeder"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Manglende filer"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Sletter..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Sidste import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importer fra mappe..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importer billeder fra harddisken til biblioteket"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importér fra progr_am..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sorter _hændelser"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Tøm sk_raldespanden"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Slet alle billeder i skraldespanden"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Se begive_nhed for billede"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Find"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Find fotos og videoer med søgekriterier"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fil"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Rediger"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Billede"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Billeder"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Hændelser"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Mærker"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hjælp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Grundlæggende information"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Vis grundlæggende information for markeringen"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Udvidet information"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Vis udvidet information for markeringen"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Søgebjælke"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Vis søgebjælken"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Stigende"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sorter billeder i stigende orden"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Faldende"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sorter billeder i faldende orden"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importer fra mappe"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Tøm skraldespanden"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Tømmer skraldespanden..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell er konfigureret til at importere billeder til din hjemmefolder.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Bibliotekets placering"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Biller kan ikke blive importeret fra denne mappe."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Opdaterer bibliotek ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Forbereder auto-import af billeder..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Auto-importerer billeder..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Skriver metadata til filer..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliotek"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importerer..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Stop import"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Stop importering af billeder"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Forbereder til at importere ..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importerede %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Gem"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Gem billede"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Gem _som..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Gem billede med et andet navn"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Udskriv billedet til en printer forbundet med din computer"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s findes ikke."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s er ikke en fil."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s understøtter ikke filformatet for\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Gem en kopi"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Mist ændringer til %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Luk _uden at gemme"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Fejl under gemning til %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Gem som"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Ikke muligt at overvåge %s: Ikke et katalog (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Billedhåndtering"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Billedvisning"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Roter mod _højre"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Roter"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Roter mod højre"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Roter billeder til højre (tryk på Ctrl for at rotere til venstre)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Roter mod _venstre"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Roter mod venstre"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Roter billederne mod venstre"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Vend _vandret"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Vend vandret"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Vend _lodret"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Vend lodret"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Gør skarpere"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Gør skarpere"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatisk forbedring af billedets fremtoning"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Besk_ær"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Beskær"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Beskær billedets størrelse"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Ud_jævn"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Udjævn"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Udjævn billedet"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Rødøje"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Rødøje"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reducer eller eliminer rødøjeeffekter i billedet"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Juster"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Juster"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Juster billedets farve og tone"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Gendan til oprindelig"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Gendan til oprindelig"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Gendan eksterne e_diteringer"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Gendan til det oprindelige billede"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Angiv som skrivebords_baggrund"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Angiv det valgte billede som den nye skrivebordsbaggrund"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Sæt som _Desktop Slideshow..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Genskab"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Genskab"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Omgør"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Omgør"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Omdøb hændelse..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Gør til _nøglebillede for hændelse"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Gør til nøglebillede for hændelse"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Ny hændelse"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Ny hændelse"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Flyt billeder"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Flyt billeder til en hændelse"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Flet hændelser"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Flet"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Kombinér begivenheder til én samlet begivenhed"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Angiv bedømmelse"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Angiv bedømmelse"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Ændr bedømmelsen på dit billede"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Øg"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Øg bedømmelse"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Formindsk"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Formindsk bedømmelse"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Uden bedømmelse"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "uden karakter"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Bedøm ej bedømte"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Angiver som ej bedømt"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Fjern alle bedømmelser"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Afvist"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Afvist"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Bedømmelse afvist"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Angiver som afvist"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Angiv bedømmelse som afvist"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Kun _afviste"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Kun afviste"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Vis kun afviste billeder"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Alle + _afviste"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Vis alle billeder, inklusive afviste"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Alle billeder"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Vis alle billeder"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Bedømmelser"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Vis hvert billedes bedømmelse"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrer billeder"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrer billeder"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Begræns antallet af viste billeder baseret på et filter"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Dupliker"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Dupliker"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Lav en duplikat af billedet"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Eksporterer..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Udskriv..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Ud_giv..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Udgiv"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Udgiv til forskellige hjemmesider"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Redigér _title..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Juster dato og tid..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Juster dato og tid"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Tilføj _mærker..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Tilføj mærker..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Tilføj mærker"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Indstillinger"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Åbn med e_kstern redigering"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Åbn med RA_W-redigeringsprogram"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Send _til..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Send t_il..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Find..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Find"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Find et billede ved at indtaste tekst som indgår i navnet eller mærkerne"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marker"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Fjern markering"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Kan ikke starte redigeringsprogram: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Tilføj mærke »%s«"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Tilføj mærker »%s« og »%s«"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Slet mærke »%s«"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Slet mærke »%s«"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Slet mærke"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nyt"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Omdøb mærke »%s«..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Omdøb mærke »%s« til »%s«"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Omdøb..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Ændre mærker..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Ændre mærker"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Mærk billeder som »%s«"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Mærk billede som \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Mærk de valgte billeder som »%s«"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Mærk de udvalgte billeder som \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Fjern mærke »%s« fra billeder"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "_Fjern mærke \"%s\" fra billeder"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Fjern mærke »%s« fra billeder"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Fjern mærke \"%s\" fra billeder"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Kunne ikke omdøbe mærke til »%s« da mærket allerede findes."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Ikke i stand til at forandre navn til \"%s\" fordi søgningen allerede "
+"eksisterer"
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Gemt søgning"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Slet søgning"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "R_edigér..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Om_døb..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Fora_ndre navn af søgning \"%s\" til \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Slet søgning \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Bedøm %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Angiv bedømmelse til %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Angiver bedømmelse for %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Vis %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Vis kun billeder med en bedømmelse på %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s eller bedre"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Vis %s eller bedre"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Vis kun billeder med en bedømmelse på %s eller bedre"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Fjern de valgte billeder fra skraldespanden"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Flyt de valgte billeder fra biblioteket"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Nulstil"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Flyt de valgte billeder tilbage til biblioteket"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Vis i _filhåndteringen"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Åbn mappen for det valgte billede i et filhåndteringsprogram"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Kan ikke åbne i filhåndteringsprogram: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Fj_ern fra biblioteket"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Flyt til papirkurven"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Vælg _alle"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Vælg alle punkter"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b. %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Vinkel:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Nulstil"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Gendan aktuelle billeddimensioner"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Angiv beskæring på dette billede"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Drej beskæringsrektanglen mellem stående og liggende"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Ubegrænset"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Firkant"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Skærm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Oprindelig størrelse"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD-video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD-video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Luk værktøjet til rødøje"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Fjern alle rødøjeeffekter i det valgte område"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Mætning:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Nuance:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Skygger:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Nulstil farver"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Nulstil alle farvejusteringer til oprindelige farver"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Nuance"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Mætning"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Belysning"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Skygger"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastudvidelse"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Opsæt værktøjsbjælke"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Opsæt værktøjsbjælken åben"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Forlad fuldskærm"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Forlad _fuldskærm"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Afslut"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Om"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Fuldskærm"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Indhold"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "O_ftest stillede spørgsmål"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Rapportér et problem..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"En fatal fejl opstod under adgang til Shotwells bibliotek. Shotwell kan ikke "
+"fortsætte.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Besøg Yorbas hjemmeside"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Joe Hansen <joedalton2@yahoo.dk>\n"
+"Johannes Wilm <mail@johanneswilm.org>\n"
+"Aputsiaq Janussen <aj@isit.gl>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Kan ikke vise hjælp: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Kan ikke navigere til fejldatase: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Ikke i stand til at vise OSS: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "unavngivet"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Oprindelig størrelse"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Bredde eller højde"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Bredde"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Højde"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Juster størrelsen på miniaturebillederne"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Vis større miniaturebiller"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Vis mindre miniaturebilleder"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Sorter _billeder"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Afspil video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Åbn de valgte videoer i systemets videoafspiller"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Vis mærker på hvert billede"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Efter _titel"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Sorter billeder efter titel"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Efter _belysningsdato"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Sorter billeder efter belysningsdato"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Efter _bedømmelse"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Sorter billeder efter bedømmelse"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell var ude af stand til at afspille den valgte video:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Foto/Video"
+msgstr[1] "%d Fotos/Videoer"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Ingen begivenheder"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Ingen fundne begivenheder"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Hændelser"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Uden dato"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ingen begivenhed"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Kan ikke oprette mellemlager-mappen %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Det var ikke muligt at lave data mappen %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Billeder"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Det var ikke muligt at lave den temporære mappe %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Det var ikke muligt at lave data undermappen %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ingen)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ingen"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Overgang for diasshow"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Ikke i stand til at generere en midlertidig fil for %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Eksporterer"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Fil %s findes allerede. Overskriv?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Udelad"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Overskriv"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Overskriv _alle"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Eksporter"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Billeder"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videoer"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-fotos"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-fotos"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Fejl under indlæsning af brugerflade-fil: %s %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Type"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Udgivelse"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "De valgte billeder/videoer blev publiseret succesfuldt."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "De valgte videoer blev publiseret succesfuldt."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "De valgte billeder blev udgivet."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Den valgte video blev udgivet med succes."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Det valgte foto blev udgivet med succes."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Indhenter kontoinformation..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Logger ind..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Udgiv billeder"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Udgiv billeder _til:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publiser videoer"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publiser videoer _til"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publiser billeder og videoer"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publiser billeder og videoer _til"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Ikke i stand til at publicere"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Forbereder til upload"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Uploader %d af %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Udgivelse til %s kan ikke fortsætte, da fejl opstod:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"For at forsøge udgivelse til en anden tjeneste, vælges en fra ovenstående "
+"menu."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nyt _mærket..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"En midlertidig fil som er nødvendig for publisering er ikke tilgængelig"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Du er ikke logget ind YouTube. \n"
+"\n"
+"Du må allerede have åbnet en Google-konto og sat den op til brug med YouTube "
+"for at kunne fortsætte. Du kan sætte de fleste konti op ved hjælp af at "
+"logge ind på YouTube-webstedet mindst en gang med din browser."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"En fil som kræves for at udgive mangler. Udgivelse til Youtube kan ikke "
+"fortsætte."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Du er logget ind på YouTube som %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videoer vil blive vist i '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Vises offentligt"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Vises ikke offentligt"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Kernetjenester til udgivelse"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har allerede logget ind og ud af Flickr i denne Shotwellsession.\n"
+"For at udgive på Flickr igen så afslut og genstart Shotwell, prøv så at "
+"udgive igen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Forbereder på logind..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"En fil som kræves for at udgive mangler. Udgivelse til Flickr kan ikke "
+"fortsætte."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Bekræfter autorisation..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Du er logget på Flickr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Din frie Flickrkonto begrænser hvor mange data du kan overføre per måned.\n"
+"Denne måned har du %d megabyte tilbage i din overførselskvota."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Din Flickr Pro-konto giver dig ubegrænset overførsel."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Billeder _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videoer _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Billeder og videoer _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Alle"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Kun venner & familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Kun familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Kun venner"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Bare mig"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 billedpunkter"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 billedpunkter"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 billedpunkter"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 billedpunkter"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Opretter albummet %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Brugernavn og/eller adgangskode er ugyldig. Prøv venligst igen"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Ugyldig URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Ugyldigt brugernavn eller adgangskode"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratorer, familie, venner, kontakter"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratorer, familie, venner"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratorer, familie"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratorer"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Opretter album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Du er logget på Picasas internetalbum som %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video vil blive vist i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Billeder vil blive vist i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Lille (640 x 480 billedpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mellem (1024 x 768 billedpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Anbefalet (1600 x 1200 billedpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 billedpunkter)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Du er i øjeblikket ikke logget ind på Facebook.\n"
+"\n"
+"Hvis du endnu ikke har en Facebookkonto, kan du oprette en under "
+"logindprocessen. Under logind, kan det være at Shotwell Connect spørger dig "
+"om tilladelse til at overføre billeder og udgive i din nyhedskilde. Disse "
+"rettigheder er nødvendige for at Shotwell Connect skal kunne fungere."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har allerede logget dig ind og ud af Facebook i denne Shotwellsession.\n"
+"For at udgive på Facebook igen så afslut og genstart Shotwell, forsøg så "
+"udgivelse igen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 billedpunkter)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Stor (2048 billedpunkter)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Tester forbindelse til Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"En fil som kræves for at udgive mangler. Udgivelse til Facebook kan ikke "
+"fortsætte."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Du er logget ind på Facebook som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Hvor vil du gerne publisere de valgte billeder?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Overførselsstørrelse:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Smuldre"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Kerneovergange i diasshow"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Dias"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Falme"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Kerne-tjenester til dataimport"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Vælg manuelt en F-Spot-database som skal importeres:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Kan ikke åbne den valgte F-Spot-databasefil: filen findes ikke eller er ikke "
+"en F-Spot-database"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Kan ikke åbne den valgte F-Spot-databasefil: denne version af F-Spot-"
+"databasen understøttes ikke af Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Kan ikke læse den valgte F-Spot-databasefil: fejl under læsning af tags-tabel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Kan ikke læse den valgte F-Spot-databasefil: fejl under læsning af photos-"
+"tabel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot-bibliotek: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Forbereder import"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Sæt som diasshow på skrivebord"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Fremstil diasshow til skrivebordets baggrund"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Vis hvert foto i"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "tidsrum"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Det tidsrum som hvert foto vises på skrivebordets baggrund"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Søgning"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "Søgningens _navn:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Find tilsvarende"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "af følgende:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Brug en _standardstørrelse:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Brug en _tilpasset størrelse:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Afbalancer dimensionsforhold for billede"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Auto-størrelse:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Udskriv billed_titel"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Send billede til:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "billedpunkter per tomme"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etikette"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell Præferancer"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "hvid"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "sort"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Overvåg bibliotekskataloger for nye filer"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Skriv mærker, titler og anden metadata til fotofiler"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Fremvisning"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importer billeder til:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Baggrund:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importerer"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Katalogstruktur:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "Mønster"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Eksempel:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Omdøb importerede filer til minuskler"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-udvikler"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "S_tandard:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_kstern billedbehandlingsprogram:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Ekstern _RAW editor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Eksterne Editorer"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Udvidelsesmoduler"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "Forsinkelse:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Overgangseffekt:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Forsinkelse i overgang:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Vis t_itel"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekunder"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Log ind"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Udgiv til et eks_isterende album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Opret et _nyt album med navnet:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videoer og nye fotoalbum _synlig for:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Log ud"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Udgiv"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Billedstørrelse:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Et _eksisterende album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Et _nyt album med navnet:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "V_is album i offentlig galleri"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Standardstørrelse på billede:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Video-ind_stilinger for privatliv:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Du er ikke logget ind til Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..edabf00
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,4676 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2013
+# Christian <Christian.Kirbach@googlemail.com>, 2011
+# Christoph Brill <egore911@googlemail.com>, 2013
+# jonasbb <eberhardtjonas@aol.com>, 2011, 2012
+# Eduard Gotwig <eduardgotwig@gmail.com>, 2012
+# filmor <filmor@gmail.com>, 2011
+# Henne91 <Hendrik.Knackstedt@t-online.de>, 2011-2012
+# Hendrik Richter <hendrikr@gnome.org>, 2011
+# hpeters <hpeters@redhat.com>, 2013
+# Jan-Christoph Borchardt <hey@jancborchardt.net>, 2011
+# JavaJens <javajens@gmail.com>, 2013
+# <johanneswilm@gmail.com>, 2011
+# johanneswilm <johanneswilm@gmail.com>, 2011
+# juko <juko@kofler.bz.it>, 2011
+# Konstantin Weitz <>, 2012
+# informatikus <lennart.vn@gmail.com>, 2012
+# fmms <mail@felixmoeller.de>, 2013
+# marc86 <schuetz.marc@gmx.de>, 2013
+# Martin Weißhaupt <mweisshaupt1988@googlemail.com>, 2011
+# Peter Pall <gunter@peterpall.de>, 2011
+# Rainer <rgromans@redhat.com>, 2013
+# verayin <vera@yorba.org>, 2011
+# Alexander Wilms <f.alexander.wilms@googlemail.com>, 2012
+# jonasbb <eberhardtjonas@aol.com>, 2011, 2012
+# Eduard Gotwig <eduardgotwig@gmail.com>, 2012
+# Henne91 <Hendrik.Knackstedt@t-online.de>, 2012
+# Jan-Christoph Borchardt <hey@jancborchardt.net>, 2011
+# Hendrik91 <kn.hendrik@gmail.com>, 2012
+# informatikus <lennart.vn@gmail.com>, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+# Typhon <raubkatze91@web.de>, 2012
+# Thomas Zach <sabaot.f@gmail.com>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-24 09:00+0000\n"
+"Last-Translator: Christoph Brill <egore911@googlemail.com>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/shotwell/language/"
+"de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Ereignis %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameras"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Das Kameramedium kann nicht ausgehängt werden. Versuchen Sie es bitte über "
+"die Dateiverwaltung."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Bereits importierte Fotos verbergen"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Nur Fotos zeigen, die noch nicht importiert wurden"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Beginne Import, bitte warten..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titel"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Titel jedes Fotos anzeigen"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "A_usgewählte importieren"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Die ausgewählten Bilder in die Bibliothek importieren"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_Alle importieren"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Alle Fotos in die Bibliothek importieren"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell muss die Kamera aus dem Dateisystem aushängen, um auf sie zugreifen "
+"zu können. Möchten Sie fortsetzen?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Aushängen"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Bitte hängen Sie die Kamera aus."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Die Kamera ist von einer anderen Anwendung reserviert. Shotwell kann nur auf "
+"die Kamera zugreifen, wenn sie frei ist. Bitte schließen Sie die andere "
+"Anwendung und versuchen Sie es nochmals."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"Bitte schließen Sie alle anderen Anwendungen, die die Kamera verwenden."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Es können keine Vorschaubilder von der Kamera abgerufen werden:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Aushängen läuft …"
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Foto-Information werden abgerufen"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Vorschaubild für %s wird abgerufen"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kamera kann nicht reserviert werden: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Soll dieses Foto von der Kamera gelöscht werden?"
+msgstr[1] "Sollen diese %d Fotos von der Kamera gelöscht werden?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Soll dieses Video von der Kamera gelöscht werden?"
+msgstr[1] "Sollen diese %d Videos von der Kamera gelöscht werden?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Soll dieses Foto/Video von der Kamera gelöscht werden?"
+msgstr[1] "Sollen diese %d Fotos/Videos von der Kamera gelöscht werden?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Sollen diese Dateien von der Kamera gelöscht werden?"
+msgstr[1] "Sollen diese %d Dateien von der Kamera gelöscht werden?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Behalten"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fotos/Videos werden von der Kamera entfernt"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"%d Foto/Video kann wegen Fehlern nicht von der Kamera gelöscht werden."
+msgstr[1] ""
+"%d Fotos/Videos können wegen Fehlern nicht von der Kamera gelöscht werden."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diaschau"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Eine Diaschau anzeigen"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Foto/Video exportieren"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Fotos/Videos exportieren"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Foto exportieren"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Fotos exportieren"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Drehen läuft"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Drehen wird zurück genommen"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Horizontal spiegeln"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "»Horizontal spiegeln« wird zurück genommen"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vertikal spiegeln"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "»Vertikal spiegeln« wird zurück genommen"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Beliebiger Text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tag"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Ereignisname"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Dateiname"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Medientyp"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Kennzeichnungsstatus"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Status des Foto"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Bewertung"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datum"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "enthält"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "entspricht genau"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "beginnt mit"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "endet auf"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "enthält nicht"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ist nicht gesetzt"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "ist"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ist nicht"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "beliebiges Foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ein RAW-Foto"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ein Video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "hat"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "hat nicht"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "Modifizierungen"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "Interne Bearbeitungen"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "Externe Bearbeitungen"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "Gekennzeichnet"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "Nicht gekennzeichnet"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "und höher"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "nur"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "und niedriger"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "ist nach"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "ist bevor"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ist zwischen"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "und"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "beliebig"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alle"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "keine"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchen"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Neue gespeicherte Suche..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Die Datenbank für die Foto-Bibliothek ist nicht mit dieser Version von "
+"Shotwell kompatibel. Es sieht so aus, als wäre sie von Shotwell %s (Schema "
+"%d) erzeugt worden. Dies ist Version %s (Schema %d). Bitte verwenden Sie die "
+"neueste Shotwell-Version."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell konnte ihre Foto-Bibliothek nicht von Version %s (Schema %d) zu %s "
+"(Schema %d) aktualisieren. Schauen Sie bitte für weitere Informationen in "
+"das Shotwell-Wiki unter %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Die Datenbank für die Foto-Bibliothek ist nicht mit dieser Version von "
+"Shotwell kompatibel. Es sieht so aus, als wäre sie von Shotwell %s (Schema "
+"%d) erzeugt worden. Dies ist Shotwell-Version %s (Schema %d). Bitte säubern "
+"Sie Ihre Bibliothek durch Löschen von %s und erneutem Import Ihrer Fotos."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Unbekannter Fehler bei der Überprüfung von Shotwells Datenbank: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell wird geladen"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Pfad zu Shotwell's Verwaltungsinformation"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "Verzeichnis"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Bibliothek nicht auf laufend auf Verändungen"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Fortschrittsbalken beim Start nicht anzeigen"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Versionsnummer anzeigen"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[DATEI]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Führen Sie »%s --help« aus, um eine vollständige Liste von möglichen "
+"Befehlszeilenoptionen zu erhalten.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Heute"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Gestern"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Einträge:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d Ereignis"
+msgstr[1] "%d Ereignisse"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Foto"
+msgstr[1] "%d Fotos"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d Film"
+msgstr[1] "%d Filme"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Zeit:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Von:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Bis:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Größe:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f Sekunden"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Entwickler:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Belichtung:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Ort:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Dateigröße:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Aktuelle Entwicklung:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Ursprüngliche Größe:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kamerahersteller:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kameramodell:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blitz:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Brennweite:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Aufnahmedatum:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Belichtungszeit:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Manuelle Belichtungskorrektur:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS Breitengrad:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS Längengrad:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Künstler:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Erweiterte Informationen"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Dies wird den Tag »%s« von einem Foto entfernen. Fortsetzen?"
+msgstr[1] "Dies wird den Tag »%s« von %d Fotos entfernen. Fortsetzen?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Abbrechen"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Löschen"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+"Hiermit wird die gespeicherte Suche »%s« entfernt. Soll fortgesetzt werden?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Durch das Wechseln des Entwicklers gehen alle Änderungen verloren, die Sie "
+"an diesem Foto in Shotwell vorgenommen haben."
+msgstr[1] ""
+"Durch das Wechseln des Entwicklers gehen alle Änderungen verloren, die Sie "
+"an diesen Fotos in Shotwell vorgenommen haben."
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "Entwickler _wechseln"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Video exportieren"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell konnte keine Datei zur Bearbeitung dieses Fotos erstellen, weil Sie "
+"keine Berechtigung haben, um auf %s zu schreiben."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Kann das Foto wegen eines Dateifehlers nicht exportieren.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"Möchten Sie mit dem Exportieren fortfahren?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "For_tsetzen"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Unverändert"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Aktuell"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualität:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skalierungsbeschränkung:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_Pixel"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Metadaten speichern"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "speichere Details"
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Details speichern"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(und %d andere)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Import Ergebnisse anzeigen"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d Datei zu importieren versucht."
+msgstr[1] "%d Dateien zu importieren versucht."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Davon wurde %d Datei erfolgreich importiert."
+msgstr[1] "Davon wurden %d Dateien erfolgreich importiert."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplikate wurden nicht importiert:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "dupliziert bestehendes Medienelement"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Fotos/Videos wurden aufgrund Kamera-Fehlern nicht importiert:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "Fehlermeldung:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Diese Dateien wurden nicht importiert da Sie nicht als Foto oder Video "
+"erkannt wurden:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Dateien wurden nicht importiert da Sie nicht in einem mit Shotwell "
+"kompatiblem Format vorliegen:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Dateien wurden nicht importiert da Sie nicht in die Bibliothek kopiert "
+"werden konnten:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr "konnte %s⏎ » nicht nach %s kopieren"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Fotos/Videos konnten nicht importiert werden da sie korrupt erscheinen"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Foto/Videos wurden aus anderen Gründen nicht importiert:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 Duplikat des Fotos wurde nicht importiert:\n"
+msgstr[1] "%d Duplikate des Fotos wurden nicht importiert:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 Duplikat des Videos wurde nicht importiert:\n"
+msgstr[1] "%d Duplikate des Videos wurden nicht importiert:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 Duplikat des Fotos/Videos wurde nicht importiert:\n"
+msgstr[1] "%d Duplikate der Fotos/Videos wurden nicht importiert:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ein Foto konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Fotos konnten wegen Datei- oder Hardwarefehlern nicht importiert werden.\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ein Video konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Videos konnten wegen Datei- oder Hardwarefehlern nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ein Foto/Video konnte wegen eines Datei- oder Hardwarefehlers nicht "
+"importiert werden.\n"
+msgstr[1] ""
+"%d Fotos/Videos konnten wegen Datei- oder Hardwarefehlern nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Eine Datei konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Dateien konnten wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 Foto wurden nicht importiert, weil der Ordner mit der Foto-Bibliothek "
+"nicht beschreibbar ist:\n"
+msgstr[1] ""
+"%d Fotos wurden nicht importiert, weil der Ordner der Foto-Bibliothek nicht "
+"beschreibbar ist:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 Videos wurden nicht importiert, weil der Foto-Bibliothek Ordner nicht "
+"beschreibbar ist:\n"
+msgstr[1] ""
+"%d Videos wurden nicht importiert, weil der Foto-Bibliothek Ordner nicht "
+"beschreibbar ist:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 Fotos/Videos wurden nicht importiert, weil der Foto-Bibliothek Ordner "
+"nicht beschreibbar ist:\n"
+msgstr[1] ""
+"%d Fotos/Videos wurden nicht importiert, weil der Foto-Bibliothek Ordner "
+"nicht beschreibbar ist:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 Datei wurde nicht importiert, weil der Ordner mit der Foto-Bibliothek "
+"nicht beschreibbar ist:\n"
+msgstr[1] ""
+"%d Dateien wurden nicht importiert, weil der Ordner mit der Foto-Bibliothek "
+"nicht beschreibbar ist:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ein Foto konnte wegen eines Kamerafehlers nicht importiert werden.\n"
+msgstr[1] ""
+"%d Fotos konnten wegen eines Kamerafehlers nicht importiert werden.\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ein Video konnte wegen eines Kamerafehlers nicht importiert werden.\n"
+msgstr[1] ""
+"%d Videos konnten wegen eines Kamerafehlers nicht importiert werden.\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ein Foto/Video konnte wegen eines Kamerafehlers nicht importiert werden.\n"
+msgstr[1] ""
+"%d Fotos/Videos konnten wegen eines Kamerafehlers nicht importiert werden.\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ein Datei konnte wegen eines Kamerafehlers nicht importiert werden:\n"
+msgstr[1] ""
+"%d Dateien konnte wegen eines Kamerafehlers nicht importiert werden:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Ein Foto konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Fotos konnten wegen Datei- oder Hardwarefehlern nicht importiert werden.\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Ein Video konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Videos konnten wegen Datei- oder Hardwarefehlern nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Ein Foto/Video konnte wegen eines Datei- oder Hardwarefehlers nicht "
+"importiert werden.\n"
+msgstr[1] ""
+"%d Fotos/Videos konnten wegen Datei- oder Hardwarefehlern nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+"Eine Datei konnte wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+msgstr[1] ""
+"%d Dateien konnten wegen eines Datei- oder Hardwarefehlers nicht importiert "
+"werden.\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Ein Foto mit nicht unterstütztem Format übersprungen. \n"
+msgstr[1] "%d Fotos mit nicht unterstütztem Format übersprungen. \n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Eine nicht-Bild Datei übersprungen.\n"
+msgstr[1] "%d nicht-Bild Dateien übersprungen.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Ein Foto wegen Abbruchs durch den Benutzer übersprungen.\n"
+msgstr[1] "%d Fotos wegen Abbruchs durch den Benutzer übersprungen.\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Ein Video wegen Abbruchs durch den Benutzer übersprungen.\n"
+msgstr[1] "%d Videos wegen Abbruchs durch den Benutzer übersprungen.\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Ein Foto/Video wegen Abbruchs durch den Benutzer übersprungen.\n"
+msgstr[1] "%d Fotos/Videos wegen Abbruchs durch den Benutzer übersprungen.\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Eine Datei wegen Abbruchs durch den Benutzer übersprungen.\n"
+msgstr[1] "%d Dateien wegen Abbruchs durch den Benutzer übersprungen.\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Ein Foto erfolgreich importiert.\n"
+msgstr[1] "%d Fotos erfolgreich importiert.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Ein Video erfolgreich importiert.\n"
+msgstr[1] "%d Videos erfolgreich importiert.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Ein Foto/Video erfolgreich importiert.\n"
+msgstr[1] "%d Fotos/Videos erfolgreich importiert.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Keine Fotos oder Videos importiert.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import abgeschlossen"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d Sekunde"
+msgstr[1] "%d Sekunden"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d Minute"
+msgstr[1] "%d Minuten"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 Tag"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Ereignis umbenennen"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Name:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Titel bearbeiten"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Bearbeite Kommentar des Ereignisses"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Datei löschen"
+msgstr[1] "_Dateien löschen"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Nur _entfernen"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Externe Veränderung zurücknehmen?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Externe Veränderungen zurücknehmen?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Dies wird alle Veränderungen der externen Datei zerstören. Fortfahren?"
+msgstr[1] ""
+"Dies wird alle Veränderungen der %d externen Dateien zerstören. Fortfahren?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Externe _Veränderung zurücknehmen"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Externe _Veränderungen zurücknehmen"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Dies wird das Foto aus der Bibliothek entfernen. Fortsetzen?"
+msgstr[1] "Dies wird %d Fotos aus der Bibliothek entfernen. Fortsetzen?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "Entfe_rnen"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Foto aus der Bibliothek entfernen"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Fotos aus der Bibliothek entfernen"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "Vormittag"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "Nachmittag"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Stunden"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Versetze Fotos/Videos gleich viel"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Setze Zeit für _alle Fotos/Videos"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Original Bilddatei _verändern"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Original Bilddateien _verändern"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Originale _Bearbeiten"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Verändere Originaldateien"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Ursprüngliche Größe:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Aufnahmezeit wird um \n"
+"%d %s, %d %s, %d %s, und %d %s nach vorne verlegt."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Aufnahmezeit wird um \n"
+"%d %s, %d %s, %d %s, und %d %s nach hinten verlegt."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "Sekunde"
+msgstr[1] "Sekunden"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Und %d andere."
+msgstr[1] ""
+"\n"
+"\n"
+"Und %d andere."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Tags (getrennt durch Kommas)"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Willkommen!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Willkommen zu Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Importieren Sie Fotos auf eine der folgenden Arten, um loszulegen:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Wählen Sie <span weight=\"bold\">Datei %s Aus Ordner importieren</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Verschieben Sie Fotos per Ziehen und Ablegen in das Shotwell-Fenster"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Verbinden Sie die Kamera mit Ihrem Computer und importieren Sie"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Fotos aus dem Ordner »%s« _importieren"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Sie können Fotos auch auf eine der folgenden Weisen importieren:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Diese Meldung nicht noch einmal _zeigen"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importiere Bilder aus der %s Bibliothek"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Hilfe)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Jahr%sMonat%sTag"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Jahr%sMonat"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Jahr%sMonat-Tag"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Jahr-Monat-Tag"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Ungültiges Muster"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell kann die Fotos aus dem Ordner in die Bibliothek kopieren oder sie "
+"können verlinkt werden, ohne sie zu kopieren."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Fotos ko_pieren"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Import durch Verlinken"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "In Bibliothek importieren"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Aus Bibliothek entfernen"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Foto wird aus Bibliothek entfernt"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Fotos werden aus Bibliothek entfernt"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dies wird das ausgewählte Foto/Video aus der Shotwell-Bibliothek entfernen. "
+"Möchten Sie die Datei auch in den Müll verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+msgstr[1] ""
+"Dies wird %d Fotos/Videos aus der Shotwell Bibliothek-entfernen. Möchten Sie "
+"die Dateien auch in den Papierkorb verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dies wird das ausgewählte Video aus der Shotwell-Bibliothek entfernen.\n"
+"Möchten Sie die Datei auch in den Müll verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+msgstr[1] ""
+"Dies wird %d Videos aus der Shotwell-Bibliothek entfernen.\n"
+"Möchten Sie die Dateien auch in den Papierkorb verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dies wird das ausgewählte Foto aus der Shotwell-Bibliothek entfernen.\n"
+"Möchten Sie die Datei auch in den Müll verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+msgstr[1] ""
+"Dies wird %d Fotos aus der Shotwell-Bibliothek entfernen.\n"
+"Möchten Sie die Dateien auch in den Papierkorb verschieben?\n"
+"\n"
+"Diese Aktion kann nicht rückgängig gemacht werden!"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Das Foto oder Video konnte nicht in den Müll verschoben werden. Endgültig "
+"löschen?"
+msgstr[1] ""
+"%d Fotos/Videos konnten nicht in den Papierkorb verschoben werden. Endgültig "
+"löschen?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Das Foto oder Video kann nicht gelöscht werden."
+msgstr[1] "%d Fotos/Videos können nicht gelöscht werden."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Ordner"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Tags"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Erfolg"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Dateifehler"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Die Datei kann nicht dekodiert werden"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Datenbankfehler"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Importvorgang vom Benutzer abgebrochen"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Keine Datei"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Datei ist bereits in der Datenbank"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Dateiformat wird nicht unterstützt"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Keine Bilddatei"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Datenträgerfehler"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Datenträger voll"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamerafehler"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Datei-Schreibfehler"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Defekte Bilddatei"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Import fehlgeschlagen (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "verändert"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Voriges Foto"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Nächstes Foto"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Foto-Quelldatei fehlt: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Anzeigen"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Werkzeuge"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Voriges Foto"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Voriges Foto"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Nächstes Foto"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Nächstes Foto"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Ver_größern"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Die Ansicht vergrößern"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Ver_kleinern"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Die Ansicht verkleinern"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Auf S_eite einpassen"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Foto auf Bildschirmgröße anpassen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_100 % Vergrößerung"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Bild in normaler Größe anzeigen"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_200 % Vergrößerung"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Bild in doppelter Größe anzeigen"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Entwickler"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s kann nicht exportiert werden: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Datenbank"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Von %s kann nicht weiter importiert werden, da ein Fehler auftrat:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Um von einem anderen Dienst zu importieren, wähle einen aus dem Menü oben."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importieren"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Sie haben keine Datenimport-Plugins aktiviert.\n"
+"\n"
+"Um Importieren von Anwendungen nutzen zu können müssen sie mindestens ein "
+"Datenimport-Plugin aktiviert haben. Plugins können unter Einstellungen "
+"aktiviert werden."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Datenbank"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Import"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importieren von Anwendung"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importieren _von:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Schließen"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diaschau"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Zurück"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Zum vorherigen Foto"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pause"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Diaschau pausieren"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Nächstes"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Zum nächsten Foto"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Diaschau konfigurieren"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Es gibt keine Foto-Quelldateien."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Abspielen"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Diaschau fortsetzen"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Zurücknehmen läuft"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Zurücknehmen wird rückgängig gemacht"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Verbessern läuft"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Verbessern wird zurückgenommen"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Wende Farbumwandlung an"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Entferne Farbumwandlung"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Anlegen eines neuen Ereignisses"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Ereignis wird entfernt"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Fotos werden in neues Ereignis verschoben"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Fotos werden auf vorheriges Ereignis gesetzt"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Zusammenführen läuft"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Zusammenführung wird rückgängig gemacht"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Fotos werden dupliziert"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Duplizierte Fotos werden entfernt"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kann das Foto wegen eines Dateifehlers nicht duplizieren"
+msgstr[1] "Kann %d Fotos wegen Dateifehlern nicht duplizieren"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Vorhergehende Bewertung wiederherstellen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Bewertung erhöhen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Bewertung verringern"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW-Entwickler einstellen"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Vorherigen RAW-Entwickler wiederherstellen"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Wähle Entwickler"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Originalbild konnte nicht angepasst werden."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Datum und Zeit werden abgeglichen"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Datum- und Zeitanpassung werden rückgängig gemacht"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Ein Originalfoto konnte nicht angepasst werden."
+msgstr[1] "Die folgenden Originalfotos konnten nicht angepasst werden."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Fehler beim Zeitabgleich"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Zeitabgleich konnte für das folgende Foto nicht rückgängig gemacht werden."
+msgstr[1] ""
+"Zeitabgleich konnte für die folgenden Fotos nicht rückgängig gemacht werden."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Tag erstellen"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Verschiebe Tag \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Fotos in den Müll verschieben"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Fotos aus dem Müll wiederherstellen"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Fotos in den Shotwell-Müll verschieben"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Stelle die Fotos in der Shotwell Bibliothek wieder her"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Fotos in den Müll verschieben"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Fotos aus dem Müll wiederherstellen"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Ausgewählte Fotos markieren"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Markierung für die ausgewählten Fotos aufheben"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Markieren"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Markierung aufheben"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Niedrig (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Mittel (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Hoch (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximum (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Keine Fotos/Videos"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Keine Fotos/Videos gefunden"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotos können nicht in diesen Ordner exportiert werden."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Überwachungsaktualisierungen können nicht verarbeitet werden: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Die gesamte Seite füllen"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 Bilder pro Seite"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 Bilder pro Seite"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 Bilder pro Seite"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 Bilder pro Seite"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 Bilder pro Seite"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 Bilder pro Seite"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "Zoll"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Brieftasche (2 x 3 Zoll)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notizzettel (3 x 5 Zoll)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 Zoll"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 Zoll"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 Zoll"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 Zoll"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 Zoll"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrische Brieftasche (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postkarte (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Bildeinstellungen"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Drucken …"
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Das Foto kann nicht gedruckt werden:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Die Fotodatenbank %s kann wegen eines Dateifehlers nicht erstellt werden: "
+"Fehlernummer %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"In die Fotodatenbank-Datei kann nicht geschrieben werden:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Beim Zugriff die Datenbank-Datei:\n"
+" %s\n"
+"\n"
+"Der Fehler lautete:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Videos exportieren"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Senden-An kann nicht gestartet werden: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Senden an …"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Der Hintergrund kann nicht nach %s exportiert werden: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Die Arbeitsflächen-Diaschau kann nicht vorbereitet werden: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Markiert"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Müll"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Der Mülleimer ist leer"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Fotos werden gelöscht"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Fehlende Dateien"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Löschen läuft …"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Letzter Import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Aus Ordner _importieren …"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Fotos von der Festplatte in die Bibliothek importieren"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importieren von _Anwendung..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Ereignisse sortieren "
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Müll lee_ren"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Alle Fotos im Müll löschen"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Ereig_nis zum Foto anzeigen"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Suchen"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Fotos und Videos anhand von Suchkriterien finden"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Datei"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Foto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotos"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Ereignisse"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ta_gs"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hilfe"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Grundlegende Informationen"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Grundlegende Informationen über die Auswahl anzeigen"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Er_weiterte Informationen"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Erweiterte Informationen über die Auswahl anzeigen"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Suchleiste"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Suchleiste anzeigen"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "S_eitenleiste"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Seitenleiste anzeigen"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Aufsteigend"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Fotos in aufsteigender Reihenfolge sortieren"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "A_bsteigend"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Fotos in absteigender Reihenfolge sortieren"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Aus Ordner importieren"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Müll leeren"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Müll wird geleert …"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell ist so konfiguriert, dass es Fotos in Ihren persönlichen Ordner "
+"importiert.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Speicherort der Bibliothek"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Aus diesem Ordner können keine Fotos importiert werden."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Bibliothek wird aktualisiert …"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Automatischer Foto-Import wird vorbereitet …"
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Fotos werden automatisch importiert …"
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Metadaten werden in die Dateien geschrieben …"
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliothek"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Import läuft …"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Import _abbrechen"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Foto-Import abbrechen "
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Import wird vorbereitet …"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s importiert"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Speichern"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Foto speichern"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Speichern _unter …"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Foto unter einem anderen Namen speichern"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Foto auf einem Drucker drucken, der mit dem Computer verbunden ist"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s existiert nicht."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ist keine Datei."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s unterstützt das Dateiformat von\n"
+"%s nicht."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Eine Kopie _speichern"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Änderungen an %s verwerfen?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Schließen _ohne zu speichern"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Fehler beim Speichern als %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Speichern unter"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kann %s nicht überwachen: Ist kein Ordner (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotoverwaltung"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotobetrachter"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Nach _rechts drehen"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Drehen"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Nach rechts drehen"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Fotos nach rechts drehen (Strg zum Drehen nach links drücken)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Nach _links drehen"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Nach links drehen"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Fotos nach links drehen"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Hori_zontal spiegeln"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Horizontal spiegeln"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Verti_kal spiegeln"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Vertikal spiegeln"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Verbessern"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Verbessern"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatisch das Aussehen des Fotos verbessern"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Zus_chneiden"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Zuschneiden"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Größe des Fotos zuschneiden"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Au_srichten"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Ausrichten"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Bild begradigen"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Rote-Augen"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Rote-Augen Effekt"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Den Rote-Augen Effekt in diesem Foto vermindern oder beseitigen"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Anpassen"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Anpassen"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Farbe und Farbton des Fotos anpassen"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Zurück zum Original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Zurück zum Original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Externe Veränderungen widerrufen"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Zum Ursprungsbild zurückkehren"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Als Hintergrund_bild festlegen"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Das ausgewählte Bild als neues Hintergrundbild festlegen"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Als Hintergrundbild-Diaschau festlegen …"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Rückgängig"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Rückgängig"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Wiederholen"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Wiederholen"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Ereignis _umbenennen …"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Zum _Schlüsselfoto für dieses Ereignis machen"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Zum Schlüsselfoto für dieses Ereignis machen"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Neues Ereignis"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Neues Ereignis"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Fotos verschieben"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Fotos in ein Ereignis verschieben"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Ereignisse _zusammenführen"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Zusammenführen"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Kombiniere Ereignisse zu einem Einzelereignis."
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Bewerten"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Bewerten"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Bewertung des Fotos ändern"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Aufwerten"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Bewertung erhöhen"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "A_bwerten"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Bewertung absenken"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Nicht bewertet"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Nicht bewertet"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Bewertung entfernen"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Bewertung wird entfernt"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Alle Bewertungen entfernen"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "A_bgelehnt"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Abgelehnt"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Ablehnen"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Wird als abgelehnt bewertet"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Foto als abgelehnt bewerten"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Nur A_bgelehnte"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Nur Abgelehnte"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Nur abgelehnte Fotos zeigen"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Alle + A_bgelehnte"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Alle Fotos einschließlich abgelehnter anzeigen"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Alle Fotos"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Alle Fotos anzeigen"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Bewertungen"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Bewertung jedes Fotos anzeigen"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "Fotos _filtern"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Fotos filtern"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Angezeigte Fotos anhand eines Filter einschränken"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplizieren"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplizieren"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Duplikat dieses Fotos erstellen"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportieren …"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Drucken …"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Veröffentlichen …"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Veröffentlichen"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Das ausgewählte Foto auf verschiedenen Websites veröffentlichen"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "_Titel bearbeiten"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "_Kommentar bearbeiten..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Kommentar bearbeiten"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Bearbeite _Kommentar des Ereignisses"
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Datum und Zeit _anpassen …"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Datum und Zeit anpassen"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Tags hinzufügen …"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Tags hinzufügen..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Tags hinzufügen"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Einstellungen"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Mit e_xternen Editor öffnen"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Mit RA_W-Editor öffnen"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Senden an …"
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Senden _An"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Suchen …"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Suchen"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Ein Bild durch Eingabe von Text suchen, der im Namen oder in den Tags "
+"enthalten ist"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Markieren"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Markierung au_fheben"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Editor kann nicht gestartet werden: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Tag »%s« hinzufügen"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Tags »%s« und »%s« hinzufügen"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Tag »%s« _entfernen"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Tag »%s« entfernen"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Tag entfernen"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Neu"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Tag »%s« _umbenennen …"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Tag »%s« zu »%s« umbenennen"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Umbenennen"
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Tags _ändern …"
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Tags ändern"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Foto als »%s« taggen"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Fotos als »%s« taggen"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Ausgewähltes Foto als »%s« taggen"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Ausgewählte Fotos als »%s« taggen"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Tag »%s« von _Foto entfernen"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Tag »%s« von _Fotos entfernen"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Tag »%s« von Foto entfernen"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Tag »%s« von Fotos entfernen"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Tag kann nicht zu »%s« umbenannt werden, weil ein entsprechender Tag bereits "
+"vorhanden ist."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Die Suche kann nicht nach »%s« umbenannt werden, weil die Suche bereits "
+"vorhanden ist."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Gespeicherte Suche"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Suche löschen"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Bearbeiten..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Umbenennen..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Suche »%s« zu »%s« umbenennen"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Suche »%s« löschen"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s bewerten"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Mit %s bewerten"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Wird mit %s bewertet"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Anzeige %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Nur Fotos mit einer Bewertung von %s anzeigen"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s oder besser"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s oder besser anzeigen"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Nur Fotos mit einer Bewertung von %s oder besser anzeigen"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Ausgewählte Fotos aus dem Müll entfernen"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Die ausgewählten Fotos aus der Bibliothek entfernen"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Wiederherstellen"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Die ausgewählten Bilder zurück in die Bibliothek verschieben"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Mit der Dateiverwaltung öffnen"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Den Speicherort des ausgewählten Fotos in der Dateiverwaltung öffnen"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Konnte Speicherort nicht in der Dateiverwaltung öffnen: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Aus Bibliothek _entfernen"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "In den _Müll verschieben"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "_Alle auswählen"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Alle auswählen"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Winkel:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Zurücksetzen"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Zurück zu den aktuellen Fotoabmessungen"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Foto zuschneiden"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Ausschnittsformat zwischen Hoch- und Querformat wechseln"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Unbeschränkt"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Quadrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Bildschirm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Ursprungsgröße"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD-Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD-Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Brief (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Boulevardblatt (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Rote-Augen-Entferner schliessen"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Rote-Augen-Effekt in der ausgewählten Region beseitigen"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Sättigung:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Farbstich:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Schatten:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Highlights:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Farben zurücksetzen"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Alle Farbanpassungen auf Ursprungswerte zurücksetzen"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Farbstich"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Sättigung"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Belichtung"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Schatten"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Highlights"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastanhebung"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Werkzeugleiste fixieren"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Werkzeugleiste immer geöffnet"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Vollbild verlassen"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Vollbild verlassen"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Beenden"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Info"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Bilds_chirmfüllend"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Inhalt"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Oft Gestellte _Fragen"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Ein Problem melden..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ein schwerwiegender Fehler ist beim Zugriff auf Shotwells Bibliothek "
+"aufgetreten. Shotwell kann nicht fortgesetzt werden.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Besuchen Sie die Yorba-Webseite"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "translator-credits"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Die Hilfe kann nicht anzeigt werden: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Kann nicht zur Datenbank von Fehlerberichten wechseln: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Die FAQ kann nicht anzeigt werden: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "unbenannt"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Ursprüngliche Größe"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Breite oder Höhe"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Breite"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Höhe"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Die Größe der Vorschaubilder anpassen"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Vorschaubilder vergrößern"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Vorschaubilder verkleinern"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Fotos sortieren"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Video _abspielen"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+"Die ausgewählten Videos mit der voreingestellten Video-Wiedergabe öffnen"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Kommentare"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "DIe Kommentare zu jedem Bild anzeigen"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Tags jedes Fotos anzeigen"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Nach _Titel"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Fotos nach Titel sortieren"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Nach Aufnahme_datum"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Fotos nach Aufnahmedatum sortieren"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Nach _Bewertung"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Fotos nach Bewertung sortieren"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell konnte das ausgewählte Video nicht abspielen:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Foto/Film"
+msgstr[1] "%d Fotos/Filme"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Kommentare zu jedem Ereignis anzeigen"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Keine Ereignisse"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Keine Ereignisse gefunden"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Ereignisse"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Nicht datiert"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ereignislos"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Kann Verzeichnis zur Zwischenspeicherung nicht anlegen %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Fehler beim Erstellen des Datenordners %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Bilder"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Fehler beim Erstellen des Ordners %s für temporäre Dateien: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Fehler beim Erstellen des Unterordners %s für Daten: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Keine)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Keine"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Zufällig"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Diaschau-Übergänge"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Fehler beim Erstellen einer temporären Datei für %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Wird exportiert"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Die Datei %s existiert bereits. Soll sie überschrieben werden?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Ü_berspringen"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "E_rsetzen"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_Alle ersetzen"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportieren"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotos"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videos"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-Fotos"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-Fotos"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Fehler beim Laden der UI-Datei %s:%s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Typ"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Veröffentlichen"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Die ausgewählten Fotos/Videos wurden erfolgreich veröffentlicht."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Die ausgewählten Videos wurden erfolgreich veröffentlicht."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Die ausgewählten Fotos wurden erfolgreich veröffentlicht."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Das ausgewählte Video wurde erfolgreich veröffentlicht."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Das ausgewählte Foto wurde erfolgreich veröffentlicht."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Konto-Information wird abgerufen …"
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Anmelden …"
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Foto veröffentlichen"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Fotos veröffentlichen _auf:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Videos veröffentlichen"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Videos veröffentlichen _auf:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Fotos und Videos veröffentlichen"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Fotos und Videos veröffentlichen _auf:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Veröffentlichen ist nicht möglich"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell kann die markierten Element nicht veröffentlichen, da Sie kein "
+"kompatibles Veröffentlichungs-Plugin installiert haben. Sie können diesen "
+"Fehler beheben, indem Sie unter <b>Bearbeiten %s Einstellungen</b> im Reiter "
+"<b>Plugins</b> eines oder mehrere der Veröffentlichungs-Plugins aktivieren."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Es wird für das Hochladen vorbereitet"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d von %d wird hochgeladen"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"Veröffentlichung auf %s kann nicht fortgesetzt werden, weil ein Fehler "
+"aufgetreten ist:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Um auf einem Dienst zu veröffentlichen, wählen Sie bitte aus dem obigen Menü."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Neuer _Tag..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Eine temporäre Datei die zum Veröffentlichen benötigt wird ist nicht "
+"verfügbar"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Sie sind gerade nicht bei YouTube angemeldet.\n"
+"\n"
+"Sie müssen bereits ein Google-Konto besitzen und es für YouTube eingerichtet "
+"haben, um fortzufahren. Sie können die meisten Konten anlegen, indem Sie "
+"sich mindestens einmal auf der YouTube-Seite anmelden."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Eine Datei, die veröffentlicht werden soll, ist nicht verfügbar. Die "
+"Veröffentlichung auf Youtube ist nicht möglich."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Sie sind bei YouTube als %s angemeldet."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videos werden in »%s« erscheinen"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Öffentlich aufgeführt"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Nicht öffentlich aufgeführt"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Standard-Publizierungsdienste"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Sie sind zurzeit nicht bei Flickr angemeldet.\n"
+"\n"
+"Wählen sie Login um sich über ihren Webbrowser bei Flickr anzumelden. Sie "
+"müssen \"Shotwell Connect\" autorisieren um sich mit Flickr zu verbinden."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Sie haben sich in dieser Shotwell-Sitzung bereits bei Flickr an- und "
+"abgemeldet.\n"
+"Um weiterhin auf Flickr zu publizieren zu können, beenden Sie Shotwell, "
+"starten Sie es nochmals und versuchen es dann erneut."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Vorbereitung für Login..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Eine Datei, die veröffentlicht werden soll, ist nicht verfügbar. Die "
+"Veröffentlichung auf Flickr ist nicht möglich."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Bestätige Autorisierung"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Sie sind bei Flickr als %s angemeldet.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ihr kostenloses Flickr-Konto ist auf ein monatliches Upload-Volumen "
+"limitiert.\n"
+"Diesen Monat können Sie noch %d Megabyte hochladen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Ihr Flickr-Pro-Konto erlaubt unbeschränkte Uploads."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotos _sichtbar für:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videos _sichtbar für:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotos und Videos _sichtbar für:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Alle"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Nur Freunde und Familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Nur Familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Nur Freunde"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Nur mich"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 Pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 Pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 Pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 Pixel"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Erstelle Alben %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Ein Fehler trat auf beim veröffentlichen auf Piwigo. Bitte versuchen Sie "
+"erneut."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Geben Sie die URL Ihrer Piwigo Fotobibliothek an, sowie Ihren Benutzernamen "
+"und Kennwort für das mir Ihrer Bibliothek verbundene Piwigo Benutzerkonto."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell kann sich nicht mit Ihrer Piwigo Fotobibliothek verbinden. Bitte "
+"überprüfen Sie Ihre angegebene URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Benutzername oder Passwort falsch. Versuche es noch einmal."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Ungültige URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Ungültiger Benutzername oder Kennwort"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Admins, Familie, Freunde, Kontakte"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Admins, Familie, Freunde"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Admins, Familie"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Admins"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Sie sind zur Zeit nicht bei Picasa Web Albums angemeldet.\n"
+"\n"
+"Klicken Sie auf »Anmelden«, um sich in Ihrem Webbrowser bei Picasa Web "
+"Albums anzumelden. Sie müssen Shotwell Connect gestatten, sich mit Ihrem "
+"Konto bei Picasa Web Albums zu verbinden."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Eine Datei, die veröffentlicht werden soll, ist nicht verfügbar. Die "
+"Veröffentlichung auf Picasa ist nicht möglich."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Album wird erstellt …"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Sie sind bei Picasa Web Album als %s angemeldet."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videos werden erscheinen in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotos werden erscheinen in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Klein (640 x 480 Pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mittel (1024 x 768 Pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Empfohlen (1600 x 1200 Pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 Pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Sie sind zur Zeit nicht bei Facebook angemeldet.\n"
+"\n"
+"Falls Sie noch kein Facebook-Konto haben, können Sie während des "
+"Anmeldevorgangs eines erstellen. Während der Anmeldung wird Shotwell "
+"möglicherweise nach Berechtigungen zum Hochladen von Fotos und zum Freigeben "
+"der Fotos in Ihrem Feed fragen. Diese Berechtigungen sind notwendig, damit "
+"die Verbindungsmöglichkeiten von Shotwell zu Facebook funktionieren können."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Sie haben sich in dieser Shotwell-Sitzung bereits bei Facebook an- und "
+"wieder abgemeldet.\n"
+"Um weiterhin auf Facebook zu publizieren, beenden Sie Shotwell, starten es "
+"neu und versuchen es dann erneut."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 Pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Groß (2048 Pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Verbindung zu Facebook wird geprüft …"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Eine Datei, die veröffentlicht werden soll, ist nicht verfügbar. Die "
+"Veröffentlichung auf Facebook ist nicht möglich."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Sie sind bei Facebook als %s angemeldet.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Wo möchten Sie die ausgewählten Fotos veröffentlichen?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Größe zum Hochladen:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Freunde"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Zerkrümeln"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Schachbrett"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Kreise"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Verdunkeln"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Streifen"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Uhr"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Kreis"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Standard Diaschau-Übergänge"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Schieben"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Überblenden"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Quadratisch"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Kerndaten Importdienst"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Herzlich Willkommen zum F-Spot Bibliotheksimport-Dienst.\n"
+"\n"
+"Bitte wählen Sie eine zu importierende Bibliothek, entweder durch das "
+"Auswählen einer von Shotwell automatisch erkannten Datenbank, oder durch ein "
+"manuelles Auswählen einer F-Spot Datenbankdatei."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Herzlich Willkommen zum F-Spot Bibliotheksimport-Dienst.\n"
+"\n"
+"Bitte wählen Sie eine F-Spot Datenbandatei."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Manuell eine zu importierende F-Spot Datenbank wählen:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Die ausgewählte F-Spot Datenbank konnte nicht geöffnet werden: Diese Datei "
+"existiert nicht oder ist keine F-Spot Datenbank."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Die ausgewählte F-Spot Datenbank konnte nicht geöffnet werden: Diese "
+"Datenbankversion wird aktuell noch nicht unterstützt."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Beim lesen der ausgewählten F-Spot Datenbank trat ein Fehler auf: Die "
+"Tabelle \"Tags\" konnte nicht gelesen werden."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Beim lesen der ausgewählten F-Spot Datenbank trat ein Fehler auf: Die "
+"Tabelle \"Fotos\" konnte nicht gelesen werden."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell hat %d Fotos in der F-Spot Datenbank gefunden und importiert diese "
+"zurzeit. Duplikate werden automatisch erkannt und entfernt. ⏎ ⏎ Sie können "
+"diesen Dialog schließen und Shotwell schon einmal nutzen während im "
+"Hintergrund noch der Import läuft."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot Bibliothek: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Vorbereite Import"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Als Hintergrundbildschau setzen"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Hintergrund-Diaschau erstellen"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Jedes Foto anzeigen für"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "Zeitintervall"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Wie lange soll jedes Foto als Hintergrundbild gezeigt werden?"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Suchen"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Name der Suche:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "Finde _gleiche"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "von den Folgenden:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "Auflösung für Druck"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "_Standardgröße verwenden"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "_Angepasste Größe verwenden"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Seitenverhältnis beibehalten"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automatische Größe:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "Titel"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Bild_titel drucken"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "Auflösung"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Foto ausgeben auf:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "Pixel pro Zoll"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"Titel"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Einstellungen"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "weiß"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "schwarz"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Überwache Bibliotheksordner auf neue Dateien"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadaten"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Tags, Titel und andere _Metadaten in die Fotodateien schreiben"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Anzeige"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Fotos importieren nach:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Hintergrund"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importieren"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Ordnerstruktur:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Muster:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Beispiel:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Namen von importierte Dateien in K_leinbuchstaben umändern"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-Entwickler"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Standart:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_xterner Foto-Editor:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Externer _RAW Editor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Externe Editoren"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Verzögerung:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Übergangseffekt:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Übergangsv_erzögerung:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "T_itel anzeigen"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "Sekunden"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Anmelden"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "In ein e_xistierendes Album veröffentlichen:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Ein _neues Album mit folgendem Namen erstellen:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Fotos und Videos _sichtbar für:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Entferne Ort, Kamera, und andere Identifizierende Informationen vor dem "
+"hochladen"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "A_bmelden"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Veröffentlichen"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Geben Sie die Bestätigungsnummer ein, die nach der Anmeldung bei Flickr mit "
+"ihren Web Browser angezeigt wird."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autorisationsnummer:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Bild_größe"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Ein _existentes Album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Neues Album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "A_lbum in öffentlicher Galerie aufführen"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Voreingestellte Foto_größe:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_Adresse Ihrer Piwigo-Fotobibliothek"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Benutzer_name"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Passwort"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Passwort _speichern"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+#, fuzzy
+msgid "Login"
+msgstr ""
+"Login"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Existierende Kategorie:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotos sind s_ichtbar für:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Bildgröße:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "in der Kategorie"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Album Kommentare"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Falls ein Titel und kein Kommentar gesetzt ist, benutze den Titel als "
+"Kommentar"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "_Fototags nicht hochladen"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Ausloggen"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Privatsphärenein_stellungen für Videos"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 Pixel"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"'%s' ist keine gültige Antwort auf eine OAuth Authentifizierungsanfrage"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): kann nicht starten; das Werkezug zum "
+"Veröffentlichen ist nicht neu startbar."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Geben Sie den Benutzernamen und Ihr Kennwort ein für das mit Tumblr "
+"verbundene Konto."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI konnte nicht geladen werden: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Sie als %s bei Tumblr angemeldet.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Besuchen Sie die Yandex.Fotki-Webseite"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Sie sind aktuell nicht bei Yandex.Fotki angemeldet."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Emailadresse"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Sie sind als (name) bei Tumblr angemeldet.\n"
+"\n"
+"(Der Inhalt dieser Beschriftung wurde im Quelltext festgelegt, \n"
+"und veröffentlicht,\n"
+"daher haben Änderungen hier keinen Einfluss)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Alben (oder neues erstellen):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Zugriffs_typ"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "_Kommentare deaktivieren"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Herunterladen des Originalfotos verbieten"
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..bf674cb
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,4815 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+# Translators:
+# kkypris <kcypre@gmail.com>, 2013
+# Petros Dias <petrosdias@gmail.com>, 2012
+# thalia <saliyath@gmail.com>, 2012
+# Sterios Prosiniklis <steriosprosiniklis@gmail.com>, 2011
+# thalia <saliyath@gmail.com>, 2011
+# anestv <varsamidis7-etc@yahoo.gr>, 2011
+# verayin <vera@yorba.org>, 2011
+# Γιάννης Κασκαμανίδης <kiolalis@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2014.
+# Vangelis Skarmoutsos <skarmoutsosv@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-02-16 23:27+0000\n"
+"PO-Revision-Date: 2014-02-17 02:18+0200\n"
+"Last-Translator: Vangelis Skarmoutsos <skarmoutsosv@gmail.com>\n"
+"Language-Team: Ελληνικά <team@gnome.gr>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.6\n"
+"X-Project-Style: gnome\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Ένα απαιτούμενο προσωρινό αρχείο για την δημοσιοποίηση δεν είναι διαθέσιμο"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Έχετε ήδη συνδεθεί και αποσυνδεθεί από μια υπηρεσία Google κατά τη διάρκεια "
+"της εργασίας στο Shotwell.\n"
+"\n"
+"Για να συνεχίσετε τη δημοσίευση στις υπηρεσίες Google, βγείτε και "
+"επανεκκινήστε το Shotwell, έπειτα προσπαθήστε να δημοσιεύσετε ξανά."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Επισκεφθείτε την ιστοτόπο του Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Δημήτρης Σπίγγος <dmtrs32@gmail.com>\n"
+"Dimitris Glezos <dimitris@glezos.com>\n"
+"Thalia Papoutsaki <saliyath@gmail.com>\n"
+"Sterios Prosiniklis <steriosprosiniklis@gmail.com>\n"
+"Petros Dias <petrosdias@gmail.com>\n"
+"Konstantinos Kypris <kcypre@gmail.com>\n"
+"Evangelos Skarmoutsos <skarmoutsosv@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Πνευματικά δικαιώματα 2009-2014 Ίδρυμα Yorba"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Καλώς ορίσατε στην υπηρεσία εισαγωγής βιβλιοθήκης F-Spot.\n"
+"\n"
+"Παρακαλούμε επιλέξτε μια βιβλιοθήκη για εισαγωγή, είτε επιλέγοντας μία από "
+"τις υπάρχουσες βιβλιοθήκες που βρήκε το Shotwell ή επιλέγοντας ένα "
+"εναλλακτικό αρχείο βάσης δεδομένων F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Καλώς ήλθατε στην υπηρεσία εισαγωγής βιβλιοθηκών F-Spot.\n"
+"\n"
+"Παρακαλούμε επιλέξτε ένα αρχείο βάσης δεδομένων F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Επιλέξτε χειροκίνητα μια βάση δεδομένων του F-Spot για εισαγωγή:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Δεν είναι εφικτό το άνοιγμα της επιλεγμένης βάσης δεδομένων του F-Spot: το "
+"αρχείο δεν υπάρχει ή δεν είναι βάση δεδομένων του F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Δεν είναι εφικτό το άνοιγμα της επιλεγμένης βάσης δεδομένων του F-Spot: αυτη "
+"η έκδοση της βάση δεδομένων του F-Spot δεν υποστηρίζεται από το Shotwell"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Αδύνατη η ανάγνωση του επιλεγμένου αρχείου βάσης δεδομένων F-Spot: σφάλμα "
+"κατά την ανάγνωση του πίνακα ετικετών"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Αδύνατη η ανάγνωση του επιλεγμένου αρχείου βάσης δεδομένων F-Spot: σφάλμα "
+"κατά την ανάγνωση του πίνακα φωτογραφιών"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Το Shotwell βρήκε %d φωτογραφίες στη βιβλιοθήκη F-Spot και τα εισάγει τώρα. "
+"Οι διπλοεγγραφές θα αναγνωριστούν αυτόματα και θα αφαιρεθούν.\n"
+"\n"
+"Μπορείτε να κλείσετε αυτόν τον διάλογο και να ξεκινήσετε χρησιμοποιώντας το "
+"Shotwell ενώ η εισαγωγή λαμβάνει χώρα στο παρασκήνιο."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Βιβλιοθήκη F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Προετοιμασία για εισαγωγή"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Υπηρεσίες εισαγωγής δεδομένων πυρήνα"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Πνευματικά δικαιώματα 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 εικονοστοιχεία"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 εικονοστοιχεία"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "Το '%s' δεν είναι έγκυρη ανταπόκριση στο αίτημα πιστοποίησης OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): δεν μπορεί να εκκινήσει; ο μηχανισμός "
+"κοινοποίησης δεν είναι διαθέσιμος."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Εισάγετε το όνομα χρήστη και κωδικό που είναι συσχετισμένα με το λογαριασμό "
+"του Tumblr σας."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Το όνομα χρήστη και/ή κωδικός πρόσβασης είναι άκυρα. Παρακαλούμε δοκιμάστε "
+"ξανά."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Μη έγκυρο Όνομα Χρήστη ή Κωδικός"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Δεν ήταν δυνατή η φόρτωση της διεπιφάνειας εργασίας: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Είστε συνδεδεμένοι στο Tumblr ως %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Επισκεφθείτε τον ιστοχώρο του Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Δεν είστε συνδεδεμένος αυτή τη στιγμή στο Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Πρόσθετες υπηρεσίες δημοσίευσης του Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "ετικέτα"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_Διεύθυνση email"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Κωδικός"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Σύνδεση"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Ιστολόγια:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Μέγεθος_εικόνας:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Αποσύνδεση"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Δημοσίευση"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Συλλογές (ή εγγραφή νέων):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "Τύπος _Πρόσβασης:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Απενεργοποίηση _σχολίων"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "Απαγόρευση _λήψης πρωτότυπης φωτογραφίας"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Δημόσιο"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Φίλοι"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Ιδιωτικό"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Σύνδεση Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Δεν είστε ακόμα συνδεδεμένος στο Facebook.\n"
+"\n"
+"Αν δεν έχετε ακόμα λογαριασμό στο Facebook, μπορείτε να δημιουργήσετε έναν "
+"κατά τη διαδικασία σύνδεσης. Κατά τη διάρκεια της σύνδεσης το Shotwell "
+"Connect μπορεί να σας ζητήσει την άδεια να φορτώσει φωτογραφίες και να τις "
+"δημοσιοποιήσει στη τροφοδοσία σας. Τα δικαιώματα αυτά είναι απαραίτητα για "
+"τη λειτουργία του Shotwell Connect."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Έχετε ήδη συνδεθεί και αποσυνδεθεί από το Facebook κατά τη διάρκεια της "
+"εργασίας στο Shotwell.\n"
+"Για να συνεχίσετε τη δημοσίευση στο Facebook, βγείτε από το Shotwell, "
+"εκκινήστε το πάλι και προσπαθήστε να δημοσιεύσετε ξανά."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Τυπικό (720 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Μεγάλο (2048 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Έλεγχος σύνδεσης με το Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Δημιουργία συλλογής..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Ένα απαιτούμενο αρχείο για τη δημοσίευση δεν είναι διαθέσιμο. Η δημοσίευση "
+"στο Facebook δεν μπορεί να συνεχιστεί."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Είστε συνδεδεμένος στο Facebook ως %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Που θέλετε να δημοσιεύσετε τις επιλεγμένες φωτογραφίες;"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "_Μέγεθος μεταφόρτωσης:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Μόνο εγώ"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Όλοι"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Δεν είστε συνδεδεμένοι με το Flickr.\n"
+"\n"
+"Πατήστε στο Σύνδεση για να συνδεθείτε με το Flickr στον περιηγητή ιστού σας. "
+"Θα πρέπει να εξουσιοδοτήσετε το Shotwell Connect για σύνδεση στο λογαριασμό "
+"του Flickr σας."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Έχετε ήδη συνδεθεί και αποσυνδεθεί από το Flickr κατά τη διάρκεια της "
+"εργασίας στο Shotwell.\n"
+"Για να συνεχίσετε τη δημοσίευση στο Flickr, βγείτε από το Shotwell, "
+"εκκινήστε το πάλι και προσπαθήστε να δημοσιεύσετε ξανά."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Ετοιμασία για σύνδεση..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Ένα απαιτούμενο αρχείο για τη δημοσίευση δεν είναι διαθέσιμο. Η δημοσίευση "
+"στο Flickr δεν μπορεί να συνεχιστεί."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Επικύρωση εξουσιοδότησης..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Είστε συνδεδεμένος στο Flickr ως %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ο δωρεάν λογαριασμός Flickr περιορίζει τον όγκο δεδομένων που μπορείτε να "
+"ανεβάσετε κάθε μήνα.\n"
+"Αυτόν τον μήνα, έχετε %d megabytes ακόμα μέχρι το ανώτατο όριο."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"Ο λογαριασμός Flickr Pro σας δίνει το δικαίωμα για απεριόριστα ανεβάσματα."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "_Φωτογραφίες ορατές σε:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "_Βίντεο ορατά σε:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Φωτογραφίες και βίντεο _ορατά σε:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Φίλοι & οικογένεια μόνο"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Μόνο οικογένεια"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Μόνο φίλοι"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 εικονοστοιχεία"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 εικονοστοιχεία"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Αρχικό μέγεθος"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Δεν είστε συνδεδεμένοι τώρα με τη συλλογή ιστού Picasa.\n"
+"\n"
+"Πατήστε στη σύνδεση για να συνδεθείτε με τη συλλογή ιστού Picasa στον "
+"περιηγητή ιστού σας. Θα πρέπει να εξουσιοδοτήσετε το Shotwell Connect για "
+"σύνδεση στον λογαριασμό σας συλλογών ιστού Picasa."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Ένα απαιτούμενο αρχείο για τη δημοσίευση δεν είναι διαθέσιμο. Η δημοσίευση "
+"στο Picasa δεν μπορεί να συνεχιστεί."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Είστε συνδεδεμένος στη συλλογή ιστού Picasa ως %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Τα βίντεο θα εμφανιστούν στο:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Οι φωτογραφίες θα εμφανίζονται στα:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "ΜΙκρό (640 x 480 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Μεσαίο (1024 x 768 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Προτεινόμενο (1600 x 1200 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 εικονοστοιχεία)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Αρχικό μέγεθος"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Δημιουργία συλλογής %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Ένα μήνυμα λάθους εμφανίστηκε κατά τη δημοσίευση στο Piwigo. Παρακαλώ "
+"δοκιμάστε ξανά."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Εισάγετε το URL της βιβλιοθήκης φωτογραφιών Piwigo καθώς και το όνομα χρήστη "
+"και τον κωδικό πρόσβασης που συνδέεται με τον λογαριασμό Piwigo για αυτήν τη "
+"βιβλιοθήκη."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Το Shotwell δεν μπορεί να επικοινωνήσει με τη βιβλιοθήκη φωτογραφιών Piwigo. "
+"Παρακαλούμε επιβεβαιώστε το URL που εισάγατε"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Άκυρο URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Διαχειριστές, Οικογένεια, Φίλοι, Επαφές"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Διαχειριστές, Οικογένεια, Φίλοι"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Διαχειριστές, Οικογένεια"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Διαχειριστές"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Δεν είστε ακόμα συνδεδεμένος στο YouTube.\n"
+"\n"
+"Θα πρέπει να έχετε ήδη εγγραφεί για έναν λογαριασμό Google και να τον έχετε "
+"ρυθμίσει για χρήση με το YouTube για να συνεχίσετε. Μπορείτε να ρυθμίσετε "
+"τους περισσότερους λογαριασμούς χρησιμοποιώντας το πρόγραμμα πλοήγησης για "
+"να συνδεθείτε με το YouTube τουλάχιστον μια φορά."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Ένα απαιτούμενο αρχείο για τη δημοσίευση δεν είναι διαθέσιμο. Η δημοσίευση "
+"στο Youtube δεν μπορεί να συνεχιστεί."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Είστε συνδεδεμένος στο YouTube ως %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Τα βίντεο θα εμφανιστούν στο '%s'"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Δημόσια αρχειοθετημένα"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Δημόσιο μη αρχειοθετημένα"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Δημοσίευση σε _υπάρχουσα συλλογή:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Δημιουργία _νέας συλλογής με όνομα:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Βίντεο και νέες συλλογές φωτογραφιών _ορατά σε:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"Α_φαιρέστε τοποθεσία, κάμερα και άλλες πληροφορίες αναγνώρισης πριν τη "
+"μεταφόρτωση"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Εισάγετε τον αριθμό επιβεβαίωσης που εμφανίζεται αφού συνδεθείτε στο Flickr "
+"με τον περιηγητή ιστού σας."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "Α_ριθμός εξουσιοδότησης:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Συνέχεια"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "_Υπάρχουσα συλλογή:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Μια _νέα συλλογή με όνομα:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "_Ταξινόμηση συλλογής στη δημόσια πινακοθήκη"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Προκα_θορισμένο μέγεθος φωτογραφίας:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL της βιβλιοθήκης φωτογραφιών Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "Όνομα _Χρήστη"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Απομνημόνευση Κωδικού"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Μια _υπάρχουσα κατηγορία:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Οι φωτογραφίες θα είναι _ορατές από:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Μέγεθος φωτογραφίας:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "στην κατηγορία:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Σχόλιο συλλογής:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Αν οριστεί τίτλος και αφαιρεθεί το σχόλιο, θα χρησιμοποιηθεί ο τίτλος ως "
+"σχόλιο"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "Να _μην μεταφορτώνονται ετικέτες"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Αποσύνδεση"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Δημοσίευση"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Βασικές υπηρεσίες δημοσίευσης"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "_Ρυθμίσεις ιδιωτικότητας βίντεο:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Γρίλλιες"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Σκάκι"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Κύκλος"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Κύκλοι"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Ρολόι"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Θρυμμάτισμα"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Ξεθώριασμα"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Διαφάνεια"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Τετράγωνα"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Ρίγες"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Βασικές μεταβάσεις αλληλουχίας εικόνων"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Αδυναμία δημιουργίας καταλόγου κρυφής μνήμης %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Αδυναμία δημιουργίας φακέλου δεδομένων %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Εικόνες"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Αδυναμία δημιουργίας προσωρινού φακέλου δεδομένων %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Αδυναμία δημιουργίας υποφακέλου %s: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Καρφίτσωμα γραμμής εργαλείων"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Ανοικτό καρφίτσωμα της γραμμής εργαλείων"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Έξοδος από πλήρη οθόνη"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Έ_ξοδος από πλήρη οθόνη"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "Έ_ξοδος"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "Πε_ρί"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Πλήρης ο_θόνη"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Περιεχόμενα"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Συχνές ερωτήσεις"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Αναφορά προβλήματος..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "Α_κύρωση"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ένα σφάλμα προέκυψε κατά την πρόσβαση στη βιβλιοθήκη του Shotwell. Το "
+"Shotwell δεν μπορεί να συνεχίσει.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Δεν ήταν δυνατή η εμφάνιση της βοήθειας: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Αδύνατη η περιήγηση στη βάση δεδομένων σφαλμάτων: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Αδυναμία εμφάνισης συχνών ερωτήσεων: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Επιτυχία"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Σφάλμα αρχείου"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Αδυναμία αποκρυπτογράφησης του αρχείου"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Σφάλμα βάσης δεδομένων"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Ο χρήστης ματαίωσε την εισαγωγή"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Δεν είναι αρχείο"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Το όνομα υπάρχει ήδη στη βάση δεδομένων"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Μη υποστηριζόμενη μορφή αρχείου"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Δεν είναι αρχείο εικόνας"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Αποτυχία δίσκου"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Δίσκος πλήρης"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Σφάλμα κάμερας"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Σφάλμα εγγραφής αρχείου"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Αλλοιωμένο αρχείο εικόνας"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Αποτυχία εισαγωγής (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "_Αλληλουχία"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Αναπαραγωγή αλληλουχίας εικόνων"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Εξαγωγή φωτογραφίας/βίντεο"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Εξαγωγή φωτογραφιών/βίντεο"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Εξαγωγή φωτογραφίας"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Εξαγωγή φωτογραφιών"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Περιστροφή"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Αναίρεση περιστροφής"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Οριζόντιος κατοπτρισμός"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Αναίρεση οριζόντιου κατοπτρισμού"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Κατακόρυφος κατοπτρισμός"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Αναίρεση κατακόρυφου κατοπτρισμού"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Επαναφορά"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Αναίρεση επαναφοράς"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Βελτίωση"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Αναίρεση βελτίωσης"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Εφαρμογή μετασχηματισμών χρώματος"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Αναίρεση μετασχηματισμών χρώματος"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Δημιουργία νέου συμβάντος"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Αφαίρεση συμβάντος"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Μετακίνηση φωτογραφιών σε νέο συμβάν"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Ορισμός φωτογραφιών σε προηγούμενο συμβάν"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Συγχώνευση"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Ακύρωση συγχώνευσης"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Αντιγραφή φωτογραφιών"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Αφαίρεση διπλών αντιγράφων φωτογραφιών"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+"Δεν ήταν δυνατή η δημιουργία αντιγράφου της φωτογραφίας εξαιτίας κάποιου "
+"σφάλματος αρχείου"
+msgstr[1] ""
+"Δεν ήταν δυνατή η δημιουργία αντιγράφου %d φωτογραφιών εξαιτίας κάποιου "
+"σφάλματος αρχείου"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Επαναφορά προηγούμενων αξιολογήσεων"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Αύξηση αξιολογήσεων"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Μείωση αξιολογήσεων"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Ορισμός της εφαρμογής επεξεργασίας RAW αρχείων"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Επαναφορά προηγούμενης εφαρμογής επεξεργασίας RAW αρχείων"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Ορισμός εφαρμογής επεξεργασίας RAW αρχείων"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Η αυθεντική φωτογραφία δεν ήταν δυνατό να ρυθμιστεί."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Ρύθμιση Ημερομηνίας και Ώρας"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Αναίρεση ρυθμίσεων ημερομηνίας και ώρας"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Μια αυθεντική φωτογραφία δεν ήταν δυνατό να ρυθμιστεί."
+msgstr[1] "Οι παρακάτω αυθεντικές φωτογραφίες δεν ήταν δυνατό να ρυθμιστούν."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Σφάλμα ρύθμισης ώρας"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Δεν ήταν δυνατή η αναίρεση των ρυθμίσεων ώρας για το παρακάτω αρχείο εικόνας."
+msgstr[1] ""
+"Δεν ήταν δυνατή η αναίρεση των ρυθμίσεων ώρας για τα παρακάτω αρχεία εικόνας."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Δημιουργία ετικέτας"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Μετακίνηση Καρτέλας \"%s\""
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Μετακίνηση φωτογραφιών στον κάδο απορριμμάτων"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Επαναφορά φωτογραφιών από τον κάδο απορριμμάτων"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Μετακίνηση φωτογραφιών στον κάδο απορριμμάτων του Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Επαναφορά των εικόνων στη βιβλιοθήκη του Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Μετακίνηση φωτογραφιών στον κάδο απορριμμάτων"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Επαναφορά φωτογραφιών από τον κάδο απορριμμάτων"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Επισήμανση επιλεγμένων φωτογραφιών"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Αναίρεση επισήμανσης επιλεγμένων φωτογραφιών"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Επισήμανση επιλεγμένων φωτογραφιών"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Αφαίρεση επισήμανσης επιλεγμένων φωτογραφιών"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Επισήμανση"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Αναίρεση επισήμανσης"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Δεν ήταν δυνατή η εκκίνηση της αποστολής μέσω Ναυτίλου: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Αποστολή σε"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Αδυναμία εξαγωγής φόντου στο %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Αδυναμία προετοιμασίας προβολής διαφανειών στην επιφάνεια εργασίας: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Αυτή η ενέργεια θα αφαιρέσει την ετικέτα \"%s\" από μια φωτογραφία. Συνέχεια;"
+msgstr[1] ""
+"Αυτή η ενέργεια θα αφαιρέσει την ετικέτα \"%s\" από %d φωτογραφίες. Συνέχεια;"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Διαγραφή"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Αυτό θα αφαιρέσει την αποθηκευμένη αναζήτηση \"%s\". Να συνεχίσει;"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Η εναλλαγή δημιουργών θα αναιρέσει όλες τις αλλαγές που έχετε κάνει σε αυτή "
+"τη φωτογραφία στο Shotwell"
+msgstr[1] ""
+"Η εναλλαγή δημιουργών θα αναιρέσει όλες τις αλλαγές που έχετε κάνει σε αυτές "
+"τις φωτογραφίες στο Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "Ε_ναλλαγή δημιουργού"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Εξαγωγή βίντεο"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Το Shotwell δεν κατάφερε να δημιουργήσει ένα αρχείο για επεξεργασία της "
+"φωτογραφίας επειδή δεν έχετε άδεια να γράψετε στο %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Δεν ήταν δυνατή η εξαγωγή της φωτογραφίας εξαιτίας ενός σφάλματος αρχείου.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Θέλετε να συνεχιστεί η εξαγωγή;"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Χωρίς τροποποίηση"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Τρέχον"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Μορφοποίηση:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Ποιότητα:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Περιορισμός _κλίμακας:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _Εικονοστοιχεία"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Εξαγωγή μεταδεδομένων"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Αποθήκευση Λεπτομερειών..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Αποθήκευση Λεπτομερειών"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(και άλλα %d)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Αναφορά Αποτελεσμάτων Εισαγωγής"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Προσπάθεια εισαγωγής %d αρχείου."
+msgstr[1] "Προσπάθεια εισαγωγής %d αρχείων."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Από αυτά, %d αρχείο εισήχθη επιτυχώς."
+msgstr[1] "Από αυτά, %d αρχεία εισήχθησαν επιτυχώς."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Διπλότυπες Φωτογραφίες/Βίντεο που δεν Εισήχθησαν:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "Διπλότυπο υπάρχον αντικείμενο"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Δεν εισήχθησαν φωτογραφίες/βίντεο λόγω σφαλμάτων κάμερας:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "μήνυμα λάθους:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Μη εισαγωγή αρχείων επειδή δεν αναγνωρίστηκαν ως φωτογραφίες ή βίντεο:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Μη εισαγωγή αρχείων επειδή δεν ήταν σε μορφή που αναγνωρίζει το Shotwell:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Μη εισαγωγή αρχείων επειδή το Shotwell δε μπόρεσε να τα αντιγράψει στη "
+"βιβλιοθήκη:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"Αδυναμία αντιγραφής %s\n"
+"\tσε %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Μη εισαγωγή φωτογραφιών/βίντεο επειδή τα αρχεία είναι αλλοιωμένα:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Μη εισαγωγή φωτογραφιών/βίντεο για άλλους λόγους:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 διπλή φωτογραφία δεν εισήχθη:\n"
+msgstr[1] "%d διπλές φωτογραφίες δεν εισήχθησαν:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 διπλό βίντεο δεν εισήχθη:\n"
+msgstr[1] "%d διπλά βίντεο δεν εισήχθησαν:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 διπλή φωτογραφία/βίντεο δεν εισήχθη:\n"
+msgstr[1] "%d διπλές φωτογραφίες/βίντεο δεν εισήχθησαν:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 φωτογραφία απέτυχε να εισαχθεί εξαιτίας ενός σφάλματος αρχείου ή σφάλματος "
+"του υλικού:\n"
+msgstr[1] ""
+"%d φωτογραφίες απέτυχαν να εισαχθούν εξαιτίας ενός σφάλματος αρχείου ή "
+"σφάλματος του υλικού:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 βίντεο απέτυχε να εισαχθεί εξαιτίας ενός σφάλματος αρχείου ή σφάλματος του "
+"υλικού:\n"
+msgstr[1] ""
+"%d βίντεο απέτυχαν να εισαχθούν εξαιτίας ενός σφάλματος αρχείου ή σφάλματος "
+"του υλικού:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 φωτογραφία/βίντεο απέτυχε να εισαχθεί εξαιτίας ενός σφάλματος αρχείου ή "
+"σφάλματος του υλικού:\n"
+msgstr[1] ""
+"%d φωτογραφίες/βίντεο απέτυχαν να εισαχθούν εξαιτίας ενός σφάλματος αρχείου "
+"ή σφάλματος του υλικού:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Απέτυχε η εισαγωγή 1 αρχείου λόγω σφάλματος αρχείου ή σφάλματος του υλικού:\n"
+msgstr[1] ""
+"Απέτυχε η εισαγωγή %d αρχείων λόγω σφάλματος αρχείου ή σφάλματος του "
+"υλικού:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Απέτυχε η εισαγωγή 1 φωτογραφίας επειδή ο φάκελος της βιβλιοθήκης δεν είναι "
+"εγγράψιμος:\n"
+msgstr[1] ""
+"Απέτυχε η εισαγωγή %d φωτογραφιών επειδή ο φάκελος της βιβλιοθήκης δεν είναι "
+"εγγράψιμος:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Απέτυχε η εισαγωγή 1 βίντεο επειδή ο φάκελος της βιβλιοθήκης δεν είναι "
+"εγγράψιμος:\n"
+msgstr[1] ""
+"Απέτυχε η εισαγωγή %d βίντεο επειδή ο φάκελος της βιβλιοθήκης δεν είναι "
+"εγγράψιμος:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Απέτυχε η εισαγωγή 1 φωτογραφίας/βίντεο επειδή ο φάκελος της βιβλιοθήκης δεν "
+"είναι εγγράψιμος:\n"
+msgstr[1] ""
+"Απέτυχε η εισαγωγή %d φωτογραφιών/βίντεο επειδή ο φάκελος της βιβλιοθήκης "
+"δεν είναι εγγράψιμος:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Απέτυχε η εισαγωγή 1 αρχείου επειδή ο φάκελος της βιβλιοθήκης δεν ήταν "
+"εγγράψιμος:\n"
+msgstr[1] ""
+"Απέτυχε η εισαγωγή %d αρχείων επειδή ο φάκελος της βιβλιοθήκης δεν ήταν "
+"εγγράψιμος:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Αποτυχία εισαγωγής 1 φωτογραφίας εξαιτίας κάποιου σφάλματος της κάμερας:\n"
+msgstr[1] ""
+"Αποτυχία εισαγωγής %d φωτογραφιών εξαιτίας κάποιου σφάλματος της κάμερας:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 βίντεο απέτυχε να εισαχθεί εξαιτίας κάποιου σφάλματος της κάμερας:\n"
+msgstr[1] ""
+"Αποτυχία εισαγωγής %d βίντεο εξαιτίας κάποιου σφάλματος της κάμερας:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Αποτυχία εισαγωγής 1 φωτογραφίας/βίντεο εξαιτίας κάποιου σφάλματος της "
+"κάμερας:\n"
+msgstr[1] ""
+"Αποτυχία εισαγωγής %d φωτογραφιών/βίντεο εξαιτίας κάποιου σφάλματος της "
+"κάμερας:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Απέτυχε η εισαγωγή 1 αρχείου λόγω σφάλματος της κάμερας:\n"
+msgstr[1] "Απέτυχε η εισαγωγή %d αρχείων λόγω σφάλματος της κάμερας:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "Αποτυχία εισαγωγής 1 φωτογραφίας επειδή ήταν αλλοιωμένη:\n"
+msgstr[1] "Αποτυχία εισαγωγής %d φωτογραφιών επειδή ήταν αλλοιωμένες:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "Αποτυχία εισαγωγής 1 βίντεο επειδή ήταν αλλοιωμένο:\n"
+msgstr[1] "Αποτυχία εισαγωγής %d βίντεο επειδή ήταν αλλοιωμένα:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "Αποτυχία εισαγωγής 1 φωτογραφίας/βίντεο επειδή ήταν αλλοιωμένη:\n"
+msgstr[1] "Αποτυχία εισαγωγής %d φωτογραφιών/βίντεο επειδή ήταν αλλοιωμένες:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "Αποτυχία εισαγωγής 1 αρχείου επειδή ήταν αλλοιωμένο:\n"
+msgstr[1] "Αποτυχία εισαγωγής %d αρχείων επειδή ήταν αλλοιωμένα:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Παράλειψη 1 ανυποστήρικτης φωτογραφίας:\n"
+msgstr[1] "Παράλειψη %d ανυποστήρικτων φωτογραφίων:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Παράλειψη ενός αρχείου που δεν ήταν εικόνας.\n"
+msgstr[1] "Παράλειψη %d αρχείων που δεν ήταν εικόνας.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Παράλειψη 1 φωτογραφίας λόγω ακύρωσης από το χρήστη:\n"
+msgstr[1] "Παράλειψη %d φωτογραφιών λόγω ακύρωσης από το χρήστη:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Παράλειψη 1 βίντεο λόγω ακύρωσης από το χρήστη:\n"
+msgstr[1] "Παράλειψη %d βίντεο λόγω ακύρωσης από το χρήστη:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Παράλειψη 1 φωτογραφίας/βίντεο λόγω ακύρωσης από το χρήστη:\n"
+msgstr[1] "Παράλειψη %d φωτογραφιών/βίντεο λόγω ακύρωσης από το χρήστη:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 αρχείο παραλείφθηκε λόγω ακύρωσης από το χρήστη:\n"
+msgstr[1] "%d αρχεία παραλείφθηκαν λόγω ακύρωσης από το χρήστη:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 φωτογραφία εισήχθη με επιτυχία.\n"
+msgstr[1] "%d φωτογραφίες εισήχθησαν με επιτυχία.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 βίντεο εισήχθη με επιτυχία.\n"
+msgstr[1] "%d βίντεο εισήχθησαν με επιτυχία.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 φωτογραφία/βίντεο εισήχθη με επιτυχία.\n"
+msgstr[1] "%d φωτογραφίες/βίντεο εισήχθησαν με επιτυχία.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Δεν εισήχθησαν εικόνες ή βίντεο.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Η εισαγωγή ολοκληρώθηκε"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d δευτερόλεπτο"
+msgstr[1] "%d δευτερόλεπτα"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d λεπτό"
+msgstr[1] "%d λεπτά"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ώρα"
+msgstr[1] "%d ώρες"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ημέρα"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Μετονομασία γεγονότος"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Όνομα:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Επεξεργασία τίτλου"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Τίτλος:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Επεξεργασία σχολίου συμβάντος"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Επεξεργασία σχολίου φωτογραφίας/βίντεο"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Σχόλιο:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Αρχείο κάδου απορριμμάτων"
+msgstr[1] "_Αρχεία κάδου απορριμμάτων"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Α_φαίρεση μόνο"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Διατήρηση"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Να αναιρεθεί η εξωτερική επεξεργασία;"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Να αναιρεθούν οι εξωτερικές επεξεργασίες;"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Αυτή η ενέργεια θα καταστρέψει όλες τις αλλαγές που έγιναν στο εξωτερικό "
+"αρχείο. Να συνεχιστεί;"
+msgstr[1] ""
+"Αυτή η ενέργεια θα καταστρέψει όλες τις αλλαγές που έγιναν στα %d εξωτερικά "
+"αρχεία. Να συνεχιστεί;"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Αναίρεση εξωτερικής επεξεργασίας"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Αναίρεση Εξωτερικών Επεξεργασιών"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+"Αυτή η ενέργεια θα αφαιρέσει τη φωτογραφία από τη βιβλιοθήκη. Συνέχεια;"
+msgstr[1] ""
+"Αυτή η ενέργεια θα αφαιρέσει %d φωτογραφίες από τη βιβλιοθήκη. Συνέχεια;"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Αφαίρεση"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Απομάκρυνση της φωτογραφίας από τη βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Απομάκρυνση των φωτογραφιών από τη βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "ΠΜ"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "ΜΜ"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ώρες"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Μετακίνηση φωτογραφιών/βίντεο κατά την ίδια ποσότητα"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Ορισμός ό_λων των φωτογραφιών/βίντεο σε αυτόν τον χρόνο"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Τροποποίηση αρχικού αρχείου φωτογραφίας"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Τροποποίηση αρχικών αρχείων φωτογραφίας"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Τροποποίηση αυθεντικού αρχείου"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Τροποποίηση αυθεντικών αρχείων"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Αρχικό: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ο χρόνος έκθεσης θα μετατοπιστεί προς τα εμπρός κατά\n"
+"%d %s, %d %s, %d %s, και %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ο χρόνος έκθεσης θα μετατοπιστεί προς τα πίσω κατά\n"
+"%d %s, %d %s, %d %s, και %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ημέρα"
+msgstr[1] "ημέρες"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ώρα"
+msgstr[1] "ώρες"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "λεπτό"
+msgstr[1] "λεπτά"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "δευτερόλεπτο"
+msgstr[1] "δευτερόλεπτα"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Και %d άλλο."
+msgstr[1] ""
+"\n"
+"\n"
+"Και %d άλλα."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Ετικέτες (διαχωρισμένες με κόμματα):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Καλώς ήλθατε!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Καλωσορίσατε στο Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Για να ξεκινήσετε, εισάγετε φωτογραφίες με κάποιον από αυτούς τους τρόπους:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Επιλέξτε <span weight=\"bold\">Εισαγωγή %s αρχείων από φάκελο</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Μεταφορά και απόθεση φωτογραφιών στο παράθυρο του Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Συνδέστε μια κάμερα στον υπολογιστή σας και εισάγετε"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Εισαγωγή φωτογραφιών από το φάκελο %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"Μπορείτε επίσης να εισάγετε φωτογραφίες με κάποιον από αυτούς τους τρόπους:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Να μην εμφανιστεί ξανά αυτό το μήνυμα"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Εισαγωγή φωτογραφιών από τη συλλογή %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Βοήθεια)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Έτος%sΜήνας%sΗμέρα"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Έτος%sΜήνας"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Έτος%sΜήνας-Ημέρα"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Έτος-Μήνας-Ημέρα"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Προσαρμοσμένο"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Μη έγκυρο πρότυπο"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Το Shotwell μπορεί να αντιγράψει τις φωτογραφίες στο φάκελο της βιβλιοθήκης "
+"ή μπορεί να τις εισάγει χωρίς να τις αντιγράψει."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Αντιγραφή φωτογραφιών"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Εισαγωγή σε φάκελο"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Εισαγωγή στη βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Απομάκρυνση από τη Βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Απομάκρυνση της φωτογραφίας από τη βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Αφαίρεση των φωτογραφιών από τη Βιβλιοθήκη"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Αυτή η ενέργεια θα αφαιρέσει την επιλεγμένη φωτογραφία από τη βιβλιοθήκη του "
+"Shotwell. Θέλετε επίσης να μεταφέρετε το αρχείο στα απορρίμματα της "
+"επιφάνειας εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+msgstr[1] ""
+"Αυτή η ενέργεια θα αφαιρέσει %d φωτογραφίες/βίντεο από τη βιβλιοθήκη του "
+"Shotwell. Θέλετε επίσης να μεταφέρετε τα αρχεία στα απορρίμματα της "
+"επιφάνειας εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Αυτή η ενέργεια θα αφαιρέσει το βίντεο από τη βιβλιοθήκη του Shotwell. "
+"Θέλετε επίσης να μεταφέρετε το αρχείο στα απορρίμματα της επιφάνειας "
+"εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+msgstr[1] ""
+"Αυτή η ενέργεια θα αφαιρέσει %d βίντεο από τη βιβλιοθήκη του Shotwell. "
+"Θέλετε επίσης να μεταφέρετε τα αρχεία στα απορρίμματα της επιφάνειας "
+"εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Αυτή η ενέργεια θα αφαιρέσει την επιλεγμένη φωτογραφία από τη βιβλιοθήκη του "
+"Shotwell. Θέλετε επίσης να μεταφέρετε το αρχείο στα απορρίμματα της "
+"επιφάνειας εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+msgstr[1] ""
+"Αυτή η ενέργεια θα αφαιρέσει %d φωτογραφίες από τη βιβλιοθήκη του Shotwell. "
+"Θέλετε επίσης να μεταφέρετε τα αρχεία στα απορρίμματα της επιφάνειας "
+"εργασίας;\n"
+"\n"
+"Αυτή η κίνηση δεν μπορεί να αναιρεθεί."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Δεν είναι δυνατή η μετακίνηση της φωτογραφίας/βίντεο στα απορρίμματα της "
+"επιφάνειας εργασίας. Να διαγραφεί αυτό το αρχείο;"
+msgstr[1] ""
+"Δεν είναι δυνατή η μετακίνηση %d φωτογραφιών/βίντεο στα απορρίμματα της "
+"επιφάνειας εργασίας. Να διαγραφούν αυτά τα αρχεία;"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Δεν είναι δυνατή η διαγραφή της εικόνας ή του βίντεο."
+msgstr[1] "Δεν είναι δυνατή η διαγραφή %d εικόνων ή βίντεο."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Πλάτος ή ύψος"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Πλάτος"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Ύψος"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Αδυναμία παρακολούθησης του %s: Δεν είναι φάκελος (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Συμβάν %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Αδυναμία δημιουργίας προσωρινού αρχείου για το %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Εξαγωγή"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Το αρχείο %s υπάρχει ήδη. Να αντικατασταθεί;"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Πα_ράβλεψη"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Αντικατάσταση"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Αντικατάσταση ό_λων"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Εξαγωγή"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Η επεξεργασία της παρακολούθησης των ενημερώσεων δεν ήταν δυνατή: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Προσαρμογή μεγέθους μικρογραφιών"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "_Μεγέθυνση"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Αύξηση της μεγέθυνσης των μικρογραφιών"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "Σμίκρ_υνση"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Μείωση της μεγέθυνσης των μικρογραφιών"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Ταξινόμηση φωτογραφιών"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Αναπαραγωγή βίντεο"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+"Άνοιγμα των επιλεγμένων βίντεο με την εφαρμογή αναπαραγωγής του συστήματος"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Επεξεργασία RAW"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Κάμερα"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "Τίτ_λοι"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Εμφάνιση του τίτλου κάθε φωτογραφίας"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Σχόλια"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Εμφάνιση του σχολίου κάθε φωτογραφίας"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "_Ετικέτες"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Εμφάνιση των ετικετών κάθε φωτογραφίας"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Κατά _τίτλο"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ταξινόμηση των φωτογραφιών βάσει τίτλου"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Κατά _ημερομηνία τροποποίησης"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ταξινόμηση φωτογραφιών βάσει ημερομηνία έκθεσης"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Βάσει _αξιολόγησης"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ταξινόμηση των φωτογραφιών βάσει αξιολόγησης"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Αύξουσα"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Ταξινόμηση φωτογραφιών κατά αύξουσα σειρά"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "_Φθινουσα"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Ταξινόμηση φωτογραφιών κατά φθίνουσα σειρά"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Το Shotwell απέτυχε να παίξει το επιλεγμένο βίντεο:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Καμία φωτογραφία/βίντεο"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Δεν βρέθηκαν φωτογραφίες/βίντεο"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Δεν είναι δυνατή η εξαγωγή των φωτογραφιών σε αυτόν τον φάκελο."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "τροποποιημένο"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Προηγούμενη φωτογραφία"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Επόμενη φωτογραφία"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Το πηγαίο αρχείο της φωτογραφίας λείπει:%s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Προβολή"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Ε_ργαλεία"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Προηγούμενη φωτογραφία"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Προηγούμενη φωτογραφία"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Επόμενη φωτογραφία"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Επόμενη φωτογραφία"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Αύξηση της μεγέθυνσης της φωτογραφίας"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Μείωση της μεγέθυνσης της φωτογραφίας"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Μέγεθος _οθόνης"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Μεγέθυνση της εικόνας στο μέγεθος της οθόνης"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Μεγέθυνση _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Μεγέθυνση της φωτογραφίας στο 100%"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Μεγέθυνση _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Μεγέθυνση της φωτογραφίας στο 200%"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Αδυναμία εξαγωγής %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Γέμισμα όλης της σελίδας"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 εικόνες ανά σελίδα"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Wallet (2 x 3 in.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 x 5 in.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postcard (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Ρυθμίσεις εικόνας"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Εκτύπωση..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Αδυναμία εκτύπωσης της φωτογραφίας:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Σήμερα"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Χθες"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Αντικείμενα:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d συμβάν"
+msgstr[1] "%d συμβάντα"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Φωτογραφία"
+msgstr[1] "%d Φωτογραφίες"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d Βίντεο"
+msgstr[1] "%d Βίντεο"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Ημερομηνία:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Χρόνος:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Από:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Σε:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Μέγεθος:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Διάρκεια:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f δευτερόλεπτα"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Προγραμματιστής:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Έκθεση:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Τοποθεσία:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Μέγεθος αρχείου:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Τρέχουσα Ανάπτυξη:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Αρχικές διαστάσεις:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Κατασκευαστής κάμερας:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Μοντέλο κάμερας:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Φλας:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Εστιακό μήκος:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Ημερομηνία έκθεσης:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Χρόνος έκθεσης:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Πόλωση έκθεσης:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Γεωγραφικό πλάτος GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Γεωγραφικό μήκος GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Καλλιτέχνης:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Πνευματικά δικαιώματα:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Λογισμικό:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Εκτενείς πληροφορίες"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Διαχειριστής εικόνων"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Προβολή εικόνων"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Περιστροφή _δεξιά"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Περιστροφή"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Περιστροφή δεξιά"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Περιστροφή των εικόνων δεξιά (πατήστε Ctrl για να περιστρέψετε αριστερά)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Περιστροφή _αριστερά"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Περιστροφή αριστερά"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Περιστροφή των εικόνων αριστερά"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "_Οριζόντιος κατοπτρισμός"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Οριζόντιος κατοπτρισμός"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "_Κατακόρυφος κατοπτρισμός"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Κατακόρυφος κατοπτρισμός"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Βελτίωση"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Βελτίωση"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Αυτόματη βελτίωση της εμφάνισης της φωτογραφίας"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "Α_ντιγραφή ρυθμίσεων χρώματος"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Αντιγραφή ρυθμίσεων χρώματος"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Αντιγραφή των εφαρμοζόμενων ρυθμίσεων χρώματος στη φωτογραφία"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Ε_πικόλληση ρυθμίσεων χρώματος"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Επικόλληση ρυθμίσεων χρώματος"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Εφαρμογή αντιγραμμένων ρυθμίσεων χρώματος στις επιλεγμένες φωτογραφίες"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Κοπή"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Κοπή"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Κοπή μεγέθους φωτογραφίας"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Ί_σιωμα"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Ίσιωμα"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Ίσιωμα της εικόνας"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Φαινόμενο κόκκινων ματιών"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Φαινόμενο κόκκινων ματιών"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+"Μείωση ή εξαφάνιση επιδράσεων φαινομένου κόκκινων-ματιών στη φωτογραφία"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Προσαρμογή"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Προσαρμογή"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ρύθμιση χρώματος και τόνου της φωτογραφίας"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Επαναφορά στην αρχική"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Επαναφορά στην αρχική"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Αναίρεση ε_ξωτερικών επεξεργασιών"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Επαναφορά στην αρχική φωτογραφία"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Ορισμός ως _παρασκηνίου επιφάνειας εργασίας"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+"Ορισμός της επιλεγμένης φωτογραφίας σαν νέο παρασκήνιο επιφάνειας εργασίας"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Ορισμός ως προβολής διαφανειών _επιφάνειας εργασίας..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Αναίρεση"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Αναίρεση"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "Α_κύρωση αναίρεσης"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Ακύρωση αναίρεσης"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Μετονομασία συμβάντος..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Δημιουργία φωτογραφίας-_κλειδιού για το συμβάν"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Δημιουργία φωτογραφίας-κλειδιού για το συμβάν"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Νέο συμβάν"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Νέο συμβάν"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Μετακίνηση φωτογραφιών"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Μετακίνηση εικόνων σε ένα συμβάν"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Συγχώνευση συμβάντων"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Συγχώνευση"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Σύμπτηξη εκδηλώσεων σε μια εκδήλωση"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Ορισμός αξιολόγησης"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Ορισμός αξιολόγησης"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Αλλαγή της αξιολόγησης της φωτογραφίας"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Αύξηση"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Αύξηση αξιολόγησης"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Μείωση"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Μείωση αξιολόγησης"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Χωρίς αξιολόγηση"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Χωρίς αξιολόγηση"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Αξιολόγηση αβαθμολόγητων"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Ορισμός ως χωρίς αξιολόγηση"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Διαγραφή αξιολογήσεων"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Απορρίφθηκε"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Απορρίφθηκε"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Η αξιολόγηση απορρίφθηκε"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Ορισμός ως απορριφθείσα"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Ορισμός αξιολόγησης ως απορριφθείσα"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Απορριφθείσες _μόνο"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Απορριφθείσες μόνο"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Εμφάνιση μόνο των απορριφθέντων φωτογραφιών"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Όλες + _απορριφθείσες"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Προβολή όλων των φωτογραφιών, συμπεριλαμβανομένων των απορριφθέντων"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Ό_λες οι φωτογραφίες"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Εμφάνιση όλων των φωτογραφιών"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Α_ξιολογήσεις"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Προβολή αξιολόγησης κάθε φωτογραφίας"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Φιλτράρισμα φωτογραφιών"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Φιλτράρισμα φωτογραφιών"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Μείωση του αριθμού φωτογραφιών που προβάλλονται βάσει φίλτρου"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Α_ντίγραφο"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Αντίγραφο"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Δημιουργία αντιγράφου της φωτογραφίας"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Εξαγωγή..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Ε_κτύπωση..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Δημοσίευση..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Δημοσίευση σε διάφορες ιστοσελίδες"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Επεξεργασία _Τίτλου..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Επεξεργασία _σχολίου..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Επεξεργασία σχολίου"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Επεξεργασία _σχολίου συμβάντος..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Ρύθμιση ώ_ρας και ημερομηνίας..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ρύθμιση ημερομηνίας και ώρας"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Προσθήκη ετικετών..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Προσθήκη ετικετών..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Προσθήκη ετικετών"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Προτιμήσεις"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Άνοιγμα με Ε_ξωτερική Εφαρμογή"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Άνοιγμα με εφαρμογή _επεξεργασίας RAW"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Αποστολή _σε..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Αποστολή σ_ε..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Εύρεση..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Εύρεση"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Βρείτε μια φωτογραφία γράφοντας κείμενο που εμφανίζεται στο όνομα της ή στις "
+"ετικέτες της"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Επισήμανση"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Αναίρεση επισήμανσης"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Δεν ήταν δυνατή η εκκίνηση της εφαρμογής επεξεργασίας: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Προσθήκη ετικέτας \"%s\""
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Προσθήκη των ετικετών \"%s\" και \"%s\""
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Διαγραφή ετικέτας \"%s\""
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Διαγραφή ετικέτας \"%s\""
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Διαγραφή ετικέτας"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Νέο"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Με_τονομασία ετικέτας \"%s\"..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Μετονομασία ετικέτας \"%s\" σε \"%s\""
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Μετονομασία..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Μετατροπή ετικετών..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Μετατροπή ετικετών"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Ορισμός ετικέτας στις φωτογραφίες \"%s\""
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Προσθήκη στις φωτογραφίες της ετικέτας \"%s\""
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Ορισμός ετικέτας στις επιλεγμένες φωτογραφίες \"%s\""
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Προσθήκη στις επιλεγμένες φωτογραφίες της ετικέτας \"%s\""
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Αφαίρεση ετικέτας \"%s\" από τις _φωτογραφίες"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Αφαίρεση της ετικέτας \"%s\" από τις _επιλεγμένες φωτογραφίες"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Αφαίρεση ετικέτας \"%s\" από τις φωτογραφίες"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Αφαίρεση της ετικέτας \"%s\" από τις φωτογραφίες"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Αδυναμία μετονομασίας της ετικέτας \"%s\" επειδή η ετικέτα υπάρχει ήδη."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Δεν ήταν δυνατή η μετονομασία της αναζήτησης σε \"%s\" γιατί η αναζήτηση "
+"αυτή υπάρχει ήδη."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Αποθηκευμένη αναζήτηση"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Διαγραφή Αναζήτησης"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Επεξεργασία..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Με_τονομασία..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Μετονομασία της αναζήτησης \"%s\" σε \"%s\""
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Διαγραφή της Αναζήτησης \"%s\""
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Αξιολόγηση %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Ορισμός αξιολόγησης σε %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Ορισμός αξιολόγησης σε %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Προβολή %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Προβολή μόνο φωτογραφιών με αξιολόγηση %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ή καλύτερη"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Προβολή %s ή καλύτερων"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Προβολή μόνο φωτογραφιών με αξιολόγηση %s ή καλύτερη"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Αφαίρεση των επιλεγμένων εικόνων από τον κάδο"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Αφαίρεση των επιλεγμένων εικόνων από τη βιβλιοθήκη"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Επαναφορά"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Μετακίνηση των επιλεγμένων εικόνων πίσω στη βιβλιοθήκη"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Προβολή στη _διαχείριση αρχείων"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Άνοιγμα του φακέλου των επιλεγμένων εικόνων με τον περιηγητή αρχείων"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Αδυναμία ανοίγματος με τη διαχείριση αρχείων: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Απομάκρυνση από τη βιβλιοθήκη"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Μετακίνηση στον κάδο απορριμμάτων"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Επιλογή ό_λων"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Επιλογή όλων των αντικειμένων"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Προβολή σε αλληλουχία"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Με επισήμανση"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Φωτογραφίες"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Βίντεο"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Εικόνες RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "εικόνες RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Σφάλμα κατά τη φόρτωση του αρχείου UI %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Τύπος"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Αξιολόγηση"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Ρυθμίσεις"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Πίσω"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Μετάβαση στην προηγούμενη φωτογραφία"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Παύση"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Παύση αλληλουχίας"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Επόμενη"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Μετάβαση στην επόμενη φωτογραφία"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Αλλαγή ρυθμίσεων αλληλουχίας"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Όλα τα πηγαία αρχεία των φωτογραφιών λείπουν."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Αναπαραγωγή"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Συνέχιση αλληλουχίας"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "χωρίς τίτλο"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Εξαγωγή βίντεο"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Κάμερες"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Αδυναμία αποπροσάρτησης κάμερας. Προσπαθήστε να αποπροσαρτήσετε την κάμερα "
+"από τη διαχείριση αρχείων."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Απόκρυψη εικόνων που ήδη εισήχθησαν"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Εμφάνιση μόνο των φωτογραφιών που δεν έχουν εισαχθεί."
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Εκκίνηση εισαγωγής, παρακαλώ περιμένετε..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Εισαγωγή επιλεγμένων"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Εισαγωγή των επιλεγμένων φωτογραφιών στην βιβλιοθήκη"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_Εισαγωγή όλων"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Εισαγωγή όλων των φωτογραφιών στην βιβλιοθήκη"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Το Shotwell πρέπει να αποπροσαρτήσει την κάμερα από το σύστημα αρχείων για "
+"να έχει πρόσβαση σε αυτήν. Συνέχεια;"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Αποπροσάρτηση"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Παρακαλώ αποπροσαρτήστε την κάμερα."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Η κάμερα είναι κλειδωμένη από κάποια άλλη εφαρμογή. Το Shotwell μπορεί να "
+"έχει πρόσβαση στη κάμερα μόνο όταν είναι ξεκλείδωτη. Παρακαλώ κλείστε κάθε "
+"άλλη εφαρμογή που χρησιμοποιεί την κάμερα και προσπαθήστε ξανά."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Παρακαλώ κλείστε κάθε άλλη εφαρμογή που χρησιμοποιεί την κάμερα."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Αδυναμία μεταφοράς προεπισκοπήσεων από την κάμερα:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Αποπροσάρτηση..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Λήψη πληροφοριών φωτογραφίας"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Λήψη προεπισκοπήσεων για %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Αδυναμία κλειδώματος κάμερας: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Διαγραφή αυτής της φωτογραφίας από τη κάμερα;"
+msgstr[1] "Διαγραφή αυτών των %d φωτογραφιών από τη κάμερα;"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Διαγραφή αυτού του βίντεο από τη κάμερα;"
+msgstr[1] "Διαγραφή αυτών των %d βίντεο από τη κάμερα;"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Διαγραφή αυτής της φωτογραφίας/βίντεο από τη κάμερα;"
+msgstr[1] "Διαγραφή αυτών των %d φωτογραφιών/βίντεο από τη κάμερα;"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Να διαγραφούν αυτά τα αρχεία από την κάμερα;"
+msgstr[1] "Να διαγραφούν αυτά τα %d αρχεία από την κάμερα;"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Απομάκρυνση των φωτογραφιών/βίντεο από την κάμερα"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Αδυναμία διαγραφής %d φωτογραφίας/βίντεο από την κάμερα εξαιτίας σφαλμάτων."
+msgstr[1] ""
+"Αδυναμία διαγραφής %d φωτογραφιών/βίντεο από την κάμερα εξαιτίας σφαλμάτων."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Εισαγωγή Δεδομένων"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Βάση δεδομένων"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"Η εισαγωγή από το %s δεν μπορεί να συνεχίσει επειδή παρουσιάστηκε ενα σφάλμα:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Για να επιχειρήσετε την εισαγωγή από κάποια άλλη υπηρεσία, επιλέξτε μια από "
+"το μενού πιο πάνω."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Δεν έχετε ενεργοποιήσει τις πρόσθετες λειτουργίας εισαγωγής δεδομένων.\n"
+"\n"
+"Για να χρησιμοποιήσετε τη λειτουργία Εισαγωγής από Εφαρμογή, πρέπει να έχετε "
+"ενεργοποιήσει τουλάχιστο μια πρόσθετη λειτουργία εισαγωγής. Μπορείτε να "
+"ενεργοποιήσετε τις πρόσθετες λειτουργίες στις Ρυθμίσεις."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Αρχείο βάσης δεδομένων:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "Ει_σαγωγή"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Εισαγωγή από εφαρμογή"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Εισαγωγή πολυμέσων _από:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Κλείσιμο"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Αδυναμία ανοίγματος/δημιουργίας βάσης δεδομένων φωτογραφιών %s: κωδικός "
+"σφάλματος %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Δεν ήταν δυνατή η εγγραφή στη βάση δεδομένων φωτογραφιών:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Σφάλμα κατά την πρόσβαση στη βάση δεδομένων:\n"
+" %s\n"
+"\n"
+"Το σφάλμα ήταν: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Αρχείο"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "_Αποθήκευση"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Αποθήκευση φωτογραφίας"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Αποθήκευση _σαν..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Αποθήκευση φωτογραφίας με διαφορετικό όνομα"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+"Εκτυπώστε την φωτογραφία σε έναν εκτυπωτή συνδεδεμένο στον υπολογιστή σας"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Επεξεργασία"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Φωτογραφία"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Βοήθεια"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "Το %s δεν υπάρχει."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "Το %s δεν είναι αρχείο."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"Το %s δεν υποστηρίζει τη μορφή αρχείου του\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Αποθήκευση αντιγράφου"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Απόρριψη αλλαγών του %s;"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Κλείσιμο _χωρίς αποθήκευση"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Σφάλμα κατά την αποθήκευση στο %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Αποθήκευση ως"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Επιστροφή στις τρέχουσες διαστάσεις της φωτογραφίας"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Ορισμός κοπής της φωτογραφίας"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Στρέψτε το τετράγωνο κοπής μεταξύ προσανατολισμού πορτραίτου και τοπίου"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Χωρίς περιορισμούς"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Τετράγωνο"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Οθόνη"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8,5 x 11 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Κλείσιμο του εργαλείου κόκκινων ματιών"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+"Αφαίρεση κάθε επίδρασης του φαινομένου κόκκινων ματιών στην επιλεγμένη "
+"περιοχή"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Επαναφορά"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Κορεσμός:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Απόχρωση:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Θερμοκρασία:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Σκιές:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Επισημάνσεις:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Επαναφορά χρωμάτων"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Επαναφορά όλων των χρωματικών ρυθμίσεων στις αρχικές"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Θερμοκρασία"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Απόχρωση"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Κορεσμός"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Έκθεση"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Σκιές"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Επισημάνσεις"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Επέκταση αντίθεσης"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Γωνία:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Φωτογραφία/Βίντεο"
+msgstr[1] "%d Φωτογραφίες/Βίντεο"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Κανένα συμβάν"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Εμφάνιση του σχολίου κάθε συμβάντος"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Κανένα Συμβάν"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Δεν βρέθηκαν συμβάντα"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Συμβάντα"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Χωρίς ημερομηνία"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Φάκελοι"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Βιβλιοθήκη"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Γίνεται εισαγωγή..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Διακοπή Εισαγωγής"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Διακοπή εισαγωγής εικόνων"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Προετοιμασία για εισαγωγή..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Εισήχθησαν %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Τελευταία Εισαγωγή"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Εισαγωγή από _φάκελο..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Εισαγωγή φωτογραφιών από το δίσκο στη βιβλιοθήκη"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Εισαγωγή από _Εφαρμογή..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Ταξινόμηση συμβάντων"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Άδειασμα _κάδου απορριμμάτων"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Διαγραφή όλων των εικόνων στον κάδο απορριμμάτων"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Προβολή _συμβάντος φωτογραφίας"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Εύρεση"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Αναζήτηση φωτογραφιών και βίντεο βάσει κριτηρίων"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Νέα αποθηκευμένη αναζήτηση..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "Φω_τογραφίες"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Συ_μβάντα"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Βασικές πληροφορίες"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Προβολή βασικών πληροφοριών της επιλογής"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Εκτενείς _πληροφορίες"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Εμφάνιση εκτενών πληροφοριών της επιλογής"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Γραμμή αναζήτησης"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Εμφάνιση της γραμμής αναζήτησης"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Πλευ_ρική στήλη"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Εμφάνιση της πλαϊνής μπάρας"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Εισαγωγή από φάκελο"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Άδειασμα κάδου απορριμμάτων"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Άδειασμα κάδου..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Το Shotwell ρυθμίστηκε για να εισάγει φωτογραφίες στον προσωπικό σας "
+"κατάλογο.\n"
+"Συνιστούμε την αλλαγή του σε <span weight=\"bold\">Επεξεργασία %s "
+"προτιμήσεων</span>.\n"
+"Θέλετε να συνεχίσετε την εισαγωγή φωτογραφιών;"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Τοποθεσία βιβλιοθήκης"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Δεν ήταν δυνατή η εισαγωγή των φωτογραφιών από αυτόν τον φάκελο."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Ενημέρωση βιβλιοθήκης..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Προετοιμασία για αυτόματη εισαγωγή φωτογραφιών..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Αυτόματη εισαγωγή εικόνων..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Εγγραφή μεταδεδομένων στα αρχεία..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Αρχεία που λείπουν"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Διαγραφή..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Κάδος απορριμμάτων"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Ο κάδος απορριμάτων είναι άδειος"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Διαγραφή φωτογραφιών"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Η βιβλιοθήκη φωτογραφιών σας δεν είναι συμβατή με αυτή την έκδοση του "
+"Shotwell. Φαίνεται να δημιουργήθηκε με το Shotwell %s (schema %d). Η έκδοση "
+"αυτή είναι η %s (schema %d). Παρακαλώ χρησιμοποιήστε την τελευταία έκδοση "
+"του Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Το Shotwell δεν κατάφερε να αναβαθμίσει τη βιβλιοθήκη φωτογραφιών σας από "
+"την έκδοση %s (schema %d) στη %s (schema %d) . Για περισσότερες πληροφορίες "
+"παρακαλούμε ελέγξτε το Shotwell Wiki στο %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Η βιβλιοθήκη των φωτογραφιών σας δεν είναι συμβατή με αυτή την έκδοση του "
+"Shotwell. Φαίνεται πως δημιουργήθηκε με το Shotwell %s (schema %d). Η έκδοση "
+"αυτή είναι η %s (schema %d). Παρακαλώ εκκαθαρίστε τη βιβλιοθήκη σας "
+"διαγράφοντας το %s και εισάγοντας ξανά τις φωτογραφίες σας."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Άγνωστο σφάλμα κατά την προσπάθεια επαλήθευσης της βάσης δεδομένων του "
+"Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Φόρτωση Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Διαδρομή για τα ιδιωτικά δεδομένα του Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ΚΑΤΑΛΟΓΟΣ"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Μη παρακολούθηση του φακέλου της βιβλιοθήκης κατά την εκτέλεση για αλλαγές"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Μη εμφάνιση του μετρητή προόδου εκκίνησης"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Εμφάνιση της έκδοσης της εφαρμογής"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[ΑΡΧΕΙΟ]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Εκτελέστε '%s --help' για να δείτε μια πλήρη λίστα με τα διαθέσιμα ορίσματα "
+"γραμμής εντολών.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Χαμηλό (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Μεσαίο (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Υψηλό (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Μέγιστο (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Δημοσίευση"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Προετοιμασία για ανέβασμα"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Ανέβασμα %d από %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Η δημοσίευση στο %s δεν μπορεί να συνεχιστεί εξαιτίας ενός σφάλματος:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Προσπαθήστε να δημοσιεύσετε σε άλλη υπηρεσία, επιλέγοντας κάποια από το "
+"μενού παρακάτω."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Οι επιλεγμένες φωτογραφίες/βίντεο δημοσιεύθηκαν επιτυχώς."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Τα επιλεγμένα βίντεο δημοσιεύθηκαν επιτυχώς."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Οι επιλεγμένες φωτογραφίες δημοσιεύθηκαν επιτυχώς."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Το επιλεγμένο βίντεο δημοσιοποιήθηκε με επιτυχία."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Η επιλεγμένη φωτογραφία δημοσιοποιήθηκε με επιτυχία."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Λήψη πληροφοριών λογαριασμού..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Σύνδεση..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Δημοσίευση φωτογραφιών"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Δημοσίευση _φωτογραφιών στο:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Δημοσίευση βίντεο"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Δημοσίευση _φωτογραφιών στο"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Δημοσίευση φωτογραφιών και βίντεο"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Δημοσίευση φωτογραφιών και βίντεο _στο"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Δεν ήταν δυνατή η δημοσίευση"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Το Shotwell δεν μπορεί να δημοσιοποιήσει τα επιλεγμένα αντικείμενα επειδή "
+"δεν έχετε κάποιο συμβατό πρόσθετο ενεργοποιημένο. Για να το διορθώσετε αυτό, "
+"επιλέξτε <b>Επεξεργασία %s προτιμήσεων</b> και ενεργοποιήστε ένα ή "
+"περισσότερα πρόσθετα που αφορούν τις δημοσιεύσεις στην καρτέλα <b>Πρόσθετα</"
+"b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Αποθηκευμένες Αναζητήσεις"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "περιέχει"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "είναι ακριβώς"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "αρχίζει με"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "τελειώνει με"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "δεν περιέχει"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "δεν είναι ορισμένο"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "είναι"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "δεν είναι"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "οποιαδήποτε φωτογραφία"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "μια φωτογραφία raw"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ένα βίντεο"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "έχει"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "δεν έχει"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "τροποποιήσεις"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "εσωτερικές τροποποιήσεις"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "εξωτερικές τροποποιήσεις"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "με ετικέτα"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "χωρίς ετικέτα"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "και ψηλότερα"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "μόνο"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "και χαμηλότερα"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "είναι μετά"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "είναι πριν"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "είναι ανάμεσα"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "και"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "οποιαδήποτε"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "όλα"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "καμία"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Οποιοδήποτε κείμενο"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Τίτλος"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Ετικέτα"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Σχόλιο"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "όνομα Γεγονότος"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "όνομα Αρχείου"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "τύπος Μέσου"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Επισήμανση κατάστασης"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Κατάσταση φωτογραφίας"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Ημερομηνία"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Καινούρια _Καρτέλα..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Μεταβάσεις Προβολής Διαφανειών"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Κανένα)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Κανένα"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Τυχαίο"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Ετικέτες"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Ορισμός ως προβολής διαφανειών επιφάνειας εργασίας"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Δημιουργία προβολής διαφανειών παρασκηνίου επιφάνειας εργασίας"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Εμφάνιση κάθε φωτογραφίας για"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "περίοδος χρόνου"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"Το χρονικό διάστημα κατά το οποίο μια φωτογραφία παραμένει στην επιφάνεια "
+"εργασίας"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "Ό_νομα αναζήτησης:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Ταίριασμα"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "από τα παρακάτω:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Μέγεθος εκτυπωμένης εικόνας</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Χρήση πρό_τυπου μέγεθους:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Χρήση _προσαρμοσμένου μεγέθους:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Ταίριασμα με τις αναλογίες της φωτογραφίας"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Αυτόματο μέγεθος:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Τίτλοι</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "_Εκτύπωση τίτλου εικόνας"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Ανάλυση εικονοστοιχείου</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "Ε_ξαγωγή φωτογραφίας στο:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "εικονοστοιχεία ανά ίντσα"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Προτιμήσεις Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "λευκό"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "μαύρο"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Παρακολούθηση φακέλου βιβλιοθήκης για νέα αρχεία"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Μεταδεδομένα"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Εγγραφή ετικετών, τίτλων και λοιπών _μεταδεδομένων στα αρχεία φωτογραφιών"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Προβολή"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "Εισαγωγή _φωτογραφιών στο:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Παρασκήνιο:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Εισαγωγή"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "_Δομή καταλόγου:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Υπόδειγμα:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Παράδειγμα:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "_Μετονομασία των εισαγόμενων αρχείων με χρήση πεζών γραμμάτων"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Εφαρμογή επεξεργασίας RAW αρχείων"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Προεπιλογή:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Ε_ξωτερικός Επεξεργαστής φωτογραφιών:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Εξωτερική εφαρμογή _επεξεργασίας αρχείων RAW:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Εξωτερικές εφαρμογές επεξεργασίας"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Πρόσθετα"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Καθυστέρηση:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "_Εφέ μετάβασης:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Καθυστέρηση _μετάβασης:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Εμφάνιση _τίτλου"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "δευτερόλεπτα"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Σύνδεση"
+
+#~ msgid ""
+#~ "You are logged into Tumblr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Είστε συνδεδεμένοι στο Tumblr ως (name).\n"
+#~ "\n"
+#~ "(το κείμενο αυτής της καρτέλας είναι συμπληρωμένο και περιέχεται στον "
+#~ "κώδικα, \n"
+#~ "έτσι οι αλλαγές που γίνονται σε αυτό το σημείο δεν θα παρουσιάζονται)"
+
+#~ msgid ""
+#~ " (text depends on fb username and is modified in the app - \n"
+#~ "anything put into this field won't display)"
+#~ msgstr ""
+#~ " (το κείμενο εξαρτάται από το όνομα χρήστη fb και τροποποιείται στην "
+#~ "εφαρμογή - \n"
+#~ "ο,τιδήποτε τοποθετημένο σε αυτό το πεδίο δεν θα εμφανιστεί)"
+
+#~ msgid ""
+#~ "You are logged into Flickr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Είστε συνδεδεμένοι στο Flickr ως (όνομα).\n"
+#~ "\n"
+#~ "(η συμβολοσειρά αυτής της καρτέλας είναι συμπληρωμένη και περιέχεται στον "
+#~ "κώδικα, \n"
+#~ "έτσι οι αλλαγές που γίνονται εδώ δεν θα εμφανιστούν)"
+
+#~ msgid "_visibility label (populated in the code)"
+#~ msgstr "η ετικέτα _ορατότητας (συμπληρωμένη στον κώδικα)"
+
+#~ msgid ""
+#~ "'you are logged in as $name'\n"
+#~ "(populated in the application code)"
+#~ msgstr ""
+#~ "'είσαστε συνδεμένοι ως $name'\n"
+#~ "(συμπληρωμένο στον κώδικα εφαρμογής)"
+
+#~ msgid ""
+#~ "$mediatype will appear in\n"
+#~ "(populated in code)"
+#~ msgstr ""
+#~ "Το $mediatype θα εμφανιστεί στο\n"
+#~ "(συμπληρωμένο σε κώδικα)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr ""
+#~ "Το Shotwell είναι ρυθμισμένο ώστε να εισάγει φωτογραφίες στον προσωπικό "
+#~ "σας φάκελο.\n"
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..bbf88c3
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,4557 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Bruce Cowan <bruce@bcowan.me.uk>, 2012-2013
+# Bruce Cowan <l10n@bcowan.fastmail.co.uk>, 2011
+# Ekaterina Gerasimova <bagira00@hotmail.com>, 2012
+# verayin <vera@yorba.org>, 2011
+# Bruce Cowan <bruce@bcowan.me.uk>, 2012
+# Bruce Cowan <bruce@bcowan.me.uk>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
+"shotwell/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Event %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Cameras"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Camera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Hide photos already imported"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Only display photos that have not been imported"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Starting import, please wait..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titles"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Display the title of each photo"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Import _Selected"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Import the selected photos into your library"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Import _All"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Import all the photos into your library"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Unmount"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Please unmount the camera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Please close any other application using the camera."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Unmounting..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Fetching photo information"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Fetching preview for %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Unable to lock camera: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Delete this photo from camera?"
+msgstr[1] "Delete these %d photos from camera?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Delete this video from camera?"
+msgstr[1] "Delete these %d videos from camera?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Delete this photo/video from camera?"
+msgstr[1] "Delete these %d photos/videos from camera?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Delete these files from camera?"
+msgstr[1] "Delete these %d files from camera?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Keep"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Removing photos/videos from camera"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Unable to delete %d photo/video from the camera due to errors."
+msgstr[1] "Unable to delete %d photos/videos from the camera due to errors."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "S_lideshow"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Play a slideshow"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Export Photos/Videos"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Export Photos/Videos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Export Photos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Export Photos"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotating"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Undoing Rotate"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Flipping Horizontally"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Undoing Flip Horizontally"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Flipping Vertically"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Undoing Flip Vertically"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Any text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Title"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tag"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Event name"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "File name"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Media type"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Flag state"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Rating"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Date"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contains"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "is exactly"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "starts with"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ends with"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "does not contain"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "is not set"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "is"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "is not"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "any photo"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "a raw photo"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "a video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "flagged"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "not flagged"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "and higher"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "only"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "and"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "is after"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "is before"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "is between"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "and"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "any"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "all"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "none"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Saved Searches"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Ne_w Saved Search..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Unknown error attempting to verify Shotwell's database: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Loading Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Path to Shotwell's private data"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Do not monitor library directory at runtime for changes"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Don't display startup progress meter"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Show the application's version"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Run '%s --help' to see a full list of available command line options.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Today"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Yesterday"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Title:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Items:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d Event"
+msgstr[1] "%d Events"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Photo"
+msgstr[1] "%d Photos"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d Video"
+msgstr[1] "%d Videos"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Date:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Time:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "From:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "To:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Size:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Duration:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f seconds"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Developer:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Exposure:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Location:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "File size:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Current Development:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Original dimensions:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Camera make:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Camera model:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Focal length:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Exposure date:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Exposure time:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposure bias:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS latitude:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS longitude:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artist:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Comment:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Extended Information"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "This will remove the tag \"%s\" from one photo. Continue?"
+msgstr[1] "This will remove the tag \"%s\" from %d photos. Continue?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancel"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Delete"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "This will remove the saved search \"%s\". Continue?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgstr[1] ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Switch Developer"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Export Video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinue"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Unmodified"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Current"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Quality:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Scaling constraint:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixels"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Export metadata"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Save Details..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Save Details"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(and %d more)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Import Results Report"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Attempted to import %d file."
+msgstr[1] "Attempted to import %d files."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Of these, %d file was successfully imported."
+msgstr[1] "Of these, %d files were successfully imported."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplicate Photos/Videos Not Imported:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplicates existing media item"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Photos/Videos Not Imported Due to Camera Errors:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "error message:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Files Not Imported Because They Weren't Recognised as Photos or Videos:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"couldn't copy %s\n"
+"\tto %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Photos/Videos Not Imported for Other Reasons:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 duplicate photo was not imported:\n"
+msgstr[1] "%d duplicate photos were not imported:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 duplicate video was not imported:\n"
+msgstr[1] "%d duplicate videos were not imported:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 duplicate photo/video was not imported:\n"
+msgstr[1] "%d duplicate photos/videos were not imported:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 photo failed to import due to a file or hardware error:\n"
+msgstr[1] "%d photos failed to import due to a file or hardware error:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 video failed to import due to a file or hardware error:\n"
+msgstr[1] "%d videos failed to import due to a file or hardware error:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 photo/video failed to import due to a file or hardware error:\n"
+msgstr[1] ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "1 file failed to import due to a file or hardware error:\n"
+msgstr[1] "%d files failed to import due to a file or hardware error:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[1] ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[1] ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[1] ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgstr[1] ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 photo failed to import due to a camera error:\n"
+msgstr[1] "%d photos failed to import due to a camera error:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video failed to import due to a camera error:\n"
+msgstr[1] "%d videos failed to import due to a camera error:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 photo/video failed to import due to a camera error:\n"
+msgstr[1] "%d photos/videos failed to import due to a camera error:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 file failed to import due to a camera error:\n"
+msgstr[1] "%d files failed to import due to a camera error:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 unsupported photo skipped:\n"
+msgstr[1] "%d unsupported photos skipped:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 non-image file skipped.\n"
+msgstr[1] "%d non-image files skipped.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 photo skipped due to user cancel:\n"
+msgstr[1] "%d photos skipped due to user cancel:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video skipped due to user cancel:\n"
+msgstr[1] "%d videos skipped due to user cancel:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 photo/video skipped due to user cancel:\n"
+msgstr[1] "%d photos/videos skipped due to user cancel:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 file skipped due to user cancel:\n"
+msgstr[1] "%d file skipped due to user cancel:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 photo successfully imported.\n"
+msgstr[1] "%d photos successfully imported.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video successfully imported.\n"
+msgstr[1] "%d videos successfully imported.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 photo/video successfully imported.\n"
+msgstr[1] "%d photos/videos successfully imported.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "No photos or videos imported.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import Complete"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d second"
+msgstr[1] "%d seconds"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hour"
+msgstr[1] "%d hours"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 day"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Rename Event"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Name:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Edit Title"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Move File"
+msgstr[1] "_Move Files"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Only _Remove"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Revert External Edit?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Revert External Edits?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "This will destroy all changes made to the external file. Continue?"
+msgstr[1] "This will destroy all changes made to %d external files. Continue?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_vert External Edits"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Re_vert External Edits"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "This will remove the photo from the library. Continue?"
+msgstr[1] "This will remove %d photos from the library. Continue?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Remove"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Remove Photos From Library"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Remove Photos From Library"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Shift photos/videos by the same amount"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Set _all photos/videos to this time"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modify original photo file"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modify original photo files"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modify original files"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modify original files"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "day"
+msgstr[1] "days"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hour"
+msgstr[1] "hours"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "second"
+msgstr[1] "seconds"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"And %d other."
+msgstr[1] ""
+"\n"
+"\n"
+"And %d others."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Tags (separated by commas):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Welcome!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Welcome to Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "To get started, import photos in any of these ways:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Drag and drop photos onto the Shotwell window"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Connect a camera to your computer and import"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Import photos from your %s folder"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "You can also import photos in any of these ways:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Don't show this message again"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Import photos from your %s library"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Help)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Year%sMonth%sDay"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Year%sMonth"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Year%sMonth-Day"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Year-Month-Day"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Custom"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Invalid pattern"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_py Photos"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Import in Place"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Import to Library"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Remove From Library"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Removing Photos From Library"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Removing Photos From Library"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop wastebasket?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"The photo or video cannot be moved to your desktop wastebasket. Delete this "
+"file?"
+msgstr[1] ""
+"%d photos/videos cannot be moved to your desktop wastebasket. Delete these "
+"files?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "The photo or video cannot be deleted."
+msgstr[1] "%d photos/videos cannot be deleted."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Folders"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Tags"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Success"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "File error"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Unable to decode file"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Database error"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "User aborted import"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Not a file"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "File already exists in database"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Unsupported file format"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Not an image file"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Disk failure"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk full"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Camera error"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "File write error"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Imported failed (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modified"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Previous photo"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Next photo"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Photo source file missing: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_View"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "T_ools"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Previous Photo"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Previous Photo"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Next Photo"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Next Photo"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Zoom _In"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Increase the magnification of the photo"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Zoom _Out"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Decrease the magnification of the photo"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Fit to _Page"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoom the photo to fit on the screen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zoom the photo to 100% magnification"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zoom the photo to 200% magnification"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Developer"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Unable to export %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Database"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importing from %s can't continue because an error occurred:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "To try importing from another service, select one from the above menu."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Data Imports"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialogue."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Database file:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Import"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Import From Application"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Import media _from:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Close"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Settings"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Slideshow"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Back"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Go to the previous photo"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pause"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pause the slideshow"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Next"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Go to the next photo"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Change slideshow settings"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "All photo source files are missing."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Play"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continue the slideshow"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Reverting"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Undoing Revert"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Enhancing"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Undoing Enhance"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Creating New Event"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Removing Event"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Moving Photos to New Event"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Setting Photos to Previous Event"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Merging"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Unmerging"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicating photos"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Removing duplicated photos"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Unable to duplicate one photo due to a file error"
+msgstr[1] "Unable to duplicate %d photos due to file errors"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Restoring previous rating"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Increasing ratings"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Decreasing ratings"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Setting RAW developer"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Restoring previous RAW developer"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Set Developer"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Original photo could not be adjusted."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Adjusting Date and Time"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Undoing Date and Time Adjustment"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "One original photo could not be adjusted."
+msgstr[1] "The following original photos could not be adjusted."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Time Adjustment Error"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Time adjustments could not be undone on the following photo file."
+msgstr[1] "Time adjustments could not be undone on the following photo files."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Create Tag"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Move Tag \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Move Photos to Wastebasket"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restore Photos from Wastebasket"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Move the photos to the Shotwell wastebasket"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restore the photos back to the Shotwell library"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Moving Photos to Wastebasket"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restoring Photos From Wastebasket"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Flag selected photos"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Unflag selected photos"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Flag"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Unflag"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Low (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Medium (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "High (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximum (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "No photos/videos"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "No photos/videos found"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Photos cannot be exported to this directory."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Unable to process monitoring updates: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Fill the entire page"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 images per page"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 images per page"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 images per page"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 images per page"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 images per page"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 images per page"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Wallet (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postcard (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Image Settings"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Printing..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Unable to open/create photo database %s: error code %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Unable to write to photo database file:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Export Videos"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Unable to launch Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Send To"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Unable to export background to %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Unable to prepare desktop slideshow: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Flagged"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Wastebasket"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Wastebasket is empty"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Delete"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Deleting Photos"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Missing Files"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Deleting..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Last Import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Import From Folder..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Import photos from disk to library"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Import From _Application..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sort _Events"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Empty _Wastebasket"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Delete all photos in the wastebasket"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "View Eve_nt for Photo"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Find"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Find photos and videos by search criteria"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_File"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Edit"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Photo"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Photos"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_ts"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ta_gs"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Help"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Basic Information"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Display basic information for the selection"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "E_xtended Information"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Display extended information for the selection"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Search Bar"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Display the search bar"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "S_idebar"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Display the sidebar"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Ascending"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sort photos in an ascending order"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escending"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sort photos in a descending order"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Import From Folder"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Empty Wastebasket"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Emptying Wastebasket..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell is configured to import photos to your home directory.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Library Location"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Photos cannot be imported from this directory."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Updating library..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Preparing to auto-import photos..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Auto-importing photos..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Writing metadata to files..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Library"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importing..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Stop Import"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Stop importing photos"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Preparing to import..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Imported %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Save"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Save photo"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Save _As..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Save photo with a different name"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Print the photo to a printer connected to your computer"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s does not exist."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s is not a file."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s does not support the file format of\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Save a Copy"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Lose changes to %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Close _without Saving"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Error while saving to %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Save As"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Unable to monitor %s: Not a directory (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Photo Manager"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Photo Viewer"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotate _Right"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotate"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotate Right"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Rotate the photos right (press Ctrl to rotate left)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotate _Left"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotate Left"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotate the photos left"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Flip Hori_zontally"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Flip Horizontally"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Flip Verti_cally"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Flip Vertically"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Enhance"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Enhance"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatically improve the photo's appearance"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Crop"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Crop"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Crop the photo's size"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Straighten"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Straighten"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Straighten the photo"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Red-eye"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Red-eye"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reduce or eliminate any red-eye effects in the photo"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Adjust"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Adjust"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Adjust the photo's colour and tone"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Re_vert to Original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Revert to Original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Revert External E_dits"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Revert to the master photo"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Set as _Desktop Background"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Set selected image to be the new desktop background"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Set as _Desktop Slideshow..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Undo"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Undo"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Redo"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Redo"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_name Event..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Make _Key Photo for Event"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Make Key Photo for Event"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_New Event"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "New Event"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Move Photos"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Move photos to an event"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Merge Events"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Merge"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combine events into a single event"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Set Rating"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Set Rating"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Change the rating of your photo"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Increase"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Increase Rating"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Decrease"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Decrease Rating"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Unrated"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Unrated"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Rate Unrated"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Setting as unrated"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Remove any ratings"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rejected"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rejected"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Rate Rejected"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Setting as rejected"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Set rating to rejected"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Rejected _Only"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Rejected Only"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Show only rejected photos"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "All + _Rejected"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Show all photos, including rejected"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_All Photos"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Show all photos"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Ratings"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Display each photo's rating"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filter Photos"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filter Photos"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limit the number of photos displayed based on a filter"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicate"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicate"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Make a duplicate of the photo"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Export..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Print..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blish..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publish"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publish to various websites"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Edit _Title..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Edit _Comment..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Edit Comment"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Adjust Date and Time..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Adjust Date and Time"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Add _Tags..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Add Tags..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Add Tags"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferences"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Open With E_xternal Editor"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Open With RA_W Editor"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Send _To..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Send T_o..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Find..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Find"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Find an image by typing text that appears in its name or tags"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Flag"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Un_flag"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Unable to launch editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Add Tag \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Add Tags \"%s\" and \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Delete Tag \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Delete Tag \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Delete Tag"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_New"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_name Tag \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Rename Tag \"%s\" to \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Rename..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modif_y Tags..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modify Tags"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Tag Photos as \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Tag Photos as \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Tag the selected photos as \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Tag the selected photos as \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Remove Tag \"%s\" From _Photos"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Remove Tag \"%s\" From _Photos"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Remove Tag \"%s\" From Photos"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Remove Tag \"%s\" From Photos"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Unable to rename tag to \"%s\" because the tag already exists."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Unable to rename search to \"%s\" because the search already exists."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Saved Search"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Delete Search"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Edit..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Re_name..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Rename Search \"%s\" to \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Delete Search \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Rate %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Set rating to %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Setting rating to %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Display %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Only show photos with a rating of %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s or Better"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Display %s or Better"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Only show photos with a rating of %s or better"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Remove the selected photos from the wastebasket"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Remove the selected photos from the library"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restore"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Move the selected photos back into the library"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Show in File Mana_ger"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Open the selected photo's directory in the file manager"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Unable to open in file manager: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "R_emove From Library"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Move to Wastebasket"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Select _All"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Select all items"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d %b, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Angle:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Reset"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Return to current photo dimensions"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Set the crop for this photo"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Pivot the crop rectangle between portrait and landscape orientations"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Unconstrained"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Square"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Screen"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Original Size"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Close the red-eye tool"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Remove any red-eye effects in the selected region"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturation:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tint:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperature:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Shadows:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Reset Colours"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Reset all colour adjustments to original"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperature"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tint"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturation"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Exposure"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Shadows"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Contrast Expansion"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Pin Toolbar"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Pin the toolbar open"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Leave fullscreen"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Leave _Fullscreen"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Quit"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_About"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Fulls_creen"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Contents"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Frequently Asked Questions"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Report a Problem..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Visit the Yorba web site"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Bruce Cowan <bruce@bcowan.me.uk>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Unable to display help: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Unable to navigate to bug database: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Unable to display FAQ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "untitled"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Original size"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Width or height"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Width"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Height"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Adjust the size of the thumbnails"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Increase the magnification of the thumbnails"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Decrease the magnification of the thumbnails"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Sort _Photos"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Play Video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Open the selected videos in the system video player"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comments"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Display the comment of each photo"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Display each photo's tags"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "By _Title"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Sort photos by title"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "By Exposure _Date"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Sort photos by exposure date"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "By _Rating"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Sort photos by rating"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Photo/Video"
+msgstr[1] "%d Photos/Videos"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Display the comment of each event"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "No events"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "No events found"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Events"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Undated"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "No Event"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Unable to create cache directory %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Unable to create data directory %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Pictures"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Unable to create temporary directory %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Unable to create data subdirectory %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(None)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "None"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Random"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Slideshow Transitions"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Unable to generate a temporary file for %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exporting"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "File %s already exists. Replace?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Skip"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Replace"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Replace _All"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Export"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Photos"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videos"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW Photos"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW photos"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Error loading UI file %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Type"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publishing"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "The selected photos/videos were successfully published."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "The selected videos were successfully published."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "The selected photos were successfully published."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "The selected video was successfully published."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "The selected photo was successfully published."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Fetching account information..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Logging in..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publish Photos"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publish photos _to:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publish Videos"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publish videos _to"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publish Photos and Videos"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publish photos and videos _to"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Unable to publish"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Preparing for upload"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Uploading %d of %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Publishing to %s can't continue because an error occurred:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "To try publishing to another service, select one from the above menu."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "New _Tag..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "A temporary file needed for publishing is unavailable"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "You are logged into YouTube as %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videos will appear in '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Public listed"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Public unlisted"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Private"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Core Publishing Services"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorise Shotwell Connect to link to your Flickr account."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Preparing for login..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verifying authorisation..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"You are logged into Flickr as %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Your Flickr Pro account entitles you to unlimited uploads."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Photos _visible to:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videos _visible to:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Photos and videos _visible to:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Everyone"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Friends & family only"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Family only"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Friends only"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Just me"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Creating album %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "An error message occurred when publishing to Piwigo. Please try again."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Username and/or password invalid. Please try again"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Invalid URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Invalid User Name or Password"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Admins, Family, Friends, Contacts"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Admins, Family, Friends"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Admins, Family"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Admins"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorise Shotwell Connect to link to your Picasa Web Albums account."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Creating album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "You are logged into Picasa Web Albums as %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videos will appear in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Photos will appear in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Small (640 x 480 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Medium (1024 x 768 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recommended (1600 x 1200 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Large (2048 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testing connection to Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"You are logged into Facebook as %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Where would you like to publish the selected photos?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Upload _size:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Friends"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Crumble"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Chess"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Circles"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Blinds"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Stripes"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Clock"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Circle"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Core Slideshow Transitions"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slide"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Fade"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Squares"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Core Data Import Services"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Manually select an F-Spot database file to import:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot library: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparing to import"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Set as Desktop Slideshow"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Generate desktop background slideshow"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Show each photo for"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "period of time"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "How long each photo is shown on the desktop background"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Search"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Name of search:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Match"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "of the following:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Printed Image Size</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Use a _standard size:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Use a c_ustom size:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Match photo aspect ratio"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Autosize:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titles</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Print image _title"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pixel Resolution</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Output photo at:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixels per inch"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "label"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell Preferences"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "white"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "black"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Watch library directory for new files"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Write tags, titles, and other _metadata to photo files"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Display"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Import photos to:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Background:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importing"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Directory structure:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Pattern:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Example:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "R_ename imported files to lowercase"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW Developer"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "De_fault:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_xternal photo editor:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "External _RAW editor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "External Editors"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Delay:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Transition effect:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Transition d_elay:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Show t_itle"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "seconds"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Login"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publish to an e_xisting album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Create a _new album named:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videos and new photo albums _visible to:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Logout"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publish"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Authorisation _Number:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Photo _size:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "An _existing album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "A _new album named:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "L_ist album in public gallery"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Photo _size preset:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL of your Piwigo photo library"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "User _name"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Password"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Remember Password"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Login"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "An _existing category:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Photos will be _visible by:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Photo size:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Logout"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Video privacy _setting:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visit the Yandex.Fotki web site"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "You are not currently logged into Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albums (or write new):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Access _type:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Disable _comments"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Forbid downloading original photo"
diff --git a/po/eo.po b/po/eo.po
new file mode 100644
index 0000000..2caf0cc
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,146 @@
+# po/shotwell-extras/shotwell-extras.pot
+# PO Message String Template File for Shotwell Extra Plugins
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+# Translators:
+# R2D221 <r2d2.art2005@gmail.com>, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-extras-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: R2D221 <r2d2.art2005@gmail.com>\n"
+"Language-Team: Esperanto (http://www.transifex.com/projects/p/shotwell/language/eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 bilderoj"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 bilderoj"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 bilderoj"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+msgid "Invalid User Name or Password"
+msgstr "Nevalida Uzantonomo aŭ Pasvorto"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Kopirajto 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Vizitu la retejon de Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Vi nuntempe ne estas ensalutita en Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etikedo"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Pasvorto"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Ensaluti"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogoj:"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publikigi"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..15966f6
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,4630 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2011-2013
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2013
+# Alejandro Johnson C. <alejandrojohnson750@hotmail.com>, 2012
+# Andres <andreshko9@hotmail.com>, 2011
+# Claudio Rodrigo Pereyra Diaz <elsupergomez@gmail.com>, 2012-2013
+# Jorge González <aloriel@gmail.com>, 2011
+# Matias Menich <und34d@gmail.com>, 2012
+# Rodrigo Cares <rcares@gmail.com>, 2012-2013
+# verayin <vera@yorba.org>, 2011
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2011-2012
+# freddy sequera <nemecis000@gmail.com>, 2011
+# Jorge González <aloriel@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Matias Menich <und34d@gmail.com>, 2012
+# Rodrigo Cares <rcares@gmail.com>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-21 22:10+0000\n"
+"Last-Translator: Adolfo Jayme Barrientos <fitoschido@ubuntu.com>\n"
+"Language-Team: Spanish (http://www.transifex.com/projects/p/shotwell/"
+"language/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Evento %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Cámaras"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Cámara"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"No se puede desmontar la cámara. Intente desmontar la cámara desde el gestor "
+"de archivos."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ocultar fotos ya importadas"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Mostrar solo las fotos que no han sido importadas"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Iniciando la importación, espere un momento…"
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Títulos"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Mostrar el título de cada foto"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importar _seleccionadas"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importar las fotos seleccionadas a su colección"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importar tod_as"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importar todas las fotos a su colección"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell necesita desmontar la cámara del sistema de archivos con el fin de "
+"acceder a ella. ¿Continuar?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmontar"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Desmonte la cámara."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"La cámara está bloqueada por otra aplicación. Shotwell solo puede acceder a "
+"la cámara cuando está desbloqueada. Cierre cualquier otra aplicación que "
+"esté utilizando la cámara e inténtelo de nuevo."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Cierre cualquier otra aplicación que esté utilizando la cámara."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"No se pueden obtener previsualizaciones de la cámara:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Desmontando…"
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Obteniendo información de la foto"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Obteniendo previsualización para %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "No se puede bloquear la cámara: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "¿Quiere eliminar esta foto de la cámara?"
+msgstr[1] "¿Quiere eliminar estas %d fotos de la cámara?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "¿Quiere eliminar esta foto de la cámara?"
+msgstr[1] "¿Quiere eliminar estas %d fotos de la cámara?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "¿Quiere eliminar esta foto/vídeo de la cámara?"
+msgstr[1] "¿Quiere eliminar estas %d fotos/vídeos de la cámara?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "¿Eliminar este archivo de la cámara?"
+msgstr[1] "¿Eliminar estos %d archivos de la cámara?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Mantener"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Eliminando fotos/vídeos de la cámara"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "No se puede eliminar %d foto/vídeo de la cámara, debido a errores."
+msgstr[1] ""
+"No se pueden eliminar %d fotos/vídeos de la cámara, debido a errores."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diapositivas"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Iniciar un pase de diapositivas"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportar foto o vídeo"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportar fotos/vídeos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exportar foto"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportar fotos"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Girando"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Deshaciendo el giro"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Volteando horizontalmente"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Deshaciendo volteo horizontal"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Volteando verticalmente"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Deshaciendo volteo vertical"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Cualquier texto"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Título"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Comentario"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nombre del acontecimiento"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nombre del archivo"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipo de medio"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Estado de la opción"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Estado de la foto"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Puntuación"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Fecha"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contiene"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "es exactamente"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "comienza por"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "termina por"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "no contiene"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "no está establecida"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "es"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "no es"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "cualquier foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "una foto en «raw»"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "un vídeo"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "tiene"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "no tiene"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modificaciones"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modificaciones internas"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modificaciones externas"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "marcada"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "no marcada"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "y superior"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "solo"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "e inferior"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "está después"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "está antes"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "está entre"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "y"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "cualquiera"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "todos"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ninguna"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Búsquedas guardadas"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Búsqueda guardada nueva…"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Su colección de fotos no es compatible con esta versión de Shotwell. Parece "
+"que fue creada por Shotwell %s (esquema %d). Esta versión es %s (esquema "
+"%d). Use la versión más reciente de Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell no pudo actualizar su colección de fotos desde la versión %s "
+"(esquema %d) a la %s (esquema %d). Para obtener más información , consulte "
+"el wiki de Shotwell en %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Su colección de fotos no es compatible con esta versión de Shotwell. Parece "
+"que fue creada por Shotwell %s (esquema %d). Esta versión es %s (esquema "
+"%d). Vacíe la colección mediante la eliminación de %s, y vuelva a importar "
+"las fotos."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Error desconocido al intentar verificar la base de datos de Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Cargando Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Ruta a los datos privados de Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORIO"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"No monitorear el directorio de la colección en tiempo de ejecución para "
+"buscar cambios"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "No mostrar medidor de progreso de inicio"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Mostrar la versión de la aplicación"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ARCHIVO]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Ejecute «%s --help» para ver una lista completa de opciones de línea de "
+"órdenes.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Hoy"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Título:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementos:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d evento"
+msgstr[1] "%d eventos"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotos"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vídeo"
+msgstr[1] "%d vídeos"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Fecha:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "De:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "A:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Tamaño:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Duración:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segundos"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Revelador:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Exposición:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Ubicación:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Tamaño del archivo:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Desarrollo actual:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensiones originales:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Cámara:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modelo de la cámara:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Longitud focal:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Fecha de exposición:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Tiempo de exposición:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposición:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitud GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitud GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Información extendida"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Esto eliminará la etiqueta «%s» de una foto. ¿Continuar?"
+msgstr[1] "Esto eliminará la etiqueta «%s» de %d fotos. ¿Continuar?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Esto quitará la búsqueda guardada «%s». ¿Quiere continuar?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Al cambiar de revelador se desharán todos los cambios que realizó a esta "
+"foto en Shotwell"
+msgstr[1] ""
+"Al cambiar de revelador se desharán todos los cambios que realizó a estas "
+"fotos en Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Cambiar de revelador"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportar vídeo"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell no pudo crear un archivo para editar esta foto porque no tiene "
+"permiso para escribir en %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr "No se puede exportar la siguiente foto debido a un error de archivo.\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"¿Quiere continuar la exportación?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuar"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Sin modificar"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actual"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formato:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Calidad:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Re_stricción de escala:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _píxeles"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportar metadatos"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Guardar detalles…"
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Guardar detalles"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(y %d más)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Informe de resultados de importación"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Se intentó importar %d archivo."
+msgstr[1] "Se intentaron importar %d archivos."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "De ellos, se importó %d archivo correctamente."
+msgstr[1] "De ellos, se importaron %d archivos correctamente."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Fotos/vídeos duplicados no importados:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplica el elemento existente"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Fotos/vídeos no importados debido a errores de cámara:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "mensaje de error:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Archivos no importados porque no se reconocieron como fotos o vídeos:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotos/vídeos no importados porque no estaban en un formato compatible con "
+"Shotwell:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotos/vídeos no importados porque Shotwell no pudo copiarlos a su colección:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"no se pudo copiar %s\n"
+"\ta %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "No se importaron las fotos/vídeos porque los archivos están dañados:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotos/vídeos no importados por otros motivos:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "No se importó 1 foto duplicada:\r\n"
+msgstr[1] "No se importaron %d fotos duplicadas:\r\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "No se importó 1 vídeo duplicado:\r\n"
+msgstr[1] "No se importaron %d vídeos duplicados:\r\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "No se importó 1 foto/vídeo duplicado:\r\n"
+msgstr[1] "No se importaron %d fotos/vídeos duplicados:\r\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falló al importar 1 foto debido a un error del archivo o de hardware:\n"
+msgstr[1] ""
+"Falló al importar %d fotos debido a un error del archivo o de hardware:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falló al importar 1 vídeo debido a un error del archivo o de hardware:\r\n"
+msgstr[1] ""
+"Falló al importar %d vídeos debido a un error del archivo o de hardware:\r\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falló al importar 1 foto/vídeo debido a un error del archivo o de hardware:"
+"\r\n"
+msgstr[1] ""
+"Falló al importar %d fotos/vídeos debido a un error del archivo o de "
+"hardware:\r\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falló al importar 1 archivo debido a un error del archivo o de hardware:\n"
+msgstr[1] ""
+"Falló al importar %d archivos debido a un error de archivo o de hardware:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Falló al importar 1 foto porque la carpeta de la colección de fotos no se "
+"puede escribir:\n"
+msgstr[1] ""
+"Falló al importar %d fotos porque la carpeta de la colección de fotos no se "
+"puede escribir:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Falló al importar 1 foto porque la carpeta de la colección de fotos no se "
+"puede escribir:\n"
+msgstr[1] ""
+"Falló al importar %d fotos porque la carpeta de la colección de fotos no se "
+"puede escribir:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Falló al importar 1 foto/vídeo porque la carpeta de la colección de fotos no "
+"se puede escribir:\n"
+msgstr[1] ""
+"Falló al importar %d fotos/vídeos porque la carpeta de la colección de fotos "
+"no se puede escribir:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Falló la importación de 1 archivo porque no se puede escribir en la "
+"colección de fotos:\n"
+msgstr[1] ""
+"Falló la importación de %d archivos porque no se puede escribir en la "
+"colección de fotos:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Falló al importar 1 foto/vídeo debido a un error de la cámara:\n"
+msgstr[1] "Falló al importar %d fotos debido a un error de la cámara:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Falló al importar 1 foto/vídeo debido a un error de la cámara:\n"
+msgstr[1] "Falló al importar %d vídeos debido a un error de la cámara:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Falló al importar 1 foto/vídeo debido a un error de la cámara:\n"
+msgstr[1] "Falló al importar %d foto/vídeo debido a un error de la cámara:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Falló al importar 1 archivo debido a un error de la cámara: \n"
+msgstr[1] "Falló al importar %d archivor debido a un error de la cámara: \n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "No se pudo importar una foto porque está dañada:\n"
+msgstr[1] "No se pudieron importar %d fotos porque están dañadas:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "No se pudo importar un vídeo porque está dañado:\n"
+msgstr[1] "No se pudieron importar %d vídeos porque están dañados:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "No se pudo importar 1 foto/vídeo porque está dañado:\n"
+msgstr[1] "No se pudieron importar %d fotos/vídeos porque están dañados:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "No se pudo importar un archivo porque está dañado:\n"
+msgstr[1] "No se pudieron importar %d archivos porque están dañados:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Se omitió 1 foto no compatible:\n"
+msgstr[1] "Se omitieron %d fotos no compatibles:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Se omitió 1 archivo que no era una imagen.\n"
+msgstr[1] "Se omitieron %d archivos que no eran imágenes.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Se omitió 1 foto debido a la cancelación del usuario:\n"
+msgstr[1] "Se omitieron %d fotos debido a la cancelación del usuario:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Se omitió 1 vídeo debido a la cancelación del usuario:\n"
+msgstr[1] "Se omitieron %d vídeos debido a la cancelación del usuario:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Se omitió 1 foto/vídeo debido a la cancelación del usuario:\n"
+msgstr[1] "Se omitieron %d fotos/vídeos debido a la cancelación del usuario:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Se omitió 1 archivo debido a la cancelación del usuario:\n"
+msgstr[1] "Se omitieron %d archivos debido a la cancelación del usuario:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto correctamente importada.\n"
+msgstr[1] "%d fotos importadas correctamente.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 vídeo correctamente importado.\n"
+msgstr[1] "%d vídeos importados correctamente.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto/vídeo correctamente importado.\n"
+msgstr[1] "%d fotos/vídeos importados correctamente.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "No se importó ninguna foto o vídeo.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importación completa"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 día"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Renombrar evento"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nombre:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editar título"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Editar comentario de evento"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Editar comentario de foto/vídeo"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Mover a la _papelera"
+msgstr[1] "Mover a la _papelera"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Solo quita_r"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "¿Revertir las ediciones externas?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "¿Revertir ediciones externas?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Esto destruirá todos los cambios realizados en el archivo externo. "
+"¿Continuar?"
+msgstr[1] ""
+"Esto destruirá todos los cambios realizados en los %d archivos externos. "
+"¿Continuar?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_vertir edición externa"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Re_vertir ediciones externas"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Esto quitará la foto de la colección. ¿Continuar?"
+msgstr[1] "Esto quitará las %d fotos de la colección. ¿Continuar?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Quitar"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Quitar la foto de la colección"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Quitar fotos de la colección"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "a.m."
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "p.m."
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 hrs."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Desplazar todas las fotos y/o vídeos la misma cantidad"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Ajustar _todas las fotos y/o vídeos a esta hora"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modificar archivo de foto original"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ":Modificar archivos de fotos originales"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modificar archivos originales"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modificar archivos originales"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %H:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El tiempo de exposición se adelantará por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"El tiempo de exposición se atrasará por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Y %d más."
+msgstr[1] ""
+"\n"
+"\n"
+"Y %d más."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetas (separadas por comas):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bienvenido/a"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Bienvenido/a a Shotwell."
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Para comenzar, importe fotos de cualquiera de las siguientes formas:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Elija <span weight=\"bold\">Archivo %s Importar desde carpeta</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arrastre y suelte fotos en la ventana de Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Conecte una cámara al equipo e importe"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importar fotos desde su carpeta %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "También puede importar fotos en cualquiera de estas formas:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_No mostrar este mensaje de nuevo"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importar fotos desde su colección %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Ayuda)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Año%sMes%sDía"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Año%sMes"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Año%sMes-Día"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Año-Mes-Día"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalizado"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Patrón no válido"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell puede copiar las fotos en su colección o puede importarlas sin "
+"copiarlas."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "C_opiar fotos"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importar en el lugar"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importar a la colección"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Quitar de la colección"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Quitando la foto de la colección"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Quitando fotos de la colección"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Esto quitará la foto y/o el vídeo de su colección de Shotwell. ¿Le gustaría "
+"mover el archivo a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+msgstr[1] ""
+"Esto quitará %d fotos y/o vídeos de su colección de Shotwell. ¿Le gustaría "
+"mover los archivos a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Esto quitará el vídeo de su colección de Shotwell. ¿Le gustaría mover el "
+"archivo a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+msgstr[1] ""
+"Esto quitará los %d vídeos de su colección de Shotwell. ¿Le gustaría mover "
+"los archivos a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Esto quitará la foto de su colección de Shotwell. ¿Le gustaría mover el "
+"archivo a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+msgstr[1] ""
+"Esto quitará %d fotos de su colección de Shotwell. ¿Le gustaría mover los "
+"archivos a la papelera del escritorio?\n"
+"\n"
+"Esta acción no se puede deshacer."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"No se puede mover la foto o el vídeo a la papelera de su escritorio. "
+"¿Eliminar este archivo?"
+msgstr[1] ""
+"No se pueden mover las %d fotos o vídeos a la papelera de su escritorio. "
+"¿Eliminar estos archivos?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "No se puede eliminar la foto o el vídeo."
+msgstr[1] "No se pueden eliminar las %d fotos o vídeos."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Carpetas"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Éxito"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Error de archivo"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "No se puede descodificar el archivo"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Error de la base de datos"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "El usuario canceló la importación"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "No es un archivo"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "El archivo ya existe en la base de datos"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Formato de archivo no soportado"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "No es un archivo de imagen"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Fallo en disco"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disco lleno"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Error de la cámara"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Error de escritura en el archivo"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Archivo de imagen dañado"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Fallo de importación (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificada"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto anterior"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Siguiente foto"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Falta el archivo de origen de la foto: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Ver"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Herramientas"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Foto _anterior"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto anterior"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Siguiente foto"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Siguiente foto"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Ampliar"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumentar la ampliación de la foto"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Re_ducir"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Reducir la ampliación de la foto"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Aj_ustar a la página"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Aumentar la foto hasta ajustar a la pantalla"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Ampliar al _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Ampliar la foto al 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Ampliar al _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Ampliar la foto al 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Revelador"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "No se puede exportar %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de datos %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"La importación desde %s no puede continuar porque ha ocurrido un error:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Para intentar importar desde otro servicio, seleccione uno desde el menú "
+"anterior."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importaciones de datos"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"No tiene ningún complemento de importación de datos activado.\n"
+"\n"
+"Para utilizar la función Importar desde aplicación, necesita activar al "
+"menos un complemento de importación. Puede hacerlo en el cuadro de diálogo "
+"Preferencias."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Archivo de base de datos:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importar"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importar desde aplicación"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importar medios _desde:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Cerrar"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Configuración"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diapositivas"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Atrás"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ir a la foto anterior"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausar la presentación"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Siguiente"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ir a la siguiente foto"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Cambiar la configuración de la presentación"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Todos los archivos origen de fotos están perdidos."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reproducir"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continuar la presentación"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Revirtiendo"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Deshaciendo reversión"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Mejorando"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Deshaciendo mejora"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Aplicando transformación de color"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Deshaciendo transformación de color"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Creando un evento nuevo"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Quitando el evento"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Moviendo fotos a un evento nuevo"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Estableciendo fotos al evento anterior"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Combinando"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Deshaciendo la combinación"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicando las fotos"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Quitando las fotos duplicadas"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "No se puede duplicar una foto debido a un error de archivo"
+msgstr[1] "No se pueden duplicar %d fotos debido a errores de archivo"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Restaurar valoración anterior"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Aumentando la valoración"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Disminuyendo la valoración"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Configurando el revelador RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Restaurando el revelador RAW anterior"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Establecer revelador"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "No se pudo ajustar la foto original."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Ajustar fecha y hora"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Deshacer ajuste de fecha y hora"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "No se pudo modificar una foto original."
+msgstr[1] "No se pudieron modificar las siguientes fotos originales."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Error al ajustar la hora"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"El ajuste de la hora no se puede deshacer en el archivo de la foto siguiente."
+msgstr[1] ""
+"El ajuste de la hora no se puede deshacer en el archivo de la foto siguiente."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Crear etiqueta"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mover etiqueta «%s»"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mover fotos a la papelera"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurar fotos desde la papelera"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mover las fotos a la papelera de Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurar las fotos a la colección de Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Mover fotos a la papelera"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restaurar fotos desde la papelera"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marcar las fotos seleccionadas"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Desmarcar las fotos seleccionadas"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marcando las fotos seleccionadas"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Desmarcando las fotos seleccionadas"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcar"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Desmarcar"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baja (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Media (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alta (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Máxima (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "No hay fotos/vídeos"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "No se encontraron fotos/vídeos"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "No se pueden exportar las fotos a este directorio."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "No se pueden procesar las actualizaciones de la monitorización %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Llenar la página entera"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imágenes por página"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imágenes por página"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imágenes por página"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imágenes por página"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 imágenes por página"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imágenes por página"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "pulg."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Cartera (2 × 3 pulg.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Tarjeta de notas (3 × 5 pulg.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 × 6 pulg."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 × 7 pulg."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 × 10 pulg."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 × 14 pulg."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 × 20 pulg."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Cartera métrica (9 × 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Tarjeta postal (10 × 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 × 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 × 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 × 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 × 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 × 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Ajustes de la imagen"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Imprimiendo…"
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"No se puede imprimir la foto:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "No se puede abrir/crear base de datos de fotos %s: código de error %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"No se pudo escribir el archivo de la base de datos de fotos:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Error al acceder al archivo de la base de datos:\n"
+"%s\n"
+"\n"
+"El error fue:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exportar vídeos"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "No se puede abrir Nautilus Enviar a: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Enviar a"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "No se puede exportar el fondo de pantalla a %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "No se puede preparar el presentación de diapositivas de escritorio: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Marcada"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Papelera"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "La papelera está vacía"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Eliminando fotos"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Archivos faltantes"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Eliminando…"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Última importación"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importar desde carpeta…"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importar fotos desde el disco a la colección"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importar desde _aplicación…"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordenar _eventos"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Vaciar la papele_ra"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Eliminar todas las fotos en la papelera"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Ver eve_nto para la foto"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Buscar"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Buscar fotos y vídeos por criterio de búsqueda"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Archivo"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Editar"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Foto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotos"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_tos"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Etiquetas"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "Ay_uda"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Información _básica"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Mostrar la información básica para la selección"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Información e_xtendida"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Mostrar la información extendida para la selección"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Barra de búsqueda"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Mostrar la barra de búsqueda"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Barra lateral"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Mostrar la barra lateral"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Ascendente"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Ordenar fotos en orden ascendente"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escendente"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Ordenar fotos en orden descendente"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importar desde carpeta"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Vaciar la papelera"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Vaciando la papelera…"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell está configurado para importar fotos desde su carpeta personal.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Ubicación de la colección"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Las fotos no pueden importarse desde esta carpeta."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Actualizando la colección…"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Preparando importación automática…"
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Importando fotos automáticamente…"
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Escribiendo metadatos en los archivos…"
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Colección"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importando…"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Detener importación"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Detener la importación de fotos"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Preparando importación…"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importada %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Guardar"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Guardar la foto"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "G_uardar como…"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Guardar la foto con un nombre diferente"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprimir la foto en una impresora conectada a su equipo"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s no existe."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s no es un archivo."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s no es compatible con el formato de archivo de\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Guardar una copia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "¿Quiere descartar los cambios a %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Cerrar _sin guardar"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Error al guardar en %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Guardar como"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "No se puede monitorizar %s: No es un directorio (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Gestor de fotos"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visor de fotos"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009–2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Girar a la _derecha"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Girar"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Girar a la derecha"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Girar las fotos a la derecha (oprima Ctrl para girar a la izquierda)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Girar a la izq_uierda"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Girar a la izquierda"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Girar las fotos a la izquierda"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Voltear hori_zontalmente"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Voltear horizontalmente"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Voltear _verticalmente"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Voltear verticalmente"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "M_ejorar"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Mejorar"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Mejorar automáticamente la apariencia de la foto"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copiar ajustes de color"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Copiar ajustes de color"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Copiar los ajustes de color aplicados a la foto"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Pegar ajustes de color"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Pegar ajustes de color"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Aplicar ajuste de color copiado a las fotos seleccionadas"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Re_cortar"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Recortar"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Recortar el tamaño de la foto"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Enderezar"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Enderezar"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Enderezar la foto"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Ojos _rojos"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Ojos rojos"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reducir o eliminar cualquier efecto de ojos rojos en la foto"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ajuste"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ajuste"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ajustar el color y el tono de la foto"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Volver al original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Volver al original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Revertir e_diciones externas"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Revertir a la foto original"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Establecer como fondo _de escritorio"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Establezca la imagen seleccionada como nuevo fondo de escritorio"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Establecer como pase de _diapositivas de escritorio…"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Deshacer"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Deshacer"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Rehacer"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Rehacer"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_nombrar evento…"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Hacer foto _clave para el evento"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Hacer foto clave para el evento"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Evento _nuevo"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Evento nuevo"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mover fotos"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mover fotos a un evento"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Combinar eventos"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Combinar"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combinar eventos en uno solo"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Establecer p_untuación"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Establecer puntuación"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Cambiar la puntuación de su foto"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Aumentar"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Aumentar puntuación"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "Disminuir"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Disminuir puntuación"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Sin puntuar"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sin puntuar"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Puntuar no puntuadas"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Establecer como sin puntuación"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Quitar cualquier puntuación"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rechazado"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rechazada"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Puntuar rechazadas"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Estableciendo como rechazada"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Establecer puntuación para rechazadas"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Solo _rechazadas"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Solo rechazadas"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Mostrar solo las fotos rechazadas"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Todas + _rechazadas"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Mostrar todas las fotos, incluyendo las rechazadas"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Todas las _fotos"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Mostrar todas las fotos"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Puntuaciones"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Mostrar la puntuación de cada foto"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrar fotos"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrar fotos"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limitar el número de fotos mostradas en base al filtro"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicar"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Hacer un duplicado de la foto"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportar…"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Imprimir…"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicar…"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicar"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicar en varios sitios web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Editar el _título…"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Editar _comentario…"
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Editar comentario"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Editar _comentario del evento…"
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Ajustar fecha y hora…"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ajustar fecha y hora"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Añadir e_tiquetas…"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Añadir etiquetas…"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Añadir etiquetas"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferencias"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Abrir con editor e_xterno"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Abrir con editor RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "En_viar a…"
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "En_viar a…"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "Buscar…"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Buscar"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Buscar una imagen escribiendo el texto que aparece en su nombre o etiquetas"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marcar"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Desmarcar"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "No se puede abrir el editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Añadir etiqueta «%s»"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Añadir etiquetas «%s» y «%s»"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Eliminar etiqueta «%s»"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Eliminar etiqueta «%s»"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Eliminar etiqueta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nueva"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_nombrar etiqueta «%s»…"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Renombrar la etiqueta «%s» a «%s»"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Renombrar…"
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modif_icar etiquetas…"
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificar etiquetas"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etiquetar fotos como «%s»"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etiquetar fotos como «%s»"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etiquetar las fotos seleccionadas como «%s»"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etiquetar las fotos seleccionadas como «%s»"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Quitar la etiqueta «%s» de las _fotos"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Quitar la etiqueta «%s» de las _fotos"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Quitar la etiqueta «%s» de las fotos"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Quitar la etiqueta «%s» de las fotos"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "No se puede renombrar la etiqueta a «%s» porque la etiqueta ya existe."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "No se pudo renombrar la búsqueda «%s» porque la búsqueda ya existe."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Búsqueda guardada"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Eliminar búsqueda"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editar…"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Re_nombrar…"
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Renombrar la búsqueda «%s» a «%s»"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Eliminar búsqueda «%s»"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Puntuar %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Establecer puntuación para %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Estableciendo la puntuación de %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Mostrar %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Solo mostrar fotos con puntuación %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s o mayor"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Mostrar %s o mayor"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Solo mostrar fotos con puntuación %s o mayor"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Quitar las fotos seleccionadas de la papelera"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Quitar las fotos seleccionadas de la colección"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurar"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mover las fotos seleccionadas de vuelta a la colección"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Mostrar en ge_stor de archivos"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Abrir el directorio de la foto seleccionada en el gestor de archivos"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "No se puede abrir el gestor de archivos: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Quitar de la colección"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mover a la papelera"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Seleccionar _todo"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Seleccionar todos los elementos"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d de %b de %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a, %d de %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Ángulo:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Restablecer"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Volver a las dimensiones actuales de la foto"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Establecer el corte para esta foto"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Girar el rectángulo de corte entre las orientaciones vertical y horizontal"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Sin restricciones"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Cuadrado"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Pantalla"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Tamaño original"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Vídeo SD (4:3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Vídeo HD (16:9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Carta (8.5 × 11 pulg.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloide (11 × 17 pulg.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 × 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 × 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Cerrar la herramienta de ojos rojos"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Quitar cualquier efecto de ojos rojos en la región seleccionada"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturación:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Matiz:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Sombras:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Resaltadas:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Restablecer colores"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Restablecer todos los ajustes de color al original"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Matiz"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturación"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Exposición"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Sombras"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Resaltadas"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Expansión de contraste"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Anclar la barra de herramientas"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Mantener abierta la barra de herramientas"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Salir de pantalla completa"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Salir de pantalla co_mpleta"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Salir"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Acerca de"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Pantalla c_ompleta"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Contenido"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Preguntas más frecuentes"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Informar de un problema…"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ocurrió un error grave al acceder a la colección de Shotwell. Shotwell no "
+"puede continuar.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Visitar el sitio web de Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2011–2013\n"
+"Claudio Rodrigo Pereyra Diaz <elsupergomez@fedoraproject.org>, 2011–2013\n"
+"monkey.libre <monkey.libre@gmail.com>\n"
+"Jorge González <jorgegonz@svn.gnome.org>, 2011\n"
+"José Luis Navarro <jlnavarro111@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "No se puede mostrar la ayuda: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "No se pudo navegar en la base de datos de errores: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "No se pudieron mostrar las P+F: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "sin título"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Tamaño original"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Anchura o altura"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Anchura"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altura"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Ajustar el tamaño de las miniaturas"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Aumentar la ampliación de las miniaturas"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Disminuir la ampliación de las miniaturas"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordenar _fotos"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Reproducir vídeo"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Abrir los vídeos seleccionados en el reproductor de vídeos del sistema"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comentarios"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Mostrar el comentario de cada foto"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Mostrar la etiqueta de cada foto"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Por _título"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordenar las fotos por título"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Por fecha de exposición"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordenar fotos por fecha de exposición"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Por p_untuación"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordenar fotos por puntuación"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell no pudo reproducir el vídeo seleccionado:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d foto/vídeo"
+msgstr[1] "%d fotos/vídeos"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Mostrar el comentario de cada evento"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "No hay eventos"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "No se encontraron eventos"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Eventos"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Sin fecha"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "No hay eventos"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "No se pudo crear la carpeta de caché %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "No se puede crear la carpeta de datos %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Imágenes"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "No se puede crear la carpeta temporal %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "No se puede crear la subcarpeta de datos %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ninguna)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ninguna"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Aleatorio"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transiciones de diapositiva"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "No se puede crear el directorio temporal %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportando"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "El archivo %s ya existe. ¿Quiere reemplazarlo?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Omitir"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Reemplazar"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Reempla_zar todo"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportar"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotos"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vídeos"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotos RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotos RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Error al cargar el archivo de IU %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipo"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicando"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Las fotos/vídeos seleccionados se publicaron correctamente."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Las fotos seleccionadas se publicaron correctamente."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Las fotos seleccionadas se publicaron correctamente."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "El vídeo seleccionado se publicó correctamente."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "La foto seleccionada se publicó correctamente."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Obteniendo información de la cuenta…"
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Iniciando sesión…"
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicar fotos"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicar fo_tos en:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicar vídeos"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicar vídeos _en"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicar fotos y vídeos"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicar fotos y vídeos _en"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "No se pudo publicar"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell no puede publicar el elemento seleccionado porque no tiene activado "
+"un complemento compatible. Para corregir esto, vaya a <b>Editar %s "
+"Preferencias</b> y active uno o más complementos de publicación en la "
+"pestaña <b>Complementos</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Preparando para subir"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Subiendo %d de %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "No se puede continuar la publicación en %s porque ocurrió un error:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Para intentar publicar en otro servicio, seleccione uno en el menú de arriba."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "E_tiqueta nueva…"
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"No está disponible un archivo temporal necesario para la publicación"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Ya ha iniciado y cerrado sesión de Google durante esta sesión de Shotwell.\n"
+"Para seguir publicando en servicios de Google, cierre y reinicie Shotwell, e "
+"intente publicar de nuevo."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"No ha iniciado sesión en YouTube.\n"
+"\n"
+"Debe haber registrado una cuenta de Google y configurarla para utilizarla "
+"con YouTube para continuar. Puede configurar la mayoría de cuentas mediante "
+"el uso de su navegador para registrarse en el sitio de YouTube al menos una "
+"vez."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"No está disponible un archivo necesario para publicar. La publicación en "
+"Youtube no puede continuar."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Ha iniciado sesión en YouTube como %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Los vídeos aparecerán en «%s»"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Listado públicamente"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "No listado públicamente"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privado"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Servicios de publicación"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Actualmente no ha iniciado sesión en Flickr.\n"
+"\n"
+"Pulse Iniciar sesión para identificarse en Flickr en su navegador web. "
+"Tendrá que autorizar a Shotwell Connect para que se enlace a su cuenta de "
+"Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ya ha iniciado y cerrado sesión de Flickr durante esta sesión de Shotwell.\n"
+"Para seguir publicando en Flickr, cierre y reinicie Shotwell, e intente "
+"publicar de nuevo."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Preparándose para iniciar sesión…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"No está disponible un archivo necesario para publicar. La publicación en "
+"Flickr no puede continuar."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Comprobando la autorización…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Ha iniciado sesión en Flickr como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Su cuenta gratuita de Flickr limita la cantidad de datos que puede subir al "
+"mes.\n"
+"Este mes, tiene %d megabytes restantes de su límite de carga."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Su cuenta de Flickr Pro le permite subidas ilimitadas."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotos _visibles para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Vídeos _visibles para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotos y vídeos _visibles para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Todos"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Solo amigos y familia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Solo familia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Solo amigos"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Solo yo"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 × 375 píxeles"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 × 768 píxeles"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 × 1536 píxeles"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 × 3072 píxeles"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Creando el álbum %s…"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Ocurrió un error al publicar en Piwigo. Inténtelo de nuevo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Escriba el URL de su colección fotográfica de Piwigo, así como el nombre de "
+"usuario y contraseña asociados a esa colección."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell no puede contactar su colección de fotos de Piwigo. Compruebe la "
+"URL que ha introducido"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Usuario y/o contraseña no válidos. Inténtelo de nuevo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "URL no válida"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Nombre de usuario o contraseña no válidos"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administradores, Familia, Amigos, Contactos"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administradores, Familia, Amigos"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administradores, Familia"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administradores"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Actualmente no ha iniciado sesión en Álbumes web de Picasa.\n"
+"\n"
+"Pulse Iniciar sesión para identificarse en Álbumes web de Picasa en su "
+"navegador web. Tendrá que autorizar a Shotwell Connect para que se enlace a "
+"su cuenta de Álbumes web de Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"No está disponible un archivo necesario para publicar. La publicación en "
+"Picasa no puede continuar."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Creando el álbum…"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Ha iniciado sesión en Álbumes web de Picasa como %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Los vídeos aparecerán en:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Las fotos aparecen en:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pequeño (640 × 480 píxeles)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mediano (1024 × 768 píxeles)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomendado (1600 × 1200 píxeles)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 × 1536 píxeles)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Actualmente no ha iniciado sesión en Facebook.\n"
+"\n"
+"Si no tiene una cuenta de Facebook, puede crear una durante el proceso de "
+"inicio de sesión. Durante el inicio de sesión, Shotwell Connect le puede "
+"pedir permiso para subir fotos y publicar en su muro. Estos permisos son "
+"necesarios para que Shotwell Connect funcione."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ya ha iniciado y cerrado sesión de Facebook durante esta sesión de "
+"Shotwell.\n"
+"Para seguir publicando en Facebook, cierre y reinicie Shotwell, e intente "
+"publicar de nuevo."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Estándar (720 píxeles)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Grande (2048 píxeles)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Comprobando la conexión a Facebook…"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"No está disponible un archivo necesario para publicar. La publicación en "
+"Facebook no puede continuar."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Ha iniciado sesión en Facebook como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "¿Dónde quiere publicar las fotos seleccionadas?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Tamaño de subida:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amigos"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Desmoronar"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Ajedrez"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Círculos"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Persianas"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Franjas"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Reloj"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Círculo"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transiciones de pase de diapositivas"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011–2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapositiva"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Desvanecer"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Cuadrados"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Servicios de importación de datos de núcleo"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Bienvenido/a al servicio de importación de F-Spot.\n"
+"\n"
+"Seleccione una colección a importar, ya sea eligiendo una de las colecciones "
+"existentes encontradas por Shotwell o eligiendo un archivo de base de datos "
+"de F-Spot alternativo."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Bienvenido/a al servicio de importación de colecciones de F-Spot.\n"
+"\n"
+"Seleccione un archivo de colección de F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Seleccionar manualmente una colección de F-Spot para importar:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"No se puede abrir el archivo seleccionado de F-Spot: el archivo no existe o "
+"no es un archivo de colección de F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"No se puede abrir el archivo seleccionado de F-Spot: esta versión de F-Spot "
+"no está soportada por Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"No se puede abrir el archivo seleccionado de F-Spot: error al leer la tabla "
+"de etiquetas"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"No se puede abrir el archivo seleccionado de F-Spot: error al leer la tabla "
+"de fotos"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell encontró %d fotos en la colección de F-Spot y está importándolas "
+"ahora. Los duplicados se detectarán y eliminarán automáticamente.\n"
+"\n"
+"Puede cerrar este diálogo y empezar a utilizar Shotwell mientras el proceso "
+"de importación ocurre en segundo plano."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Colección de F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparando para importar"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Establecer como pase de diapositivas de escritorio"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Generar un pase de diapositivas de fondo de escritorio"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Mostrar cada foto para"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "periodo de tiempo"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Cuánto tiempo se muestra cada foto en el fondo de escritorio"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Búsqueda"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Nombre de la búsqueda:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Coincidir"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "de los siguientes:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Tamaño de imagen impresa</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Utilizar un tamaño e_stándar:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Utilizar un tamaño p_ersonalizado:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "E_mparejar relación de aspecto de la foto"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "Tamaño _automático:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Títulos</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Imprimir el _título de la imagen"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Resolución de píxeles</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Salida de foto en:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "píxeles por pulgada"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiqueta"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Preferencias de Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "blanco"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "negro"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Vigilar mi colección en busca de archivos nuevos"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadatos"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Escribir etiquetas, títulos y otros _metadatos en los archivos de fotos"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Mostrar"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importar fotos a:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Fondo:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importando"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Estructura de _carpetas:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Patrón:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Ejemplo:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "R_enombrar los archivos importados a minúsculas"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Revelador RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Predeterminado:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Editor de fotos e_xterno:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Editor _RAW externo:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Editores externos"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Complementos"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Retraso:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Efecto de _transición:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "R_etraso de transición:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Mostrar tít_ulo"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "segundos"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "Iniciar _sesión"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (el texto depende del nombre de usuario de Facebook y se modifica en la "
+"aplicación;\n"
+"no se mostrará el contenido de este campo)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publicar en un álbum e_xistente:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Crear un álbum _nuevo llamado:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Vídeos y álbumes de fotos nuevos _visibles para:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "_Quitar ubicación, cámara y otra información antes de subir"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "Cerrar _sesión"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publicar"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Introduzca el número de confirmación que aparece en su navegador web después "
+"de iniciar sesión en Flickr."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Número de autorización:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ha iniciado sesión en Flickr como (name).\n"
+"\n"
+"(la etiqueta de esta cadena se rellena y se ubica en el código, \n"
+"y los cambios hechos aquí no se mostrarán)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "etiqueta de _visibilidad (rellenada en el código)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Tamaño de la foto:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"«ha iniciado sesión como $name»\n"
+"(rellenado en el código de la aplicación)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Un álbum _existente:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Un álbum _nuevo:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Listar álbum en la galería pública"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype aparecerá en\n"
+"(rellenado en el código)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Tamaño de foto predefinido:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL de su biblioteca de fotos Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Nombre de usuario"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Contraseña"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Recortar contraseña"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Iniciar sesión"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Una categoría _existente:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Las fotos serán _visibles para:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Tamaño de la foto:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "en la categoría:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Comentario del álbum:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Si se definió el titulo pero no un comentario, usar el título como "
+"comentario"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "_No cargar las etiquetas"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Salir"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Co_nfiguración de privacidad de vídeos:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 píxeles"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "«%s» no es una respuesta válida a una solicitud de autenticación OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): no puede iniciar, este publicador no es "
+"reiniciable."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Escriba el nombre de usuario y contraseña asociados con su cuenta de Tumblr."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "No se pudo cargar la IU: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Ha iniciado sesión en Tumblr como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visitar el sitio web de Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Actualmente no ha iniciado sesión en Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "Dirección de correo _electrónico"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ha iniciado sesión en Tumblr como (nombre).\n"
+"\n"
+"(la etiqueta de esta cadena se rellena y se ubica en el código, \n"
+"y los cambios hechos aquí no se mostrarán)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "Álb_umes (o crear uno nuevo):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tipo de acceso:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Desactivar _comentarios"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_No permitir la descarga de la foto original"
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..e0c0c16
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,4564 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# boamaod <boamaod@gmail.com>, 2011
+# Mattias Põldaru <mahfiaz@gmail.com>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Estonian (http://www.transifex.com/projects/p/shotwell/"
+"language/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "%s (sündmus)"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kaamerad"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kaamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kaamera lahtihaakimine pole võimalik. Proovi kaamera failihaldurist lahti "
+"haakida."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Juba imporditud fotod varjatakse"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Kuvatakse ainult importimata jäänud fotosid"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Importimise alustamine, palun oota..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Pealkirjad"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Igale fotole pealkirja näitamine"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Impordi valitud"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Valitud fotode importimine pildikogusse"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Impordi _kõik"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Kõigi fotode importimine pildikogusse"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell kaamerale ligipääsemiseks selle failisüsteemist lahti haakima. Kas "
+"jätkata?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Haagi lahti"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Palun haagi kaamera lahti."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Mingi teine rakendus on lukustanud kaamera kasutuse. Shotwell pääseb "
+"kaamerale ligi alles siis, kui lukk on lahti. Palun sulge kõik teised "
+"rakendused, mis võiksid kaamerat kasutada ja proovi siis uuesti."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Palun sulge kõik teised rakendused, mis kaamerat kasutavad."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kaamerast ei suudetud hankida eelvaatepilte:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Lahtihaakimine..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Foto andmete hankimine"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s eelvaate hankimine"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kaamera lukustamine pole võimalik: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Kas kustutada see foto kaamerast?"
+msgstr[1] "Kas kustutada need %d fotot kaamerast?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Kas kustutada see video kaamerast?"
+msgstr[1] "Kas kustutada need %d videot kaamerast?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Kas kustutada see foto/video kaamerast?"
+msgstr[1] "Kas kustutada need %d fotot/videot kaamerast?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Kas kustutada see fail kaamerast?"
+msgstr[1] "Kas kustutada need %d faili kaamerast?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Säilita"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fotode/videote eemaldamine kaamerast"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"%d foto/video kustutamine kaamerast pole võimalik, kuna esines vigu."
+msgstr[1] ""
+"%d foto/video kustutamine kaamerast pole võimalik, kuna esines vigu."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Slaidiesitlus"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Slaidiesituse alustamine"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Fotode/videote eksportimine"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Fotode/videote eksportimine"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Fotode eksportimine"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Fotode eksportimine"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Pööramine"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Pööramise tagasivõtmine"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Horisontaalpeegeldus"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Horisontaalpeegelduse tagasivõtmine"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vertikaalpeegeldus"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Vertikaalpeegelduse tagasivõtmine"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Suvaline tekst"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Pealkiri"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Silt"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Sündmuse nimi"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Faili nimi"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Meedia liik"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Lipukese olek"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Hinnang"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Kuupäev"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "sisaldab"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "on"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "algab sõnaga"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "lõpeb sõnaga"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ei sisalda"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "pole määratud"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "on"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ei ole"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "suvaline foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW-foto"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "lipukesega"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ilma lipukeseta"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ja suuremad"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "täpselt"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ja väiksemad"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "on pärast"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "on enne"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "on vahemikus"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ja"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "suvaline"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "kõik"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "pole"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Salvestatud otsingud"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Uus salvestatud otsing..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Sinu fotokogu andmebaas ei ühildu selle Shotwelli versiooniga. Tundub, et "
+"see loodi Shotwelli versiooniga %s (skeem %d). Praegune on aga versioon %s "
+"(skeem %d). Kasuta Shotwelli kõige värskemat versiooni."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell ei suutnud sinu fotokogu uuendada versioonilt %s (skeem %d) "
+"versioonile %s (skeem %d). Rohkem teavet on Shotwelli vikis aadressil %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Sinu fotokogu andmebaas ei ühildu selle Shotwelli versiooniga. Tundub, et "
+"see loodi Shotwelli versiooniga %s (skeem %d). See on aga versioon %s (skeem "
+"%d). Tühjenda oma kogu kustutades faili %s ja impordi oma fotod uuesti."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwelli andmebaasi kontrollimise katsel esines tundmatu viga: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwelli laadimine"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwelli privaatandmete asukoht"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KATALOOG"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Töö ajal ei jälgita fotokogu kataloogi muudatusi"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Käivitusel ei näidata edenemise riba"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Rakenduse versiooni kuvamine"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FAIL]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Käivita '%s --help', et näha täielikku nimekirja võimalikest käsurea "
+"valikutest.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Täna"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Eile"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Pealkiri:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Sisaldab:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d sündmus"
+msgstr[1] "%d sündmust"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotot"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videot"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Kuupäev:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Kellaaeg:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Algus:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Lõpp:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Suurus:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Kestus:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekundit"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Ilmutaja:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Säritus:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Asukoht:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Faili suurus:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Praegune ilmutaja:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Originaalmõõtmed:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kaamera tootja:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kaamera mudel:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Välk:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Fookuskaugus:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Kuupäev:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Kellaaeg:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Särituse nihe:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS laiuskraadid:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS pikkuskraadid:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Autor:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Autoriõigus:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Tarkvara:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Kommentaar:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Üksikasjalikud andmed"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "See eemaldab sildi \"%s\" ühelt fotolt. Kas jätkata?"
+msgstr[1] "See eemaldab sildi \"%s\" %d fotolt. Kas jätkata?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Loobu"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Kustuta"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "See eemaldab salvestatud otsingu \"%s\". Kas jätkata?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Ilmutajate vahetamine ennistab kõik muudatused, mis sa oled sellele fotole "
+"Shotwellis teinud"
+msgstr[1] ""
+"Ilmutajate vahetamine ennistab kõik muudatused, mis sa oled nendele fotodele "
+"Shotwellis teinud"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Vaheta ilmutajat"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Video eksportimine"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell ei suutnud luua selle foto muutmiseks faili, sest sul pole õigust "
+"kirjutada kohta %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Failitõrke tõttu pole võimalik järgnevat fotot eksportida.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Kas tahad jätkata eksportimisega?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Jätka"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Muutmata"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Praegune"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Vorminda:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvaliteet:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skaleerimise tegur:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pikslit"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Metaandmete eksportimine"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Salvesta üksikasjad..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Üksikasjade salvestamine"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(Ja veel %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importimise tulemuste raport"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Püüti importida %d faili."
+msgstr[1] "Püüti importida %d faili."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Neist %d importimine oli edukas."
+msgstr[1] "Neist %d importimine oli edukas."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Dubleerivaid fotosid videoid ei imporditud:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "dubleerib olemasolevat meediakirjet"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Fotosid/videoid ei imporditud kaamera vigade tõttu:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "veateade:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Faile ei imporditud, kuna neid ei ole fotod ega videod:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotosid/videoid ei imporditud, kuna need ei olnud Shotwellile arusaadavas "
+"vormingus:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotosid/videoid ei imporditud, kuna Shotwel ei suutnud neid oma kogusse "
+"kopeerida:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"polnud võimalik kopeerida %s\n"
+"\tasukohta %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotosid/videoid ei imporditud muudel põhjustel:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Veel 1 dubleeriv foto jäi importimata.\n"
+msgstr[1] "%d dubleerivat fotot jäi importimata:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 dubleeriv video jäi importimata:\n"
+msgstr[1] "%d dubleerivat videot jäi importimata:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 dubleeriv foto/video jäi importimata:\n"
+msgstr[1] "%d dubleerivat fotot/videot jäi importimata:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 foto importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+msgstr[1] "%d foto importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 video importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+msgstr[1] "%d video importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 foto/video importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+msgstr[1] ""
+"%d foto/video importimine nurjus faili- või raudvaralise tõrke tõttu:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "1 faili importimine nurjus raudvaralise vea tõttu:\n"
+msgstr[1] "%d faili importimine nurjus raudvaralise vea tõttu:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+msgstr[1] ""
+"%d foto importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 video importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+msgstr[1] ""
+"%d video importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto/video importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+msgstr[1] ""
+"%d foto/video importimine nurjus, kuna fotokogu kataloog polnud kirjutatav:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 faili importimine nurjus, kuna fotokogu kataloog pole kirjutatav:\n"
+msgstr[1] ""
+"%d faili importimine nurjus, kuna fotokogu kataloog pole kirjutatav:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 foto importimine nurjus kaamera tõrke tõttu:\n"
+msgstr[1] "%d foto importimine nurjus kaamera tõrke tõttu:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video importimine nurjus kaamera tõrke tõttu:\n"
+msgstr[1] "%d video importimine nurjus kaamera tõrke tõttu:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 foto/video importimine nurjus kaamera tõrke tõttu:\n"
+msgstr[1] "%d foto/video importimine nurjus kaamera tõrke tõttu:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 faili importimine nurjus kaamera vea tõttu:\n"
+msgstr[1] "%d faili importimine nurjus kaamera vea tõttu:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 mittetoetatud foto jäeti vahele:\n"
+msgstr[1] "%d mittetoetatud fotot jäeti vahele:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 fail, mis ei ole pilt, jäeti vahele.\n"
+msgstr[1] "%d faili, mis ei ole pildid, jäeti vahele.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 foto jäeti kasutaja katkestuse tõttu vahele:\n"
+msgstr[1] "%d fotot jäeti kasutaja katkestuse tõttu vahele:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video jäeti kasutaja katkestuse tõttu vahele:\n"
+msgstr[1] "%d videot jäeti kasutaja katkestuse tõttu vahele:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 foto/video jäeti kasutaja katkestuse tõttu vahele:\n"
+msgstr[1] "%d fotot/videot jäeti kasutaja katkestuse tõttu vahele:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 fail jäeti kasutajapoolse loobumise tõttu vahele:\n"
+msgstr[1] "%d faili jäeti kasutajapoolse loobumise tõttu vahele:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto importimine lõppes edukalt.\n"
+msgstr[1] "%d foto importimine lõppes edukalt.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video importimine lõppes edukalt.\n"
+msgstr[1] "%d video importimine lõppes edukalt.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto/video importimine lõppes edukalt.\n"
+msgstr[1] "%d foto/video importimine lõppes edukalt.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ühtegi fotot ega videot ei imporditud.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importimine lõpetatud"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekundit"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minutit"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d tund"
+msgstr[1] "%d tundi"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 päev"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Ümbernimetamine"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nimi:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Pealkirja muutmine"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Viska fail prügikasti"
+msgstr[1] "_Viska failid prügikasti"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Ainult _eemalda"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Kas võtta välised redigeerimised tagasi?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Kas võtta välised muudatused tagasi?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"See kustutab kõik muudatused, mis tehti välisele failile. Kas jätkata?"
+msgstr[1] ""
+"See kustutab kõik muudatused, mis tehti %d välisele failile. Kas jätkata?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Taasta originaalid"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Võta välised muudatused tagasi"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Sellega eemaldatakse foto kogust. Kas jätkata?"
+msgstr[1] "Sellega eemaldatakse kogust %d fotot. Kas jätkata?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Eemalda"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Fotode eemaldamine kogust"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Fotode andmebaasist eemaldamine"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 H"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Kõigi fotode/video nihutamine sama aja võrra"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "_Kõigile fotodele/videotele selle kellaaja määramine"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Muuda esialgset fotofaili"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Muuda esialgseid fotofaile"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Muuda originaalfaile"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Muuda lähtefaile"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Originaal:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d. %m %Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d. %m %Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Pildistamise aega nihutatakse edasi\n"
+"%d %s, %d %s, %d %s ja %d %s võrra."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Pildistamise aega nihutatakse tagasi\n"
+"%d %s, %d %s, %d %s ja %d %s võrra."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "päev"
+msgstr[1] "päeva"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "tund"
+msgstr[1] "tunni"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuti"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekund"
+msgstr[1] "sekundi"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"ja veel %d."
+msgstr[1] ""
+"\n"
+"\n"
+"ja veel %d."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Sildid (eralda komaga):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Tere tulemast!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Tere tulemast Shotwelli kasutama!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Alustamiseks impordi fotod mõnel järgnevaist viisidest:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Vali <span weight=\"bold\">Fail %s Impordi kaustast</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Lohistades fotod Shotwelli aknasse"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Ühendades kaamera arvutiga ja importides"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Fotode _importimine kaustast %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Lisaks võib fotosid importida mõnel järgnevaist viisidest:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Seda teadet rohkem ei näidata"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Fotode importimine sinu %s kogust"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Abi)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Aasta%skuu%späev"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Aasta%skuu"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Aasta%skuu-päev"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Aasta-kuu-päev"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Muu"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Sobimatu muster"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell võib kopeerida fotod sinu fotokogusse või viidata fotodele ilma "
+"neist duplikaate loomata."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "F_otode kopeerimine"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Imporditakse sealt, kust on"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Kogusse importimine"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Fotokogust eemaldamine"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Fotode eemaldamine kogust"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Fotode eemaldamine kogust"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"See eemaldab foto/video Shotwelli kogust. Kas see fail tuleks visata ka "
+"prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+msgstr[1] ""
+"See eemaldab %d fotot/videot Shotwelli kogust. Kas need failid tuleks visata "
+"ka prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"See eemaldab video Shotwelli kogust. Kas see fail tuleks visata ka "
+"prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+msgstr[1] ""
+"See eemaldab %d videot Shotwelli kogust. Kas need failid tuleks visata ka "
+"prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"See eemaldab foto Shotwelli kogust. Kas see fail tuleks visata ka "
+"prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+msgstr[1] ""
+"See eemaldab %d fotot Shotwelli kogust. Kas need failid tuleks visata ka "
+"prügikasti?\n"
+"\n"
+"Seda tegevust pole võimalik tagasi võtta."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Fotot või videot ei ole võimalik töölaua prügikasti visata. Kas kustutada "
+"see fail?"
+msgstr[1] ""
+"%d fotot/videot ei ole võimalik töölaua prügikasti visata. Kas kustutada "
+"need failid?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Fotot või videot ei ole võimalik kustutada."
+msgstr[1] "%d fotot/videot ei ole võimalik kustutada."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Kaustad"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Sildid"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Õnnestus"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Failitõrge"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Faili dekodeerimine pole võimalik"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Andmebaasi viga"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Kasutaja katkestatud importimine"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Pole fail"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Fail on andmebaasis juba olemas"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Toetamata failivorming"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Pole pildifail"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Ketta tõrge"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Ketas täis"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kaamera tõrge"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Viga faili kirjutamisel"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importimine nurjus (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "muudetud"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Eelmine foto"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Järgmine foto"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Foto lähtefail on puudu: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Vaade"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Tööriistad"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Eelmine foto"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Eelmine foto"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Järgmine foto"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Järgmine foto"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Suu_renda"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Foto suurenduse suurendamine"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Vähenda"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Foto suurenduse vähendamine"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Mahuta _aknasse"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Foto mahutatakse aknasse"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_100% suurendus"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Foto suurenduseks 100%% valimine"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_200% suurendus"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Foto suurenduseks 200%% valimine"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Ilmutaja"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s eksportimine pole võimalik: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s andmebaas"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s meedia importimine ei saa jätkuda, kuna esines viga:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Proovi mõnest teisest teenusest importimist. Vali üks ülal asuvast menüüst."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Andmete importimine"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Sul pole ühtegi andmete importimise pluginat sisse lülitatud.\n"
+"\n"
+"Rakendusest importimise kasutamiseks peab lubatud olema vähemalt üks andmete "
+"plugin. Pluginaid saab sisse lülitada eelistuste dialoogist."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Andmebaasifail:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Impordi"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Rakendusest importimine"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Imporditava meedia _asukoht:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Sulge"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Sätted"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Slaidiesitus"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Tagasi"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Liikumine eelmisele fotole"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Paus"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Slaidiesituse peatamine"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Järgmine"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Liikumine järgmisele fotole"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Slaidiesituse sätete muutmine"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Kõik lähtefailid puuduvad."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Esita"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Slaidiesituse jätkamine"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Tagasivõtmine"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Tagasivõtmise ennistamine"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Parendamine"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Parendamise tagasivõtmine"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Uue sündmuse loomine"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Sündmuse eemaldamine"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Fotode tõstmine uue sündmuse juurde"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Fotode määramine eelmise sündmuse juurde"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Liitmine"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Lahutamine"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Fotode paljundamine"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Duplikaatfotode eemaldamine"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Ühe foto kustutamine kaamerast pole võimalik, kuna esines vigu."
+msgstr[1] "%d foto kustutamine kaamerast pole võimalik, kuna esines vigu."
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Eelmise hinnangu taastamine"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Hinnangute suurendamine"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Hinnangute vähendamine"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW ilmuti sätted"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Eelmise RAW ilmuti taastamine"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Ilmutaja määramine"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Originaalfotot pole võimalik kohandada."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Kella ja kuupäeva nihutamine"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Kella ja kuupäeva nihutamise tagasivõtmine"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Ühte originaalfotod polnud võimalik kohandada."
+msgstr[1] "Järgnevaid originaalfotosid polnud võimalik kohandada."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Tõrge aja kohendamisel"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Järgnevale fotole rakendatud kuupäeva kohendust pole võimalik tagasi võtta."
+msgstr[1] ""
+"Järgnevatele fotodele rakendatud kuupäeva kohendust pole võimalik tagasi "
+"võtta."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Sildi loomine"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Sildi \"%s\" liigutamine"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Fotode viskamine prügikasti"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Fotode taastamine prügikastist"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Fotode viskamine Shotwelli prügikasti"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Fotode taastamine Shotwelli fotokogusse"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Fotode tõstmine prügikasti"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Fotode taastamine prügikastist"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Valitud fotodele lipu lisamine"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Valitud fotodelt lipu eemaldamine"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Märgi lipuga"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Eemalda lipp"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Madal (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Keskmine (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Kõrge (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Parim (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Fotosid/videoid pole"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Ühtegi fotot/videot ei leitud"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Sellesse kataloogi pole võimalik fotosid eksportida."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Monitoorimise uuendusi pole võimalik töödelda: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Kogu lehe täitmine"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 pilti lehele"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 pilti lehele"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 pilti lehele"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 pilti lehele"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 pilti lehele"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 pilti lehele"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "tolli"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Visiitkaart USA (2\" x 3\")"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Märkepaber (3\" x 5\")"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4\" x 6\""
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5\" x 7\""
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8\" x 10\""
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11\" x 14\""
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16\" x 20\""
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Visiitkaart (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postkaart (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Pildi sätted"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Printimine..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Foto printimine pole võimalik:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Fotode andmebaasi %s avamine või loomine pole võimalik: veakood %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Fotoandmebaasi faili kirjutamine pole võimalik:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Viga andmebaasifailiga ühendumisel:\n"
+"%s\n"
+"\n"
+"Viga oli:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Videote eksportimine"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To käivitamine pole võimalik: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Saada kuhu"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Tausta eksportimine faili %s pole võimalik: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Töölaua taustaesituse ettevalmistamine pole võimalik: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Lipukesega"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Prügikast"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Prügikast on tühi"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Kustuta"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Fotode kustutamine"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Puuduvad failid"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Kustutamine..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Viimati imporditud"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Impordi _kaustast..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Failide importimine kettalt"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Impordi _rakendusest..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sü_ndmuste järjestus"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Tühjenda prü_gikast"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Kõigi prügikastis olevate fotode kustutamine"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Ava selle foto _sündmus"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Otsi"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Fotode ja videote otsimine otsingukriteeriumi järgi"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fail"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Redigeerimine"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "F_oto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "F_otod"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Sündmused"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Sil_did"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "A_bi"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Põhi_andmed"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Valiku kohta peamiste andmete kuvamine"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Ü_ksikasjad"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Valitud pildi kohta üksikasjalike andmete kuvamine"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Otsiriba"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Otsiriba kuvamine"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Külgriba"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Külgriba kuvamine"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Kasvav"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Fotod sorditakse kasvavalt"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Kahanev"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Fotod sorditakse kahanevalt"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Kaustast importimine"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Prügikasti tühjendamine"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Prügikasti tühjendamine..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell on seadistatud importima fotod sinu kodukataloogi.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Fotokogu kataloog"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotosid pole võimalik sellest kataloogist importida."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Kogu uuendamine..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Fotode automaatseks importimiseks ettevalmistumine..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Fotode automaatne importimine..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Metaandmete kirjutamine failidesse..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Kogu"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importimine..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Katkesta import"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Fotode importimise lõpetamine"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Importimiseks ettevalmistamine..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Imporditud %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Salvesta"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Foto salvestamine"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Salvesta _kui..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Foto salvestamine uue nimega"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Foto printimine sinu arvutiga ühendatud printeriga"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ei ole olemas."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ei ole fail."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ei toeta järgnevat failivormingut\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Salvesta koopia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Kas kaotada pildile %s tehtud muudatused?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Sulge _ilma salvestamata"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Tõrge salvestamisel faili %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Salvestamine nimega"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s monitoorimine pole võimalik: pole kataloog (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotohaldur"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotovaatur"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Pööra _paremale"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Pööra"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Paremale pööramine"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Fotode pööramine paremale (vasakule pööramiseks vajuta Ctrl)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Pööra _vasakule"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Vasakule pööramine"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Fotode pööramine vasakule"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Peegelda _horisontaalselt"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Peegelda horisontaalselt"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Peegelda _vertikaalselt"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Peegelda vertikaalselt"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Parenda"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Parenda"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Fotokvaliteedi automaatne parendamine"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Kärbi"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Kärbi"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Foto suuruse kärpimine"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Sirgeks"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Sirgeks tegemine"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Pildi sirgeks pööramine"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Punasilmsus"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Punasilmsus"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Foto punasilmsuse vähendamine või kaotamine"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Kohenda"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Kohenda"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Foto värvide ja tonaalsuse kohendamine"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Taasta originaal"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Originaali taastamine"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Väliste _muudatuste ennistamine"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Originaalfoto taastamine"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Määra _töölaua taustaks"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Valitud pildi määramine uueks töölaua taustapildiks"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Määra _töölauale taustaesituseks..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Võta tagasi"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Võta tagasi"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Tee uuesti"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Tee uuesti"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Muuda sündmuse _nime..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Tee sündmuse _võtmefotoks"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Sündmuse võtmefoto valimine"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Uus sündmus"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Uus sündmus"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Fotode liigutamine"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Foto tõstmine sündmusesse"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Sündmuste ühendamine"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Ühenda"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Sündmuste liitmine ühte sündmusesse"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Hinnang"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Hinnangu määramine"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Foto hinnangu määramine"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Suurenda"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Hinnangu suurendamine"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Vähenda"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Hinnangu vähendamine"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Hinnanguta"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Ilma hinnanguta"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Hinnanguta fotode hindamine"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Hinnangu eemaldamine"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Kõigi hinnangute eemaldamine"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Keelatud"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Tagasi lükatud"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Keelatud fotode hindamine"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Määramine keelatuks"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Hinnangu määramine keelatuks"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Ainult _keelatud"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Ainult keelatud"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Ainult keelatud fotode kuvamine"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Kõik + _keelatud"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Näidatakse kõiki fotosid, sealhulgas keelatuid"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Kõik fotod"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Kõigi fotode kuvamine"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Hinnangud"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Kõigi fotode hinnangute kuvamine"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "Foto_filter"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Fotofilter"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Filtri alusel kuvatavate fotode arvu piiramine"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Loo duplikaat"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Loo duplikaat"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Fotost duplikaadi tegemine"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Ekspordi..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Prindi..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Avalda..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Avalda"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Valitud veebilehel avaldamine"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Muuda _pealkirja..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Muuda _kommentaari..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Kommentaari muutmine"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Kohanda kellaaega ja kuupäeva..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Kuupäeva ja kellaaja kohandamine"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Lisa silt..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Lisa silte..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Siltide lisamine"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "Eeli_stused"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Ava _välise redaktoriga"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Ava _RAW redaktoriga"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Saada kellelegi..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Saada _kellele..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Otsi..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Otsi"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Pildi otsimine selle nime või märksõnade järgi"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Märgi lipuga"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Eemalda lipp"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Redaktori käivitamine pole võimalik: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Lisa silt \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Lisa sildid \"%s\" ja \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Kustuta silt \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Kustuta silt \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Kustuta silt"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Uus"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Nimeta silt \"%s\" ümber..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Nimeta silt \"%s\" ümber kui \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Nimeta ümber..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Muuda silte..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Siltide muutmine"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Sildista fotod kui \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Lisa fotodele silt \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Valitud fotode sildistamine kui \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Lisa valitud fotodele silt \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Sildi \"%s\" eemaldamine valitud _fotodelt"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Eemalda silt \"%s\" _fotodelt"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Sildi \"%s\" eemaldamine fotodelt"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Sildi \"%s\" eemaldamine fotodelt"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Sildi nimeks pole võimalik määrata \"%s\", kuna selline silt on juba olemas."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Otsingu nimeks pole võimalik anda \"%s\", kuna sellenimeline otsing on juba "
+"olemas."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Salvestatud otsing"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Otsingu kustutamine"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Muuda..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Nimeta ümber..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Otsingu \"%s\" nimeks \"%s\" andmine"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Otsingu \"%s\" kustutamine"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Hinne %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Määra hinnanguks %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Hinnanguks %s määramine"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Kuva %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Näidatakse ainult fotosid hinnanguga %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s või rohkem"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Kuvatakse %s või rohkem"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Näidatakse fotosid vähemalt hinnanguga %s"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Valitud fotode eemaldamine prügikastist"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Valitud fotode eemaldamine pildikogust"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Taasta"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Valitud fotode tõstmine tagasi pildikogusse"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Näita faili_halduris"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Valitud fotode kataloogi avamine failihalduris"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Failihalduris avamine pole võimalik: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Eemalda kogust"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Viska _prügikasti"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Vali _kõik"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Vali kõik"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a, %e. %b %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a, %d. %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Nurk:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Taasta"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Tagasipöördumine foto praeguste mõõtmete juurde"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Selle foto kärpimise määramine"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Kärperistküliku pööramine püstiseks või rõhtseks"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Piiranguteta"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Ruut"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Monitor"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Originaalsuurus"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD-video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD-video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8,5 x 11 tolli)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 tolli)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Punasilmsuse eemaldaja sulgemine"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Punasilmsuse eemaldamine valitud piirkonnast"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Küllastus:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Värvus:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatuur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Varjud:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Värvide lähtestamine"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Kõigi värvikohenduste tühistamine"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatuur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Värvus"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Küllastus"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Säritus"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Varjud"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastsuse suurendamine"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Tööriistariba naelutamine"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Tööriistariba vabastamine"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Täisekraanist väljumine"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Välju täisekraanist"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Lõpeta"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Lähemalt"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Täisekr_aan"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "A_bi"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Korduma kippuvad küsimused"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Raporteeri veast..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwelli koguga ühendumisel esines tõsine viga. Shotwell ei saa jätkata.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Külasta Yorba veebilehte"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Mattias Põldaru <mahfiaz@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Abi kuvamine pole võimalik: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Pole võimalik minna vigade andmebaasi: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "KKK kuvamine ole võimalik: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "nimetu"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Originaalsuurus"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Laius või kõrgus"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Laius"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Kõrgus"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Pisipiltide suuruse muutmine"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Pisipiltide suurendamine"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Pisipiltide vähendamine"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Fotode _järjestus"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Esita videot"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Valitud videote avamine süsteemi videomängijas"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Kommentaarid"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Fotode kommentaaride kuvamine"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Kõigi fotode siltide kuvamine"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_Pealkirja järgi"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Fotode sorteerimine pealkirja järgi"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "_Kuupäeva järgi"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Fotode sorteerimine võttekuupäeva järgi"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "_Hinnangu järgi"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Fotode sorteerimine hinnangu järgi"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell ei suutnud esitada valitud videot:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotot/videot"
+msgstr[1] "%d foto/video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Iga sündmuse kommentaari näitmaine"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Sündmuseid pole"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Sündmuseid ei leitud"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Sündmused"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Kuupäevata"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Sündmuseid pole"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Puhvrite kataloogi %s pole võimalik luua: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Andmekataloogi %s loomine pole võimalik: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Pildid"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Ajutise kataloogi %s loomine pole võimalik: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Andmete alamkataloogi %s loomine pole võimalik: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(pole)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Pole"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Juhuslik"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Slaidiesitluse üleminekud"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Ajutise faili loomine %s jaoks pole võimalik: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Eksportimine"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Fail %s on juba olemas. Kas kirjutada üle?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Jäta vahele"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Asenda"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Asenda _kõik"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Ekspordi"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotod"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videod"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW pildid"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW pildid"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Viga UI faili %s laadimisel: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Liik"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Avaldamine"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Valitud fotode/videote avaldamine oli edukas."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Valitud videote avaldamine oli edukas."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Valitud fotode avaldamine oli edukas."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Valitud video avaldamine õnnestus."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Valitud foto avaldamine õnnestus."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Kontoandmete hankimine..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Sisselogimine..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Fotode avaldamine"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Fotod _avaldatakse lehel:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Videote avaldamine"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Videod _avaldatakse lehel:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Fotode ja videote avaldamine"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Fotod ja videod _avaldatakse lehel:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Avaldamine pole võimalik"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell ei saa valitud kirjeid avaldada, kuna ükski ühilduv avaldamise "
+"plugin pole sisse lülitatud. Selle parandamiseks vali <b>Redaktor %s "
+"Eelistused</b> ja lülita <b>Pluginate</b> alt sisse vähemalt üks avaldamise "
+"plugin."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Üleslaadimise ettevalmistamine"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Laaditakse üles %d. fotot (kokku %d)"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Avaldamise jätkamine sihtkohta %s pole võimalik, kuna esines viga:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Et proovida avaldamist mõnda teise keskkonda, vali see ülalasuvast menüüst."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Uus _silt..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Avaldamise jaoks vajalik ajutine fail pole saadaval"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Sa ei ole praegu Youtube sisse logitud.\n"
+"\n"
+"Jätkamiseks pead sa juba olema registreerinud Google konto ja selle "
+"seadistanud kasutamiseks Youtube'ga. Enamasti saab konto luua logides "
+"veebibrauserist Youtube'sse ühel korral sisse logides."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Avaldamiseks vajalik fail pole saadaval. Avaldamist Youtube'i pole võimalik "
+"jätkata"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Sa oled Youtube'i sisse logitud kasutajana %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videod ilmuvad kaustas '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Avalikus loendis"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Avalik, sellele ei lingita"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privaatne"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Avaldamise tuumteenus"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Sa ei ole praegu Flickr'isse sisse logitud.\n"
+"\n"
+"Klõpsa sisselogimise nupule, et veebibrauseris Flickrisse sisse logida. Sa "
+"pead Shotwell Connect'i autoriseerima, et seda oma Flickri kontoga linkida."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Sa oled pärast Shotwelli käivitamist korra juba Flickr-isse sisse ja jälle "
+"välja loginud.\n"
+"Fotode avaldamiseks Flickr-is tuleb Shotwelli kinni ja uuesti käima panna "
+"ning siis võib uuesti proovida."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Sisselogimise ettevalmistamine..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Avaldamiseks vajalik fail pole saadaval. Avaldamist Flickrisse pole võimalik "
+"jätkata"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Autoriseerimise kontroll..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Sa oled Flickr-isse sisse logitud kasutajana %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Sinu tasuta Flickri kontol on ühes kuus üleslaaditavate andmete "
+"mahupiirang.\n"
+"Sel kuul on sul veel %d megabaiti üleslaadimise kvoodist alles."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Sinu Flickr Pro konto võimaldab üles laadida piiramatult pilte."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotod on _nähtavad kellele:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videod on _nähtavad kellele:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotod ja videod on _nähtavad kellele:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Kõik"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Ainult sõbrad ja pere"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Ainult pere"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Ainult sõbrad"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Ainult mina"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pikslit"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pikslit"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pikslit"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pikslit"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Albumi %s loomine..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigosse avaldamisel esines viga. Palun proovi uuesti."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Sisesta oma Piwigo fotokogu URL koos vastava kasutajanime ja parooliga."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell ei saanud ühendust Piwigo fotokoguga. Palun kontrolli sisestatud "
+"URL aadressi"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Kasutajanimi ja/või parool on valed. Palun proovi uuesti"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Sobimatu URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Sobimatu kasutajanimi või parool"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwellist üleslaaditud"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Haldurid, pere, sõbrad, kontaktid"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Haldurid, pere, sõbrad"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Haldurid, pere"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Haldurid"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Sa ei ole praegu Picasa veebialbumisse sisse logitud.\n"
+"\n"
+"Klõpsa sisselogimise nupule, et brauseris sisse logida. Seejärel pead "
+"autoriseerima Shotwell Connect'i ühenduse oma Picasa veebialbumite kontoga."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Avaldamiseks vajalik fail pole saadaval. Avaldamist Picasasse pole võimalik "
+"jätkata."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Albumi loomine..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Sa oled Picasa veebialbumisse sisse logitud kasutajana %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videod ilmuvad kaustas:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotode ilmumiskoht:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Väike (640 x 480 pikslit)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Keskmine (1024 x 768 pikslit)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Soovitatud (1600 x 1200 pikslit)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pikslit)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Sa ei ole praegu Facebooki sisse logitud.\n"
+"\n"
+"Kui sul pole Facebooki kontot, võid sisselogimise käigus selle luua. "
+"Sisselogimise ajal küsib \"Shotwelli ühenduja\" luba pfotode üleslaadimiseks "
+"ja sinu voos avaldamiseks. Need õigused on vajalikud, et Shotwelli ühenduja "
+"töötaks."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Sa oled pärast Shotwelli käivitamist korra juba Facebooki sisse ja jälle "
+"välja loginud.\n"
+"Fotode avaldamiseks Facebookis tuleb Shotwelli kinni ja uuesti käima panna "
+"ning siis võib uuesti proovida."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Tavaline (720 pikslit)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Suur (2048 pikslit)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebooki ühenduse testimine..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Avaldamiseks vajalik fail pole saadaval. Avaldamist Facebooki pole võimalik "
+"jätkata"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Sa oled Facebooki sisse logitud kasutajana %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Mille kaudu sa tahad valitud fotod avaldada?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Üleslaadimise _suurus:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Sõbrad"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Murenev"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Malelaud"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Ringid"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Ribad"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Triibud"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Kell"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Ring"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Slaidiesitluse peamised üleminekud"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Libisev"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Sulandus"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Ruudud"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Andmete importimise tuumteenus"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Tere tulemast F-Spoti fotokogu importijasse.\n"
+"\n"
+"Vali mõni fotokogu, mille Shotwell leidis, või mõni muu F-Spoti "
+"andmebaasifail."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Tere tulemast F-Spoti fotokogu importijasse.\n"
+"\n"
+"Palun vali F-Spoti andmebaasifail."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Importimiseks käsitsi F-Spoti andmebaasi valimine:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Valitud F-Spoti andmebaasifaili pole võimalik avada: faili pole olemas või "
+"pole see F-Spoti andmebaas"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Valitud F-Spoti andmebaasifaili pole võimalik avada: Shotwell ei toeta F-"
+"Spoti andmebaasi seda versiooni"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Valitud F-Spoti andmebaasifailid pole võimalik lugeda: viga tags tabeli "
+"lugemisel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Valitud F-Spoti andmebaasi faili pole võimalik lugeda: viga photos tabeli "
+"lugemisel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell leidis F-Spoti fotokogust %d fotot ning parajasti impordib neid. "
+"Duplikaadid tuvastatakse ja eemaldatakse automaatselt.\n"
+"\n"
+"Selle dialoogi võib sulgeda ning jätkata Shotwelli kasutamist ning "
+"importimine jätkub taustal."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spoti fotokogu: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Importimiseks ettevalmistumine"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Määra töölaua taustaesituseks"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Koosta töölaua tausta slaidiesitus"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Iga fotot kuvatakse"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ajavahemik"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Kui kaua igat pilti kuvatakse töölaua taustana"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Otsi"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Otsingu nimi:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Sobivad"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "järgnevatest:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "Prinditud pildi mõõtmed"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "_Standardsuurus:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "_Kohandatud suurus:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Säilitatakse foto külgede suhe"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automaatsuurus:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Pealkirjad</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Piltide _pealkirjade printimine"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pildi lahutus</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Väljasta foto kohta:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pikslit tollile"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "silt"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwelli eelistused"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "valge"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "must"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Kataloogi _jälgimine uute failide avastamiseks"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metaandmed"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "_Siltide, pealkirjade jm metateabe kirjutamine fotofailidesse"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Kuva"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Fotod imporditakse kataloogi:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Taust:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importimine"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Kataloogistruktuur:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Muster:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Näidis:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Imporditud failid nimetatakse ümber _väiketähtedega"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-ilmutaja:"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Vaikimisi:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "_Väline fotoredaktor:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Väline _RAW-redaktor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Välised redaktorid"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Pluginad"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Viivitus:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Üleminekuefekt:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Ülemineku v_iivitus:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Näita _pealkirja"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekundit"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Logi sisse"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "_Olemasolevasse albumisse avaldamine:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Luuakse _uus album nimega:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Uued video- ja fotoalbumid on _nähtavad kellele:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Logi välja"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Avalda"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Sisesta kinnitusnumber, mida kuvatakse veebibrauseris pärast Flickr'isse "
+"sisselogimist."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autoriseerimise _number:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Foto _suurus:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Olemasolev album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Uus album nimega:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Albumit näidatakse avalikus galeriis"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Foto_suuruse mall:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Sinu Piwigo fotokogu _URL"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Kasutajanimi"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Parool"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Parooli peetakse meeles"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Logi sisse"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Olemasolev album:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotosid _näevad:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Foto suurus:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Logi välja"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Video privaatsuse _säte:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pikslit"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' ei ole sobiv vastus OAuth autentimispäringule"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): ei suutnud käivitada; seda avaldajat pole "
+"võimalik taaskäivitada."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Sisesta oma Tumblri konto kasutajanimi ja parool."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI-d polnud võimalik laadida: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Sa oled Tumblrisse sisse logitud kui %s:\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Külasta Yandex.Fotki veebisaiti"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Sa ei ole praegu Yandex.Fotki-sse sisse logitud."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Meiliaadress"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr "Sa oled Tumblrisse sisse logitud kui (name)."
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogid:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumid (või loo uus):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Ligipääsu liik:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "_Kommentaarid keelatud"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Originaalfoto allalaadimine keelatud"
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 0000000..bebed01
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,4624 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# assar <asiersar@yahoo.com>, 2013
+# assar <asiersar@yahoo.com>, 2011-2012
+# assar <asiersar@yahoo.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# assar <asiersar@yahoo.com>, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: assar <asiersar@yahoo.com>\n"
+"Language-Team: Basque (http://www.transifex.com/projects/p/shotwell/language/"
+"eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "%s gertaera"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kamerak"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Ezin izan da kamera desmuntatu. Saiatu kamera fitxategi-kudeatzailetik "
+"desmuntatzen."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ezkutatu jadanik inportatu diren argazkiak"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Inportatu ez diren argazkiak soilik erakutsi"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Inportazioa hastera doa, itxaron..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Izenburuak"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Erakutsi argazki bakoitzaren izenburua"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Inportatu _hautatuak"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Inportatu hautatutako argazkiak zure liburutegira"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Inportatu _denak"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Inportatu argazki guztiak zure liburutegira"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell-ek kamera desmuntatu behar du hura atzitu ahal izateko. Jarraitu?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmuntatu"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Desmuntatu kamera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Beste aplikazio batek kamera blokeatuta dauka. Kamerak desblokeatuta egon "
+"behar du Shotwell-ek hura atzitu ahal dezan. Itxi kamera erabiltzen ari den "
+"beste edozein aplikazioa eta saiatu berriro."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Itxi kamera erabiltzen ari den beste edozein aplikazio."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Ezin izan dira aurrebistak kameratik hartu:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Desmuntatzen..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Argazkien informazioa eskuratzen"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s-(e)ren aurrebista eskuratzen"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Ezin izan da kamera blokeatu: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Argazki hau kameratik ezabatu nahi duzu?"
+msgstr[1] "%d argazki hauek kameratik ezabatu nahi dituzu?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Bideo hau kameratik ezabatu nahi duzu?"
+msgstr[1] "%d bideo hauek kameratik ezabatu nahi dituzu?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Argazki/bideo hau kameratik ezabatu nahi duzu?"
+msgstr[1] "%d argazki/bideo hauek kameratik ezabatu nahi dituzu?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Ezabatu fitxategi hauek kameratik?"
+msgstr[1] "Ezabatu %d argazki hauek kameratik?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Mantendu"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Argazkiak/bideoak kameratik kentzen"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Ezin izan da argazki/bideo %d ezabatu kameratik erroreak gertatu direlako."
+msgstr[1] ""
+"Ezin izan dira %d argazki/bideo ezabatu kameratik erroreak gertatu direlako."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diapositiba-aurkezpena"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Erreproduzitu diapositiba-aurkezpena"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Esportatu argazkia/bideoa"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Esportatu argazkiak/bideoak"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Esportatu argazkia"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Esportatu argazkiak"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Biratzen"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Biraketa desegiten"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Horizontalki iraultzen"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Iraultze horizontala desegiten"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Bertikalki iraultzen"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Iraultze bertikala desegiten"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Edozein testu"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Izenburua"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiketa"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Gertaera-izenak"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Fitxategi-izenak"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Multimedia-mota"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Bandera-egoera"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Balorazioa"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "dauka:"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "zehatz-mehatz da:"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "honekin hasten da:"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "honekin amaitzen da:"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ez dauka:"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ez dago ezarria"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "da"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ez da"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "edozein argazki"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "argazki gordina"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "bideoa"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "banderaduna"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "banderarik gabea"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "eta altuagoa"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "soilik"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "eta baxuagoa"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "data honen ondoren:"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "data honen aurretik:"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "data hauen artean:"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "eta"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "edozein"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "dena"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ezer ez"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Gordetako bilaketak"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Go_rdetako bilaketa berria..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Zure argazki-liburutegia ez da bateragarria Shotwell-en bertsio honekin. "
+"Itxura batean Shotwell %s bertsioarekin (%d eskema) sortu zen. Bertsio hau "
+"%s (%d eskema) da. Erabili Shotwell-en azken bertsioa."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell-ek ezin izan du zure argazki-liburutegia eguneratu %s bertsiotik "
+"(%d eskema) %s bertsiora (%d eskema). Informazio gehiagorako begiartu "
+"Shotwell-en wiki-a %s helbidean"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Zure argazki-liburutegia ez da bateragarria Shotwell-en bertsio honekin. "
+"Itxura batean Shotwell %s bertsioarekin (%d eskema) sortu zen. Bertsio hau "
+"%s (%d eskema) da. Garbitu zure liburutegia %s ezabatuta eta inportatu "
+"berriro zure argazkiak."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Errore ezezaguna gertatu da Shotwell-en datu-basea egiaztatzean: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell kargatzen"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell-en datu pribatuetarako bidea"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIREKTORIOA"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Ez monitorizatu liburutegien direktorioa aldaketen bila exekuzio-denboran"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Ez erakutsi abioaren aurrerapenaren neurgailua"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Erakutsi aplikazioaren bertsioa"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Exekutatu '%s --help' komando-lerroko aukeren zerrenda osoa ikusteko.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Gaur"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Atzo"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Izenburua:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementuak:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "Gertaera %d"
+msgstr[1] "%d gertaera"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d argazki"
+msgstr[1] "%d argazki"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "Bideo %d"
+msgstr[1] "%d bideo"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Ordua:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Noiztik:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Noiz arte:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Tamaina:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Iraupena:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segundo"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Garatzailea:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Esposizioa:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Kokapena:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Fitxategi-tamaina:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Uneko garapena:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Jatorrizko neurria:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kamera-marka:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kamera-modeloa:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash-a:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Foku-distanzia:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Esposizio-data:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Esposizio-ordua:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Esposizio-joera:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS latitudea:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS longitudea:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright-a:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software-a:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Iruzkina:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informazio gehigarria"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Honek \"%s\" etiketa kenduko du argazki batetik. Jarraitu?"
+msgstr[1] "Honek \"%s\" etiketa kenduko du %d argazkitatik. Jarraitu?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Utzi"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Ezabatu"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Honek gordetako \"%s\" bilaketa kenduko du. Jarraitu?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Garatzaileak txandakatzeak argazki honi Shotwell-en egin dizkiozun aldaketa "
+"guztiak desegingo ditu"
+msgstr[1] ""
+"Garatzaileak txandakatzeak argazki hauei Shotwell-en egin dizkiezun aldaketa "
+"guztiak desegingo ditu"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Txandakatu garatzailea"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Esportatu bideoa"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Ezin izan da hurrengo argazkia esportatu fitxategi-errore baten erruz.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Esportazioarekin jarraitu nahi al duzu?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Jarrai_tu"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Aldatu gabea"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Unekoa"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formatua:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kalitatea:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "E_skala-murriztapena:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixel"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Esportatu metadatuak"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Gorde xehetasunak..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Gorde xehetasunak"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(eta %d gehiago)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Inportazio-emaitzen txostena"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Fitxategi %d inportatzeko saiakera egin da."
+msgstr[1] "%d fitxategi inportatzeko saiakera egin da."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Horietatik, fitxategi %d ongi inportatu da."
+msgstr[1] "Horietatik, %d fitxategi ongi inportatu dira."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Bikoiztu inportatu ez diren argazkiak/bideoak:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "existitzen diren multimedia-elementuak bikoizten ditu"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Kamera-erroreen erruz inportatu ez diren argazkiak/bideoak:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "errore-mezua:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Argazki edo bideo gisa ez ezagutzeagatik inportatu ez diren fitxategiak:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Shotwell-ek ulertzen duen formatu batean ez egoteagatik inportatu ez diren "
+"argazkiak/bideoak:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Shotwell-ek bere liburutegira kopiatu ezin izateagatik inportatu ez diren "
+"argazkiak/bideoak:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"ezin kopiatu %s\n"
+"\thona: %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Beste arrazoi batzuengatik inportatu ez diren argazkiak/bideoak:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Ez da inportatu argazki bikoiztu bat:\n"
+msgstr[1] "Ez dira inportatu %d argazki bikoiztu:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Ez da inportatu bideo bikoiztu bat:\n"
+msgstr[1] "Ez da inportatu %d bideo bikoiztu:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Ez da inportatu argazki/bideo bikoiztu bat:\n"
+msgstr[1] "Ez dira inportatu %d argazki/bideo bikoiztu:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Argazki baten inportazioak huts egin du fitxategi- edo hardware-errore baten "
+"erruz:\n"
+msgstr[1] ""
+"%d argazkiren inportazioak huts egin du fitxategi- edo hardware-erroreen "
+"erruz:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Bideo baten inportazioak huts egin du fitxategi- edo hardware-errore baten "
+"erruz:\n"
+msgstr[1] ""
+"%d bideoren inportazioak huts egin du fitxategi- edo hardware-erroreen "
+"erruz:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Argazki/bideo baten inportazioak huts egin du fitxategi- edo hardware-errore "
+"baten erruz:\n"
+msgstr[1] ""
+"%d argazkiren/bideoren inportazioak huts egin du fitxategi- edo hardware-"
+"erroreen erruz:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ezin izan da fitxategi 1 inportatu fitxategian edo hardwarean errorea egon "
+"delako:\n"
+msgstr[1] ""
+"Ezin izan dira %d fitxategi inportatu fitxategian edo hardwarean errorea "
+"egon delako:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Argazki baten inportazioak huts egin du argazki-liburutegiaren karpetan "
+"idazteko baimen ezagatik:\n"
+msgstr[1] ""
+"%d argazkiren inportazioak huts egin du argazki-liburutegiaren karpetan "
+"idazteko baimen ezagatik:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Bideo baten inportazioak huts egin du argazki-liburutegiaren karpetan "
+"idazteko baimen ezagatik:\n"
+msgstr[1] ""
+"%d bideoren inportazioak huts egin du argazki-liburutegiaren karpetan "
+"idazteko baimen ezagatik:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Argazki/bideo baten inportazioak huts egin du argazki-liburutegiaren "
+"karpetan idazteko baimen ezagatik:\n"
+msgstr[1] ""
+"%d bideo/argazkiren inportazioak huts egin du argazki-liburutegiaren "
+"karpetan idazteko baimen ezagatik:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ezin izan da fitxategi 1 inportatu argazki-liburutegiaren karpetan ezin "
+"delako idatzi:\n"
+msgstr[1] ""
+"Ezin izan dira %d fitxategi inportatu argazki-liburutegiaren karpetan ezin "
+"delako idatzi:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Argazki baten inportazioak huts egin du kamera-errore baten erruz:\n"
+msgstr[1] ""
+"%d argazkiren inportazioak huts egin du kamera-errore baten erruz:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Bideo baten inportazioak huts egin du kamera-errore baten erruz:\n"
+msgstr[1] "%d bideoren inportazioak huts egin du kamera-errore baten erruz:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Argazki/bideo baten inportazioak huts egin du kamera-errore baten erruz:\n"
+msgstr[1] ""
+"%d argazkiren/bideoren inportazioak huts egin du kamera-errore baten erruz:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Ezin izan da fitxategi 1 inportatu kameran errorea egon delako:\n"
+msgstr[1] ""
+"Ezin izan dira %d fitxategi inportatu kameran errorea egon delako:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Onartzen ez den argazki bat saltatu da:\n"
+msgstr[1] "Onartzen ez diren %d argazki saltatu dira:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Irudia ez den fitxategi bat saltatu da.\n"
+msgstr[1] "Irudiak ez diren %d fitxategi saltatu dira.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Argazki bat saltatu da erabiltzaileak bertan behera utzi duelako:\n"
+msgstr[1] ""
+"%d argazki saltatu dira erabiltzaileak bertan behera utzi dituelako:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Bideo bat saltatu da erabiltzaileak bertan behera utzi duelako:\n"
+msgstr[1] ""
+"%d bideo saltatu dira erabiltzaileak bertan behera utzi dituelako:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"Argazki/bideo bat saltatu da erabiltzaileak bertan behera utzi duelako:\n"
+msgstr[1] ""
+"%d argazki/bideo saltatu dira erabiltzaileak bertan behera utzi dituelako:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+"Fitxategi 1 saltatu da erabiltzaileak ekintza bertan behera utzi duelako:\n"
+msgstr[1] ""
+"%d fitxategi saltatu dira erabiltzaileak ekintza bertan behera utzi "
+"duelako:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Argazki bat ongi inportatu da.\n"
+msgstr[1] "%d argazki ongi inportatu dira.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Bideo bat ongi inportatu da.\n"
+msgstr[1] "%d bideo ongi inportatu dira.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Argazki/bideo bat ongi inportatu da.\n"
+msgstr[1] "%d bideo/argazki ongi inportatu dira.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ez da ez argazkirik ez bideorik inportatu.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Inportazioa osatu da"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "Segundo %d"
+msgstr[1] "%d segundo"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "Minutu %d"
+msgstr[1] "%d minutu"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "Ordu %d"
+msgstr[1] "%d ordu"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "Egun bat"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Berrizendatu gertaera"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Izena:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editatu izenburua"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Bota fitxategia _zakarrontzira"
+msgstr[1] "Bota fitxategiak _zakarrontzira"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Kendu soilik"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Leheneratu kanpoko edizioak?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Leheneratu kanpo-edizioak?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Honek kanpoko fitxategian egindako aldaketa guztiak suntsituko ditu. "
+"Jarraitu?"
+msgstr[1] ""
+"Honek %d kanpoko fitxategitan egindako aldaketa guztiak suntsituko ditu. "
+"Jarraitu?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Leheneratu kanpoko edizioa"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Leheneratu kanpoko edizioak"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Argazkia liburutegitik kenduko da. Jarraitu?"
+msgstr[1] "%d argazki liburutegitik kenduko dira. Jarraitu?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Kendu"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Kendu argazkia liburutegitik"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Kendu argazkiak liburutegitik"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 or."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "De_splazatu argazkiak/bideoak maila berean"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Ezarri argazki/bideo guztiei _data hau"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Al_datu jatorrizko argazki-fitxategia"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Al_datau jatorrizko argazki-fitxategiak"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Aldatu jatorrizko fitxategia"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Aldatu jatorrizko fitxategiak"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Jatorrizkoa: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Esposizio-data aurrera mugituko da\n"
+"%d %s, %d %s, %d %s, eta %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Esposizio-data atzera mugituko da\n"
+"%d %s, %d %s, %d %s, eta %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "egun"
+msgstr[1] "egun"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ordu"
+msgstr[1] "ordu"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutu"
+msgstr[1] "minutu"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundo"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Eta beste %d."
+msgstr[1] ""
+"\n"
+"\n"
+"Eta beste %d."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiketak (koma bidez banandurik):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Ongi etorri!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Ongi etorri Shotwell-era!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Hasteko, inportatu argazkiak honela:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Hautatu <span weight=\"bold\">Fitxategia %s Inportatu karpetatik</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arrastatu eta jaregin argazkiak Shotwell-en leihoan"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Konektatu kamera bat zure ordenagailura eta inportatu"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Inportatu argazkiak zure %s karpetatik"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Beste modu hauek ere erabil ditzakezu argazkiak inportatzeko:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Ez erakutsi mezu hau berriro"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Inportatu argazkiak zure %s liburutegitik"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Laguntza)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Urtea%sHila%sEguna"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Urtea%sHila"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Urtea%sHila-Eguna"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Urtea-Hila-Eguna"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Pertsonalizatua"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Baliogabeko eredua"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell-ek argazkiak zure liburutegi-karpetan kopia ditzake edo haiek "
+"kopiatu gabe inporta ditzake."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_piatu argazkiak"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Inportatu tokian"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Inportatu liburutegira"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Kendu liburutegitik"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Argazkia liburutegitik kentzen"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Argazkiak liburutegitik kentzen"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Honek argazkia/bideoa kenduko du zure Shotwell liburutegitik Fitxategia "
+"zure mahaigaineko zakarrontzira ere mugitu nahi duzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+msgstr[1] ""
+"%d argazki/bideo zure Shotwell liburutegitik kenduko dira. Fitxategiak zure "
+"mahaigaineko zakarrontzira ere mugitu nahi dituzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Honek bideoa kenduko du zure Shotwell liburutegitik Fitxategia zure "
+"mahaigaineko zakarrontzira ere mugitu nahi duzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+msgstr[1] ""
+"%d bideo zure Shotwell liburutegitik kenduko dira. Fitxategiak zure "
+"mahaigaineko zakarrontzira ere mugitu nahi dituzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Argazkia zure Shotwell liburutegitik kenduko da. Fitxategia zure "
+"mahaigaineko zakarrontzira ere mugitu nahi duzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+msgstr[1] ""
+"%d argazki zure Shotwell liburutegitik kenduko dira. Fitxategiak zure "
+"mahaigaineko zakarrontzira ere mugitu nahi dituzu?\n"
+"\n"
+"Ekintza hau ezin da desegin."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Argazkia edo bideoa ezin da mugitu zure mahaigainaren zakarrontzira. "
+"Fitxategi hau ezabatu nahi duzu?"
+msgstr[1] ""
+"%d argazki/bideo ezin dira mugitu zure mahaigainaren zakarrontzira. "
+"Fitxategi hauek ezabatu nahi dituzu?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Argazkia edo bideoa ezin da ezabatu."
+msgstr[1] "%d bideo/argazki ezin dira ezabatu."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Karpetak"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiketak"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Arrakasta"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Fitxategi-errorea"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Ezin izan da fitxategia deskodetu"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Datu-basearen errorea"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Erabiltzaileak bertan behera utzitako inportazioa"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ez da fitxategi bat"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Fitxategia jadanik existitzen da datu-basean"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Fitxategi-formatua ez da onartzen"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ez da irudi-fitxategia"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Disko-hutsegitea"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Diskoa beterik dago"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamera-errorea"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Errorea fitxategia idaztean"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Inportazioak huts egin du (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "aldatua"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Aurreko argazkia"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Hurrengo argazkia"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Argazkiaren jatorrizko fitxategia falta da: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Ikusi"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "T_resnak"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Au_rreko argazkia"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Aurreko argazkia"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Hurrengo argazkia"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Hurrengo argazkia"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Handiagotu"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Handiagotu argazkiaren bistaratze-tamaina"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Txikiagotu"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Txikiagotu argazkiaren bistaratze-tamaina"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Doitu _orrialdera"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Doitu argazkia pantailara"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom %_100"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Jarri argazkiaren zoom-a %100ean"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _%200"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Jarri zrgazkiaren zoom-a %200ean"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Garatzailea"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Ezin izan da %s esportatu: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s datu-basea"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"%s zerbitzutik egin nahi izan den inportazioak ezin du jarraitu errore bat "
+"gertatu delako:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Beste zerbitzu batetik inportatzen saiatzeko, hautatu bat goiko menutik."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Datu-inportazioak"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Ez daukazu datuak inportatzeko pluginik gaituta.\n"
+"\n"
+"\"Inportatu aplikaziotik\" funtzionaltasuna erabiltzeko, datuak inportatzeko "
+"plugin bat gutxienez eduki behar duzu gaituta. Pluginak hobespenen leihoan "
+"gai daitezke."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Datu-basearen fitxategia:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Inportatu"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Inportatu aplikaziotik"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Inportatu multimedia _hemendik:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Itxi"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Ezarpenak"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diapositiba_aurkezpena"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Aurrekoa"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Joan aurreko argazkira"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausatu diapositiba-aurkezpena"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Hurrengoa"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Joan hurrengo argazkira"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Aldatu aurkezpenaren ezarpenak"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Argazkien jatorri-fitxategi guztiak galdu dira."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Erreproduzitu"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Jarraitu diapositiba-aurkezpena"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Leheneratzen"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Leheneratzea desegiten"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Hobetzen"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Hobetzea desegiten"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Gertaera berria sortzen"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Gertaera kentzen"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Argazkiak gertaera berrira mugitzen"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Argazkiak aurreko gertaeran ezartzen"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Batzen"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Banatzen"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Argazkiak bikoizten"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Argazki bikoiztuak kentzen"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Ezin izan da argazki bat bikoiztu fitxategi-errore baten erruz"
+msgstr[1] "Ezin izan dira %d argazki bikoiztu fitxategi-erroreen erruz"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Aurreko balorazioa berrezartzen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Balorazioak handitzen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Balorazioak txikitzen"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW garatzailea ezartzen"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Aurreko RAW garatzailea berrezartzen"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Ezarri garatzailea"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Jatorrizko argazkia ezin izan da doitu."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Data eta ordua doitzen"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Dataren eta orduaren doitzea desegiten"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Jatorrizko argazki bat ezin izan da doitu."
+msgstr[1] "Hurrengo jatorrizko argazkiak ezin izan dira doitu."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Errorea ordua doitzean"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Ordu-doiketak ezin dira desegin hurrengo argazki-fitxategian."
+msgstr[1] "Ordu-doiketak ezin dira desegin hurrengo argazki-fitxategietan."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Sortu etiketa"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mugitu \"%s\" etiketa"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mugitu argazkiak zakarrontzira"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Leheneratu argazkiak zakarrontzitik"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mugitu argazkiak Shotwell-en zakarrontzira"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Leheneratu argazkiak Shotwell-en liburutegira"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Argazkiak zakarrontzira mugitzen"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Zakarrontziko argazkiak leheneratzen"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Jarri bandera argazki hautatuei"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Kendu argazki hautatuen bandera"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Jarri bandera"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Kendu bandera"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baxua (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Ertaina (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Altua (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximoa (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Argazkirik/bideorik ez"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Ez da argazkirik/bideorik aurkitu"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Argazkiak ezin dira direktorio honetara esportatu."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Ezin izan dira prozesatu eguneratze-monitorizazioak: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Bete orri osoa"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 irudi orriko"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 irudi orriko"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 irudi orriko"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 irudi orriko"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 irudi orriko"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 irudi orriko"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "hazbete"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Zorroa (2 x 3 hazbete)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Txartela (3 x 5 hazbete)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 hazbete"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 hazbete"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 hazbete"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 hazbete"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 hazbete"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Zorro metrikoa (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postala (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Irudiaren ezarpenak"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Inprimatzen..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Ezin izan da argazkia inprimatu:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Ezin izan da argazkien %s datu-basea ireki/sortu: %d errore-kodea"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Ezin izan da idatzi argazkiaren datu-basearen fitxategian:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Errorea datu-basearen fitxategia atzitzean:\n"
+" %s\n"
+"\n"
+"Errorea hau da: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Esportatu bideoak"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Ezin izan da Nautilus-en \"Bidali hona\" abiarazi: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Bidali hona:"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Ezin izan da atzeko planoa esportatu %s-(e)ra: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Ezin da mahaigaineko diapositiba-aurkezpena prestatu: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Bandera jarria"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Zakarrontzia"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Zakarrontzia hutxik dago"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Ezabatu"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Argazkiak ezabatzen"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Falta diren fitxategiak"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Ezabatzen..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Azken inportazioa"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Inportatu _karpetatik..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Inportatu argazkiak diskotik liburutegira"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Inportatu _aplikaziotik..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordenatu _gertaerak"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Hustu _zakarrontzia"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Ezabatu zakarrontziko argazki guztiak"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "I_kusi gertaera argazkirako"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "A_urkitu"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Aurkitu argazkiak eta bideoak bilaketa-irizpideen arabera"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fitxategia"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Editatu"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Argazkia"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Argazkiak"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Ger_taerak"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Etiketak"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Laguntza"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Oinarrizko informazioa"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Erakutsi hautapenaren oinarrizko informazioa"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informazio _gehigarria"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Erakutsi hautapenaren informazio gehigarria"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Bilaketa-barra"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Erakutsi bilaketa-barra"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Alboko barra"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Erakutsi alboko barra"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Gorantz"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Ordenatu argazkiak goranzko ordenan"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Beherantz"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Ordenatu argazkiak beheranzko ordenan"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Inportatu karpetatik"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Hustu zakarrontzia"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Zakarrontzia husten..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell zure direktorio nagusiko argazkiak inportatzeko konfiguratuta "
+"dago.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Liburutegiaren kokapena"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Direktorio honetatik ezin dira argazkiak inportatu"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Liburutegia eguneratzen..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Argazkiak automatikoki inportatzeko prestatzen..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Argazkiak automatikoki inportatzen..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Metadatuak fitxategietan idazten..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Liburutegia"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Inportatzen..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Gelditu inportazioa"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Gelditu argazkien inportazioa"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Inportatzeko prestatzen..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s inportatua"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Gorde"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Gorde argazkia"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Gorde _honela..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Gorde argazkia beste izen batekin"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+"Inprimatu argazkia zure ordenagailuari konektatutako inprimagailu batean"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ez da existitzen."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ez da fitxategia."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s-(e)k ez du onartzen %s-(r)en fitxategi-formatua."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Gorde _kopia bat"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s-(r)i egindako aldaketak galdu nahi dituzu?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Itxi g_orde gabe"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Errorea %s gordetzean: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Gorde honela"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Ezin izan da %s aztertu: Ez da direktorio bat (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Argazki-kudeatzailea"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Argazki-ikustailea"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Biratu e_skuinera"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Biratu"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Biratu eskuinera"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Biratu argazkiak eskuinera (sakatu Ktrl ezkerrera biratzeko)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Biratu e_zkerrera"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Biratu ezkerrera"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Biratu argazkiak ezkerrera"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Irauli _horizontalki"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Irauli horizontalki"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Irauli _bertikalki"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Irauli bertikalki"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "H_obetu"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Hobetu"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Hobetu automatikoki argazkiaren itxura"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Moztu"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Moztu"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Moztu argazkiaren tamaina"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Jarri _zuzen"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Jarri zuzen"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Jarri zuzen argazkia"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Begi _gorriak"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Begi gorriak"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Murriztu edo ezabatu begi gorrien efektua argazkitik"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Doitu"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Doitu"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Doitu argazkiaren kolorea eta tonua"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Leheneratu jatorrizkora"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Leheneratu jatorrizkora"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Leheneratu _kanpoko edizioak"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Leheneratu argazki maisura"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Ezarri _mahaigainaren atzeko plano gisa"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Ezarri hautatutako irudia mahaigainaren atzeko planoa izan dadin"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Ezarri _mahaigainaren diapositiba-aurkezpen gisa..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "D_esegin"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Desegin"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "Be_rregin"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Berregin"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Be_rrizendatu gertaera..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Sortu gertaeraren argazki _gakoa"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Sortu gertaeraren argazki gakoa"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Gertaera _berria"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Gertaera berria"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mugitu argazkiak"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mugitu argazkiak gertaera batera"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Ba_tu gertaerak"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Batu"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Konbinatu gertaerak gertaera bakarrean"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "E_zarri balorazioa"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Ezarri balorazioa"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Aldatu zure argazkiaren balorazioa"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Handitu"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Handitu balorazioa"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Txikitu"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Txikitu balorazioa"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "Ba_loratu gabea"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Puntuatu gabea"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Eman balorazioa"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Balorazioa kentzen"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Kendu balorazio guztiak"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Ezetsia"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Baztertua"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Eman ezetsiaren balorazioa"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Ezetsi modura ezartzen"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Ezarri ezetsiaren balorazioa"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Ezetsia _soilik"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Ezetsia soilik"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Erakutsi ezetsitako argazkiak soilik"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Denak + _ezetsiak"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Erakutsi argazki guztiak, ezetsiak barne"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Argazki guztiak"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Erakutsi argazki guztiak"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Balorazioak"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Erakutsi argazki bakoitzaren balorazioa"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Iragazi argazkiak"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Iragazi argazkiak"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Mugatu erakutsiko diren argazkien kopurua iragazki baten bidez"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Bi_koiztu"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Bikoiztu"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Egin argazkiaren bikoizketa"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Esportatu..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Inprimatu..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "A_rgitaratu..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Argitaratu"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Argitaratu hainbat webgunetan"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Editatu _izenburua..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Editatu _iruzkina..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Editatu iruzkina"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Doitu data eta ordua..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Doitu data eta ordua"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Gehitu _etiketak..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Gehitu _etiketak..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Gehitu etiketak"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Hobespenak"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Ireki _kanpoko editore batekin"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Ireki RA_W editorearekin"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Bidali _hona..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Bidali h_ona..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Aurkitu..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Aurkitu"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Aurkitu irudi bat bere izenean edo etiketetan ageri den testuren bat idatziz"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Bandera"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Kendu bandera"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Ezin izan da editorea abiarazi: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Gehitu \"%s\" etiketa"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Gehitu \"%s\" eta \"%s\" etiketak"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "E_zabatu \"%s\" etiketa"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Ezabatu \"%s\" etiketa"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Ezabatu etiketa"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Berria"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Berrize_ndatu \"%s\" etiketa..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Berrizendatu \"%s\" etiketa eta \"%s\" jarri"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Be_rrizendatu..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Al_datu etiketak..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Aldatu etiketak"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Jarri \"%s\" etiketa argazkiari"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Jarri \"%s\" etiketa argazkiei"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Jarri \"%s\" etiketa hautatutako argazkiari"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Jarri \"%s\" etiketa hautatutako argazkiei"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Kendu \"%s\" etiketa _argazkitik"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Kendu \"%s\" etiketa _argazkietatik"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Kendu \"%s\" etiketa argazkitik"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Kendu \"%s\" etiketa argazkietatik"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Ezin izan da etiketaren izena aldatu eta \"%s\" jarri, etiketa hori jadanik "
+"existitzen delako."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Ezin izan zaio bilaketari \"%s\" izena jarri, izen hori jadanik existitzen "
+"baita."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Gordetako bilaketa"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Ezabatu bilaketa"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editatu..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Be_rrizendatu..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Berrizendatu \"%s\" bilaketa \"%s\"-(e)ra"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Ezabatu \"%s\" bilaketa"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Eman balorazioa %s-(e)ri"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Ezarri balorazioa %s-(e)ri"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Balorazioa ezartzen %s-(e)ri"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Erakutsi %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Erakutsi %s balorazioa duten argazkiak soilik"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s edo hobea"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Erakutsi %s edo hobea"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Erakutsi %s balorazioa edo hobea duten argazkiak soilik"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Kendu hautatutako argazkiak zakarrontzitik"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Kendu hautatutako argazkiak liburutegitik"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Leheneratu"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mugitu hautatutako argazkiak berriro liburutegira"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Erakutsi fitxategi-kudeat_zailean"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Ireki hautatutako argazkiaren direktorioa fitxategi-kudeatzailean"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Ezin izan da fitxategi-kudeatzailean ireki: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Ke_ndu liburutegitik"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mugitu zakarrontzira"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Hautatu _denak"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Hautatu elementu guztiak"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Angelua:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Berrezarri"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Itzuli uneko argazkiaren neurrietara"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Ezarri argazki honen mozketa"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Aldatu mozketa-laukizuzena orientazio horizontalaren eta bertikalaren artean"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Mugarik gabea"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Karratua"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Pantaila"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Jatorrizko tamaina"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD bideoa (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD bideoa (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Eskutitza (8.5 x 11 hazbete)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloidea (11 x 17 hazbete)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Itxi begi gorrien tresna"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Kendu begi gorrien efektua hautatutako eskualdean"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturazioa:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Ñabardura:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Tenperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Itzalak:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Berrezarri koloreak"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Berrezarri kolore-doiketa guztiak jatorrizkora"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Tenperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Ñabardura"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturazioa"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Esposizioa"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Itzalak"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastearen hedapena"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Finkatu tresna-barra"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Finkatu tresna-barra irekita"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Utzi pantaila osoan"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Utzi pantaila _osoan"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Irten"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Honi buruz"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Pantaila o_soa"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Edukiak"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Maiz egiten diren galderak"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Jakinarazi akatsa..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Errore larria gertatu da Shotwell-en liburutegia atzitzean Shotwell-ek ezin "
+"du jarraitu.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Joan Yorba-ren webgunera"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Asier Sarasua Garmendia <asiersar@yahoo.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Ezin izan da laguntza erakutsi: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Ezin izan da akatsen datu-basera nabigatu: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Ezin izan dira MEGak erakutsi: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "izenik gabea"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Jatorrizko tamaina"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Zabalera edo altuera"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Zabalera"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altuera"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Doitu miniaturen tamaina"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Handiagotu miniaturen bistaratze-tamaina"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Txikiagotu miniaturen bistaratze-tamaina"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordenatu _argazkiak"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Erreproduzitu bideoa"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Ireki hautatutako bideoak sistemaren bideo-erreproduzigailuan"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Iruzkinak"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Erakutsi argazki bakoitzaren iruzkina"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Erakutsi argazkien etiketak"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_Izenburuaren arabera"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordenatu argazkiak izenburuaren arabera"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Esposizio-_dataren arabera"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordenatu argazkiak esposizio-dataren arabera"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "_Balorazioaren arabera"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordenatu argazkiak balorazioaren arabera"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell-ek ezin izan du erreproduzitu hautatutako bideoa:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d argazki/bideo"
+msgstr[1] "Argazki/bideo %d"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Erakutsi gertaera bakoitzaren iruzkina"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Gertaerarik ez"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Ez da gertaerarik aurkitu"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Gertaerak"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Datarik gabea"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Gertaerarik ez"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Ezin izan da %s katxe-direktorioa sortu: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Ezin izan da %s datu-direktorioa sortu: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Irudiak"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Ezin izan da behin-behineko %s direktorioa sortu: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Ezin izan da %s datu-azpidirektorioa sortu: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ezer ez)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ezer ez"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Ausazkoa"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Diapositiba-trantsizioak"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Ezin izan da behin-behineko fitxategia sortu %s-(e)rako: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Esportatzen"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s fitxategia dagoeneko existitzen da. Ordeztu?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Saltatu"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Ordeztu"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Ordeztu _denak"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Esportatu"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Argazkiak"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Bideoak"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW argazkiak"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW argazkiak"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Errorea %s EI fitxategia kargatzean: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Mota"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Argitaratzea"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Hautatutako argazkiak/bideoak ongi argitaratu dira."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Hautatutako bideoak ongi argitaratu dira."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Hautatutako argazkiak ongi argitaratu dira."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Hautatutako bideoa ongi argitaratu da."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Hautatutako argazkia ongi argitaratu da."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Kontu-informazioa eskuratzen..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Saioa hasten..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Argitaratu argazkiak"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Argitaratu argazkiak _hemen:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Argitaratu bideoak"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Argitaratu bideoak _hemen:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Argitaratu argazkiak eta bideoak"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Argitaratu argazkiak eta bideoak _hemen:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Ezin izan da argitaratu"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell-ek ezin ditu hautatutako elementuak argitaratu ez daukazulako "
+"gaituta bateragarririk den pluginik. Hau zuzentzeko, hautatu <b>Editatu %s "
+"Hobespenak</b> eta gaitu <b>Plugina</b> fitxan dagoen argitaratze-"
+"pluginetako bat edo gehiago."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Igotzeko prestatzen"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d %d-(e)tik igotzen"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Ezin da %s-(e)ko argitaratzearekin jarraitu errore bat gertatu delako:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Saiatu beste zerbitzu batean argitaratzen, hautatu bat goiko menuan."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "_Etiketa berria..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Argitaratzea gauzatzeko beharrezkoa den behin-behineko fitxategi bat ez dago "
+"eskuragarri"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"YouTube-n saioa hasi gabe zaude.\n"
+"\n"
+"Google-n kontu bat eduki behar duzu eta hura YouTube-n erabiltzeko "
+"konfiguratuta eduki behar duzu jarraitzeko. Kontu gehiago sor ditzakezu zure "
+"nabigatzailearekin YouTube-ra gutxienez behin sartuz."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Argitaratzeko beharrezkoa den fitxategi bat ez dago eskuragarri. Youtube-en "
+"argitaratzeak ezin du jarraitu."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "YouTube-n saioa hasita daukazu %s erabiltzaile-izenarekin."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Bideoak '%s'-(e)n agertuko dira"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Publikoa zerrendatua"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Publikoa zerrendatu gabea"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Pribatua"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Oinarrizko argitaratze-zerbitzuak"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Flickr-en saioa hasi gabe zaude.\n"
+"\n"
+"Egin klik saioa hasteko aukeran, Flickr-en saioa hasteko zure web "
+"nabigatzailean. Baimena eman beharko diozu Shotwell Connect-i zure Flickr "
+"kontuarekin lotura sortzeko."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Dagoeneko hasi eta amaitu duzu Flickr-eko saioa Shotwell-en saio honetan "
+"zehar.\n"
+"Flickr-en argitaratzen jarraitzeko irten eta berrabiarazi Shotwell, eta gero "
+"saiatu berriro argitaratzen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Saioa hasteko prestatzen..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Argitaratzeko beharrezkoa den fitxategi bat ez dago eskuragarri. Flickr-en "
+"argitaratzeak ezin du jarraitu."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Baimena egiaztatzen..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Flickr-en saioa hasita daukazu %s erabiltzaile-izenarekin.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Zure Flickr-eko doaneko kontuak mugatuta dauka hilero igo dezakezun datu-"
+"kopurua.\n"
+"Hilabete honetan %d megabyte geratzen zaizkizu zure igotze-kuota betetzeko."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Zure Flickr-eko Pro kontuarekin mugarik gabe igo ditzakezu datuak."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Argazkiak _ikusgai hauentzat:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Bideoak _ikusgai hauentzat:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Argazkiak eta bideoak _ikusgai hauentzat:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Edonor"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Lagunak eta familia soilik"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Familia soilik"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Lagunka soilik"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Ni neu"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixel"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s albuma sortzen..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Errore-mezua agertu da Piwigo zerbitzuak argitaratzean. Saiatu berriro."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Sartu zure Piwigo argazki-liburutegiaren URLa eta zure Piwigo kontuari "
+"lotutako erabiltzaile-izena eta pasahitza."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell-ek ezin du zure Piwigo argazki-liburutegiarekin kontaktatu. "
+"Egiaztatu sartu duzun URLa."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Erabiltzaile-izena edo pasahitz okerra. Saiatu berriro."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Baliogabeko URLa"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Erabiltzaile-izen edo pasahitz okerra"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratzaileak, familia, lagunak, kontaktuak"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratzaileak, familia, lagunak"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratzaileak, familia"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratzaileak"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Picasa-n saioa hasi gabe zaude.\n"
+"\n"
+"Egin klik saioa hasteko aukeran, Picasa Web Albums zerbitzuan saioa hasteko "
+"zure web-nabigatzailean. Baimena eman beharko diozu Shotwell Connect-i zure "
+"Picasa Web Albums kontuarekin lotura sortzeko."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Argitaratzeko beharrezkoa den fitxategi bat ez dago eskuragarri. Picasa-n "
+"argitaratzeak ezin du jarraitu."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Albuma sortzen..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Picasa-n saioa hasita daukazu %s erabiltzaile-izenarekin."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Bideoak hemen agertuko dira:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Argazkiak hemen agertuko dira:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Txikia (640 x 480 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Ertaina (1024 x 768 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Gomendatua (1600 x 1200 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Facebook-en saioa hasi gabe zaude.\n"
+"\n"
+"Oraindik Facebook-en konturik ez badaukazu, bat sor dezakezu saioa hasteko "
+"prozesuan. Saioa hastean, Shotwell Connect-ek zure baimena eska dezake "
+"argazkiak igotzeko eta zure jarioa argitaratzeko. Baimen hauek "
+"derrigorrezkoak dira Shotwell Connect-ek funtziona dezan."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Dagoeneko hasi eta amaitu duzu Facebook-eko saioa Shotwell-en saio honetan "
+"zehar.\n"
+"Facebook-en argitaratzen jarraitzeko irten eta berrabiarazi Shotwell, eta "
+"gero saiatu berriro argitaratzen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Estandarra (720 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Handia (2.048 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook-erako konexioa probatzen..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Argitaratzeko beharrezkoa den fitxategi bat ez dago eskuragarri. Facebook-en "
+"argitaratzeak ezin du jarraitu."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Facebook-en saioa hasita daukazu %s erabiltzaile-izenarekin.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Non argitaratu nahi dituzu hautatutako argazkiak?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Igoera-_tamaina:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Lagunak"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Birrindu"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Xakea"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Zirkuluak"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Pertsianak"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Marrak"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Ordularia"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Zirkulua"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Oinarrizko diapositiba-trantsizioak"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapositiba"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Iraungi"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Koadroak"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Datuak inportatzeko oinarrizko zerbitzuak"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Ongi etorri F-Spot aplikazioaren liburutegiak inportatzeko zerbitzura.\n"
+"\n"
+"Mesedez, hautatu liburutegi bat inportaziorako, bai Shotwellek aurkitu duen "
+"liburutegietako bat hautatuz bai F-Spot-en datu-base fitxategi bat hautatuz."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Ongi etorri F-Spot aplikazioaren liburutegiak inportatzeko zerbitzura.\n"
+"\n"
+"Hautatu F-Spot aplikazioaren datu-base fitxategi bat."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+"Hautatu eskuz F-Spot aplikazioaren datu-base fitxategi bat inportazioa "
+"egiteko:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Ezin izan da hautatutako F-Spot-en datu-base fitxategia ireki: fitxategia ez "
+"da existitzen edo ez da F-Spot datu-basea"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Ezin izan da hautatutako F-Spot-en datu-base fitxategia ireki: Shotwellek ez "
+"du F-Spot datu-baseen bertsio hau onartzen"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Ezin izan da hautatutako F-Spot-en datu-base fitxategia irakurri: errorea "
+"etiketen taula irakurtzean"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Ezin izan da hautatutako F-Spot-en datu-base fitxategia irakurri: errorea "
+"argazkien taula irakurtzean"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell-ek %d argazki aurkitu ditu F-Spot liburutegian eta haiek "
+"inportatzen ari da orain. Bikoiztuak automatikoki ezabatu eta kenduko dira.\n"
+"\n"
+"Elkarrizketa-koadro hau itxi eta Shotwell erabiltzen has zaitezke "
+"inportazioa atzeko planoan gertatzen ari den bitartean."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot liburutegia: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Inportatzeko prestatzen"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Ezarri mahaigainaren diapositiba-aurkezpen gisa"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Sortu mahaigainaren atzeko planorako diapositiba-aurkezpena"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Erakutsi argazki bakoitza denbora-tarte honetan:"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "denbora-tartea"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"Zenbat denboran erakutsiko den argazki bakoitza mahaigainaren atzeko planoan"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Bilatu"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "Bilaketaren _izena:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Parekatu"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "hurrengoak:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Inprimatutako irudi-tamaina</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Erabili tamaina e_standarra:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Erabili tamaina _pertsonalizatua:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "Bat _etorri argazkiaren aspektu-erlazioarekin"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "Tamaina _automatikoa:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Izenburuak</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Inprimatu irudiaren _izenburua"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pixel-bereizmena</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Atera argazkia hemendik:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixel/hazbete"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiketa"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell-en hobespenak"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "zuria"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "beltza"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Behatu liburutegi-direktorioa fitxategi berriak aurkitzeko"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadatuak"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Idatzi etiketak, izenburuak eta beste _metadatu batzuk argazki-fitxategietan"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Erakutsi"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Inportatu argazkiak hona:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "At_zeko planoa:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Inportatzen"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Direktorio-egitura:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Eredua:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Adibidea:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Jarri _minuskuletan inportatutako fitxategien izenak"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW garatzailea"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Le_henetsia:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "_Kanpoko argazki-editorea"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Kanpoko _RAW editorea:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Kanpoko editoreak"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Pluginak"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Atzerapena:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Trantsizio-efektua:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Trantsizio-at_zerapena:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Erakutsi _izenburua"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "segundo"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "Hasi _saioa"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Argitaratu jadanik e_xistitzen den album batean:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Sortu album _berri bat izen honekin:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Bideoak eta argazki-album berriak ikusgai _hauentzat:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "A_maitu saioa"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Argitaratu"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Sartu Flickr-en saioa hasi ondoren zure nabigatzailean agertzen den "
+"baieztapen-zenbakia."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Baimen-_zenbakia:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Argazki-_tamaina:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Jadanik _existitzen den album batean:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Album _berri batean, izen honekin:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Zerrendatu albuma galeria publikoan"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Argazki _tamainaren aurrezarpena:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Zure Piwigo argazki-liburutegiaren _URLa"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Erabiltzaile-ize_na"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Pasahitza"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Gogo_ratu pasahitza"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Hasi saioa"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Jadanik _existitzen den kategoria bat:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Argazkiak hurrengoek _ikusiko dituzte:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Argazki-tamaina:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Amaitu saioa"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Bideoaren _pribatutasun-ezarpena:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixel"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' ez da erantzun baliagarria OAuth autentifikazio-eskarietarako"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): ezin da hasi; argitaratzaile hau ezin da "
+"berrabiarazi."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Sartu zure Tumblr kontuaren erabiltzaile-izena eta pasahitza."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Ezin izan da EIa kargatu: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Tumblr-en saioa hasi duzu %s erabiltzailearekin.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Bisitatu Yandex.Fotki webgunea"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Yandex.Fotki-n saioa hasi gabe zaude."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Posta-helbidea"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Tumblr-en saioa hasi duzu (name) izenarekin.\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogak:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumak (edo idatzi berria):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Atzipen-_mota:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Desgaitu _iruzkinak"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Debekatu jatorrizko argazkia deskargatzea"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..1c1f10d
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,4560 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Jiri Grönroos <jiri.gronroos@iki.fi>, 2011-2013
+# Jussa Jutila <ankka69@gmail.com>, 2011
+# Beluga, 2012
+# Triviani <triviani73@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# Ville-Pekka Vainio <vpvainio@iki.fi>, 2011
+# ZupaDupa <kallerainio@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-24 08:00+0000\n"
+"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
+"Language-Team: Finnish (http://www.transifex.com/projects/p/shotwell/"
+"language/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Tapahtuma %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kamerat"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kameran irrottaminen ei onnistu. Yritä irrottaa kamera "
+"tiedostonhallintaohjelman kautta."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Piilota jo tuodut kuvat"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Näytä vai kuvat joita ei ole tuotu"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Käynnistetään tuonti, odota..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Nimet"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Näytä kuvien nimet"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Tuo _valitut"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Tuo valitut kuvat kirjastoon"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Tuo _kaikki"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Tuo kaikki kuvat kirjastoon"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwellin on irrotettava kamera tiedostojärjestelmästä, jotta sitä voidaan "
+"käyttää. Jatketaanko?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Irrota"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Irrota kamera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Toinen ohjelma on lukinnut kameran. Shotwell voi käyttää kameraa vain, jos "
+"sitä ei ole lukittu. Sulje muut kameraa käyttävät ohjelmat ja yritä "
+"uudelleen."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Sulje muut kameraa käyttävät ohjelmat."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Esikatselukuvien noutaminen kamerasta ei onnistu:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Irrotetaan..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Noudetaan kuvan tietoja"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Noudetaan esikatseluversiota kuvasta %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kameraa ei voitu lukita: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Poistetaanko tämä kuva kamerasta?"
+msgstr[1] "Poistetaanko nämä %d kuvaa kamerasta?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Poistetaanko tämä video kamerasta?"
+msgstr[1] "Poistetaanko nämä %d videota kamerasta?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Poistetaanko tämä kuva tai video kamerasta?"
+msgstr[1] "Poistetaanko nämä %d kuvaa tai videota kamerasta?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Poistetaanko nämä tiedostot kamerasta?"
+msgstr[1] "Poistetaanko nämä %d tiedostoa kamerasta?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Säilytä"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Poistetaan kuvia ja videoita kamerasta"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "%d kuvaa tai videota ei voida poistaa kamerasta virheiden vuoksi."
+msgstr[1] "%d kuvaa tai videota ei voida poistaa kamerasta virheiden vuoksi."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diaesitys"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Aloita diaesitys"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Vie kuvia tai videoita"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Vie kuvia/videoita"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Vie kuvat"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Vie kuvia"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Kierretään"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Kumotaan kierto"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Kääntö vaakasuunnassa"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Kumotaan vaakasuuntainen kääntö"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Kääntö pystysuunnassa"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Kumotaan pystysuuntainen kääntö"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Nimi"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tunniste"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Kommentti"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Tapahtuman nimi"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Tiedostonimi"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Mediatyyppi"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Merkinnän tila"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Arvostelu"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Päivämäärä"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "sisältää"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "on tarkalleen"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "alkaa"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "päättyy"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ei sisällä"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ei ole asetettu"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "on"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ei ole"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "mikä tahansa kuva"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "raakavalokuva"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "merkitty"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ei merkitty"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ja ylempi"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "vain"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ja alempi"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "jälkeen"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "ennen"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "on välillä"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ja"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "mikä tahansa"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "kaikki"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ei mikään"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Tallennetut haut"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Uu_si tallennettu haku..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Kuvakirjasto ei ole yhteensopiva tämän Shotwell-version kanssa. Kirjasto "
+"luotiin ilmeisesti Shotwellin versiolla %s (skeema %d). Tämä versio on %s "
+"(skeema %d). Käytä Shotwellin uusinta versiota."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell ei pystynyt päivittämään kuvakirjastoa versiosta %s (skeema %d) "
+"versioon %s (skeema %d). Lisätietoja on Shotwellin wikissä: %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Kuvakirjasto ei ole yhteensopiva tämän Shotwell-version kanssa. Kirjasto "
+"luotiin ilmeisesti Shotwellin versiolla %s (skeema %d). Tämä versio on %s "
+"(skeema %d). Tyhjennä kirjasto poistamalla hakemisto %s ja tuo kuvat "
+"uudelleen."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Tuntematon virhe varmistettaessa Shotwellin tietokantaa: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Ladataan Shotwelliä"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Näytä sovelluksen versio"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[TIEDOSTO]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Komento ”%s --help” näyttää luettelon kaikista komentorivivalitsimista.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Tänään"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Eilen"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Nimi:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Kohteita:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d tapahtuma"
+msgstr[1] "%d tapahtumaa"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d valokuva"
+msgstr[1] "%d valokuvaa"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videota"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Päiväys:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Aika:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Alkaa:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Päättyy:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Koko:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Kesto:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekuntia"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Kehitin:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Valotus:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Sijainti:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Tiedoston koko:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Alkuperäiset mitat:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kameran merkki:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kameran malli:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Salama:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Polttoväli:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Valotuksen korjaus:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS:n leveysaste:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS:n pituusaste:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Tekijä:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Tekijänoikeus:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Ohjelmisto:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Kommentti:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Lisätiedot"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Tämä poistaa tunnisteen ”%s” yhdestä kuvasta. Jatketaanko?"
+msgstr[1] "Tämä poistaa tunnisteen ”%s” %d kuvasta. Jatketaanko?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Peru"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Poista"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "This will remove the saved search \"%s\". Continue?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Vaihda kehitintä"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Vie video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Seuraavaa kuvaa ei voitu viedä tiedostovirheen vuoksi.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Jatketaanko vientiä?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Jatka"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Muokkaamaton"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Nykyinen"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Muoto:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Laatu:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skaalausrajoite:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pikseliä"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Vie metatiedot"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Tallenna tiedot..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Tallenna tiedot"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ja %d muuta)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Tuontitulosten raportti"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Yritettiin tuoda %d tiedosto."
+msgstr[1] "Yritettiin tuoda %d tiedostoa."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Niistä %d tiedosto tuotiin onnistuneesti."
+msgstr[1] "Niistä %d tiedostoa tuotiin onnistuneesti."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Kuvien/videoiden tuomatta jätetyt kaksoiskappaleet:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Kameravirheiden vuoksi tuomatta jääneet kuvat/videot:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "virheviesti:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Tuomatta jääneet tiedostot, koska niitä ei tunnistettu kuviksi tai videoiksi:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Tuomatta jääneet kuvat ja videot, koska ne eivät ole Shotwellin "
+"hallitsemassa tiedostomuodossa:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Tuomatta jätetyt kuvat/videot, koska Shotwell ei voinut kopioida niitä "
+"kirjastoonsa:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Kuvat ja videoita, joita ei tuotu, koska ne ovat rikki:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Muiden syiden vuoksi tuomatta jääneet kuvat ja videot:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Yhtä kuvan kaksoiskappaletta ei tuotu:\n"
+msgstr[1] "%d kuvan kaksoiskappaletta ei tuotu:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Yhtä videon kaksoiskappaletta ei tuotu:\n"
+msgstr[1] "%d videon kaksoiskappaletta ei tuotu:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Yhtä kuvan tai videon kaksoiskappaletta ei tuotu:\n"
+msgstr[1] "%d kuvan tai videon kaksoiskappaletta ei tuotu:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "Yhden kuvan tuonti epäonnistui tiedosto- tai laitevirheen vuoksi:\n"
+msgstr[1] "%d kuvan tuonti epäonnistui tiedosto- tai laitevirheen vuoksi:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Yhden videon tuonti epäonnistui tiedosto- tai laitevirheen vuoksi:\n"
+msgstr[1] "%d videon tuonti epäonnistui tiedosto- tai laitevirheen vuoksi:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Yhden kuvan tai videon tuonti epäonnistui tiedosto- tai laitevirheen "
+"vuoksi:\n"
+msgstr[1] ""
+"%d kuvan tai videon tuonti epäonnistui tiedosto- tai laitevirheen vuoksi:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 tiedoston tuonti epäonnistui tiedosto- tai laitteistovirheen takia:\n"
+msgstr[1] ""
+"%d tiedoston tuonti epäonnistui tiedosto- tai laitteistovirheen takia:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1:n kuvan tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+msgstr[1] ""
+"%d:n kuvan tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1:n videon tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+msgstr[1] ""
+"%d:n videon tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1:n kuvan/videon tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+msgstr[1] ""
+"%d:n kuvan/videon tuominen epäonnistui, koska kuvakirjaston kansioon ei "
+"ollut kirjoitusoikeutta:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1:n tiedoston tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+msgstr[1] ""
+"%d:n tiedoston tuominen epäonnistui, koska kuvakirjaston kansioon ei ollut "
+"kirjoitusoikeutta:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Yhden kuvan tuonti epäonnistui kameravirheen vuoksi:\n"
+msgstr[1] "%d kuvan tuonti epäonnistui kameravirheen vuoksi:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Yhden videon tuonti epäonnistui kameravirheen vuoksi:\n"
+msgstr[1] "%d videon tuonti epäonnistui kameravirheen vuoksi:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Yhden kuvan tai videon tuonti epäonnistui kameravirheen vuoksi:\n"
+msgstr[1] "%d kuvan tai videon tuonti epäonnistui kameravirheen vuoksi:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 tiedoston tuonti epäonnistui kameravirheen takia:\n"
+msgstr[1] "%d tiedoston tuonti epäonnistui kameravirheen takia:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Ohitettiin kuva, jota ei tueta:\n"
+msgstr[1] "Ohitettiin %d kuvaa, joita ei tueta:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Ohitettiin yksi tiedosto, joka ei ollut kuva.\n"
+msgstr[1] "Ohitettiin %d tiedostoa, jotka eivät olleet kuvia.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Ohitettiin yksi kuva, koska käyttäjä perui:\n"
+msgstr[1] "Ohitettiin %d kuvaa, koska käyttäjä perui:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Ohitettiin yksi video, koska käyttäjä perui:\n"
+msgstr[1] "Ohitettiin %d videota, koska käyttäjä perui:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Ohitettiin yksi kuva tai video, koska käyttäjä perui:\n"
+msgstr[1] "Ohitettiin %d kuvaa tai videota, koska käyttäjä perui:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 tiedosto ohitettu käyttäjän peruttua:\n"
+msgstr[1] "%d tiedostoa ohitettu käyttäjän peruttua:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Yhden kuvan tuonti onnistui.\n"
+msgstr[1] "%d kuvan tuonti onnistui.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Yhden videon tuonti onnistui.\n"
+msgstr[1] "%d videon tuonti onnistui.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Yhden kuvan tai videon tuonti onnistui.\n"
+msgstr[1] "%d kuvan tai videon tuonti onnistui.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Yhtään kuvaa tai videota ei tuotu.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Tuonti on valmis"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunti"
+msgstr[1] "%d sekuntia"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuutti"
+msgstr[1] "%d minuuttia"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d tunti"
+msgstr[1] "%d tuntia"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 päivä"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Nimeä tapahtuma uudelleen"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nimi:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Muokkaa nimeä"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Muokkaa tapahtuman kommenttia"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Muokkaa kuvan tai videon kommenttia"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Siirrä tiedosto roskakoriin"
+msgstr[1] "_Siirtä tiedostot roskakoriin"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Poista pelkästään kirjastosta"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Kumotaanko ulkoinen muokkaus?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Kumotaanko ulkoiset muokkaukset?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Tämä tuhoaa kaikki ulkoiseen tiedostoon tehdyt muutokset. Haluatko jatkaa?"
+msgstr[1] ""
+"Tämä tuhoaa kaikki %d ulkoiseen tiedostoon tehdyt muutokset. Haluatko jatkaa?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Kumoa ulkoiset muokkaukset"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Kumoa ulkoiset muokkaukset"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Tämä poistaa kuvan kirjastosta. Jatketaanko?"
+msgstr[1] "Tämä poistaa %d kuvaa kirjastosta. Jatketaanko?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Poista"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Poista kuvia kirjastosta"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Poista kuvat kirjastosta"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 h"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Siirrä kuvia ja videoita saman verran"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "_Aseta kaikki kuvat ja videot valittuun aikaan"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "M_uokkaa alkuperäistä kuvatiedostoa"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "M_uokkaa alkuperäisiä kuvatiedostoja"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Muokkaa alkuperäisiä tiedostoja"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Muokkaa alkuperäisiä tiedostoja"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Alkuperäinen: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %H.%M.%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %I.%M.%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ottoaikaa siirretään eteenpäin\n"
+"%d %s, %d %s, %d %s, ja %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ottoaikaa siirretään taaksepäin\n"
+"%d %s, %d %s, %d %s, ja %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "päivä"
+msgstr[1] "päivää"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "tunti"
+msgstr[1] "tuntia"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuutti"
+msgstr[1] "minuuttia"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekunti"
+msgstr[1] "sekuntia"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"ja %d muu."
+msgstr[1] ""
+"\n"
+"\n"
+"ja %d muuta."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Tunnisteet (pilkulla erotettuna):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Tervetuloa!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Tervetuloa Shotwelliin!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Kuvia voi tuoda millä tahansa näistä tavoista:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Valitse <span weight=\"bold\">Tiedosto %s Tuo kansiosta</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Vedä ja pudota kuvia Shotwellin ikkunaan"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Tuo kuvia tietokoneeseen liitetystä kamerasta"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Tuo kuvia %s-hakemistosta"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Kuvia voi tuoda myös millä tahansa näistä tavoista:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Älä näytä tätä viestiä uudestaan"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Tuo kuvasi %s-kirjastostasi"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Ohje)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Vuosi%sKuukausi%sPäivä"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Vuosi%sKuukausi"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Vuosi%sKuukausi-Päivä"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Vuosi-Kuukausi-Päivä"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Oma koko"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Virheellinen kaava"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell voi kopioida kuvat kirjastokansioon tai tuoda ne ilman kopiointia."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Kopioi kuvat"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Tuo vanhasta sijainnista"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Tuo kirjastoon"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Poista kirjastosta"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Poistetaan kuvia kirjastosta"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Poistetaan kuvia kirjastosta"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tämä poistaa kuvan tai videon Shotwellin kirjastosta. Haluatko myös siirtää "
+"tiedoston työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+msgstr[1] ""
+"Tämä poistaa %d kuvaa tai videota Shotwellin kirjastosta. Haluatko myös "
+"siirtää tiedostot työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tämä poistaa videon Shotwellin kirjastosta. Haluatko myös siirtää tiedoston "
+"työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+msgstr[1] ""
+"Tämä poistaa %d videota Shotwellin kirjastosta. Haluatko myös siirtää "
+"tiedostot työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Tämä poistaa kuvan Shotwellin kirjastosta. Haluatko myös siirtää kuvan "
+"työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+msgstr[1] ""
+"Tämä poistaa %d kuvaa Shotwellin kirjastosta. Haluatko myös siirtää kuvan "
+"työpöydän roskakoriin?\n"
+"\n"
+"Tätä toimintoa ei voi perua."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Kuvaa tai videota ei voi siirtää työpöydän roskakoriin. Poistetaanko tämä "
+"tiedosto?"
+msgstr[1] ""
+"%d kuvaa tai videota ei voi siirtää työpöydän roskakoriin. Poistetaanko nämä "
+"tiedostot?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Kuvaa tai videota ei voi poistaa."
+msgstr[1] "%d kuvaa tai videota ei voi poistaa."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Kansiot"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Tunnisteet"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Onnistui"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Tiedostovirhe"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Tiedostoa ei voida purkaa"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Tietokantavirhe"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Käyttäjä keskeytti tuonnin"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ei ole tiedosto"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Tämä tiedosto on jo tietokannassa"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Tiedostomuotoa ei tueta"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Tiedosto ei ole kuvatiedosto"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Levyongelma"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Levy on täynnä"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kameravirhe"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Tiedoston kirjoitusvirhe"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Rikkinäinen kuvatiedosto"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Tuonti epäonnistui (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "muokattu"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Edellinen kuva"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Seuraava kuva"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Kuvan lähdetiedosto puuttuu: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Näytä"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "T_yökalut"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Edellinen kuva"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Edellinen kuva"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Seuraava kuva"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Seuraava kuva"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Lähennä"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Kasvata kuvan suurennusta"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Loitonna"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Vähennä kuvan suurennusta"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Sovita _sivulle"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoomaa kuvaa niin, että se mahtuu sivulle"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoomaus _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Käytä 100 %% zoomausta"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoomaus _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Käytä 200 %% zoomausta"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Kehitin"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Tiedostoa %s ei voitu viedä: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s-tietokanta"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Tuontia kohteesta %s ei voi jatkaa virheen vuoksi:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Yritä tuoda jostain toisesta palvelusta. Valitse jokin yllä olevasta "
+"valikosta."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Tietokantatiedosto:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Tuo"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Tuo sovelluksesta"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Tuo media _kohteesta:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Sulje"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Asetukset"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diaesitys"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Takaisin"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Siirry edelliseen kuvaan"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Tauko"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Laita diaesitys tauolle"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Seuraava"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Siirry seuraavaan kuvaan"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Muuta diaesityksen asetuksia"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Kaikki kuvien lähdetiedostot puuttuvat."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Toista"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Jatka diaesitystä"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Palautetaan"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Kumotaan palautus"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Parannetaan"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Kumotaan parannus"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Toteutetaan värimuutoksia"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Kumotaan värimuutoksia"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Luodaan uusi tapahtuma"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Poistetaan tapahtuma"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Siirretään kuvia uuteen tapahtumaan"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Asetetaan kuvia edelliseen tapahtumaan"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Yhdistetään"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Kumotaan yhdistäminen"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Tehdään kuvista kopioita"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Poistetaan kuvien kopiot"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Yhdestä kuvasta ei voitu tehdä kopiota tiedostovirheen vuoksi"
+msgstr[1] "%d kuvasta ei voitu tehdä kopiota tiedostovirheen vuoksi"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Palautetaan edellinen arvostelu"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Korotetaan arvostelua"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Lasketaan arvostelua"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Aseta kehitin"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Alkuperäistä kuvaa ei voitu säätää."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Muutetaan päiväys ja kellonaika"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Kumotaan päiväyksen ja kellonajan muutokset"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Yhtä alkuperäistä kuvaa ei voitu säätää."
+msgstr[1] "Seuraavia alkuperäisiä kuvia ei voitu säätää."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Virhe muutettaessa aikaa"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Seuraavan tiedoston aikamuutoksia ei voitu kumota."
+msgstr[1] "Seuraavien tiedostojen aikamuutoksia ei voitu kumota."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Luo tunniste"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Siirrä tunniste \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Siirrä kuvat roskakoriin"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Palauta kuvat roskakorista"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Siirrä kuvat Shotwellin roskakoriin"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Palauta kuvat takaisin Shotwellin kirjastoon"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Siirretään kuvia roskakoriin"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Palautetaan kuvia roskakorista"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Merkitse valitut kuvat"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Poista merkintä valituista kuvista"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Merkitse"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Poista merkintä"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Matala (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Keskitasoinen (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Korkea (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Suurin (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Ei kuvia/videoita"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Kuvia tai videoita ei löytynyt"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Tähän hakemistoon ei voi viedä kuvia."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Täytä koko sivu"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 kuvaa sivulla"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 kuvaa sivulla"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 kuvaa sivulla"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 kuvaa sivulla"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 kuvaa sivulla"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 kuvaa sivulla"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "tuumaa"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Lompakkokoko (2 x 3 tuumaa)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Muistivihkokoko (3 x 5 tuumaa)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 tuumaa"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 tuumaa"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 tuumaa"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 tuumaa"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 tuumaa"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrinen lompakkokoko (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postikortti (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Kuvan asetukset"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Tulostetaan..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Kuvaa ei voi tulostaa:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Kuvatietokantaa %s ei voida avata tai luoda: virhekoodi %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Kuvatietokantatiedostoon kirjoitus epäonnistui:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Virhe yrittäessä käyttää tietokantatiedostoa:\n"
+" %s\n"
+"\n"
+"Virhe: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Vie videoita"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautiluksen Lähetä kohteeseen -laajennosta ei voida käynnistää: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Lähetä"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Taustakuvaa ei voitu viedä kohteeseen %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Työpöydän diaesitystä ei voida valmistella: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Merkitty"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Roskakori"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Roskakori on tyhjä"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Poista"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "poistetaan kuvia"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Puutuvia tiedostoja"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Poistetaan..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Edellinen tuonti"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Tuo kansiosta..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Tuo kuvia levyltä kirjastoon"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Tuo so_velluksesta..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Järjestä _tapahtumat"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Tyhjennä _roskakori"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Poista kaikki kuvat roskakorista"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Näytä kuvan _tapahtuma"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Etsi"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Löydä kuvia ja videoita hakuehdoilla"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Tiedosto"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Muokkaa"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Kuva"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Kuvat"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Tapahtumat"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Tunnisteet"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Ohje"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Perustiedot"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Näytä perustiedot valinnasta"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Lisätiedot"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Näytä lisätiedot valinnasta"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Hakupalkki"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Näytä hakupalkki"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "S_ivupalkki"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Näytä sivupalkki"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Nousevasti"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Järjestä kuvat nousevaan järjestykseen"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Laskevasti"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Järjestä kuvat laskevaan järjestykseen"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Tuo kansiosta"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Tyhjennä roskakori"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Tyhjennetään roskakori..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell on asetettu tuomaan kuvia kotihakemistostasi.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Kirjaston sijainti"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Tästä hakemistosta ei voi tuoda kuvia."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d %%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Päivitetään kirjastoa..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Valmistellaan kuvien automaattista tuontia..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Tuodaan kuvia automaattisesti..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Kirjoitetaan metadataa tiedostoihin..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Kirjasto"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Tuodaan..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Keskeytä tuonti"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Keskeytä kuvien tuonti"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Valmistellaan tuontia..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Tuotiin %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Tallenna"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Tallenna kuva"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Tallenna _nimellä..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Tallenna kuva toisella nimellä"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Tulosta kuva tietokoneeseen liitetyllä tulostimella"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ei ole olemassa."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ei ole tiedosto."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s ei tue tiedoston %s tiedostomuotoa."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Tallenna kopio"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Hävitetäänkö tiedostoon %s tehdyt muutokset?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Sulje _tallentamatta"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Virhe tallennettaessa tiedostoon %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Tallenna nimellä"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kohdetta %s ei voida seurata, koska se ei ole hakemisto (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Valokuvien hallinta"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Valokuvien katselin"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Tekijänoikeus 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Kierrä _oikealle"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Kierrä"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Kierrä oikealle"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Kierrä kuvia oikealle (paina Ctrl kuvien kiertämiseksi vasemmalle)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Kierrä _vasemmalle"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Kierrä vasemmalle"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Kierrä kuvia vasemmalle"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Kääntö _vaakasuunnassa"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Kääntö vaakasuunnassa"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Kääntö _pystysuunnassa"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Kääntö pystysuunnassa"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Paranna"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Paranna"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Paranna kuvaa automaattisesti"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Kopioi värisäädöt"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Kopioi värisäädöt"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Kopioi kuvaan toteutetut värisäädöt"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Liitä värisäädöt"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Liitä värisäädöt"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Toteuta kopioidut värisäädöt valittuun kuvaan"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Rajaa"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Rajaa"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Rajaa kuvan kokoa"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Suorista"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Suorista"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Suorista kuva"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Punasilmäisyys"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Punasilmäisyys"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Vähennä tai poista punasilmäisyyttä kuvasta"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Säädä"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Säädä"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Säädä kuvan värejä ja kirkkautta"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Palauta alkuperäinen"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Palauta alkuperäinen"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Kumoa ulkoiset _muokkaukset"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Palauta pääkuva"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Aseta _työpöydän taustakuvaksi"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Aseta valittu kuva uudeksi työpöydän taustakuvaksi"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Aseta _työpöydän diaesitykseksi..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Kumoa"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Kumoa"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Tee uudelleen"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Tee uudelleen"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Nimeä tapahtuma uudelleen..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Aseta tapahtuman _pienoiskuvaksi"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Aseta tapahtuman pienoiskuvaksi"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Uusi tapahtuma"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Uusi tapahtuma"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Siirrä kuvia"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Siirrä kuvia tapahtumaan"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Yhdistä tapahtumat"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Yhdistä"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Yhdistä tapahtumat yhdeksi tapahtumaksi"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Aseta arvostelu"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Aseta arvostelu"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Muuta kuvan arvostelua"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Korota"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Korota arvostelua"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Laske"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Laske arvostelua"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Ei arvostelua"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Jätä arvostelematta"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Asetetaan arvostelemattomaksi"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Poista kaikki arvostelut"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Hylätty"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Arvostele hylätyksi"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Asetetaan hylätyksi"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Aseta arvostelu hylätyksi"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Vain hylätyt"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Vain hylätyt"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Näytä vain hylätyt kuvat"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Kaikki + _Hylätyt"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Näytä kaikki kuvat, myös hylätyt"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Kaikki kuvat"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Näytä kaikki kuvat"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Arvostelut"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Näytä kuvien arvostelut"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Suodata kuvia"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Suodata kuvia"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Rajaa näytettävien kuvien määriä suodattimella"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Kopioi"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Kopioi"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Tee tästä valokuvasta kopio"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Vie..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Tulosta..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Julkaise..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Julkaise"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Julkaise eri verkkosivuille"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Muokkaa _nimeä..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Muokkaa ko_mmenttia..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Muokkaa kommenttia"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Muokkaa tapahtuman _kommenttia..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Muuta päiväystä ja kellonaikaa..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Muuta päiväystä ja kellonaikaa..."
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Lisää _tunnisteita..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Lisää tunnisteita..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Lisää tunnisteita"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Asetukset"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Avaa ulkoisella _muokkaimella"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Avaa _RAW-muokkaimessa"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Lähetä _kohteeseen..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "L_ähetä..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Etsi..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Etsi"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Etsi kuva kirjoittamalla sen nimessä tai tunnisteissa esiintyvää tekstiä"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Merkitse"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Poista _merkintä"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Muokkaimen käynnistäminen ei onnistu: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Lisää tunniste ”%s”"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Lisää tunnisteet ”%s” ja ”%s”"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Poista tunniste ”%s”"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Poista tunniste ”%s”"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Poista tunniste"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Uusi"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Nimeä tunniste ”%s” uudelleen..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Nimeä tunniste ”%s” uudelleen nimelle ”%s”"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Ni_meä uudelleen..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Muokkaa tunnisteita..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Muokkaa tunnisteita"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Aseta kuville tunniste ”%s”"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Aseta valituille kuville tunniste ”%s”"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Lisää valittuihin kuviin tunniste \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Poista _kuvista tunniste ”%s”"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Poista tunniste \"%s\" k_uvista"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Poista kuvista tunniste ”%s”"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Poista tunniste \"%s\" kuvista"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Tunnisteelle ei voida antaa nimeä ”%s”, koska sillä nimellä on jo olemassa "
+"tunniste."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Haun nimen muuttaminen muotoon \"%s\" epäonnistui, koska saman niminen haku "
+"on jo olemassa."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Tallennettu haku"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Poista haku"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Muokkaa..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Nimeä uudelleen..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Muuta haun \"%s\" nimi muotoon \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Poista haku \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Arvostele %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Aseta arvostelu %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Asetetaan arvostelu %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Näytä %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Näytä vain kuvat, joilla on arvostelu %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s tai parempi"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Näytä %s tai parempi"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Näytä vain kuvat, joilla on arvostelu %s tai parempi"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Poista valitut kuvat roskakorista"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Poista valitut kuvat kirjastosta"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Palauta"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Siirrä valitut kuvat takaisin kirjastoon"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Avaa _tiedostonhallintaohjelmalla"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Avaa valitun valokuvan sisältävä hakemisto tiedostonhallinnassa"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Tiedostonhallinnan avaaminen ei onnistu: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Poista kirjastosta"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Siirrä roskakoriin"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Valitse _kaikki"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Valitse kaikki"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Kulma:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Palauta alkuperäiset arvot"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Palaa kuvan nykyisiin mittoihin"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Aseta kuvan rajaus"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Käännä rajauskulmiota pysty- ja vaakasuunnan välillä"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Rajoittamaton"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Neliö"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Näyttö"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Alkuperäinen koko"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Standardipiirto (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Teräväpiirto (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Kirje (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloidi (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Sulje punasilmäisyyden korjaustyökalu"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Poista punasilmäisyyttä valitulta alueelta"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Värikylläisyys:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Värisävy:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Lämpötila:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Varjot:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Palauta alkuperäiset värit "
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Palauta kaikkien värisäätöjen alkuperäiset arvot"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Lämpötila"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Värisävy"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Värikylläisyys"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Valotus"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Varjot"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastin laajennus"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Kiinnitä työkalurivi"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Kiinnitä työkalurivi auki"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Poistu koko näytön tilasta"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Poistu _koko näytön tilasta"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Lopeta"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Tietoja"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Koko näyttö"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Sisältö"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Usein kysytyt kysymykset"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Ilmoita ongelmasta..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Tapahtui vakava virhe yritettäessä käyttää Shotwellin kirjastoa. Shotwell ei "
+"voi jatkaa.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Vieraile Yorban verkkosivuilla"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Suomentajat"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Ohjeiden näyttäminen ei onnistu: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Usein kysyttyjen kysymysten näyttäminen epäonnistui: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "nimetön"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Alkuperäinen koko"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Leveys tai korkeus"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Leveys"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Korkeus"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Säädä pienoiskuvien kokoa"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Kasvata pienoiskuvien suurennusta"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Vähennä pienoiskuvien suurennusta"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Järjestä _kuvat"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Toi_sta video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Avaa valitut videot järjestelmän videosoittimessa"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Kommentit"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Näytä kommentit joka kuvassa"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Näytä kuvien tunnisteet"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_Nimen mukaan"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Järjestä kuvat nimen mukaan"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "_Ottopäivän mukaan"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Järjestä kuvat ottopäivän mukaan"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "_Arvostelun mukaan"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Järjestä kuvat arvostelun mukaan"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell ei voinut soittaa valittua videota:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d kuvaa/videota"
+msgstr[1] "%d kuva/video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Näytä jokaisen tapahtuman kommentti"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Ei tapahtumia"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Tapahtumia ei löytynyt"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Tapahtumat"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Ei päiväystä"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ei tapahtumaa"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Tietohakemiston %s luominen epäonnistui: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Kuvat"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Tilapäishakemiston %s luominen epäonnistui: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Tietoalihakemiston %s luominen epäonnistui: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ei mitään)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ei mitään"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Satunnainen"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Diaesityksen siirtymät"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Tilapäistiedoston luominen kohteelle %s epäonnistui: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Viedään"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Tiedosto %s on jo olemassa. Korvataanko?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Ohita"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Korvaa"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Korvaa k_aikki"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Vie"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Kuvat"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videot"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-kuvat"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-kuvat"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Virhe ladatessa käyttöliittymätiedostoa %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tyyppi"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Julkaisu"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Valittujen kuvien tai videoiden julkaisu onnistui."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Valittujen videoiden julkaisu onnistui."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Valittujen kuvien julkaisu onnistui."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Valittu video julkaistiin onnistuneesti."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Valittu kuva julkaistiin onnistuneesti."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Noudetaan tilin tietoja..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Kirjaudutaan..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Julkaise valokuvia"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Julkaise valokuvia _palveluun:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Julkaise videoita"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Julkaise videoita _palveluun"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Julkaise kuvia ja videoita"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Julkaise kuvia ja videoita _palveluun"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Julkaisu ei onnistunut"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Valmistellaan lähettämistä"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Lähetetään %d/%d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Julkaisemista palveluun %s ei voida jatkaa virheen vuoksi:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Kokeile julkaisemista toiseen palveluun, jonka voi valita yllä olevasta "
+"valikosta."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Uusi _tunniste..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Julkaisemisessa tarvittavaa väliaikaista tiedostoa ei löydy"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Olet jo kirjautunut sisään ja ulos Google-palveluista tällä kertaa "
+"Shotwelliä käyttäessäsi.\n"
+"\n"
+"Jatka julkaisua Google-palveluihin käynnistämällä Shotwell uudelleen."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Et ole kirjautuneena YouTubeen.\n"
+"\n"
+"Jotta yhdistämistä voidaan jatkaa, sinulla täytyy olla Google-tili, joka on "
+"asetettu toimimaan YouTuben kanssa. Useimpien tilien asetukset voi tehdä "
+"kirjautumalla selaimella YouTube-sivustolle ainakin kerran."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Julkaisuun vaadittava tiedosto ei ole käytettävissä. Julkaisua Youtubeen ei "
+"voi jatkaa."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Olet kirjautunut YouTubeen käyttäjänä %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videot ilmestyvät sijaintiin '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Julkinen, luetteloitu"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Julkinen, luettelematon"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Yksityinen"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Keskeiset julkaisupalvelut"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Olet jo kirjautunut Flickriin ja sieltä ulos tämän Shotwell-käyttökerran "
+"aikana.\n"
+"Käynnistä Shotwell uudelleen ja yritä sitten kuvien lähettämistä uudelleen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Valmistaudutaan kirjautumiseen..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Julkaisuun vaadittava tiedosto ei ole käytettävissä. Julkaisua Flickriin ei "
+"voi jatkaa."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Vahvistetaan valtuutusta..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Olet kirjautunut Flickriin käyttäjänä %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ilmaisessa Flickr-tilissä on kuukausittainen rajoitus datan lähetykselle.\n"
+"Tässä kuussa voit vielä lähettää %d megatavua."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Flickr Pro -tili sallii kuvien lähettämisen ilman rajoituksia."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Kuvat _näkyvät:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videot _näkyvät:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Kuvat ja videot _näkyvät:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Kaikille"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Vain kavereille ja perheelle"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Vain perhe"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Vain kaverit"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Vain minulle"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pikseliä"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pikseliä"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pikseliä"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pikseliä"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Luodaan albumia %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigoon julkaistaessa ilmeni virheviesti. Yritä uudelleen."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Määritä Piwigo-kuvakirjastosi verkko-osoite, käyttäjätunnus ja salasana."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell ei voi yhdistää Piwigo-kuvakirjastoosi. Varmista, että "
+"kirjoittamasi verkko-osoite on oikein"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Käyttäjätunnus ja/tai salasana on virheellinen. Yritä uudelleen."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Virheellinen verkko-osoite"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Virheellinen käyttäjätunnus tai salasana"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell-yhdistäjä"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Ylläpitäjät, perhe, kaverit, yhteystiedot"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Ylläpitäjät, perhe, kaverit"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Ylläpitäjät, perhe"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Ylläpitäjät"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Julkaisuun vaadittava tiedosto ei ole käytettävissä. Julkaisua Picasaan ei "
+"voi jatkaa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Luodaan albumia..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Olet kirjautuneena Picasa-verkkoalbumeihin nimellä %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videot ilmestyvät sijaintiin:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Kuvat menevät:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pieni (640 x 480 pikseliä)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Keskikoko (1024 x 768 pikseliä)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Suositeltu (1600 x 1200 pikseliä)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pikseliä)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Et ole kirjautuneena Facebookiin.\n"
+"\n"
+"Jos sinulla ei ole Facebook-tiliä, voit luoda sellaisen ennen kirjautumista. "
+"Kirjautumisen aikana Shotwellin yhdistäjä saattaa kysyä lupaa kuvien "
+"lataamiseen ja Facebook-syötteessä julkaisemiseen. Nämä luvat on annettava, "
+"jotta yhdistäjä toimii."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Olet jo kirjautunut Facebookiin ja sieltä ulos tämän Shotwell-käyttökerran "
+"aikana.\n"
+"Käynnistä Shotwell uudelleen ja yritä sitten kuvien lähettämistä uudelleen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standardi (720 pikseliä)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Suuri (2048 pikseliä)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Kokeillaan Facebook-yhteyttä..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Julkaisuun vaadittava tiedosto ei ole käytettävissä. Julkaisua Facebookiin "
+"ei voi jatkaa."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Olet kirjautunut Facebookiin käyttäjänä %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Minne haluat julkaista valitut kuvat?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Lähetyksen koko:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Kaverit"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Mureneminen"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Shakki"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Ympyrät"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Viivat"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Kello"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Ympyrä"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Keskeiset diaesityssiirtymät"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"Tekijänoikeus 2010 Maxim Kartashev, tekijänoikeus 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Liu'utus"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Häivytys"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Neliöt"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Tervetuloa F-Spot-kirjaston tuontipalveluun.\n"
+"\n"
+"Valitse F-Spot-tietokantatiedosto."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Valitse itse tuotava F-Spot-tietokantatiedosto:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Valitun F-Spot-tietokantatiedoston avaus epäonnistui: tiedostoa ei ole "
+"olemassa tai se ei ole F-Spot-tietokanta"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Valitun F-Spot-tietokantatiedoston avaus epäonnistui: Shotwell ei tue F-Spot-"
+"tietokannan versiota"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Valitun F-Spot-tietokantatiedoston luku ei onnistu: virhe luettaessa "
+"tunnistetaulua"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Valitun F-Spot-tietokantatiedoston luku ei onnistu: virhe luettaessa "
+"kuvataulua"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot-kirjasto: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Valmistaudutaan tuontiin"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Aseta työpöydän diaesitykseksi"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Luo työpöydän taustakuvan diaesitys"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Näytä jokaista kuvaa"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ajan"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Kuinka kauan tiettyä kuvaa näytetään työpöydän taustakuvana"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Etsi"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Haun nimi"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "seuraavista:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Tulostetun kuvan koko</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Käytä _standardikokoa:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Käytä _omaa kokoa:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Vastaa kuvan kuvasuhdetta"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automaattinen koko:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Nimet</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Tulosta kuvan _nimi"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pikselitarkkuus</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Tulosta kuva muodossa:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pikseliä tuumalla"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "nimike"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwellin asetukset"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "valkoinen"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "musta"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Tarkkaile kirjastoa uusien tiedostojen varalta"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metatiedot"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Kirjoita tunnisteet, nimet ja muut _metatiedot kuvatiedostoihin"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Näyttö"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Tuo kuvia:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Taustakuva:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Tuonti"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Kansiorakenne:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "Kaa_va:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Esimerkki:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Ni_meä tuodut tiedostot uudelleen käyttäen pieniä kirjaimia"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-kehitin"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Oletus:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "_Ulkoinen kuvamuokkain:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Ulkoinen _RAW-muokkain:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Ulkoiset muokkaimet"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Liitännäiset"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Viive"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Siirtymän tehoste:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Siirt_ymän viive:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "N_äytä nimi"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekuntia"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Kirjaudu"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Julkaise _olemassa olevassa albumissa:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Luo _uusi albumi nimeltä:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videot ja uudet kuva-albumit _näkyvät:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Poista sijainti- ja kameratiedot sekä muut yksilöivät tiedot ennen lähetystä"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Kirjaudu ulos"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Julkaise"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Anna Flickriin kirjauduttasi verkkoselaimessasi näkyvä valtuutusnumero."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Valtuutus_numero:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Olet kirjautuneena Flickriin nimellä (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Kuvan kok_o:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'olet kirjautunut tunnuksella $name'\n"
+"(populated in the application code)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Olemassa olevaan albumiin:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Uuteen albumiin nimeltä:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Näytä albumi julkisessa galleriassa"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Kuvan _koon esiasetus:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Piwigo-kuvakirjastosi _verkko-osoite"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Käyttäjätunnus"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Salasana"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Muista salasana"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Kirjaudu sisään"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Olemassa oleva kategoria:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "_Valokuvat näkyvät:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Kuvan koko:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Albumin kommentti:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Jos nimi on asetettu ja kommentti asettamatta, käytä nimeä kommenttina"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "_Älä lähetä tunnisteita"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Kirjaudu ulos"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Videoiden _yksityisyysasetukset:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Tekijänoikeus 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pikseliä"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' ei ole kelvollinen vastaus OAuth-tunnistautumispyyntöön"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): käynnistys epäonnistui; tätä julkaisijaa ei voi "
+"käynnistää uudelleen."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Anna Tumblr-tilisi käyttäjätunnus ja salasana."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Käyttöliittymän lataus epäonnistui: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Olet kirjautuneena Tumblriin käyttäjänä %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Tekijänoikeus 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Vieraile palvelun Yandex.Fotki verkkosivustolla"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Et ole kirjautuneena palveluun Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Sähköpostiosoite"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Olet kirjautuneena Tumblriin nimellä (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogit:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumit (tai kirjoita uusi):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Pääsy_tyyppi:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "_Poista kommentit käytöstä"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Kiellä _alkuperäisen kuvan lataus"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..903be80
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,4755 @@
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2014 Yorba Foundation
+# See COPYING for license.
+#
+# Translators:
+# Alexandre Franke <alexandre.franke@gmail.com>, 2011
+# ttoine <ttoine@ttoine.net>, 2013
+# Claude Paroz <claude@2xlibre.net>, 2011-2012
+# hellsdark <hellsdark@gmail.com>, 2013
+# esunyer <emmanuel.sunyer@gmail.com>, 2012
+# fbourigault <fabien@bourigault.fr>, 2013
+# hellpe <hell_pe@no-log.org>, 2013
+# MathieuMD <mathieu.md@gmail.com>, 2011
+# Pierre Slamich <pierre.slamich@gmail.com>, 2012
+# raphaelh <raphael.huck@gmail.com>, 2011
+# roumano <roumano@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# woprandi <william.oprandi@gmail.com>, 2013
+# Clarence Snickers <clarencesnickers@gmail.com>, 2012
+# esunyer <emmanuel.sunyer@gmail.com>, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+# raphaelh <raphael.huck@gmail.com>, 2011
+# roumano <roumano@gmail.com>, 2011
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-02-05 00:58+0000\n"
+"PO-Revision-Date: 2014-02-25 10:47+0100\n"
+"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Un fichier temporaire nécessaire pour la publication n'est pas disponible"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Vous vous êtes déjà connecté et déconnecté d'un service Google durant cette "
+"session Shotwell.\n"
+"\n"
+"Pour continuer à publier vers les services Google, quittez et redémarrez "
+"Shotwell, puis essayez à nouveau de publier."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Visitez le site Web de Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Gabriel Bousquet <gbousque@clipper.ens.fr>\n"
+"Alexandre Franke <alexandre.franke@gmail.com>\n"
+"Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
+"Claude Paroz <claude@2xlibre.net>\n"
+"Emmanuel Sunyer <emmanuel.sunyer@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2009-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Bienvenue dans le service d'importation de photothèques F-Spot.\n"
+"\n"
+"Veuillez sélectionner une photothèque à importer, soit en sélectionnant "
+"une parmi celles trouvées par Shotwell, soit en sélectionnant un autre "
+"fichier de base de données F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Bienvenue dans le service d'importation de photothèques F-Spot.\n"
+"\n"
+"Veuillez sélectionner un fichier de base de données F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+"Sélectionnez manuellement un fichier de base de données F-Spot à importer :"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Impossible d'ouvrir le fichier de base de données F-Spot sélectionné : le "
+"fichier n'existe pas ou n'est pas une base de données F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Impossible d'ouvrir le fichier de base de données F-Spot sélectionné : cette "
+"version de base de données F-Spot n'est pas prise en charge par Shotwell"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Impossible d'ouvrir le fichier de base de données F-Spot sélectionné : "
+"erreur lors de la lecture de la table des étiquettes"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Impossible d'ouvrir le fichier de base de données F-Spot sélectionné : "
+"erreur lors de la lecture de la table des photos"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell a trouvé %d photos dans la photothèque F-Spot et est en train de "
+"les importer. Les doublons seront automatiquement détectés et supprimés.\n"
+"\n"
+"Vous pouvez fermer cette fenêtre et commencer à utiliser Shotwell pendant "
+"que l'importation se poursuit en tâche de fond."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Photothèque F-Spot : %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Importation en préparation"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Services de base d'importation de données"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"« %s » n'est pas une réponse valide à une demande d'authentification OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): impossible de démarrer ; cette publication n'est "
+"pas redémarrable."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Saisissez le nom d'utilisateur et le mot de passe de votre compte Tumblr."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "Identifiant et/ou mot de passe non valide. Veuillez réessayer."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Le nom d'utilisateur ou le mot de passe n'est pas valide."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Impossible de charger l'IHM : %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Vous êtes connecté à Tumblr comme %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visitez le site Web Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Vous n'êtes actuellement pas connecté à Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Services annexes de publication Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "étiquette"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "Adresse él_ectronique"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Mot de passe"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Connexion"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogs :"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "_Taille de la photo :"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "Se _déconnecter"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Publier"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Albums (ou créer un nouveau) :"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "_Type d'accès :"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Désactiver les _commentaires"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Interdire le téléchargement de la photo originale"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Public"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amis"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privées"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Vous n'êtes actuellement pas connecté sur Facebook.\n"
+"\n"
+"Si vous n'avez pas encore de compte Facebook, vous pouvez en créer un durant "
+"le processus de connexion. Lors de la connexion, Shotwell Connect pourrait "
+"vous demander la permission d'envoyer des photos et de les publier sur votre "
+"flux de diffusion. Ces permissions sont nécessaires pour que Shotwell "
+"Connect fonctionne correctement."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Vous vous êtes déjà connecté et déconnecté de Facebook durant cette session "
+"de Shotwell.\n"
+"Pour continuer à publier sur Facebook, quittez et redémarrez Shotwell, puis "
+"essayez de publier à nouveau."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Grand (2048 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Test de la connexion avec Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Création d'un album..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Un fichier requis pour la publication est indisponible. Impossible de "
+"continuer la publication vers Facebook"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Vous êtes connecté sur Facebook en tant que %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Où voulez-vous publier les photos sélectionnées ?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "_Taille d'envoi :"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Seulement moi"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Tout le monde"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Vous n'êtes actuellement pas connecté à Flickr.\n"
+"\n"
+"Cliquez sur « Se connecter » pour lancer la connexion dans votre navigateur "
+"Web. Vous devrez autoriser Shotwell Connect à se lier à votre compte Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Vous vous êtes déjà connecté et déconnecté de Flickr durant cette session de "
+"Shotwell.\n"
+"Pour continuer à publier sur Flickr, quittez et redémarrez Shotwell, puis "
+"essayez de publier à nouveau."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Préparation de la connexion…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Un fichier requis pour la publication est indisponible. Impossible de "
+"continuer la publication vers Flickr"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Vérification de l'autorisation…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Vous êtes connecté sur Flickr en tant que %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Votre compte Flickr gratuit limite la quantité de données que vous pouvez "
+"envoyer par mois.\n"
+"Ce mois-ci, vous pouvez encore envoyer %d mégaoctets avant d'atteindre votre "
+"quota."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"Votre compte Fickr Pro vous donne droit d'envoyer autant de photos que vous "
+"le voulez."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Photos _visibles pour :"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Vidéos _visibles pour :"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Photos et vidéos _visibles pour :"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Seulement les amis et la famille"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Uniquement la famille"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Uniquement les amis"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Taille originale"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Vous n'êtes actuellement pas connecté à Picasa Web Albums.\n"
+"\n"
+"Cliquez sur « Se connecter » pour vous connecter à Picasa Web Albums avec votre "
+"navigateur. Vous devrez autoriser Shotwell Connect à communiquer avec votre "
+"compte Picasa Web Albums"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Un fichier requis pour la publication est indisponible. Impossible de "
+"continuer la publication vers Picasa."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Vous êtes connecté sur Picasa Web Albums en tant que %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Les vidéos apparaîtront dans :"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Les photos apparaîtront dans :"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Petit (640 x 480 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Moyen (1024x 768 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recommandé (1600 x 1200 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Taille originale"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Album %s en cours de création…"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Un message d'erreur est apparu lors de la publication sur Piwigo. Veuillez "
+"réessayer."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Saisissez l'URL de la photothèque Piwigo ainsi que le nom d'utilisateur et le "
+"mot de passe associés à votre compte Piwigo pour cette photothèque."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell n'arrive pas à atteindre votre photothèque Piwigo. Veuillez "
+"vérifier l'URL saisie"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "L'URL n'est pas valide."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administrateurs, Famille, Amis, Contacts"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administrateurs, Famille, Amis"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administrateurs, Famille"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administrateurs"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Vous n'êtes actuellement pas connecté à YouTube.\n"
+"\n"
+"Vous devez déjà avoir un compte Google dont l'accès à YouTube a été activé "
+"pour continuer. Vous pouvez activer la plupart des comptes en vous "
+"connectant au moins une fois au site de YouTube à l'aide d'un navigateur."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Un fichier requis pour la publication est indisponible. Impossible de "
+"continuer la publication vers Youtube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Vous êtes connecté à YouTube en tant que %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Les vidéos apparaîtront dans « %s »"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Publiques"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Non répertoriées"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Publier vers un album e_xistant :"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Créer un _nouvel album nommé :"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Vidéos et nouveaux albums photos _visibles pour :"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Supprimer l'emplacement, l'appareil et d'autres informations d'identification "
+"avant d'envoyer les photos"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Saisissez le numéro de confirmation qui apparaît dans votre navigateur Web "
+"après vous être connecté à Flickr."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Numéro d'autorisation :"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Pour_suivre"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Un album e_xistant :"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Un _nouvel album appelé :"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "L_ister l'album dans la galerie publique"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "_Taille préétablie des photos :"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL de votre photothèque Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Identifiant"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Se souvenir du mot de passe"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Une catégorie _existante :"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Les photos seront _visibles par :"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Taille de la photo :"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "dans la catégorie :"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Commentaire d'album :"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Si un titre est défini et qu'il n'y a pas de commentaire, utiliser le titre "
+"comme commentaire"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "Ne _pas envoyer les étiquettes"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Déconnexion"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Publier"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Services de publication principaux"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Paramètre de _confidentialité des vidéos :"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Stores"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Damier"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Cercle"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Cercles"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Horloge"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Dissolution"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Fondu"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Glissement"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Carrés"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Rayures"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transitions de diaporama principales"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Impossible de créer le dossier de cache %s : %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Impossible de créer le dossier de données %s : %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Images"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Impossible de créer le dossier temporaire %s : %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Impossible de créer le sous-dossier de données %s : %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fixer la barre d'outils"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fixe la barre d'outils visible"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Quitte le mode plein écran"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Quitter le mode _plein écran"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Quitter"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "À _propos"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Plein écran"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Sommaire"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Foire aux questions"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Signaler un problème…"
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Annuler"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Une erreur fatale est survenue lors de l'accès à la photothèque de Shotwell. "
+"Shotwell ne peut pas poursuivre.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Impossible d'afficher l'aide : %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Impossible de parcourir la base de donnée des anomalies : %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Impossible d'afficher la FAQ : %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Succès"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Erreur de fichier"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Impossible de décoder le fichier"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Erreur de la base de données"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "L'utilisateur a interrompu l'importation"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ce n'est pas un fichier"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Le fichier existe déjà dans la base de données"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Format de fichier non pris en charge"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ce n'est pas un fichier image"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Défaillance du disque"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disque plein"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Erreur de l'appareil photo"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Erreur d'écriture de fichier"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Fichier image corrompu"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Échec de l'importation (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "Diapora_ma"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Lancer un diaporama"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exporter la photo/vidéo"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exporter les photos/vidéos"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Exporter la photo"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exporter les photos"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotation"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Annuler la rotation"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Miroir horizontal"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Annuler le miroir horizontal"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Miroir vertical"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Annuler le miroir vertical"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Rétablissement"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Annuler le rétablissement"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Amélioration"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Annuler l'amélioration"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Application des transformations de couleurs"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Annuler les transformations de couleurs"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Création d'un nouvel événement"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Effacement de l'événement"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Déplacer les photos vers le nouvel événement"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Déplacer les photos vers l'événement précédent"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Fusion"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Annuler la fusion"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplication des photos"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Effacement des photos dupliquées"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Impossible de dupliquer une photo suite à une erreur de fichier"
+msgstr[1] "Impossible de dupliquer %d photos suite à des erreurs de fichier"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Rétablissement de la note précédente"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Amélioration des notes"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Diminution des notes"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Configurer le révélateur RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Rétablir le révélateur RAW précédent"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Définir le révélateur"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "La photo originale n'a pas pu être ajustée."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Ajustement de la date et de l'heure"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Annuler l'ajustement de la date et de l'heure"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Une photo originale n'a pas pu être ajustée."
+msgstr[1] "Les photos originales suivantes n'ont pas pu être ajustées."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Erreur de l'ajustement de la date"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"L'ajustement de l'heure n'a pas pu être annulé sur le fichier photo suivant."
+msgstr[1] ""
+"L'ajustement de l'heure n'a pas pu être annulé sur les fichiers photo "
+"suivants."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Créer une étiquette"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Déplacer l'étiquette « %s »"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mettre les photos dans la corbeille"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurer les photos contenues dans la corbeille"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Déplacer les photos dans la corbeille de Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Réintègrer les photos dans la photothèque de Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Déplacement des photos dans la corbeille"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restauration des photos de la corbeille"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marquer les photos sélectionnées"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Enlever la marque des photos sélectionnées"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marquage des photos sélectionnées"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Suppression de la marque des photos sélectionnées"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marquer"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Enlever la marque"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Impossible de lancer Nautilus Send-To : %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Envoyer vers"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Impossible d'exporter le fond d'écran vers %s : %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Impossible de préparer le diaporama d'écran : %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Ceci enlèvera l'étiquette « %s » d'une photo. Poursuivre ?"
+msgstr[1] "Ceci enlèvera l'étiquette « %s » de %d photos. Poursuivre ?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Supprimer"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Ceci enlèvera la recherche enregistrée « %s ». Poursuivre ?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Changer de révélateur annulera toutes les modifications effectuées sur cette "
+"photo dans Shotwell"
+msgstr[1] ""
+"Changer de révélateur annulera toutes les modifications effectuées sur ces "
+"photos dans Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Changer de révélateur"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exporter la vidéo"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell n'a pas pu créer de fichier pour modifier cette photo car vous "
+"n'avez pas les permissions d'écriture dans %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Impossible d'exporter la photo suivante suite à une erreur de fichier.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Souhaitez-vous poursuivre l'exportation ?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Non modifié"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actuel"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format :"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualité :"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Contrainte d'échelle :"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixels"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exporter les métadonnées"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Enregistrer les détails..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Enregistrer les détails"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(et %d autres)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importer les résultats du rapport"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Tentative d'importation de %d fichier."
+msgstr[1] "Tentative d'importation de %d fichiers."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Parmi ces derniers, %d fichier a été importé avec succès."
+msgstr[1] "Parmi ces derniers, %d fichiers ont été importés avec succès."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Photos/vidéos à double non importées :"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "est identique à un média existant"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"Photos/vidéos non importées à cause d'une erreur de l'appareil photo :"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "message d'erreur :"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Fichiers non importés car ils n'ont pas été reconnus en tant que photos ou "
+"vidéos :"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Photos/vidéos non importées car elles n'étaient pas dans un format reconnu par "
+"Shotwell :"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Photos/vidéos non importées car Shotwell n'a pas pu les copier "
+"dans sa bibliothèque :"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"impossible de copier %s\n"
+"\tvers %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Photos/vidéos non importées car les fichiers sont corrompus :"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Photos/vidéos non importées pour d'autres raisons :"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 photo dupliquée non importée :\n"
+msgstr[1] "%d photos dupliquées non importées :\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 vidéo dupliquée non importée :\n"
+msgstr[1] "%d vidéos dupliquées non importées :\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 photo/vidéo dupliquée non importée :\n"
+msgstr[1] "%d photos/vidéos dupliquées non importées :\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"L'importation d'une photo a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+msgstr[1] ""
+"L'importation de %d photos a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"L'importation d'une vidéo a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+msgstr[1] ""
+"L'importation de %d vidéos a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"L'importation d'une photo/vidéo a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+msgstr[1] ""
+"L'importation de %d photos/vidéos a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"L'importation d'un fichier a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+msgstr[1] ""
+"L'importation de %d fichiers a échoué suite à une erreur de fichier ou "
+"matérielle :\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"L'importation d'une photo a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+msgstr[1] ""
+"L'importation de %d photos a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"L'importation d'une vidéo a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+msgstr[1] ""
+"L'importation de %d vidéos a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"L'importation d'une photo/vidéo a échoué car le dossier de la photothèque "
+"n'est pas accessible en écriture :\n"
+msgstr[1] ""
+"L'importation de %d photos/vidéos a échoué car le dossier de la photothèque "
+"n'est pas accessible en écriture :\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"L'importation d'un fichier a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+msgstr[1] ""
+"L'importation de %d fichiers a échoué car le dossier de la photothèque n'est "
+"pas accessible en écriture :\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"L'importation d'une photo a échoué suite à une erreur de l'appareil photo :\n"
+msgstr[1] ""
+"L'importation de %d photos a échoué suite à une erreur de l'appareil "
+"photo :\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"L'importation d'une vidéo a échoué suite à une erreur de l'appareil photo :\n"
+msgstr[1] ""
+"L'importation de %d vidéos a échoué suite à une erreur de l'appareil "
+"photo :\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"L'importation d'une photo/vidéo a échoué suite à une erreur de l'appareil "
+"photo :\n"
+msgstr[1] ""
+"L'importation de %d photos/vidéos a échoué suite à une erreur de l'appareil "
+"photo :\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"L'importation d'un fichier a échoué suite à une erreur de l'appareil "
+"photo :\n"
+msgstr[1] ""
+"L'importation de %d fichiers a échoué suite à une erreur de l'appareil "
+"photo :\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "L'importation d'une photo a échoué car elle était corrompue :\n"
+msgstr[1] "L'importation de %d photos a échoué car elles étaient corrompues :\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "L'importation d'une vidéo a échoué car elle était corrompue :\n"
+msgstr[1] "L'importation de %d vidéos a échoué car elles étaient corrompues :\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "L'importation d'une photo/vidéo a échoué car elle était corrompue :\n"
+msgstr[1] "L'importation de %d photos/vidéos a échoué car elles étaient corrompues :\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "L'importation d'un fichier a échoué car il était corrompu :\n"
+msgstr[1] "L'importation de %d fichiers a échoué car ils étaient corrompus :\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Une photo non prise en charge a été omise :\n"
+msgstr[1] "%d photos non prises en charge ont été omises :\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 fichier non-image omis.\n"
+msgstr[1] "%d fichiers non-images omis.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "L'annulation de l'utilisateur a provoqué l'omission d'une photo :\n"
+msgstr[1] ""
+"L'annulation de l'utilisateur a provoqué l'omission de %d photos :\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "L'annulation de l'utilisateur a provoqué l'omission d'une vidéo :\n"
+msgstr[1] ""
+"L'annulation de l'utilisateur a provoqué l'omission de %d vidéos :\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"L'annulation de l'utilisateur a provoqué l'omission d'une photo/vidéo :\n"
+msgstr[1] ""
+"L'annulation de l'utilisateur a provoqué l'omission de %d photos/vidéos :\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 fichier omis par annulation de l'utilisateur :\n"
+msgstr[1] "%d fichiers omis par annulation de l'utilisateur :\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Une photo importée avec succès.\n"
+msgstr[1] "%d photos importées avec succès.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Une vidéo importée avec succès.\n"
+msgstr[1] "%d vidéos importées avec succès.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Une photo/vidéo importée avec succès.\n"
+msgstr[1] "%d photos/vidéos importées avec succès.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Aucune photo ou vidéo importée.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importation achevée"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d seconde"
+msgstr[1] "%d secondes"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d heure"
+msgstr[1] "%d heures"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 jour"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Renommer l'événement"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nom :"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Modifier le titre"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Titre :"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Modifier le commentaire de l'événement"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Modifier le commentaire de la photo/vidéo"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Mettre le fichier à la corbeille"
+msgstr[1] "_Mettre les fichiers à la corbeille"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Enlever seulement"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Garder"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Annuler l'édition externe ?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Annuler les éditions externes ?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Ceci détruira tous les changements appliqués au fichier externe. Poursuivre ?"
+msgstr[1] ""
+"Ceci détruira tous les changements appliqués aux %d fichiers externes. "
+"Poursuivre ?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "A_nnuler l'édition externe"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "A_nnuler les éditions externes"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Ceci enlèvera la photo de la photothèque. Poursuivre ?"
+msgstr[1] "Ceci enlèvera %d photos de la photothèque. Poursuivre ?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Enlever"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Enlever la photo de la photothèque"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Enlever les photos de la photothèque"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "Matin"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "Après-midi"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Décaler les photos/vidéos de la même durée"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Dé_finir cette date pour toutes les photos/vidéos"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifier la photo d'origine"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifier les photos d'origine"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modifier le fichier original"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifier les fichiers originaux"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original : "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"La date de la prise de vue sera avancée de\n"
+"%d %s, %d %s, %d %s et %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"La date de la prise de vue sera reculée de\n"
+"%d %s, %d %s, %d %s et %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "jour"
+msgstr[1] "jours"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "seconde"
+msgstr[1] "secondes"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Et %d autre."
+msgstr[1] ""
+"\n"
+"\n"
+"Et %d autres."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Étiquettes (séparées par des virgules) :"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bienvenue !"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Bienvenue sur Shotwell"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "Pour commencer, importez des photos d'une des manières suivantes :"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Choisissez <span weight=\"bold\">Fichier %s Importer depuis un dossier</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Faites glisser des photos dans la fenêtre de Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Connectez un appareil photo à votre ordinateur et importez des photos"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importer des photos du dossier %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"Vous pouvez également importer des photos avec les méthodes suivantes :"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Ne plus afficher ce message"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importer des photos de la photothèque %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(aide)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Année%sMois%sJour"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Année%sMois"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Année%sMois-Jour"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Année-Mois-Jour"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Personnalisé"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Modèle non valable"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell peut copier les photos dans votre photothèque ou les importer sans "
+"les copier."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_pier les photos"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "Importer _sans copier"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importer dans la photothèque"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Enlever de la photothèque"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Effacement de la photo de la photothèque"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Effacement des photos de la photothèque"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ceci enlèvera la photo/vidéo de votre photothèque Shotwell. Voulez-vous "
+"également déplacer le fichier dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+msgstr[1] ""
+"Ceci enlèvera %d photos/vidéos de votre photothèque Shotwell. Voulez-vous "
+"également déplacer les fichiers dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ceci enlèvera la vidéo de votre photothèque Shotwell. Voulez-vous également "
+"déplacer le fichier dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+msgstr[1] ""
+"Ceci enlèvera %d vidéos de votre photothèque Shotwell. Voulez-vous également "
+"déplacer les fichiers dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ceci enlèvera la photo de votre photothèque Shotwell. Voulez-vous également "
+"déplacer le fichier dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+msgstr[1] ""
+"Ceci enlèvera %d photos de votre photothèque Shotwell. Voulez-vous également "
+"déplacer les fichiers dans la corbeille de votre ordinateur ?\n"
+"\n"
+"Cette action n'est pas réversible."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"La photo ou la vidéo ne peut pas être mise à la corbeille. Faut-il supprimer "
+"le fichier ?"
+msgstr[1] ""
+"%d photos ou vidéos ne peuvent pas être mises à la corbeille. Faut-il "
+"supprimer les fichiers ?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "La photo ou la vidéo ne peut pas être supprimée."
+msgstr[1] "%d photos ou vidéos ne peuvent pas être supprimées."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Largeur ou hauteur"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Largeur"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Hauteur"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Impossible de surveiller %s : ce n'est pas un dossier (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Événement %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Impossible de créer un fichier temporaire pour %s : %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportation"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Le fichier %s existe déjà. Faut-il le remplacer ?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Omettre"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Remplacer"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_Tout remplacer"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Exporter"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Impossible de vérifier les mises à jour : %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Agrandir ou réduire les miniatures"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Zoom _avant"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Agrandit les miniatures"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "Zoom a_rrière"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Réduit les miniatures"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Trier les _photos"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Lire la vidéo"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Ouvre les vidéos sélectionnées dans le lecteur vidéo du système"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Révélateur"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Appareil photo"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Titres"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Affiche le titre de chaque photo"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Commentaires"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Afficher le commentaire de chaque photo"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "É_tiquettes"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Afficher les étiquettes de chaque photo"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Par _titre"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Trie les photos par titre"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Par _date"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Trie les photos par date de prise de vue"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Par _note"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Trie les photos par note"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "Ordre croiss_ant"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Trie les photos par ordre croissant"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "Ordr_e décroissant"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Trie les photos par ordre décroissant"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell n'a pas pu lire la vidéo sélectionnée :\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Aucune photo/vidéo"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Aucune photo/vidéo trouvée"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Les photos ne peuvent pas être exportées dans ce dossier."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "modifiée"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Photo précédente"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Photo suivante"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Fichier source de la photo manquant : %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Affichage"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Outils"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Photo _précédente"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Photo précédente"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Photo _suivante"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Photo suivante"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Augmente l'agrandissement de la photo"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Réduit l'agrandissement de la photo"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Adapter à la _page"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoom pour adapter la photo à taille de l'écran"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Zoom _100 %"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zoom pour afficher la photo à sa taille réelle (100 %)"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Zoom _200 %"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zoom pour afficher la photo au double de sa taille réelle (200 %)"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Impossible d'exporter %s : %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Remplir la page entière"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 images par page"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 images par page"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 images par page"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 images par page"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 images par page"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 images par page"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "po."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Portefeuille (2 x 3 po.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 x 5 po.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 po."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 po."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 po."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 po."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 po."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Portefeuille métrique (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Carte postale (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm "
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Paramètres de l'image"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Impression..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Impossible d'imprimer la photo :\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Hier"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Éléments :"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d événement"
+msgstr[1] "%d événements"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d photo"
+msgstr[1] "%d photos"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vidéo"
+msgstr[1] "%d vidéos"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Date :"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Heure :"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "De :"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "À :"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Taille :"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Durée :"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f secondes"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Révélateur :"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Exposition :"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Emplacement :"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Taille du fichier :"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Développement actuel :"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensions originales :"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Fabricant de l'appareil photo :"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modèle de l'appareil photo :"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash :"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Distance focale :"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Date d'exposition :"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Heure d'exposition :"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Correction de l'exposition :"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitude GPS :"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitude GPS :"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Auteur :"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright :"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Logiciel :"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informations étendues"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Gestionnaire de photos"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visionneur de photos"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Pivoter à d_roite"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Pivoter"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Pivoter à droite"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Pivote les photos vers la droite (appuyer sur Ctrl pour pivoter vers la "
+"gauche)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Pivoter à _gauche"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Pivoter à gauche"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Pivote les photos vers la gauche"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Miroir _horizontal"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Retourner horizontalement"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Miroir _vertical"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Retourner verticalement"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Améliorer"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Améliorer"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Rehausse automatiquement la qualité de la photo"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copier les ajustements de couleur"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Copier les ajustements de couleur"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Copie les ajustements de couleur appliqués à la photo"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Coller les ajustements de couleur"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Coller les ajustements de couleur"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Applique les ajustements de couleur copiés aux photos sélectionnées"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Rogner"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Rogner"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Effectue un rognage de la photo"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Redre_sser"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Redresser"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Redresse la photo"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Yeux rouges"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Yeux rouges"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Réduit ou supprime complètement l'effet yeux rouges"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ajuster"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ajuster"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ajuste les couleurs et les tonalités de la photo"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Re_venir à l'original"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Revenir à l'original"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Annuler les é_ditions externes"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Revient à la photo originale"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Définir comme fond d'_écran"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Définit l'image sélectionnée comme le nouveau fond d'écran"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Définir comme _diaporama d'écran..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "A_nnuler"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Annuler"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Rétablir"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Rétablir"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_nommer l'événement..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Faire de la photo une photo _clé de l'événement"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Faire de la photo une photo clé de l'événement"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nouvel événement"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Nouvel événement"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Déplacer les photos"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Déplace les photos vers un événement"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Fusionner les événements"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Fusionner"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combine plusieurs événements en un seul"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Noter"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Attribuer une note"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Changer la note de cette photo"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Augmenter"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Augmenter la note"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "A_baisser"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Abaisser la note"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Sans note"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sans note"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Enlever la note"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Supprimer la note"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Enlève toute note"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "Re_jeter"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rejetée"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Noter pour rejeter"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Noter pour rejeter"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Noter pour rejeter"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Rejetées _uniquement"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Rejetées uniquement"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Afficher uniquement les photos rejetées"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Toutes + re_jetées"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Afficher toutes les photos, y compris les rejetées"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Toutes les photos"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Afficher toutes les photos"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Notes"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Affiche la note de chaque photo"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrer les photos"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrer les photos"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Restreindre les photos affichées en utilisant un filtre"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Dupliquer"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Dupliquer"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Crée un duplicata de la photo"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exporter..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Impri_mer..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blier..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publie sur différents sites Web"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Modifier le __titre..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Modifier le _commentaire..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Modifier le commentaire"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Modifier le _commentaire de l'événement..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Aj_uster la date et l'heure..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ajuster la date et l'heure"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Ajouter des é_tiquettes..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Ajouter des étiquettes"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Ajouter des étiquettes"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Préférences"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Ouvrir avec un éditeur e_xterne"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Ouvrir avec l'éditeur RA_W"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Envoyer _vers..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Env_oyer à ..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Rechercher..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Rechercher"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Rechercher une image en saisissant du texte se trouvant dans son nom ou ses "
+"étiquettes"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marquer"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Enlever la marque"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Impossible de lancer l'éditeur : %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Ajouter l'étiquette « %s »"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Ajouter les étiquettes « %s » et « %s »"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Supprimer l'étiquette « %s »"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Supprimer l'étiquette « %s »"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Supprimer l'étiquette"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Nouveau"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_nommer l'étiquette « %s »..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Renommer l'étiquette « %s » en « %s »"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Renommer..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modifie_r les étiquettes..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modifier les étiquettes"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Étiqueter la photo avec « %s »"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Étiqueter les photos avec « %s »"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Étiqueter la photo sélectionnée avec « %s »"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Étiqueter les photos sélectionnées avec « %s »"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Enlever l'étiquette « %s » de la _photo"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Enlever l'étiquette « %s » des _photos"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Enlever l'étiquette « %s » de la photo"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Enlever l'étiquette « %s » des photos"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Impossible de renommer l'étiquette en « %s » car ce nom existe déjà."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Impossible de renommer la recherche en « %s » parce que ce nom existe déjà."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Recherche enregistrée"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Supprimer la recherche"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Éditer..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Re_nommer..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Renommer la recherche « %s » en « %s »"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Supprimer la recherche « %s »"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Noter %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Donner une note à %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Attribution de note à %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Afficher %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Montrer uniquement les photos avec une note de %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ou plus"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Afficher %s ou plus"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "N'afficher que les photos avec une note de %s ou plus"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Enlève les photos sélectionnées de la corbeille"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Enlève les photos sélectionnées de la photothèque"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurer"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Réintègre les photos dans la photothèque"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Ouvrir dans le _gestionnaire de fichiers"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+"Ouvre le dossier des photos sélectionnées dans le gestionnaire de fichiers"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Impossible d'ouvrir dans le gestionnaire de fichiers : %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Su_pprimer de la photothèque"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Déplacer dans la cor_beille"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "_Tout sélectionner"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Sélectionner tous les éléments"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d %b %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Diaporama"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Marquées"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Photos"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vidéos"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Photos RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Photos RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Erreur de chargement du fichier d'interface %s : %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Type"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Note"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Paramètres"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Précédente"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Revient à la photo précédente"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pause"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Met le diaporama en pause"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Suivante"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Passe à la photo suivante"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Configurer le diaporama"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Tous les fichiers sources des photos sont manquants."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Lancer"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Poursuit le diaporama"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "sans nom"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Exporter les vidéos"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Appareils photos"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Impossible de démonter l'appareil photo. Essayez de démonter l'appareil "
+"photo à partir du gestionnaire de fichiers."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Masquer les photos déjà importées"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Montre seulement les photos qui n'ont pas déjà été importées"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Démarrage de l'importation, veuillez patienter…"
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importer la _sélection"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importe les photos sélectionnées dans la photothèque"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_Tout importer"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importe toutes les photos dans la photothèque"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell doit démonter l'appareil photo du système de fichiers pour pouvoir "
+"y accéder. Poursuivre ?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Démonter"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Veuillez démonter l'appareil photo."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"L'appareil photo est verrouillé par une autre application. Shotwell ne peut "
+"accéder à l'appareil photo que lorsqu'il est déverrouillé. Veuillez fermer "
+"toute autre application utilisant l'appareil photo puis réessayez."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Veuillez fermer toute autre application utilisant l'appareil photo."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Impossible de récupérer les aperçus depuis l'appareil photo :\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Démontage..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Récupération des informations sur les photos"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Récupération de l'aperçu de %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Impossible de verrouiller l'appareil photo : %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Supprimer cette photo de l'appareil photo ?"
+msgstr[1] "Supprimer ces %d photos de l'appareil photo ?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Supprimer cette vidéo de l'appareil photo ?"
+msgstr[1] "Supprimer ces %d vidéos de l'appareil photo ?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Supprimer cette photo/vidéo de l'appareil photo ?"
+msgstr[1] "Supprimer ces %d photos/vidéos de l'appareil photo ?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Supprimer ces fichiers de l'appareil ?"
+msgstr[1] "Supprimer ces %d fichiers de l'appareil ?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Effacement des photos/vidéos de l'appareil photo"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Impossible de supprimer %d photo/vidéo de l'appareil photo en raison "
+"d'erreurs."
+msgstr[1] ""
+"Impossible de supprimer %d photos/vidéos de l'appareil photo en raison "
+"d'erreurs."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importations de données"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de données %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"L'importation à partir de %s ne peut continuer car une erreur est survenue :"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Pour tenter d'importer à partir d'un autre service, faites votre choix dans "
+"le menu ci-dessus."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Aucun greffon d'importation de données n'est activé.\n"
+"\n"
+"Pour pouvoir utiliser l'importation à partir d'une application, au moins un "
+"greffon doit être disponible. Ils peuvent être activés dans la fenêtre des "
+"Préférences."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Fichier de base de données :"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importer"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importer à partir d'une application"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importer du contenu à _partir de :"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Fermer"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Impossible d'ouvrir ou créer la base de données de photos %s : code d'erreur "
+"%d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Impossible d'écrire dans le fichier de base de données de photos :\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Erreur d'accès au fichier de base de données :\n"
+" %s\n"
+"\n"
+"L'erreur est : \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Fichier"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "Enre_gistrer"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Enregistre la photo"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Enregistrer _sous..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Enregistre la photo sous un autre nom"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprime la photo sur une imprimante connectée à votre ordinateur"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "É_dition"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Photo"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "Aid_e"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s n'existe pas."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s n'est pas un fichier."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ne prend pas en charge le format du fichier\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Enregistrer une copie"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Perdre les modifications apportées à %s ?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Fermer _sans enregistrer"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Erreur lors de l'enregistrement de %s : %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Enregistrer sous"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Revenir aux dimensions actuelles de la photo"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Effectuer l'action de rognage"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Pivoter le rectangle de rognage entre les orientations portrait et paysage"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Sans contrainte"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Carré"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Écran"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "Vidéo SD (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "Vidéo HD (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Format Lettre (8.5 x 11 pouces)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Format Tabloïd (11 x 17 pouces)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Fermer l'outil yeux rouges"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Enlever ou réduire l'effet yeux rouges dans la zone de sélection"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Réinitialiser"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Saturation :"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Teinte :"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Température :"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Ombres :"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Luminosité :"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Réinitialiser les couleurs"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Réinitialise tous les ajustements colorimétriques à l'original"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Température"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Teinte"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Saturation"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Exposition"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Ombres"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Luminosité"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Expansion du contrate"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Angle :"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d photo/vidéo"
+msgstr[1] "%d photos/vidéos"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Aucun événement"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Afficher le commentaire de chaque événement"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Aucun événement"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Aucun événement trouvé"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Événements"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Non datée"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Dossiers"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Photothèque"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importation..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Arrêter l'importation"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Arrête l'importation des photos"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Préparation de l'importation..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s importé"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Dernière importation"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Importer un _dossier..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importe des photos d'un disque vers la photothèque"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importer à partir d'une _application…"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Trier les évén_ements"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Vider la co_rbeille"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Supprime toutes les photos de la corbeille"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Afficher l'é_vénement de la photo"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Rechercher"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Recherche des photos et des vidéos par critères"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Nou_velle recherche enregistrée..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Photos"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "É_vénements"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informations _basiques"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Affiche les informations basiques pour la sélection"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informations étend_ues"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Affiche les informations étendues pour la sélection"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Barre de _recherche"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Affiche la barre de recherche"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Barre _latérale"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Afficher le panneau latéral"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importation d'un dossier"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Vider la corbeille"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Suppression du contenu de la corbeille..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell est configuré pour importer les photos dans votre dossier personnel.\n"
+"Nous recommandons de changer cela dans <span weight=\"bold\">Édition %s "
+"Préférences</span>.\n"
+"Voulez-vous continuer d'importer les photos ?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Emplacement de la photothèque"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Les photos ne peuvent pas être importées depuis ce dossier."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d %%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Mise à jour de la photothèque..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Préparation de l'importation automatique de photos..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Importation automatique de photos..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Écriture des métadonnées dans les fichiers..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Fichiers manquants"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Suppression..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Corbeille"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "La corbeille est vide"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Suppression de photos"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Votre photothèque n'est pas compatible avec cette version de Shotwell. Il "
+"semble qu'elle a été créée par Shotwell %s (schéma %d). Cette version est la "
+"%s (schéma %d). Veuillez utiliser la dernière version de Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell est dans l'impossibilité de mettre à niveau votre photothèque de la "
+"version %s (schéma %d) à la version %s (schéma %d). Pour plus "
+"d'informations, veuillez consulter le wiki de Shotwell sur %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Votre photothèque n'est pas compatible avec cette version de Shotwell. Il "
+"semble qu'elle a été créée par Shotwell %s (schéma %d). Cette version est la "
+"%s (schéma %d). Veuillez effacer votre photothèque en supprimant %s puis "
+"réimportez vos photos."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Erreur inconnue lors de la tentative de vérification de la base de données "
+"de Shotwell : %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Chargement de Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Chemin vers les données privées de Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DOSSIER"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Ne pas surveiller le répertoire de la photothèque pour détecter des changements"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Ne pas afficher l'indicateur de progression du démarrage"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Afficher la version de l'application"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FICHIER]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Exécutez « %s --help » pour voir la liste complète des options disponibles "
+"en ligne de commande.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Faible (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Moyen (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Fort (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximum (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publication"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Préparation de l'envoi"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Envoi de l'élément %d sur %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"La publication vers %s ne peut pas continuer car une erreur est survenue :"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Pour essayer de publier sur un autre service, sélectionnez-en un depuis le "
+"menu ci-dessus."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Les photos/vidéos sélectionnées ont été publiées avec succès."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Les vidéos sélectionnées ont été publiées avec succès."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Les photos sélectionnées ont été publiées avec succès."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "La vidéo sélectionnée a été publiée avec succès."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "La photo sélectionnée a été publiée avec succès."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Récupération des informations sur le compte..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Connexion..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publier les photos"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publier les photos _sur :"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publier les vidéos"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publier les vidéos _sur"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publier des photos et des vidéos"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publier les photos et les vidéos _sur"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Impossible de publier"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell ne peut pas publier les éléments sélectionnés car aucun greffon de "
+"publication compatible n'est activé. Pour corriger cela, choisissez "
+"<b>Édition %s Préférences</b> et activez un ou plusieurs greffons de "
+"publication dans l'onglet <b>Greffons</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Recherches enregistrées"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contient"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "vaut exactement"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "commence par"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "se termine par"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ne contient pas"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "n'est pas défini"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "est"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "n'est pas"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "toute photo"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "une photo brute"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "une vidéo"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "a"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "n'a pas"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modifications"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modifications internes"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modifications externes"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "marquée"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "non marquée"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "et plus"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "précisément"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "et moins"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "est après"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "est avant"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "est entre"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "et"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "n'importe quel"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "toutes"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "aucune"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "N'importe quel texte"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titre"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Étiquette"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Commentaire"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nom d'événement"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nom de fichier"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Type de média"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "État marqué"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "État de la photo"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Date"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nouvelle é_tiquette…"
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transitions de diaporama"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(aucun)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Aucun"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Aléatoire"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Étiquettes"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Définir comme diaporama d'écran"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Générer un diaporama de fond d'écran"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Afficher chaque photos pendant"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "intervalle de temps"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Durée d'affichage des photos en fond d'écran"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Rechercher"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Nom de la recherche :"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Rechercher"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "parmi ce qui suit :"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Taille de l'image imprimée</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Utiliser une taille _standard :"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Utiliser une taille _personnalisée :"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Conserver les proportions de la photo"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "Taille _automatique :"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Titres</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Imprimer le _titre de l'image"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Résolution en pixels</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Imprimer la photo à :"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "pixels par pouce"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Préférences de Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "blanc"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "noir"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Détecter les nouveaux fichiers dans le dossier de la photothèque"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Métadonnées"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Écrire les étiquettes, titres et autres _métadonnées dans les fichiers des "
+"photos"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Affichage"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importer les photos dans :"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Arrière-plan :"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importation"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Structure de _dossier :"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Modèle :"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Exemple :"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "R_enommer les fichiers importés en minuscules"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Révélateur RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "Par dé_faut :"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Éditeur d'image e_xterne :"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Éditeur _RAW externe :"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Éditeurs externes"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Greffons"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Délai :"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Effet de _transition :"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Déla_i de transition :"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Afficher le t_itre"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "secondes"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Se connecter"
diff --git a/po/gl.po b/po/gl.po
new file mode 100644
index 0000000..bd9ef40
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,4692 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+# Translators:
+# Antón Méixome <meixome@certima.net>, 2012
+# Fran Diéguez <frandieguez@ubuntu.com>, 2012
+# Laura Linares <lauralinaresfernandez@gmail.com>, 2011
+# mbouzada <mbouzada@gmail.com>, 2011,2013
+# Antón Méixome <meixome@certima.net>, 2012
+# mbouzada <mbouzada@gmail.com>, 2013
+# verayin <vera@yorba.org>, 2011
+# Adolfo Jayme Barrientos <fitoschido@ubuntu.com>, 2012
+# Fran Diéguez <frandieguez@ubuntu.com>, 2011, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+# mbouzada <mbouzada@gmail.com>, 2013
+# Fran Dieguez <frandieguez@gnome.org>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-02-07 01:56+0100\n"
+"PO-Revision-Date: 2014-02-07 01:56+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
+"Language-Team: gnome-l10n-gl@gnome.org\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Non está dispoñíbel o ficheiro temporal necesario para a publicación"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Xa se iniciou e pechou unha sesión de Google durante esta sesión de "
+"Shotwell.\n"
+"\n"
+"Para continuar publicando nos servizos de Google, peche e reinicie Shotwell "
+"e tente publicar de novo."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Visitar o sitio web de Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
+"Fran Diéguez <frandieguez@gnome.org>\n"
+"Antón Méixome <meixome@certima.net>\n"
+"Laura Linares <lauralinaresfernandez@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2011-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Benvido ao servizo de importación de bibliotecas de F-Spot.\n"
+"\n"
+"Seleccione unha biblioteca para importar, pode seleccionar unha das "
+"bibliotecas existentes que foron atopadas por Shotwell ou pode seleccionar "
+"un ficheiro de base de datos de F-Spot alternativo."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Benvido ao servizo de importación de bibliotecas de F-Spot.\n"
+"\n"
+"Seleccione un ficheiro de base de datos de F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+"Seleccione manualmente o ficheiro de base de datos de F-Spot para importar."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Non é posíbel abrir o ficheiro de base de datos de F-Spot seleccionado: o "
+"ficheiro non existe ou non é unha base de datos de F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Non é posíbel abrir o ficheiro de base de datos de F-Spot: Shotwell non "
+"admite esta versión da base de datos de F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Non é posíbel ler o ficheiro de base de datos de F-Spot: produciuse un erro "
+"ao ler a táboa de etiquetas"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Non é posíbel ler o ficheiro de base de datos de F-Spot: produciuse un erro "
+"ao ler a táboa de fotos"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell atopou %d fotos na biblioteca de F-Spot e está importándoas "
+"actualmente. Os duplicados detectaranse automaticamente e serán eliminados.\n"
+"\n"
+"Pode pechar este diálogo e comezar a usar Shotwell mentres a importación se "
+"leva a cabo en segundo plano."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Fototeca F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparando para importar"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Servizos de importación de datos do núcleo"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 píxeles"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 × 768 píxeles"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 píxeles"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"«%s» non é unha resposta aceptábel a unha petición de autenticación OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): non se pode iniciar, este editor non é "
+"reiniciábel."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Escriba o nome de usuario e o contrasinal asociados coa súa conta de Tumblr"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "O nome de usuario e/ou o contrasinal é incorrecto. Ténteo de novo "
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Nome de usuario ou contrasinal incorrecto"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Non é posíbel cargar a interface de usuario: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Accedeu a Tumblr como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010 + Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visite o sitio web Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Non está actualmente rexistrado en Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Servizos de publicación adicionais de Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "etiqueta"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_Enderezo de correo"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Contrasinal"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Acceso"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "_Tamaño da foto:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Saír da sesión"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Publicar"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "Ál_bums (ou escribir novo):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "Tipo de _acceso:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Desactivar os _comentarios:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Impedir descargar a foto orixinal"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Público"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amigos"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privado"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Non está conectado ao Facebook.\n"
+"\n"
+"Se non ten unha conta de Facebook pode creala durante o proceso de acceso. "
+"Shotwell Connect pediralle permiso para enviar fotos e publicar no seu muro. "
+"Estes permisos son necesarios para que Shotwell Connect funcione."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Xa se iniciou e pechou unha sesión de Facebook durante esta sesión de "
+"Shotwell.\n"
+"Para continuar publicando no Facebook, peche e reinicie Shotwell e tente "
+"publicar de novo."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Estándar (720 píxeles)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Grande (2048 píxeles)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Probando a conexión ao Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Creando o álbum..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Non está dispoñíbel un ficheiro necesario para a publicación. A publicación "
+"en Facebook non pode continuar."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Vostede está conectado ao Facebook como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Desexa publicar as fotos seleccionadas?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "_Tamaño do envío:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Só para min"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Todos"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Non iniciou sesión en Flickr.\n"
+"\n"
+"Prema en Acceso para acceder ao Flickr co seu Navegador web. Deberá "
+"autorizar a Shotwell para conectarse á súa conta de Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Xa se iniciou e pechou unha sesión de Flickr durante esta sesión de "
+"Shotwell.\n"
+"Para continuar publicando no Flickr, peche e reinicie o Shotwell e tente "
+"publicar de novo."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Preparando o acceso..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Non está dispoñíbel un ficheiro necesario para a publicación. A publicación "
+"en Flickr non pode continuar."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verificando autorización..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Vostede está conectado ao Flickr como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"A súa conta de Flickr de balde limita a cantidade de datos que pode enviar "
+"por mes.\n"
+"Este mes vostede ten %d megabytes dispoñíbeis para enviar."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "A súa conta do Flickr Pro permítelle envíos sen límites."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotos _visíbeis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Vídeos _visíbeis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotos e vídeos _visíbeis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Só amigos e familia"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Só a familia"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Só os amigos"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 píxeles"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 píxeles"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Tamaño orixinal"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Neste momento non ten acceso a Picasa Web Albums.\n"
+"\n"
+"Prema en Acceso para acceder ao Picasa Web Albums co seu Navegador web. "
+"Deberá autorizar a Shotwell para conectarse á súa conta de Picasa Web Albums."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Non está dispoñíbel un ficheiro necesario para a publicación. A publicación "
+"en Picasa non pode continuar."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Vostede está conectado a Picasa Web Albums como %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Os vídeos aparecerán en:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "As fotos aparecen en:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pequeno (640 x 480 píxels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Mediano (1024 x 768 píxels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomendado (1600 x 1200 píxels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Tamaño orixinal"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Creando o álbum %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Produciuse unha mensaxe de erro ao publicar en Piwigo. Ténteo de novo."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Escriba o URL da fototeca Piwigo, así como o nome de usuario e o contrasinal "
+"asociado coa súa conta en Piwigo para esa fototeca."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell non é quen de conectar coa súa fototeca en Piwigo. Comprobe o URL "
+"que escribiu"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "URL incorrecto"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administradores, Familia, Amigos, Contactos"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administradores, Familia, Amigos"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administradores, Familia"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administradores"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Actualmente non está conectado ao Youtube.\n"
+"\n"
+"Para continuar debe dispoñer dunha conta de Google e configurala para usar "
+"con Youtube. Pode configurar a maioría das contas usando o navegador para "
+"acceder cando menos unha vez ."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Non está dispoñíbel un ficheiro necesario para a publicación. A publicación "
+"en Youtube non pode continuar."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Está conectado a YouTube como %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Os vídeos aparecerán en «%s»"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Listado publicamente"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Retirado da lista pública"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Publicar nun álbum e_xistente:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Crear un _novo álbum con nome:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Os novos albumes de fotos e vídeos están _visíbeis para:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Eliminar localización, cámara e outra información de identificación antes "
+"de subir"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Escriba o número de confirmación que aparece despois de que inicie a sesión "
+"en Flickr desde o seu navegador web."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Número de autorización:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuar"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Un álbum _existente:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Un _novo álbum co nome:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "L_istar o álbum na galería pública"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Tamaño de _foto prestabelecido:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL da súa biblioteca de fotos Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Nome de usuario"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Lembrar contrasinal"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Unha categoría _existente:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "As fotos serán _visíbeis por:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Tamaño da foto:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "na categoría:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Comentario do álbum:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Se se estabelece un título e quita un comentario, usarase o título como "
+"comentario"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Non subir as etiquetas"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Saír da sesión"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicar"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Núcleo dos servizos de publicación"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Configuración _sobre intimidade do vídeo:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Persianas"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Xadrez"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Círculo"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Círculos"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Reloxo"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Esmiuzar"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Esvacemento"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapositiva"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Cadrados"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Segmentos"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Núcleo de transicións de diaporama"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Non é posíbel crear o cartafol da caché %s:%s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Non é posíbel crear o cartafol de datos %s:%s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Fotos"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Non é posíbel crear o cartafol temporal %s:%s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Non é posíbel crear o subcartafol de datos %s:%s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fixar a barra de ferramentas"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fixar a barra de ferramentas aberta"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Saír da pantalla completa"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Saír da _pantalla completa"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Saír"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Sobre"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Pantalla completa"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Contidos"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Preguntas máis frecuentes"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Informar dun problema..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Produciuse un erro fatal ao acceder á fototeca do Shotwell. Shotwell non "
+"pode continuar.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Non foi posíbel amosar a axuda: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Non é posíbel navegar ata a base de datos de fallos: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Non é posíbel amosar: Preguntas máis frecuentes: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Correcto"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Produciuse un erro de ficheiro"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Non foi posíbel descodificar o ficheiro"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Produciuse un erro na base de datos"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "O usuario interrompeu a importación"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Non é un ficheiro"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "O ficheiro xa existe na base de datos"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "O formato de ficheiro non é compatíbel"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Non é un ficheiro de imaxe"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Produciuse un fallo de disco"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disco cheo"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Produciuse un erro da cámara"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Produciuse un erro de escritura no ficheiro"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Ficheiro de imaxe corrompido"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Produciuse un fallo de importación (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "_Diaporama"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Reproducir un diaporama"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportar foto/vídeo"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportar fotos/vídeos"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Exportar fotos"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportar fotos"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotando"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Desfacendo a rotación"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Voltear horizontalmente"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Desfacer voltear horizontalmente"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Voltear verticalmente"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Desfacendo volteo vertical"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Revertendo"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Desfacendo reverter"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Mellorar"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Desfacendo a mellora"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Aplicando as transformacións da cor"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Desfacendo as transformacións da cor"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Creando unha nova actividade"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Eliminando a actividade"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Movendo as fotos á nova actividade"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Estabelecendo as fotos a unha actividade anterior"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Combinando"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Desfacendo a combinación"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicando as fotos"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Retirando as fotos duplicadas"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Non foi posíbel duplicar unha foto debido a un erro de ficheiro"
+msgstr[1] "Non foi posíbel duplicar %d fotos debido erros de ficheiro"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Restaurando a cualificación anterior"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Incrementar as cualificacións"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Reducir as cualificacións"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Estabelecer o desenvolvedor RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Restauración do desenvolvedor RAW previo"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Estabelecer desenvolvedor"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Non é posíbel axustar a foto orixinal."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Axustando a data e hora"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Desfacendo o axuste de data e hora"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Non é posíbel modificar a foto orixinal."
+msgstr[1] "Non é posíbel modificar as seguintes fotos orixinais."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Produciuse un erro ao axustar a hora"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Non foi posíbel desfacer o axuste de hora no ficheiro da seguinte foto."
+msgstr[1] ""
+"Non foi posíbel desfacer o axuste de hora nos ficheiros das seguintes fotos."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Crear etiqueta"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mover etiqueta «%s»"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Enviar as fotos ao lixo"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurar as fotos desde o lixo."
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Enviar as fotos ao lixo do Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurar as fotos á fototeca do Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Enviando as fotos ao lixo"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restaurando as fotos desde o lixo"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marcar as fotos seleccionadas"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Desmarcar as fotos seleccionadas"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marcando as fotos seleccionadas"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Desmarcando as fotos seleccionadas"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcar"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Desmarcar"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Non é posíbel iniciar Nautilus Send-To: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Enviar a"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Non é posíbel exportar o fondo de pantalla a %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Non é posíbel preparar o diaporama do escritorio: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Isto retirará a etiqueta «%s» dunha foto. Desexa continuar?"
+msgstr[1] "Isto retirará a etiqueta «%s» de %d fotos. Desexa continuar?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Borrarase a búsqueda gardada \"%s\". Continuar?"
+
+#: ../src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"O cambio de desenvolvedores desfará todos os cambios que teña feito nesta "
+"foto no Shotwell"
+msgstr[1] ""
+"O cambio de desenvolvedores desfará todos os cambios que teña feito nestas "
+"fotos no Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Cambiar o desenvolvedor"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportar vídeo"
+
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell non puido crear un ficheiro para editar esta foto porque non ten "
+"permiso para escribir en %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Non foi posíbel exportar a seguinte foto debido a un erro de ficheiro.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Quere continuar coa exportación?"
+
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Sen modificar"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actual"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formato:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Calidade:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Re_strición de escala:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _píxeles"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportar os metadatos"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Gardar os detalles..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Gardar os detalles"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(e %d máis)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importar o informe de resultados"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Tentouse importar %d ficheiro."
+msgstr[1] "Tentáronse importar %d ficheiros."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Destes, %d ficheiro foi importado con éxito."
+msgstr[1] "Destes, %d ficheiros foron importados con éxito."
+
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Fotos/vídeos duplicados non importados: "
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplicados existentes do elemento multimedia "
+
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"As fotos e/ou vídeos non puideron importarse por mor mor de erros na cámara:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "mensaxe de erro:"
+
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Ficheiros non importados porque non foron recoñecidos como Fotos ou Vídeos:"
+
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotos/Vídeos non importados porque non están nun formato que Shotwel entende:"
+
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotos/Vídeos non importados porque Shotwell non puido copialos na súa "
+"biblioteca:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"non foi posíbel copiar %s\n"
+"\ten %s"
+
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Fotos/vídeos non importados por estar os ficheiros estragados:"
+
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotos/vídeos non importados por outras razóns:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Non se importou 1 foto porque xa foi importada\n"
+msgstr[1] "Non se importaron %d fotos porque xa foron importadas:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Non se importou 1 vídeo porque xa foi importado\n"
+msgstr[1] "Non se importaron %d vídeos porque xa foron importados:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Non se importou 1 foto/vídeo porque sería un duplicado\n"
+msgstr[1] "Non se importaron %d fotos/vídeos porque serían un duplicados\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "Non se importou 1 foto debido a un erro de ficheiro ou hardware:\n"
+msgstr[1] ""
+"Non se importaron %d fotos debido a un erro de ficheiro ou hardware:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Fallou a importación de 1 foto debido a un erro do ficheiro ou do hardware:\n"
+msgstr[1] ""
+"Fallou a importación de %d fotos debido a un erro do ficheiro ou do "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Fallou a importación de 1 foto debido a un erro do ficheiro ou do hardware:\n"
+msgstr[1] ""
+"Fallou a importación de %d fotos debido a un erro do ficheiro ou do "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Non foi posíbel importar 1 ficheiro debido a un erro do ficheiro ou de "
+"hardware:\n"
+msgstr[1] ""
+"Non foi posíbel importar %d ficheiros debido a un erro dos ficheiros ou de "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Produciuse un fallo ao importar 1 foto porque non se pode escribir no "
+"cartafol da fototeca:\n"
+msgstr[1] ""
+"Produciuse un fallo ao importar %d fotos porque non se pode escribir no "
+"cartafol da fototeca:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Produciuse un fallo ao importar 1 vídeo porque non se pode escribir no "
+"cartafol da videoteca:\n"
+msgstr[1] ""
+"Produciuse un fallo ao importar %d vídeos porque non se pode escribir no "
+"cartafol da videoteca:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Produciuse un fallo ao importar 1 foto/vídeo porque non se pode escribir no "
+"cartafol da fototeca/videoteca:\n"
+msgstr[1] ""
+"Produciuse un fallo ao importar %d fotos/vídeos porque non se pode escribir "
+"no cartafol da fototeca/videoteca:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Non foi posíbel importar 1 ficheiro debido a que a carpeta da fototeca non "
+"ten permisos de escritura:\n"
+msgstr[1] ""
+"Non foi posíbel importar %d ficheiros debido a que a carpeta da fototeca non "
+"ten permisos de escritura:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Produciuse un fallo ao importar unha foto debido a un erro da cámara:\n"
+msgstr[1] ""
+"Produciuse un fallo ao importar %d fotos debido a un erro da cámara:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Fallou a importación dun vídeo debido a un erro da cámara:\n"
+msgstr[1] "Fallou a importación de %d vídeos debido a un erro da cámara:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Fallou a importación de 1 foto/vídeo debido a un erro da cámara:\n"
+msgstr[1] ""
+"Fallou a importación de %d fotos/vídeos debido a un erro da cámara:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Non foi posíbel importar 1 ficheiro debido a un erro da cámara:\n"
+msgstr[1] "Non foi posíbel importar %d ficheiros debido a un erro da cámara:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "Non foi posíbel importar 1 foto por estar estragada:\n"
+msgstr[1] "Non foi posñibel importar %d fotos por estaren estragadas:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "Non foi posíbel importar 1 vídeo por estar estragado:\n"
+msgstr[1] "Non foi posíbel importar %d vídeos por estaren estragados:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "Non foi posíbel importar 1 foto/vídeo por estar estragado:\n"
+msgstr[1] "Non foi posíbel importar %d fotos/vídeos por estaren estragados:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "Non foi posíbel importar 1 ficheiro por estar estragado:\n"
+msgstr[1] "Non foi posíbel importar %d ficheiros por estaren estragados:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Omitiuse unha foto non compatíbel:\n"
+msgstr[1] "Omitíronse %d fotos non compatíbeis:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Omitiuse un ficheiro que non era unha imaxe:\n"
+msgstr[1] "Omitíronse %d ficheiros que non eran unha imaxe:\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Omitiuse unha foto debido á cancelación do usuario:\n"
+msgstr[1] "Omitíronse %d fotos debido á cancelación do usuario:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Omitiuse un vídeo debido á cancelación do usuario:\n"
+msgstr[1] "Omitíronse %d vídeos debido á cancelación do usuario:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Omitiuse unha foto/vídeo debido á cancelación do usuario:\n"
+msgstr[1] "Omitíronse %d fotos/vídeos debido á cancelación do usuario:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Saltouse 1 ficheiro por cancelación do usuario:\n"
+msgstr[1] "Saltáronse %d ficheiros por cancelación do usuario:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Importouse unha foto correctamente.\n"
+msgstr[1] "Importáronse %d fotos correctamente.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Importouse correctamente un vídeo.\n"
+msgstr[1] "Importáronse correctamente %d vídeos.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Importouse correctamente unha foto ou un vídeo.\n"
+msgstr[1] "Importáronse correctamente %d fotos ou vídeos.\n"
+
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Non se importou ningunha foto ou vídeo.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importación completa"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 día"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Renomear actividade"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editar o título"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Título:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Editar o comentario da actividade"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Editar o comentario da foto/vídeo"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Botar ficheiro no lixo"
+msgstr[1] "_Botar ficheiros no lixo"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Só _retirar"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Manter"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Desfacer a edición externa?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Desfacer as edicións externas?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Isto destruirá todos os cambios realizados no ficheiro externo. Desexa "
+"continuar?"
+msgstr[1] ""
+"Isto destruirá todos os cambios realizados nos %d ficheiros externos. Desexa "
+"continuar?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_verter edicións externas"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Des_facer as edicións externas"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Isto retirará a foto da fototeca. Quere continuar?"
+msgstr[1] "Isto retirará %d fotos da fototeca. Quere continuar?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Retirar"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Retirar as fotos da fototeca"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Eliminar fotos da fototeca"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Maiús fotos/vídeos da mesma cantidade"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Configurar _todas as fotos/vídeos para esta hora"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modificar o ficheiro de foto orixinal"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modificar os ficheiros de fotos orixinais"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modificar os ficheiros orixinais"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modificar os ficheiros orixinais"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Orixinal: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposición retardouse por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposición desprazarase cara atrás por\n"
+"%d %s, %d %s, %d %s, y %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"E %d máis."
+msgstr[1] ""
+"\n"
+"\n"
+"E %d máis."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetas (separadas por comas):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Dámoslle a benvida!"
+
+#: ../src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Benvido/a ao Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Para comezar, importe as fotos de calquera das seguintes maneiras:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Seleccione <span weight=\"bold\">Importar ficheiro %s desde o cartafol</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arrastre e solte as fotos na xanela do Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "conecte unha cámara ao computador e importe"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importar fotos desde o seu cartafol %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Para comezar, importe as fotos de calquera das seguintes maneiras:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Non amosar esta mensaxe de novo"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importar fotos desde a súa fototeca %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Axuda)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Ano%smes%sdía"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Ano%smes"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Ano%smes-día"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Ano-mes-día"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Personalizado"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Patrón incorrecto"
+
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell pode copiar as fotos no cartafol da fototeca ou pode importalas sen "
+"copialas."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_piar fotos"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "Importalas no cartafol"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importar á fototeca"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Retirar da fototeca"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Eliminando as fotos da fototeca"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Eliminando fotos da fototeca"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto retirará a foto/vídeo da fototeca/videoteca do Shotwell. Quere enviar "
+"tamén o ficheiro ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+msgstr[1] ""
+"Isto retirará %d fotos/vídeos da fototeca/videoteca do Shotwell. Quere "
+"enviar tamén os ficheiros ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto retirará o vídeo da videoteca do Shotwell. Quere enviar tamén os "
+"ficheiros ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+msgstr[1] ""
+"Isto retirará %d vídeos da videoteca do Shotwell. Quere enviar tamén os "
+"ficheiros ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto retirará a foto da fototeca do Shotwell. Desexa enviar tamén os "
+"ficheiros ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+msgstr[1] ""
+"Isto retirará %d fotos da fototeca do Shotwell. Desexa enviar tamén os "
+"ficheiros ao lixo?\n"
+"\n"
+"Esta acción non se pode desfacer."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"A foto ou o vídeo non se poden enviar ao cesto do lixo. Eliminar o ficheiro?"
+msgstr[1] ""
+"%d fotos/vídeos non se poden enviar ao cesto do lixo. Eliminar os ficheiros?"
+
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "A foto ou o vídeo non se pode eliminar."
+msgstr[1] "%d fotos/vídeos non se poden eliminar."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Largo ou alto"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Largo"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Alto"
+
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Non foi posíbel monitorizar %s: non é un cartafol (%s)"
+
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Actividade %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Non se pode xerar un ficheiro temporal para %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportando"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "O ficheiro %s xa existe. Desexa substituílo?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Omitir"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Substituír"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Substituír _todo"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportar"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Non se pode procesar as actualización de monitorización:%s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Axustar o tamaño das miniaturas"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Aument_ar"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Incrementar a magnificación das miniaturas"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "Reduc_ir"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Diminuír a magnificación das miniaturas"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordenar _fotos"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Re_producir vídeo"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Abrir os vídeos seleccionados no sistema de reprodución de vídeo"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Desenvolvedor"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Cámara"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Títulos"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Amosar o título de cada foto"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comentarios"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Amosar o comentario de cada foto"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "Eti_quetas"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Amosar as etiquetas de cada foto"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Por _título"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordenar as fotos por título"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Por _data de toma"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordenar as fotos pola data de toma"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Por _cualificación"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordenar as fotos por cualificación"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Ascendente"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Ordenar as fotos en orde ascendente"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "D_escendente"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Ordenar as fotos en orde descendente"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell non puido reproducir o vídeo seleccionado:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Ningunha foto ou vídeo"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Non se atopan fotos ou vídeos"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "As fotos non poden ser exportadas a este cartafol."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "modificado"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto anterior"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Seguinte foto"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Falta o ficheiro orixe da foto: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Ver"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Fe_rramentas"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Foto anterior"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto anterior"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Seguinte foto"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Seguinte foto"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumentar o tamaño da foto"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Reducir o tamaño da foto"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Axustar á _páxina"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Ampliar as fotos ata axustalas á pantalla"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Aumentar a foto ao 100% de magnificación"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Aumentar a foto ao 200% de magnificación"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Non é posíbel exportar %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Encher toda a páxina"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imaxes por páxina"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imaxes por páxina"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imaxes por páxina"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imaxes por páxina"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 imaxes por páxina"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imaxes por páxina"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "polg."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm."
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Carteira (2 x 3 in.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Tarxeta de notas (3 x 5 polgadas)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 polg."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 polg."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 polg."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 polg."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 polg."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Carteira métrica (9 x 13 cm.)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Tarxeta postal (10 x 15 cm.)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm."
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm."
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm."
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm."
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm."
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Configuracións da imaxe"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Imprimindo"
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Non é posíbel imprimir a foto:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Hoxe"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Onte"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementos:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d actividade"
+msgstr[1] "%d actividades"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotos"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vídeo"
+msgstr[1] "%d vídeos"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "De:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Ata:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Tamaño:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Duración:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segundos"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Desenvolvedor"
+
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Tempo de exposición:"
+
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Localización:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Tamaño do ficheiro:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Desenvolvemento actual:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensións orixinais:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Cámara:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modelo da cámara:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Distancia focal:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data da exposición:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Tempo de exposición:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposición:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitude GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Lonxitude GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Dereitos de autor:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Información ampliada"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Xestor de fotos"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visor de fotos"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotar á _dereita"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotar"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotar á dereita"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Rotar as fotos á dereita (prema Ctrl para rotalas á esquerda)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotar á _esquerda"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotar á esquerda"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotar as fotos á esquerda"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Voltear hori_zontalmente"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Voltear horizontalmente"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Voltear verti_calmente"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Voltear verticalmente"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Mellorar"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Mellorar"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Mellorar automaticamente a aparencia da foto"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copiar os axustes da cor"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Copiar os axustes da cor"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Copiar os axustes da cor aplicados á foto"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Pegar os axustes da cor"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Pegar os axustes da cor"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Aplicar os axustes da cor copiados ás fotos seleccionadas"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Recortar"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Recortar"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Recortar o tamaño da foto"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Directo"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Endereitar"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Endereitar a foto"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Ollos _vermellos"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Ollos vermellos"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reducir ou eliminar calquera efecto de ollos vermellos na foto"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Axustar"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Axustar"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Axustar a cor e o ton da foto"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Volver ao orixinal"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Volver ao orixinal"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Reverter e_dicións externas"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Volver á foto orixinal"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Estabelecer como fondo de _escritorio"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Estabeleza a imaxe seleccionada como novo fondo de escritorio"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Estabelecer _diaporama como fondo de escritorio..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Desfacer"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Desfacer"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refacer"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Refacer"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_nomear actividade..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Facer _foto de portada da actividade"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Facer a foto de portada para a actividade"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nova actividade"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Nova actividade"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mover fotos"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mover fotos dunha actividade"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Combinar actividades"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Combinar"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combinar as accións nunha acción única"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Cualif_icar"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Cualificar"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Cambiar a cualificación da súa foto"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Incrementar"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Aumentar a cualificación"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Diminuír"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Diminuír a cualificación"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "Sen cua_lificar"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sen puntuar"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Cualificar as non cualificadas"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Estabelecéndoa como non cualificada"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Retirar calquera cualificación"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rexeitar"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rexeitado"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Cualificación rexeitada"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Establecéndoa como rexeitada"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Estabelecer a cualificación como rexeitada"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Só rexeitadas"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Só rexeitadas"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Amosar só as fotos rexeitadas"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Todo + _rexeitado"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Amosar todas as fotos, incluíndo as rexeitadas"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Tod_as as fotos"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Amosar todas as fotos"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Cualificacións"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Amosar a cualificación de cada foto"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrar fotos"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrar fotos"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limitar o número de fotos amosadas baseadas nun filtro"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicar"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Facer un duplicado da foto"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportar..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Im_primir..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicar..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicar en varios sitios web"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Editar _título..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Editar _comentario..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Editar comentario"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Editar o _comentario da actividade..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Axustar a data e a hora..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Axustar a data e a hora"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Engadir e_tiquetas..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Engadir etiquetas..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Engadir etiquetas"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferencias"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Abrir con editor _externo"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Abrir con editor RA_W"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Enviar _a..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "En_viar a..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Buscar..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Buscar"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Buscar unha imaxe escribindo o texto que aparece no seu nome ou etiquetas"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marcar"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Desm_arcar"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Non é posíbel iniciar o editor: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Engadir etiqueta «%s»"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Engadir etiquetas «%s» e «%s»"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Eliminar etiqueta «%s»"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Eliminar etiqueta «%s»"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Eliminar etiqueta"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Novo"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_nomear etiqueta «%s»..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Renomear a etiqueta «%s» a «%s»"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Renomear..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modif_icar etiquetas..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificar etiquetas"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etiquetar fotos como «%s»"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etiquetar fotos como \"%s\""
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etiquetar as fotos seleccionadas como «%s»"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etiquetar as fotos seleccionadas como \"%s\""
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Retirar etiqueta «%s» das _fotos"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Eliminar a etiqueta \"%s\" das _Fotos"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Retirar etiqueta «%s» das fotos"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Eliminar a etiqueta \"%s\" das Fotos"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Non é posíbel renomear a etiqueta a «%s» porque a etiqueta xa existe."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Imposible renomear a búsqueda como \"%s\" porque xa existe"
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Búsqueda gardada"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Borar búsqueda"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editar..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Re_nomear..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Renomear búsqueda \"%s\" a \"%s\""
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Borrar búsqueda \"%s\""
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Cualificación %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Estabelecer a cualificación en %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Estabelecendo a cualificación en %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Amosar %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Amosar só as fotos cunha cualificación de %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ou mellor"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Amosar %s ou mellor"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Amosar só as fotos cunha cualificación de %s ou superior"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Retirar as fotos seleccionadas do lixo"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Retirar as fotos seleccionadas da fototeca"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurar"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mover as fotos seleccionadas de volta á fototeca"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Amosar no xestor de _ficheiros"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Abrir o cartafol da foto seleccionada no xestor de ficheiros"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Non é posíbel abrir o xestor de ficheiros %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "R_etirar da fototeca"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mover ao lixo"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Seleccionar _todas"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Seleccionar todos os elementos"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a, %d de %b de %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %d de %b"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d de %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Diaporama"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Marcado"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vídeos"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotos en bruto (RAW)"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotos en bruto (RAW)"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Produciuse un erro ao cargar o ficheiro de IU %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipo"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Cualificación"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Configuracións"
+
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Atrás"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ir á foto anterior"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausar"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausar o diaporama"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Seguinte"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ir á foto seguinte"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Cambiar as opcións do diaporama"
+
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Faltan todos os ficheiros orixinais das fotos."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reproducir"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continuar o diaporama"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "Sen título"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Exportar vídeos"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Cámaras"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Non foi posíbel desmontar a cámara. Tente desmontar a cámara desde o xestor "
+"de ficheiros."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ocultar as fotos xa importadas"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Amosar só as fotos que non foran importadas"
+
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Iniciando a importación, agarde..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importar as _seleccionadas"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importar as fotos seleccionadas na súa fototeca"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importar _todas"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importar todas as fotos na fototeca"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell necesita desmontar a cámara do sistema de ficheiros co fin de "
+"acceder a ela. Desexa continuar?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmontar"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Desmonte a cámara."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"A cámara está bloqueada por outro aplicativo. Shotwell só pode acceder á "
+"cámara cando está desbloqueada. Peche calquera outro aplicativo que estea "
+"empregando a cámara e volva a tentalo."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Peche calquera aplicativo que estea empregando a cámara."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Non foi posíbel obter as vistas previas desde a cámara:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Desmontando..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Obtendo información da foto"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Obtención de vista previa para %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Non é posíbel bloquear a cámara: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Desexa eliminar esta foto da cámara?"
+msgstr[1] "Desexa eliminar estas %d fotos da cámara?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Desexa eliminar este vídeo da cámara?"
+msgstr[1] "Desexa eliminar estes %d vídeos da cámara?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Desexa eliminar esta foto/vídeo da cámara?"
+msgstr[1] "Desexa eliminar estas %d fotos/vídeos da cámara?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Borar estes ficheiros da cámara?"
+msgstr[1] "Borrar estes %d ficheiros da cámara?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Eliminando fotos/vídeos da cámara"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Non foi posíbel eliminar %d foto/vídeo da cámara debido a erros."
+msgstr[1] "Non foi posíbel eliminar %d fotos/vídeos da cámara debido a erros."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importacións de datos"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de datos %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"Importando desde %s non pode continuar debido a que se produciu un erro:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Para tentar importar desde outro servizo seleccióneo desde o menú de arriba."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"No ten ningún engadido de importación de datos activado.\n"
+"\n"
+"Para poder usar a funcionalidade Importar desde aplicativo debe ter cando "
+"menos un engadido de importación de datos activado. Os engadidos poden "
+"activarse desde o diálogo de Preferencias."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Ficheiro da base de datos:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importar"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importar desde aplicativo"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importar multimedia _desde:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Pechar"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Non foi posíbel abrir/crear a base de datos de fotos %s: código de erro %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Non se pode escribir no ficheiro base de datos de fotos:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Erro no acceso ao ficheiro da base de datos:\n"
+" %s\n"
+"\n"
+"O erro foi: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Ficheiros"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "_Gardar"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Gardar foto"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Gardar _como..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Gardar foto cun nome diferente"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprimir a foto nunha impresora conectada ao seu computador."
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Editar"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Foto"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Axuda"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s non existe."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s non é un ficheiro."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s non é compatíbel co formato de ficheiro de\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Gardar unha copia"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Desexa perder os cambios de %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Pechar _sen gardar"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Produciuse un erro ao gardar en %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Gardar como"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Devolver a foto ás dimensións actuais"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Estabelecer o corte para esta foto"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Xirar o rectángulo de corte entre as orientacións vertical e horizontal"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Sen restricións"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Cadrado"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Pantalla"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "Vídeo SD (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "Vídeo HD (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Carta (8,5 x 11 pol)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloide (11 x 17 pol)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Pechar a ferramenta de ollos vermellos"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Retirar calquera efecto de ollos vermellos na rexión seleccionada"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Restabelecer"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Saturación:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Matiz:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Sombras:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Luces altas:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Restabelecer as cores"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Restabelecer todos os axustes de cor ao orixinal"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Matiz"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Saturación"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Tempo de exposición"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Sombras"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Luces altas"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Expansión de contraste"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Ángulo:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Foto/Vídeo"
+msgstr[1] "%d Fotos/Vídeos"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ningunha actividade"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Amosar o comentario de cada actividade"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Sen actividades"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Non se atopan actividades"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Actividades"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Sen data"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Cartafoles"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Fototeca"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importando..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Deter a importación"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Deter a importación de fotos"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Preparando para importar..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s importada"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Última importación"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importar do cartafol..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importar fotos desde o disco á fototeca"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importar desde _applicativo..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordenar as actividad_es"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Balei_rar o lixo"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Eliminar todas as fotos do lixo"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Ver a_ctividade por foto"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Buscar"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Buscar fotos e vídeos segundo un criterio"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "No_va busca gardada..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotos"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Ac_tividades"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Información _básica"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Amosar a información básica para a selección"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Información e_stendida"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Amosar a información estendida para a selección"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Barra de buscas"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Amosar a barra de buscas"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Barra _lateral"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Amosar a barra lateral"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importar desde cartafol"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Baleirar o lixo"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Baleirando o lixo..."
+
+#: ../src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell está configurado para importar fotos do seu cartafol persoal.\n"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Localización da fototeca"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Non é posíbel importar as fotos deste cartafol."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Actualizando a fototeca..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Preparando para importar automaticamente as fotos..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Importar automaticamente as fotos..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Escribir metadatos a ficheiros..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Ficheiros perdidos"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Eliminando..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Lixo"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "O lixo está baleiro"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Eliminar"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Eliminando fotos"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"A súa fototeca non é compatíbel con esta versión de Shotwell. Semella que "
+"fose creada por Shotwell %s (esquema %d). Esta versión é %s /esquema %d). "
+"Use a versión mais recente de Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell non puido actualizar a súa fototeca da versión %s (esquema %d) á %s "
+"(esquema %d). Para obter máis información consulte o Wiki de Shotwell en %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"A súa fototeca non é compatíbel con esta versión de Shotwell. Semella que "
+"fose creada por Shotwell %s (esquema %d). Esta versión é %s (esquema %d). "
+"Limpe a súa fototeca eliminando %s e volva a importar as fotos."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Produciuse un erro descoñecido ao tentar comprobar a base de datos do "
+"Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Cargando Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Ruta aos datos privados de Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "CARTAFOL"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Non facer un seguimento do cartafol da biblioteca en tempo de execución para "
+"buscar cambios."
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Non mostrar a pantalla de progreso ao inicio"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Amosar a versión do aplicativo"
+
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FICHEIRO]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Execute «%s --help» para ver a lista completa das opcións de liña de ordes "
+"dispoñíbeis.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baixa (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Media (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alta (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Máxima (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "En bruto (RAW)"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicación"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Preparando as fotos para envialas"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Enviando %d de %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "A publicación de %s no pode continuar porque se produciu un erro:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Para tentar publicar noutro servizo, seleccióneo no menú de enriba."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "As fotos/vídeos seleccionadas foron publicadas correctamente."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Os vídeos seleccionados foron publicados correctamente."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "As fotos seleccionadas foron publicadas correctamente."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "O vídeo seleccionado foi publicado correctamente."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "A foto seleccionada foi publicada correctamente."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Obtendo información da conta..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Accedendo a..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicar fotos"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicar fo_tos en:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicar vídeos"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicar vídeos e_n"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicar fotos e vídeos"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicar fo_tos e vídeos en"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Non foi posíbel publicar"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell non pode publicar os elementos seleccionados, xa que non ten "
+"activado ningún engadido de compatibilidade coa publicación Para corrixir "
+"isto, escolla en <b>Editar %s preferencias</b> e active un ou máis dos "
+"engadidos de publicación na lapela <b>Engadidos</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Búsquedas gardadas"
+
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contén"
+
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "é exactamente"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "empeza por"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "remata por"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "non contén"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "sen estabelecer"
+
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "é"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "non é"
+
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "calquera foto"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "unha foto raw"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "un vídeo"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "ten"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "non ten"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modificacións"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modificacións internas"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modificacións externas"
+
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "marcado"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "non marcado"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "e superior"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "só"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "e inferior"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "está despois"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "está antes"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "esta entre"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "e"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "calquera"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "todo"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ningunha"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Calquera texto"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Título"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Comentario"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nome do evento"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nome do arquivo"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipo multimedia"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Marca de estado"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Estado das fotos"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nova _etiqueta..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transicións do diaporama"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ningún)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ningún"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Ao chou"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Definir como diaporama de escritorio"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Xerar un diaporama de fondo de escritorio"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Amosar todas as fotos de "
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "período temporal"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Canto, de grande, se amosa unha foto no fondo de escritorio"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Búsqueda"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Nome da búsqueda:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Coincidencia"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "dos seguintes:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Tamaño da imaxe impresa</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Utilizar un tamaño e_stándar:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Utilizar un tamaño personalizado:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Coincidir a relación de aspecto da foto"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "Tamaño _automático"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Títulos</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Imprimir o _título da imaxe"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Píxeles de resolución</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Saída da foto en:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "píxeles por polgada"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Preferencias do Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "branco"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "negro"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Ver o cartafol da fototeca para os novos ficheiros"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metadatos"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Escribir etiquetas, títulos e outros _metadatos nos ficheiros das fotos"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Pantalla"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importar fotos de:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Fondo:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importando"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Estrutura do _directorio:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Patrón"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Exemplo:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "R_enomear os ficheiros importados en minúsculas"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Desenvolvedor RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "Pre_determinado:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "E_ditor de imaxes externo:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Editor _RAW externo:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Editores externos"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Engadidos"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Retardo:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Efecto de _transición:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "_Retardo de transición:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Amosar o t_itulo"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "segundos"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Acceso"
+
+#~ msgid ""
+#~ "You are logged into Tumblr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Accedeu a Tumblr como (name).\n"
+#~ "\n"
+#~ "(esta cadea de etiqueta completarase e estabelecerase o código, \n"
+#~ "polo que non se amosarán aquí os cambios)"
+
+#~ msgid ""
+#~ " (text depends on fb username and is modified in the app - \n"
+#~ "anything put into this field won't display)"
+#~ msgstr ""
+#~ " (o texto depende do nome de usuario de fb e é modificado polo aplicativo "
+#~ "- \n"
+#~ "calquera cousa que poña neste campo non se mostrará)"
+
+#~ msgid ""
+#~ "You are logged into Flickr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Accedeu a Flickr como (name).\n"
+#~ "\n"
+#~ "(esta cadea de etiqueta completarase e estabelecerase o código, \n"
+#~ "polo que non se amosarán aquí os cambios)"
+
+#~ msgid "_visibility label (populated in the code)"
+#~ msgstr "etiqueta de _visibilidade (completada no código)"
+
+#~ msgid ""
+#~ "'you are logged in as $name'\n"
+#~ "(populated in the application code)"
+#~ msgstr ""
+#~ "'Accedeu a $name'\n"
+#~ "(completada no código do aplicativo)"
+
+#~ msgid ""
+#~ "$mediatype will appear in\n"
+#~ "(populated in code)"
+#~ msgstr ""
+#~ "$mediatype aparecerá en \n"
+#~ "(completado en código)"
diff --git a/po/gu.po b/po/gu.po
new file mode 100644
index 0000000..a8a1030
--- /dev/null
+++ b/po/gu.po
@@ -0,0 +1,4551 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# sweta <swkothar@redhat.com>, 2013
+# sweta <swkothar@redhat.com>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2014-02-04 11:20+0000\n"
+"Last-Translator: Ankit Patel <ankit@redhat.com>\n"
+"Language-Team: Gujarati (http://www.transifex.com/projects/p/shotwell/"
+"language/gu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: gu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "ઘટના %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "કૅમેરા"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "કૅમેરા"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"કૅમેરાને અનમાઉન્ટ કરવાનું અસમર્થ. ફાઇલ સંચાલકમાંથી કૅમેરાને અનમાઉન્ટ કરવાનો પ્રયત્ન કરો."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "છુપાયેલ ફોટા પહેલેથી આયાત થયેલ છે"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "ફક્ત ફોટાને દર્શાવો કે જે આયાત કરી દેવામાં આવ્યુ નથી"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "આયાત કરવાનું શરૂ કરી રહ્યા છે, મહેરબાની કરીને રાહ જુઓ..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "શીર્ષક (_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "દરેક ફોટાનાં શીર્ષકને દર્શાવો"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "પસંદ થયેલનું આયાત કરો (_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "તમારી લાઇબ્રેરીમાં પસંદ થયેલ ફોટાને આયાત કરો"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "બધુ આયાત કરો (_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "તમારી લાઇબ્રેરીમાં બધા ફોટાને આયાત કરો"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell એ તેને વાપરવા માટે ક્રમમાં ફાઇલસિસ્ટમમાંથી કૅમેરાને અનમાઉન્ટ કરવાની જરૂર છે. "
+"ચાલુ રાખવુ છે?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "અનમાઉન્ટ (_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "મહેરબાની કરીને કૅમેરાને અનમાઉન્ટ કરો."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"કૅમેરા બીજા કાર્યક્રમ દ્દારા તાળુ મારેલ છે. Shotwell પણ કૅમેરાને વાપરી શકે છે જ્યારે તે તાળુ "
+"મારેલ ન હોય. મહેરબાની કરીને કૅમેરાની મદદથી કોઇપણ બીજા કાર્યક્રમને બંધ કરો અને ફરી "
+"પ્રયત્ન કરો."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "મહેરબાની કરીને કૅમેરાની મદદથી કોઇપણ બીજા કાર્યક્રમને બંધ કરો."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"કૅમેરામાંથી પૂર્વદર્શનને લાવવાનું અસમર્થ:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "અનમાઉન્ટ કરી રહ્યા છે..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ફોટો જાણકારીને લાવી રહ્યા છે"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s માટે પૂર્વદર્શનને લાવી રહ્યા છે"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "કૅમેરાને તાળુ મારવાનું અસમર્થ: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "શું કૅમેરામાંથી આ ફોટોને કાઢવુ છે?"
+msgstr[1] "શું કૅમેરામાંથી આ %d ફોટા કાઢવા છે?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "શું કૅમેરામાંથી આ વિડિયોને કાઢવુ છે?"
+msgstr[1] "શું કૅમેરામાંથી આ %d વિડિયોને કાઢવુ છે?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "શું કૅમેરામાંથી આ ફોટો/વિડિયોને કાઢવુ છે?"
+msgstr[1] "શું કૅમેરામાંથી આ %d ફોટા/વિડિયોને કાઢવુ છે?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "શું કૅમેરામાંથી આ ફાઇલોને કાઢવી છે?"
+msgstr[1] "શું કૅમેરામાંથી આ %d ફાઇલોને કાઢવી છે?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "રાખો (_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "કૅમેરામાંથી ફોટા/વિડિયોને દૂર કરી રહ્યા છે"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "ભૂલોને કારણે કૅમેરામાંથી %d ફોટો/વિડિયોને કાઢી નાંખવાનુ અસમર્થ."
+msgstr[1] "ભૂલોને કારણે કૅમેરામાંથી %d ફોટા/વિડિયોને કાઢી નાંખવાનુ અસમર્થ."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "તકતી પૂર્વદર્શન (_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "તકતી પૂર્વદર્શન ચલાવો"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ફોટા/વિડિયોને નિકાસ કરો"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ફોટા/વિડિયોની નિકાસ કરો"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ફોટોની નિકાસ કરો"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ફોટાની નિકાસ કરો"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ફેરવી રહ્યા છે"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "ફેરવવાનું કરી રહ્યા નથી"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "આડુ ફ્લિપ કરી રહ્યા છે"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "આડુ ફ્લિપ કરી રહ્યા નથી"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "ઊભુ ફ્લિપ કરી રહ્યા છે"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "ઊભુ ફ્લિપ કરી રહ્યા નથી"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "કોઇપણ લખાણ"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "શીર્ષક"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ટૅગ"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "ટિપ્પણી:"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ઘટના નામ"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ફાઇલ નામ"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "મીડિયા પ્રકાર"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ફ્લેગ સ્થિતિ"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "ફોટો સ્થિતિ"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "રેટીંગ"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "તારીખ"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "સમાવે છે"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "બરાબર છે"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ની સાથે શરૂ થાય છે"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ની સાથે અંત થાય છે"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "સમાવતુ નથી"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "સુયોજિત નથી"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "છે"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "નથી"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "કોઇપણ ફોટો"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "કાચો ફોટો"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "એક વિડિયો"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "પાસે છે"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "પાસે નથી"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "બદલાવો"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "આંતરિક બદલાવો"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "બહારનાં બદલાવો"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ફ્લેગ કરેલ છે"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ફ્લેગ થયેલ નથી"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "અને ઉચ્ચ"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "ફક્ત"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "અને નીચુ"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "પછી છે"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "પહેલાનું છે"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ની વચ્ચે છે"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "અને"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "કોઇપણ"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "બધા"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "કંઈ નહિં"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "સંગ્રહેલ શોધ"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "નવી સંગ્રહાયેલ શોધ (_w)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Shotwell ની આ આવૃત્તિ સાથે તમારા ફોટાની લાઇબ્રેરી સાથે સુસંગત નથી. તે Shotwell %s "
+"(schema %d) દ્દારા બનાવેલ છે તેવુ દેખાય છે. આ આવૃત્તિ %s (schema %d) છે. મહેરબાની "
+"કરીને Shotwell ની તાજેતરની આવૃત્તિને વાપરો."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell આવૃત્તિ %s (schema %d) થી %s (schema %d) તમારી ફોટો લાઇબ્રેરીને સુધારવા "
+"માટે અસમર્થ હતુ. વધારે જાણકારી માટે મહેરબાની કરીને %s પર Shotwell વિકીને ચકાસો"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"તમારી ફોટો લાઇબ્રેરી Shotwell ના આ આવૃત્તિ સાથે સુસંગત નથી. તે Shotwell %s (schema "
+"%d) દ્દારા બનેલ હતુ તેવુ દેખાય છે. આ આવૃત્તિ %s (schema %d) છે. મહેરબાની કરીને %s ને "
+"કાઢીને તમારી લાઇબ્રેરીને સાફ કરો અને તમારા ફોટાને પુન:આયાત કરો."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell નાં ડેટાબેઝને ચકાસવા માટે અજ્ઞાત ભૂલનો પ્રયત્ન કરી રહ્યા છે: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell લાવી રહ્યા છે"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell ની ખાનગી માહિતીનો પાથ"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ડિરેક્ટરી"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "ફેરફારો માટે રનટાઇમ વખતે લાઇબ્રેરી ડિરેક્ટરીને મોનિટર કરો નહિં"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "શરૂઆતી પ્રગતિ મિટર દર્શાવો નહિં"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "કાર્યક્રમની આવૃત્તિને બતાવો"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "ઉપલબ્ધ આદેશ વાક્ય વિકલ્પોની પૂર્ણ યાદીને જોવા માટે '%s --help' ચલાવો.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "આજે"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "ગઇકાલે"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "શીર્ષક:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "વસ્તુઓ:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ઘટના"
+msgstr[1] "%d ઘટનાઓ"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ફોટો"
+msgstr[1] "%d ફોટા"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d વિડિયો"
+msgstr[1] "%d વિડિયો"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "તારીખ:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "સમય:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "માંથી:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "માં:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "માપ:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "સમયગાળો:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f સેકંડ"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "ડેવલપર:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "પ્રદર્શન:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "સ્થાન:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ફાઇલ માપ:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "હાલનો વિકાસ:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "મૂળ પરિમાણો:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "કૅમેરા કરો:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "કૅમેરા મોડલ:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ફ્લેશ:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ફોકલ લંબાઈ:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "પ્રદર્શન તારીખ:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "પ્રદર્શન સમય:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "એક્સપોઝર બાએસ:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS અક્ષાંશ:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS રેખાંશ:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "કલાકાર:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "કોપીરાઇટ:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "સોફ્ટવેર:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "ટિપ્પણી:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "વિસ્તરેલ જાણકારી"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "આ એક ફોટોમાંથી ટેગ \"%s\" ને દૂર કરશે. ચાલુ રાખવુ છે?"
+msgstr[1] "આ ટેગ \"%s\" ને %d ફોટામાંથી દૂર કરશે. ચાલુ રાખવુ છે?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "રદ કરો (_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "કાઢી નાંખો (_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "આ સંગ્રહ થયેલ શોધ \"%s\" ને દૂર કરશે. ચાલુ રાખવુ છે?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "ડેવલપરને બદલવાથી બધા ફેરફારો પાછા આવશે તમે Shotwell માં આ ફોટોને બનાવેલ છે"
+msgstr[1] "ડેવલપરને બદલવાથી બધા ફેરફારો પાછા આવશે તમે Shotwell માં આ ફોટાને બનાવેલ છે"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ડેવલપરને બદલો (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "વિડિયો નિકાસ કરો"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell આ ફોટોને ફેરફાર કરવા માટે ફાઇલ બનાવી શક્યા નહિં કારણ કે તમારી પાસે %s માં "
+"લખવા માટે પરવાનગીઓ નથી."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ફાઇલ ભૂલને કારણે નીચેનાં ફોટોને નિકાસ કરવાનું અસમર્થ.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"શું તમે નિકાસ કરવાનું ચાલુ રાખવા માંગો છો?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "ચાલુ રાખો (_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "બદલાયેલ નથી"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "હાલનું"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "બંધારણ (_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "ગુણવત્તા (_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "સ્કેલિંગ અટકાયત (_S)"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " પિક્સેલ (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "મેટાડેટાની નિકાસ કરો"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "વિગતો સંગ્રહો..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "વિગતો સંગ્રહો"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(અને %d વધારે)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "પરિણામો અહેવાલની આયાત કરો"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ફાઇલને આયાત કરવાનો પ્રયત્ન થયેલ છે."
+msgstr[1] "%d ફાઇલોને આયાત કરવાનો પ્રયત્ન થયેલ છે."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "આમાંથી, %d ફાઇલ સફળતાપૂર્વક આયાત થયેલ હતી."
+msgstr[1] "આમાંથી, %d ફાઇલો સફળતાપૂર્વક આયાત થયેલ હતી."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "નકલી ફોટો/વિડિયો આયાત થયેલ નથી:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "હાલની મીડિયા વસ્તુને નકલ કરે છે"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ફોટો/વિડિયો કૅમેરા ભૂલોને કારણે આયાત થયેલ નથી:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "ભૂલ સંદેશો:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "ફાઇલો આયાત થયેલ નથી કારણ કે તેઓ ફોટા અથવા વિડિયો તરીકે ઓળખાયેલ ન હતુ:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "ફોટા/વિડિયો આયાત થયેલ નથી કારણ કે તેઓ બંધારણ Shotwell સમજમાં ન હતા:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"ફોટા/વિડિયો આયાત થયેલ નથી કારણ કે Shotwell એ તેની લાઇબ્રેરીમાં નકલ કરી શક્યા નહિં:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr " %s માં %s ની નકલ કરી શક્યા નહિં"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "ફોટા/વિડિયો આયાત થયેલ નથી કારણ કે ફાઇલો ભાંગેલ છે:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "ફોટા/વિડિયો બીજા કારણો માટે આયાત થયેલ નથી:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 નકલી ફોટો આયાત કર્યુ ન હતુ:\n"
+msgstr[1] "%d નકલી ફોટા આયાત કર્યુ ન હતુ:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 નકલી વિડિયોને આયાત કર્યુ ન હતુ:\n"
+msgstr[1] "%d નકલી વિડિયોને આયાત કર્યુ ન હતુ:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 નકલી ફોટો/વિડિયોને આયાત કર્યુ ન હતુ:\n"
+msgstr[1] "%d નકલી ફોટા/વિડિયોને આયાત કર્યુ ન હતુ:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે 1 ફોટો નિષ્ફળ:\n"
+msgstr[1] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે %d ફોટા નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે 1 વિડિયો નિષ્ફળ:\n"
+msgstr[1] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે %d વિડિયો નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે 1 ફોટો/વિડિયો નિષ્ફળ:\n"
+msgstr[1] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે %d ફોટા/વિડિયો નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે 1 ફાઇલ નિષ્ફળ:\n"
+msgstr[1] "ફાઇલ અથવા હાર્ડવેર ભૂલને કારણે આયાત કરતી વખતે %d ફાઇલો નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"આયાત કરતી વખતે 1 ફોટો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+msgstr[1] ""
+"આયાત કરતી વખતે %d ફોટા નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"આયાત કરતી વખતે 1 વિડિયો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+msgstr[1] ""
+"આયાત કરતી વખતે %d વિડિયો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"આયાત કરતી વખતે 1 ફોટો/વિડિયો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન "
+"હતુ:\n"
+msgstr[1] ""
+"આયાત કરતી વખતે %d ફોટો/વિડિયો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન "
+"હતુ:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"આયાત કરતી વખતે 1 ફાઇલ નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+msgstr[1] ""
+"આયાત કરતી વખતે %d ફાઇલો નિષ્ફળ કારણ કે ફોટો લાઇબ્રેરી ફોલ્ડર લખી શકાય તેમ ન હતુ:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "કૅમેરા ભૂલને કારણે 1 ફોટો આયાત કરવાનું નિષ્ફળ:\n"
+msgstr[1] "કૅમેરા ભૂલને કારણે %d ફોટા આયાત કરવાનું નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "કૅમેરા ભૂલને કારણે 1 વિડિયો આયાત કરવાનું નિષ્ફળ:\n"
+msgstr[1] "કૅમેરા ભૂલને કારણે %d વિડિયો આયાત કરવાનું નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "કૅમેરા ભૂલને કારણે 1 ફોટો/વિડિયો આયાત કરવાનું નિષ્ફળ:\n"
+msgstr[1] "કૅમેરા ભૂલને કારણે %d ફોટા/વિડિયો આયાત કરવાનું નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "કૅમેરા ભૂલને કારણે 1 ફાઇલને આયાત કરવાનું નિષ્ફળ:\n"
+msgstr[1] "કૅમેરા ભૂલને કારણે %d ફાઇલોને આયાત કરવાનું નિષ્ફળ:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 ફોટો આયાત કરવા માટે નિષ્ફળ કારણ કે તેઓ બગડેલ હતો:\n"
+msgstr[1] "%d ફોટા એ આયાત કરવા માટે નિષ્ફળ કારણ કે તેઓ બગડેલ હતા:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 વિડિયો આયાત કરવા માટે નિષ્ફળ કારણ તે બગડેલ હતો:\n"
+msgstr[1] "%d વિડિયો આયાત કરવા માટે નિષ્ફળ કારણ કે તે બગડેલ હતુ:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 ફોટો/વિડિયો એ આયાત કરવા નિષ્ફળ કારણ તે બગડેલ હતો:\n"
+msgstr[1] "%d ફોટા/વિડિયો આયાત કરવા માટે નિષ્ફળ કારણ કે તેઓ બગડેલ હતા:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 ફાઇલ આયાત કરવા માટે નિષ્ફળ કારણ કે તે બગડેલ હતી:\n"
+msgstr[1] "%d ફાઇલો આયાત કરવા માટે નિષ્ફળ કારણ કે તે બગડેલ હતી:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 બિનઆધારભૂત ફોટો છોડેલ છે:\n"
+msgstr[1] "%d બિનઆધારભૂત ફોટા છોડેલ છે:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 ઇમેજ વગરની ફાઇલ છોડેલ છે.\n"
+msgstr[1] "%d ઇમેજ વગરની ફાઇલો છોડેલ છે.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "વપરાશકર્તાને રદ કરવાને કારણે 1 ફોટો છોડેલ છે:\n"
+msgstr[1] "વપરાશકર્તાને રદ કરવાને કારણે %d ફોટો છોડેલ છે:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "વપરાશકર્તાને રદ કરવાને કારણે 1 વિડિયો છોડેલ છે:\n"
+msgstr[1] "વપરાશકર્તાને રદ કરવાને કારણે %d વિડિયો છોડેલ છે:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "વપરાશકર્તાને રદ કરવાને કારણે 1 ફોટો/વિડિયો છોડેલ છે:\n"
+msgstr[1] "વપરાશકર્તાને રદ કરવાને કારણે %d ફોટા/વિડિયો છોડેલ છે:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "વપરાશકર્તાને રદ કરવાને કારણે 1 ફાઇલ છોડેલ છે:\n"
+msgstr[1] "વપરાશકર્તાને રદ કરવાને કારણે %d ફાઇલ છોડેલ છે:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 ફોટો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+msgstr[1] "%d ફોટો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 વિડિયો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+msgstr[1] "%d વિડિયો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 ફોટો/વિડિયો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+msgstr[1] "%d ફોટા/વિડિયો સફળતાપૂર્વક આયાત થયેલ છે.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "ફોટા અથવા વિડિયો આયાત થયેલ નથી.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "આયાત સમાપ્ત"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d સેકંડ"
+msgstr[1] "%d સેકંડ"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d મિનિટ"
+msgstr[1] "%d મિનિટ"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d કલાક"
+msgstr[1] "%d કલાક"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 દિવસ"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "ઘટનાનું નામ બદલો"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "નામ:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "શીર્ષકમાં ફેરફાર કરો"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "ઘટના ટિપ્પણીમાં ફેરફાર કરો"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "ફોટા/વિડિયો ટિપ્પણીમાં ફેરફાર કરો"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "કચરાપેટી ફાઇલ (_T)"
+msgstr[1] "કચરાપેટી ફાઇલો (_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "ફક્ત દૂર કરો (_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "બહારનાં બદલાવને પાછુ લાવો?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "બહારનાં બદલાવોને પાછુ લાવો?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "આ બહારની ફાઇલમાં થયેલ બધા ફેરફારોને કાઢી નાંખશે. ચાલુ રાખવુ છે?"
+msgstr[1] "આ %d બહારની ફાઇલોમાં થયેલ બધા ફેરફારોને કાઢી નાંખશે. ચાલુ રાખવુ છે?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "બહારનાં બદલાવને પાછુ લાવો (_v)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "બહારનાં બદલાવોને પાછુ લાવો (_v)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "આ લાઇબ્રેરીમાંથી ફોટોને દૂર કરશે. ચાલુ રાખવા માંગો છો?"
+msgstr[1] "આ લાઇબ્રેરીમાંથી %d ફોટાને દૂર કરશે. ચાલુ રાખવા માંગો છો?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "દૂર કરો (_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "લાઇબ્રેરીમાંથી ફોટાને દૂર કરો"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "લાઇબ્રેરીમાંથી ફોટાને દૂર કરો"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "એજ સંખ્યા દ્દારા ફોટા/વિડિયોને ખસેડો (_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "આ સમયે બધા ફોટા/વિડિયોને સુયોજિત કરો (_a)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "મૂળ ફોટા ફાઇલને બદલો (_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "મૂળ ફોટા ફાઇલોને બદલો (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "મૂળ ફાઇલને બદલો (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "મૂળ ફાઇલોને બદલો (_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "મૂળ: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"એક્સપોઝર સમય પર આગળ ખસેડાયેલો કરશે\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"પ્રદર્શન સમય પર પાછળ ખસેડાયેલો કરશે\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "દિવસ"
+msgstr[1] "દિવસો"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "કલાક"
+msgstr[1] "કલાક"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "મિનિટ"
+msgstr[1] "મિનિટ"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "સેકંડ"
+msgstr[1] "સેકંડ"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"અને %d બીજુ."
+msgstr[1] ""
+"\n"
+"\n"
+"અને %d બીજા."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "ટૅગ (અવતરણ ચિહ્ન દ્દારા અલગ થયેલ છે):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "સ્વાગત!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell માં સ્વાગત છે!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "શરૂ કરવા માટે, કોઇપણ રીતે ફોટાને આયાત કરો:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">ફોલ્ડરમાંથી ફાઇલ %s આયાત કરો</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Shotwell વિન્ડોમાં ફોટાને ડ્રેગ અને ડ્રોપ કરો"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "તમારા કમ્પ્યૂટરમાં કૅમેરાને જોડો અને આયાત કરો"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "તમારા %s ફોલ્ડરમાંથી ફોટાને આયાત કરો (_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "તમે કોઇપણ રીતે ફોટાને પણ આયાત કરી શકો છો:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ફરી આ સંદેશાને બતાવો નહિં (_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "તમારી %s લાઇબ્રેરીમાંથી ફોટાને આયાત કરો"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(મદદ)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "વર્ષ%sમહિનો%sદિવસ"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "વર્ષ%sમહિનો"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "વર્ષ%sમહિનો-દિવસ"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "વર્ષ-મહિનો-દિવસ"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "વૈવિધ્ય"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "અયોગ્ય ભાત"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell તમારા લાઇબ્રેરી ફોલ્ડરમાં ફોટાને નકલ કરી શકો છો અથવા તે નકલ કર્યા વગર તેઓને "
+"આયાત કરી શકે છે."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ફોટાની નકલ કરો (_p)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "સ્થાનમાં આયાત કરો (_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "લાઇબ્રેરીમાં આયાત કરો"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "લાઇબ્રેરીમાંથી દૂર કરો"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "લાઇબ્રેરીમાંથી ફોટો દૂર કરી રહ્યા છે"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "લાઇબ્રેરીમાંથી ફોટાને દૂર કરી રહ્યા છે"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી ફોટો/વિડિયો દૂર કરશે. શું તમે તમારી ડેસ્કટોપ "
+"કચરાપેટીમાં ફાઇલને ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+msgstr[1] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી %d ફોટા/વિડિયો દૂર કરશે. શું તમે તમારી ડેસ્કટોપ "
+"કચરાપેટીમાં ફાઇલને ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી વિડિયો દૂર કરશે. શું તમે તમારી ડેસ્કટોપ કચરાપેટીમાં "
+"ફાઇલને ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+msgstr[1] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી %d વિડિયો દૂર કરશે. શું તમે તમારી ડેસ્કટોપ કચરાપેટીમાં "
+"ફાઇલને ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી ફોટો દૂર કરશે. શું તમે તમારી ડેસ્કટોપ કચરાપેટીમાં ફાઇલને "
+"ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+msgstr[1] ""
+"આ તમારી Shotwell લાઇબ્રેરીમાંથી %d ફોટા દૂર કરશે. શું તમે તમારી ડેસ્કટોપ કચરાપેટીમાં "
+"ફાઇલને ખસેડવા માંગો છો?\n"
+"\n"
+"આ ક્રિયાને પૂર્ણ કરી શકાતી નથી."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ફોટો અથવા વિડિયો તમારી ડેસ્કટોપ કચરાપેટીમાં ખસેડી શકાતુ નથી. શું આ ફાઇલને કાઢી નાંખવી "
+"છે?"
+msgstr[1] ""
+"%d ફોટા અથવા વિડિયો તમારી ડેસ્કટોપ કચરાપેટીમાં ખસેડી શકાતુ નથી. શું આ ફાઇલોને કાઢી "
+"નાંખવી છે?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ફોટો અથવા વિડિયો કાઢી શકાતો નથી."
+msgstr[1] "%d ફોટા અથવા વિડિયો કાઢી શકાતા નથી."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "ફોલ્ડરો"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ટૅગ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "સફળતા"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ફાઇલ ભૂલ"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ફાઇલનું ડિકોડ કરવાનુ અસમર્થ"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ડેટાબેઝ ભૂલ"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "વપરાશકર્તા નિરસ્ત આયાત"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ફાઇલ નથી"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ફાઇલ ડેટાબેઝમાં પહેલેથી અસ્તિત્વમાં છે"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "બિનઆધારભૂત ફાઇલ બંધારણ"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ઇમેજ ફાઇલ નથી"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ડિસ્ક નિષ્ફળતા"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ડિસ્ક પૂર્ણ"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "કૅમેરા ભૂલ"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ફાઇલ લખાણ ભૂલ"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "ભાંગેલ ઇમેજ ફાઇલ"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "આયાત કરવાનું નિષ્ફળ (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "બદલેલ"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "પહેલાંનો ફોટો"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "આગળનો ફોટો"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ફોટો સ્ત્રોત ફાઇલ ગુમ થયેલ છે: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "દૃશ્ય (_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "સાધનો (_o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "પહેલાંનો ફોટો (_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "પહેલાંનો ફોટો"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "આગળનો ફોટો (_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "આગળનો ફોટો"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "મોટુ કરો (_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ફોટોને વિસ્તૃત કરવાનું વધારો"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "નાનું કરો (_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ફોટોને વિસ્તૃત કરવાનું ઘટાડો"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "પાનામાં બંધબેસાડો (_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "સ્ક્રીન પર બંધબેસાડવા માટે ફોટાને નાનુમોટુ કરો"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "100% જેટલુ મોટુ કરો (_1)"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ફોટો 100% જેટલો વિસ્તૃત કરો"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "200% જેટલુ મોટુ કરો (_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ફોટો 200% જેટલો વિસ્તૃત કરો"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ડેવલપર (_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s નું નિકાસ કરવાનુ અસમર્થ: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ડેટાબેઝ"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s માંથી આયાત કરવાનું ચાલુ રાખી શકાતુ નથી કારણ કે ભૂલ ઉદ્ભવી:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "બીજી સેવામાંથી આયાત કરવાનુ પ્રયત્ન કરવા માટે, ઉપર મેનુમાંથી એકને પસંદ કરો."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "મહિતી આયાત કરે છે"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"તમારી પાસે સક્રિય થયેલ કોઇપણ માહિતી આયાત પ્લગઇન નથી.\n"
+"\n"
+"કાર્યક્રમ કાર્યક્ષમતામાંથી આયાતને વાપરવા ક્રમમાં, તમારી પાસે સક્રિય થયેલ ઓછામાં ઓછી એક "
+"માહિતી આયત પ્લગઇન હોવુ જરૂર છે. પ્લગઇન પસંદગીઓમાં સક્રિય કરી શકાય છે."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ડેટાબેઝ ફાઇલ:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "આયાત કરો (_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "કાર્યક્રમમાંથી આયાત કરો"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "તેમાંથી મીડિયાને આયાત કરો (_f):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "બંધ કરો (_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "સુયોજનો"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "તકતી પૂર્વદર્શન"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "પાછળ"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "પહેલાનાં ફોટામાં જાવ"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "અટકાવો"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "તકતી પૂર્વદર્શન અટકાવો"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "આગળ"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "આગળનાં ફોટામાં જાવ"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "તકતી પૂર્વદર્શન સુયોજનો બદલો"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "બધા ફોટાની સ્ત્રોત ફાઇલો ગેરહાજર છે."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "વગાડો"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "તકતી પૂર્વદર્શનને ચાલુ રાખો"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "પાછુ લાવી રહ્યા છે"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "પાછુ લાવી રહ્યા નથી"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "વધારી રહ્યા છે"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "વધારવાનું કરી રહ્યા નથી"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "રંગ ટ્રાન્સફોર્મેશનને લાગુ કરી રહ્યા છે"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "રંગ ટ્રાન્સફોર્મેશન કરી રહ્યા નથી"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "નવી ઘટના બનાવી રહ્યા છે"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ઘટના દૂર કરી રહ્યા છે"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "નવી ઘટનામાં ફોટાને ખસેડી રહ્યા છે"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "પહેલાંની ઘટનામાં ફોટાને સુયોજિત કરી રહ્યા છે"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "ભેગુ કરી રહ્યા છે"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "ભેગુ કરી રહ્યા નથી"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ફોટાની નકલ કરી રહ્યા છે"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "નકલ થયેલ ફોટાને દૂર કરી રહ્યા છે"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ભૂલને કારણે એક ફોટોનું નકલ કરવાનું અસમર્થ"
+msgstr[1] "ભૂલોને કારણે %d ફોટાને નકલ કરવાનું અસમર્થ"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "પહેલાંના રેટીંગને પુન:સંગ્રહી રહ્યા છે"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "રેટીંગને વધારી રહ્યા છે"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "રેટીંગને ઘટાડી રહ્યા છે"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW ડેવલપરને સુયોજિત કરી રહ્યા છે"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "પહેલાનાં RAW ડેવલપરને પુન:સંગ્રહી રહ્યા છે"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "ડેવલપર સુયોજિત કરો"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "મૂળ ફોટાને વ્યવસ્થિત કરી શક્યા નહિં."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "તારીખ અને સમયને ગોઠવી રહ્યા છે"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "તારીખ અને સમય ગોઠવણીને કરી રહ્યા નથી"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "એક મૂળભૂત ફોટોને ગોઠવી શક્યા નહિં."
+msgstr[1] "એક મૂળભૂત ફોટાને ગોઠવી શક્યા નહિં."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "સમયને સંચાલિત કરતી વખતે ભૂલ"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "સમય ગોઠવણી નીચેની ફોટો ફાઇલ પર પૂર્ણ કરી શક્યા નહિં."
+msgstr[1] "સમય ગોઠવણી નીચેની ફોટો ફાઇલો પર પૂર્ણ કરી શક્યા નહિં."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ટૅગ બનાવો"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "ટૅગ \"%s\" ખસેડો"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "કચરાપેટીમાં ફોટો ખસેડો"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "કચરાપેટીમાંથી ફોટો પુન:સંગ્રહો"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Shotwell કચરાપેટીમાં ફોટા ખસેડો"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Shotwell લાઇબ્રેરીમાંથી પાછા ફોટાને પુન:સંગ્રહો"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "કચરાપેટીમાં ફોટા ખસેડી રહ્યા છે"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "કચરાપેટીમાંથી ફોટાને પુન:સંગ્રહી રહ્યા છે"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "પસંદ થયેલ ફોટાનો ફ્લેગ"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "પસંદ થયેલ ફોટાને ફ્લેગ કરો નહિં"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "ફ્લેગીંગ પસંદ થયેલ ફોટા"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "ફ્લેગીંગ ન હોય તેવા પસંદ થયેલ ફોટા"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "ફ્લેગ"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "ફ્લેગ કરો નહિં"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "નીચુ (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "મધ્ય (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "ઉચ્ચ (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "મહત્તમ (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "ફોટો/વિડિયો નથી"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "ફોટો/વિડિયો મળ્યો નથી"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ફોટા આ ડિરેક્ટરીમાં નિકાસ કરી શકાતા નથી."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "મોનિટરીંગ સુધારાને પ્રક્રિયા કરવાનું અસમર્થ: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "આખા પાનાંને ભરો"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "પૃષ્ઠ દીઠ 2 ઇમેજો"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "પૃષ્ઠ દીઠ 4 ઇમેજો"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "પૃષ્ઠ દીઠ 6 ઇમેજો"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "પૃષ્ઠ દીઠ 8 ઇમેજો"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "પૃષ્ઠ દીઠ 16 ઇમેજો"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "પૃષ્ઠ દીઠ 32 ઇમેજો"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "વોલેટ (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "નોટકાર્ડ (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "મેટ્રીક વોલેટ (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "પોસ્ટકાર્ડ (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ઇમેજ સુયોજનો"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "છાપી રહ્યા છે..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ફોટાને છાપવાનું અસમર્થ:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ફોટો ડેટાબેઝ %s ને ખોલવાનું/બનાવવાનું અસમર્થ: ભૂલ કોડ %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ફોટો ડેટાબેઝ ફાઇલમાં લખવાનું અસમર્થ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ડેટાબેઝ ફાઇલને વાપરી રહ્યા હોય ત્યારે ભૂલ:\n"
+" %s\n"
+"\n"
+"ભૂલ હતી: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "વિડિયો નિકાસ કરો"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus તેમાં મોકલો શરૂ કરવાનું અસમર્થ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "માં મોકલો"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s માં પાશ્ર્વભાગનું નિકાસ કરવાનું અસમર્થ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ડેસ્કટોપ તકતીપૂર્વદર્શનની તૈયારી કરવાનું અસમર્થ: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "ફ્લેગ કરેલ"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "કચરાપેટી"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "કચરાપેટી ખાલી છે"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "કાઢી નાંખો"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ફોટા કાઢી રહ્યા છે"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "ગુમ થયેલ ફાઇલો"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "કાઢી રહ્યા છે..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "છેલ્લે આયત કરેલુ"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ફોલ્ડરમાંથી આયાત કરો (_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "લાઇબ્રેરીમાં ડિસ્કમાંથી ફોટાને આયાત કરો"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "કાર્યક્રમમાંથી આયાત કરો (_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "ઘટનાઓને ક્રમમાં કરો (_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ખાલી કચરાપેટી (_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "કચરાપેટીમાં બધા ફોટાને કાઢી નાંખો"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ફોટો માટે ઘટનાને દર્શાવો (_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "શોધો (_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "શોધ દ્દારા ફોટા અને વિડિયોને શોધો"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ફાઇલ (_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "ફેરફાર (_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "ફોટો (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ફોટા (_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ઘટના (_t)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ટૅગ (_g)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "મદદ (_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "મૂળભૂત જાણકારી (_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "પસંદગી માટે મૂળભૂત જાણકારીને દર્શાવો"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "વિસ્તરેલ જાણકારી (_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "પસંદગી માટે મૂળભૂત જાણકારીને દર્શાવો"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "શોધ પટ્ટી (_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "શોધ પટ્ટીને દર્શાવો"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "બાજુપટ્ટી (_i)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "બાજુપટ્ટીને દર્શાવો"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "ઉતરતા ક્રમમાં (_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "ચઢતા ક્રમમાં ફોટાને ક્રમમાં કરો"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "ઉતરતા ક્રમમાં (_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "ઉતરતા ક્રમમાં ફોટાને ક્રમમાં કરો"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ફોલ્ડરમાંથી આયાત કરો"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ખાલી કચરાપેટી"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "કચરાપેટીને ખાલી કરી રહ્યા છે..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "તમારી ઘર ડિરેક્ટરીમાં ફોટાને આયાત કરવા માટે Shotwell ને રૂપરેખાંકિત થયેલ છે.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "લાઇબ્રેરી સ્થાન"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ફોટા આ ડિરેક્ટરીમાંથી આયાત કરી શકાતા નથી."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "લાઇબ્રેરીને સુધારી રહ્યા છે..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "ફોટાને સ્વયં આયાત કરવાની તૈયારી કરી રહ્યા છે..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "ફોટાને સ્વયં આયાત કરી રહ્યા છે..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "ફાઇલોમાં મેટાડેટાને લખી રહ્યા છે..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "લાઇબ્રેરી"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "આયાત કરી રહ્યા છે..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "આયાત કરવાનું બંધ કરો (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ફોટાને આયાત કરવાનુ બંધ કરો"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "આયાત કરવા માટે તૈયારી કરી રહ્યા છે..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "આયાત થયેલ %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "સંગ્રહો (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ફોટો સંગ્રહો"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "આ તરીકે સંગ્રહો (_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "વિવિધ નામ સાથે ફોટો સંગ્રહો"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "તમારા કમ્પ્યૂટરમાં જોડાયેલ પ્રિન્ટરમાંથી ફોટાને છાપો"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s અસ્તિત્વ ધરાવતુ નથી."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ફાઇલ નથી."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ફાઇલ બંધારને આધાર આપતુ નથી\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "નકલને સંગ્રહો (_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "શું %s પર બદલાવોને ગુમાવવા માંગો છો?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "સંગ્રહ કર્યા વગર બંધ કરો (_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "ભૂલ જ્યારે %s માં સંગ્રહી રહ્યા હોય: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "આ તરીકે સંગ્રહો"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s ને મોનિટર કરવાનું અસમર્થ: ડિરેક્ટરી નથી (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ફોટો સંચાલક"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ફોટો દર્શક"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "જમણે ફેરવો (_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "ફેરવો"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "જમણે ફેરવો"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "જમણે ફોટાને ફેરવો (ડાબે ફેરવવા માટે Ctrl ને દબાવો)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "ડાબે ફેરવો (_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "ડાબે ફેરવો"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ફોટો ડાબે ફેરવો"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "આડુ ફ્લિપ કરો (_z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "આડુ ફ્લિપ કરો"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "ઊભુ ફ્લિપ કરો (_c)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "ઊભુ ફ્લિપ કરો"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "વધારો (_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "વધારો"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "આપમેળે ફોટાનાં દેખાવને સુધારો"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "રંગ ગોઠવણીની નકલ કરો (_C)"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "રંગ ગોઠવણીની નકલ કરો"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "ફોટોમાં લાગુ થયેલ રંગ ગોઠવણીની નકલ કરો"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "રંગ ગોઠવણીને ચોંટાડો (_P)"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "રંગ ગોઠવણીને ચોંટાડો"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "પસંદ થયેલ ફોટોમાં નકલ થયેલ રંગ ગોઠવણીને લાગુ કરો"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "કાપો (_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "કાપો"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ફોટાનું માપ કાપો"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "સીધુ થવું (_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "સીધુ થવું"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "ફોટાને સીધો કરો"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "લાલ-આંખ (_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "લાલ-આંખ"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ફોટોમાં કોઇપણ લાલ-આંખ અસરોને ઘટાડો અથવા કાઢી નાંખો"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "ગોઠવો (_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "ગોઠવો"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ફોટાનો રંગ અને ટોનને ગોઠવો"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "મૂળભૂતમાં પાછા લાવો (_v)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "મૂળભૂતમાં પાછુ લાવો"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "બહારનાં બદલાવોને પાછા લાવો (_d)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "મૂખ્ય ફોટોમાં પાછા લાવો"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ડેસ્કટોપ પાશ્ર્વભાગ તરીકે સુયોજિત કરો (_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "નવાં ડેસ્કટોપ પાશ્ર્વભાગમાં પસંદ થયેલ ઇમેજને સુયોજિત કરો"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "ડેસ્કટોપ પૂર્વદર્શન તરીકે સુયોજિત કરો (_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "પાછુ લાવો (_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "પાછું લાવો"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "ફરી શરૂ કરો (_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "ફરી શરૂ કરો"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "ઘટનાનું નામ બદલો (_n)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "ઘટના માટે મૂખ્ય ફોટો બનાવો (_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "ઘટના માટે મૂખ્ય ફોટો બનાવો"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "નવી ઘટના (_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "નવી ઘટના"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ફોટા ખસેડો"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ઘટનામાં ફોટા ખસેડો"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ઘટનાંને ભેગુ કરો (_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "ભેગુ કરો"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "એકજ ઘટનામાં ઘટાઓને ભેગી કરો"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "રેટીંગ સુયોજિત કરો (_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "રેટીંગ સુયોજિત કરો"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "તમારા ફોટાનું રેટીંગ બદલો"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "વધારો (_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "રેટીંગ વધારો"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "ઘટાડો (_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "રેટીંગ ઘટાડો"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "રેટ થયેલ નથી (_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "રેટ થયેલ નથી"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "રેટ થયેલ નથી"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "રેટ ન થયેલ હોય તે રીતે સુયોજિત કરો"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "કોઇપણ રેટીંગને દૂર કરો"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "રદ થયેલ (_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "રદ થયેલ"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "રેટ રદ થયેલ છે"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "રદ થયેલ છે તે રીતે સુયોજિત કરો"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "રદ કરવા રેટીંગને સુયોજિત કરો"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "ફક્ત રદ થયેલ છે (_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "ફક્ત રદ થયેલ છે"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "ફક્ત રદ થયેલ ફોટાને બતાવો"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "બધા + રદ થયેલ છે (_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "બધા ફોટાને બતાવો, રદ થયેલને પણ સમાવી રહ્યા છે"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "બધા ફોટા (_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "બધા ફોટા બતાવો"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "રેટીંગ (_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "દરેક ફોટાનું રેટીંગ દર્શાવો"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ફિલ્ટર ફોટા (_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ફિલ્ટર ફોટા"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "ફિલ્ટર પર આધારિત દર્શાવેલ ફોટાની સંખ્યાને મર્યાદિત કરો"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "નકલ કરો (_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "નકલ"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ફોટાની નકલ બનાવો"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "નિકાસ કરો (_E)"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "છાપો (_P)..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "પ્રકાશિત કરો (_b)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "પ્રકાશિત કરો"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "વિવિધ વેબસાઇટમાં પ્રકાશિત કરો"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "શીર્ષકમાં ફેરફાર કરો (_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "ટિપ્પણીમાં ફેરફાર કરો (_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "ટિપ્પણીમાં ફેરફાર કરો"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "ઘટના ટિપ્પણીમાં ફેરફાર કરો (_C)..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "તારીખ અને સમયને ગોઠવો (_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "તારીખ અને સમય ગોઠવો"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "ટૅગ ઉમેરો (_T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "ટૅગ ઉમેરો (_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "ટૅગ ઉમેરો"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "પસંદગીઓ (_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "બહારનાં સંપાદક સાથે ખોલો (_x)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW સંપાદક સાથે ખોલો (_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "માં મોકલો (_T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "માં મોકલો (_o)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "શોધો (_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "શોધો"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "લખાણને ટાઇપ કરીને ઇમેજને શોધો કે જે તેનાં નામ અથવા ટેગમાં દેખાય છે"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "ફ્લેગ (_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "ફ્લેગ કરો નહિં (_f)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "સંપાદકને શરૂ કરવાનુ અસમર્થ: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "ટૅગ \"%s\" ઉમેરો"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "ટૅગ \"%s\" અને \"%s\" ને ઉમેરો"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "ટૅગ \"%s\" ને કાઢી નાંખો (_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "ટૅગ \"%s\" ને કાઢી નાંખો"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ટૅગને કાઢી નાંખો"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "નવું (_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "ટૅગ \"%s\" નું નામ બદલો (_n)..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" માં ટેગ \"%s\" નું નામ બદલો"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "નામ બદલો (_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ટૅગને બદલો (_y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "ટૅગ બદલો"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "\"%s\" તરીકે ટૅગ ફોટો"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "\"%s\" તરીકે ટૅગ ફોટા"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "\"%s\" તરીકે પસંદ થયેલ ફોટોને ટૅગ કરો"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "\"%s\" તરીકે પસંદ થયેલ ફોટાને ટૅગ કરો"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ફોટામાંથી ટૅગ \"%s\" ને દૂર કરો (_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ફોટામાંછી ટૅગ \"%s\" ને દૂર કરો (_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ફોટોમાંથી ટૅગ \"%s\" ને દૂર કરો"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ફોટામાંથી ટૅગ \"%s\" ને દૂર કરો"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "\"%s\" માં ટેગનું નામ બદલવાનુ અસમર્થ કારણ કે ટેગ પહેલેથી અસ્તિત્વમાં છે. "
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "\"%s\" માં શોધનુ નામ બદલવાનું અસમર્થ કારણ કે શોધ પહેલેથી અસ્તિત્વ ધરાવે છે."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "સંગ્રહ થયેલ શોધ"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "શોધ કાઢી નાંખો"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "ફેરફાર (_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "નામ બદલો (_n)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" માં શોધ \"%s\" નું નામ બદલો"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "શોધ \"%s\" કાઢી નાંખો"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "રેટ %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "%s માં રેટીંગ સુયોજિત કરો"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s માં રેટીંગને સુયોજિત કરી રહ્યા છે"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s દર્શાવો"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s નાં રેટીંગ સાથે ફક્ત ફોટાને બતાવો"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s અથવા વધારે સારુ"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s ને દર્શાવો અથવા વધારે સારું"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s નાં રેટીંગ અથવા સારામાં સારા સાથે ફક્ત ફોટાને બતાવો"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "કચરાપેટીમાંથી પસંદ થયેલ ફોટાને દૂર કરો"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "લાઇબ્રેરીમાંથી પસંદ થયેલ ફોટાને દૂર કરો"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "પુન:સંગ્રહ કરો (_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "લાઇબ્રેરીમાં પાછા પસંદ થયેલ ફોટાને ખસેડો"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ફાઇલ સંચાલકમાં બતાવો (_g)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ફાઇલ સંચાલકમાં પસંદ થયેલ ફોટાની ડિરેક્ટરીને ખોલો"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ફાઇલ સંચાલકમાં ખોલવાનુ અસમર્થ: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "લાઇબ્રેરીમાંથી દૂર કરો (_e)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "કચરાપેટીમાં ખસેડો (_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "બધુ પસંદ કરો (_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "બધી વસ્તુઓને પસંદ કરો"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "ખૂણો:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "પુન:સુયોજિત કરો (_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "હાલનાં ફોટો પરિમાણમાં પાછા જાવ"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "આ ફોટાને કાપવાનું સુયોજિત કરો"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "પોર્ટ્રેઇટ અને લેન્ડસ્કેપ ઓરિએન્ટેશન વચ્ચે કાપેલ ચોરસને પિવોટ કરો"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "સંકોચાયેલ નથી"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "ચોરસ"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "સ્ક્રીન"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "મૂળભૂત માપ"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD વિડિયો (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD વિડિયો (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "લાલ-આંખ સાધનને બંધ કરો"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "પસંદ થયેલ વિસ્તારમાં કોઇપણ લાલ-આંખ અસરોને દૂર કરો"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "સંતૃપ્ત (~S):"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "રંગભેદ:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "તાપમાન:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "પડછાયો:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr " પ્રકાશિત:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "રંગોને પુન:સુયોજિત કરો"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "મૂળભૂતમાં બધા રંગ ગોઠવણીને પુન:સુયોજિત કરો"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "તાપમાન"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "રંગભેદ"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "સંતૃપ્ત"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "પ્રદર્શન"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "પડછાયો"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr " પ્રકાશિત"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "કોન્ટ્રાસ્ટ વિસ્તરણ"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Pin સાધનપટ્ટી"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ખુલ્લી સાધનપટ્ટીને લગાવો"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "પૂર્ણસ્ક્રીન છોડો"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "પૂર્ણસ્ક્રીન છોડો (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "બહાર નીકળો (_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "વિશે (_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "પૂર્ણસ્ક્રીન (_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "સમાવિષ્ટો (_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "વારંવાર પૂછાતા પ્રશ્નો (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "સમસ્યાનો અહેલાવ કરો (_R)"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"ફેટલ ભૂલ ઉદ્ભવી જ્યારે Shotwell ની લાઇબ્રેરીને વાપરી રહ્યા હોય. Shotwell ને ચાલુ રાખી "
+"શકાતુ નથી.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba વેબ સાઇટની મુલાકાત લો"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Sweta Kothari <swkothar@redhat.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "મદદને દર્શાવવાનું અસમર્થ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ભૂલ ડેટાબેઝનું પરિવહન કરવાનું અસમર્થ: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ ને દર્શાવવાનું અસમર્થ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "શીર્ષક વગરનું"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "મૂળભૂત માપ"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "પહોળાઇ અથવા ઊંચાઇ"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "પહોળાઇ"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ઊંચાઇ"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "થમ્ભનેઇલનું માપ ગોઠવો"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "શમ્ભનેઇલનું વિસ્તૃતીકરણ વધારો"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "થમ્ભનેઇલનું વિસ્તૃતીકરણ ઘટાડો"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ફોટાને ક્રમમાં કરો (_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "વિડિયો વગાડો (_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "સિસ્ટમ વિડિયો પ્લેયરમાં પસંદ થયેલ વિડિયોને ખોલો"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "ટિપ્પણી (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "દરેક ફોટોની ટિપ્પણીને દર્શાવો"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "દરેક ફોટાનાં ટૅગને દર્શાવો"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "શીર્ષક પ્રમાણે (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "શીર્ષક દ્દારા ફોટા ક્રમમાં ગોઠવો"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "પ્રદર્શન તારીખ દ્દારા (_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "પ્રદર્શન તારીખ દ્દારા ફોટાને ક્રમમાં કરો"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "રેટીંગ દ્દારા (_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "રેટીંગ દ્દારા ફોટાને ક્રમમાં કરો"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell પસંદ થયેલ વિડિયોને વગાડવામાં અસમર્થ હતી:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ફોટો/વિડિયો"
+msgstr[1] "%d ફોટો/વિડિયો"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "દરેક ઘટનાની ટિપ્પણીને દર્શાવો"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ઘટના નથી"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ઘટના મળી નથી"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ઘટના"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "સુધારેલ"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "ઘટના નથી"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "કેશ ડિરેક્ટરી %s ને બનાવવાનું અસમર્થ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "માહિતી ડિરેક્ટરી %s ને બનાવવાનું અસમર્થ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ચિત્રો"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "કામચલાઉ ડિરેક્ટરી %s ને બનાવવાનું અસમર્થ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "માહિતી ઉપડિરેક્ટરી %s ને બનાવવાનું અસમર્થ: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(કંઈ નહિં)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "કંઇ નહિં"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "અવ્યવસ્થિત"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "તકતીપૂર્વદર્શન અનુવાદ"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s માં કામચલાઉ ફાઇલને ઉત્પન્ન કરવાનું અસમર્થ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "નિકાસ કરી રહ્યા છે"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ફાઇલ %s પહેલેથી અસ્તિત્વમાં છે. બદલવાની છે?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "છોડો (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "બદલો (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "બધુ બદલો (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "નિકાસ"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ફોટો"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "વિડિયો"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ફોટા"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ફોટા"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ફાઇલ %s ને લાવી રહ્યા હોય ત્યારે ભૂલ: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "પ્રકાર"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "પ્રકાશિત કરી રહ્યા છે"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "પસંદ થયેલ ફોટા/વિડિયોને સફળતાપૂર્વક પ્રકાશિત કરેલ હતુ."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "પસંદ થયેલ વિડિયો સફળતાપૂર્વક પ્રકાશિત થયેલ છે."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "પસંદ થયેલ ફોટા સફળતાપૂર્વક પ્રકાશિત થયેલ છે."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "પસંદ થયેલ વિડિયો સફળતાપૂર્વક પ્રકાશિત થયેલ છે."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "પસંદ થયેલ ફોટો સફળતાપૂર્વક પ્રકાશિત થયેલ છે."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ખાતા જાણકારીને લાવી રહ્યા છે..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "પ્રવેશી રહ્યા છે..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ફોટાને પ્રકાશિત કરો"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "તેમાં ફોટાને પ્રકાશિત કરો (_t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "વિડિયોને પ્રકાશિત કરો"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "તેમાં વિડિયોને પ્રકાશિત કરો (_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ફોટા અને વિડિયોને પ્રકાશિત કરો"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "તેમાં ફોટા અને વિડિયોને પ્રકાશિત કરો (_t)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "પ્રકાશિત કરવાનું અસમર્થ"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell પસંદ થયેલ વસ્તુઓને પ્રકાશિત કરી શકતુ નથી કારણ કે તમારી પાસે સક્રિય થયેલ સુસંગત "
+"પ્રકાશિત પ્લગઇન નથી. આને સુધારવા માટે, <b>ફેરફાર %s પસંદગીઓ</b> ને પસંદ કરો અને "
+"<b>પ્લગઇન</b> ટૅબ પર પ્રકાશિત પ્લગઇનનાં એક અથવા વધારેને સક્રિય કરો.."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "અપલોડ કરવા માટે તૈયારી કરી રહ્યા છે"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d નાં %d ને અપલોડ કરી રહ્યા છે"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s ને પ્રકાશિત કરવાનું ચાલુ રાખી શકાતુ નથી કારણ કે ભૂલ ઉદ્ભવી:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "બીજી સેવામાં પ્રકાશિત કરવાનું પ્રયત્ન કરવા માટે, ઉપર મેનુંમાંથી એકને પસંદ કરો."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "નવો ટૅગ (_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "પ્રકાશિત કરવા માટે જરૂરી કામચલાઉ ફાઇલ બિનઉપલબ્ધ નથી"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"તમે પહેલેથી આ Shotwell સત્ર દરમ્યાન Google સેવામાં પ્રવેશેલ અને બહાર નીકળેલ છે.\n"
+"\n"
+"Google સેવાઓમાં પ્રકાશિત કરવાનું ચાલુ રાખવા માટે, Shotwell માંથી બહાર નીકળો અને પુન:શરૂ "
+"કરો, પછી ફરી પ્રકાશિત કરવાનો પ્રયત્ન કરો."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"તમે હાલમાં YouTube માં પ્રવેશેલ નથી.\n"
+"\n"
+"તમારે પહેલેથી Google ખાતા માટે પ્રવેશવુ જ જોઇએ અને ચાલુ રાખવા માટે YouTube સાથે વાપરવા "
+"માટે તેને સુયોજિત કરો. એકવાર YouTube સાઇટમાં તમારા બ્રાઉઝર દ્દારા મોટાભાગનાં કાતાને "
+"સુયોજિત કરી શકો છો."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"પ્રકાશિત કરવા માટે જરૂરી ફાઇલ બિનઉપલબ્ધ છે. Youtube માં પ્રકાશિત કરવાનું ચાલુ કરી શકાતુ "
+"નથી."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "તમે %s તરીકે YouTube માં પ્રવેશેલ છે."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "વિડિયો '%s' માં દેખાશે"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "સાર્વજનિક રીતે યાદી થયેલ છે"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "સાર્વજનિક રીતે યાદી થયેલ નથી"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "ખાનગી"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "કૉર પ્રકાશિત સેવાઓ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"તમે હાલમાં Flickr માં પ્રવેશેલ છે\n"
+"\n"
+"તમારાં વેબ બ્રાઉઝરમાં Flickr માં પ્રવેશ કરવા માટે પ્રવેશ પર ક્લિક કરો. તમારે તમારી "
+"Flickr માં કડી કરવા માટે Shotwell જોડાણને સત્તા કરવી જ પડશે."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"તમે પહેલેથી આ Shotwell સત્ર દરમ્યાન Flickr માં પ્રવેશેલ અને બંધ કરેલ છે.\n"
+"Flickr માં પ્રકાશિત કરવાનું ચાલુ રાખવા માટે, બહાર નીકળો અને Shotwell ને પુન:શરૂ કરો, "
+"પછી ફરી પ્રકાશિત કરવાનો પ્રયત્ન કરો."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "પ્રવેશ માટે તૈયારી કરી રહ્યા છે..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"પ્રકાશિત કરવા માટે જરૂરી ફાઇલ બિનઉપલબ્ધ છે.Flickr માં પ્રકાશિત કરવાનું ચાલુ કરી શકાતુ "
+"નથી."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "સત્તાધિકરણને ચકાસી રહ્યા છે..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"તમે %s તરીકે Flickr માં પ્રવેશેલ છે.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"તમારું મુક્ત Flickr ખાતુ મર્યાદિત કરે છે કે મહિનામાં તમે કેટલી માહિતીને અપલોડ કરી શકો છે.\n"
+"આ મહિનો, તમારી પાસે તમારાં અપલોડ ક્વોટામાં %d મેગાબાઇટ બાકી રહેલ છે."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "તમારા Flickr પ્રો એકાઉન્ટ તમને અમર્યાદિત અપલોડ કરવા માટે હકદાર."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "તેમાં ફોટો દૃશ્યમાન (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "તેમાં વિડિયો દૃશ્યમાન (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "તેમાં ફોટો અને વિડિયો દૃશ્યમાન (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "બધા"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "ફક્ત મિત્રો અને કુટુંબ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "ફક્ત કુટુંબ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "ફક્ત મિત્રો"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "ફક્ત હું"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 પિક્સેલ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 પિક્સેલ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 પિક્સેલ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 પિક્સેલ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "આલ્બમ %s ને બનાવી રહ્યા છે..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"ભૂલ સંદેશો ઉદ્ભવ્યો જ્યારે Piwigo ને પ્રકાશિત કરી રહ્યા હોય. મહેરબાની કરીને ફરી પ્રયત્ન "
+"કરો."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"લાઇબ્રેરી માટે તમારાં Piwigo ખાતા સાથે સંકળાયેલ વપરાશકર્તાનામ અને પાસવર્ડ ની સાથે સાથે "
+"તમારી Piwigo ફોટો લાઇબ્રેરી ની URL ને દાખલ કરો."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell એ તમારી ફોટો લાઇબ્રેરીને સંપર્ક કરી શકતુ નથી. મહેરબાની કરીને URL ને ચકાસો તમે "
+"દાખલ કરેલ હોય"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "વપરાશકર્તાનામ અને/અથવા પાસવર્ડ અયોગ્ય છે. મહેરબાની કરીને પ્રયત્ન કરો"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "અયોગ્ય URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "અયોગ્ય વપરાશકર્તા નામ અથવા પાસવર્ડ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell જોડાણ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "સંચાલક, કુટુંબ, મિત્રો, સંપર્કો"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "સંચાલક, કુટુંબ, મિત્રો"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "સંચાલક, કુટુંબ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "સંચાલક"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"તમે હાલમાં Picasa વેબ આલ્બમમાં પ્રવેશેલ છે.\n"
+"\n"
+"તમારાં વેબ બ્રાઉઝરમાં Picasa વેબ આલ્બમમાં પ્રવેશ કરવા માટે પ્રવેશ પર ક્લિક કરો. તમારે "
+"તમારી Picasa વેબ આલ્બમમાં કડી કરવા માટે Shotwell જોડાણને સત્તા કરવી જ પડશે."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"પ્રકાશિત કરવા માટે જરૂરી ફાઇલ બિનઉપલબ્ધ છે. Picasa માં પ્રકાશિત કરવાનું ચાલુ કરી શકાતુ "
+"નથી."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "આલ્બમને બનાવી રહ્યા છે..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "તમે %s તરીકે Picasa વેબ આલ્બમમાં પ્રવેશેલ છે."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "વિડિયો તેમાં દેખાશે:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ફોટા તેમાં દેખાશે:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "નાનું (640 x 480 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "મધ્યમ (1024 x 768 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "અગ્રહણીય (1600 x 1200 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 પિક્સેલ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"તમે હાલમાં Facebook માં પ્રવેશેલ છે.\n"
+"\n"
+"જો તમારી પાસે હજુ Facebook ખાતુ ન હોય તો, તમે પ્રવેશ પ્રક્રિયાને બનાવી શકો છો. પ્રવેશ "
+"દરમ્યાન, Shotwell જોડાણ તમારાં પ્રતિસાદમાં ફોટાને અપલોડ કરવા માટે તમને પૂછી શકે છે. આ "
+"પરવાનગીઓ કાર્ય કરવા માટે Shotwell જોડાણ માટે જરૂરિયાત છે."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"તમે પહેલેથી આ Shotwell સત્ર દરમ્યાન Facebook માં પ્રવેશેલ અને બંધ કરેલ છે.\n"
+"Facebook માં પ્રકાશિત કરવાનું ચાલુ રાખવા માટે, બહાર નીકળો અને Shotwell ને પુન:શરૂ કરો, "
+"પછી ફરી પ્રકાશિત કરવાનો પ્રયત્ન કરો."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "મૂળભૂત (720 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "વિશાળ (2048 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook માં જોડાણને ચકાસી રહ્યા છે..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"પ્રકાશિત કરવા માટે જરૂરી ફાઇલ બિનઉપલબ્ધ છે. Facebook માં પ્રકાશિત કરવાનું ચાલુ કરી "
+"શકાતુ નથી."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"તમે %s તરીકે Facebook માં પ્રવેશેલ છે.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "ક્યાં તમે પસંદ થયેલ ફોટાને પ્રકાશિત કરવા માંગો છો?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "માપ અપલોડ કરો (_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "મિત્રો"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "સંકોચાઇ જવુ"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "ચેસ"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "ગોળ"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "બ્લાઇન્ડ"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "સ્ટ્રાઇપ"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ઘડિયાળ"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "ગોળ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "કોર તકતીપૂર્વદર્શન અનુવાદ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "તકતી"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "ઝાંખુ પડવુ"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ચોરસ"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "કૉર માહિતી આયાત સેવાઓ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot લાઇબ્રેરી આયાત સેવામાં તમારુ સ્વાગત છે.\n"
+"\n"
+"મહેરબાની કરીને આયાત કરવા માટે લાઇબ્રેરીને પસંદ કરો, ક્યાંતો Shotwell દ્દારા મળેલ હાલની "
+"લાઇબ્રેરીઓમાંની એકને પસંદ કરીને અથવા વૈકલ્પિક F-Spot ડેટાબેઝ ફાઇલને પસંદ કરીને."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot લાઇબ્રેરી આયાત સેવામાં સ્વાગત છે.\n"
+"\n"
+"મહેરબાની કરીને F-Spot ડેટાબેઝ ફાઇલ પસંદ કરો."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "આયાત કરવા માટે જાતે જ F-Spot ડેટાબેઝ ફાઇલને પસંદ કરો:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"પસંદ થયેલ F-Spot ડેટાબેઝ ફાઇલને ખોલી શકાતુ નથી: ફાઇલ અસ્તિત્વમાં નથી અથવા F-Spot "
+"ડેટાબેઝ નથી"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"પસંદ થયેલ F-Spot ડેટાબેઝ ફાઇલને ખોલી શકાતુ નથી: F-Spot ડેટાબેઝની આ આવૃત્તિ Shotwell "
+"દ્દારા આધારભૂત નથી"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"પસંદ થયેલ F-Spot ડેટાબેઝ ફાઇલને વાંચી શકાતુ નથી: ભૂલ જ્યારે ટૅગ કોષ્ટકને વાંચી રહ્યા હોય"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"પસંદ થયેલ F-Spot ડેટાબેઝ ફાઇલને વાંચી શકાતુ નથી: ભૂલ જ્યારે ફોટો કોષ્ટકને વાંચી રહ્યા છે"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell ને F-Spot લાઇબ્રેરીમાં %d ફોટા મળ્યા અને હાલમાં તેઓને આયાત કરી રહ્યા છે. નકલો "
+"આપમેળે શોધાશે અને દૂર કરશે.\n"
+"\n"
+"તમે આ સંવાદને બંધ કરી શકો છો અને Shotwell ને વાપરવાનું શરૂ કરો જ્યારે આયાત પાશ્ર્વભાગમાં "
+"સ્થિત કરે છે."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot લાઇબ્રેરી: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "આયાત કરવા માટે તૈયારી કરી રહ્યા છે"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "ડેસ્કટોપ તકતી પૂર્વદર્શન તરીકે સુયોજિત કરો"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "ડેસ્કટોપ પાશ્ર્વભાગ તકતીપૂર્વદર્શનને ઉત્પન્ન કરો"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "તેની માટે દરેક ફોટો બતાવો"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "સમયગાળો"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "કેટલો સમય દરેક ફોટાને ડેસ્કટોપ પાશ્ર્વ પર બતાવેલ છે"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "શોધો"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "શોધનુ નામ (_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "બંધબેસાડો (_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "નીચેનાં:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>છાપેલ ઇમેજ માપ</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "મૂળભૂત માપને વાપરો (_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "વૈવિધ્ય માપને વાપરો (_u):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ફોટો ગુણોત્તર સાથે બંધબેસાડો (_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "સ્વયં માપ બદલો (_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>શીર્ષકો</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ઇમેજ શીર્ષકને છાપો (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>પિક્સેલ રિઝોલ્યુશન</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "તેની પર આઉટપુટ ફોટો (_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ઇંચ પ્રતિ પિક્સેલ"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "લેબલ"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell પસંદગીઓ"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "સફેદ"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "કાળુ"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "નવી ફાઇલો માટે લાઇબ્રેરી ડિરેક્ટરીને જુઓ (_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "મેટાડેટા"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "ફોટો ફાઇલોમાં ટૅગ, શીર્ષક, અને બીજા મેટાડેટાને લખો (_m)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "દર્શાવો"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "તેમાં ફોટાને આયાત કરો (_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "પાશ્ર્વભાગ (_B)"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "આયાત કરી રહ્યા છે"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "ડિરેક્ટરી બંધારણ (_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ભાત (_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ઉદાહરણ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "નાનાં અક્ષરો માટે આયાત થયેલ ફાઇલોનું નામ બદલો (_e)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW ડેવલપર"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "મૂળભૂત (_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "બહારનો ફોટો સંપાદક (_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "બહારનું RAW સંપાદક (_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "બહારનાં સંપાદકો"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "પ્લગઇન"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "વિલંબ (_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "સંક્રમણ અસર (_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "સંક્રમણ વિલંબ (_e):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "શીર્ષક બતાવો (_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "સેકંડ"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "પ્રવેશ (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (fb વપરાશકર્તા નામ પર લખાણ આધાર રાખે છે અને કાર્યક્રમમાં બદલાય છે - \n"
+"કંઇપણ આ ક્ષેત્રમાં મૂકવાથી તેને દર્શાવાતુ નથી)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "હાલનાં આલ્બમને પ્રકાશિત કરો (_x):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "નામ થયેલ નવાં આલ્બમને બનાવો (_n):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "વિડિયો અને આલ્બમ એ તેમાં દૃશ્યમાન છે (_v):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "અપલોડ કરતા પહેલાં સ્થાન, કૅમેરા, અને બીજી ઓળખ જાણકારીને દૂર કરો (_R)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "બહાર નીકળો (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "પ્રકાશિત કરો (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"ખાતરી નંબરને દાખલ કરો કે જે તમારા વેબ બ્રાઉઝરમાં Flickr માં તમે પ્રવેશો પછી તે દેખાય છે."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "સત્તાધિકરણ નંબર (_N):"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"(નામ) તરીકે તમે Flickr માં પ્રવેશેલ છો.\n"
+"\n"
+"(આ લેબલની શબ્દમાળા જાણીતી છે અને કોડમાં સુયોજિત છે, \n"
+"તેથી થયેલ ફેરફારો એ દર્શાવેલ હશે નહિં)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "દૃશ્યમાન લેબલ (કોડમાં જાણીતુ છે) (_v)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "ફોટો માપ (_s):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'તમે $name તરીકે પ્રવેશેલ છો'\n"
+"(કાર્યક્રમ કોડમાં જાણીતુ છે)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "હાલનો આલ્બમ (_e):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "નામ થયેલ નવો આલ્બમ (_n):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "સાર્વજનિક ગેલરિમાં આલ્બમની યાદી કરો (_i)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype એ\n"
+"(કોડમાં જાણીતુ) માં દેખાશે"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "હાજર ફોટાનું માપ (_s):"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "તમારી ફોટો લાઇબ્રેરીની URL (_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "વપરાશકર્તા નામ (_n)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "પાસવર્ડ (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "પાસવર્ડ યાદ રાખો (_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "પ્રવેશ"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "હાલનો વર્ગ (_e):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "ફોટા એ તેનાં દ્દારા દૃશ્યમાન છે (_v):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr " ફોટાનું માપ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "વર્ગમાં:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "આલ્બમ ટિપ્પણી:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"જો શીર્ષક સુયોજિત હોય અને ટિપ્પણી અસુયોજિત હોય તો, ટિપ્પણી તરીકે શીર્ષકને વાપરો (_I)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "ટૅગ અપલોડ કરો નહિં (_D)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "બહાર નીકળો"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "વિડિયો ખાનગી સુયોજન (_s):"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 પિક્સેલ"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' એ OAuth સત્તાધિકરણ માંગણીમાં યોગ્ય જવાબ નથી"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): શરૂ કરી શકાતુ નથી; આ પ્રકાશકર્તા પુન:શરૂ કરી શકાય તેમ "
+"નથી."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "તમારાં Tumblr ખાતા સાથે સંકળાયેલ વપરાશકર્તાનામ અને પાસવર્ડને દાખલ કરો."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI ને લોડ કરી શક્યા નહિં: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"તમે %s તરીકે Tumblr માં પ્રવેશેલ છે.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki વેબ સાઇટની મુલાકાત લો"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "તમે અત્યારે Yandex.Fotki માં પ્રવેશેલ નથી."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "ઈમેઈલ સરનામું (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"તમે (નામ) તરીકે Tumblr માં પ્રવેશેલ છે.\n"
+"\n"
+"(આ લેબલની શબ્દમાળા જાણીતી છે અને કોડમાં સુયોજિત છે, \n"
+"તેથી ફેરફારો અહિંયા દર્શાવાશે નહિં)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "બ્લૉગ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "આલ્બમ (_A) (અથવા નવું લખો):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "વપરાશ પ્રકાર (_t):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "ટિપ્પણીઓને નિષ્ક્રિય કરો (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "મૂળ ફોટો ડાઉનલોડ કરવામાં પ્રતિબંધ (_F)"
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..aaa3ad3
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,4552 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Dovix Dovix <dovix2003@gmail.com>, 2012
+# verayin <vera@yorba.org>, 2011
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2011-2013
+# yoseforb <yoseforb@gmail.com>, 2013
+# lsbeeler <lucas@yorba.org>, 2011
+# Amiad B <amiad@hatul.info>, 2011
+# Yaron Shahrabani <sh.yaron@gmail.com>, 2011-2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-24 20:50+0000\n"
+"Last-Translator: yoseforb <yoseforb@gmail.com>\n"
+"Language-Team: Hebrew (http://www.transifex.com/projects/p/shotwell/language/"
+"he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "האירוע %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "מצלמות"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "מצלמה"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "לא ניתן לנתק את המצלמה. יש לנסות לנתק את המצלמה ממנהל הקבצים."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "הסתרת תמונות שכבר יובאו"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "יש להציג תמונות שלא יובאו בלבד"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "הייבוא מתחיל, נא להמתין..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_כותרות"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "הצגת הכותרת של כל תמונה"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "יבוא ה_נבחרות"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "יבוא התמונות הנבחרות לספרייה שלך"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "יבוא ה_כול"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "יבוא כל התמונות לספרייה שלך"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "על Shotwell לנתק את המצלמה ממערכת הקבצים כדי לגשת אליה. האם להמשיך?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_ניתוק"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "נא לנתק את מערכת הקבצים של המצלמה."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"המצלמה נעולה על ידי יישום אחר. Shotwell יכולה לגשת למצלמה רק כאשר אינה "
+"נעולה. נא לסגור כל יישום אחר המשתמש במצלמה ולנסות שוב."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "נא לסגור כל יישום אחר המשתמש במצלמה."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"לא ניתן לקבל את התצוגות המקדימות מהמצלמה:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "מתבצע ניתוק..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "פרטי התמונה מתקבלים"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "התצוגה המקדימה עבור %s מתקבלת"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "לא ניתן לנעול את המצלמה: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "האם למחוק תמונה זו מהמצלמה?"
+msgstr[1] "האם למחוק %d תמונות אלה מהמצלמה?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "האם למחוק קטע וידאו זה מהמצלמה?"
+msgstr[1] "האם למחוק %d קטעי וידאו אלה?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "האם למחוק תמונה/וידאו אלו מהמצלמה?"
+msgstr[1] "האם למחוק %d תמונות/קטעי וידאו אלו מהמצלמה?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "האם למחוק קובץ זה מהמצלמה?"
+msgstr[1] "האם למחוק %d קבצים אלה מהמצלמה?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_שמירה"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "התמונות/קטעי הווידאו מוסרים מהמצלמה"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "לא ניתן למחוק תמונה אחת/וידאו אחד מהמצלמה עקב שגיאות."
+msgstr[1] "לא ניתן למחוק %d תמונות/קטעי וידאו מהמצלמה עקב שגיאות."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "מ_צגת"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "הפעלת מצגת"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "יצוא תמונות/קטעי וידאו"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "יצוא תמונות/קטעי וידאו"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "יצוא תמונות"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "יצוא תמונות"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "סיבוב"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "ביטול הסיבוב"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "היפוך אופקי"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "ביטול היפוך אופקי"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "היפוך אנכי"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "ביטול היפוך אנכי"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr " כלשהו"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "כותרת"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "תגית"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "הערה"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "שם האירוע"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "שם הקובץ"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "סוג המדיה"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "מצב הדגלון"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "מצב תמונה"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "דירוג"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "תאריך"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "מכיל"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "הוא בדיוק"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "מתחיל ב־"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "מסתיים ב־"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "אינו מכיל"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "לא מוגדר"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "הוא"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "אינו"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "כל תמונה שהיא"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "תמונה גולמית"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "וידאו"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "יש"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "אין"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "שינויים"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "שינויים פנימיים"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "שינויים חיצוניים"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "מסומן בדגלון"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "לא מסומן בדגלון"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ומעלה"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "בלבד"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ומטה"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "הוא לאחר"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "הוא לפני"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "הוא בין"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "וגם"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "כלשהו"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "הכול"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "אף אחד מאלה"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "החיפושים השמורים"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "חיפוש _שמור חדש..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"ספריית התמונות שלך אינה נתמכת בגרסה זו של Shotwell. נראה כי הספרייה נוצרה "
+"באמצעות Shotwell %s (סכמה %d). גרסה זו הנה %s (סכמה %d). נא להשתמש בגרסה "
+"העדכנית ביותר של Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"לא עלה בידי Shotwell לשדרג את ספריית התמונות שלך מגרסה %s (סכמה%d) לגרסה %s "
+"(סכמה %d). למידע נוסף ניתן לבקר באתר הוויקי של Shotwell בכתובת %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"ספריית התמונות שלך אינה תואמת לגרסה זו של Shotwell. נראה כי ספרייה זו נוצרה "
+"על ידי Shotwell %s (סכמה%d). גרסה זו הנה %s (סכמה %d). נא לפנות את ספריית "
+"התמונות שלך על ידי מחיקת %s ויבוא התמונות שלך מחדש."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "אירעה שגיאה בלתי ידועה בעת הניסיון לאימות מסד הנתונים של Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Loading Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "הנתיב לנתונים הפרטיים של Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "אין לבדוק מה השינויים בתיקיות בזמן פעולת התכנית"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "אין להציג מד התקדמות בזמן ההפעלה"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "הצגת גרסת היישום"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Run '%s --help' to see a full list of available command line options.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "היום"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "אתמול"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "כותרת:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "פריטים:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "אירוע אחד"
+msgstr[1] "%d אירועים"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "תמונה אחת"
+msgstr[1] "%d תמונות"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "קטע וידאו אחד"
+msgstr[1] "%d קטעי וידאו"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "תאריך:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "שעה:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "מ־:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "עד:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "גודל:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "משך:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f שניות"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "מתכנת:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "חשיפה:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "מיקום:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "גודל הקובץ:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "פיתוח נוכחי:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "הממדים המקוריים:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "יצרן המצלמה:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "דגם המצלמה:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "מבזק:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "אורך מוקדי:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "תאריך החשיפה:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "זמן החשיפה:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "הטיית חשיפה:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "קו רוחב GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "קו אורך GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "אמן:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "זכויות יוצרים:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "תכנה:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "הערה:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "פרטים מורחבים"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "פעולה זו תסיר את התגית \"%s\" מתמונה %d. להמשיך?"
+msgstr[1] "פעולה זו תסיר את התגית \"%s\" מ־%d תמונות. להמשיך?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_ביטול"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "מ_חיקה"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "פעולה זו תסיר את החיפוש השמור \"%s\". להמשיך?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "החלפת מפתחים תבטל את כל השינויים שביצעת בתמונה זו ב-Shotwell."
+msgstr[1] "החלפת מפתחים תבטל את כל השינויים שביצעת בתמונות אלו ב-Shotwell."
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ה_חלף מפתח"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "יצוא וידאו"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"אין באפשרות Shotwell ליצור קובץ לעריכת תמונה זו כיוון שאין לך הרשאות לכתוב "
+"אל %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"לא ניתן לייצא את התמונה הבאה עקב שגיאת קובץ.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"האם ברצונך להמשיך ביצוא?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "המ_שך"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "ללא שינוי"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "נוכחי"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "מ_בנה:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_איכות:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_אילוץ שמירת יחס:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _פיקסלים"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "יצוא נתוני העל"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "שמירת הפרטים..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "שמירת הפרטים"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ועוד %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "יבוא דוח התוצאות"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "התבצע ניסיון לייבוא של קובץ אחד (%d)."
+msgstr[1] "התבצע ניסיון לייבוא של %d קבצים"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "מתוכם, קובץ אחד (%d) יובא בהצלחה."
+msgstr[1] "מתוכם, %d קבצים יובאו בהצלחה."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "קובצי וידאו/תמונות כפולים לא יובאו:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "משכפל פריט מדיה קיים"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "תמונות/סרטי וידאו לא יובאו עקב שגיאות מצלמה:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "הודעת שגיאה:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "הקבצים לא יובאו כיוון שלא זוהו כתמונות או כסרטי וידאו:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"התמונות/סרטי הווידאו לא יובאו כיוון שהן במבנה שאין ל־Shotwell אפשרות להבין:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"התמונות/סרטי הווידאו לא יובאו כיוון ש־Shotwell נכשל בהעתקתם לספרייה הפנימית "
+"שלו:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"לא ניתן להעתיק את %s\n"
+"\tאל %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "התמונות/סרטי הווידאו לא יובאו עקב סיבות שונות:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "תמונה משוכפלת אחת לא יובאה:\n"
+msgstr[1] "%d תמונות משוכפלות לא יובאו:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "קטע וידאו משוכפל אחד לא יובא:\n"
+msgstr[1] "%d קטעי וידאו משוכפלים לא יובאו:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "תמונה משוכפלת או קטע וידאו משוכפל לא יובאו:\n"
+msgstr[1] "%d תמונות/קטעי וידאו משוכפלים לא יובאו:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "אירע כשל ביבוא אחת התמונות עקב שגיאת חומרה או קובץ:\n"
+msgstr[1] "אירע כשל ביבוא %d מהתמונות עקב שגיאת חומרה או קובץ:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "אירע כשל ביבוא אחד מקטעי הווידאו עקב שגיאת חומרה או קובץ:\n"
+msgstr[1] ""
+"אירע כשל ביבוא %d מהתמונות או מקטעי הווידאו עקב שגיאת חומרה או קובץ:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"אירע כשל ביבוא אחת התמונות/אחד מקטעי הווידאו עקב שגיאת חומרה או קובץ:\n"
+msgstr[1] "אירע כשל ביבוא %d מהתמונות/קטעי הווידאו עקב שגיאת חומרה או קובץ:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "יבוא של אחד הקבצים כשל עקב שגיאה בקובץ או בחומרה:\n"
+msgstr[1] "יבוא של %d מהקבצים נכשל עקב שגיאה בקובץ או בחומרה:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"היבוא של אחת מהתמונות נכשל כיוון שהתיקייה בה נמצאת ספריית התמונות אינה ניתנת "
+"לכתיבה:\n"
+msgstr[1] ""
+"היבוא של %d התמונות נכשל כיוון שהתיקייה בה נמצאת ספריית התמונות אינה ניתנת "
+"לכתיבה:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"היבוא של אחד מקטעי הווידאו נכשל כיוון שהתיקייה בה נמצאת ספריית התמונות אינה "
+"ניתנת לכתיבה:\n"
+msgstr[1] ""
+"היבוא של %d קטעי הווידאו נכשל כיוון שהתיקייה בה נמצאת ספריית התמונות אינה "
+"ניתנת לכתיבה:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"היבוא של 1 מהתמונות/מקטעי הווידאו נכשל כיוון שהתיקייה בה נמצאת ספריית "
+"התמונות אינה ניתנת לכתיבה:\n"
+msgstr[1] ""
+"היבוא של %d מהתמונות/מקטעי הווידאו נכשל כיוון שהתיקייה בה נמצאת ספריית "
+"התמונות אינה ניתנת לכתיבה:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"יבוא אחד הקבצים נכשל כיוון שתיקיית ספריית התמונות סגורה בפני כתיבה:\n"
+msgstr[1] ""
+"יבוא %d מהקבצים נכשל כיוון שתיקיית ספריית התמונות סגורה בפני כתיבה:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "אירע כשל ביבוא אחת מהתמונות עקב שגיאה במצלמה:\n"
+msgstr[1] "אירע כשל ביבוא %d מהתמונות עקב שגיאה במצלמה:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "אירע כשל ביבוא אחד מקטעי הווידאו עקב שגיאה במצלמה:\n"
+msgstr[1] "אירע כשל ביבוא %d מקטעי הווידאו עקב שגיאה במצלמה:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "אירע כשל ביבוא אחת מהתמונות/אחד מקטעי הווידאו עקב שגיאה במצלמה:\n"
+msgstr[1] "אירע כשל ביבוא %d מהתמונות/קטעי הווידאו עקב שגיאה במצלמה:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "יבוא אחד הקבצים נכשל עקב שגיאת מצלמה:\n"
+msgstr[1] "יבוא %d מהקבצים נכשל עקב שגיאת מצלמה:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "בוצע דילוג על תמונה אחת שאינה נתמכת:\n"
+msgstr[1] "בוצע דילוג על %d תמונות שאינן נתמכות:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "בוצע דילוג על קובץ אחד שאינו תמונה.\n"
+msgstr[1] "בוצע דילוג על %d קבצים שאינם תמונה.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "בוצע דילוג על תמונה אחת עקב ביטול המשתמש:\n"
+msgstr[1] "בוצע דילוג על %d תמונות עקב ביטול המשתמש:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "בוצע דילוג על וידאו אחד עקב ביטול המשתמש:\n"
+msgstr[1] "בוצע דילוג על %d קטעי וידאו עקב ביטול המשתמש:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "בוצע דילוג על תמונה אחת/וידאו אחד עקב ביטול המשתמש:\n"
+msgstr[1] "בוצע דילוג על %d תמונות/קטעי וידאו עקב ביטול המשתמש:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "קובץ אחד נפסח עקב ביטול המשתמש:\n"
+msgstr[1] "%d קבצים נפסחו עקב ביטול המשתמש:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "תמונה אחת יובאה בהצלחה.\n"
+msgstr[1] "%d תמונות יובאו בהצלחה.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "קטע וידאו אחד יובא בהצלחה.\n"
+msgstr[1] "%d קטעי וידאו יובאו בהצלחה.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "תמונה אחת/וידאו אחד יובאו בהצלחה.\n"
+msgstr[1] "%d תמונות/קטעי וידאו יובאו בהצלחה.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "לא יובאו כלל תמונות או קטעי וידאו.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "היבוא הושלם"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "שנייה אחת"
+msgstr[1] "%d שניות"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "דקה אחת"
+msgstr[1] "%d דקות"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "שעה אחת"
+msgstr[1] "%d שעות"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "יום אחד"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "שינוי שם האירוע"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "שם:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "עריכת הכותרת"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "שליחת קובץ ל_אשפה"
+msgstr[1] "שליחת קבצים ל_אשפה"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "ה_סרה בלבד"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "האם לשחזר עריכות חיצוניות?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "האם לבטל את העריכות החיצוניות?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "פעולה זו תשמיד את כל השינויים שבוצעו בקובץ החיצוני. להמשיך?"
+msgstr[1] "פעולה זו תשמיד את כל השינויים שבוצעו ב־%d קבצים חיצוניים. להמשיך?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_ביטול העריכות החיצונית"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "בי_טול העריכות החיצוניות"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "פעולה זו תסיר את התמונה מהספרייה. להמשיך?"
+msgstr[1] "פעולה זו תסיר %d תמונות מהספרייה. להמשיך?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "ה_סרה"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "הסרת תמונות מהספרייה"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "הסרת תמונות מהספרייה"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 שעות"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "ה_זחת התמונות/קטעי הווידאו באותו האופן"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "ה_גדרת כל התמונות/קטעי הווידאו למועד זה"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "שנה את קובץ התמונה ה_מקורית"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "שנה את קבצי התמונה ה_מקורית"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_שינוי הקבצים המקוריים"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_שינוי קובצי המקור"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "מקור:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"זמן החשיפה יוארך ב־\n"
+"%d %s, %d %s, %d %sו־ %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"זמן החשיפה יוקדם ב־\n"
+"%d %s, %d %s, %d %sו־ %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "יום"
+msgstr[1] "ימים"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "שעה"
+msgstr[1] "שעות"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "דקה"
+msgstr[1] "דקות"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "שנייה"
+msgstr[1] "שניות"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"ואחד נוסף"
+msgstr[1] ""
+"\n"
+"\n"
+"ו־%d נוספים."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "תגיות (מופרדות בפסיקים):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "ברוך בואך!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "ברוך בואך ל־Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "כדי להתחיל יש לייבא תמונות באחת מהדרכים הבאות:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "יש לבחור ב<span weight=\"bold\">קובץ %s יבוא מתיקייה</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "לגרור ולהשליך תמונות לחלון של Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "לחבר מצלמה למחשב שלך ולייבא ממנה"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "י_בוא תמונות מתיקיית ה־%s שלך"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "ניתן לייבא תמונות בכל אחת מהדרכים הבאות:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_אין להציג הודעה זו שוב"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "יבוא תמונות מספריית ה־%s שלך"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(עזרה)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "שנה%sחודש%sיום"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "שנה%sחודש"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "שנה%sחודש-יום"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "שנה-חודש-יום"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "התאמה אישית"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "התבנית שגויה"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"באפשרות Shotwell להעתיק את התמונות לספרייה שלך או לייבא את התמונות מבלי "
+"להעתיק אותן."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ה_עתקת תמונות"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "יבוא ל_כאן"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "יבוא לספרייה"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "הסרה מהספרייה"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "הסרת תמונות מהספרייה"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "התמונות מוסרות מהתיקייה"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"פעולה זו תסיר את התמונה/סרטון הווידאו מספריית ה־Shotwell שלך. האם ברצונך "
+"להעביר את הקבצים לאשפה של שולחן העבודה שלך?\n"
+"\n"
+"לא ניתן לבטל פעולה זו. %d"
+msgstr[1] ""
+"פעולה זו תסיר %d תמונות/סרטוני וידאו מספריית ה־Shotwell שלך. האם ברצונך "
+"להעביר את הקבצים לאשפה של שולחן העבודה שלך?\n"
+"\n"
+"לא ניתן לבטל פעולה זו."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"פעולה זו תסיר את סרטון הווידאו מספריית ה־Shotwell שלך. האם בנוסף על כך "
+"ברצונך להעביר את הקובץ לאשפה?\n"
+"\n"
+"לא ניתן לבטל פעולה זו. %d"
+msgstr[1] ""
+"פעולה זו תסיר את %d סרטוני הווידאו מספריית ה־Shotwell שלך. האם בנוסף על כך "
+"ברצונך להעביר את הקובץ לאשפה?\n"
+"\n"
+"לא ניתן לבטל פעולה זו."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"פעולה זו תסיר את התמונה מספריית ה־Shotwell שלך.\n"
+"האם ברצונך להעביר את הקובץ לסל האשפה שלך?\n"
+"\n"
+"לא ניתן לבטל פעולה זו."
+msgstr[1] ""
+"פעולה זו תסיר %d תמונות מספריית ה־Shotwell שלך.\n"
+"האם ברצונך להעביר את הקובץ לסל האשפה שלך?\n"
+"\n"
+"לא ניתן לבטל פעולה זו."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"לא ניתן להעביר את התמונה/וידאו לאשפה של שולחן העבודה שלך. האם למחוק קובץ זה?"
+msgstr[1] ""
+"לא ניתן להעביר %d תמונות/קטעי וידאו לאשפה של שולחן העבודה שלך. האם למחוק "
+"קבצים אלו?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "לא ניתן למחוק את התמונה או את הווידאו."
+msgstr[1] "לא ניתן למחוק %d תמונות/קטעי וידאו."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "תיקיות"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "תגיות"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "הצלחה"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "שגיאת קובץ"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "לא ניתן לפענח את הקובץ"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "שגיאת מסד נתונים"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "המשתמש ביטל את היבוא"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "לא קובץ"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "הקובץ כבר קיים במסד הנתונים"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "מבנה הקובץ אינו נתמך"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "לא קובץ תמונה"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "שגיאה בכונן"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "הכונן מלא"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "שגיאת מצלמה"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "שגיאת כתיבה לקובץ"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "המיובאות כשלו (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "השתנתה"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "התמונה הקודמת"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "התמונה הבאה"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "קובץ המקור לתמונה חסר: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "ת_צוגה"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_כלים"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "התמונה ה_קודמת"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "התמונה הקודמת"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "התמונה ה_באה"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "התמונה הבאה"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "הת_קרבות"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "התקרבות לתמונה"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "התר_חקות"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "התרחקות מהתמונה"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "ה_תאמה לעמוד"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "הגדרת תקריב התמונה כך שתוצג במלואה במסך"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "תקריב _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "הגדרת התקריב לכדי הגדלה של 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "תקריב _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "הגדרת התקריב לכדי הגדלה של 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "מ_תכנת"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "לא ניתן לייצא את %s:‏ %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "מסד נתונים %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "הייבוא מהמיקום %s לא יכול להימשך עקב השגיאה שאירעה:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "כדי לנסות לייבוא משירות אחר, נא לבחור באחר מהתפריט שלהלן."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "יבוא נתונים"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"אין לך שום תוספי יבוא נתונים פעילים.\n"
+"\n"
+"על מנת להשתמש בתכונת הייבוא מתוך יישום צריך שיהיה לך לפחות תוסף אחד של יבוא "
+"נתונים פעיל. ניתן להפעיל תוספים בדו־שיח ההעדפות."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "קובץ מסד נתונים:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "י_בוא"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "יבוא מיישום"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "יבוא מדיה מהמי_קום:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_סגירה"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "הגדרות"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "מצגת"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "הקודמת"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "מעבר לתמונה הקודמת"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "השהייה"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "השהיית המצגת"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "הבאה"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "מעבר לתמונה הבאה"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "שינוי הגדרות המצגת"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "כל קובצי המקור של התמונות חסרים."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "הצגה"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "המשך בהצגת המצגת"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "שחזור"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "ביטול השחזור"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "שיפור"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "ביטול השיפור"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "יצירת אירוע חדש"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "הסרת האירוע"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "העברת תמונות לאירוע חדש"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "הגדרת התמונות לאירוע הקודם"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "מיזוג"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "ביטול המיזוג"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "התמונות משוכפלות"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "הסרת תמונות משוכפלות"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "לא ניתן לשכפל תמונה אחת עקב שגיאת קובץ"
+msgstr[1] "לא ניתן לשכפל %d תמונות עקב שגיאות בקבצים"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "הדירוג הקודם משוחזר"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "הדירוגים עולים"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "הדירוגים יורדים"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "הגדרת מתכנת RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "מתכנת ה־RAW הקודם משוחזר"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "הגדרת מתכנת"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "לא ניתן להתאים את התמונה המקורית."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "התאריך והשעה מכוונים"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "כיוון התאריך והשעה מבוטלים"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "לא ניתן להתאים תמונה מקורית אחת."
+msgstr[1] "לא ניתן להתאים את התמונות המקוריות שלהלן."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "שגיאה בכיוון הזמן"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "לא ניתן לבטל את כיוון הזמן לקובץ התמונה הבא."
+msgstr[1] "לא ניתן לבטל את כיוון הזמן לקובצי התמונה הבאים."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "יצירת תגית"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "העברת התגית „%s“"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "העברת תמונות לאשפה"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "שחזור תמונות מהאשפה"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "העברת התמונות לאשפה של Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "שחזור תמונות מהאשפה של Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "תמונות מועברות לאשפה"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "תמונות משוחזרות מהאשפה"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "סימון התמונה הנבחרת בדגל"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "ביטול הדגל לתמונה הנבחרת"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "סימון בדגל"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "ביטול הדגל"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "נמוכה (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "בינונית (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "גבוהה (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "מרבית (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "אין תמונות/קטעי וידאו"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "לא נמצאו תמונות/קטעי וידאו"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "לא ניתן לייצא תמונות לתיקייה זו."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "לא ניתן לעבד את עדכוני המעקב: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "מילוי העמוד כולו"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 תמונות בעמוד"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 תמונות בעמוד"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 תמונות בעמוד"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 תמונות בעמוד"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 תמונות בעמוד"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 תמונות בעמוד"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "אינ׳"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "ס״מ"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "ארנק (2 x‏ 3 אינטש)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "כרטיסייה (3 x‏ 5 אינטש)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x‏ 6 אינטש"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x‏ 7 אינטש"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x‏ 10 אינטש"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x‏ 14 אינטש"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "‏16 x‏ 20 אינטש"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "9 x‏ 13 ס״מ"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "גלויה (10 x‏ 15 ס״מ)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x‏ 18 ס״מ"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x‏ 24 ס״מ"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x‏ 30 ס״מ"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x‏ 40 ס״מ"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x‏ 40 ס״מ"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "הגדרות התמונה"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "הדפסה..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"לא ניתן להדפיס את התמונה:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "לא ניתן לפתוח/ליצור מסד נתוני תמונות %s: קוד השגיאה %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"לא ניתן לכתוב אל קובץ מסד נתוני התמונות:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"אירעה שגיאה במהלך הגישה לקובץ מסד הנתונים:\n"
+" %s\n"
+"\n"
+"השגיאה הייתה: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "יצוא קטעי וידאו"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "לא ניתן לטעון את Nautilus Send-To: ‏%s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "שליחה אל"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "לא ניתן לייצא את הרקע אל %s:‏ %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "לא ניתן להכין את מצגת שולחן העבודה: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "סימון בדגל"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "סל האשפה"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "סל האשפה ריק"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "מחיקה"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "התמונות נמחקות"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "קבצים חסרים"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "מחיקה..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "היבוא האחרון"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "י_בוא מתיקייה..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "יבוא תמונות מהכונן לספרייה"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "ייבוא מ_יישום..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "מיון _אירועים"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "פינוי ה_אשפה"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "מחיקת כל התמונות באשפה"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "צפייה ב_אירוע עבור תמונה"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_חיפוש"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "חיפוש תמונות וקטעי וידאו לפי קריטריונים של חיפוש"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_קובץ"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "ע_ריכה"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_תמונה"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_תמונות"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_אירועים"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ת_גיות"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "ע_זרה"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "פרטים _בסיסיים"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "הצגת פרטים בסיסיים עבור הבחירה"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_פרטים מורחבים"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "הצגת פרטים מורחבים עבור הבחירה"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_סרגל חיפוש"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "הצגת סרגל החיפוש"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "סרגל _צד"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "הצגת סרגל הצד"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_עולה"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "סידור התמונות בסדר עולה"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_יורד"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "סידור התמונות בסדר יורד"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "יבוא מתיקייה"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "פינוי האשפה"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "האשפה מתרוקנת..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell מוגדרת לייבא תמונות לתיקיית הבית שלך.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "מיקום הספרייה"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "לא ניתן לייבא תמונות לתיקייה זו."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "הספרייה מתעדכנת..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "בהכנות ליבוא תמונות באופן אוטומטי...."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "התמונות מיובאות אוטומטית..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "נתוני העל נכתבים לקבצים..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ספרייה"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "מתבצע יבוא..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ע_צירת היבוא"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "עצירת יבוא התמונות"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "בהכנות ליבוא..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "יובאו %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_שמירה"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "שמירת התמונה"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "שמירה _בשם..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "שמירת תמונה בשם אחר"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "הדפסת התמונה במדפסת המחוברת למחשב שלך"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s אינו קיים."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s אינו סוג קובץ."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"ל־%s אין תמיכה במבנה הקובץ\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "שמירת _עותק"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "האם לאבד את השינויים לקובץ %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "סגירה _ללא שמירה"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "שגיאה בעת השמירה אל %s: ‏%s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "שמירה בשם"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "לא ניתן לעקוב אחר %s: לא תיקייה (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "מנהל תמונות"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "מציג תמונות"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "כל הזכויות שמורות 2009‏-2013 לעמותת יורבה"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "סיבוב _ימינה"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "סיבוב"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "סיבוב ימינה"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "סיבוב התמונות ימינה (לחיצה על Ctrl כדי לסובב שמאלה)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "סיבוב _שמאלה"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "סיבוב שמאלה"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "סיבוב התמונה שמאלה"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "היפוך או_פקית"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "היפוך אופקי"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "היפוך א_נכי"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "היפוך אנכי"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_שיפור"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "שיפור"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "שיפור חזות התמונה אוטומטית"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_חיתוך"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "חיתוך"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "חיתוך גודל התמונה"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "יי_שור"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "יישור"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "יישור התמונה"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_עיניים אדומות"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "עיניים אדומות"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "הפחתת או העלמת אפקטים של עיניים אדומות בתמונה"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "ה_תאמה"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "התאמה"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "התאמת גוון וצבע התמונה"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_שחזור למקור"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "שחזור למקור"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "ביטול עריכות _חיצוניות"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "שחזור לתמונה הראשית"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "הגדרה כ_רקע שולחן העבודה"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "הגדרת התמונה הנבחרת כרקע החדש לשולחן העבודה"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "הגדרה כ_מצגת שולחן העבודה..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_ביטול"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "ביטול"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "ביצוע _חוזר"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "ביצוע חוזר"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "החלפת _שם האירוע..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "הגדרה לתמונה המיי_צגת לאירוע"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "הגדרה לתמונה המייצגת לאירוע"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_אירוע חדש"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "אירוע חדש"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "העברת תמונות"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "העברת תמונות לאירוע"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "מי_זוג אירועים"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "מיזוג"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "חבר ארועים לארוע בודד"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "ה_גדרת דירוג"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "הגדרת דירוג"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "שינוי הדירוג לתמונה שלך"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "ה_גדלה"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "הגדלת הדירוג"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "ה_פחתה"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "הפחתת הדירוג"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_ללא דירוג"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "אין דירוג"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "ביטול הדירוג"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "הגדרה כלא מדורגת"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "הסרת כל הדירוגים"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "ד_חויהה"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "נדחה"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "דירוג דחויה"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "דרג כדחויה"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "הגדרת הדירוג לדחויה"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "נדחות _בלבד"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "הנדחות בלבד"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "הצגות התמונות שנדחו בלבד"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "הכול + _דחויות"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "הצגת כל התמונות, לרבות אלו שנדחו"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_כל התמונות"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "הצגת כל התמונות"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_דירוגים"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "הצגת הדירוג של כל תמונה"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_סינון תמונות"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "סינון תמונות"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "הגבלת מספר התמונות המוצגות בהתאם למסנן"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_שכפול"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "שכפול"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "שכפול התמונה"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "י_צוא..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "ה_דפסה..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "פ_רסום..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "פרסום"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "פרסום למגוון של אתרים"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "_עריכת הכותרת..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "ע_ריכת ההערה..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "עריכת ההערה"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_כיוון התאריך והשעה..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "כיוון תאריך ושעה"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "הוספת _תגיות..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_הוסף תגיות..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "הוספת תגיות"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "ה_עדפות"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "פתיחה בעורך _חיצוני"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "פתיחה באמצעות _עורך RAW"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "שליחה _אל..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_שלח ל..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "חיפוש..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "חיפוש"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "חיפוש תמונה על ידי הקלדת הטקסט המופיע בשמה או בתגיות שלה"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "סימון ב_דגל"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_ביטול הדגל"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "לא ניתן להפעיל את העורך: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "הוספת התגית \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "הוספת התגיות \"%s\" ו \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "מ_חיקת התגית \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "מחיקת התגית \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "מחיקת תגית"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_חדש"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_שינוי שם התגית \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "שינוי שם התגית \"%s\" ל־\"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_שינוי שם..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ה_חלפת תגיות..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "החלפת התגיות"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "תיוג התמונות בתור \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "תיוג תמונות בתור \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "תיוג התמונות הנבחרות בתור \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "תיוג התמונות הנבחרות בתור \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "הסרת התגית \"%s\" מתמו_נות"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "הסרת התגית \"%s\" מה_תמונות"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "הסרת התגית \"%s\" מתמונות"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "הסרת התגית \"%s\" מהתמונות"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "לא ניתן לשנות את שם התגית ל־\"%s\" כיוון שהתגית כבר קיימת."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "לא ניתן לשנות את שם החיפוש ל־\"%s\" כיוון שהחיפוש כבר קיים."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "חיפוש שנשמר"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "מחיקת החיפוש"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "ע_ריכה..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_שינוי שם..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "שינוי שם החיפוש \"%s\" לשם \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "מחיקת החיפוש \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "דירוג %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "הגדרת הדירוג ל־%s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "הדירוג מוגדר ל־%s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "הצגת %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "יש להציג תמונות בדירוג %s בלבד"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ומעלה"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "הצגת %s ומעלה"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "רק תמונות בעלות דירוג של %s ומעלה"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "הסרת התמונות הנבחרות מהאשפה"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "הסרת התמונות הנבחרות מהספרייה."
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_שחזור"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "העברת התמונות הנבחרות בחזרה לספרייה"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "הצ_גה במנהל הקבצים"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "פתיחת תיקיית התמונה הנבחרת במנהל הקבצים"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "לא ניתן לפתוח במנהל הקבצים: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "ה_סרה מהספרייה"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ה_עברה לאשפה"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "בחירת ה_כול"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "בחירת כל הפריטים"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a ה־%b ב%d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a ה־%d ב%b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "זווית:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_איפוס"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "חזרה לממדי התמונה המקוריים"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "הגדרת החיתוך לתמונה זו"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "הטיית ריבוע החיתוך בין הגדרת כיווניות לאורך לבין הגדרת כיוונית לרוחב"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "ללא קיבוע"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "ריבוע"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "מסך"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "הגודל המקורי"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "וידאו SD‏ (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "וידאו HD‏ (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 אינץ')"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 אינץ')"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 מ\"מ)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 מ\"מ)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "סגירת הכלי לעיניים אדומות"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "הסרת אפקטים של עין אדומה באזור הנבחר"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "רוויה:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "גוון:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "טמפרטורה:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "צללים:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "איפוס הצבעים"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "איפוס כל ההתאמות לצבע המקורי"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "טמפרטורה"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "גוון"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "רוויה"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "חשיפה"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "צללים"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "הרחבת הניגודיות"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "הצמדת סרגל הכלים"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "הצמדת סרגל הכלים שיישאר פתוח"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "יציאה ממסך מלא"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "יציאה ממסך מ_לא"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "י_ציאה"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "על _אודות"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "מ_סך מלא"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_תכנים"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "שאלות _נפוצות"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_דווח על בעיה..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"אירעה שגיאה קריטית בעת הגישה לספרייה של Shotwell. ‏Shotwell לא תוכל להמשיך.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "ביקור באתר של Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "ירון שהרבני <sh.yaron@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "לא ניתן להציג את העזרה: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "אין אפשרות לגלוש למסד נתוני התקלות: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "לא ניתן להציג את השאלות הנפוצות: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "ללא שם"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "הגודל המקורי"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "רוחב או גובה"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "רוחב"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "גובה"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "התאמת גודל התמונות הממוזערות"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "הגדלת רמת התקריב בתמונות הממוזערות"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "הקטנת רמת התקריב בתמונות הממוזערות"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_סידור תמונות"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "נגינת _וידאו"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "פתיחת קטעי הווידאו הנבחרים בנגן הווידאו של המערכת"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "ה_ערות"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "יש להציג הערה זו עבור כל תמונה"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "הצגת התגיות עבור כל תמונה"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "לפי _כותרת"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "סידור התמונות לפי כותרת"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "לפי תאריך _חשיפה"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "דירוג התמונות לפי תאריך החשיפה"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "לפי _דירוג"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "סידור התמונות לפי דירוג"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"לא הייתה באפשרות Shotwell לנגן את הווידאו הבא:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d תמונות/קטעי וידאו"
+msgstr[1] "תמונה/וידאו %d"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "הצגת הערה לכל אירוע"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "אין אירועים"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "לא נמצאו אירועים"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "אירועים"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "ללא תאריך"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "אין אירועים"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "אין אפשרות לייצר את ספריית המטמון %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "לא ניתן ליצור את תיקייה הנתונים %s:‏ %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "תמונות"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "לא ניתן ליצור את התיקייה הזמנית %s:‏ %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "לא ניתן ליצור את תת־תיקיית הנתונים %s: ‏%s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(אין)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "אין"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "אקראי"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "מעברים במצגת"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "לא ניתן ליצור את הקובץ הזמני עבור %s:‏ %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "יצוא"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "הקובץ %s כבר קיים. להחליף?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_דילוג"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "ה_חלפה"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "החלפת ה_כול"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "יצוא"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "תמונות"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "קטעי וידאו"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "תמונות גולמיות (RAW)"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "תמונות גולמיות (RAW)"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "שגיאה בטעינת קובץ מנשק המשתמש %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "סוג"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "פרסום"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "התמונה/וידאו הנבחרים פורסמו בהצלחה."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "קטעי הווידאו פורסמו בהצלחה."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "התמונות הנבחרות פורסמו בהצלחה."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "קטע הווידאו הנבחר פורסם בהצלחה."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "התמונה הנבחרת פורסמה בהצלחה."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "פרטי החשבון מתקבלים..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "בהליכי כניסה..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "פרסום תמונות"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "פרסום תמונות _אל:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "פרסום קטעי וידאו"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "פרסום קטעי וידאו _אל:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "פרסום תמונות וקטעי וידאו"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "פרסום תמונות וקטעי וידאו _אל:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "לא ניתן לפרסם"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell אינו יכול להעלות את התכנים המבוקשים מאחר ואין תוסף טעינה מתאים "
+"לשרות הנדרש. על מנת לתקן זאת, בחר באפשרות <b>ערוך העדפות %s</b> והפעל את אחד "
+"או יותר מתוספי ההעלאה בלשונית <b>תוספים</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "בהכנה להעלאה"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d נשלחו מתוך %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "לא ניתן להמשיך בפרסום אל %s כיוון שאירעה שגיאה:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "כדי לנסות לפרסם לשירות אחד, יש לבחור באחד מהתפריט שלהלן."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "תגית _חדשה..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"קובץ זמני הנדרש להפקה אינו זמין"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"נכון לעכשיו לא נכנסת לשירות YouTube.\n"
+"\n"
+"כדי להמשיך אמור להיות ברשותך חשבון Google המוגדר לשימוש בשילוב YouTube. ניתן "
+"להגדיר את רוב החשבונות על ידי שימוש בדפדפן האינטרנט שלך כדי להיכנס ל־YouTube "
+"לפחות פעם אחת."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"קובץ הנדרש להעלאת התוכן אינו זמין. העלאת התוכן ל-Youtube לא תוכל להתבצע."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "נכנסת ל־YouTube בשם %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "קטעי הווידאו יופיעו בתוך '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "הצגה ציבורית"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "לא מוצג לכלל הציבור"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "פרטי"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "שירותי פרסום של הליבה"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"לא נכנסת ל־Flickr.\n"
+"\n"
+"יש ללחוץ על כניסה כדי להיכנס ל־Flickr בדפדפן שלך. יהיה עליך לאמת את "
+"Shotwell Connect כדי לקשר אל חשבון ה־Flickr שלך."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"כבר נכנסת ויצאת מ־Flick במהלך הפעלה זו של Shotwell.\n"
+"כדי להמשיך לפרסם ל־Flickr, עליך לצאת ולהפעיל מחדש את Shotwell ואז לנסות "
+"לפרסם שוב."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "בהכנות לכניסה..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"קובץ הנדרש להעלאת התוכן אינו זמין. העלאת התוכן ל-Flickr לא תוכל להתבצע."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "האימות בווידוא..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"נכנסת ל־Flickr בשם %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"חשבונך הפטור מתשלום ב־Flickr מגביל את כמות המידע שניתן להעלות בחודש.\n"
+"החודש, נותרו לך %d מגה בתים במכסת ההעלאה שלך."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "חשבון ה־Flickr Pro שלך מזכה אותך בכמויות העלאה בלתי מוגבלות."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "התמונות _גלויות לעיני:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "קטעי הווי_דאו גלוים לעיני:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "הת_מונות וקטעי הווידאו גלויים לעיני:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "כולם"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "חברים ומשפחה בלבד"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "רק משפחה"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "רק חברים"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "רק לי"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500‎ × 375 פיקסלים"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024‎ × 768 פיקסלים"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x‏ 1536 פיקסלים"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x‏ 3072 פיקסלים"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "מייצר אלבום %s…"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "אירעה שגיאה בעת הפרסום לפיוויגו. נא לנסות שוב."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"הזן את כתובת האתר של ספריית התמונות Piwigo שלך וכן את שם המשתמש והסיסמה "
+"לגישה לחשבון -Piwigo שלך עבור ספריה זו."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell אינו יכול להתחבר לספריית התמונות Piwigo. אנא בדוק את כתובת האתר "
+"שהזנת"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"שם המשתמש ו/או הססמה אינם נכונים. נא לנסות שנית"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "כתובת אתר לא תקינה"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"שם משתמש או ססמה שגויים"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "מנהלי מערכת, משפחה, חברים, אנשי קשר"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "מנהלי מערכת, משפחה, חברים"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "מנהלי מערכת, משפחה"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "מנהלי מערכת"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"אינך מחובר לאתר Picasa Web Albums.\n"
+"\n"
+"הקלק על התחבר בכדי להכנס לחשבונך ב-Picasa Web Albums בדפדפן שלך. תצטרך לאשר "
+"ל-Shotwell להתחבר על מנת לקשר לחשבון Picasa Web Albums שלך."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"קובץ הנדרש להעלאת התוכן אינו זמין. העלאת התוכן ל-Picasa לא תוכל להתבצע."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "אלבום נוצר..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "נכנסת ל־Picasa Web Albums בשם %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "קטעי הווידאו יופיעו בתוך:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "התמונות יופיעו תחת:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "קטנה (640 x‏ 480 פיקסלים)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "בינונית (1024 x‏ 768 פיקסלים)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "מומלצת (1600 x‏ 1200 פיקסלים)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 פיקסלים)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"נכון לעכשיו לא ביצעת כניסה לחשבון ה־Facebook שלך.\n"
+"\n"
+"אם עדיין אין לך חשבון Facebook, באפשרותך ליצור אחד במהלך הכניסה. במשך תהליך "
+"הכניסה, Shotwell Connect עלול לבקש את רשותך להעלות תמונות ולפרסם אותן בהזנה "
+"שלך. הרשאות אלו נחוצות כדי ש־Shotwell Connect יוכל לתפקד."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"כבר יצאת מ־Facebook במהלך הפעלה זו של Shotwell.\n"
+"כדי להמשיך לפרסם ל־Facebook, עליך לצאת ולהפעיל מחדש את Shotwell ואז לנסות "
+"לפרסם שוב."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "רגיל (720 פיקסלים)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "גדול (2048 פיקסלים)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "החיבור ל־Facebook נבדק..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"קובץ הנדרש להעלאת התוכן אינו זמין. העלאת התוכן ל-Facebook לא תוכל להתבצע."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"נכנסת ל־Facebook בשם %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "להיכן ברצונך לפרסם את התמונות הנבחרות?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "גודל הה_עלאה:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "חברים"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "התפוררות"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "שח מט"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "עיגולים"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "תריסים"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "פסים"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "שעון"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "עיגול"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "מעברי ליבה של מצגות"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"כל הזכויות שמורות 2010 למקסים קרטשב, כל הזכויות שמורות 2011-2013 לעמותת יורבה"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "שקופית"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "עמעום"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ריבועים"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "שרותי ייבוא מידע בסיסי"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"ברוך בואך לשרות ייבוא הספריה של F-Spot.\n"
+"\n"
+"אנא בחר ספריה לייבוא, או ע\"י בחירת אחת הספריות שאותרו ע\"י Shotwell או ע\"י "
+"בחירת קובץ מסד נתונים של F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"ברוך בואך לשרות ייבוא הספריה של F-Spot.\n"
+"\n"
+"אנא בחר קובץ מסד נתונים של F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "בחר באופן ידני קובץ מסד נתונים של F-Spot לטעינה:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"אין אפשרות לפתוח את קובץ מסד הנתונים של F-Spot: הקובץ לא קיים או שאינו קובץ "
+"מסד נתונים"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"אין אפשרות לפתוח את קובץ מסד הנתונים של F-Spot: גרסת הקובץ אינה נתמכת ע\"י "
+"Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"אין אפשרות לפתוח את קובץ מסד הנתונים של F-Spot: חלה שגיאה בעת טעינת טבלת "
+"התגיות"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"אין אפשרות לפתוח את קובץ מסד הנתונים של F-Spot: חלה שגיאה בעת טעינת טבלת "
+"התמונות."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell מצא %d תמונות בספריית F-Spot והן מיובאות כרגע.תמונות כפולות יזוהו "
+"ויוסרו באופן אוטומטי.\n"
+"\n"
+"באפשרותך לסגור חלונית זו ולהתחיל להשתמש ב-Shotwell בזמן שהייבוא מתבצע ברקע."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "ספריית F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "מתכונן לייבוא"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "הגדרה כמצגת שולחן העבודה"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "יצירת מצגת לרקע שולחן העבודה"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "הצגת כל תמונה למשך"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "משך הזמן"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "כמה זמן תופיע כל תמונה ברקע שולחן העבודה"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "חיפוש"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_שם החיפוש:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "ה_תאמה"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "מהבאים:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>גודל התמונה המודפסת</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "שימוש בגודל _רגיל:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "שימוש בגודל _מותאם אישית:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "התאמת _יחס התצוגה של התמונה"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_גודל אוטומטי:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>כותרות</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "הדפסת _כותרת התמונה"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>רזולוציית הפיקסלים</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_פלט התמונה תחת:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "פיקסלים לאינטש"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"תווית"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell העדפות"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "לבן"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "שחור"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "מ_עקב אחר התיקייה של הספרייה לגילוי קבצים חדשים"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "נתוני על"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "ניתן לכתוב תגיות, כותרות ונתוני על נוספים לקובצי תמונה"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "תצוגה"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "י_בוא תמונות אל:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_רקע:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "בהליכי יבוא"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "מבנה ה_תיקיות:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ת_בנית:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "דוגמה:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "שי_נוי שמות כל הקבצים המיובאים לאותיות קטנות"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "מתכנת ה־RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_ברירת מחדל"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "עורך תמונות _חיצוני:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "עורך RAW _חיצוני:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "עורכים חיצוניים"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "תוספים"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "ה_שהיה:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_אפקט מעבר:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "ה_שהיית המעבר:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "הצג _כותרת"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "שניות"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_כניסה"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "פרסום לאלבום _קיים:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "יצירת אלבום _חדש בשם:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "קטעי הווידאו והתמונות החדשים _גלויים לעיני:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "י_ציאה"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_פרסום"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "נא להזין את מספר האימות שמופיע לאחר הכניסה ל־Flickr בדפדפן שלך."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "מספר ה_אימות:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_גודל תמונה:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "אלבום _קיים:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_אלבום חדש בשם:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "ה_צגת האלבום בגלריה ציבורית"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "ערכת _גודל התמונה:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_כתובת של ספריית התמונות שלך ב־Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_שם משתמש"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_ססמה"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_זכור ססמה"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "כניסה"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_קטגוריה קיימת:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "התמונות יהיו זמינות _עד:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "גודל התמונה:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "התנתקות"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "הגדרות ה_פרטיות של הווידאו:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "כל הזכויות שמורות 2012 ל־BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280‎ × 853 פיקסלים"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' אינו פלט תקין לבקשת אימות מסוג OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( )‎: אינו ניתן לאתחול, כיוון שמנשק זה אינו ניתן לאתחול "
+"מחדש."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "נא להזין את שם המשתמש והססמה של חשבון ה־Tumblr שלך"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "טעינת המנשק נכשלה: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"נכנסת לחשבונך ב־Tumblr בשם %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "כל הזכויות שמורות 2010+ ל־Evgeniy Polyakov‏ <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "ביקור באתר Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "לא נכנסת לשירות Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "כתובת _דוא״ל"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"נכנסת לחשבון ה־Tumblr בשם (name).\n"
+"\n"
+"(תווית זו נקבעת בתוך הקוד, \n"
+"ולכן שינויים כאן לא יוצגו)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "בלוגים:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_אלבומים (או כתיבת חדש):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_סוג הגישה"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "נטרול הה_ערות"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_איסור הורדת התמונה המקורית"
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..18960dc
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,4547 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# rajesh <rajeshkajha@yahoo.com>, 2012
+# Rajesh Ranjan <rranjan@redhat.com>, 2012-2013
+# Shaswat Nimesh <shaw337@gmail.com>, 2011
+# Rajesh Ranjan <rajesh>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Rajesh Ranjan <rranjan@redhat.com>\n"
+"Language-Team: Hindi (http://www.transifex.com/projects/p/shotwell/language/"
+"hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "कार्यक्रम %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "कैमरा"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "कैमरा"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "कैमरा अनारोहित करने में त्रुटि. फ़ाइल प्रबंधक से कैमरा को अनारोहित करने में त्रुटि."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "पहले से आयातित फोटो छिपाएँ"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "केवल उन्हीं फोटो को दिखाएँ जो आयातित नहीं किया गया है"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "आयात आरंभ कर रहा है, कृपया प्रतीक्षा करें..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "शीर्षक (_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "हर फ़ोटो का शीर्षक दिखाएँ"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "आयात चयनित (_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "अपनी लाइब्रेरी में चुने गए फ़ोटो आयात करें"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "सभी आयात करें (_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "सभी फ़ोटो को अपनी लाइब्रेरी में आयात करें"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"शॉटवेल को कैमरा को फ़ाइलतंत्र से अनारोहित करने की जरूरत है ताकि इसकी पहुँच ली जा सके. "
+"जारी रखें?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "अनारोहित करें (_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "कृपया कैमरा अनारोहित करें"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"यह कैमरा किसी दूसरे अनुप्रयोग के द्वारा लॉक किया गया है. शॉटवेल केवल तभी कैमरा की पहुँच "
+"ले सकता है जब यह अनलॉक हो. कृपया किसी दूसरे अनुप्रयोग को कैमरा के उपयोग से चुनें और फिर "
+"कोशिश करें."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "इस कैमरा के उपयोग से किसी दूसरे अनुप्रयोग को बंद करें."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"कैमरा के पूर्वावलोकन लाने की कोशिश करें:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "अनारोहित कर रहा है..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "तस्वीर सूचना ले रहा है"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s के लिए पूर्वावलोकन ला रहा है"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "कैमरा लॉक करने में असमर्थ: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "कैमरा से इस फोटो को मिटाएँ?"
+msgstr[1] "कैमरा से %d फोटो को मिटाएँ?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "कैमरा से इस वीडियो को मिटाएँ?"
+msgstr[1] "कैमरा से %d वीडियो को मिटाएँ?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "कैमरा से इस फोटो/वीडियो को मिटाएँ?"
+msgstr[1] "कैमरा से इस %d फोटो/वीडियो को मिटाएँ?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "कैमरा से इस फ़ाइल को मिटाएँ?"
+msgstr[1] "कैमरा से %d फ़ाइल को मिटाएँ?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "बनाए रखें (_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "कैमरा से फ़ोटो/वीडियो हटा रहा है"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "त्रुटियों के कारण कैमरा से %d फ़ोटो/वीडियो हटाने में असमर्थ."
+msgstr[1] "त्रुटियों के कारण कैमरा से %d फ़ोटो/वीडियो हटाने में असमर्थ."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "स्लाइड शो (_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "एक स्लाइड शो चलायें "
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "निर्यात फोटो / वीडियो"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "फ़ोटो/वीडियो निर्यात करें"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "निर्यात फोटो"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "निर्यात तस्वीरें"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "घूर्णन"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "घूर्णन पूर्ववत्"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "आड़ापलटें"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "आड़ापलटें पूर्ववत्"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "अनुलंब फ़्लिप "
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "पूर्ववत् अनुलंब फ़्लिप "
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "कोई पाठ"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "शीर्षक"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "टैग"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "कार्यक्रम नाम"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "पूरा नाम"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "मीडिया प्रकार"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "फ्लैग स्थिति"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "दर"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "तिथि"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "समाहित करता है"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "पूरी तरह से"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "इससे आरंभ होता है"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "इससे अंत होता है"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "नहीं रखता है"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "सेट नहीं है"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "है"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "है नहीं"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "कोई फ़ोटो"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "कोई असंपादित फ़ोटो"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "वीडियो"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "फ्लैग किया हुआ"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "फ्लैग नहीं किया गया है"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "और उच्चतर"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "केवल"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "और निचला"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "इसके पश्चात है"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "इसके पहले है"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "बीच में है"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "और"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "कोई भी"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "सभी"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "कुछ नहीं"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "सहेजे खोज"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "नया सहेजा खोज (_w)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"आपकी फ़ोटो लाइब्रेरी शॉटवेल के इस संस्करण के साथ संगत नहीं है. ऐसा लगता है कि यह शॉटवेल "
+"%s (स्कीमा %d) के द्वारा निर्मित था. यह संस्करण %s (schema %d) है. कृपया शॉटवेल के "
+"नवीनतम संस्करण का उपयोग करें."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"शॉटवेल %s संस्करण (स्कीमा %d) से %s (स्कीमा %d) में आपकी फ़ोटो लाइब्रेरी को उन्नत बनाने में "
+"असमर्थ था. अधिक जानकारी के लिए %s पर शॉटवेल विकि जाँचें."
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"आपकी फ़ोटो लाइब्रेरी शॉटवेल के इस संस्करण के साथ संगत नहीं है. ऐसा लगता है कि यह शॉटवेल "
+"%s (स्कीमा %d) के द्वारा निर्मित था. यह संस्करण %s (स्कीमा %d) है. कृपया अपनी लाइब्रेरी "
+"को %s को मिटाकर साफ करें अपनी तस्वीर को फिर से आयात करें."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "शॉटवेल डेटाबेस जाँचने के लिए प्रयास करने में अज्ञात त्रुटि: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "शॉटवेल लोड कर रहा है"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "शॉटवेल के निजी आँकड़ा का रास्ता"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "निर्देशिका"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "परिवर्तन के लिए रनटाइम पर लाइब्रेरी निर्देशिका मॉनिटर करें"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "आरंभन प्रगति मीटर को मत दिखाएँ"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "अनुप्रयोग संस्करण दिखाएँ"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "चलाएँ '%s --help' उपलब्ध कमांड लाइन विकल्प की पूरी सूची देखने हेतु.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "आज"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "कल"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "शीर्षक:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "मद:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d कार्यक्रम"
+msgstr[1] "%d कार्यक्रम"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d फ़ोटो"
+msgstr[1] "%d फ़ोटो"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d वीडियो"
+msgstr[1] "%d वीडियो"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "तिथि:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "समय:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "से:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "तक:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "आकार:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "अवधिः"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f सेकेंड"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "डेवलपर"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "एक्सपोज़रः"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "स्थानः"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "फ़ाइल आकार:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "मौजूदा विकास:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "मौलिक आयाम:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "कैमरा निर्माण:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "कैमरा मॉडल:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "फ्लैश:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "फोकल लम्बाई:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "एक्सपोजर तिथि:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "एक्सपोज़र समय:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "एक्सपोज़र बायस:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "जीपीएस अक्षांश:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "जीपीएस देशान्तर:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "कलाकारः"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "कॉपीराइट:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "सॉफ्टवेयरः"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "टिप्पणीः"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "विस्तारित सूचना"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "यह \"%s\" को एक फ़ोटो से टैग हटा देगा. जारी रखें?"
+msgstr[1] "यह \"%s\" को %d फ़ोटो से टैग हटा देगा. जारी रखें?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_रद्द"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "मिटाएँ (_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "यह सहेजे खोज \"%s\" को हटा देगा. जारी रखें?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"डेवलेपर को बदला जाना इस फोटो में शॉटवेल में किए गए सभी परिवर्तनों को पहले जैसा कर देगा"
+msgstr[1] ""
+"डेवलेपर को बदला जाना इस फोटो में शॉटवेल में किए गए सभी परिवर्तनों को पहले जैसा कर देगा"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "डेवलेपर बदलें (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "निर्यात वीडियो"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"शॉटवेल इस फोटो को संपादित करने के लिए फ़ाइल नहीं बना सका क्योंकि आपके पास %s में लिखने "
+"की अनुमति नहीं है."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr "निम्नलिखित फ़ाइल त्रुटि के कारण तस्वीर निर्यात करने में असमर्थ है.\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"आप निर्यात जारी रखना चाहते चाहेंगे?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "जा_री"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "असंशोधित"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "वर्तमान"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "प्रा_रूप"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "गुण_वत्ता"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "अनुमापन बाधा (_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "पिक्सल (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "मेटाडेटा निर्यात करें"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "विवरण सहेजें..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "विवरण सहेजें"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(%d और अधिक) \n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "परिणाम रिपोर्ट आयात करें"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d फ़ाइल आयात करने का प्रयास."
+msgstr[1] "%d फ़ाइलों को आयात करने का प्रयास."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "इनमें से, %d फ़ाइल सफलतापूर्वक आयात किए गए."
+msgstr[1] "इनमें से, %d फ़ाइलों को सफलतापूर्वक आयात किया गया."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "नक़ली तस्वीर/वीडियो का आयात नहीं:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "मौजूदा मीडिया पर की नक़ल"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "कैमरा त्रुटि के कारण तस्वीर/वीडियो आयात नहीं किए गए:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "त्रुटि संदेश:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "फ़ाइल आयात नहीं किए गए क्योंकि उन्हें तस्वीर या वीडियो के रूप में पहचाना नहीं गया:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"तस्वीर/वीडियो आयात नहीं किया गया क्योंकि वे उन प्रारूप में नहीं हैं जिन्हें शॉटवेल समझता था:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"तस्वीर/वीडियो आयात नहीं किया गया क्योंकि शॉटवेल उन्हें लाइब्रेरी के रूप में नक़ल किया गया:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s की नक़ल नहीं ली जा सकी\n"
+"\tto %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "अन्य कारणों के लिए तस्वीर/वीडियो आयात नहीं किया गया:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 डुप्लिकेट तस्वीर नहीं आयात किया गया:\n"
+msgstr[1] "%d डुप्लिकेट तस्वीर नहीं आयात किया गया:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 डुप्लिकेट वीडियो आयात नहीं थे:\n"
+msgstr[1] "%d डुप्लिकेट घ वीडियो आयात नहीं थे:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 तस्वीरें डुप्लिकेट / वीडियो आयात नहीं थे:\n"
+msgstr[1] "%d तस्वीरें डुप्लिकेट / वीडियो आयात नहीं थे:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 तस्वीर के लिए एक फ़ाइल या हार्डवेयर त्रुटि के कारण आयात करने में विफल रहा है:\n"
+msgstr[1] ""
+"%d तस्वीर के लिए एक फ़ाइल या हार्डवेयर त्रुटि के कारण आयात करने में विफल रहा है:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 वीडियो के लिए एक फ़ाइल या हार्डवेयर त्रुटि के कारण आयात करने में विफल रहा है:\n"
+msgstr[1] ""
+"%d वीडियो के लिए एक फ़ाइल या हार्डवेयर त्रुटि के कारण आयात करने में विफल रहा है:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 तस्वीर / वीडियो के लिए एक फ़ाइल या हार्डवेयर त्रुटि की वजह से आयात करने में विफल रहा "
+"है:\n"
+msgstr[1] ""
+"%d तस्वीर / वीडियो के लिए एक फ़ाइल या हार्डवेयर त्रुटि की वजह से आयात करने में विफल रहा "
+"है:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "1 फ़ाइल आयात किए जाने में विफल रहा किसी फ़ाइल या हार्डवेयर त्रुटि के कारण:\n"
+msgstr[1] "%d फ़ाइल आयात किए जाने में विफल रहा किसी फ़ाइल या हार्डवेयर त्रुटि के कारण:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 फ़ोटो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं था:\n"
+msgstr[1] ""
+"%d फ़ोटो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं था:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 वीडियो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं था:\n"
+msgstr[1] ""
+"%d वीडियो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं "
+"था:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 फोटो/वीडियो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं "
+"था:\n"
+msgstr[1] ""
+"%d फोटो/वीडियो आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य "
+"नहीं था:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 फ़ाइल आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं था:\n"
+msgstr[1] ""
+"%d फ़ाइल आयात किए जाने में विफल रहा क्योंकि फ़ोटो लाइब्रेरी फ़ोल्डर लिखने योग्य नहीं था:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 तस्वीर एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+msgstr[1] "%d तस्वीर एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 वीडियो के लिए एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+msgstr[1] "%d वीडियो के लिए एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 तस्वीर / वीडियो के लिए एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+msgstr[1] ""
+"%d तस्वीर / वीडियो के लिए एक कैमरा त्रुटि के कारण आयात करने में विफल रहा है:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 फ़ाइल कैमरा त्रुटि के कारण आयात किए जाने में विफल रहा:\n"
+msgstr[1] "%d फ़ाइल कैमरा त्रुटि के कारण आयात किए जाने में विफल रहा:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 असमर्थित तस्वीरों को छोड़ दिया:\n"
+msgstr[1] "%d असमर्थित तस्वीरों को छोड़ दिया:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 गैर-छवि फ़ाइलों को छोड़ दिया.\n"
+msgstr[1] "%d गैर-छवि फ़ाइलों को छोड़ दिया.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 तस्वीर उपयोगकर्ता रद्द की वजह से छोड़ दिया:\n"
+msgstr[1] "%d तस्वीर उपयोगकर्ता रद्द की वजह से छोड़ दिया:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 वीडियो उपयोगकर्ता रद्द की वजह से छोड़ दिया:\n"
+msgstr[1] "%d वीडियो उपयोगकर्ता रद्द की वजह से छोड़ दिया:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 तस्वीर / वीडियो को रद्द करने के लिए उपयोगकर्ता के कारण छोड़ दिया:\n"
+msgstr[1] "%d तस्वीर / वीडियो को रद्द करने के लिए उपयोगकर्ता के कारण छोड़ दिया:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 फ़ाइल उपयोक्ता रद्दीकरण के कारण छोड़ा गया:\n"
+msgstr[1] "%d फ़ाइल उपयोक्ता रद्दीकरण के कारण छोड़ा गया:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 तस्वीर सफलतापूर्वक आयात किया.\n"
+msgstr[1] "%d तस्वीर सफलतापूर्वक आयात किया.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 वीडियो सफलतापूर्वक आयात किया.\n"
+msgstr[1] "%d वीडियो सफलतापूर्वक आयात किया.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+"1 फ़ोटो/वीडियो सफलतापूर्वक आयात की गयी.\n"
+"\n"
+msgstr[1] "%d फ़ोटो/वीडियो सफलतापूर्वक आयात की गयी.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "कोई फ़ोटो या वीडियो नहीं आयातित किया गया.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "आयात संपन्न"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d सेकेंड"
+msgstr[1] "%d सेकेंड"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d मिनट"
+msgstr[1] "%d मिनट"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d घंटा"
+msgstr[1] "%d घंटे"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 दिन"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "कार्यक्रम बदलें"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "नाम:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "शीर्षक संपादित करें"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "फ़ाइल रद्दी में ले जाएँ (_T)"
+msgstr[1] "फ़ाइलों को रद्दी में ले जाएँ (_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "केवल हटाएँ (_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "बाहरी संपादन वापस लें?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "बाहरी संपादन वापस लें?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "यह बाहरी फ़ाइल में किए गए सभी परिवर्तनों को नष्ट कर देगा. जारी रखें?"
+msgstr[1] "यह %d बाहरी फ़ाइल में किए गए सभी परिवर्तनों को नष्ट कर देगा. जारी रखें?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "बाहरी संपादन वापस लें (_v)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "बाहरी संपादन वापस लें (_v)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "यह लाइब्रेरी से फ़ोटो हटा देगा. जारी रखें?"
+msgstr[1] "यह लाइब्रेरी से %d फ़ोटो हटा देगा. जारी रखें?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "हटाएं (_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "लाइब्रेरी से फ़ोटो हटाएँ"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "लाइब्रेरी से फ़ोटो हटाएँ"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "पूर्वाह्न"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "अपराह्न"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 घंटे"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "समान मात्रा के द्वारा फ़ोटो/वीडियो शिफ्ट करें (_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "इस समय सभी फ़ोटो/वीडियो सेट करें (_a)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "मूल फोटो फ़ाइल बदलें (_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "मूल फोटो फ़ाइलें बदलें (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "मूल फ़ाइल बदलें (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "मूल फ़ाइल बदलें (_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "असली:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"एक्सपोजर समय आगे बढ़ा दिया जाएगा\n"
+"%d %s, %d %s, %d %s, और %d %s से."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"एक्सपोजर समय पीछे कर दिया जाएगा\n"
+"%d %s, %d %s, %d %s, और %d %s से."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "दिन"
+msgstr[1] "दिन"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "घंटा"
+msgstr[1] "घंटे"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "मिनट"
+msgstr[1] "मिनट"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "सेकेंड"
+msgstr[1] "सेकेंड"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"और %d अन्य."
+msgstr[1] ""
+"\n"
+"\n"
+"और %d अन्य."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "टैग (कौमा से अलग):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "सुस्वागतम्!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "शॉटवेल में स्वागत है!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "इससे आरंभ करने के लिए, इनमें से किसी में फ़ोटो आयातित करें:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">फ़ाइल %s को फ़ोल्डर से आयात करें</span> चुनें"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "शॉटवेल विंडो पर फ़ोटो खीचें और छोड़ें"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "अपने कंप्यूटर में कैमरा कनेक्ट करें और आयातित करें"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "आपके %s फ़ोल्डर से फ़ोटो आयातित करें (_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "आप इनमें से किसी तरीके में फ़ोटो आयातित कर सकते हैं:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "इस संदेश को फिर मत दिखाएँ (_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "आपकी %s लाइब्रेरी से फ़ोटो आयात करें"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(मदद)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Year%sMonth%sDay"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Year%sMonth"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Year%sMonth-Day"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Year-Month-Day"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "मनपसंद"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "अमान्य नमूना"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"शॉटवेल आपके लाइब्रेरी फ़ोल्डर में फोटो की नक़ल ले सकता है या यह बिना आपको नक़ल किए आयात "
+"कर सकता है."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "फ़ोटो की नक़ल लें (_p)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "यथास्थान आयात करें (_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "लाइब्रेरी में आयात करें"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "लाइब्रेरी से हटाएँ"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "लाइब्रेरी से फ़ोटो हटाएँ"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "लाइब्रेरी से फ़ोटो हटा रहा है"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यह आपकी शॉटवेल लाइब्रेरी से फ़ोटो/वीडियो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप रद्दी "
+"में खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+msgstr[1] ""
+"यह आपकी शॉटवेल लाइब्रेरी से %d फ़ोटो/वीडियो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप "
+"रद्दी में खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यह आपकी शॉटवेल लाइब्रेरी से वीडियो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप रद्दी में "
+"खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+msgstr[1] ""
+"यह आपकी शॉटवेल लाइब्रेरी से %d वीडियो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप रद्दी में "
+"खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यह आपकी शॉटवेल लाइब्रेरी से फोटो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप रद्दी में "
+"खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+msgstr[1] ""
+"यह आपकी शॉटवेल लाइब्रेरी से %d फोटो को हटा देगा. क्या आप फ़ाइल को डेस्कटॉप रद्दी में "
+"खिसकाना चाहते हैं?\n"
+"\n"
+"इस क्रिया को वापस नहीं लिया जा सकता है."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"फोटो या वीडियो को डेस्कटॉप रद्दी में नहीं भेजा जा सकता है. इस फ़ाइल को मिटाएँ?"
+msgstr[1] ""
+"%d फोटो या वीडियो को डेस्कटॉप रद्दी में नहीं भेजा जा सकता है. इन फ़ाइल को मिटाएँ?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "फोटो या वीडियो मिटायी नहीं जा सकती है."
+msgstr[1] "%d फोटो या वीडियो मिटायी नहीं जा सकती है."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "फ़ोल्डर"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "टैग्स"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "सफलता"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "फ़ाइल त्रुटि"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "फ़ाइल डिकोड करने में असमर्थ"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "डेटाबेस त्रुटि"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "उपयोक्ता छोड़ा आयात"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "एक फ़ाइल नहीं"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "फ़ाइल डेटाबेस में पहले से मौजूद"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "असमर्थित फ़ाइल प्रारूप"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "कोई छवि फ़ाइल नहीं"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "डिस्क विफलता"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "डिस्क पूर्ण"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "कैमरा त्रुटि"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "फ़ाइल लेखन त्रुटि"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "आयातित विफल (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "परिवर्धित"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "पिछला फ़ोटो"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "अगली तस्वीर"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "फ़ोटो स्रोत फ़ाइल अनुपस्थित: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "देखें (_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "उपकरण (_o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "पिछला फ़ोटो (_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "पिछला फ़ोटो"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "अगला फ़ोटो (_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "अगला फ़ोटो"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "बड़ा करें (_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "फ़ोटो का आवर्द्धन बढ़ाएँ"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "छोटा करें (_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "फ़ोटो का आवर्द्धन घटाएँ"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "पृष्ठ में बैठाएँ (_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "स्क्रीन पर बैठाने के लिए तस्वीर को बड़ा-छोटा करें"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "बड़ा-छोटा करें _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+msgid "Zoom the photo to 100% magnification"
+msgstr "फ़ोटो को 100% आवर्द्धन के लिए बड़ा-छोटा करें"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "बड़ा-छोटा करें _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+msgid "Zoom the photo to 200% magnification"
+msgstr "फ़ोटो को 200% आवर्द्धन के लिए बड़ा-छोटा करें"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "डेवलेपर (_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s को निर्यात करने में असमर्थ: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s डाटाबेस"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s से आयात जारी नहीं रह सकता है क्योंकि एक त्रुटि आयी:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "दूसरी सेवाओं से आयात करने की कोशिश करने के लिए,ऊपर के मेन्यू से किसी एक को चुनें."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "डेटा आयात"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"आपके पास कोई डाटा आयात प्लगइन सक्रिय नहीं है.\n"
+"\n"
+"अनुप्रयोग कार्यशीलता से आयात के उपयोग के क्रम में, आपके पास कम से कम एक डाटा आयात प्लगइन "
+"सक्रिय होना चाहिए. प्लगइन को वरीयताएँ संवाद में सक्रिय की जा सकती हैं."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "डेटाबेस फ़ाइल:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "आयात करें (_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "अनुप्रयोग से आयात करें"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "मीडिया इससे आयात करें (_f):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "बंद करें (_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "सेटिंग"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "स्लाइड-शो"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "पीछे"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "पिछले फोटो पर जाएँ"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "ठहरें"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "स्लाइडशो ठहराएँ"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "अगला"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "अगले फ़ोटो पर जाएँ"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "स्लाइडशो सेटिंग सेटिंग्स"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "सभी फ़ोटो स्रोत फ़ाइल अनुपस्थित हैं."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "बजाएँ"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "स्लाइडशो जारी रखें"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "वापस"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "पूर्ववत् वापस"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "बढ़ाना"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "पूर्ववत् बढ़ाना"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "नई घटना बनाना"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "घटना हटाना "
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "नई घटना के लिए स्थानांतरण तस्वीरें"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "पिछले इवेंट के लिए स्थापना तस्वीरें"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "विलय"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "विलय पूर्ववत"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "प्रतिलिपि तस्वीरें"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "प्रतिलिपि तस्वीरों को हटाने"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "फ़ाइल त्रुटियों की वजह से तस्वीरें नकल करने में असमर्थ"
+msgstr[1] "%d फ़ाइल त्रुटियों की वजह से तस्वीरें नकल करने में असमर्थ"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "पिछले दर्ज़ा बहाल"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "दर्ज़ा बढ़ाएँ"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "दर्ज़ा घटाना "
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW डेवलेपर सेट कर रहा है"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "पिछला RAW डेवलेपर पुनर्बहाल कर रहा है"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "डेवलपर सेट करें"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "मूल फोटो समायोजित नहीं किया जा सकता है."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "दिनांक और समय समायोजित करना"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "पूर्ववत् तिथि और समायोजन समय"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "निम्नलिखित मूल फ़ोटो समायोजित नहीं किया जा सका."
+msgstr[1] "निम्नलिखित मूल फ़ोटो समायोजित नहीं किया जा सका."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "समय समायोजन त्रुटि"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "समय समायोजन निम्नलिखित फोटो फाइल पर उसे बदला नहीं जा सकता है."
+msgstr[1] "समय समायोजन निम्नलिखित फोटो फाइल पर उसे बदला नहीं जा सकता है."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "टैग बनाएँ"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" टैग खिसकाएँ"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "तस्वीरें कचरा में ले जाएँ"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "कचरा से पुनर्स्थापित तस्वीरें"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "तस्वीरें Shotwell कचरा ले जाएँ"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "तस्वीरें Shotwell पुस्तकालय वापस पुनर्स्थापित "
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "तस्वीरें कचरा को स्थानांतरित "
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "कचरा से बहाल तस्वीरें"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "चिह्नित चयनित फ़ोटो"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "अचिह्नित चयनित फ़ोटो"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "चिह्नित"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "अचिह्नित"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "रॉ"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "शॉटवेल"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "बीएमपी"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "जेपीईजी"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "कम (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "मध्यम (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "उच्च (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "अधिकतम (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "टीआईएफ़एफ़"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "कोई फ़ोटो/वीडियो नहीं"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "कोई फ़ोटो/वीडियो नहीं मिला"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "इस निर्देशिका में फ़ोटो निर्यात नहीं किया जा सकता है."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "मॉनिटरिंग अद्यतन की प्रक्रिया में असमर्थ: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "पूरा पृष्ठ भरें"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 छवि प्रति पृष्ठ:"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "इंच"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "सेमी"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "वालेट (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "नोटकार्ड (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 इंच"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 इंच"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 इंच"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 इंच"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 इंच"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "मेट्रिक वालेट (9 x 13 सेमी)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "पोस्टकार्ड (10 x 15 सेमी)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 सेमी"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 सेमी"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 सेमी"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 सेमी"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 सेमी"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "छवि सेटिंग"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "छपाई हो रही है..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"फ़ोटो छपाने में असमर्थ:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "खोलने में असमर्थ/ फोटो डेटाबेस%s बनाने में असमर्थ:त्रुटि कोड%d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"फ़ोटो डेटाबेस फ़ाइल में लिखने में असमर्थ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"डेटाबेस फ़ाइल की पहुँच में त्रुटि:\n"
+" %s\n"
+"\n"
+"त्रुटि थी: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "वीडियो निर्यात करें"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "नॉटिलस लांच करने में असमर्थ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "इन्हें भेजें"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s से पृष्ठभूमि निर्यात करने में असमर्थ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "डेस्कटॉप स्लाइड शो को तैयार करने में असमर्थ: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "फ्लैग किया हुआ"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "रद्दी"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "रद्दी खाली है"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "मिटाएँ"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "फ़ोटो मिटा रहा है"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "अनुपस्थित फ़ाइल"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "मिटा रहा है..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "आखिरी बार आयात"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "फ़ोल्डर से आयात करें (_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "डिस्क से लाइब्रेरी में फ़ोटो आयात करें"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "अनुप्रयोग से आयात करें (_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "कार्यक्रम छाँटें (_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "रद्दी खाली करें (_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "रद्दी के सारे फ़ोटो मिटाएँ"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "फ़ोटो के लिए कार्यक्रम देखें (_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "ढूँढें (_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "खोज मापदंड के द्वारा फ़ोटो और वीडियो ढूँढ़ें"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "फ़ाइल (_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "संपादन (_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "फोटो (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "तस्वीर (_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "घट_नाओं"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "टै_ग"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "मदद (_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "मूल जानकारी (_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "चयन के लिए मूल सूचना दिखाएँ"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "विस्तारित सूचना (_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "चयन के लिए विस्तारित सूचना दिखाएँ"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "खोज पट्टी (_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "खोज पट्टी दिखाएँ"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "बाजू पट्टी (_i)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "बाजूपट्टी प्रदर्शित कीजिए"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "आरोही क्रम में (_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "फ़ोटो बढ़ते क्रम में छांटें"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "अवरोही (_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "फ़ोटो घटते क्रम में छांटें"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "फ़ोल्डर से आयात करें"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "रद्दी खाली करें"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "रद्दी खाली कर रहा है..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "शॉटवेल आपकी घर निर्देशिका में फ़ोटो आयात करने के लिए विन्यस्त किया जा रहा है.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "लाइब्रेरी स्थान"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "इस निर्देशिका से फ़ोटो आयातित नहीं की जा सकती है."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "लाइब्रेरी अद्यतन कर रहा है..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "फ़ोटो स्वतः आयातित करने में असमर्थ..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "फ़ोटो स्वतः आयातित कर रहा है..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "फ़ाइल में मेटाडेटा लिख रहा है..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "लाइब्रेरी"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "आयात कर रहा है..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "आयात रोकें (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "फ़ोटो आयातित कर रहा है"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "आयात करने की तैयारी कर रहा है..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "आयातित %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "सहेजें (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "फ़ोटो सहेजें"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "ऐसे सहेजें... (_A)"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "अलग नाम के साथ फ़ोटो सहेजें"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "आपके कंप्यूटर में कनेक्टेड मुद्रक में तस्वीर छापें"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s मौजूद नहीं है."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s एक फ़ाइल नहीं है."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s इसके प्रारूप का समर्थन नहीं करता है\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "एक नक़ल सहेजें...(_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s में किए गए परिवर्तन को खो दिया?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "बिना सहेजे बंद करें (_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s में सहेजने में त्रुटि: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "ऐसे सहेजें"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s को मॉनिटर करने में असमर्थ : निर्देशिका (%s) नहीं"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "फ़ोटो प्रबंधक"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "फ़ोटो प्रदर्शक"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "कॉपीराइट 2009-2013 योरूबा फाउंडेशन"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "घुमाएँ दाहिना (_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "घुमाएँ"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "घुमाएँ दाहिना"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "फोटो को दाहिनी ओर घुमाएँ (Ctrl को बायीं ओर घुमाने के लिए दबाएँ)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "घुमाएँ बायाँ (_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "बायाँ घुमाएँ"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "फोटो को बाएँ घुमाएँ"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "लंबवत पलटें (_z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "क्षैतिज प्रकार से पलटें"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "लंबवत पलटें (_c)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "लंबवत पलटें"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "संवर्द्धित करें (_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "बढ़ाएँ"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "फोटो के प्रकटन को स्वतः सुधारें"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "काटें (_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "काटें"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "फोटो के आकार काटें"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "सीधा करें (_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "सीधा करें"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "फोटो सीधा करें"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "लाल-आँख (_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "लाल-आँख"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "फोटो में लाल आँख प्रभाव को घटाएँ या खत्म करें"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "समायोजित करें (_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "समायोजन"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "फोटो के रंग और टोन को समायोजित करें"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "मौलिक में लौटें (_v)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "मौलिक में लौटें"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "बाहरी संपादन वापस लें (_d)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "प्रधान फोटो में वापस जाएँ"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "बतौर डेस्कटॉप पृष्ठभूमि सेट करें (_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "चुनी गई छवि को नयी डेस्कटॉप पृष्ठभूमि बनाएँ"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "बतौर डेस्कटॉप स्लाइडशो सेट करें (_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "पहले जैसा (_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "पहले जैसा"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "फिर करें (_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "फिर करें"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "कार्यक्रम का नाम बदलें (_n)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "कार्यक्रम के लिए कुँजी फोटो बनाएँ (_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "कार्यक्रम के लिए कुँजी फोटो बनाएँ"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "नया कार्यक्रम (_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "नयी घटना"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "फोटो खिसकाएँ"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "किसी कार्यक्रम में फोटो खिसकाएँ"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "कार्यक्रम मिलान करें (_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "मिलाएँ"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "किसी एक कार्यक्रम में कार्यक्रमों को इकट्ठा करें"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "रेटिंग सेट करें (_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "रेटिंग सेट करें"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "अपनी तस्वीर की रेटिंग बदलें"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "बढ़ाएँ (_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "रेटिंग बढ़ाएँ"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "घटाएँ (_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "रेटिंग घटाएँ"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "बिना रेटिंग किया (_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "बिना रेटिंग किया"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "रेट बिना रेट किया"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "बिना रेटिंग किया सेट कर रहा है"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "किसी रेटिंग को हटाएँ"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "अस्वीकृत (_r)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "अस्वीकृत"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "रेट अस्वीकृत"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "बतौर अस्वीकृत सेटिंग"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "रेटिंग को अस्वीकृत में सेट करें"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "केवल अस्वीकृत (_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "केवल अस्वीकृत"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "केवल अस्वीकृत फोटो दिखाएँ"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "सभी + अस्वीकृत (_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "अस्वीकृत सहित सभी फोटो दिखाएँ"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "सभी फोटो (_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "सभी फोटो दिखाएँ"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "रेटिंग (_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "हर फोटो की रेटिंग दिखाएँ"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "फोटो फ़िल्टर करें (_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "फोटो फ़िल्टर करें"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "फिल्टर पर आधारित फोटो की संख्या को परिसीमित करें"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "नकली (_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "नकली"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "किसी फोटो का डुप्लीकेट बनाएँ"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "निर्यात करें (_E)..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "छापें... (_P)"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "प्रकाशित करें (_b)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "प्रकाशित करें"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "विविध वेबसाइटों पर प्रकाशित करें"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "शीर्षक संपादित करें (_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "टिप्पणी संपादित करें (_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "टिप्पणी संपादित करें"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "तिथि व समय समाायोजित करें (_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "तिथि व समय समाायोजित करें"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "टैग जोड़ें (_T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "टैग जोड़ें (_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "टैग जोड़ें"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "वरीयताएँ (_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "बाहरी संपादक के साथ खोलें (_x)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "कच्चे संपादक के साथ खोलें (_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "यहाँ भेजें (_T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "इसमें भेजें (_o)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "ढूँढें (_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "ढूँढ़ें"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "किसी छवि को ढूँढ़े पाठ टाइप करके जो इसके नाम या टैह पर प्रकट होता है"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "ध्वज (_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "फ्लैग हटाएँ (_f)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "संपादक लॉन्च करने में असमर्थ: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "टैग \"%s\" जोड़ें"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "टैग \"%s\" और \"%s\" जोड़ें"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "टैग \"%s\" मिटाएँ (_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "टैग \"%s\" मिटाएँ"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "टैग मिटाएँ"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "नया (_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "टैग \"%s\" का नाम बदलें (_n)..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "टैग का नाम \"%s\" से \"%s\" में बदलें"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "नाम बदलें (_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "टैग रूपांतरित करें (_y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "टैग रूपांतरित करें"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "फोटो को \"%s\" के रूप में टैग करें"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "फोटो को \"%s\" के रूप में टैग करें"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "चुने गए फोटो को \"%s\" के रूप में टैग करें"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "चुने गए फोटो को \"%s\" के रूप में टैग करें"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "टैग \"%s\" को फोटो से हटाएँ (_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "टैग \"%s\" को फोटो से हटाएँ (_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "टैग \"%s\" को फोटो से हटाएँ"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "टैग \"%s\" को फोटो से हटाएँ"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "टैग को \"%s\" में नाम बदलने में त्रुटि क्योंकि टैग पहले से मौजूद है."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "खोज को \"%s\" में नाम बदलने में त्रुटि क्योंकि खोज पहले से मौजूद है."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "खोज सहेजा"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "खोज मिटाएँ"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "संपादन (_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "नाम बदलें (_n)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "खोज \"%s\" का \"%s\" में नाम बदलें"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "खोज \"%s\" मिटाएँ"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "दर %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "रेटिंग %s पर सेट करें"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s में रेट की सेटिंग"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "प्रदर्शन %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s की दर के साथ केवल तस्वीर दिखाएँ"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s या बेहतर"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s या बेहतर दिखाएँ"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s या बेहतर दर के साथ केवल फोटो दिखाएँ"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "रद्दी से चुने गए फोटो हटाएँ"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "लाइब्रेरी से चुने गए फोटो हटाएँ"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "फिर बहाल करें (_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "चुने गए फोटो को लाइब्रेरी में वापस खिसकाएँ"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "फ़ाइल प्रबंधक दिखाएँ (_g)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "फ़ाइल प्रबंधक में चुने गए फोटो निर्देशिका खोलें"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "फ़ाइल प्रबंधक खोलने में असमर्थ: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "लाइब्रेरी से हटाएँ (_e)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "रद्दी में खिसकाएँ (_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "सभी चुनें (_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "सभी मद चुनें"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "कोण:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "रीसेट करें (_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "मौजूदा फोटो आयाम में वापस लौटें"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "इस फोटो में कटान सेट करें"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Pivot the crop rectangle between portrait and landscape orientations"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "असीमित"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "वर्ग"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "स्क्रीन"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "मूल आयाम"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD वीडियो (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD वीडियो (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "लेटर (8.5 x 11 इंच)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "टेब्लॉइड (11 x 17 इंच)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "लाल-आँख औज़ार बंद करें"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "इस चुने गए क्षेत्र में लाल-आँख प्रभाव हटाएँ"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "संतृप्ति:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "टिंट:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "तापमानः"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "छाया:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "रंग रिसेट करें"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "मूल में सभी रंग समायोजन रिसेट करें"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "तापमान"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "टिंट"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "संतृप्ति"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "एक्सपोजर"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "छाया"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "विरोध विस्तार"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "पिन औज़ार पट्टी"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "उपकरण पट्टी खुले पिन"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "पूर्ण स्क्रीन छोड़ दो"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "पूर्ण स्क्रीन_छोड़ दो"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_से बाहर निकलें"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_के बारे में"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "पूर्ण_स्क्रीन"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_सामग्री"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "बार बार पूछे जाने वाले प्रश्न (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "कोई समस्या रिपोर्ट करें (_R)..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"एक घातक त्रुटि उत्पन्न हुई जब Shotwell पुस्तकालय तक पहुँचने. Shotwell जारी नहीं रख सकते. "
+"⏎\n"
+"⏎\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba वेब साइट पर जाएँ"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "राजेश रंजन (rranjan@redhat.com, rajeshkajha@yahoo.com)"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "मदद प्रदर्शित करने में असमर्थ:%s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "बग डेटाबेस में संचरिच करने में असमर्थ: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ दिखाने में असमर्थ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "बेनाम"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "मूल आकार"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "चौड़ाई या ऊँचाई"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "चौड़ाई"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ऊंचाई"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "लघु-चित्र के आकार समायोजित करें"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "लघुचित्र के आवर्द्धन बढ़ाएँ"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "लघुचित्र का आकार घटाएँ"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "फोटो छाँटें (_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "वीडियो चलाएँ (_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "तंत्र वीडियो प्लेयर में चुने गए वीडियो को खोलें"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "टिप्पणी (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "हर तस्वीर की टिप्पणी दिखाएँ"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "प्रत्येक फ़ोटो टैग प्रदर्शित"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "शीर्षक से (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "शीर्षक से फोटो छाँटें"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "एक्सपोजर तिथि के अनुसार (_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "एक्सपोजर तिथि से फोटो छाँटें"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "रेटिंग अनुसार (_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "रेटिंग के अनुसार फोटो छाँटें"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"शॉटवेल चुने गए वीडियो को चलाने में असमर्थ था:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d फोटो/वीडियो"
+msgstr[1] "%d फोटो/वीडियो"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "हर कार्यक्रम की टिप्पणी दिखाएँ"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "कोई कार्यक्रम नहीं"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "कोई कार्यक्रम नहीं मिला"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "घटना"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "अद्यतन"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "कोई कार्यक्रम"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "कैश निर्देशिका %s बनाने में असमर्थ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "डेटा निर्देशिका %s बनाने में असमर्थ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "चित्र"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "अस्थायी निर्देशिका %s बनाने में असमर्थ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "डेटा उपनिर्देशिका%s बनाने में असमर्थ: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(कुछ नहीं)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "कुछ नहीं"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "बेतरतीब"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "स्लाइडशो संक्रमण"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s के लिए अस्थायी फ़ाइल उत्पन्न करने पाने में असमर्थ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "निर्यात कर रहा है"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "फ़ाइल %s पहले से मौजूद है. बदलें?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "छोड़ें (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "बदलें (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "सभी बदलें (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "निर्यात"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "तस्वीरें"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "वीडियो"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW फ़ोटो"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW फ़ोटो"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI फ़ाइल %s लोड करने में त्रुटि: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "प्रकार"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "प्रकाशन"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "चुने गए फ़ोटो/वीडियो सफलतापूर्वक प्रकाशित किए गए."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "चुने गए वीडियो सफलतापूर्वक प्रकाशित किए गए."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "चुने गए फ़ोटो सफलतापूर्वक प्रकाशित किए गए."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "चुना गया वीडियो सफलतापूर्वक प्रकाशित किया गया."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "चुना गया फ़ोटो सफलतापूर्वक प्रकाशित किया गया."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "खाता सूचना ले रहा है..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "लागिंग इन..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "फोटो प्रकाशित करें"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "यहाँ फोटो प्रकाशित करें (_t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "वीडियो प्रकाशित करें"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "वीडियो यहाँ प्रकाशित करें (_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "फ़ोटो और वीडियो प्रकाशित करें"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "फ़ोटो और वीडियो यहाँ प्रकाशित करें (_t)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "प्रकाशित करने में असमर्थ"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"शॉटवेल चुने गए मदों को प्रकाशित नहीं कर पा रहा है क्योंकि आपके पास सुसंगत प्रकाशन प्लगिन "
+"सक्रिय नहीं है. इसे सही करने के लिए, <b>%s वरीयताएँ संपादित करें</b> चुनें और <b>Plugins</"
+"b> टैब पर एक या अधिक प्रकाशन प्लगइन को सक्रिय करने की जरूरत है."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "अपलोड की तैयारी कर रहा है"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d अपलोड कर रहा है %d का"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s में प्रकाशन जारी नहीं रह सका क्योंकि कोई त्रुटि आयी:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"दूसरी सेवाओं को प्रकाशित करने की कोशिश करने के लिए, ऊपर के मेन्यू से किसी एक को चुनें."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "New _Tag..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "प्रकाशन के लिए जरूरी एक अस्थायी फ़ाइल अनुपलब्ध है"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"आप यूट्यूब में अभी लॉगिन नहीं है.\n"
+"\n"
+"आपको जरूर गूगल खाता के लिए साइन इन करना होगा और इसे यूट्यूब से उपयोग के लिए सेटअप करना "
+"होगा. आप अधिकतर खाता को अपने ब्राउज़र के उपयोग से यूट्यूब साइट पर लॉगिन करने के लिए "
+"सेटअप कर सकते हैं."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "प्रकाशन के लिए जरूरी फ़ाइल अनुपलब्ध है. यूट्यूब में प्रकाशन जारी नहीं रह सकता है."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "आप यूट्यूब में बतौर %s लॉगिन हैं."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "वीडियो '%s' में प्रकट होगा"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "सार्वजनिक सूचीबद्ध"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "सार्वजनिक गैर-सूचीबद्ध"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "निजी"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "केंद्रीय प्रकाशन सेवाएँ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"आप अभी फ्लिकर में लॉगिन नहीं हैं.\n"
+"\n"
+"अपने वेबब्राउज़र में फ्लिकर में लॉगिन पर लॉग इन होने के लिए क्लिक करें. आपको शॉटवेल कनेक्ट "
+"को अपने फ्लिकर खाा के साथ कड़ीबद्ध करने के लिए प्राधिकृत करना होगा."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"आप पहले ही शॉटवेल सत्र में फ्लिकर में लॉगिन और लॉगआउट हो चुके हैं.\n"
+"फ्लिकर में प्रकाशन जारी रखने के लिए, शॉटवेल को छोड़ें और फिर से शॉटवेल आरंभ करें और फिर से "
+"प्रकाशन आज़माएँ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "लॉगिन की तैयारी..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "प्रकाशन के लिए जरूरी फ़ाइलें अनुपलब्ध हैं. फ्लिकर में प्रकाशन जारी नहीं रहेगा."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "सत्यापन जाँच रहा है..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"आप बतौर %s फ्लिकर में लॉगिन हैं.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "आपका पेशेवर फ्लिकर खाता आपको असीमित फोटो अपलोड करने की छूट देता है."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "इसमें फोटो दृश्य है (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "इसमें वीडियो दृश्य है (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "इसमें फोटो और वीडियो दृश्य है (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "हर कोई"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "दोस्त और परिवार केवल"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "केवल परिवार"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "केवल परिवार"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "केवल मैं"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 पिक्सेल"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 पिक्सेल"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "एल्बम %s को बना रहा है..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigo के प्रकाशन के दौरान त्रुटि संदेश आयी. कृपया फिर कोशिश करें."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"अपने पिविगो फोटो लाइब्रेरी का URL दर्ज करें साथ ही उस लाइब्रेरी के लिए अपने पिविगो "
+"खाता से संबद्ध कूटशब्द."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"शॉटवेल आपकी पिविगो फोटो लाइब्रेरी से कनेक्ट नहीं कर सकता है. कृपया URL जाँचें जिसे आपने "
+"दर्ज किया है"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"उपयोक्तानाम और/या कूटशब्द अवैध. कृपया फिर कोशिश करें"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "अवैध यूआरएल"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"अवैध उपयोक्तानाम या कूटशब्द"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "शॉटवेल कनेक्ट"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "प्रशासक, परिवार, दोस्त, संपर्क"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "प्रशासक, परिवार, दोस्त"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "प्रशासक, परिवार"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "प्रशासक"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"आप अभी पिकासा वेब एल्बम में लॉग इन हैं.\n"
+"\n"
+"पिकासा वेब अल्मब में अपने ब्राउज़र में लॉगिन करने के लिए लॉगिन पर क्लिक करें. आपको पिकासा "
+"वेब एल्बम खाता में कड़ीबद्ध करने के लिए प्राधिकृत करने की जरूरत है."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"प्रकाशन के लिए जरूरी एक फ़ाइल अनुपलब्ध है. पिकासा में प्रकाशन जारी नहीं रह सकता है."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "एल्बम बना रहा है..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "आप बतौर %s पिकासा वेब एल्बम में लॉगिन हैं."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "वीडियो यहाँ प्रकट होगा:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "फोटो यहाँ प्रकट होगा:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "छोटा (640 x 480 पिक्सेल)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "मध्यम (1024 x 768 पिक्सेल)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "अनुशंसित (1600 x 1200 पिक्सेल)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "गूगल+ (2048 x 1536 पिक्सेल)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"आप फेसबुक में अभी लॉगिन नहीं हैं.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"आप पहले ही शॉटवेल सत्र में फेसबुक में लॉगिन और लॉगआउट हो चुके हैं.\n"
+"फेसबुक में प्रकाशन जारी रखने के लिए, शॉटवेल को छोड़ें और फिर से शॉटवेल आरंभ करें और फिर से "
+"प्रकाशन आज़माएँ."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "मानक (720 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "बड़ा (2048 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "फेसबुक में कनेक्शन जाँच रहा है..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "प्रकाशन के लिए जरूरी फ़ाइल अनुपलब्ध है. फेसबुक में प्रकाशन जारी नहीं रह सकता है."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"आप फेसबुक पर बतौर %s लॉगिन हैं.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "आप चुने गए फोटो को कहाँ प्रकाशित करना चाहते हैं?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "अपलोड आकार (_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "मित्र"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "क्रंबल"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "शतरंज"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "वृत्त"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "अंध"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "पट्टियां"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "घड़ी"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "वृत्त"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "केंद्रीय स्लाइडशो संक्रमण"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "कॉपीराइट 2010 Maxim Kartashev, कॉपीराइट 2011-2013 योरूबा फाउंडेशन"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "स्लाइड"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "फीका"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "वर्ग"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "कोर डाटा आयात सेवा"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot लाइब्रेरी आयात सेवा में आपका स्वागत है.\n"
+"\n"
+"कृपया आयात करने के लिए लाइब्रेरी चुनें, या तो किसी मौजूदा लाइब्रेरी चुनकर जो शॉटवेल को "
+"मिला है या किसी वैकल्पिक एफ-स्पॉट डेचाबेस फ़ाइल चुनकर."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot लाइब्रेरी आयात सेवा में आपका स्वागत है.\n"
+"\n"
+"कृपया किसी एफ-स्पॉट डेटाबेस फ़ाइल को चुनें."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "आयात के लिए F-Spot डाटाबेस फ़ाइल को दस्ती रूप से चुनें:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"चुने गए F-Spot डेटाबेस फ़ाइल को खोल नहीं सकता है: फ़ाइल मौजूद नहीं है या एक F-Spot "
+"डेटाबेस नहीं है"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"चुने गए F-Spot डेटाबेस फ़ाइल को खोल नहीं सकता है: F-Spot डेटाबेस का यह संस्करण शॉटवेल से "
+"समर्थित नहीं है"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "चुने गए F-Spot डेटाबेस फ़ाइल को पढ़ नहीं सकता है: टैग टेबल पढ़ने में त्रुटि "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "चुने गए F-Spot डेटाबेस फ़ाइल को पढ़ नहीं सकता है: फोटो टेबल पढ़ने में त्रुटि "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"शॉटवेल को %d फोटो F-Spot लाइब्रेरी में मिला है और अभी उसे आयात कर रही है. डुप्लीकेट को "
+"स्वतः पता लगा लिया जाएगा और हटा दिया जाएगा.\n"
+"\n"
+"आप इस संवाद को बंद कर सकते हैं और शॉटवेल का उपयोग आरंभ कर सकते हैं जब आयात पृष्ठभूमि में चल "
+"रहा हो."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot लाइब्रेरी: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "आयात की तैयारी"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "बतौर डेस्कटॉप स्लाइडशो सेट करें"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "डेस्कटॉप पृष्ठभूमि स्लाइडशो बनाएँ"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "इसके लिए हर फोटो दिखाएँ"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "समयावधि"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "डेस्कटॉप पृष्ठभूमि पर कितनी देर तक फोटो दिखाया जाएगा"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "खोजें"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "खोज नाम (_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "मिलाएँ (_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "निम्नलिखित का है:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "छपे हुए छवि आकार"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "मानक आकार का उपयोग करें (_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "एक मनपसंद आकार का उपयोग करें (_u):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "फ़ोटो पहलू अनुपात मिलान करें (_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "स्वतः आकार (_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>शीर्षक</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "छवि शीर्षक छापें (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>पिक्सेल विभेदन</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "आउटपुट फ़ोटो यहाँ पर (_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "पिक्सेल प्रति इंच"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"स्तर"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "शॉटवेल वरीयताएँ"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "सफेद"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "काला"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "नयी फ़ाइलों के लिए लाइब्रेरी निर्देशिका देखें (_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "मेटाडाटा"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "फोटो फ़ाइल के लिए टैग, टाइटिल, और दूसरे मेटाडेटा लिखें"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "प्रदर्शन"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "यहाँ फोटो आयात करें (_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "पृष्ठभूमि (_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "आयात कर रहा है"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "निर्देशिका संरचना (_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "प्रारूप (_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "उदाहरण:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "आयातित फ़ाइल को लोअरकेस में नाम बदलें (_e)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "कच्चा डेवलेपर"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "तयशुदा (_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "बाहरी फोटो संपादक (_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "बाहरी कच्चा संपादक (_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "बाहरी संपादक"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "प्लगइन्स"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "देरी (_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "संक्रमण प्रभाव (_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "संक्रमण देरी (_e):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "शीर्षक दिखाएँ (_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "सेकेण्ड"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "लॉगिन (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "लॉगआउट (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "प्रकाशित करें (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "फोटो आकार (_s):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "कूटशब्द (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "लॉगिन"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "कॉपीराइट 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 पिक्सेल"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' एक OAuth सत्यापन आग्रह के लिए वैध अनुक्रिया नहीं है"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): आरंभ नहीं हो सकता है; यह प्रकाशक फिर आरंभ करनेयोग्य नहीं "
+"है."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "अपने Tumblr खाता से जुड़े उपयोक्तानाम और कूटशब्द दर्ज करें."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI लोड नहीं कर सका: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"आप Tumblr में बतौर %s लॉगिन हैं.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "कॉपीराइट 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki वेबसाइट देखें"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "आप अभी Yandex.Fotki में लॉगिन हैं."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "ईमेल पता (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"आप Tumblr में बतौर (name) लॉगिन हैं.\n"
+"\n"
+"(इस लेबल का स्ट्रिंग किसी कोड के भीतर डाला और सेट किया गया है, \n"
+"इसलिए यहाँ किया परिवर्तन नहीं दिखायी देगा)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ब्लॉग्स:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "अल्बम (या नया लिखें) (_A):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "पहुँच प्रकार (_t):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "टिप्पणी निष्क्रिय करें (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "मूल फोटो डाउनलोड करने से मनाही (_F)"
diff --git a/po/hr.po b/po/hr.po
new file mode 100644
index 0000000..0f68ab5
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,4565 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# deresh <deresh@gmail.com>, 2011
+# deresh <deresh@gmail.com>, 2012
+# Miro <mirozagreb@ubuntu-hr.org>, 2011
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Croatian (http://www.transifex.com/projects/p/shotwell/"
+"language/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Događaj %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kamere"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Ne mogu odmontirati kameru. Pokušajte je odmontirati preko upravitelja "
+"datoteka."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Sakrij fotografije koje su već uvezene."
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Prikaži samo fotografije koje nisu uvezene."
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "Nas_lovi"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Prikaži naslov svake fotografije"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Uvezi _izabrabe"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Uvezi izabrane fotografije u biblioteku"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Uvezi _sve"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Uvezi sve fotografije u biblioteku"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell treba maknuti kameru u datotečnog sistema. Želite li nastaviti?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Odmontiraj"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Molim domontirajte kameru"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Drugi program koristi kameru. Shotwell može koristit kameru samo kad je niti "
+"jedan drugi program ne koristi. Probajte zatvoriti druge aplikacije koje bi "
+"mogle koristiti kameru, te nakon toga pokušajte ponovo."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Zatvorite druge aplikacije koje bi mogle koristiti kameru."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Ne mogu dohvatiti pretpregled s kamere: \n"
+" %s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Odmontiravam...."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Dohvaćam informacije o fotografijama"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Dohvaćam pretpregled za %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Ne mogu zaključati kameru: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Izbrisati %d fotografiju iz kamere?"
+msgstr[1] "Izbrisati %d fotografije iz kamere?"
+msgstr[2] "Izbrisati %d fotografija iz kamere?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Izbrisati %d video iz kamere?"
+msgstr[1] "Izbrisati %d videa iz kamere?"
+msgstr[2] "Izbrisati %d videa iz kamere?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Izbrisati %d fotografiju/video iz kamere?"
+msgstr[1] "Izbrisati %d fotografije/videa iz kamere?"
+msgstr[2] "Izbrisati %d fotografija/videa iz kamere?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Zadrži"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Brisanje fotografija s kamere"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "Prezentacija"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Pokreni slideshow"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Izvoz fotografije/videa"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Izvoz slika/videa"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Izvoz fotografija"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Izvoz fotografija"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotiranje"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Prekidam rotaciju"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Okreni horizontalno"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Prekidam preokretanje"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Okreni vertikalno"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Prekidam preokretanje"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Naslov"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Oznaka"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Ime događaja"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Ime datoteke"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Ocjena"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "sadrži"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "je točno"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "počinje sa"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "završava s"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ne sadrži"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nije postavljeno"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "."
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "i više"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "samo"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "i niže"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "bilo koje"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "sve"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Spremljene pretrage"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Vaša biblioteka fotografija nije kompatibilna s ovom inačicom Shotwell-a. "
+"Napravljena je sa Shotwell %s ( shema %d). Tekuća verzija je %s ( shema %d). "
+"Molim koristite zadnju inačicu Shotwell-a."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell nije uspio nadograditi vašu biblioteku fotografije sa %s ( shema "
+"%d) na %s ( shema %d). Za više informacija pogledajte Shotwell Wiki %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Vaša biblioteka fotografija nije kompatibilna s ovom inačicom Shotwell-a. "
+"Napravljena je sa Shotwell %s ( shema %d). Tekuća verzija je %s ( shema %d). "
+"Očistite vašu biblioteku brišući %s , te nakon toga ponovno uvezite "
+"fotografije."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Nepoznata greška kod provjere Shotwell baze podataka: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Učitavanje Shotwell-a"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "Pokrenite '%s --help' za popis svih dostupnih opcija.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Danas"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Jučer"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Naslov:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Stavki:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d događaj"
+msgstr[1] "%d događaja"
+msgstr[2] "%d događaja"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotografija"
+msgstr[1] "%d fotografije"
+msgstr[2] "%d fotografija"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videa"
+msgstr[2] "%d videa"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Vrijeme:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Od:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Do:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Veličina:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Trajanje:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekundi"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Ekspozicija:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Lokacija:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Veličina datoteke"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Orginalne dimenzije:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Proizvođač kamere:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model kamere:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Bljeskalica:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Fokalna duljina:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposure bias:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS širina:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS dužina:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Umjetnik:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Prava:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Softver:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Dodatne informacije"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Otkaži"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "Obriši"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Izvoz videa"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Ne mogu izvesti fotografiju zbog greške na datoteci.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Želite li nastaviti s izvozom?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Nastavi"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nepromjenjeno"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Tekuće"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvaliteta:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Ograničenje promjene veličine:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_piksela"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "Još %d.\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d duplikat nije uvezen:\n"
+msgstr[1] "%d duplikata nisu uvezena:\n"
+msgstr[2] "%d duplikata nije uvezeno:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d duplikat nije uvezen:\n"
+msgstr[1] "%d duplikata nisu uvezena:\n"
+msgstr[2] "%d duplikata nije uvezeno:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d duplikat nije uvezen:\n"
+msgstr[1] "%d duplikata nisu uvezena:\n"
+msgstr[2] "%d duplikata nije uvezeno:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotografija nije uvezena zbog greške na datoteci ili sklopovlju:\n"
+msgstr[1] ""
+"%d fotografije nisu uvezene zbog greške na datoteci ili sklopovlju:\n"
+msgstr[2] ""
+"%d fotografija nije uvezeno zbog greške na datoteci ili sklopovlju:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d datoteka nije uvezena - greška na datoteci ili sklopovlju:\n"
+"\n"
+msgstr[1] ""
+"%d datoteke nisu uvezene - greška na datoteci ili sklopovlju:\n"
+"\n"
+msgstr[2] ""
+"%d datoteke nije uvezeno - greška na datoteci ili sklopovlju:\n"
+"\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d datoteka nije uvezena - greška na datoteci ili sklopovlju:\n"
+"\n"
+msgstr[1] ""
+"%d datoteke nisu uvezene - greška na datoteci ili sklopovlju:\n"
+"\n"
+msgstr[2] ""
+"%d datoteke nije uvezeno - greška na datoteci ili sklopovlju:\n"
+"\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d fotografija nije uvezene - greška na kameri:\n"
+"\n"
+msgstr[1] ""
+"%d fotografija nije uvezeno - greška na kameri:\n"
+"\n"
+msgstr[2] ""
+"%d fotografija nije uvezeno - greška na kameri:\n"
+"\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d video nije uvezen zbog greške na kameri:\n"
+msgstr[1] "%d videa nisu uvezena zbog greške na kameri:\n"
+msgstr[2] "%d videa nije uvezeno zbog greške na kameri:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d fotografija/video nije uvezeno zbog greške na kameri:\n"
+msgstr[1] "%d fotografije/videa nisu uvezeni zbog greške na kameri:\n"
+msgstr[2] "%d fotografija/videa nije uvezeno zbog greške na kameri:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d fotografija preskočena, format nije podržan:\n"
+msgstr[1] "%d fotografije preskočene, format nije podržan:\n"
+msgstr[2] "%d fotografija preskočenih, format nije podržan:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+"Preskočena %d datoteka koja nije slika.\n"
+"\n"
+msgstr[1] ""
+"Preskočene %d datoteke koje nisu slike.\n"
+"\n"
+msgstr[2] ""
+"Preskočeno %d datoteka koje nisu slike.\n"
+"\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+"Preskočena %d fotografije - korisnički prekid.\n"
+"\n"
+msgstr[1] ""
+"Preskočene %d fotografije - korisnički prekid.\n"
+"\n"
+msgstr[2] ""
+"Preskočeno %d fotografija - korisnički prekid.\n"
+"\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+"Preskočen %d video - korisnički prekid.\n"
+"\n"
+msgstr[1] ""
+"Preskočena %d videa - korisnički prekid.\n"
+"\n"
+msgstr[2] ""
+"Preskočenih %d videa - korisnički prekid.\n"
+"\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"%d fotografija/video preskočeni - korisnički prekid:\n"
+"\n"
+msgstr[1] ""
+"%d fotografije/videa preskočeno - korisnički prekid:\n"
+"\n"
+msgstr[2] ""
+"%d fotografije/videa preskočeno - korisnički prekid:\n"
+"\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+"%d fotografija uspješno uvezena.\n"
+"\n"
+msgstr[1] ""
+"%d fotografije uspješno uvezeno.\n"
+"\n"
+msgstr[2] ""
+"%d fotografija uspješno uvezenih.\n"
+"\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+"%d video uspješno uvezen.\n"
+"\n"
+msgstr[1] ""
+"%d videa uspješno uvezeno.\n"
+"\n"
+msgstr[2] ""
+"%d videa uspješno uvezenih.\n"
+"\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+"%d fotografija/video uspješno uvezeno.\n"
+"\n"
+msgstr[1] ""
+"%d fotografije/videa uspješno uvezeno.\n"
+"\n"
+msgstr[2] ""
+"%d fotografija/videa uspješno uvezenih.\n"
+"\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Niti jedna fotografija nije uvezena.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Uvoz završen"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunda"
+msgstr[1] "%d sekunde"
+msgstr[2] "%d sekundi"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minute"
+msgstr[2] "%d minuta"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d sat"
+msgstr[1] "%d sata"
+msgstr[2] "%d sati"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "jedan dan"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Preimenuj događaj"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Ime:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Uredi naslov"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Premjesti u _smeće"
+msgstr[1] "Premjesti u _smeće"
+msgstr[2] "Premjesti u _smeće"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Samo _ukloni"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Poništi vanjske promjene?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Poništi vanjske izmjene?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Poništi vanjske izmjene?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Poništi vanjske izmjene?"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Ukloni"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Brisanje fotografija iz bilblioteke"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Ukloni slike iz biblioteke"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 sata"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Izmjeni orginalnih datototeka"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Izmjeni orginalne datoteke"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Orginal:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y., %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y., %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Vrijem ekspozicije će biti pomaknuto unaprijed za\n"
+"%d %s, %d %s, %d %s, i %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Vrijem ekspozicije će biti pomaknuto unatrag za\n"
+"%d %s, %d %s, %d %s, i %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dana"
+msgstr[2] "dana"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "sat"
+msgstr[1] "sata"
+msgstr[2] "sati"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minute"
+msgstr[2] "minuta"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekunda"
+msgstr[1] "sekunde"
+msgstr[2] "sekundi"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"i %d ostali."
+msgstr[1] ""
+"\n"
+"\n"
+"i %d ostalih."
+msgstr[2] ""
+"\n"
+"\n"
+"i %d ostalih."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Oznake ( odvojene zarezom):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Dobrodošli!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Dobrodošli u Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Kako bi započeli,uvezite fotografije na jedan od sljedećih načina:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Izaberi <span weight=\"bold\"> %s datoteka uvezeno iz direktorija</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Odvuci fotografije u Shotwell prozor"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Spoji kameru na računalo i pokreni uvoz."
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Uvoz fotografija iz direktorija %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Kako bi započeli,uvezite fotografije na jedan od sljedećih načina:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Ne prikazuj više ovu poruku"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Pomoć)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Godina%sMjesec%sDan"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Godina%sMjesec"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Godina%sMjesec-Dan"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Godina-Mjesec-Dan"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Posebna veličina"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Neispravan uzorak"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell može dodati fotografije u biblioteku kopiranjem u direktorij ili "
+"samo uvozom."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Kopiraj fotografije"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Uvezi"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Uvezi u biblioteku"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Makni iz biblioteke"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Micanje fotografija iz biblioteke"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Micanje slika iz biblioteke"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Oznake"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Uspješno"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Greška datoteke"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Ne mogu prepoznati datoteku"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Greška na bazi podataka"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Prekinut uvoz od strane korisnika"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nije datoteka"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Datoteka već postoji u bazi podataka"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "nepodržana vrsta datoteke"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nije fotografija"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Greška na disku"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk pun"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Greška na kameri"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Greška kod zapisivanja"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "%d neuspijelih uvoza."
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "promjenjeno"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Prethodna fotografija"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Sljedeća fotografija"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Nedostaje izvorišna datoteka: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Prikaz"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Prethodna fotografija"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Prethodna fotografija"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Sljedeća fotografija"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Sljedeća fotografija"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Povečaj"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Povećanje faktora veličine fotografije"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Smanji"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Smanji faktor povećanja fotografije"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Prilagodi _stranici"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zumiraj fotograiju da popuni ekran"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Povečaj _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+msgid "Zoom the photo to 100% magnification"
+msgstr "Povećavanje fotografije na 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Povečaj _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+msgid "Zoom the photo to 200% magnification"
+msgstr "Povećavanje fotografije na 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Ne mogu izvesti %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Baza podataka %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Uvezi"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Zatvori"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Postavke"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Slideshow"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Natrag"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Na prethodnu fotografiju"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pauza"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pauziraj prikaz"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Naprijed"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Na sljedeću fotografiju"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Promjeni postavke prezentacije"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Nedostaju sve fotografije."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Pokreni"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Nastavi prezentaciju"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Vraćam izmjene"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Prekidam vraćanje izmjena"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Poboljšanje"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Prekidam poboljšavanje"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Izrada novog događaja"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Micanje događaja"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Premještanje fotografija u novi događaj"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Postavljanje fotografija u prethodni događaj"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Spajanje"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Razdvajanje"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Dupliciranje fotografija"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Micanje duplikata fotografija"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Ne mogu napraviti kopiju %d fotografije zbog greške na datoteci"
+msgstr[1] "Ne mogu napraviti kopiju %d fotografije zbog greške na datotekama"
+msgstr[2] "Ne mogu napraviti kopiju %d fotografija zbog greške na datotekama"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Vraćam na prethodne vrijednosti"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Povećavanje ocijena"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Smanjujem ocijenu"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Orginalna fotografija se ne može podesiti"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Podešavanje vremena i datuma"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Prekid podešavanja datuma i vremena"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Orginalna fotografija se ne može podesiti"
+msgstr[1] "Orginalne fotografije se ne može podesiti"
+msgstr[2] "Orginalne fotografije se ne može podesiti"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Greška kod podešavanja vremena"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Na fotografiji se ne može podesiti vrijeme."
+msgstr[1] "Na fotografijama se ne može podesiti vrijeme"
+msgstr[2] "Na fotografijama se ne može podesiti vrijeme."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Premjesti fotografije u Smeće"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Vrati fotografije iz Smeća"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Premjesti fotografije u Shotwell Smeće"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Vrati fotografije natrag u Shotwell biblioteku"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Premještanje fotografija u Smeće"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Vraćanje fotografija iz Smeća"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Oznaći izabrane fotografije"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Odznaći izabrane fotografije"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Oznaći"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Odznaći"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Nisko (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Srednje (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Visoko (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksimalno (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nema fotografija/videa"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nisu pronađeni fotografije/videi."
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotografije ne mogu biti izvezene u zadani direktorij."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Ispuni cijelu stranicu"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 slike po stranici"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 slike po stranici"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 slika po stranici"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 slika po stranici"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 slika po stranici"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 slike po stranici"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Novčanik (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Zabilješka (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrički novčanik (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Razglednica (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Postavke slike"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Ispisivanje..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Greška kod ispisa fotografije:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Ne mogu napraviti/otvoriti bazu fotografija %s: greška broj %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Izvoz videa"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Ne mogu pokrenuti Nautilus Pošalji: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Pošalji"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Ne mogu izvesti pozadinu u %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Ne mogu pripremiti prezentaciju na radnoj površini: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Označeno"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Smeće"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Smeće je prazno"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Obriši"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Brisanje fotografija"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Datoteke koje nedostaju"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Brisanje..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Zadnji uvoz"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Uvezi iz direktorija..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Uvoz fotografija iz datotečnog sustava u biblioteku"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sortiraj _događaje"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Isprazni _Smeće"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Izbriši sve fotografije iz Smeća"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Prikaži _event za fotografiju"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Traži"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Traži fotografije i video prema kriterijima pretrage"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Datoteka"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Uredi"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotografija"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografije"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Događaji"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "O_znake"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Pomoć"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Osnovne informacije"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Prikaži osnovne informacije za izbor"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Proširene informacije"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Prikaži proširene informacije za izbor"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "T_raka za pretraživanje"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Prikaži traku za pretraživanje"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Rastući"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Posloži fotografije u rastući niz"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Padajuci"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Posloži fotografije u padajući niz"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Uvoz iz direktorija"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Isprazni Smeće"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Pražnjenje Smeća"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell je podešen da uvozi fotografije u vašu osobnu mapu.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Lokacija biblioteke"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotografije se ne mogu importirati iz tog direktorija."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Obnavljam biblioteku..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Priprema za automatski uvoz fotografija..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automatski uvoz fotografija..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Zapisujem meta podatke u datoteke..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bilbioteka"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Uvozim..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Prekini uvoz"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Prekini uvoz fotografija"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Priprema za uvoz..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Uvezeno %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Spremi"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Spremi fotografiju"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Spremi _kao..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Spremi fotografiju pod drugim imenom"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Ispisivanje fotografije na pisač koji je prikljućen na računalo"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ne postoji."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nije datoteka."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ne podržava vrstu datoteke\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Spremi kopiju"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Poništavanje promjena na %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Zatvori _bez spremanja"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "greška kod spremanja %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Spremi kao"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Ne mogo pratiti %s: Nije direktorij (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Upravitelj fotografija"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Preglednik fotografija"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotiraj _desno"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotiraj"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotiraj desno"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Rotiraj fotografije udesno ( pritisni Ctril za rotaciju ulijevo)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotiraj _lijevo"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotiraj lijevo"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotiraj fotografije ulijevo"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Okreni _vodoravno"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Okreni okomito"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Okreni _okomito"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Okreni okomito"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Poboljšaj"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Poboljšaj"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatski poboljšaj izgled fotografije"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Odreži"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Odreži"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Odreži fotografiju na izabranu veličinu."
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Ispravi"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Ispravi"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Crvene oči"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Crvene oči"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Uklanjanje ili reduciranje efekta crvenih očiju na fotografiji"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "Podesi"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Podešavanje"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Podešavanje boje i tonaliteta na fotografiji"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Vrati na orginal"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Vrati na orginal"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Poništi _vanjska uređivanja fotografije"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Vrati na orginalnu fotografiju"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Podesi kao pozadinu _radne površine"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Postavi izabranu sliku kao pozadinu radne površine"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Postavi kao prezentaciju na _radnu površinu"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Vrati"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Vrati"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "Vrati _natrag"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Vrati natrag"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "P_reimenuj događaj..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Izradi _glavnu fotografiju za događaj"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Izradi glavnu fotografiju za događaj"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Novi događaj"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Novi događaj"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Premjesti fotografije"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Premjesti fotografije u događaj"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Spoji događaje"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Spoji"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Postavi ocijene"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Postavi ocijenu"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Promjeni ocjenu fotografije"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Povećaj"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Povećaj ocjenu"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Smanji"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Smanji ocjenu"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Neocijenjeno"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Ocijeni neocjenjeno"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Postavljanje neocjenjeno"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Izbriši ocijene"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Odbačene"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Ocjeno odbijena"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Postavljeno kao odbijeno"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Postavi ocjenu kao odbijeno"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Samo _odbijene"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Samo odbijene"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Pokaži samo odbačene fotografije"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Sve i _odbijene"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Prikaži sve fotografije, zajedno s odbijenima"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Sve Fotografije"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Prikaži sve fotografije"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Ocijene"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Prikaži ocijene svake fotografije"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtriraj fotografije"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtriraj fotografije"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ogranići broj fotografija bazirano na filter"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplikat"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplikat"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Izardi duplikat fotografije"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Izvoz..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Is_pis..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "O_bjavi..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Objavi"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Objavi na internet stranice"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Podesi _datum i vrijeme"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Podesi datum i vrijeme"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Dodaj _oznake"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Dodaj oznake"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Postavke"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Otvori sa _RAW uređivačem"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Pošalji _na..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Traži..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Traži"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Potraži sliku pomoću teksta u njezinom imenu ili oznakama."
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Oznaći"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Odznaći"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Ne mogu pokrenuti uređivač: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Dodaj oznaku \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Dodaj oznake \"%s\" i \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "O_briši oznaku \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Obriši oznaku \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Obriši oznaku"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Novo"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Preimenuj oznaku \"%s\""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Preimenuj oznaku \"%s\" u \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Preimenuj..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Izmjen_i oznake..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Izmjeni oznake"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Označi fotografija kao \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Označi izabranih fotografija kao \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Oznaći izabrane forografije sa \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Makni oznaku \"%s\" s _fotografija"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Makni oznaku \"%s\" s _fotografija"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Makni oznaku \"%s\" s fotografija"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Makni oznaku \"%s\" s fotografija"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Ne mogu preimenovati oznaku \"%s\" jer ta oznaka već postoji."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Uredi"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Pre_imenuj"
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Ocijeni %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Postavi ocjenu na %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Postavljanje ocjene na %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Prikaži %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Prikaz fotografija sa ocijenom %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ili bolje"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Prikaži %s ili bolje"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Prikaži samo fotografije koje imaju bolju ocijenu od %s"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Makni izabrane fotografije iz Smeća"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Makni izabrane fotografije iz biblioteke"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Vrati natrag"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Vrati izabrane fotografije natrag u biblioteku"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Otvori upraviteljem datotekama"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Otvori izabrane fotografije u upravitelju datoteka"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Ne mogu otvoriti u upravitelju datoteka: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Ukloni iz biblioteke"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Premjesti u Smeće"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Iz_aberi sve"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Izaberi sve stavke"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%A, %d %b , %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Poništi"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Vrati na trenutne dimenzije"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Postavi okvir za rezanje fotografije"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Zaokreni pravokutnik za rezanje fotografije izmedju vodoravnog i "
+"horizontalnog."
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Bez ograničenja"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Kvadrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Ekran"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Orginalna veličina"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "."
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Zatvori alat za uklanjanje crvenih očiju"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Ukloni crvene oči iz izabranog područja"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Zasičenje:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Sjenčanje:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Sjene:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Vrati boje"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Postavi boje na orginalne"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Sjenčanje"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Zasićenje"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Ekspozicija"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Sjene"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Proširenje kontrasta"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Prikvaći traku sa alatima"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Otkvaći traku s alatima"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Napusti prikaz preko cijelog ekrana"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Napusti _prikaz preko cijelog ekrana"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Izlaz"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_O programu"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Preko _cijelog ekrana"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Sadržaj"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Često postavljana pitanja"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Greška kod pristupanju programskim bibliotekama Shotwell-a. Shotwell ne može "
+"nastaviti s radom.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Posjetite web stranice Yorba-e"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Krešo Kunjas <deresh@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Ne mogu prikazati pomoć: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Ne mogu prikazati često postavljana pitanja: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "neimenovano"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Originalna veličina"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Širina ili visina"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Širina"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Visina"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Podesi veličinu sličica"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Povečaj veličinu sličica"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Smanji veličinu sličica"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Poredaj _fotografije"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Pokreni video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Otvori izabrane videe u sistemskom video pregledniku"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Prikaži oznake svake fotografije"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Po _Naslovu"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Posloži fotografije po naslovu"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Po datumu prikaza (exposure)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Posloži fotografije po datumu prikaza"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Po _ocjeni"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Posloži fotografije po ocjeni"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell nije uspio prikazati video:\n"
+" %s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotografija/video"
+msgstr[1] "%d fotografije/videa"
+msgstr[2] "%d fotografija/videa"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Nema događaja"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nije pronađen niti jedan događaj."
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Događaji"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Nema datuma"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Nema događaja"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nije moguće napraviti data direktorij %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Fotografije"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nije moguće napraviti privremeni direktorij %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nije moguće napraviti data poddirektorij %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(nema)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nema"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Prijelazi kod prikaza prezentacije"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Ne mogu napraviti privremenu datoteku za %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Izvoz"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Datoteka %s već postoji. Zamjeniti?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Preskoći"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Zamjeni"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Zamjeni _sve"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Izvoz"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografije"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW fotografija"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW fotografije"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Greška kod čitanja UI datoteke %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tip"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Objavljivanje"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Izabrane fotografije/videi su uspješno objavljeni."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Izabrani videi su uspješno objavljeni."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Izabrane fotografije su uspješno objavljene."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Izabrani video je uspješno objavljen."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Izabrana fotografija je uspješno objavljena."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Dohvaćam podatke o korisničkom računu..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Prijava..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Objavi fotografije"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Objavi fotografije _na:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Objavi videe"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Objavi video _na"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Objavi fotografije i video"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Objavi fotografije i video _na"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nije moguće objaviti"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Priprema za slanje"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Šaljem %d od %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Za objavu na nekom drugom servisu izaberite ga iz menija."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Privremena datoteka, potrebna za objavu, nije dostupna."
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Trenutno niste prijavljeni u YouTube\n"
+"\n"
+"Za korištenje YouTube servisa morate imati Google korisnički račun koji je "
+"podešen za korištenje istog. Za podešavanje računa, prijavite se barem "
+"jednom na YouTube servis sa svojim Google korisničkim računom."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Prijavljeni ste u YouTube kao %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videi će se prikazati u '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Javno izlistan"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Javno, ali bez izlista"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privatno"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Core servisi za objavu"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Već ste se prijavili i odjavili s Flickr-a tjekom korištenja Shotwella.\n"
+" Za nastavak korištelja Flickr servisa, ponovno pokrenite Shotwell."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Prijavljeni ste u Flickr kao %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Vaš Flickr korisnički račun ima mjesečno ograničenje količine fotografija "
+"koje možete poslati.\n"
+" Ovaj mjesec vam je preostalo %d Mb za korištenje."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Vaš Flickr Pro korisnički račun nema ograničenja."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotografije _vidljive:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Video zapisi _vidljivi:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotografije i video zapisi _vidljivi:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Svima"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Samo prijatelji i obitelj."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Samo meni"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 piksela"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 piksela"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 piksela"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 piksela"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Kreiranje albuma..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Prijavljeni ste u Picasa Web album kao %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videi će se vidjeti u:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotografije će biti postavljene u:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Mala ( 640 x 480 piksela)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Srednje (1024 x 768 piksela)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Preporučeno ( 1600 x 1200 piksela )"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Trenutno niste prijavljenu u Facebook.\n"
+"\n"
+"Ukoliko nemafe Facebook korisnički račun možete ga kreirati kroz proces "
+"prijave. Kod prijave, Shotwell Connect vas može tražiti dopuštenja za slanje "
+"fotografija i objavu u vašim Novostima. Ta dopuštenja su nužna za "
+"funkcioniranje Shotwell Connect-a."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Već ste se prijavili i odjavili sa Facebook-a u tjekom korištenja Shotwell-"
+"a.\n"
+" Za nastavak objave na Facebook, ponovno pokrenite Shotwell."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standardno ( 720 piksela )"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Veliko ( 2048 piksela )"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Provjera spajanja na Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Prijavljeni ste u Facebook kao %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Želite li objaviti izabrane fotografije?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Veličina uploada:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Raspadanje"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Core prezentacijski prijelazi"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Prezentacija"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Izbljeđivanje"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Postavi kao prezentaciju na radnu površinu"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Izradi prezentaciju za pozadinu radne površine."
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Prikaži svaku fotografiju na"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "vremenski period"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Koliko je pojedinačna fotografija prikazana na radnoj površini"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Pretraga"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "od sljedećih:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Koristi _standardnu veličinu:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Koristi korisnički definiranu veličinu:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Uskladi omjer fotografije"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automatska veličina:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Ispiši naslov slike"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Izlaz slike na:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "piksela po inču"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "label"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell postavke"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "bijela"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "crna"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Prati nove otografije u direktoriju biblioteke "
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Meta podaci"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Zapiši oznake, naslove i ostale _metapodatke u fotografije"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Prikaz"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Uvoz fotografija u:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "Pozadina:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Uvoz"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Struktura direktorija:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Uzorak:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Primjer:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "P_reimenuj uvezene datoteke u mala slova"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Vanjs_ki uređivač fotografija:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Vanjski uređivač _RAW datoteka:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Vanjski uređivači"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Priključci"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Odgoda:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Efekt _prijelaza:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "O_dgoda prijelaza:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekundi"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Prijava"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Objavi u _postojeći album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Kreiraj _novi album"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Video i novi albumi s fotografijama su vidljivi:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Odjava"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "O_bjavi"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Veličina fotografija:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Postojeći album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Novom albumu imena:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "Prikaži album u _javnoj galeriji"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Predodređene veličine fotografija:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL vaše Piwigo slikovne biblioteke"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Korisničko _ime"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Lozinka"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Zapamti lozinku"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Prijava"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Postojećoj kategoriji:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotografije će biti vidljive:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Odjava"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Postavke _privatnosti za video:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Sva prava pridržana 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Posjeti Yandex.Fotki internet stranicu"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Trenutno niste prijavljeni u Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumi ( ili napravi novi):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Način pristu_pa:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Onemogući komentare"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Zabrani skidanje orginalne fotografije"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..bfbe0c8
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,4732 @@
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2014 Yorba Foundation
+# See COPYING for license.
+#
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2011, 2012, 2014.
+# L. Csordas <csola48@gmail.com>, 2012.
+# lsbeeler <lucas@yorba.org>, 2011.
+# Balázs Úr <urbalazs at gmail dot com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-03-04 22:34+0000\n"
+"PO-Revision-Date: 2014-03-05 17:11+0100\n"
+"Last-Translator: Balázs Úr <urbalazs at gmail dot com>\n"
+"Language-Team: Hungarian <openscope at googlegroups dot com>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.2\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "A közzétételhez szükséges ideiglenes fájl nem érhető el"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"A Shotwell használata közben már bejelentkezett a Google szolgáltatásra, és "
+"kijelentkezett onnan.\n"
+"\n"
+"A Google szolgáltatásra való feltöltés folytatásához indítsa újra a "
+"Shotwellt, és próbálja újra a feltöltést."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:688
+msgid "Visit the Yorba web site"
+msgstr "Keresse fel a Yorba weboldalát"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:691
+msgid "translator-credits"
+msgstr ""
+"Peter Bojtos <ptr at ulx dot hu>\n"
+"Nikolas Slivka <snicore at gmail dot com>\n"
+"Laszlo Csordas <csola48 at gmail dot com>\n"
+"Kelemen Gábor <kelemeng at gnome dot hu>\n"
+"Kökéndy Ákos https://launchpad.net/~kokendy-akos\n"
+"Robert Roth https://launchpad.net/~evfool\n"
+"\n"
+"Launchpad Contributions:\n"
+" Adamyno https://launchpad.net/~adam-pretz\n"
+" Gabor Kelemen https://launchpad.net/~kelemeng\n"
+" KAMI https://launchpad.net/~kami911\n"
+" Kökéndy Ákos https://launchpad.net/~kokendy-akos\n"
+" Laura Khalil https://launchpad.net/~loura\n"
+" Peter Bojtos https://launchpad.net/~ptr-ulx\n"
+" Richard Somlói https://launchpad.net/~ricsipontaz\n"
+" Robert Roth https://launchpad.net/~evfool\n"
+" Vera Yin https://launchpad.net/~vera-yorba\n"
+" csola48 https://launchpad.net/~mail-csordaslaszlo"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+#| msgid "Copyright 2009-2013 Yorba Foundation"
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2009-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Üdvözli az F-Spot gyűjteményimportáló szolgáltatás.\n"
+"\n"
+"Válasszon egy importálandó gyűjteményt a Shotwell által talált egyik meglévő "
+"gyűjtemény kiválasztásával, vagy egy alternatív F-Spot adatbázisfájl "
+"kiválasztásával."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Üdvözli az F-Spot gyűjteményimportáló szolgáltatás.\n"
+"\n"
+"Válasszon egy F-Spot adatbázisfájlt."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Importálandó F-Spot adatbázisfájl kiválasztása:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"A kijelölt F-Spot adatbázisfájl nem nyitható meg: a fájl nem létezik, vagy "
+"nem F-Spot adatbázis"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"A kijelölt F-Spot adatbázisfájl nem nyitható meg: a Shotwell nem támogatja "
+"az F-Spot adatbázis ezen verzióját"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"A kijelölt F-Spot adatbázisfájl nem olvasható: hiba a címketábla olvasásakor"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"A kijelölt F-Spot adatbázisfájl nem olvasható: hiba a fényképtábla "
+"olvasásakor"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"A Shotwell %d fényképet talált az F-Spot gyűjteményben, és éppen importálja "
+"ezeket. A többször szereplő képek felismerésre és eltávolításra kerülnek.\n"
+"\n"
+"Bezárhatja ezt az ablakot, és megkezdheti a Shotwell használatát mialatt az "
+"importálás a háttérben folytatódik."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot gyűjtemény: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Importálás előkészítése"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Alap adatimportáló szolgáltatások"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 képpont"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 képpont"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixel"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "„%s” nem érvényes válasz OAuth hitelesítési kérésre"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): nem lehet elindítani, ez a közzétevő nem "
+"indítható újra."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Adja meg a felhasználó nevet és a jelszót a társított Tumblr fiókhoz"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "A felhasználónév és/vagy jelszó érvénytelen. Próbálja újra"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Érvénytelen felhasználónév vagy jelszó"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "A felület nem tölthető be: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Bejelentkezett a Tumblr-re %s néven.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "A Yandex.Fotki weboldal felkeresése"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Jelenleg nincs bejelentkezve a Yandex.Fotki oldalra."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell extra közzétételi szolgáltatások"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "címke"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_E-mail cím"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Jelszó"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Bejelentkezés"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogok:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Fénykép _mérete:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Kijelentkezés"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "Közzé_tétel"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Albumok (vagy új írása):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "Hozzáférés típusa:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "H_ozzászólások letiltása"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Eredeti kép letöltésének megtiltása"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Nyilvános"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Barátok"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Magánjellegű"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell kapcsolat"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Jelenleg nincs bejelentkezve a Facebookra.\n"
+"\n"
+"Ha nincs még Facebook fiókja, a bejelentkezés során létrehozhat egyet. "
+"Engedélyeznie kell a fényképek feltöltését, és a falon való közzétételét. "
+"Ezek az engedélyek szükségesek a Shotwell kapcsolat működéséhez."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"A Shotwell használata közben már bejelentkezett a Facebookra, és "
+"kijelentkezett onnan.\n"
+"A Facebookra való feltöltés folytatásához indítsa újra a Shotwellt, és "
+"próbálja újra a feltöltést."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Szabványos (720 képpont)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Nagy (2048 képpont)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Kapcsolat tesztelése a Facebookhoz…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Album létrehozása…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Egy, a közzétételhez szükséges fájl nem érhető el. A közzététel a Facebookra "
+"nem folytatódhat."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Bejelentkezett a Facebookra %s néven.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Hová szeretné feltölteni a kijelölt fényképeket?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "Feltöltés _mérete:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Csak én"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Mindenki"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Jelenleg nincs bejelentkezve Flickr-re\n"
+"\n"
+"Kattintson a Bejelentkezés gombra a bejelentkezéshez a Flickr fiókjába a "
+"böngészőből. A bejelentkezés során jogosultságot kell adnia a Shotwell "
+"Connectnek, hogy hozzáférjen a Flickr fiókjához."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"A Shotwell használata közben már bejelentkezett a Flickr-re, és "
+"kijelentkezett onnan.\n"
+"A Flickr-re való feltöltés folytatásához indítsa újra a Shotwellt, és "
+"próbálja újra a feltöltést."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Felkészülés a bejelentkezésre…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Egy, a közzétételhez szükséges fájl nem érhető el. A közzététel a Flickrre "
+"nem folytatódhat."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Felhatalmazás ellenőrzése…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Bejelentkezett a Flickr-re %s néven.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Az ingyenes Flickr fiókja korlátozza a havonta feltölthető adatmennyiséget.\n"
+"Ebben a hónapban még %d MB feltöltésére van lehetősége."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Az Ön Flickr Pro fiókja korlátlan feltöltést engedélyez."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "A _fényképeket láthatja:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "A _videókat láthatja:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "A _fényképeket/videókat láthatja:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Csak barátok és család"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Csak család"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Csak barátok"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 képpont"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 képpont"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Eredeti méret"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Jelenleg nincs bejelentkezve Picasa Webalbumokba.\n"
+"\n"
+"Kattintson a Bejelentkezés gombra a bejelentkezéshez a Picasa Webalbumokba a "
+"böngészőből. A bejelentkezés során jogosultságot kell adnia a Shotwell "
+"Connectnek, hogy hozzáférjen a Picasa Webalbumokhoz."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Egy, a közzétételhez szükséges fájl nem érhető el. A közzététel a Picasara "
+"nem folytatódhat."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Bejelentkezett a Picasa Webalbumokba %s néven."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "A videók itt jelennek meg:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "A fényképek itt fognak megjelenni:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Kicsi (640 x 480 képpont)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Közepes (1024 x 768 képpont)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Ajánlott (1600 x 1200 képpont)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 képpont)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Eredeti méret"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s album létrehozása…"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Hibaüzenet érkezett a Piwigon való közzététel során. Próbálja újra."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Adja meg a Piwigo fotógyűjteményének URL-címét, valamint az ahhoz tartozó "
+"Piwigo fiókjának felhasználónevét és jelszavát."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"A Shotwell nem éri el a Piwigo fotógyűjteményét. Ellenőrizze a megadott URL-"
+"címet."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Érvénytelen URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Adminok, család, barátok, partnerek"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Adminok, család, barátok"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Adminok, család"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Adminok"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Nincs bejelentkezve a YouTube-ra.\n"
+"\n"
+"A folytatáshoz rendelkeznie kell egy Google fiókkal, és be kell azt "
+"állítania a YouTube-bal való használathoz. A legtöbb fiókot a böngészőből is "
+"beállíthatja, ha bejelentkezik a YouTube oldalon legalább egyszer."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Egy, a közzétételhez szükséges fájl nem érhető el. A közzététel a Youtube-ra "
+"nem folytatódhat."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Bejelentkezett a YouTube-ra %s néven."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "A videók itt jelennek meg: „%s”"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Nyilvános, felsorolt"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Nyilvános, felsorolatlan"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Közzététel _meglévő albumban:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Új _album létrehozása ezen a néven:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "A _videókat és új fényképalbumokat láthatja:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Eltávolítja a tartózkodási hely, a fényképezőgép és egyebek azonosításra "
+"alkalmas adatait a feltöltés előtt"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Írja be a megerősítési számot, amely a Flickr-be való bejelentkezés után "
+"jelenik meg a böngészőjében."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Hitelesítési szám:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Foly_tatás"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "_Egy létező album:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Új _album, a neve:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "Alb_um listázása a nyilvános galériában"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Fénykép_méret előbeállítása:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "Piwigo fotógyűjtemény URL-címe"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Felhasználónév"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Jelszó megjegyzése"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Egy létező _kategória:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Fényképek lát_hatók lesznek:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Fénykép mérete:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "kategóriában:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Albummegjegyzés:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"Ha be van állítva _cím, de megjegyzés nincs, akkor a cím használata "
+"megjegyzésként"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Címkék ne legyenek feltöltve"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Kijelentkezés"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Közzététel"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Alap közzétételi szolgáltatások"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Videók _magánszféra-beállítása:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Lamellák"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Sakk"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Kör"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Körök"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Óra"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Összecsuklás"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Elhalványodás"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Dia"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Négyzetek"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Csíkok"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Alap diaátmenetek"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+#| msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nem hozható létre a gyorsítótár könyvtára (%s): %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nem hozható létre az adatkönyvtár (%s): %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Képek"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nem hozható létre az ideiglenes könyvtár (%s): %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nem hozható létre az adatalkönyvtár (%s): %s"
+
+#. restore pin state
+#: ../src/AppWindow.vala:52
+msgid "Pin Toolbar"
+msgstr "Eszköztár rögzítése"
+
+#: ../src/AppWindow.vala:53
+msgid "Pin the toolbar open"
+msgstr "Eszköztár rögzítése nyitva"
+
+#: ../src/AppWindow.vala:57 ../src/AppWindow.vala:135
+msgid "Leave fullscreen"
+msgstr "Teljes képernyő elhagyása"
+
+#: ../src/AppWindow.vala:134
+msgid "Leave _Fullscreen"
+msgstr "Teljes képernyő _elhagyása"
+
+#: ../src/AppWindow.vala:496
+msgid "_Quit"
+msgstr "_Kilépés"
+
+#: ../src/AppWindow.vala:501
+msgid "_About"
+msgstr "_Névjegy"
+
+#: ../src/AppWindow.vala:506
+msgid "Fulls_creen"
+msgstr "Teljes ké_pernyő"
+
+#: ../src/AppWindow.vala:511
+msgid "_Contents"
+msgstr "_Tartalom"
+
+#: ../src/AppWindow.vala:516
+msgid "_Frequently Asked Questions"
+msgstr "_Gyakran ismételt kérdések"
+
+#: ../src/AppWindow.vala:521
+msgid "_Report a Problem..."
+msgstr "_Hiba jelentése…"
+
+#: ../src/AppWindow.vala:620 ../src/AppWindow.vala:641
+#: ../src/AppWindow.vala:658 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "Mé_gse"
+
+#: ../src/AppWindow.vala:668
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Végzetes hiba történt a Shotwell gyűjtemény megnyitása közben, a Shotwell "
+"futása nem folytatódhat.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:700
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nem lehet megjeleníteni a súgót: %s"
+
+#: ../src/AppWindow.vala:708
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nem nyitható meg a hibaadatbázis: %s"
+
+#: ../src/AppWindow.vala:716
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nem jeleníthető meg a GyIK: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Sikerült"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Fájlhiba"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nem dekódolható a fájl"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Adatbázishiba"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "A felhasználó megszakította az importálást"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nem fájl"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "A fájl már létezik az adatbázisban"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nem támogatott fájlformátum"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nem képfájl"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Lemezhiba"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Betelt a lemez"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Fényképezőgép-hiba"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Fájlírási hiba"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Sérült képfájl"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Az importálás meghiúsult (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "_Diavetítés"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Diavetítés indítása"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Fényképek/videók exportálása"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Fényképek/videók exportálása"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Fényképek exportálása"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Fényképek exportálása"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Forgatás"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Forgatás visszavonása"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Tükrözés vízszintesen"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Vízszintes tükrözés visszavonása"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Tükrözés függőlegesen"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Függőleges tükrözés visszavonása"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Visszaállítás"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Visszaállítás visszavonása"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Kiemelés"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Kiemelés visszavonása"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Színátalakítás alkalmazása"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Színátalakítás visszavonása"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Új esemény létrehozása"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Esemény eltávolítása"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Fényképek áthelyezése az új eseménybe"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Fényképek átállítása az előző eseményre"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Egyesítés"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Szétválasztás"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Fényképek duplikálása"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Többszörösen jelenlévő fényképek eltávolítása"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Fájlhiba miatt a fénykép nem duplikálható"
+msgstr[1] "Fájlhiba miatt %d fénykép nem duplikálható"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Korábbi értékelés visszaállítása"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Értékelés csökkentése"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Értékelés növelése"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW előhívó beállítása"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Előző RAW előhívó visszaállítása"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Az előhívó beállítása"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Az eredeti fénykép nem módosítható."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Dátum és idő módosítása"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Dátum és idő módosításának visszavonása"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Az eredeti fénykép nem módosítható."
+msgstr[1] "A következő eredeti fényképek nem módosíthatók."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Hiba az idő megváltoztatásakor"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Az időmódosítás nem vonható vissza a következő fényképen."
+msgstr[1] "Az időmódosítás nem vonható vissza a következő fényképeken."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Címke létrehozása"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "„%s” címke mozgatása"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Fényképek áthelyezése a Kukába"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Fényképek visszaállítása a Kukából"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Fényképek áthelyezése a Shotwell kukájába"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Fényképek visszaállítása a Shotwell gyűjteményébe"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Fényképek áthelyezése a Kukába"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Fényképek visszaállítása a Kukából"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Kiválasztott fényképek megjelölése"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Kiválasztott fényképek megjelölésének törlése"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Kijelölt fényképek megjelölése"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Kijelölt fényképek megjelölésének visszavonása"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Megjelölés"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Jelölés törlése"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "A Nautilus küldés nem indítható el: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Küldés"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "A háttér exportálása sikertelen ide: %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Az asztali diavetítés nem készíthető elő: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Ez eltávolítja a(z) „%s” címkét egy fényképről. Folytatja?"
+msgstr[1] "Ez eltávolítja a(z) „%s” címkét %d fényképről. Folytatja?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Törlés"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Ezzel törli a(z) „%s” mentett keresést. Folytatja?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Az előhívók váltása a fénykép minden, a Shotwellben végzett módosítását "
+"visszavonja"
+msgstr[1] ""
+"Az előhívók váltása a fényképek minden, a Shotwellben végzett módosítását "
+"visszavonja"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Előhívó váltása"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Videó exportálása"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"A Shotwell nem tudott létrehozni fájlt a fénykép szerkesztéséhez, mert nincs "
+"jogosultsága ide írni: %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"A következő fényképek exportálása fájlhiba miatt nem lehetséges.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Szeretné folytatni az exportálást?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Módosítatlan"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Jelenlegi"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formátum:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Minőség:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Méretezési megszorítás:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " ké_ppont"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Metaadatok exportálása"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Részletek mentése…"
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Részletek mentése"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(és még %d)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importálás eredményei jelentés"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Kísérlet történt %d fájl importálására."
+msgstr[1] "Kísérlet történt %d fájl importálására."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Ebből %d fájl lett sikeresen importálva."
+msgstr[1] "Ebből %d fájl lett sikeresen importálva."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Nem importált, duplikált fotók/videók:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "Duplikálja a meglévő médiaelemet"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "A fényképezőgép hibája miatt nem importált fotók/videók:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "hibaüzenet:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Fotóként vagy videóként fel nem ismert, és emiatt nem importált fájlok:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"A Shotwell által nem értelmezhető formátumú, és emiatt nem importált fotók/"
+"videók:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"A Shotwell által a gyűjteménybe nem másolható, és emiatt nem importált fotók/"
+"videók:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s nem másolható\n"
+"\tide: %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+"A fényképek/videók importálása sikertelen volt, mert néhány fájl sérült:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Más okból nem importált fotók/videók:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d duplikált fénykép nem lett importálva:\n"
+msgstr[1] "%d duplikált fénykép nem lett importálva:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d duplikált videó nem lett importálva:\n"
+msgstr[1] "%d duplikált videó nem lett importálva:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d duplikált fénykép/videó nem lett importálva:\n"
+msgstr[1] "%d duplikált fénykép/videó nem lett importálva:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fényképet nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+msgstr[1] ""
+"%d fényképet nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d videót nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+msgstr[1] "%d videót nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fényképet/videót nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+msgstr[1] ""
+"%d fényképet/videót nem sikerült importálni fájl- vagy hardverhiba miatt:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d fájlt nem sikerült importálni hardver- vagy fájlhiba miatt:\n"
+msgstr[1] "%d fájlt nem sikerült importálni hardver- vagy fájlhiba miatt:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fényképet nem sikerült importálni, mert a fényképgyűjtemény mappája nem "
+"írható:\n"
+msgstr[1] ""
+"%d fényképet nem sikerült importálni, mert a fényképgyűjtemény mappája nem "
+"írható:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d videót nem sikerült importálni, mert a fényképgyűjtemény mappája nem "
+"írható:\n"
+msgstr[1] ""
+"%d fényképet nem sikerült importálni, mert a fényképgyűjtemény mappája nem "
+"írható:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fényképet/videót nem sikerült importálni, mert a fényképgyűjtemény "
+"mappája nem írható:\n"
+msgstr[1] ""
+"%d fényképet/videót nem sikerült importálni, mert a fényképgyűjtemény "
+"mappája nem írható:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"A fényképgyűjtemény mappája nem írható, emiatt %d fájl importálása nem "
+"sikerült:\n"
+msgstr[1] ""
+"A fényképgyűjtemény mappája nem írható, emiatt %d fájl importálása nem "
+"sikerült:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d fényképet nem sikerült importálni fényképezőgép-hiba miatt:\n"
+msgstr[1] "%d fényképet nem sikerült importálni fényképezőgép-hiba miatt:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 videót nem sikerült importálni fényképezőgép-hiba miatt:\n"
+msgstr[1] "%d videót nem sikerült importálni fényképezőgép-hiba miatt:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 fényképet/videót nem sikerült importálni fényképezőgép-hiba miatt:\n"
+msgstr[1] ""
+"%d fényképet/videót nem sikerült importálni fényképezőgép-hiba miatt:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 fájlt nem sikerült importálni fényképezőgép-hiba miatt:\n"
+msgstr[1] "%d fájlt nem sikerült importálni fényképezőgép-hiba miatt:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 fénykép importálása sikertelen, mert sérült:\n"
+msgstr[1] "%d fénykép importálása sikertelen, mert sérült:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 videó importálása sikertelen, mert sérült:\n"
+msgstr[1] "%d videó importálása sikertelen, mert sérült:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 fénykép/videó importálása sikertelen, mert sérült:\n"
+msgstr[1] "%d fénykép/videó importálása sikertelen, mert sérült:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 fájl importálása sikertelen, mert sérült:\n"
+msgstr[1] "%d fájl importálása sikertelen, mert sérült:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d nem támogatott formátumú fénykép kihagyva:\n"
+msgstr[1] "%d nem támogatott formátumú fénykép kihagyva:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d nem képfájl kihagyva.\n"
+msgstr[1] "%d nem képfájl kihagyva.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d fénykép a felhasználó utasítására kihagyva.\n"
+msgstr[1] "%d fénykép a felhasználó utasítására kihagyva.\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d videó a felhasználó utasítására kihagyva:\n"
+msgstr[1] "%d videó a felhasználó utasítására kihagyva:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d fénykép/videó a felhasználó utasítására kihagyva:\n"
+msgstr[1] "%d fénykép/videó a felhasználó utasítására kihagyva:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d fájl a felhasználó utasítására kihagyva:\n"
+msgstr[1] "%d fájl a felhasználó utasítására kihagyva:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d fénykép sikeresen importálva.\n"
+msgstr[1] "%d fénykép sikeresen importálva.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d videó sikeresen importálva.\n"
+msgstr[1] "%d videó sikeresen importálva.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d fénykép/videó sikeresen importálva.\n"
+msgstr[1] "%d fénykép/videó sikeresen importálva.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Nem lettek importálva fényképek vagy videók.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importálás kész"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d másodperc"
+msgstr[1] "%d másodperc"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d perc"
+msgstr[1] "%d perc"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d óra"
+msgstr[1] "%d óra"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 nap"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Esemény átnevezése"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Név:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Cím szerkesztése"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Cím:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Eseménymegjegyzés szerkesztése"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Fotó/videó megjegyzés szerkesztése"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Megjegyzés:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Fájl eltávolítása"
+msgstr[1] "_Fájlok eltávolítása"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Csak eltávolítás"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Megtartás"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Visszavonja a külső szerkesztést?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Visszavonja a külső szerkesztéseket?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "Ezzel a külső fájlon végzett minden változtatás elvész. Folytatja?"
+msgstr[1] ""
+"Ezzel a külső %d fájlon végzett minden változtatás elvész. Folytatja?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Külső szerkesztés _visszavonása"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Külső szerkesztések _visszavonása"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Ezzel eltávolítja a fényképet a gyűjteményből. Folytatja?"
+msgstr[1] "Ezzel eltávolít %d fényképet a gyűjteményből. Folytatja?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Eltávolítás"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Fénykép eltávolítása a gyűjteményből"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Fényképek eltávolítása a gyűjteményből"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "DE"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "DU"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 óra"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Fotók/videók _eltolása azonos mennyiséggel"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Min_den fotó/videó beállítása erre az időre"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Eredeti fényképfájl _módosítása"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Eredeti fényképfájlok _módosítása"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Eredeti fájl _módosítása"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Eredeti fájlok _módosítása"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Eredeti: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y. %m. %d., %k.%M.%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y. %m. %d., %l.%M.%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"A képek készítése előre lesz tolva ennyivel:\n"
+"%d %s, %d %s, %d %s, és %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"A képek készítése vissza lesz tolva ennyivel:\n"
+"%d %s, %d %s, %d %s, és %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "nap"
+msgstr[1] "nap"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "óra"
+msgstr[1] "óra"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "perc"
+msgstr[1] "perc"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "másodperc"
+msgstr[1] "másodperc"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"És %d egyéb."
+msgstr[1] ""
+"\n"
+"\n"
+"És %d egyéb."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Címkék (vesszővel elválasztva):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Üdvözöljük!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Üdvözöljük a Shotwellben!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "Az alábbi módokon importálhatja fényképeit:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Válassza a <span weight=\"bold\">Fájl %s Importálás mappából</span> "
+"menüpontot"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Húzza fényképeit a Shotwell ablakába"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+"Csatlakoztasson egy fényképezőgépet a számítógéphez, és importálja a "
+"fényképeit"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Fényképek i_mportálása a(z) %s mappájából"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Fényképeket a következő módokon is importálhat:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Ne jelenjen meg ez az üzenet többé"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Fényképek importálása a(z) %s gyűjteményéből"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Súgó)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Év%sHónap%sNap"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Év%sHónap"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Év%sHónap-Nap"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Év-Hónap-Nap"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Egyéni"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Érvénytelen minta"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"A Shotwell átmásolhatja a fényképeket a gyűjtemény könyvtárába, vagy "
+"importálhatja azokat másolás nélkül is."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Fény_képek másolása"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importálás"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importálás a gyűjteménybe"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Eltávolítás a gyűjteményből"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Fényképek eltávolítás a gyűjteményből"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Fényképek eltávolítása a gyűjteményből"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ezzel eltávolítja a Shotwell gyűjteményből a fényképet/videót. Szeretné a "
+"fájlt a Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+msgstr[1] ""
+"Ezzel eltávolít a Shotwell gyűjteményből %d fényképet/videót. Szeretné a "
+"fájlokat a Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ezzel eltávolítja a Shotwell gyűjteményből a videót. Szeretné a fájlt a "
+"Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+msgstr[1] ""
+"Ezzel eltávolít a Shotwell gyűjteményből %d videót. Szeretné a fájlokat a "
+"Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ezzel eltávolítja a Shotwell gyűjteményből a fényképet. Szeretné a fájlt a "
+"Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+msgstr[1] ""
+"Ezzel eltávolít a Shotwell gyűjteményből %d fényképet. Szeretné a fájlt a "
+"Kukába is áthelyezni?\n"
+"\n"
+"Ez a művelet nem vonható vissza."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "%d fotó vagy videó nem helyezhető át a Kukába. Törli a fájlt?"
+msgstr[1] "%d fotó vagy videó nem helyezhető át a Kukába. Törli a fájlokat?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d fotó vagy videó nem törölhető."
+msgstr[1] "%d fotó vagy videó nem törölhető."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Szélesség vagy magasság"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Szélesség"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Magasság"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s nem figyelhető: nem könyvtár (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:753
+#, c-format
+msgid "Event %s"
+msgstr "%s események"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nem generálható ideiglenes fájl ehhez: %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportálás"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "A fájl (%s) már létezik. Lecseréli?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Kihagyás"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Csere"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Öss_zes cseréje"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportálás"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "A megfigyelés frissítései nem dolgozhatók fel: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "A bélyegképek méretének beállítása"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "_Nagyítás"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Bélyegképek nagyítása"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "_Kicsinyítés"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Bélyegképek kicsinyítése"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Fényképek _rendezése"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Videó lejátszása"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Kijelölt videók megnyitása a rendszer videolejátszójában"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Előhívó"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Fényképezőgép"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Címek"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Fényképek címeinek megjelenítése"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Megjegyzések"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Az egyes képek megjegyzéseinek megjelenítése"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "Cí_mkék"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Fényképek címkéinek megjelenítése"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_Cím szerint"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Fényképek rendezése cím szerint"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "_Készítés dátuma"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Fényképek rendezése készítésük dátuma szerint"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "É_rtékelés szerint"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Fényképek rendezése értékelés szerint"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Növekvő"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Fényképek növekvő sorrendbe rendezése"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "_Csökkenő"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Fényképek csökkenő sorrendbe rendezése"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"A Shotwell nem tudta lejátszani a kijelölt videót:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nincsenek fényképek/videók"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nem találhatók fényképek/videók"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Nem exportálhatók fényképek ebbe a könyvtárba."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "módosítva"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Előző fénykép"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Következő fénykép"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "A fénykép forrásfájlja hiányzik: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Nézet"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Eszközök"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Előző fénykép"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Előző fénykép"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Következő fénykép"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Következő fénykép"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Fénykép nagyításának növelése"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Fénykép nagyításának csökkentése"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "_Teljes oldal"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Képernyő kitöltése a fényképpel"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "_100% nagyítás"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Fénykép 100%-os nagyítása"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "_200% nagyítás"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Fénykép 200%-os nagyítása"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s exportálása sikertelen: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Teljes oldal kitöltése"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 kép oldalanként"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 kép oldalanként"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 kép oldalanként"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 kép oldalanként"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 kép oldalanként"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 kép oldalanként"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "hüvelyk"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Tárca (2 x 3 hüvelyk)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Jegyzettömb (3 x 5 hüvelyk)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 hüvelyk"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 hüvelyk"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 hüvelyk"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 hüvelyk"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 hüvelyk"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrikus tárca (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Képeslap (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Képbeállítások"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Nyomtatás…"
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"A fénykép nem nyomtatható:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Ma"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Tegnap"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Elemek:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d esemény"
+msgstr[1] "%d esemény"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fénykép"
+msgstr[1] "%d fénykép"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d videó"
+msgstr[1] "%d videó"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Dátum:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Idő:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Ettől:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Eddig:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Méret:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Hossz:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f másodperc"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Előhívó:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Expozíció:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Hely:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Fájl mérete:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Jelenlegi előhívás:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Eredeti méretek:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Fényképezőgép gyártója:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Fényképezőgép típusa:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Vaku:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Fókusztávolság:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Exponálás dátuma:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Exponálási idő:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Expozícióeltolás:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS szélesség:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS hosszúság:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Készítő:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Szoftver:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Bővebb információk"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fényképkezelő"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotómegjelenítő"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Forgatás j_obbra"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Forgatás"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Forgatás jobbra"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Fényképek forgatása jobbra (Ctrl = balra forgatás)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Forgatás _balra"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Forgatás balra"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Fényképek forgatása balra"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "_Vízszintes tükrözés"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Tükrözés vízszintesen"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "_Függőleges tükrözés"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Tükrözés függőlegesen"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Feljavítás"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Feljavítás"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Fényképek megjelenésének automatikus javítása"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Színbeállítások másolása"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Színbeállítások másolása"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "A képen alkalmazott színbeállítások másolása"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Színbeállítások beillesztése"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Színbeállítások beillesztése"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "A másolt színbeállítások alkalmazása a kijelölt fényképekre"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Levágás"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Levágás"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Levágás a fénykép méretéből"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Ki_egyenesítés"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Kiegyenesítés"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "A fénykép kiegyenesítése"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Vö_rösszem-hatás"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Vörösszem-hatás"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Vörösszem-hatás csökkentése vagy eltávolítása a fényképről"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "Mó_dosítás"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Módosítás"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Fénykép színének és tónusának módosítása"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Vissza az eredetihez"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Vissza az eredetihez"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "_Külső szerkesztések visszavonása"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Visszatérés az eredeti fényképhez"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Beállítás _asztalháttérként"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Kiválasztott fénykép beállítása asztalháttérként"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Beállítás asztali _diavetítésként…"
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Visszavonás:"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Visszavonás"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "Új_ra:"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Újra"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Esemé_ny átnevezése…"
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "_Esemény kulcsképévé tétel"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Esemény kulcsképévé tétel"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "Új esemé_ny"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Új esemény"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Fényképek áthelyezése"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Fényképek áthelyezése eseménybe"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Események egyesítése"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Egyesítés"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Események egyesítése egyetlen eseménnyé"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "É_rtékelés megadása"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Értékelés megadása"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Fénykép értékelésének módosítása"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Növelés"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Értékelés növelése"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Csökkentés"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Értékelés csökkentése"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "É_rtékeletlen"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Értékeletlen"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Értékelés törlése"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Beállítás értékeletlenre"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Minden értékelés eltávolítása"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Visszautasított"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Visszautasítva"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Értékelés visszautasítottként"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Beállítás visszautasítottra"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Értékelés beállítása visszautasítottra"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Csak visszautasított"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Csak visszautasított"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Csak a visszautasított fényképek megjelenítése"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Összes + _visszautasított"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Összes fénykép megjelenítése, a visszautasítottak is"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Öss_zes fénykép"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Összes fénykép megjelenítése"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "É_rtékelések"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "A fényképek értékelésének megjelenítése"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Fényképek szűrése"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Fényképek szűrése"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "A megjelenített fényképek számának korlátozása szűrővel"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Többszörözés"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Többszörözés"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Másolat készítése a fényképről"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportálás…"
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Nyomtatás…"
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Kö_zzététel…"
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Közzététel különböző weboldalakon"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "_Cím szerkesztése…"
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Megjegyzés s_zerkesztése…"
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "A megjegyzés szerkesztése"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "_Eseménymegjegyzés szerkesztése…"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Dátum és idő módosítása…"
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Dátum és idő módosítása"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Címkék hozzáadása…"
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Címkék hozzáadása…"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Címkék hozzáadása"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Beállítások"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Megnyitás külső _szerkesztővel"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Megnyitás RA_W szerkesztővel"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Kül_dés…"
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Küldés _célja…"
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Keresés…"
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Keresés"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Kép keresése a névben vagy a címkékben megjelenő szöveg beírásával"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Megjelölés"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Megjelölés _törlése"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "A szerkesztő nem indítható el: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "„%s” címke hozzáadása"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "„%s” és „%s” címke hozzáadása"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "„%s” címke _törlése"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "„%s” címke törlése"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Címke törlése"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "Ú_j"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "„%s” címke át_nevezése…"
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "„%s” címke átnevezése erre: „%s”"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Át_nevezés…"
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Cí_mkék módosítása…"
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Címkék módosítása"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Fényképek címkézése ezzel: „%s”"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Fényképek címkézése ezzel: „%s”"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Kiválasztott fényképek címkézése ezzel: „%s”"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Kiválasztott fényképek címkézése ezzel: „%s”"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "„%s” címke _eltávolítása a fényképről"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "„%s” címke _eltávolítása a fényképekről"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "„%s” címke eltávolítása a fényképről"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "„%s” címke eltávolítása a fényképekről"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "A címke nem nevezhető át erre: „%s”, mert a címke már létezik."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Nem lehet átnevezni a keresést erre: „%s”, mert a keresés már létezik."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Mentett keresés"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Keresés törlése"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "S_zerkesztés…"
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Át_nevezés…"
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "„%s” keresés átnevezése erre: „%s”"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "„%s” keresés törlése"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s értékelés"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Értékelés beállítása erre: %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Értékelés beállítása erre: %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s megjelenítése"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Csak azon fényképek megjelenítése, amelyek értékelése %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s vagy jobb"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s vagy jobb megjelenítése"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Csak azon fényképek mutatása, amelyek értékelése %s vagy jobb"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Kijelölt fényképek eltávolítása a Kukából"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Kijelölt fényképek eltávolítása a gyűjteményből"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Visszaállítás"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Kijelölt fényképek visszaállítása a gyűjteménybe"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "_Megjelenítés a fájlkezelőben"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Kijelölt fénykép könyvtárának megnyitása a fájlkezelőben"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nem nyitható meg a fájlkezelőben: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Eltávolítás a gyűjteményből"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Á_thelyezés a Kukába"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Összes _kijelölése"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Minden elem kijelölése"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%H.%M"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%H.%M.%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%Y. %b. %d., %a"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a. %b. %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%Y. %d."
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Diavetítés"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Megjelölve"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fényképek"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videók"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW fényképek"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW fényképek"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Hiba a(z) %s felületfájl betöltésekor: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Típus"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Értékelés"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Beállítások"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Vissza"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ugrás az előző fényképre"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Szünet"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Diavetítés szüneteltetése"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Következő"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ugrás a következő fényképre"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Diavetítés beállításainak módosítása"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Az összes fénykép forrásfájlja elveszett."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Lejátszás"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Diavetítés folytatása"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "névtelen"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:486
+msgid "Export Videos"
+msgstr "Videók exportálása"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fényképezőgépek"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"A fényképezőgép leválasztása nem sikerült, próbálja meg a fájlkezelőből "
+"leválasztani."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Már importált fényképek elrejtése"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Csak a nem importált fényképek megjelenítése"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Importálás kezdése, kis türelmet…"
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Kijelöltek importálása"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Kijelölt fényképek importálása a gyűjteményébe"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Összes im_portálása"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Minden fénykép importálása a gyűjteményébe"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"A Shotwellnek le kell választania a fényképezőgépet a fájlrendszerről az "
+"eléréséhez. Folytatja?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Leválasztás"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Válassza le a fényképezőgépet."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"A fényképezőgépet egy másik alkalmazás zárolta, így a Shotwell nem tudja "
+"használni. Zárja be a fényképezőgépet használó összes alkalmazást, majd "
+"próbálja újra."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Zárja be a fényképezőgépet használó összes alkalmazást."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nem tölthetők le az előnézetek a fényképezőgépről:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Leválasztás…"
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Fénykép-információk lekérése"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s előnézetének lekérése"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "A fényképezőgép nem zárolható: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Törli a fényképet a fényképezőgépről?"
+msgstr[1] "Töröl %d fényképet a fényképezőgépről?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Törli a videót a fényképezőgépről?"
+msgstr[1] "Töröl %d videót a fényképezőgépről?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Törli a fényképet/videót a fényképezőgépről?"
+msgstr[1] "Töröl %d fényképet/videót a fényképezőgépről?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Törli ezt a fájlt a fényképezőgépről?"
+msgstr[1] "Törli ezt a(z) %d fájlt a fényképezőgépről?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fényképek/videók eltávolítása a fényképezőgépről"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Hiba történt, %d fénykép/videó nem törölhető a fényképezőgépről."
+msgstr[1] "Hiba történt, %d fénykép/videó nem törölhető a fényképezőgépről."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Adatimportálások"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s adatbázis"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Az importálás innen: %s egy hiba miatt nem folytatódhat:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Egy másik szolgáltatásból való importáláshoz válasszon egyet a fenti menüből."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nincsenek engedélyezve adatimportáló bővítmények.\n"
+"\n"
+"Az Importálás alkalmazásból funkció használatához engedélyeznie kell "
+"legalább egy adatimportáló bővítményt. A bővítmények a Beállítások ablakban "
+"engedélyezhetők."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Adatbázisfájl:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importálás"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importálás alkalmazásból"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Mé_dia importálása innen:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Bezárás"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "A fénykép-adatbázis (%s) nem nyitható meg/hozható létre: hibakód: %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nem lehet írni a fényképadatbázis-fájlba:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Hiba az adatbázisfájl elérésekor:\n"
+" %s\n"
+"\n"
+"A hibaüzenet: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Fájl"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "M_entés"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Fénykép mentése"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Men_tés másként…"
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Fénykép mentése más névvel"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Fénykép nyomtatása a számítógéphez csatlakozó nyomtatón"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "S_zerkesztés"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Fénykép"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Súgó"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s nem létezik."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nem fájl."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s nem támogatja a következő fájlformátumát:\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Másolat mentése"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Eldobja a(z) %s változtatásait?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Bezárás mentés _nélkül"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Hiba a(z) %s helyre mentéskor: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Mentés másként"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Aktuális fényképméretek visszaállítása"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Képkivágás beállítása a képhez"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "A kivágási téglalap forgatása az álló és fekvő tájolások között"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Korlátlan"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Négyzet"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Képernyő"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD videó (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD videó (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 hüvelyk)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 hüvelyk)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Vörösszem-effektus eszköz bezárása"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Minden vörösszem-effektus eltávolítása a kijelölt területről"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Visszaállítás"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Telítettség:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Árnyalat:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Hőmérséklet:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Árnyékok:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Kiemelések:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Színek visszaállítása"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Minden színmódosítás elvetése"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Hőmérséklet"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Árnyalat"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Telítettség"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Expozíció"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Árnyékok"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Kiemelések"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Kontraszt növelése"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Szög:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotó/videó"
+msgstr[1] "%d fotó/videó"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Nincs esemény"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Az egyes események megjegyzéseinek megjelenítése"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Nincsenek események"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nem találhatók események"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Események"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Keltezetlen"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Mappák"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Gyűjtemény"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importálás…"
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Importálás l_eállítása"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Fényképek importálásának leállítása"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Importálás előkészítése…"
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s importálva"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Utolsó importálás"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importálás mappából…"
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Fényképek importálása a gyűjteménybe lemezről"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importálás _alkalmazásból…"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Események rendezése"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "_Kuka ürítése"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Minden fénykép törlése a Kukában"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Fénykép _eseményének megjelenítése"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Keresés"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Fényképek és videók keresése keresőkifejezésekkel"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Új _mentett keresés…"
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "Fény_képek"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Események"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Alapvető információk"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Kijelöltek alapvető információinak megjelenítése"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_További információk"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Kijelöltek további információinak megjelenítése"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Keresősá_v"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "A keresősáv megjelenítése"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Oldalsáv"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Az oldalsáv megjelenítése"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importálás mappából"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Kuka ürítése"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Kuka ürítése…"
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"A Shotwell az importált fényképeket az Ön saját könyvtárába helyezi el.\n"
+"Javasoljuk, hogy ezt módosítsa a <span weight=\"bold\">%s beállításainak "
+"szerkesztése</span> alatt.\n"
+"Szeretné folytatni a fényképek importálását?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Gyűjtemény helye"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Ebből a könyvtárból nem importálhatók fényképek."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Gyűjtemény frissítése…"
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Felkészülés fényképek automatikus importáláshoz…"
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Fényképek automatikus importálása…"
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Metaadatok írása a fájlokba…"
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Hiányzó fájlok"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Törlés…"
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Kuka"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "A Kuka üres"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Törlés"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Fényképek törlése"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"A fényképgyűjteménye nem kompatibilis ezzel a Shotwell verzióval. Úgy tűnik, "
+"a Shotwell %s verzióval (%d. séma) készült, míg a jelenlegi verzió: %s (%d. "
+"séma). Próbálja meg a Shotwell legfrissebb verzióját használni."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"A Shotwell nem volt képes frissíteni az Ön fényképgyűjteményét %s verzióról "
+"(%d. séma) %s verzióra (%d. séma). További információkért nézze meg a "
+"Shotwell wikit itt: %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"A fényképgyűjteménye nem kompatibilis ezzel a Shotwell verzióval. Úgy tűnik, "
+"a Shotwell %s verzióval (%d. séma) készült, míg a jelenlegi verzió: %s (%d. "
+"séma). Ürítse ki a gyűjteményt a(z) %s törlésével, és importálja újra a "
+"fényképeit."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Ismeretlen hiba a Shotwell adatbázisának ellenőrzésekor: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "A Shotwell betöltése"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "A Shotwell privát adatainak útvonala"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KÖNYVTÁR"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Ne figyelje a változásokat a gyűjteménykönyvtárban futás közben"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Ne jelenítse meg az indítási folyamatjelzőt"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Az alkalmazás verziószámának megjelenítése"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FÁJL]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"A parancssori paraméterek teljes listája a „%s --help” paranccsal íratható "
+"ki.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Alacsony (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Közepes (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Magas (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximum (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Közzététel"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Előkészítés a feltöltéshez"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d/%d feltöltése"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "A közzététel egy hiba miatt nem folytatódhat erre: %s:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Próbálja másik szolgáltatáson közzétenni, válasszon egyet a fenti menüből."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "A kijelölt fényképek/videók sikeresen közzétéve."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "A kijelölt videók sikeresen közzétéve."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "A kijelölt fényképek sikeresen közzétéve."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "A kijelölt videó sikeresen közzétéve."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "A kijelölt fénykép sikeresen közzétéve."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Fiókinformációk letöltése…"
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Bejelentkezés…"
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Fényképek közzététele"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "_Fényképek közzététele ide:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Videók közzététele"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "_Videók közzététele ide:"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Fényképek és videók közzététele"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Fényképek és vi_deók közzététele ide:"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nem sikerült közzétenni"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"A Shotwell nem képes közzétenni a kijelölt elemeket, mert nincs engedélyezve "
+"a megfelelő közzétételi bővítmény. Ennek javításához válassza a(z) <b>%s "
+"beállításainak szerkesztése</b> menüpontot, és engedélyezze az egyik "
+"közzétételi bővítményt a <b>Bővítmények</b> lapon."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Mentett keresések"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "tartalmazza"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "pontosan ez"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ezzel kezdődik"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ezzel végződik"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "nem tartalmazza"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nincs beállítva"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "="
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nem"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "bármely fotó"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "nyers fotó"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "videó"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "van"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "nincs"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "változtatások"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "belső változtatások"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "külső változtatások"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "megjelölt"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "jelöletlen"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "és nagyobb"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "csak"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "és kisebb"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "után volt"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "előtte volt"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ezek közt"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "és"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "bármely"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "összes"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nincs"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Bármilyen szöveg"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Cím"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Címke"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Megjegyzés"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Eseménynév"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Fájlnév"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Adathordozó típusa"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Jelölő állapota"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Fénykép állapota"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dátum"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Új _címke…"
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Diavetítés átmenetei"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nincs)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nincs"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Véletlenszerű"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Címkék"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Beállítás asztali diavetítésként"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Asztalháttér-diavetítés készítése"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Minden fénykép megjelenítése"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "ennyi ideig"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Az egyes fényképek meddig jelenjenek meg asztalháttérként"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Keresés"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "Keresés _neve:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "Illes_zkedjen"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "a következőkkel:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Nyomtatott képméret</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "_Szabványos méret használata:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "_Egyéni méret használata:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "Fénykép _méretarányának megtartása"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Automatikus méret:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Címek</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Kép _címének nyomtatása"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Felbontás képpontban</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Kimenő fénykép:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "képpont hüvelykenként"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell beállítások"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "fehér"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "fekete"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "Új _fájlok figyelése a gyűjteménykönyvtárban"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metaadatok"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "_Címkék, címek és más metaadatok fényképfájlokba írása"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Megjelenítés"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "Fényképek i_mportálása ide:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Háttér:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importálás"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "_Könyvtárszerkezet:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Minta:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Példa:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "_Importált fájlok átnevezése kisbetűssé"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW előhívó"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Alapértelmezett:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Külső _fotószerkesztő:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Külső _RAW szerkesztő:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Külső szerkesztők"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Bővítmények"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Késleltetés:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Átmenet _effektus:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Átmenet _késleltetése:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "_Cím megjelenítése"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "másodperc"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "Bejele_ntkezés"
+
+#~ msgid ""
+#~ "You are logged into Tumblr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Bejelentkezett a Tumblr-re, mint (name).\n"
+#~ "\n"
+#~ "(ez a szöveg a kódon belül lesz feltöltve)"
+
+#~ msgid ""
+#~ " (text depends on fb username and is modified in the app - \n"
+#~ "anything put into this field won't display)"
+#~ msgstr ""
+#~ " (a szöveg a Facebook felhasználónévtől függ, és az alkalmazásban "
+#~ "módosításra kerül -\n"
+#~ "ebben a mezőben semmi nem jelenik meg)"
+
+#~ msgid ""
+#~ "You are logged into Flickr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Bejelentkezett a Flickr-re, mint (name).\n"
+#~ "\n"
+#~ "(ez a szöveg a kódon belül lesz feltöltve)"
+
+#~ msgid "_visibility label (populated in the code)"
+#~ msgstr "_visibility label (populated in the code)"
+
+#~ msgid ""
+#~ "'you are logged in as $name'\n"
+#~ "(populated in the application code)"
+#~ msgstr ""
+#~ "'you are logged in as $name'\n"
+#~ "(populated in the application code)"
+
+#~ msgid ""
+#~ "$mediatype will appear in\n"
+#~ "(populated in code)"
+#~ msgstr ""
+#~ "$mediatype will appear in\n"
+#~ "(populated in code)"
diff --git a/po/ia.po b/po/ia.po
new file mode 100644
index 0000000..ae83a48
--- /dev/null
+++ b/po/ia.po
@@ -0,0 +1,3883 @@
+# po/shotwell-core/ia.po
+# Interlingua Translation for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# This file is distributed under the GNU LGPL, version 2.1.
+#
+# Translators:
+# Emilio Sepúlveda <djfunkinmixer@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: Lucas Beeler <lucas@yorba.org>\n"
+"POT-Creation-Date: 2012-03-05 15:14-0800\n"
+"PO-Revision-Date: 2012-03-06 01:45+0000\n"
+"Last-Translator: laurakh <laura@yorba.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ia\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+# Translator credits string for the about box -- translators, add your name
+# below if it's not already present
+#: src/AppWindow.vala:665 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Emilio Sepúlveda <djfunkinmixer@gmail.com>"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1225
+msgid "Original size"
+msgstr ""
+
+# GNOME Application Name
+msgid "Shotwell Photo Manager"
+msgstr ""
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr ""
+
+# GNOME Application Comment
+msgid "Organize your photos"
+msgstr ""
+
+# GNOME Application Name for Direct Edit Mode
+msgid "Shotwell Photo Viewer"
+msgstr ""
+
+# GNOME Application Class for Direct Edit Mode
+#: src/Resources.vala:16
+msgid "Photo Viewer"
+msgstr ""
+
+# GNOME Application Class ("Generic Name")
+#: src/Resources.vala:15
+msgid "Photo Manager"
+msgstr "Administrator de photos"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr ""
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr ""
+
+# The string %a %b %d is a format string that describes the abbreviated
+# weekday (%a), abbreviated month (%b) and day of each month as a decimal from
+# (d%). See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/util/misc.vala:231 src/util/misc.vala:236
+msgid "%a %b %d"
+msgstr ""
+
+# The string %d, %Y is a format string that describes the day of each month as
+# a decimal from (d%) and the year as a decimal (%Y) including the century.
+# See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/util/misc.vala:232
+msgid "%d, %Y"
+msgstr ""
+
+# The string %a %b %d, %Y is a format string that describes the abbreviated
+# weekday (%a), abbreviated month (%b), day of each month as a decimal from
+# (d%) and the year as a decimal including the century (%Y). See the strftime
+# manpage for
+# a list of format specifiers and their meanings.
+#: src/util/misc.vala:237 src/util/misc.vala:242 src/util/misc.vala:243
+#: src/util/misc.vala:251
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr ""
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:299
+msgid "Printed Image Size"
+msgstr ""
+
+#: src/Printing.vala:311
+msgid "Use a _standard size:"
+msgstr ""
+
+#: src/Printing.vala:315
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: src/Printing.vala:319
+msgid "_Autosize:"
+msgstr ""
+
+#: src/Printing.vala:388
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:389
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:405
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: src/Printing.vala:411
+msgid "Titles"
+msgstr ""
+
+#: src/Printing.vala:418
+msgid "Print image _title"
+msgstr ""
+
+#: src/Printing.vala:430
+msgid "Pixel Resolution"
+msgstr ""
+
+#: src/Printing.vala:436
+msgid "_Output photo at:"
+msgstr ""
+
+#: src/Printing.vala:451
+msgid "pixels per inch"
+msgstr ""
+
+#: src/Printing.vala:922 src/editing_tools/EditingTools.vala:729
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:925 src/editing_tools/EditingTools.vala:730
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:928 src/editing_tools/EditingTools.vala:731
+msgid "4 x 6 in."
+msgstr ""
+
+#: src/Printing.vala:931 src/editing_tools/EditingTools.vala:732
+msgid "5 x 7 in."
+msgstr ""
+
+#: src/Printing.vala:934 src/editing_tools/EditingTools.vala:733
+msgid "8 x 10 in."
+msgstr ""
+
+#: src/Printing.vala:937 src/editing_tools/EditingTools.vala:734
+msgid "11 x 14 in."
+msgstr ""
+
+#: src/Printing.vala:940 src/editing_tools/EditingTools.vala:735
+msgid "16 x 20 in."
+msgstr ""
+
+#: src/Printing.vala:946 src/editing_tools/EditingTools.vala:737
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:949 src/editing_tools/EditingTools.vala:738
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:952 src/editing_tools/EditingTools.vala:739
+msgid "13 x 18 cm"
+msgstr ""
+
+#: src/Printing.vala:955 src/editing_tools/EditingTools.vala:740
+msgid "18 x 24 cm"
+msgstr ""
+
+#: src/Printing.vala:958 src/editing_tools/EditingTools.vala:741
+msgid "20 x 30 cm"
+msgstr ""
+
+#: src/Printing.vala:961 src/editing_tools/EditingTools.vala:742
+msgid "24 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:964 src/editing_tools/EditingTools.vala:743
+msgid "30 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:980
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:993
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:1013 src/Printing.vala:1216
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/MediaPage.vala:141
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:273 src/camera/ImportPage.vala:841
+#: src/PhotoPage.vala:2316 src/events/EventsDirectoryPage.vala:106
+#: src/library/OfflinePage.vala:59 src/library/ImportQueuePage.vala:65
+#: src/library/TrashPage.vala:54 src/direct/DirectPhotoPage.vala:48
+msgid "_File"
+msgstr ""
+
+#: src/MediaPage.vala:287 src/camera/ImportPage.vala:857
+#: src/PhotoPage.vala:2336 src/events/EventsDirectoryPage.vala:118
+#: src/library/OfflinePage.vala:63 src/library/TrashPage.vala:58
+msgid "_Edit"
+msgstr ""
+
+#: src/MediaPage.vala:301
+msgid "_Photos"
+msgstr ""
+
+#: src/MediaPage.vala:305 src/events/EventsDirectoryPage.vala:122
+msgid "Even_ts"
+msgstr ""
+
+#: src/MediaPage.vala:309 src/MediaPage.vala:455 src/PhotoPage.vala:2549
+msgid "Ta_gs"
+msgstr ""
+
+#: src/MediaPage.vala:329 src/PhotoPage.vala:2520
+#: src/direct/DirectPhotoPage.vala:176
+msgid "Zoom _In"
+msgstr ""
+
+#: src/MediaPage.vala:330
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:335 src/PhotoPage.vala:2526
+#: src/direct/DirectPhotoPage.vala:182
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/MediaPage.vala:336
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:398 src/camera/ImportPage.vala:861
+#: src/PhotoPage.vala:2350 src/events/EventsDirectoryPage.vala:110
+#: src/library/OfflinePage.vala:73 src/library/ImportQueuePage.vala:75
+#: src/library/TrashPage.vala:74 src/direct/DirectPhotoPage.vala:167
+msgid "_View"
+msgstr ""
+
+#: src/MediaPage.vala:402
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:410 src/camera/ImportPage.vala:865
+#: src/PhotoPage.vala:2515 src/events/EventsDirectoryPage.vala:114
+#: src/library/OfflinePage.vala:77 src/library/ImportQueuePage.vala:79
+#: src/library/TrashPage.vala:78 src/direct/DirectPhotoPage.vala:171
+msgid "_Help"
+msgstr ""
+
+#: src/MediaPage.vala:415
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:416
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:420 src/PhotoPage.vala:2569
+msgid "_Developer"
+msgstr ""
+
+#: src/MediaPage.vala:427 src/photos/RawSupport.vala:298
+msgid "Shotwell"
+msgstr ""
+
+#: src/MediaPage.vala:432 src/camera/ImportPage.vala:676
+#: src/camera/ImportPage.vala:692 src/camera/Branch.vala:101
+#: src/photos/RawSupport.vala:301
+msgid "Camera"
+msgstr ""
+
+#: src/MediaPage.vala:443 src/camera/ImportPage.vala:830
+msgid "_Titles"
+msgstr ""
+
+#: src/MediaPage.vala:444 src/camera/ImportPage.vala:831
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:456
+msgid "Display each photo's tags"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:473
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:479
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:485
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:495 src/library/LibraryWindow.vala:470
+msgid "_Ascending"
+msgstr ""
+
+#: src/MediaPage.vala:496 src/library/LibraryWindow.vala:471
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/MediaPage.vala:501 src/library/LibraryWindow.vala:477
+msgid "D_escending"
+msgstr ""
+
+#: src/MediaPage.vala:502 src/library/LibraryWindow.vala:478
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/MediaPage.vala:713
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:308 src/Properties.vala:193
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:433
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:734
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:735
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:803
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:846
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:847
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:852
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:853
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:978
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:984
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:989
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:994
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1004
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1009
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1026
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1132
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1437
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1554
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1640
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1643
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1646
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1654 src/Dialogs.vala:1006
+msgid "_Keep"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1673
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1677
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural ""
+"Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr ""
+
+#: src/PhotoPage.vala:536
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:541
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1807
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2354 src/direct/DirectPhotoPage.vala:79
+msgid "_Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2358 src/direct/DirectPhotoPage.vala:83
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2363 src/direct/DirectPhotoPage.vala:88
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2364 src/direct/DirectPhotoPage.vala:89
+msgid "Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2369 src/direct/DirectPhotoPage.vala:94
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2370 src/direct/DirectPhotoPage.vala:95
+msgid "Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2521 src/direct/DirectPhotoPage.vala:177
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2527 src/direct/DirectPhotoPage.vala:183
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2532 src/direct/DirectPhotoPage.vala:188
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2533 src/direct/DirectPhotoPage.vala:189
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2538 src/direct/DirectPhotoPage.vala:194
+#, no-c-format
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2539 src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2544 src/direct/DirectPhotoPage.vala:200
+#, no-c-format
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2545 src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2564 src/CollectionPage.vala:207
+msgid "S_lideshow"
+msgstr ""
+
+#: src/PhotoPage.vala:2565 src/CollectionPage.vala:208
+msgid "Play a slideshow"
+msgstr ""
+
+#: src/PhotoPage.vala:2997 src/Dialogs.vala:2264
+msgid "Remove From Library"
+msgstr ""
+
+#: src/PhotoPage.vala:2997 src/Dialogs.vala:2265
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/PhotoPage.vala:3118 src/CollectionPage.vala:430 src/Dialogs.vala:57
+msgid "Export Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:3138
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/Commands.vala:670
+msgid "Reverting"
+msgstr ""
+
+#: src/Commands.vala:670
+msgid "Undoing Revert"
+msgstr ""
+
+#: src/Commands.vala:714
+msgid "Enhancing"
+msgstr ""
+
+#: src/Commands.vala:714
+msgid "Undoing Enhance"
+msgstr ""
+
+#: src/Commands.vala:897
+msgid "Creating New Event"
+msgstr ""
+
+#: src/Commands.vala:898
+msgid "Removing Event"
+msgstr ""
+
+#: src/Commands.vala:907
+msgid "Moving Photos to New Event"
+msgstr ""
+
+#: src/Commands.vala:908
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:938
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:939
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:948
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:948
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:971
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1058
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1068 src/Commands.vala:1069
+msgid "Increasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1068 src/Commands.vala:1069
+msgid "Decreasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1119
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1119
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1120
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1195
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1215
+msgid "Adjusting Date and Time"
+msgstr ""
+
+#: src/Commands.vala:1215
+msgid "Undoing Date and Time Adjustment"
+msgstr ""
+
+#: src/Commands.vala:1242
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1244 src/Commands.vala:1256
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1254
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1459 src/Commands.vala:1482
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1517
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2147
+msgid "Move Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2147
+msgid "Restore Photos from Trash"
+msgstr ""
+
+#: src/Commands.vala:2148
+msgid "Move the photos to the Shotwell trash"
+msgstr ""
+
+#: src/Commands.vala:2148
+msgid "Restore the photos back to the Shotwell library"
+msgstr ""
+
+#: src/Commands.vala:2167
+msgid "Moving Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2167
+msgid "Restoring Photos From Trash"
+msgstr ""
+
+#: src/Commands.vala:2256
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2256
+msgid "Unflag"
+msgstr ""
+
+#: src/Commands.vala:2257
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2257
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/Photo.vala:3440
+msgid "modified"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:15
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:96
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:285
+msgid "None"
+msgstr ""
+
+#: src/SearchFilter.vala:648 src/SearchFilter.vala:649
+#: src/SearchFilter.vala:1031 src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr ""
+
+#: src/SearchFilter.vala:654 src/SearchFilter.vala:655
+msgid "Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:660 src/SearchFilter.vala:661
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:666
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:667
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:993
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:1010
+msgid "Type"
+msgstr ""
+
+#: src/SearchFilter.vala:1044 src/searches/SearchBoolean.vala:180
+msgid "Rating"
+msgstr ""
+
+#: src/SlideshowPage.vala:41 src/SlideshowPage.vala:221
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:43
+msgid "_Delay:"
+msgstr ""
+
+#: src/SlideshowPage.vala:45 src/SlideshowPage.vala:47
+msgid "seconds"
+msgstr ""
+
+#: src/SlideshowPage.vala:63
+msgid "_Transition effect:"
+msgstr ""
+
+#: src/SlideshowPage.vala:90
+msgid "Transition d_elay:"
+msgstr ""
+
+#: src/SlideshowPage.vala:187
+msgid "Slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:200
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:201
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:207 src/SlideshowPage.vala:312
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:208 src/SlideshowPage.vala:313
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:214
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:215
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:222
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:276
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:308
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:309
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:70
+#: plugins/shotwell-publishing/PicasaPublishing.vala:909
+#: plugins/shotwell-publishing/YouTubePublishing.vala:840
+msgid "_Login"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:135
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:137
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:139
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:142
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:144
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:152
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:158
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:211
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:212
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:214
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:215
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:217
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:218
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:382
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugin</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:474
+#: src/data_imports/DataImportsUI.vala:391
+msgid "_Close"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:479 src/AppWindow.vala:614
+#: src/AppWindow.vala:632 src/AppWindow.vala:649 src/Dialogs.vala:20
+#: src/Dialogs.vala:28 src/Dialogs.vala:41 src/Dialogs.vala:1039
+#: src/Dialogs.vala:1062 src/data_imports/DataImportsUI.vala:396
+msgid "_Cancel"
+msgstr "_Cancellar"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:74
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventDirectoryItem.vala:76 src/Properties.vala:321
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventDirectoryItem.vala:78 src/Properties.vala:319
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventPage.vala:86
+msgid "No Event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:154
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:158
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:205
+msgid "Events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:219
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:220
+msgid "%Y"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:221
+msgid "%B"
+msgstr ""
+
+#: src/VideoSupport.vala:440
+msgid "Export Videos"
+msgstr ""
+
+#: src/main.vala:84
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:89
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:95
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:101
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:138
+msgid "Loading Shotwell"
+msgstr ""
+
+#: src/main.vala:376
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:380
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/AppWindow.vala:62
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:63
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:66 src/AppWindow.vala:144
+msgid "Leave fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:143
+msgid "Leave _Fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:496
+msgid "_Quit"
+msgstr "_Quitar"
+
+#: src/AppWindow.vala:501
+msgid "_About"
+msgstr "Circ_a"
+
+#: src/AppWindow.vala:506
+msgid "Fulls_creen"
+msgstr "S_chermo plen"
+
+#: src/AppWindow.vala:511
+msgid "_Contents"
+msgstr "_Contentos"
+
+#: src/AppWindow.vala:516
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:659
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot continue.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/AppWindow.vala:679 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr ""
+
+#: src/AppWindow.vala:691
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Non pote monstrar adjuta: %s"
+
+#: src/AppWindow.vala:699
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Properties.vala:38
+msgid "%I:%M %p"
+msgstr ""
+
+#: src/Properties.vala:50
+msgid "Today"
+msgstr ""
+
+#: src/Properties.vala:52
+msgid "Yesterday"
+msgstr ""
+
+#: src/Properties.vala:306 src/Dialogs.vala:966
+msgid "Title:"
+msgstr ""
+
+#: src/Properties.vala:309
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:312
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:343
+msgid "Date:"
+msgstr ""
+
+#: src/Properties.vala:347
+msgid "Time:"
+msgstr ""
+
+#: src/Properties.vala:350 src/Properties.vala:355
+msgid "From:"
+msgstr ""
+
+#: src/Properties.vala:351 src/Properties.vala:356
+msgid "To:"
+msgstr ""
+
+#: src/Properties.vala:361 src/editing_tools/EditingTools.vala:2461
+msgid "Size:"
+msgstr ""
+
+#: src/Properties.vala:370
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:370
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:374
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:402 src/Properties.vala:406 src/Properties.vala:413
+#: src/editing_tools/EditingTools.vala:2819
+msgid "Exposure:"
+msgstr ""
+
+#: src/Properties.vala:500
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:502
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:505
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:508
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:511
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:514
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:516
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:519
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:521
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:524
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:527
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:529
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:531
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:540
+msgid "Extended Information"
+msgstr ""
+
+#: src/Tag.vala:790
+msgid "untitled"
+msgstr ""
+
+#: src/Event.vala:712
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/faces/FacePage.vala:49
+msgid "F_aces"
+msgstr ""
+
+#: src/faces/Branch.vala:90 src/Resources.vala:280 src/Resources.vala:281
+msgid "Faces"
+msgstr ""
+
+#: src/CollectionPage.vala:428
+msgid "Export Photo/Video"
+msgstr ""
+
+#: src/CollectionPage.vala:428
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:430 src/Dialogs.vala:86
+msgid "Export Photos"
+msgstr ""
+
+#: src/CollectionPage.vala:517 src/CollectionPage.vala:533
+msgid "Rotating"
+msgstr ""
+
+#: src/CollectionPage.vala:517 src/CollectionPage.vala:533
+msgid "Undoing Rotate"
+msgstr ""
+
+#: src/CollectionPage.vala:542
+msgid "Flipping Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:543
+msgid "Undoing Flip Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:552
+msgid "Flipping Vertically"
+msgstr ""
+
+#: src/CollectionPage.vala:553
+msgid "Undoing Flip Vertically"
+msgstr ""
+
+#: src/BatchImport.vala:25
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:28
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:31
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:34
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:37
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:40
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:43
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:46
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:49
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:52
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:55
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:58
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:61
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:64
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:41
+#: src/Dialogs.vala:1007 src/Resources.vala:285 src/Resources.vala:313
+#: src/Resources.vala:361 src/Resources.vala:655
+msgid "_Delete"
+msgstr ""
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:37
+#, c-format
+msgid "This will remove the face \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the face \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:57
+msgid "Export Video"
+msgstr ""
+
+#: src/Dialogs.vala:114
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:123
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+
+#: src/Dialogs.vala:129
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+
+#: src/Dialogs.vala:130 plugins/shotwell-publishing/FlickrPublishing.vala:703
+msgid "Con_tinue"
+msgstr ""
+
+#: src/Dialogs.vala:146
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:147
+msgid "Current"
+msgstr ""
+
+#: src/Dialogs.vala:211
+msgid "_Format:"
+msgstr ""
+
+#: src/Dialogs.vala:214
+msgid "_Quality:"
+msgstr ""
+
+#: src/Dialogs.vala:217
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:220
+msgid " _pixels"
+msgstr ""
+
+#: src/Dialogs.vala:228
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:471
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:527
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:530
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:533
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:547
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:550
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:556
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:570
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:573
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:576
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:579
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:593
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:596
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:599
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:602
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:619
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:634
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:645
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:648
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:651
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:654
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:668
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:671
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:674
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:690
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:705
+msgid "Import Complete"
+msgstr ""
+
+#: src/Dialogs.vala:867
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:870
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:874
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:877
+msgid "1 day"
+msgstr ""
+
+#: src/Dialogs.vala:956 src/Resources.vala:187
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:956
+msgid "Name:"
+msgstr ""
+
+#: src/Dialogs.vala:966 src/Resources.vala:255
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:982
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:986
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1029
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1029
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1031
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1035
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1035
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1056
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1063
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1064
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1064
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1158
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: src/Dialogs.vala:1302
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1303
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1319
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1324
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1330
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1330
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1413
+msgid "Original: "
+msgstr ""
+
+# The string %m/%d/%y, %H:%M:%S is a format string that describes a U.S.-style
+# 24 hour date and time (e.g. 9/22/2009, 13:15:04). You should translate
+# %m/%d/%y, %H:%M:%S so that it describes the 24 hour date and time format
+# used in your language and region. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Dialogs.vala:1414
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr ""
+
+# The string %m/%d/%y, %I:%M:%S %p is a format string that describes a
+# U.S.-style
+# 12 hour date and time with an am/pm specifier (e.g. 9/22/2009, 1:15:04 PM).
+# You
+# should translate %m/%d/%y, %I:%M:%S %p so that it describes the 12 hour date
+# and time format used in your language and region. If 12 hour time isn't used
+# in
+# your region, then use a format string for 24 hour time. The format string
+# you
+# enter should conform to POSIX date and time formatting conventions. See the
+# strftime manpage for a list of format specifiers and their meanings.
+#: src/Dialogs.vala:1415
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr ""
+
+#: src/Dialogs.vala:1504
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1505
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1507
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1508
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1509
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1510
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1554
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1576 src/Dialogs.vala:1603
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:1682
+msgid "Welcome!"
+msgstr ""
+
+#: src/Dialogs.vala:1689
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr ""
+
+#: src/Dialogs.vala:1693
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:1709
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:1710
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:1711
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:1721
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:1728
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:1738
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:1773
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:1891 src/Dialogs.vala:1895
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:1904
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:1906
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:1908
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:1910
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:1911 src/editing_tools/EditingTools.vala:745
+msgid "Custom"
+msgstr ""
+
+#: src/Dialogs.vala:2144
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2247
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2252
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2253
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2254
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2279
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2283
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2287
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2319
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2336
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/library/LibraryWindow.vala:389
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:390
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:401
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:411
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:412
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:417
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:423
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:434 src/searches/Branch.vala:77
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Search..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:445
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:446
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:451
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:452
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:457
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:458
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:720
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:789
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:789
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:932
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:935 src/data_imports/DataImportsUI.vala:112
+msgid "_Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:935
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:948
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1277
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1321 src/library/LibraryWindow.vala:1329
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1334
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1339
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1344
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:122
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:70
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:71
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:135
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:162
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:124
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:128
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:129
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/photos/TiffSupport.vala:87
+msgid "TIFF"
+msgstr ""
+
+#: src/photos/PngSupport.vala:31
+msgid "PNG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:85
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:183
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:186
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:189
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:192
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/RawSupport.vala:135
+msgid "RAW"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:33
+msgid "BMP"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:167
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:168
+#: src/searches/SavedSearchDialog.vala:433
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+#: src/searches/SavedSearchDialog.vala:437
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:243
+#: src/searches/SavedSearchDialog.vala:312
+#: src/searches/SavedSearchDialog.vala:377
+msgid "is"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:244
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:250
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:251
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:306
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:307
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:372
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:449
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:656
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:657
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:658
+msgid "none"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:156
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:159
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:162
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:165
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:168
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:171
+msgid "Face"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:174
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:177
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:183
+msgid "Date"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: src/AppDirs.vala:48
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:84
+msgid "Pictures"
+msgstr "Imagines"
+
+#: src/AppDirs.vala:124
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:140
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr ""
+
+#: src/Resources.vala:18 plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/YouTubePublishing.vala:32
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:134
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:135 src/Resources.vala:140
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:136
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:137
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:139
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:141
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:142
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:145
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:148
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:150
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:156
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:159
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:163
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:167
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:171
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:176
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:183
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:190
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:193
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:203
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:205
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:206
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:209
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:212
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:215
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:219
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:223
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:228 src/Resources.vala:229
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:232 src/Resources.vala:233
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:235
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:248
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:251
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:252
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:260
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:261 src/Resources.vala:301
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:272
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:275
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "Mark faces of people in the photo"
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Modify Faces"
+msgstr ""
+
+#: src/Resources.vala:284
+msgid "Delete Face"
+msgstr ""
+
+#: src/Resources.vala:286 src/Resources.vala:325
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:290
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:295
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:297
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:305
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:309
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:312
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:315
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:318
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:327
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:328
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:331
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:331
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:336
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:340
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:341
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:345
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:346
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:350
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:354
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:357
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:359
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:362
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:363
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:366
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:370
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:374
+#, c-format
+msgid "Unable to rename face to \"%s\" because the face already exists."
+msgstr ""
+
+#: src/Resources.vala:378
+#, c-format
+msgid "Remove Face \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:379
+#, c-format
+msgid "Remove Face \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Remove Face \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:384
+#, c-format
+msgid "Remove Face \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:388
+#, c-format
+msgid "Re_name Face \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:392
+#, c-format
+msgid "Rename Face \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:396
+#, c-format
+msgid "_Delete Face \"%s\""
+msgstr ""
+
+#: src/Resources.vala:400
+#, c-format
+msgid "Delete Face \"%s\""
+msgstr ""
+
+#: src/Resources.vala:557
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:558
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:559
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:561
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:562
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:563
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:564
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:565
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:656
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:660
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:663
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:666
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:669
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:671
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:673
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:674
+msgid "Select all items"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:885
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:53 src/direct/DirectPhotoPage.vala:400
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:54
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:59
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:60
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:71
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:75
+msgid "Edit"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:400
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:403
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:404
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:437
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:465 src/direct/DirectPhotoPage.vala:486
+msgid "Save As"
+msgstr ""
+
+#: src/tags/Branch.vala:133
+msgid "Tags"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:635
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:638
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:650
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:721
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:722
+msgid "Square"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:723
+msgid "Screen"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:724
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1215
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:725
+#: src/editing_tools/EditingTools.vala:728
+#: src/editing_tools/EditingTools.vala:736
+#: src/editing_tools/EditingTools.vala:744
+msgid "-"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:726
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:727
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1900
+msgid "Close the Faces tool without saving changes"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1903
+msgid "Save changes and close the Faces tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1908
+#: src/editing_tools/EditingTools.vala:1933
+msgid "Click and drag to tag a face"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1928
+#, c-format
+msgid "Click to edit face <i>%s</i>"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1937
+msgid "Stop dragging to add your face and name it."
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1941
+msgid "Type a name for this face, then press Enter"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1945
+msgid "Move or modify the face shape or name and press Enter"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2476
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2479
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2808
+#: src/editing_tools/StraightenTool.vala:29
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2826
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2833
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2841
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2848
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2901
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2901
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3245
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3258
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3271
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3284
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3297
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:3307
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:26
+msgid "Angle:"
+msgstr ""
+
+#: src/Page.vala:1254
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1258
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2544
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr ""
+
+#: src/Exporter.vala:316
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr ""
+
+#: src/Exporter.vala:318
+msgid "_Skip"
+msgstr ""
+
+#: src/Exporter.vala:318
+msgid "_Replace"
+msgstr ""
+
+#: src/Exporter.vala:318
+msgid "Replace _All"
+msgstr ""
+
+#: src/Exporter.vala:318
+msgid "Export"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have at least one data imports plugin enabled. Plugins can be enabled in the Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de datos %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:427
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1255
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:25
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:367
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:437
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:684
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:690
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1107
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1109
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1111
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1124
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1126
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1129
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1132
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1635
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1134
+#: plugins/shotwell-publishing/YouTubePublishing.vala:1000
+msgid "_Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1166
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1633
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1141
+#: plugins/shotwell-publishing/YouTubePublishing.vala:1007
+msgid "_Publish"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1197
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1789
+msgid "Everyone"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1198
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1199
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1786
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1221
+msgid "500 x 375 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1222
+msgid "1024 x 768 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1223
+msgid "2048 x 1536 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1224
+msgid "4096 x 3072 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:68
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the login process. During login, Shotwell Connect may ask you for permission to upload photos and publish to your feed. These permissions are required for Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:70
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:134
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:137
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:260
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:452
+#: plugins/shotwell-publishing/PicasaPublishing.vala:512
+msgid "Creating album..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1537
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1538
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1539
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1599
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1602
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1618
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1787
+msgid "All friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1788
+msgid "Friends of friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use with Picasa to continue. You can set up most accounts by using your browser to log into the Picasa Web Albums site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:826
+msgid ""
+"Enter the email address and password associated with your Picasa Web Albums "
+"account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:827
+msgid ""
+"Picasa Web Albums didn't recognize the email address and password you "
+"entered. To try again, re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:828
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that isn't set up for use with Picasa Web Albums. You can set up most "
+"accounts by using your browser to log into the Picasa Web Albums site at "
+"least once. To try again, re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:829
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that has been tagged as requiring additional security. You can clear this "
+"tag by using your browser to log into Picasa Web Albums. To try again, re-"
+"enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:864
+#: plugins/shotwell-publishing/YouTubePublishing.vala:795
+#, c-format
+msgid "Unrecognized User"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:868
+#: plugins/shotwell-publishing/YouTubePublishing.vala:799
+#, c-format
+msgid "Account Not Ready"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:874
+#: plugins/shotwell-publishing/YouTubePublishing.vala:805
+#, c-format
+msgid "Additional Security Required"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:882
+#: plugins/shotwell-publishing/YouTubePublishing.vala:813
+msgid "_Email address:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:884
+#: plugins/shotwell-publishing/YouTubePublishing.vala:815
+msgid "_Password:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:904
+#: plugins/shotwell-publishing/YouTubePublishing.vala:835
+msgid "Go _Back"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1035
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1051
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1053
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1064
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1078
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1090
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1105
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1212
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1213
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1214
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use with YouTube to continue. You can set up most accounts by using your browser to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:758
+msgid ""
+"Enter the email address and password associated with your YouTube account."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:759
+msgid ""
+"YouTube didn't recognize the email address and password you entered. To try "
+"again, re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:760
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that isn't set up for use with YouTube. You can set up most accounts by "
+"using your browser to log into the YouTube site at least once. To try again,"
+" re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:761
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that has been tagged as requiring additional security. You can clear this "
+"tag by using your browser to log into YouTube. To try again, re-enter your "
+"email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:956
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:961
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:975
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:1043
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:1044
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:1045
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:21
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:68
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:29
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:39
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:58
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/shotwell.glade:9
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:48
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:111
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:140
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:269
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:346
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:373
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:421
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:450
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:470
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:496
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:517
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:540
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:563
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:586
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:626
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:709
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:726
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:755
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:790
+msgid "_Default:"
+msgstr ""
+
+#: ui/shotwell.glade:843
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:859
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:923
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:950
+msgid "Plugins"
+msgstr ""
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..ccb5d4f
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,4591 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Mohammad Anwari <mdamt@di.blankon.in>, 2010
+# verayin <vera@yorba.org>, 2011
+# <bu0ncu3@yahoo.com>, 2012
+# elementary Indonesia <elementaryindo@gmail.com>, 2012
+# <kokabiel9@gmail.com>, 2012
+# Malsasa <teknoloid@gmail.com>, 2012
+# Mohamad Hasan Al Banna, 2013
+# Rahman Yusri Aftian <aftian@yahoo.com>, 2012, 2013
+# Andika Triwidada <andika@gmail.com>, 2011, 2014
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-02-05 00:58+0000\n"
+"PO-Revision-Date: 2014-02-07 13:15+0700\n"
+"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
+"Language-Team: Indonesian <gnome@i15n.org>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.6.3\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Berkas sementara yang diperlukan untuk penerbitan tidak tersedia"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Anda telah log masuk dan log keluar dari suatu layanan Google selama sesi "
+"Shotwell ini.\n"
+"\n"
+"Untuk melanjutkan penerbitan ke layanan Google, keluar dan jalankan lagi "
+"Shotwell, lalu cobalah mempublikasikan lagi."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Kunjungi situs Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Mohammad Anwari <mdamt@di.blankon.in>, 2010\n"
+"verayin <vera@yorba.org>, 2011\n"
+" <bu0ncu3@yahoo.com>, 2012\n"
+"elementary Indonesia <elementaryindo@gmail.com>, 2012\n"
+" <kokabiel9@gmail.com>, 2012\n"
+"Malsasa <teknoloid@gmail.com>, 2012\n"
+"Mohamad Hasan Al Banna, 2013\n"
+"Rahman Yusri Aftian <aftian@yahoo.com>, 2012, 2013\n"
+"Andika Triwidada <andika@gmail.com>, 2011, 2014"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+#| msgid "Copyright 2009-2013 Yorba Foundation"
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Hak Cipta 2009-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Selamat datang ke layanan impor pustaka F-Spot.\n"
+"\n"
+"Harap pilih pustaka yang akan diimpor, bisa dengan memilih pustaka yang "
+"ditemukan oleh Shotwell atau dengan memilih berkas basis data F-Spot "
+"alternatif."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Selamat datang di perpustakaan layanan impor F-Spot.\n"
+"\n"
+"Silahkan pilih berkas basis data F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Pilih manual basis data F-Spot untuk di impor:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Tidak dapat membuka berkas basis data F-Spot terpilih: berkas tidak ada atau "
+"bukan basis data F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Tidak dapat membuka berkas basis data F-Spot terpilih: versi basis data F-"
+"Spot ini tidak didukung oleh Shotwell"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Tidak dapat membaca berkas basis data F-Spot terpilih: kesalahan saat "
+"membaca tabel tag"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Tidak dapat membaca berkas basis data F-Spot terpilih: kesalahan saat "
+"membaca tabel foto"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell menemukan %d foto pada daftar F-Spot dan sedang mengimpornya. Foto "
+"yang sama akan otomatis terdeteksi dan dihapus.\n"
+"\n"
+"Anda dapat menutup dialog ini dan mulai menggunakan Shotwell saat proses "
+"impor berlangsung di belakang."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Pustaka F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Bersiap mengimpor"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Servis Impor Data Inti"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Hak Cipta 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 piksel"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 piksel"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 piksel"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' permintaan otentikasi OAuth ke yang tidak valid"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start(): tidak dapat memulai, penerbit ini tidak "
+"restartable."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Masukkan nama pengguna dan kata sandi yang berhubungan dengan akun Tumblr "
+"anda."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "Nama pengguna dan/atau kata sandi tak valid. Harap coba lagi"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Nama Pengguna atau Kata Sandi Tak Valid"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Tidak dapat membuka UI: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Anda belum masuk ke Tumblr sebagai %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Hak Cipta 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Kunjungi situs Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Anda belum masuk ke Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Layanan Penerbit Ekstra Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "label"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_Alamat Email"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Kata Sandi"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Masuk"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blog:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Ukuran _foto:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Keluar"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Terbitkan"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Album (atau tulis baru):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "Jenis _akses:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Nonaktifkan _komentar"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Dilarang mengunduh foto asli"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Publik"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Teman"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Kiriman dari Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Anda belum terhubung ke Facebook.\n"
+"\n"
+"Jika belum memiliki akun Facebook, Anda dapat membuatnya nanti saat login. "
+"Saat login, Shotwell akan menanyakan hak unggah dan hak penerbitan berita. "
+"Hak-hak tersebut diperlukan oleh Shotwell."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Selama menggunakan Shotwell tadi, Anda sudah keluar dan masuk dari "
+"Facebook.\n"
+"Untuk dapat mengirim foto ke Facebook, silakan keluar dan jalankan Shotwell "
+"kembali, kemudian ulangi proses pengiriman."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standar (720 piksel)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Besar (2048 piksel)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Mencoba koneksi ke Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Membuat album..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Berkas penting untuk penerbitan tidak tersedia. Gagal menerbitkan ke "
+"Facebook."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Anda terhubung ke Facebook sebagai %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kirim foto ke mana?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "U_kuran unggah"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Saya sendiri saja"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Semua orang"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Anda masih belum masuk ke Flickr.\n"
+"\n"
+"Klik Masuk untuk masuk ke Flickr pada peramban Web anda. Anda diharuskan "
+"memberikan izin Shotwell menyambungkan ke akun Flickr anda."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Saat menggunakan Shotwell tadi, Anda sudah keluar dan masuk dari Flickr.\n"
+"Untuk dapat mengirim foto ke Facebook, silakan keluar dan jalankan Shotwell "
+"kembali, kemudian ulangi proses pengiriman."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Bersiap untuk login..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Berkas penting untuk penerbitan tidak tersedia. Gagal menerbitkan ke Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verifikasi wewenang..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Anda sudah login ke Flickr atas nama %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Akun Flickr gratisan Anda membatasi besarnya data yang dapat Anda kirim "
+"dalam waktu sebulan.\n"
+"Untuk bulan ini, Anda punya jatah sekitar %d megabyte."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Anda memiliki akun Flickr Pro yang tidak memiliki batas pengiriman."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Foto ini dapat _dilihat oleh:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Video ini dapat _dilihat oleh:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Foto dan video ini dapat _dilihat oleh:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Teman dan keluarga saja"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Hanya keluarga"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Hanya teman"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 piksel"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 piksel"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Ukuran asal"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Kamu belum masuk ke Album Web Picasa.\n"
+"\n"
+"Klik Login untuk masuk ke Album Web Picasa lewat Peramban Web. Kamu perlu "
+"memberi wewenang Shotwell Connect menyambung ke akun Album Web Picasa mu."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Berkas penting untuk penerbitan tidak tersedia. Gagal menerbitkan ke Picasa."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Anda sudah masuk ke Album Web Picasa atas nama %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video akan muncul di:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Foto akan muncul di:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Kecil (640 x 480 piksel)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Sedang (1024 x 768 piksel)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Ideal (1600 x 1200 piksel)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixel)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Ukuran Asli"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Membuat akbum %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Terjadi pesan kesalahan ketika mempublikasikan ke Piwigo. Harap coba lagi."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Masukkan URL pustaka foto Piwigo mu beserta username dan password akun "
+"Piwigo untuk pustaka tersebut."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell tidak bisa menghubungi pustaka foto Piwigo. Harap periksa kembali "
+"URL yang kamu masukkan"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "URL tidak sah"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Admin, Keluarga, Teman, Kontak"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Admin, Keluarga, Teman"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Admin, Keluarga"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Admin"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Anda tidak terhubung ke YouTube.\n"
+"\n"
+"Anda harus memiliki akun Google/YouTube untuk melanjutkan."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Berkas penting untuk penerbitan tidak tersedia. Gagal menerbitkan ke Youtube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Anda terhubung ke YouTube sebagai %s"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Video akan tampil dalam '%s'"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Publik terdaftar"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Publik tak terdaftar"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Terbitkan ke album yang _sudah ada:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Buat album baru dengan _nama:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "_Video dan album foto baru tampak ke:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"Hapus lokasi, kame_ra, dan informasi pengidentifikasi lain sebelum mengunggah"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Masukkan nomor konfirmasi yang muncul setelah Anda log masuk ke Flickr dalam "
+"peramban Web Anda."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Nomor Otorisasi:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Lanju_tkan"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Album _yang ada:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Nama album _baru:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "Daftarkan album dalam galeri publ_ik"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Pratata uku_ran foto:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL dari pustaka gambar Piwigo Anda"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Nama pengguna"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Ingat Sandi"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Direktori yang _ada:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Gambar akan bisa _dilihat oleh:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Ukuran foto:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "dalam kategori:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Komentar album:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "B_ila judul diatur dan komentar kosong, pakai judul sebagai komentar"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Jangan unggah tag"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Catat keluar"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Kirim"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Layanan Penerbit Utama"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Pengaturan priva_si video:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Tirai"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Catur"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Lingkaran"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Lingkaran"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Jam"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Runtuh"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Kabur"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Salindia"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Kotak"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Strip"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Peralihan Salindia Utama"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+#| msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Hak Cipta 2010 Maxim Kartashev, Hak Cipta 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Gagal membuat direktori cache %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Gagal membuat direktori data %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Foto"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Gagal membuat direktori temporer %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Gagal membuat direktori data %s: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Semat Batang Alat"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Sematkan batang alat terbuka"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Tinggalkan layar penuh"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Layar _Biasa"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Keluar"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "Tent_ang"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Layar _Penuh"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "Daftar _Isi"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Pertanyaan Sering Ditanyakan"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "Lapo_r Masalah..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Batal"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ada kesalahan yang fatal saat mengakses pustaka Shotwell. Terpaksa tidak "
+"dapat dilanjutkan.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Pedoman penggunaan tidak dapat ditampilkan: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Gagal menavigasi basis data bug: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Gagal menampilkan FAQ: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Berhasil"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Kesalahan berkas"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Berkas tidak dapat dibaca"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Kesalahan basis data"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Impor yang Anda batalkan"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Bukan berkas"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Berkas sudah ada di basis data"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Jenis berkas tidak dapat dibuka"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Bukan berkas foto"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Kegagalan cakram"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Cakram penuh"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kesalahan kamera"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Kesalahan penulisan berkas"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Berkas citra rusak"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Impor yang gagal (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "Sa_lindia"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Putar tampilan salindia"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Ekspor Foto/Video"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Ekspor Foto-foto/Video-video"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Ekspor Foto"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Ekspor Foto-foto"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Memutar"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Batalkan Pemutaran"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Balikkan Horizontal"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Batalkan Batal Horizontal"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Balikkan Vertikal"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Batalkan Balik Vertikal"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Membalikkan"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Batalkan pembalikan"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Menajamkan gambar"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Batalkan Penajaman Gambar"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Menerapkan Transformasi Warna"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Membatalkan Transformasi Warna"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Buat Rangkaian Baru"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Hapus Rangkaian"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Memindahkan Semua Foto Ini ke Rangkaian Baru"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Menandai Foto ke Rangkaian Sebelumnya"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Menggabungkan"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Membatalkan Penggabungan"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Gandakan foto"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Hapus foto ganda"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Ada %d foto yang tidak dapat digandakan karena ada kesalahan teknis"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Mengembalikan rating sebelumnya"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Naikkan rating"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Turunkan rating"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Atur RAW pengembang"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Mengembalikan pembangun RAW sebelumnya"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Atur Pengembang"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Foto asli tidak dapat diatur"
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Mengatur Tanggal dan Jam"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Batalkan Pengaturan Tanggal dan Jam"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Foto ini tidak dapat diatur"
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Tidak Dapat Mengatur Jam"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Jam asli pada foto ini tidak dapat dikembalikan"
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Buat Tanda"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Pindah Tag \"%s\""
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Pindahkan Foto ke Tempat Pembuangan"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Kembalikan Foto dari Tempat Pembuangan"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Pindahkan foto-foto tersebut ke tempat pembuangan"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Kembalikan foto-foto yang dibuang ke album"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Pindahkan Foto ke Tempat Pembuangan"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Kembalikan Foto dari Tempat Pembuangan"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Tandai foto terpilih"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Hapus tanda foto terpilih"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Tandai foto terpilih"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Hapus tanda foto terpilih"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Tanda"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Hapus Tanda"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Gagal menjalankan Nautilus Send-To: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Kirim Ke"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Gambar latar tidak dapat diekspor ke %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Gagal menyiapkan salindia destop: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Tanda \"%s\" akan dihapus dari %d foto. Teruskan?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Hapus"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Pencarian tersimpan \"%s\" akan dihapus. Teruskan?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Mengganti pengembang akan membatalkan perubahan yang kamu buat ke foto ini "
+"di Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Ganti Pengembang"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Ekspor Video"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell tidak dapat membuat berkas penyuntingan foto karena tidak ada izin "
+"menulisi %s"
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Pengeksporan foto berikut gagal karena kesalahan teknis pada berkas.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Lanjutkan proses ekspor foto?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Tidak dimodifikasi"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Sekarang"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kualitas:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Batas skala:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_piksel"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Ekspor metadata"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Simpan Rincian..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Simpan Rincian"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(dan %d buah lagi)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Impor Laporan Hasil"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Mencoba mengimpor %d berkas."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Dari sekian banyak, %d berkas sukses diimpor."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Foto/Video Duplikat Yang Tak Diimpor:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "butir media yang ada yang duplikat"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Foto/Video Yang Tak Diimpor Karena Galat Kamera:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "pesan kesalahan:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Berkas Yang Tak Diimpor Karena Tak Dikenali Sebagai Foto atau Video:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Foto/Video Yang Tak Diimpor Karena Bukan Dalam Format Yang Dikenal Shotwell:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Foto/Video Yang Tak Diimpor Karena Shotwell Tak Bisa Menyalin Mereka Ke "
+"Pustaka:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"tak bisa menyalin %s\n"
+"\tke %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Foto/Video Yang Tak Diimpor Karena Berkas Rusak:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Foto Video Yang Tak Diimpor Karena Alasan Lain:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d foto duplikat tidak diimpor:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d video duplikat tidak diimpor:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d foto/video duplikat tidak diimpor:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ada %d foto gagal diimpor karena kesalahan pada berkas atau perangkat "
+"keras:\n"
+"\r\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ada %d video gagal diimpor karena kesalahan pada berkas atau perangkat "
+"keras:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ada %d foto/video gagal diimpor karena kesalahan pada berkas atau perangkat "
+"keras:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ada %d berkas gagal diimpor karena kesalahan pada berkas atau perangkat "
+"keras:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d foto tidak dapat diimpor karena folder album foto tidak dapat ditulisi:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d video tidak dapat diimpor karena folder album foto tidak dapat ditulisi:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d foto/video tidak dapat diimpor karena folder album foto tidak dapat "
+"ditulisi:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d berkas tidak dapat diimpor karena folder album foto tidak dapat "
+"ditulisi:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Ada %d foto gagal diimpor karena kesalahan pada kamera:\n"
+"\r\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d video gagal diimpor karena kesalahan pada kamera:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d foto/video gagal diimpor karena kesalahan pada kamera:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d berkas gagal diimpor karena kesalahan pada kamera:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d foto gagal diimpor karena rusak:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d video gagal diimpor karena rusak:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d foto/video gagal diimpor karena rusak:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d berkas gagal diimpor karena rusak:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+"Ada %d foto yang tidak dapat dibuka:\n"
+"\r\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Ada %d berkas yang bukan berupa foto.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Ada %d foto yang tidak masuk karena Anda batalkan:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Ada %d video yang tidak masuk karena Anda batalkan:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Ada %d foto/video yang tidak masuk karena Anda batalkan:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Ada %d berkas yang tidak masuk karena Anda batalkan:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d foto telah berhasil diimpor.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d video telah berhasil diimpor.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d foto/video telah berhasil diimpor.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Tidak ada foto atau video yang diimpor.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Impor Selesai"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d detik"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d menit"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d jam"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 hari"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Ubah Nama Peristiwa"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nama:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Sunting Judul"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Judul:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Sunting Komentar Peristiwa"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Sunting Komentar Foto/Video"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Buang Foto"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Hapus Dari _Album"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Simpan"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Batalkan Penyuntingan Eksternal?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Batalkan Penyuntingan Eksternal?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Jika proses ini diteruskan maka semua perubahan yang sudah Anda lakukan pada "
+"berkas %d foto eksternal tidak akan disimpan. Lanjutan?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Batalkan Penyuntingan Eksternal"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Batalkan Penyuntingan Eksternal"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "%d foto akan dihapus dari album. Lanjutkan?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Hapus"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Hapus Foto Dari Album"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Hapus Foto Dari Album"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "Pagi"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "Siang/Malam"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Jam"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Ge_ser foto/video dalam jumlah sama"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Atur semu_a foto/video ke waktu ini"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifikasi berkas asli foto"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifikasi berkas asli foto"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Ubah pada _berkas foto aslinya"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Ubah pada _berkas foto aslinya"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Aslinya:"
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Tanggal pengambilan gambar akan dimajukan\n"
+"%d %s, %d %s, %d %s, dan %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Tanggal pengambilan gambar akan dimundurkan\n"
+"%d %s, %d %s, %d %s, dan %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "hari"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "jam"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "menit"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "detik"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Dan %d lainnya."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Tanda (pisahkan dengan koma):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Selamat Datang!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Selamat Datang di Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "Silakan memulai dengan mengimpor foto melalui cara berikut:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Pilih <span weight=\"bold\">Berkas %s Impor Dari Folder</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Ambil dan letakkan foto ke jendela Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Sambungkan kamera ke komputer dan lakukan impor"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Impor foto dari folder %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Anda juga dapat mengimpor foto dengan cara berikut"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Jangan tampilkan pesan ini pada masa mendatang"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Impor foto dari %s pustakamu"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Bantuan)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Tahun%sBulan%sHari"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Tahun%sBulan"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Tahun%sBulan-Hari"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Tahun-Bulan-Hari"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Bebas"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Pola tak sah"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell dapat menyalin foto foto ke folder album ataupun mengimpor tanpa "
+"menyalin"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Sa_lin Foto"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Impor di Lokasi"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Impor ke Album"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Hapus Dari Album"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Hapus Foto dari Album"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Hapus Foto Dari Album"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Anda dapat menghapus %d foto/video ini dari Album saja atau memindahkannya "
+"ke tempat pembuangan. Mana yang Anda pilih?\n"
+"\n"
+"(proses ini tidak dapat dikembalikan ke semula)"
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Anda dapat menghapus %d video ini dari Album saja atau memindahkannya ke "
+"tempat pembuangan. Mana yang Anda pilih?\n"
+"\n"
+"(proses ini tidak dapat dikembalikan ke semula)"
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Anda dapat menghapus %d foto ini dari Album saja atau memindahkannya ke "
+"tempat pembuangan. Mana yang Anda pilih?\n"
+"\n"
+"(proses ini tidak dapat dikembalikan ke semula)"
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Foto/video %d tidak dapat dipindahkan ke tempat pembuangan. Hapus berkas ini?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Foto/video %d tidak dapat dihapus"
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Lebar atau tinggi"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Lebar"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Tinggi"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Gagal memantau %s: Bukan direktori (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Rangkaian %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Gagal membuat berkas temporer untuk %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Mengekspor"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Berkas %s sudah ada. Timpa?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Lewati"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Timpa"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Timpa Semu_a"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Ekspor"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Gagal memroses pembaruan pemantauan: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Atur ukuran gambar mini"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Zum _Masuk"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Tingkatkan perbesaran gambar mini"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "Zum _Keluar"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Surutkan perbesaran gambar mini"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Urutkan _Foto"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Mainkan Video"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Buka video-video terpilih di pemutar video"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Developer"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Kamera"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Judul"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Tampilkan judul setiap foto"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Komentar"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Tampilkan komentar setiap foto"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "Tan_da"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Tampilkan tanda setiap foto"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Berdasarkan _Judul"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Urutkan foto berdasarkan judul"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Ber_dasarkan Tanggal Pengambilan"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Urutkan foto berdasarkan tanggal pengambilan"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Berdasarkan _Rating"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Urutkan foto berdasarkan rating"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "N_aik"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Urutkan foto dengan urut naik"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "T_urun"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Urutkan foto dengan urut turun"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell gagal memutar video terpilih:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Tidak ada foto/video"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Foto/video tidak ditemukan"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Foto tidak dapat diekspor ke direktori tersebut."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "berubah"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto sebelumnya"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Foto berikutnya"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Sumber foto asli hilang: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Tampilkan"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "P_eralatan"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Foto Se_belumnya"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto Sebelumnya"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Foto B_erikutnya"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Foto Berikutnya"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Tingkatkan perbesaran foto"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Surutkan perbesaran foto"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "_Pas ke laman"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zum foto untuk pas ke layar"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Zum _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zum foto ke perbesaran 100%"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Zum _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zum foto ke perbesaran 200%"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Proses ekspor %s gagal: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Sehalaman penuh"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 gambar per halaman"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 gambar per halaman"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 gambar per halaman"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 gambar per halaman"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 gambar per halaman"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 gambar per halaman"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "inci"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Dompet (2 x 3 inci)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Kertas catatan (3 x 5 inci)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 inci."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 inci"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 inci"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 inci"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 inci"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Dompet (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Kartupos (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Penataan Gambar"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Mencetak..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Foto tidak dapat dicetak:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Hari ini"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Kemarin"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Jumlah Foto:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d Rangkaian"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Foto"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d Video"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Tanggal:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Jam:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Sejak:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Hingga:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Ukuran:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Durasi:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f detik"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Pengembang:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Bukaan:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Letak di sistem:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Ukuran berkas:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Pengembangan Saat Ini:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Ukuran asli:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Merek kamera:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model kamera:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Lampu kilat:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Panjang fokus:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Tanggal bukaan:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Waktu bukaan:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Bias bukaan:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Garis lintang GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Garis bujur GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Pengambil gambar:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Hak cipta:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Perangkat Lunak:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informasi Lanjutan"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Album Foto"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Album Foto"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Puta_r Kanan"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Putar"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Putar Kanan"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Putar foto ke kanan (tekan Ctrl untuk putar ke kiri)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Putar _Kiri"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Putar Kiri"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Putar foto ke kiri"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Balik hori_zontal"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Balik Horizontal"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Balik Verti_kal"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Balik Vertikal"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Taja_mkan"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Tajamkan"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Membuat foto lebih tajam"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "Salin Penyetelan _Warna"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Salin Penyetelan Warna"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Salin penyetelan warna yang diterapkan ke foto"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Tem_pel Penyetelan Warna"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Tempel Penyetelan Warna"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Terapkan penyetelan warna yang disalin ke foto yang dipilih"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Potong"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Potong"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Potong ukuran foto"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Luruskan"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Luruskan"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Luruskan foto"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Mata-me_rah"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Mata-merah"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Hilangkan efek mata merah pada foto"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Atur"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Atur"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Atur warna dan tonal foto"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "K_embalikan ke Asal"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Kembalikan ke Asal"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Kembalikan Suntingan E_ksternal"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Abaikan perubahan dan kembalikan ke foto asal"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Atur sebagai Latar _Destop"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Jadikan foto ini menjadi gambar latar desktop"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Atur sebagai Salindia _Destop"
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Batalkan: "
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Batalkan"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Jadikan: "
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Jadikan"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Ga_nti Nama Rangkaian..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Jadi_kan Foto Utama Untuk Rangkaian Ini"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Jadikan Foto Utama Untuk Rangkaian Ini"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "Rangkaia_n Baru"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Rangkaian Baru"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Pindahkan Foto"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Pindahkan foto ke sebuah rangkaian"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Gabungkan Rangkaian"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Gabungkan"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Gabungkan acara-acara ke satu acara"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Atur Rating"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Atur Rating"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Ubah rating foto"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Naik"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Naikkan Rating"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Turun"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Turunkan Rating"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Tanpa Rating"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Tanpa Rating"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Belum Dirating"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Atur sebagai Tanpa Rating"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Hapus rating"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Ditolak"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Ditolak"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Rating Ditolak"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Atur ke ditolak"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Atur rating ke ditolak"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Hanya Ditolak"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Hanya Ditolak"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Tampilkan hanya foto yang ditolak"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Semua + _Ditolak"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Tampilkan semua foto, termasuk yang ditolak"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Semu_a foto"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Tunjukkan semua foto"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Rating"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Tampilkan rating tiap foto"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Saring Foto"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Saring Foto"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Batasi jumlah foto yang tampil berdasarkan penyaringan"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Gandakan"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Gandakan"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Gandakan foto-foto ini"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Ekspor..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Cetak"
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Kirim..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Kirim foto ini ke beragam situs"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Sun_ting Judul..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Sunting _Komentar..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Sunting Komentar"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Sunting _Komentar Peristiwa"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Atur Jam dan Tanggal..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Atur Jam dan Tanggal"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Beri _Tanda..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "T_ambah Tag..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Beri Tanda"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Pengaturan"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Buka Oleh Penyunting E_ksternal"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Buka Dengan Penyunting RA_W"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Kirim _Ke"
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Kirim _Ke..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Cari"
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Cari"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Cari foto dengan mengetikkan teks yang muncul di nama atau tanda"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Tanda"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Lepas _tanda"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Program penyunting tidak dapat dijalankan: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Beri Tanda \"%s\""
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Beri Tanda \"%s\" dan \"%s\""
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Hapus Tanda \"%s\""
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Hapus Tanda \"%s\""
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Hapus Tanda"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Baru"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Ganti _Nama Tanda \"%s\"..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Ganti Nama Tanda \"%s\" menjadi \"%s\""
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Ganti nama"
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Ubah Tanda..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Ubah Tanda"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Tandai Foto Sebagai \"%s\""
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Tandai Foto Sebagai \"%s\""
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Tandai foto terpilih sebagai \"%s\""
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Tandai foto terpilih sebagai \"%s\""
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Hapus Tanda \"%s\" Dari _Foto"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Hapus Tanda \"%s\" Dari _Foto"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Hapus Tanda \"%s\" Dari Foto"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Hapus Tanda \"%s\" Dari _Foto"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Tanda tidak dapat diganti menjadi \"%s\" karena sudah ada."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Gagal mengubah nama pencarian ke \"%s\" karena sudah ada "
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Pencarian Tersimpan"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Hapus Pencarian"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Sunting..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Ganti _nama..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Ubah Nama Pencarian \"%s\" ke \"%s\""
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Hapus Pencarian \"%s\""
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Nilai %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Atur nilai rating ke %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Mengatur rating ke %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Tampilkan %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Hanya tampilkan foto dengan rating %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s atau lebih baik"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Tampilkan %s atau lebih baik"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Hanya tampilkan foto dengan rating %s atau lebih baik"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Hapus foto-foto terpilih dari tempat pembuangan"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Hapus foto-foto terpilih dari album"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Kembalikan"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Kembalikan foto-foto ke album"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Lihat di Program Pengatur Berkas"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Buka direktori foto dengan program pengatur berkas"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Program pengatur berkas tidak dapat dibuka: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Hapus _Dari Album"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Pindahkan ke Tempat Pembuangan"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Pilih semu_a"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Pilih semua item"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b, %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Tampil salindia (slideshow)"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Ditandai"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Foto"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Foto RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Foto RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Gagal memuat berkas UI %s:%s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipe"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Rating"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Pengaturan"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Mundur"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Mundur ke foto sebelumnya"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Hentikan"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Hentikan tampilan salindia"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Berikutnya"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Maju ke foto berikutnya"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Atur tampilan salindia"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Semua sumber foto telah lenyap."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Jalankan"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Teruskan tampilan salindia"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "tanpa judul"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Ekspor video"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kamera"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kamera tidak dapat dilepas. Silakan lepas melalui program pengelola berkas."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Sembunyikan foto yang sudah selesai diimpor"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Hanya tampilkan foto yang belum diimpor"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Mulai mengimpor, silakan tunggu..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Impor Foto _Terpilih"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Impor foto terpilih ke album"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Impor Semu_a"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Impor semua foto ke album"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell harus dapat melepaskan kamera dari sistem agar dapat mengaksesnya. "
+"Izinkan?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Lepas"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Silakan lepaskan kamera."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kamera sudah terkunci oleh aplikasi lain. Shotwell hanya dapat mengakses "
+"kamera pada saat tidak terkunci. Silakan matikan aplikasi yang sedang "
+"menggunakan kamera ini dan coba kembali."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Mohon segera mematikan aplikasi lain yang sedang menggunakan kamera."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Gambar pratayang tidak dapat diambil dari kamera:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Melepaskan kamera..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Mengambil informasi foto"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Mengambil gambar pratayang %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kamera tidak dapat dikunci: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Hapus %d foto ini dari kamera?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Hapus %d video ini dari kamera?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Hapus %d foto/video ini dari kamera?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Hapus %d berkas ini dari kamera?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Menghapus foto/video dari kamera"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Tidak dapat menghapus %d foto/video dari kamera karena adanya kesalahan"
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Impor Data"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Basisdata %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Gagal lanjut mengimpor dari %s karena terjadi eror:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Untuk mengimpor dari layanan lain, pilih satu dari menu di atas."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Kamu tidak punya pengaya impor data yang aktif.\n"
+"\n"
+"Untuk memakai fungsi Impor Dari Aplikasi, kamu perlu paling sedikit satu "
+"pengaya impor data yang aktif. Pengaya dapat diaktifkan di Pengaturan."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Berkas basis data:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Impor"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Impor Dari Aplikasi"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Im_por media dari:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Tutup"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Gagal membuka/membuat basis data foto %s: kode galat %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Gagal menulis ke berkas basis data foto:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Kesalahan mengakses berkas basis data:\n"
+" %s\n"
+"\n"
+"Kesalahan: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Berkas"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "_Simpan"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Simpan foto"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Simpan seb_agai..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Simpan foto dengan nama lain"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Cetak foto ke pencetak yang terhubung ke komputer ini"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "S_unting"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Foto"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "Ba_ntuan"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s tidak ada."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s bukan berkas."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s tidak dapat mendukung berkas jenis\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "Buat _Salinan"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Jangan simpan perubahan pada %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Tutup _tanpa menyimpan"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Ada kesalahan saat menyimpan ke %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Simpan Sebagai"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Kembalikan ukuran foto saat ini"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Atur pemotongan foto ini"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Atur kotak pemotongan antara orientasi mendatar dan berdiri"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Tanpa batas"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Kotak"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Seukuran Layar"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "Video SD (4:3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "Video HD (16:9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Tutup penghilang mata merah"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Hilangkan efek mata merah pada area yang diinginkan"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Reset"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Saturasi:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Tint:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Suhu:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Kegelapan:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Highlight:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Reset Warna"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Kembalikan warna ke nilai aslinya"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Suhu"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Tint"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Saturasi"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Bukaan"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Kegelapan"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Highlight"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Naikkan Kontras"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Sudut:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Foto/Video"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Tidak Ada Rangkaian"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Tampilkan komentar setiap foto"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Tidak ada rangkaian"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Tidak ada rangkaian ditemukan"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Rangkaian"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Tidak bertanggal"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Folder"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Album"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Mengimpor..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Hentikan Impor"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Hentikan proses impor foto"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Menyiapkan impor..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s diimpor"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Impor terakhir"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Impor Dari Folder ..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Impor foto dari cakram ke album"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Impor Dari _Aplikasi..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Rangkaian Dengan Urutan"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Hapus Pe_rmanen Foto Buangan"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Hapus semua foto yang pernah dibuang"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Lihat Eve_nt Foto"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Cari"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Cari foto dan video menurut kriteria pencarian"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Pencarian Tersimpan B_aru"
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Foto-foto"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Rangkaian"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informasi _Dasar"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Tampilkan informasi dasar foto terpilih"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informasi _Lanjut"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Tampilkan informasi lanjutan foto terpilih"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Bilah Pencarian"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Tampilkan bilah pencarian"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Bilah S_isi"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Tampilkan bilah sisi"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Impor Dari Folder"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Hapus Permanen Foto Buangan"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Foto Buangan Sedang Dihapus Permanen..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell dikonfigurasi untuk mengimpor foto ke direktori rumah Anda.\n"
+"Kami sarankan untuk mengubah ini dalam <span weight=\"bold\">Sunting "
+"Preferensi %s</span>.\n"
+"Apakah Anda ingin melanjutkan mengimpor foto?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Lokasi Album:"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Foto tidak dapat diimpor dari direktori tersebut."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Memperbaharui album..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Bersiap impor foto otomatis..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Mengimpor foto otomatis"
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Menulis metadata ke berkas..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Berkas Hilang"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Menghapus..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Tempat Pembuangan"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Tempat Pembuangan kosong"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Hapus"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Menghapus foto-foto"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Album foto tidak kompatibel dengan versi Shotwell sekarang. Tampaknya album "
+"dibuat dengan Shotwell %s (schema %d). Versi sekarang adalah %s (schema %d). "
+"Harap gunakan Shotwell versi terbaru"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell gagal meningkatkan album foto dari versi %s (schema %d) ke %s "
+"(schema %d). Untuk informasi lebih lanjut, silakan periksa Shotwell Wiki di "
+"%s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Album foto tidak kompatibel dengan versi Shotwell sekarang. Tampaknya album "
+"dibuat dengan Shotwell %s (schema %d). Versi sekarang adalah %s (schema %d). "
+"Harap bersihkan album dengan menghapus %s dan mengimpor ulang foto"
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Kesalahan tak dikenal saat mencoba verifikasi database Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Menjalankan Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Path ke data privat Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIREKTORI"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Jangan pantau perubahan direktori pustaka saat runtime"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Jangan tampilkan meter kemajuan awal mula"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Menampilkan versi aplikasi"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Jalankan dengan perintah '%s --help' untuk melihat daftar opsi yang bisa "
+"digunakan.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Rendah (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Sedang (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Tinggi (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksimum (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Kirimkan"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Bersiap mengunggah"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Mengunggah %d dari %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Unggahan ke %s tidak dapat diteruskan karena galat berikut"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Pilih dari menu untuk menggunakan layanan lain."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Foto/video terpilih telah berhasil dikirim"
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Video terpilih telah berhasil dikirim"
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Foto tadi sudah berhasil dikirim."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Video terpilih telah berhasil dikirim"
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Foto terpilih telah berhasil dikirim"
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Mengambil informasi akun..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Masuk ke sistem..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Kirim Foto"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Kirim foto _ke:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Kirim Video"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Kirim video _ke"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Kirim Foto dan Video"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Kirim Foto dan Video _ke"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Tidak dapat mengirim"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell tak bisa mempublikasikan butir yang dipilih karena Anda tak "
+"memiliki pengaya publikasi kompatibel yang difungsikan. Untuk memperbaiki "
+"hal ini, pilih <b>Sunting Preferensi %s</b> dan fungsikan satu atau lebih "
+"pengaya publikasi pada tab <b>Pengaya</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Pencarian Tersimpan"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "mengandung"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "persis"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "dimulai dengan"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "diakhiri dengan"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "tidak mengandung"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "tak diatur"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "adalah"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "bukan"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "foto manapun"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "adalah foto mentah"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "punya"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "tak punya"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modifikasi"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modifikasi internal"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modifikasi eksternal"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ditandai"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "tidak ditandai"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "dan lebih tinggi"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "hanya"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "dan lebih rendah"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "setelah"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "sebelum"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "antara"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "dan"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "manapun"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "semua"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "tidak ada"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Teks manapun"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Judul"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tanda"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Komentar"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nama rangkaian"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nama berkas"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipe media"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Status tanda"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Status foto"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Tanggal"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "_Tag Baru..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transisi Salindia"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Tidak ada)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Tidak ada"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Acak"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Tanda"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Atur sebagai Salindia Destop"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Membuat salindia latar destop"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Tampilkan tiap foto untuk"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "jangka waktu"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Berapa lama tiap foto ditampilkan di latar destop"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Pencarian"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Nama pencarian"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Cocokkan"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "yang berikut ini:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Ukuran Foto Tercetak</b?"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Gunakan ukuran _standar:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Gunakan _ukuran bebas:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Sesuaikan dengan rasio foto"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Ukuran otomatis"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Judul</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Ce_tak judul gambar"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Resolusi Piksel</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "Tampilkan f_oto pada:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "piksel per inci"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Pengaturan Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "putih"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "hitam"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Pantau berkas baru di direktori album"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Tulis tanda, judul dan metadata lainnya ke berkas foto"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Tampilan"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Impor foto ke"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "Latar _Belakang"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Mengimpor"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "_Struktur direktori"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Pola:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Contoh"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "Ubah n_ama berkas impor ke huruf kecil"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW Developer"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "De_fault:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Penyunting foto e_ksternal"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Penyunting _RAW eksternal"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Penyunting eksternal"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Pengaya"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "Penun_daan"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Efek _Transisi"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "P_enundaan Peralihan"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Tampilkan _judul"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "detik"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Login"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..6ba0b46
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,4619 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# gcastagneti <assoacca@gmail.com>, 2011
+# gcastagneti <assoacca@gmail.com>, 2011
+# caccolangrifata <caccolangrifata@gmail.com>, 2011
+# caccolangrifata <caccolangrifata@gmail.com>, 2011
+# Luca Ferretti <elle.uca@libero.it>, 2011-2012
+# Luca Ferretti <lferrett@gnome.org>, 2011-2012
+# mattia_b89 <mattia.b89@gmail.com>, 2011
+# mattia_b89 <mattia.b89@gmail.com>, 2011
+# Milo Casagrande <milo@casagrande.name>, 2012
+# milo <milo@ubuntu.com>, 2012-2013
+# verayin <vera@yorba.org>, 2011
+# caccolangrifata <caccolangrifata@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Luca Ferretti <elle.uca@libero.it>, 2011-2012
+# milo <milo@ubuntu.com>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: milo <milo@ubuntu.com>\n"
+"Language-Team: Italian (http://www.transifex.com/projects/p/shotwell/"
+"language/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Evento %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fotocamere"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Fotocamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Impossibile smontare la fotocamera. Provare a smontare la fotocamera dal "
+"gestore di file"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Nascondi le foto già importate"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Visualizza solo le foto non ancora importate"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Avvio importazione, attendere..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titoli"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Visualizza il titolo di ogni foto"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importa _selezionate"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importa le foto selezionate nella libreria"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Import_a tutte"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importa tutte le foto nella libreria"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "Per poter accedere alla fotocamera è necessario smontarla. Continuare?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Smonta"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Smontare la fotocamera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"La fotocamera è bloccata da un'altra applicazione: sarà possibile accedervi "
+"solo quando sarà sbloccata. Chiudere tutte le altre applicazioni che usano "
+"la fotocamera e riprovare."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Chiudere tutte le altre applicazioni che usano la fotocamera."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Impossibile recuperare le anteprime dalla fotocamera:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Scollegamento..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Recupero informazioni foto"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Recupero anteprima per %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Impossibile bloccare la fotocamera: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Eliminare questa foto dalla fotocamera?"
+msgstr[1] "Eliminare queste %d foto dalla fotocamera?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Eliminare questo video dalla fotocamera?"
+msgstr[1] "Eliminare questi %d video dalla fotocamera?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Eliminare questa foto o video dalla fotocamera?"
+msgstr[1] "Eliminare queste %d foto o video dalla fotocamera?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Eliminare questo file dalla fotocamera?"
+msgstr[1] "Eliminare questi %d file dalla fotocamera?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Mantieni"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Rimozione foto/video dalla fotocamera"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Impossibile eliminare %d foto o video dalla fotocamera a causa di errori."
+msgstr[1] ""
+"Impossibile eliminare %d foto o video dalla fotocamera a causa di errori."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Diapositive"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Proietta come diapositive"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Esporta foto/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Esporta foto/video"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Esporta foto"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Esporta foto"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotazione"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Annullamento rotazione"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Capovolgimento orizzontale"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Annullamento capovolgimento orizzontale"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Capovolgimento verticale"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Annullamento capovolgimento verticale"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Qualsiasi testo"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titolo"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etichetta"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nome evento"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nome file"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipo media"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Stato contrassegno"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Giudizio"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contiene"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "è esattamente"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "inizia con"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "finisce con"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "non contiene"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "non è impostato"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "è"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "non è"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "qualsiasi foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "una foto raw"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "un video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "contrassegnato"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "non contrassegnato"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "e maggiore"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "solo"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "e inferiore"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "è dopo"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "è prima"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "è tra"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "e"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "qualsiasi"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "tutto"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nessuno"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Ricerche salvate"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Nuova _ricerca salvata..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"La libreria delle foto non è compatibile con questa versione di Shotwell. "
+"Sembra sia stata creata dalla versione %s di Shotwell (schema %d). Questa è "
+"la versione %s (schema %d). Usare l'ultima versione di Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Impossibile aggiornare la libreria delle foto dalla versione %s (schema %d) "
+"alla %s (schema %d). Per maggiori informazioni controllare il wiki di "
+"Shotwell all'indirizzo %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"La libreria delle foto non è compatibile con questa versione di Shotwell. "
+"Sembra sia stata creata dalla versione %s (schema %d) di Shotwell. Questa è "
+"la versione %s (schema %d). Pulire la libreria eliminando %s e reimportare "
+"le foto."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Errore sconosciuto nel tentativo di verificare il database di Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Caricamento Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Percorso ai dati privati di Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Non controlla durante l'esecuzione la directory della libraria per modifiche"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Non visualizza l'avanzamento all'avvio"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Mostra la versione dell'applicazione"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Usare \"%s --help\" per avere un elenco completo delle opzioni disponibili "
+"da riga di comando.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Oggi"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ieri"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titolo:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementi:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d evento"
+msgstr[1] "%d eventi"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d foto"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d video"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Ora:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Da:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "A:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Dimensione:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Durata:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f secondi"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Developer:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Esposizione:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Posizione:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Dimensione del file:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Development attuale:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensioni originali:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Produttore fotocamera:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modello fotocamera:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Lunghezza focale:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data esposizione:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Tempo esposizione:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Compensazione esposizione:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitudine GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitudine GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Commento:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informazioni estese"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Verrà rimossa l'etichetta «%s» da una foto. Continuare?"
+msgstr[1] "Verrà rimossa l'etichetta «%s» da %d foto. Continuare?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "A_nnulla"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Elimina"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Verrà rimossa la ricerca salvata «%s». Continuare?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Il passaggio a un altro developer annulla tutte le modifiche fatte a questa "
+"foto"
+msgstr[1] ""
+"Il passaggio a un altro developer annulla tutte le modifiche fatte a queste "
+"foto"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Cambia developer"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Esporta video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Non è stato possibile creare un file necessario alla modifica di questa foto "
+"poiché non si hanno permessi sufficienti per scrivere su %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Impossibile esportare la seguente foto a causa di un errore sul file.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Continuare con l'esportazione?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinua"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Non modificata"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Attuale"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formato:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualità:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Vincolo di _ridimensionamento:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixel"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Esporta metadati"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Salva dettagli..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Salva i dettagli"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(e altre %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Dettagli importazione"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Tentata l'importazione di %d file."
+msgstr[1] "Tentata l'importazione di %d file."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Di questi, %d file è stato importato con successo."
+msgstr[1] "Di questi, %d file sono stati importati con successo."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Foto/Video duplicati non importati:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplicato di un elemento già esistente"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"Foto/Video non importati a causa di problemi con la fotocamera/videocamera:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "messaggio di errore:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "File non importati perché non riconosciuti come foto o video:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Foto/Video non importati perché non in un formato supportato da Shotwell:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Foto/Video non importati perché Shotwell non è stato in grado di copiarli "
+"nella libreria:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"impossibile copiare %s\n"
+"\tin %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Foto/Video non importati per altri motivi:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 foto duplicata non è stata importata:\n"
+msgstr[1] "%d foto duplicate non sono state importate:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 video duplicato non è stato importato:\n"
+msgstr[1] "%d video duplicati non sono stati importati:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 foto o video duplicato non è stato importato:\n"
+msgstr[1] "%d foto o video duplicati non sono stati importati:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 foto non è stata importata a causa di un errore file o hardware:\n"
+msgstr[1] ""
+"%d foto non sono state importate a causa di un errore file o hardware:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 video non è stato importato a causa di un errore file o hardware:\n"
+msgstr[1] ""
+"%d video non sono stati importati a causa di un errore file o hardware:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 foto o video non è stato importato a causa di un errore file o hardware:\n"
+msgstr[1] ""
+"%d foto o video non sono stati importati a causa di un errore file o "
+"hardware:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 file non è stato importato a causa di un errore file o hardware:\n"
+msgstr[1] ""
+"%d file non sono stati importati a causa di errori file o hardware:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto non è stata importata perché la cartella della libreria non è "
+"scrivibile:\n"
+msgstr[1] ""
+"%d foto non sono state importate perché la cartella della libreria non è "
+"scrivibile:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 video non è stato importato perché la cartella della libreria non è "
+"scrivibile:\n"
+msgstr[1] ""
+"%d video non sono stati importati perché la cartella della libreria non è "
+"scrivibile:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto o video non è stato importato perché la cartella della libreria non è "
+"scrivibile:\n"
+msgstr[1] ""
+"%d foto o video non sono stati importati perché la cartella della libreria "
+"non è scrivibile:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 file non è stato importato perché la cartella della libreria non è "
+"scrivibile:\n"
+msgstr[1] ""
+"%d file non sono stati importati perché la cartella della libreria non è "
+"scrivibile:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 foto non è stata importata a causa di un errore della fotocamera:\n"
+msgstr[1] ""
+"%d foto non sono state importate a causa di un errore della fotocamera:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 video non è stato importato a causa di un errore della fotocamera:\n"
+msgstr[1] ""
+"%d video non sono stati importati a causa di un errore della fotocamera:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 foto o video non è stato importato a causa di un errore nella fotocamera:\n"
+msgstr[1] ""
+"%d foto o video non sono stati importati a causa di un errore nella "
+"fotocamera:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 file non è stato importato a causa di un errore sulla fotocamera:\n"
+msgstr[1] ""
+"%d file non sono stati importati a causa di un errore sulla fotocamera:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 foto non supportata è stata saltata:\n"
+msgstr[1] "%d foto non supportate sono state saltate:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 file non immagine è stato saltato.\n"
+msgstr[1] "%d file non immagine sono stati saltati.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 foto saltata a causa dell'annullamento da parte dell'utente:\n"
+msgstr[1] "%d foto saltate a causa dell'annullamento da parte dell'utente:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video saltato a causa dell'annullamento da parte dell'utente:\n"
+msgstr[1] "%d video saltati a causa dell'annullamento da parte dell'utente:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"1 foto o video saltato a causa dell'annullamento da parte dell'utente:\n"
+msgstr[1] ""
+"%d foto o video saltati a causa dell'annullamento da parte dell'utente:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 file non è stato saltato a causa dell'annullamento dell'utente:\n"
+msgstr[1] ""
+"%d file non sono stati saltati a causa dell'annullamento dell'utente:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto importata con successo.\n"
+msgstr[1] "%d foto importate con successo.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video importato con successo.\n"
+msgstr[1] "%d video importati con successo.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto o video importato con successo.\n"
+msgstr[1] "%d foto o video importati con successo.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Nessuna foto o video importato.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importazione completata"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d secondo"
+msgstr[1] "%d secondi"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minuti"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ora"
+msgstr[1] "%d ore"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 giorno"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Rinomina evento"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Modifica titolo"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Sposta _nel cestino"
+msgstr[1] "Sposta _nel cestino"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Rimuovi solamente"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Ripristinare la modifica esterne?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Ripristinare le modifiche esterne?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "Verranno annullate tutte le modifiche al file esterno. Continuare?"
+msgstr[1] ""
+"Verranno annullate tutte le modifiche a %d file esterni. Continuare?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Ripristina modifica _esterna"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Ripristina modifiche _esterne"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Verrà rimossa la foto dalla libreria. Continuare?"
+msgstr[1] "Verranno rimosse %d foto dalla libreria. Continuare?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Rimuovi"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Rimuovi foto dalla libreria"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Rimuovi foto dalla libreria"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ore"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Sposta foto/video della stessa quantità"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "_Imposta tutte foto/video a quest'ora"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifica file originale della foto"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifica file originali della foto"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modifica file originale"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifica i file originali"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Originale: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y %H.%M.%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y %I.%M.%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"L'ora dello scatto sarà spostata in avanti di\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"L'ora dello scatto sarà spostata indietro di\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "giorno"
+msgstr[1] "giorni"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ora"
+msgstr[1] "ore"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minuti"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "secondo"
+msgstr[1] "secondi"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"E %d altra."
+msgstr[1] ""
+"\n"
+"\n"
+"E %d altre."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etichette (separate con una virgola):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Benvenuti!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Benvenuti in Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Per iniziare, importare le foto in uno dei modi seguenti:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Scegliere <span weight=\"bold\">File %s Importa dalla cartella</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Trascinare e rilasciare le foto nella finestra di Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Connettere una fotocamera al computer e importare"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Importa le foto dalla _cartella %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "È anche possibile importare le foto in uno dei modi seguenti:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Non _mostrare più questo messaggio"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importa le foto dalla libreria %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(aiuto)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "anno%smese%sgiorno"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "anno%smese"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "anno%smese-giorno"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "anno-mese-giorno"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalizzata"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Modello non valido"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"È possibile copiare le foto nella propria libreria o importarle senza "
+"copiarle."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_pia foto"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "Importa _senza copiare"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importa nella libreria"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Rimuovi dalla libreria"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Rimozione foto dalla libreria"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Rimozione delle foto dalla libreria"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Verrà rimossa la foto o il video dalla libreria di Shotwell. Spostare anche "
+"il file nel cestino di sistema?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+msgstr[1] ""
+"Verranno rimosse %d foto o video dalla libreria di Shotwell. Spostare anche "
+"i file nel cestino di sistema?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Verrà rimosso il video dalla libreria di Shotwell. Spostare anche il file "
+"nel cestino?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+msgstr[1] ""
+"Verranno rimossi %d video dalla libreria di Shotwell. Spostare anche i file "
+"nel cestino?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Verrà rimossa la foto dalla libreria di Shotwell. Spostare anche il file nel "
+"cestino di sistema?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+msgstr[1] ""
+"Verranno rimosse %d foto dalla libreria di Shotwell. Spostare anche i file "
+"nel cestino di sistema?\n"
+"\n"
+"Questa azione non può essere ripristinata."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Non è possibile spostare la foto o il video nel cestino. Eliminare il file?"
+msgstr[1] ""
+"Non è possibile spostare %d foto o video nel cestino. Eliminare i file?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Impossibile eliminare la foto o il video."
+msgstr[1] "Impossibile eliminare %d foto o video."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Cartelle"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etichette"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Successo"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Errore file"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Impossibile decodificare il file"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Errore del database"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Importazione annullata dall'utente"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Non è un file"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Il file esiste già nel database"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Formato del file non supportato"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Non è un file immagine"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Disco guasto"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disco pieno"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Errore fotocamera"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Errore scrittura file"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importazione non riuscita (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificata"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto precedente"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Foto successiva"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "File sorgente della foto mancante: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Visualizza"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "S_trumenti"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Foto _precedente"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto precedente"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Foto _successiva"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Foto successiva"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Aum_enta ingrandimento"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumenta l'ingrandimento della foto"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Rid_uci ingrandimento"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Riduce l'ingrandimento della foto"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Adatta a _pagina"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Ingrandisce la foto per adattarla sullo schermo"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Ingrandisce la foto al 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Ingrandisce la foto al 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Developer"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Impossibile esportare %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Database %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Impossibile proseguire con l'importazione da %s a causa di un errore:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Provare l'importazione da un altro servizio selezionandone uno dal menù qui "
+"sopra."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importazione dati"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Non è stato abilitato alcun plugin d'importazione.\n"
+"\n"
+"Per utilizzare la funzionalità di importazione da un'applicazione, è "
+"necessario abilitarne almeno uno. I plugin possono essere abilitati nella "
+"finestra delle preferenze."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "File database:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importa"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importa da applicazione"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importa _da:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Chiudi"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diapositive"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Indietro"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Va alla foto precedente"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Mette in pausa la proiezione"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Successiva"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Va alla foto successiva"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Modifica le impostazioni della proiezione"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Mancano tutti i file delle foto."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Riproduci"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continua la proiezione"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Ritorno all'originale"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Annullamento ritorno all'originale"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Miglioramento"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Annullamento miglioramento"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Creazione nuovo evento"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Rimozione evento"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Spostamento delle foto in un nuovo evento"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Impostazione foto a evento precedente"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Unione"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Separazione"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicazione foto"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Rimozione foto duplicate"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Impossibile duplicare una foto a causa di un errore sul file"
+msgstr[1] "Impossibile duplicare %d foto a causa di errori su file"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Ripristino giudizio precedente"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Aumento giudizi"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Diminuzione giudizi"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Impostazione del developer RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Ripristino precedente developer RAW"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Imposta developer"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Impossibile regolare la foto originale."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Regolazione data e ora"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Annullamento regolazione data e ora"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Una foto originale non può essere regolata."
+msgstr[1] "Le seguenti foto originali non possono essere regolate."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Errore di regolazione dell'ora"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"La regolazione dell'ora non può essere annullata sulla seguente foto."
+msgstr[1] ""
+"La regolazione dell'ora non può essere annullata sulle seguenti foto."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Crea etichetta"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Sposta etichetta «%s»"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Sposta foto nel cestino"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Ripristina le foto dal cestino"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Sposta le foto nel cestino di Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Ripristina le foto nella libreria di Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Spostamento delle foto nel cestino"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Ripristino delle foto dal cestino"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Contrassegna le foto selezionate"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Rimuove il contrassegno dalle foto selezionate"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Contrassegna"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Rimuovi contrassegno"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Bassa (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Media (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alta (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Massima (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nessuna foto/video"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nessuna foto/video trovato"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Impossibile esportare le foto in questa directory."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Impossibile elaborare gli aggiornamenti di monitoraggio: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Riempi l'intera pagina"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 immagini per pagina"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 immagini per pagina"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 immagini per pagina"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 immagini per pagina"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 immagini per pagina"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 immagini per pagina"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Portafoglio (2 × 3 in)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Biglietto (3 × 5 in)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 × 6 in"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 × 7 in"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 × 10 in"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 × 14 in"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 × 20 in"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Portafoglio metrico (9 × 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Cartolina (10 × 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 × 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 × 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 × 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 × 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 × 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Impostazioni immagine"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Stampa..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Impossibile stampare la foto:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Impossibile aprire o creare il database delle foto %s: errore %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Impossibile scrivere sul file del database delle foto:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Errore nell'accedere al file del database:\n"
+" %s\n"
+"\n"
+"L'errore era: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Esporta video"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Impossibile eseguire «Invia a» di Nautilus: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Invia a"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Impossibile esportare lo sfondo su %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Impossibile preparare lo sfondo a diapositive: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Con contrassegno"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Cestino"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Il cestino è vuoto"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Elimina"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Eliminazione foto"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "File mancanti"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Eliminazione..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Ultima importazione"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importa dalla cartella..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importa foto dal disco nella libreria"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importa da a_pplicazione..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordina e_venti"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "S_vuota cestino"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Elimina tutte le foto dal cestino"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Visualizza eve_nto per la foto"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "Tr_ova"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Trova foto e video in base a criteri di ricerca"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_File"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Modifica"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "F_oto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "F_oto"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_ti"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Eti_chette"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "A_iuto"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informazioni di _base"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Visualizza le informazioni di base per la selezione"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informazioni e_stese"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Visualizza le informazioni estese per la selezione"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Barra di ricerca"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Visualizza la barra di ricerca"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Riquadro laterale"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Visualizza il riquadro laterale"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Crescente"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Ordina le foto in ordine crescente"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_ecrescente"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Ordina le foto in ordine decrescente"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importa dalla cartella"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Svuota cestino"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Svuotamento cestino..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Il programma è configurato per importare le foto nella directory home.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Posizione libreria"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Impossibile importare le foto da questa directory."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Aggiornamento libreria..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Preparazione per l'importazione automatica delle foto..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Importazione automatica delle foto..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Scrittura dei metadati nei file..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Libreria"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importazione..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Ferma importazione"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Ferma l'importazione delle foto"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Preparazione per l'importazione..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importato %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Salva"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Salva la foto"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Sa_lva come..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Salva la foto con un nome differente"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Stampa la foto con una stampante connessa al computer"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s non esiste."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s non è un file."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s non supporta il formato del file di\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "S_alva una copia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Perdere le modifiche per %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Chiudi s_enza salvare"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Errore durante il salvataggio di %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Salva come"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Impossibile monitorare %s: non è una directory (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Gestore di fotografie"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visualizzatore di fotografie"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Ruota in senso _orario"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Ruota"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Ruota in senso orario"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Ruota le foto in senso orario (premere Ctrl per ruotare in senso antiorario)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Ruota in senso _antiorario"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Ruota in senso antiorario"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Ruota le foto in senso antiorario"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Capovolgi ori_zzontalmente"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Capovolge orizzontalmente"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Capovolgi _verticalmente"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Capovolge verticalmente"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Migliora"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Migliora"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Migliora automaticamente l'aspetto della foto"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Ritaglia"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Ritaglia"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Ritaglia la dimensione della foto"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "R_addrizza"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Raddrizza"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Raddrizza la foto"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Occhi-_rossi"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Occhi-rossi"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Riduce o elimina l'effetto occhi-rossi dalla foto"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "Regol_a"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Regola"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Regola il colore e la tonalità della foto"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Ripristina ori_ginale"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Ripristina originale"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Annulla _modifiche esterne"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Ripristina la foto principale"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Imposta come _sfondo"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+"Imposta l'immagine selezionata per essere il nuovo sfondo della scrivania"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Imposta come _sfondo a diapositive..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "Ann_ulla"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Annulla"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "R_ipeti"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Ripeti"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Rinomina evento..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Rendi foto c_hiave per evento"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Rende foto chiave per evento"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nuovo evento"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Nuovo evento"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Sposta foto"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Sposta le foto in un evento"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Unisci eventi"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Unisci"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Unisce gli eventi in uno solo"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Imposta _giudizio"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Imposta giudizio"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Modifica il giudizio della foto"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "A_umenta"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Aumenta giudizio"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Diminuisci"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Diminuisci giudizio"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "Sen_za giudizio"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Senza giudizio"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Imposta senza giudizio"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Impostazione come senza giudizio"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Rimuove qualsiasi giudizio"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Respinta"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Respinta"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Imposta come respinta"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Impostazione come respinta"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Imposta il giudizio a respinta"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Solo _respinte"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Solo respinte"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Mostra solo le foto respinte"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Tutte + _respinte"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Mostra tutte le foto, incluse quelle respinte"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Tutte le f_oto"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Mostra tutte le foto"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Giudizi"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Visualizza il giudizio di ogni foto"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtra foto"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtra foto"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limita il numero di foto mostrate in base a un filtro"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplica"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplica"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Crea un duplicato della foto"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "Esp_orta..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "S_tampa..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Pubblica..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Pubblica"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Pubblica in vari siti web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Modifica _titolo..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "M_odifica commento..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Modifica il commento"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Regola data e ora..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Regola data e ora"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Aggiungi etichette..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "A_ggiungi etichette..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Aggiunge etichette"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "Preferen_ze"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Apri con _editor esterno"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Apri con editor RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Invi_a a..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "In_via a..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Trova..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Trova"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Trova una immagine digitando il testo che appare nel suo nome o nelle "
+"etichette"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Contrassegna"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Rimuovi _contrassegno"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Impossibile lanciare l'editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Aggiungi etichetta «%s»"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Aggiungi etichetta «%s» e «%s»"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Elimina etichetta «%s»"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Elimina etichetta «%s»"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Elimina etichetta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nuovo"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Ri_nomina etichetta «%s»..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Rinomina etichetta «%s» in «%s»"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Rinomina..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Modifica etichette..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modifica etichette"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etichetta foto come «%s»"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etichetta le foto come «%s»"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etichetta la foto selezionata come «%s»"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etichetta le foto selezionate come «%s»"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Rimuovi etichetta «%s» dalla f_oto"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Rimuovi etichetta «%s» dalle f_oto"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Rimuove l'etichetta «%s» dalla foto"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Rimuove l'etichetta «%s» dalle foto"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Impossibile rinominare l'etichetta in «%s» perché esiste già."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Impossibile rinominare la ricerca in «%s» perché esiste già."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Ricerca salvata"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Elimina ricerca"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Modifica..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Ri_nomina..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Rinomina ricerca «%s» in «%s»"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Elimina ricerca «%s»"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Giudizio %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Imposta il giudizio a %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Impostazione giudizio a %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Visualizza %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Mostra solo le foto con un giudizio di %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s o migliore"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Visualizza %s o migliore"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Mostra solo le foto con un giudizio di %s o migliore"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Rimuove le foto selezionate dal cestino"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Rimuove le foto selezionate dalla libreria"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Ripristina"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Ripristina le foto selezionate nella libreria"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Mostra nel file mana_ger"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Apre la cartella della foto selezionata nel gestore di file"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Impossibile aprire nel gestore di file: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Rimuovi dalla libreria"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Sposta nel c_estino"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Seleziona _tutto"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Seleziona tutti gli oggetti"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-H.%M"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-H.%M.%S"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Angolo:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "R_eimposta"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Ritorna alle dimensioni correnti della foto"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Imposta l'area da ritagliare per questa foto"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Ruota il rettangolo del ritaglio tra verticale e orizzontale"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Non vincolato"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Quadrato"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Schermo"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Dimensione originale"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Video SD (4:3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Video HD (16:9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 × 11 in)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 × 17 in)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 × 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 × 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Chiude lo strumento occhi-rossi"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Rimuove ogni effetto occhi-rossi nella regione selezionata"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturazione:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tinta:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Ombre:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Reimposta colori"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Reimposta tutte le regolazioni del colore all'originale"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tinta"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturazione"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Esposizione"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Ombre"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Espansione contrasto"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fissa barra strumenti"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fissa la barra degli strumenti aperta"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Esce dalla modalità schermo intero"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Finestra _normale"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Esci"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "I_nformazioni"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Sc_hermo intero"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Sommario"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Domande _frequenti"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Segnala un problema..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Si è verificato un errore critico durante l'accesso alla libreria di "
+"Shotwell. Impossibile continuare.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Visita il sito web di Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Riccardo Albertini <ssirowain@gmail.com>\n"
+"Emanuele Grande <caccolangrifata@gmail.com>\n"
+"Fantagenius Geniusfanta <fantagenius@hotmail.com>\n"
+"Luca Ferretti <lferrett@gnome.org>\n"
+"Steko <steko@iosa.it>\n"
+"Milo Casagrande <milo@ubuntu.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Impossibile mostrare l'aiuto: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Impossibile esplorare il database dei bug: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Impossibile mostrare le FAQ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "senza titolo"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Dimensione originale"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Larghezza o altezza"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Larghezza"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altezza"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Regola la dimensione delle miniature"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Aumenta l'ingrandimento delle miniature"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Riduce l'ingrandimento delle miniature"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordina f_oto"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Ri_produci video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Apre i video selezionati nel riproduttore video di sistema"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Commenti"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Visualizza i commenti delle foto"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Visualizza le etichette di ogni foto"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Per _titolo"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordina le foto per titolo"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Per _data di scatto"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordina le foto per data di scatto"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Per _giudizio"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordina le foto per giudizio"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Impossibile riprodurre il video selezionato:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d foto/video"
+msgstr[1] "%d foto o video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Visualizza i commenti di ogni evento"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Nessun evento"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nessun evento trovato"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Eventi"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Senza data"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Nessun evento"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Impossibile creare la directory di cache %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Impossibile creare la directory dati %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Immagini"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Impossibile creare la directory temporanea %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Impossibile creare la sottodirectory dati %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nessuno)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nessuno"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Casuale"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transizioni diapositive"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Impossibile generare un file temporaneo per %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Esportazione"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Il file %s esiste già. Sostituirlo?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Salta"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Sostituisci"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Sostituisci _tutto"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Esporta"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Foto"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Foto RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Foto RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Errore nel caricare il file di interfaccia %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipo"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Pubblicazione"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Le foto o i video selezionati sono stati pubblicati correttamente."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "I video selezionati sono stati pubblicati correttamente."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Le foto selezionate sono state pubblicate correttamente."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Il video selezionato è stato pubblicato correttamente."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "La foto selezionata è stata pubblicata correttamente."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Recupero informazioni sull'account..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Accesso..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Pubblica foto"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "P_ubblica le foto su:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Pubblica video"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "P_ubblica i video su:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Pubblica foto e video"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "P_ubblica le foto e i video su:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Impossibile pubblicare"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Non è possibile pubblicare gli oggetti selezionati perché non risulta "
+"abilitato un plugin di pubblicazione compatibile. Per rimediare a questa "
+"situazione, scegliere <b>Modifica %s Preferenze</b> e abilitare uno o più "
+"plugin di pubblicazione nella scheda <b>Plugin</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Preparazione per il caricamento"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Caricamento %d di %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"Impossibile proseguire con la pubblicazione su %s a causa di un errore:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Provare la pubblicazione su un altro servizio selezionandone uno dal menù "
+"qui sopra."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nuova e_tichetta..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Un file temporaneo necessario per la pubblicazione non è disponibile"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Attualmente non si è connessi a YouTube.\n"
+"\n"
+"Per continuare è necessario aver attivato un account Google e impostarlo per "
+"utilizzare YouTube. È possibile configurare la maggior parte degli account "
+"accedendo con il proprio browser web al sito di YouTube almeno una volta."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Manca un file richiesto per la pubblicazione. La pubblicazione su «YouTube» "
+"non può continuare."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Connessi a YouTube come %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "I video appariranno in «%s»"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Pubblico in elenco"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Pubblico non in elenco"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privato"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Servizi pubblicazione di base"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Attualmente non si è connessi a Flickr.\n"
+"\n"
+"Fare clic su «Login» nel browser web. Sarà necessario autorizzare «Shotwell "
+"Connect» col proprio account Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Si è già stati connessi e disconnessi da Flickr durante questa sessione di "
+"Shotwell.\n"
+"Per continuare la pubblicazione su Flickr, chiudere e riavviare Shotwell, "
+"quindi provare di nuovo la pubblicazione."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Preparazione all'accesso..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Manca un file richiesto per la pubblicazione. La pubblicazione su «Flickr» "
+"non può continuare."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verifica autorizzazione..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Connessi a Flickr come %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"L'account gratuito di Flickr limita la quantità di dati caricabili "
+"mensilmente.\n"
+"Questo mese rimangono a disposizione %d megabyte."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"L'account Pro di Flickr dà la possibilità di caricare foto illimitatamente."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Foto _visibili a:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Video _visibili a:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Foto e video _visibili a:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Chiunque"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Solo amici e famiglia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Solo famiglia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Solo amici"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Solo io"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 × 375 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 × 768 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 × 1536 pixel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 × 3072 pixel"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Creazione album %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Si è verificato un errore durante la pubblicazione su Piwigo. Riprovare."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Inserire l'URL, il nome utente e la password associati alla propria libreria "
+"Piwigo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Impossibile contattare la propria libreria Piwigo. Verificare l'URL inserito."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Nome utente o password non validi. Provare di nuovo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "URL non valido"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Nome utente o password non valido"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Amministratori, Famiglia, Amici, Contatti"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Amministratori, Famiglia, Amici"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Amministratori, Famiglia"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Amministratori"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Attualmente non si è connessi a Picasa Web Album.\n"
+"\n"
+"Fare clic su «Login» nel browser web. Sarà necessario autorizzare «Shotwell "
+"Connect» col proprio account Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Manca un file richiesto per la pubblicazione. La pubblicazione su «Picasa» "
+"non può continuare."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Creazione album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Connessi a Picasa Web Album come %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "I video appariranno in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Le foto appariranno in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Piccola (640 × 480 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Media (1024 × 768 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Consigliata (1600 × 1200 pixel)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 × 1536 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Attualmente non si è connessi a Facebook.\n"
+"\n"
+"Se non si possiede un account di Facebook, lo si può creare durante il "
+"processo di connessione. Durante la connessione, Shotwell Connect potrebbe "
+"chiedere il permesso di caricare le foto e pubblicarle sul profilo "
+"personale. Ciò è necessario per il corretto funzionamento di Shotwell "
+"Connect."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Si è già stati connessi e disconnessi da Facebook durante questa sessione di "
+"Shotwell.\n"
+"Per continuare la pubblicazione su Facebook, chiudere e riavviare Shotwell, "
+"quindi provare di nuovo la pubblicazione."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Grande (2048 pixel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Verifica connessione a Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Manca un file richiesto per la pubblicazione. La pubblicazione su «Facebook» "
+"non può continuare."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Connessi a Facebook come %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Dove pubblicare le foto selezionate?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Dimen_sione di invio:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amici"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Sbriciolamento"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Scacchi"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Cerchi"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Tende"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Strisce"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Orologio"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Cerchio"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transizioni diapositive di base"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Scorrimento"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Dissolvenza"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Quadri"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Servizi importazione di base"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Benvenuti nel servizio d'importazione da F-Spot.\n"
+"\n"
+"Scegliere la libreria da importare selezionando o una di quelle esistenti o "
+"un file di database F-Spot alternativo. "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Benvenuti nel servizio d'importazione da F-Spot.\n"
+"\n"
+"Selezionare un file di database F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Selezionare un file di database F-Spot da importare:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Impossibile aprire il file di database F-Spot selezionato: il file non "
+"sembra esistere o non è un database F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Impossibile aprire il file di database F-Spot selezionato: la versione del "
+"database di F-Spot non è supportata"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Impossibile leggere il file di database F-Spot selezionato: errore nel "
+"leggere la tabella dei tag"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Impossibile leggere il file di database F-Spot selezionato: errore nel "
+"leggere la tabella delle foto"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Sono state trovate %d fotografie nella libreria di F-Spot e stanno per "
+"essere importate. I duplicati verranno rilevati e rimossi automaticamente.\n"
+"\n"
+"È possibile chiudere questa finestra e usare il programma mentre "
+"l'importazione ha luogo."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Libreria F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparazione importazione"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Imposta come sfondo a diapositive"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Genera lo sfondo a diapositive"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Mostra ogni foto per"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "periodo di tempo"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Per quanto tempo ogni foto viene mostrata sullo sfondo della scrivania"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Cerca"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Nome della ricerca:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "Co_mbacia"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "dei seguenti:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Dimensione di stampa</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Usa una dimensione _standard:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Usa una dimensione p_ersonalizzata:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Mantenere proporzioni foto"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "Dimensione _automatica:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titoli</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Stampa i _titoli delle immagini"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Risoluzione pixel</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Converti foto a:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixel per pollice"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etichetta"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Preferenze di Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "bianco"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "nero"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Controllare la presenza di nuovi file nella cartella della _libreria"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadati"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Scrivere etichette, titoli e altri _metadati nei file delle foto"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Visualizzazione"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importare le foto in:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Sfondo:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importazione"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Struttura delle _directory:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Modello:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Esempio:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Rinominare i fil_e importati in minuscolo"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Developer RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Pre_definito:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Editor di f_oto esterno:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Editor RA_W esterno:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Editor esterni"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Plugin"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "Ritar_do:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Effetto _transizione:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Ritardo transizion_e:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Mostra _titolo"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "secondi"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Accedi"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Pubblica in un album _esistente:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Creare un n_uovo album chiamato:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Album nuovo di video e foto _visibili a:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Disconnetti"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Pubblica"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Inserire il numero di conferma che appare dopo l'accesso a Flickr nel "
+"browser web."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Numero di autori_zzazione:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Dimensione foto:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Un album _esistente:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Un _nuovo album con nome:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "E_lencare gli album in una galleria pubblica"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Dimensione prestabilita delle foto:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL della propria libreria foto Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Nome utete"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "Pass_word"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Ricorda la password"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Accedi"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Una categoria _esistente:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Le foto saranno _visibili da:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Dimensioni foto:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Disconnetti"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Impo_stazioni privacy video:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 × 853 pixel"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"«%s» non è una risposta valida per una richiesta di autenticazione OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): impossibile avviare; questo servizio di "
+"pubblicazione non può essere riavviato."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Inserire nome utente e password associati col proprio account Tumblr."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Impossibile caricare l'interfaccia: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Accesso eseguito a Tumblr come %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Polyakov Evgeniy <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visita il sito web Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Attualmente non si è connessi a Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "Indirizzo e_mail"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr "Accesso eseguito a Tumbler come (nome)."
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blog:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Album (o scrivi nuovo):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tipo di accesso:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Disabilita i _commenti"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Proibisci lo scaricamento della foto originale"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..efa7dd5
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,4523 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Hajime Taira <htaira@redhat.com>, 2012-2013
+# kano <kano@na.rim.or.jp>, 2012
+# Kiyoto Hashida <khashida@redhat.com>, 2012
+# kuromabo <md81bird@hitaki.net>, 2011
+# kuromabo <md81bird@hitaki.net>, 2013
+# kuromabo <md81bird@hitaki.net>, 2011, 2012
+# Tiago <burajirugaijin@yahoo.co.jp>, 2011
+# verayin <vera@yorba.org>, 2011
+# Kiyoto Hashida <khashida@redhat.com>, 2012
+# kuromabo <md81bird@hitaki.net>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# kuromabo <md81bird@hitaki.net>, 2011, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-10-01 16:28+0000\n"
+"Last-Translator: Hajime Taira <htaira@redhat.com>\n"
+"Language-Team: Japanese (http://www.transifex.com/projects/p/shotwell/"
+"language/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "イベント %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "カメラ"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "カメラ"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"カメラをアンマウントできません。ファイルマネージャーからカメラのアンマウント"
+"を試してください。"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "既にインポートした写真を隠す"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "インポートされてない写真を表示"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "インポートを開始しますのでお待ちください..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "タイトル(_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "写真のタイトルを表示します"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "選択されたものをインポート(_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "選択した写真をライブラリにインポート"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "すべてインポート(_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "すべての写真をライブラリにインポート"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell がこのカメラにアクセスするため、ファイルシステムからカメラをアンマウ"
+"ントする必要があります。続けますか?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "アンマウント(_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "カメラをアンマウントしてください。"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"カメラが他のアプリケーションによってロックされています。Shotwell はカメラが"
+"ロックされていない時のみアクセスできます。カメラを使用している他のすべてのア"
+"プリケーションを閉じてもう一度試してください。"
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "カメラを利用している他のすべてのアプリケーションを閉じてください。"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"カメラからプレビューを取得できません:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "アンマウント中..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "写真情報を取得中"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s のプレビューを取得中"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "カメラをロックできません: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "カメラから %d 個の写真を削除しますか?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "カメラから %d 個の動画を削除しますか?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "カメラから %d 個の写真/動画を削除しますか?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "カメラから %d 個のファイルを削除しますか?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "保持する(_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "カメラから写真/動画を削除中"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "エラーのためカメラから %d 個の写真/動画を削除できません。"
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "スライドショー(_L)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "スライドショーを開始します"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "写真/動画のエクスポート"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "写真/動画のエクスポート"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "写真のエクスポート"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "写真のエクスポート"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "回転"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "回転を元に戻す"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "左右反転"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "左右反転を元に戻す"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "上下反転"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "上下反転を元に戻す"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "いずれかのテキスト"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "タイトル"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "タグ"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "コメント"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "イベント名"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ファイル名"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "メディアタイプ"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "フラグの状態"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "写真の状態"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "評価"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "日付"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "が次を含む"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "が完全に一致"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "が次で始まる"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "が次で終わる"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "が次を含まない"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "がセットされていない"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "が次である"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "が次でない"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "いずれかの写真"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW画像"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "動画"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "フラグ付き"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "フラグなし"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "以上"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "のみ"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "以下"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "が指定日より後"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "が指定日より前"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "が以下の間"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "から"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "いずれか"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "すべて"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "なし"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "保存された検索"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "新しい保存された検索(_W)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"あなたの写真ライブラリは、このバージョンのShotwellと互換性がありません。ライ"
+"ブラリはShotwell %s (スキーマ %d)で作成されたもののようです。このバージョン"
+"は %s (スキーマ %d)です。最新バージョンのShotwellを利用してください。"
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell は写真ライブラリのバージョンを %s (スキーマ %d)から %s (スキーマ %d)"
+"にアップグレードすることができません。詳しい情報は %s の Shotwell Wikiを確認"
+"してください。"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"あなたの写真ライブラリは、このバージョンのShotwellと互換性がありません。ライ"
+"ブラリはShotwell %s (スキーマ %d)で作成されたもののようです。このバージョン"
+"は %s (スキーマ %d)です。%s を削除してライブラリを消去した上で、写真を再イン"
+"ポートしてください。"
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell のデータベースを検査する際に不明なエラーが発生しました: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell を読み込み中"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwellのプライベートデータのパス"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ディレクトリ"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "変更処理実行時にライブラリのディレクトリを監視しない"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "起動時のプログレスバーを表示できません。"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "アプリケーションのバージョンを表示"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ファイル]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"利用可能なコマンドラインオプションの一覧を表示するには '%s --help' を実行して"
+"ください。\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "今日"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "昨日"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "タイトル:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "アイテム:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d 個のイベント"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d 枚の写真"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d 個の動画"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "日付:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "時刻:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "最古:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "最新:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "サイズ:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "時間:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f 秒"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "現像:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "露出:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "場所:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ファイルサイズ:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "現在の現像:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "オリジナルの画像サイズ:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "カメラのメーカー:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "カメラのモデル:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "フラッシュ:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "焦点距離:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "露出日時:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "露出時間:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "露出補正:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS緯度:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS経度:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "撮影者:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "著作者:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "ソフトウェア:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "コメント"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "拡張情報"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "%2$d 個の写真からタグ \"%1$s\" を削除します。続けますか?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "キャンセル(_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "削除(_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "保存された検索 \"%s\" を削除します。続けますか?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"one: デベロッパーを切り替えると、Shotwell 内のこの写真に加えた全ての変更は元"
+"に戻ります。\n"
+"\n"
+"other: デベロッパーを切り替えると、Shotwell 内のこれらの写真に加えた全ての変"
+"更は元に戻ります。"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "デベロッパーを切り替える (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "動画のエクスポート"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"%s への書き込み権限がないため、Shotwellはこの写真を編集する際にファイルを作成"
+"することができませんでした。"
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ファイルエラーのため以下の写真をエクスポートできません。\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"エクスポートを続けますか?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "続行(_T)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "変更なし"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "現在のフォーマット"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "フォーマット(_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "品質(_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "サイズ変更の基準(_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " ピクセル(_P)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "メタデータのエクスポート"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "詳細を保存..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "詳細を保存"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(その他 %d 個)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "インポート結果のレポート"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d 個のファイルのインポートを試みました。"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "以下の %d 個のファイルのインポートに成功しました。"
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "重複した写真/動画はインポートされませんでした:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "重複する既存のメディアアイテム"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "カメラ側のエラーにより写真/動画はインポートされませんでした:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "エラーメッセージ:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"ファイルが認識できなかったため、写真もしくは動画をインポートできませんでした:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Shotwellが理解できる形式ではなかったため、写真と動画をインポートできませんで"
+"した:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Shotwell がライブラリにコピーできないため、写真/動画をインポートできませんで"
+"した:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s をコピーできません。\n"
+"\tコピー先 %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "ファイルが壊れているため、写真とビデオをインポートできませんでした:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "他の理由により写真/動画はインポートされませんでした:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d 個の重複した写真はインポートされませんでした:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d 個の重複した動画はインポートされませんでした:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d 個の重複した写真/動画はインポートされませんでした:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ファイルまたはハードウェアエラーのため %d 個の写真のインポートに失敗しまし"
+"た:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ファイルまたはハードウェアエラーのため %d 個の動画のインポートに失敗しまし"
+"た:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ファイルまたはハードウェアエラーのため %d 個の写真/動画のインポートに失敗しま"
+"した:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ファイルまたはハードウェアのエラーのため %d 個のファイルのインポートに失敗し"
+"ました:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"写真ライブラリのフォルダーが書き込み可能でないため %d 個の写真のインポートに"
+"失敗しました:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"写真ライブラリのフォルダーが書き込み可能でないため %d 個の動画のインポートに"
+"失敗しました:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"写真ライブラリのフォルダーが書き込み可能でないため %d 個の写真/動画のインポー"
+"トに失敗しました:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"フォトライブラリフォルダーに書き込めなかったので、%d 個のファイルのインポート"
+"に失敗しました。\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "カメラのエラーによって %d 個の写真のインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "カメラのエラーのため %d 個の動画のインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "カメラのエラーのため %d 個の写真/動画のインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "カメラのエラーのため %d 個のファイルのインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "ファイルが壊れているため、 %d 個の写真のインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"ファイルが壊れているため、 %d 個のビデオのインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"ファイルが壊れているため、 %d 個の写真とビデオのインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+"ファイルが壊れているため、%d 個のファイルのインポートに失敗しました:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d 個のサポートされていない写真をスキップしました:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d 個の画像以外のファイルをスキップしました。\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ユーザがキャンセルしたので %d 個の写真をスキップしました:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "ユーザがキャンセルしたので %d 個の動画をスキップしました:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "ユーザがキャンセルしたので %d 個の写真/動画をスキップしました:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "ユーザがキャンセルしたので %d 個のファイルをスキップしました:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d 枚の写真のインポートが完了しました。\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d 個の動画のインポートが完了しました。\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d 個の写真/動画のインポートが完了しました。\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "インポートした写真または動画はありません。\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "インポート完了"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 秒"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 分"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 時間"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 日"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "イベント名の変更"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "名前:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "タイトルの編集"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "イベントコメントの編集"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "写真/動画コメントの編集"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ゴミ箱に捨てる(_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "削除のみ(_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "外部での編集を元に戻しますか?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "外部での編集を元に戻しますか?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"実行すると %d 個の外部ファイルに対して行なったすべての変更点を破棄します。続"
+"けますか?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "外部での編集を元に戻す(_V)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "外部での編集を元に戻す(_V)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "実行するとライブラリから %d 個の写真を削除します。続けますか?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "削除(_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ライブラリから写真を削除"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "ライブラリから写真を削除"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "午前"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "午後"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 時間"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "写真/動画を同じ時間だけずらす(_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "すべての写真/動画をこの時刻に設定する(_A)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "最初の写真ファイルを修正する (_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "最初の写真ファイルを修正する (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "オリジナルのファイルを変更する(_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "オリジナルのファイルを変更(_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "オリジナル: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y年%m月%d日 %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y年%m月%d日 %p %I:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"撮影時刻を以下の時間だけ未来に進めます\n"
+"%d %s %d %s %d %s %d %s"
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"撮影時刻を以下の時間だけ過去に戻します\n"
+"%d %s %d %s %d %s %d %s"
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "日"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "時間"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "秒"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"その他 %d 個"
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "タグ (カンマ区切り):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "ようこそ!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "ようこそ Shotwell へ!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "始めるには、いずれかの方法で写真をインポートしてください:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"<span weight=\\\"bold\\\">ファイル %s をフォルダーからインポート</span> を選"
+"択する"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Shotwell ウィンドウに写真をドラッグアンドドロップする"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "コンピューターにカメラを接続してインポートする"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "%s フォルダーから写真をインポート(_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "いずれかの方法で写真をインポートすることができます:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "このメッセージを再び表示しない(_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "%s ライブラリから写真をインポート"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(ヘルプ)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "年%s月%s日"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "年%s月"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "年%s月-日"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "年-月-日"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "カスタム"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "無効なパターン"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell はライブラリフォルダーに写真をコピーしたり、写真をコピーせずにイン"
+"ポートすることもできます。"
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "写真をコピー(_P)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "元の場所でインポート(_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "ライブラリにインポート"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "ライブラリから削除"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "ライブラリから写真を削除しています"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "ライブラリから写真を削除しています"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"実行すると Shotwell ライブラリから %d 個の写真/動画を削除します。ファイルをデ"
+"スクトップのゴミ箱にも移動しますか?\n"
+"\n"
+"このアクションは元に戻せません。"
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"実行すると Shotwell ライブラリから %d 個の動画を削除します。ファイルをデスク"
+"トップのゴミ箱にも移動しますか?\n"
+"\n"
+"このアクションは元に戻せません。"
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"実行すると Shotwell ライブラリから %d 個の写真を削除します。ファイルをデスク"
+"トップのゴミ箱にも移動しますか?\n"
+"\n"
+"このアクションは元に戻せません。"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d 個の写真/動画をデスクトップのゴミ箱に移動できませんでした。これらのファイ"
+"ルを削除しますか?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d 個の写真/動画を削除できません。"
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "フォルダー"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "タグ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "成功"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ファイルエラー"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ファイルをデコードできません"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "データベースエラー"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ユーザがインポートを中断しました"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ファイルではありません"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ファイルがデータベースにすでに存在します"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "サポートされていないファイル形式です"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "画像ファイルではありません"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ディスク障害です"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ディスクがいっぱいです"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "カメラのエラーです"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ファイル書き込みエラー"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "画像ファイルが壊れています"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "インポートに失敗しました (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "変更済み"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "前の写真"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "次の写真"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "元の写真ファイルが見つかりません: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "表示(_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "ツール(_O)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "前の写真(_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "前の写真"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "次の写真(_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "次の写真"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "拡大(_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "写真の倍率を上げます"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "縮小(_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "写真の倍率を下げます"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "ページに合わせる(_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "写真をズームして画面に合わせます"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "100% ズーム(_1)"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "写真を 100% の倍率にします"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "200% ズーム(_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "写真を 200% の倍率にします"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "現像(_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s をエクスポートできません: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s のデータベース"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "エラーが発生したため %s からのインポートを継続できません:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"他のサービスからインポートするには、上記メニューから1つ選択してください。"
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "データのインポート"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"有効なデータインポートプラグインがありません。\n"
+"\n"
+"アプリケーションからのインポートを利用するには、有効なデータインポートプラグ"
+"インが少なくとも一つは必要です。プラグインは、設定ダイアログで有効にできま"
+"す。"
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "データベースファイル:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "インポート(_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "アプリケーションからインポート"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "メディアからインポート(_F):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "閉じる(_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "設定"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "スライドショー"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "戻る"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "前の写真に戻る"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "一時停止"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "スライドショーの一時停止"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "次へ"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "次の写真に進む"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "スライドショー設定の変更"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "元の写真すべてが見つかりません。"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "再生"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "スライドショーの続行"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "取り消す"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "取り消しを元に戻す"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "強調"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "強調を元に戻す"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "色変換を適用する"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "色変換を元に戻す"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "新規イベントの作成"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "イベントの削除中"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "写真を新しいイベントに移動します"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "写真を以前のイベントに設定します"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "マージ"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "マージを元に戻す"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "写真の複製"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "重複した写真を削除しています"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ファイルエラーのため %d 個の写真を複製できません"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "前の評価に戻す"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "評価を上げる"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "評価を下げる"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW現像の設定"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "以前のRAW現像に戻す"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "現像を設定"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "オリジナルの写真を調整できませんでした。"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "日付と時刻の調整"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "日付と時刻の調整を元に戻す"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "以下のオリジナルの写真は調整できませんでした。"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "時刻調整エラー"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "以下の写真ファイルへの時間調整を元に戻せませんでした。"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "タグの作成"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "タグを \"%s\" に移動"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "写真をゴミ箱に移動する"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ゴミ箱から写真を元に戻す"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "写真を Shotwell のゴミ箱に移動します"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "写真を Shotwell ライブラリに戻します"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "写真をゴミ箱へ移動しています"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "ゴミ箱から写真を元に戻しています"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "選択された写真にフラグを付ける"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "選択された写真のフラグを外す"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "選択された写真にフラグを付けています"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "選択された写真のフラグを外しています"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "フラグを付ける"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "フラグを外す"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "低 (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "中 (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "高 (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "最高 (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "写真/動画がありません"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "写真/動画が見つかりません"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "写真をこのディレクトリにエクスポートできません。"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "アップデートの監視を処理できませんでした: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "ページ全体に合わせる"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ページあたり画像2枚"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ページあたり画像4枚"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ページあたり画像6枚"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ページあたり画像8枚"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ページあたり画像16枚"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ページあたり画像32枚"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "インチ"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "センチメートル"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "ウォレット (2 x 3 インチ)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "ノートカード (3 x 5 インチ)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 インチ"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 インチ"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 インチ"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 インチ"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 インチ"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "メトリック・ウォレット (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "ポストカード (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "画像の設定"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "印刷しています..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"写真を印刷できません:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "写真データベース %s を開く/作成できません: エラーコード %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"写真データベースファイルに書き込めませんでした:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"データベースのアクセス時にエラーが発生しました:\n"
+" %s\n"
+"\n"
+"エラーは以下の通り: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "動画のエクスポート"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To を起動できません: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "送信する"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s へバックグランドのエクスポートができません: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "デスクトップ・スライドショーを準備できません: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "フラグ付き"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ゴミ箱"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ゴミ箱は空です"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "削除"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "写真を削除しています"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "見つからないファイル"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "削除中..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "最後にインポートしたもの"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "フォルダーからインポート(_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ディスクからライブラリに写真をインポートします"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "アプリケーションからインポート(_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "イベントの並び替え(_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ゴミ箱を空にする(_R)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "ゴミ箱にあるすべての写真を削除します"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "写真のイベントを表示(_N)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "検索(_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "検索条件で写真とビデオを探す"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ファイル(_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "編集(_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "写真(_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "写真(_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "イベント(_T)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "タグ(_G)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "ヘルプ(_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "基本情報(_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "選択した写真の基本情報を表示します"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "拡張情報(_X)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "選択した写真の拡張情報を表示します"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "検索バー(_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "検索バーを表示"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "サイドバー(_I)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "サイドバーを表示します"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "昇順(_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "写真を昇順で並び替える"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "降順(_E)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "写真を降順で並び替える"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "フォルダーからインポート"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ゴミ箱を空にする"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "ゴミ箱を空にしています..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell はホームディレクトリに写真をインポートするよう設定されています。\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "ライブラリの場所"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "このディレクトリから写真のインポートができませんでした."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "ライブラリの更新中..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "写真の自動インポートを行なおうとしています..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "写真の自動インポート..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "ファイルにメタデータを書き込んでいます..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ライブラリ"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "インポート中..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "インポートを停止(_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "画像のインポートを停止"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "インポートしようとしています..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s をインポートしました"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "保存(_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "写真を保存"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "別名で保存(_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "写真を別の名前で保存します"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "コンピューターに接続されたプリンターに写真を印刷します"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s は存在しません。"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s はファイルではありません。"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s は以下のファイルフォーマットをサポートしていません。\n"
+"%s"
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "コピーを保存(_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s への変更を破棄しますか?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "保存せずに閉じる(_W)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s に保存する際にエラーが発生しました: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "別名で保存"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s をモニタできません: ディレクトリではありません (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Shotwell 写真管理ツール"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "写真ビューアー"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "右回転(_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "回転"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "右回転"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "写真を右に回転します (Ctrlを押すと左に回転)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "左回転(_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "左回転"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "写真を左に回転します"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "左右反転(_Z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "左右反転"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "上下反転(_C)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "上下反転"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "強調(_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "強調"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "自動的に写真の見た目を改善します"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "色調整をコピーする(_C)"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "色調整をコピーする"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "色調整をコピーして写真へ適用する"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "色調整を貼り付ける(_P)"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "色調整を貼り付ける"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "色調整をコピーして選択された写真へ適用する"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "切り抜き(_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "切り抜き"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "写真サイズを切り抜きます"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "傾き補正(_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "傾き補正"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "写真の傾きを補正します"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "赤目(_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "赤目"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "写真のすべての赤目現象を軽減または除去します"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "調整(_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "調整"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "写真の色とトーンを調整します"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "オリジナルに戻す(_V)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "オリジナルに戻す"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "外部での編集を元に戻す(_D)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "原版の写真に戻す"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "デスクトップの背景に設定(_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "選択した画像をデスクトップの壁紙として設定します"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "デスクトップ・スライドショーに設定(_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "元に戻す(_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "元に戻す"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "やり直し(_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "やり直し"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "イベント名の変更(_N)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "イベントのキー写真に設定(_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "イベントのキーとなる写真に設定します"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "新しいイベント(_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "新しいイベント"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "写真を移動"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "写真をイベントに移動します"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "イベントをマージ(_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "マージ"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "イベントを一つにまとめる"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "評価の設定(_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "評価の設定"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "写真の評価を変更"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "上げる(_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "評価を上げる"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "下げる(_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "評価を下げる"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "未評価(_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "評価なし"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "未評価にする"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "未評価として設定"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "評価を削除する"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "対象外(_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "対象外"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "対象外に設定"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "対象外として設定"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "対象外に設定します"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "対象外のみ(_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "対象外のみ"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "対象外の写真のみ表示します"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "すべて+対象外(_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "評価対象外のものを含め、すべての写真を表示します"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "すべての写真(_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "すべての写真を表示します"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "評価(_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "写真の評価を表示します"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "写真のフィルタリング(_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "写真のフィルタリング"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "フィルタによって表示する写真の数を制限します"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "複製(_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "複製する"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "写真の複製を作成する"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "エクスポート(_E)..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "印刷(_P)..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "公開(_B)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "公開先"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "色々なウェブサイトに公開します"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "タイトルを編集(_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "コメントの編集(_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "コメントの編集"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "イベントコメントの編集(_C)..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "日付と時刻の調整(_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "日付と時刻の調整"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "タグの追加(_T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "タグを追加する (_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "タグの追加"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "設定(_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "外部エディターで開く(_X)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAWエディターで開く(_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "送信(_T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "送信先 (_O)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "検索(_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "検索"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "名前やタグに表示されているテキストを入力して画像を検索します"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "フラグを付ける(_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "フラグを外す(_F)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "エディターを起動できません: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "タグ \"%s\" を追加"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "タグ \"%s\" や \"%s\" を追加"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "タグ \"%s\" を削除(_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "タグ \"%s\" を削除します"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "タグの削除"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "新規(_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "タグ名 \"%s\" の変更(_N)..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "タグ名 \"%s\" を \"%s\" に変更します"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "名前を変更(_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "タグの変更(_Y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "タグの変更"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "写真に \"%s\" というタグを付ける"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "写真にタグ \"%s\" を付ける"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "選択された写真に \"%s\" というタグを付ける"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "選択された写真にタグ \"%s\" を付ける"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "写真からタグ \"%s\" を削除(_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "写真からタグ \"%s\" を削除(_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "写真からタグ \"%s\" を削除します"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "写真からタグ \"%s\" を削除します"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "すでにタグが存在しているのでタグを \"%s\" に変更できません。"
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "すでに検索が存在しているのでタグを \"%s\" に変更できません。"
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "保存された検索"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "検索を削除"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "編集(_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "名前を変更(_N)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "検索 \"%s\" の名前を \"%s\" に変更"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "検索 \"%s\" を削除"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "評価 %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "評価を %s に設定"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "評価を %s に設定"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s を表示"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "評価が %s の写真のみ表示"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s 以上"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s 以上のものを表示します"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s 以上の評価の写真のみ表示します"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "選択された写真をゴミ箱から削除"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "選択されたファイルをライブラリから削除"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "元に戻す(_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "選択された写真をライブラリに戻します"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ファイルマネージャーで開く(_G)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ファイルマネージャーで選択された写真のディレクトリを開きます"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ファイルマネージャーで開けません: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "ライブラリから削除(_E)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ゴミ箱へ移動(_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "すべて選択(_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "すべてのアイテムを選択します"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%p %-I:%M"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%p %-I:%M:%S"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%Y年%m月%d日 (%a)"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%m月%d日 (%a)"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "角度:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "リセット(_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "現在の写真サイズに戻す"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "この写真の切り抜きを設定"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "切り抜く長方形の縦方向と横方向を回転させます"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "制限なし"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "正方形"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "画面"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "オリジナルのサイズ"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD動画サイズ (4:3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD動画サイズ (16:9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "赤目ツールを閉じる"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "選択された範囲で赤目現象を取り除きます"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "彩度:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "色合い:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "温度:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "シャドウ:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "ハイライト:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "色をリセット"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "すべての色調整をオリジナルの状態に戻す"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "温度"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "色合い"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "彩度"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "露出"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "シャドウ"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "ハイライト"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "コントラストの拡張"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ツールバーを固定"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ツールバーを開いた状態で固定します"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "全画面表示の解除"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "全画面表示の解除(_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "終了(_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "情報(_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "全画面表示(_C)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "目次(_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "FAQ(_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "問題を報告する (_R)..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell のライブラリにアクセスする際に致命的なエラーが発生しました。"
+"Shotwell を続行できません。\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba ウェブサイトを訪問する"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Shushi Kurose <md81bird@hitaki.net>\n"
+"Slackhideo <burajirugaijin@yahoo.co.jp>\n"
+"Yohsuke Ooi <meke@momonga-linux.org>\n"
+"Hajime Taira <htaira@redhat.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "ヘルプを表示できません: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "バグデータベースへ移動できません: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQを表示できません: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "タイトルなし"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "オリジナルのサイズ"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "幅または高さ"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "幅"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "高さ"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "サムネイルのサイズを調整します"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "サムネイルの倍率を上げます"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "サムネイルの倍率を下げます"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "写真の並び替え(_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "動画の再生(_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "システムの動画プレイヤーで選択された動画を開きます"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "コメント(_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "各写真のコメントを表示します"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "写真のタグを表示します"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "タイトルで並び替え(_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "写真をタイトルで並び替える"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "撮影日で並び替え(_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "写真を撮影日で並び替える"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "評価で並び替え(_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "写真を評価で並び替える"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell は選択された動画を再生できませんでした:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d 個の写真/動画"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "各イベントのコメントを表示します"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "イベントなし"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "イベントが見つかりません"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "イベント"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "日付なし"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y年"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "イベントなし"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "キャッシュディレクトリ %s を作成できません: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "データディレクトリ %s を作成できません: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "画像"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "一時ディレクトリ %s を作成できません: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "データサブディレクトリ %s を作成できません: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(なし)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "なし"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "ランダム"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "スライドショーのトランジション"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s 用の一時ファイルを作成できません: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "エクスポート中"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ファイル %s はすでに存在します。置き換えますか?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "スキップ(_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "置き換える(_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "すべて置き換える(_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "エクスポート"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "写真"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "動画"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW画像"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW画像"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ファイル %s の読み込みエラー: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "種類"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "公開"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "選択された写真/動画の公開が完了しました。"
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "選択された動画の公開が完了しました。"
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "選択された写真の公開が完了しました。"
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "選択された動画の公開が完了しました。"
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "選択された写真の公開が完了しました。"
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "アカウント情報を取得しています..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "ログイン中..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "写真の公開"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "写真の公開先(_T):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "動画の公開"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "動画の公開先(_T)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "写真と動画の公開"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "写真と動画の公開先(_T)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "公開できません"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"一致する公開プラグインが有効になっていないため、Shotwellは選択されたアイテム"
+"を公開できません。これを直すには、<b> 設定 %s 編集</b> を選択して、<b>プラグ"
+"イン</b> タブにあるいずれかの公開プラグインを有効にしてください。"
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "アップロードの準備中…"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "アップロード中… %d / %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "エラーが発生したため %s への公開を続けることができません。"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "他のサービスへの公開を試すには、上のメニューから選択してください。"
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "新規タグ(_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"発行に必要な一時ファイルが使用できません"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"この Shotwell のセッション中に、すでに Google サービスへログインとログアウト"
+"を行なっています。\n"
+"\n"
+"Google サービスへの公開を続けるには、Shotwell を終了して再起動してから、もう"
+"一度公開してみてください。"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"現在 YouTube にログインしていません。\n"
+"\n"
+"続けるには、Google アカウントにサインアップした上で、YouTube を利用するための"
+"設定を行う必要があります。少なくとも一度ブラウザを使って YouTube のサイトにロ"
+"グインしておけば、ほとんどのアカウントを設定することができます。"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"発行に必要なファイルが利用できません。 Youtube への発行は継続できません。"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "%s として YouTube にログインしています。"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "動画は '%s' で表示されます"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "公開"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "限定公開"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "非公開"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "メインの公開サービス"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"現在 Flickr にログインしていません。\n"
+"\n"
+"ログインをクリックして、ウェブブラウザーで Flickr にログインしてください。"
+"Flickr アカウントへのリンクに接続するには、Shotwell を認証する必要がありま"
+"す。"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"この Shotwell のセッション中に、すでに Flickr へログインとログアウトを行なっ"
+"ています。\n"
+"Flickr への公開を続けるには、Shotwell を終了して再起動してから、もう一度公開"
+"してみてください。"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "ログイン準備中..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"発行に必要なファイルが利用できません。Flickr への発行は継続できません。"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "認証の確認中..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"%s として Flickr にログインしています。\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"あなたのフリーな Flickr アカウントは月ごとのアップロード可能なデータに制限が"
+"あります。\n"
+"今月は、あなたは %d メガバイトのアップロードの割り当てが残っています。"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"あなたの Flickr Pro アカウントは無制限のアップロード容量が与えられています。"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "写真を公開する範囲(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "動画を公開する範囲(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "写真と動画を公開する範囲(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "全体"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "友人と家族のみ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "家族専用"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "友達専用"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "自分のみ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 ピクセル"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 ピクセル"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 ピクセル"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 ピクセル"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "アルバム %s を作成しています..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigo へ公開中にエラーが発生しました。再試行してください。"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"ご使用の Piwigo フォトライブラリの URL と、このライブラリ用の Piwigo アカウン"
+"トに関連しているユーザー名及びパスワードを入力して下さい。"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell はご使用の Piwigo フォトライブラリに通信できません。入力した URL を"
+"確認して下さい。"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"ユーザー名もしくはパスワードが違います。再試行してください。"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "無効な URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"ユーザー名かパスワードが無効です"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "管理者、家族、友達、連絡先"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "管理者、家族、友達"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "管理者、家族"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "管理者"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"現在、Picasa Web Albumsにログインしていません。\n"
+"\n"
+"ご使用のブラウザで「ログイン」をクリックして Picasa Web Albums にログインし"
+"て下さい。Picasa Web Albums のアカウントにリンクする為には、Shotwell Connect "
+"を認証する必要があります。"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"発行に必要なファイルが利用できません。Picasa への発行は継続できません。"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "アルバムの作成中..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "%s として Picasa Web Album にログインしています。"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "動画の表示先:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "写真の表示先:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "小 (640 x 480 ピクセル)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "中 (1024 x 768 ピクセル)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "推奨 (1600 x 1200 ピクセル)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"現在 Facebook にログインしていません。\n"
+"\n"
+"Facebook アカウントを持っていないのであれば、ログイン処理の間にアカウントを作"
+"ることができます。ログイン中に、Shotwell Connect で写真のアップロードの許可や"
+"フィードの公開について確認が行われるでしょう。これらの許可は Shotwell "
+"Connect の機能として必要です。"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"この Shotwell のセッション中に、すでに Facebook へログインとログアウトを行"
+"なっています。\n"
+"Facebook への公開を続けるには、Shotwell を終了して再起動してから、もう一度公"
+"開してみてください。"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "標準 (720ピクセル)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "大 (2048ピクセル)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook への接続テスト中..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"発行に必要なファイルが利用できません。Facebook への発行は継続できません。"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"%s として Facebook にログインしています。\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "選択された写真をどこに公開しますか?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "アップロードサイズ(_S):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "友達"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "崩壊"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "チェス"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "円形"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ブラインド"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "ストライプ"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "クロック"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "サークル"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "メインのスライドショーのトランジション"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "スライド"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "フェード"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "正方形"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "コアデータインポートサービス"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot ライブラリインポートサービスへ、ようこそ!\n"
+"\n"
+"まずはインポートしたいライブラリを選びます。Shotwell によって検出された既存の"
+"ライブラリの中、もしくは、その他の F-Spot データベースファイルを1つ選択してく"
+"ださい。"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spotライブラリインポートサービスにようこそ。\n"
+"\n"
+"F-Spotデータベースファイルを選択してください。"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "インポートするF-Spotデータベースファイルを手動で選択:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"選択された F-Spot データベースファイルが開けません: ファイルが存在しないか、"
+"F-Spot データベースではありません。"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"選択された F-Spot データベースファイルが開けません: このバージョンの F-Spot "
+"データベースファイルは Shotwell ではサポートしていません。"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"選択された F-Spot データベースファイルが読み込めません: tags テーブルを読み込"
+"み中にエラーが発生"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"選択された F-Spot データベースファイルが読み込めません: photos テーブルを読み"
+"込み中にエラーが発生"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell は F-Spot ライブラリの中から %d 枚の写真を見つけ、そして、インポート"
+"しました。なお、重複している写真は自動検出して削除します。\n"
+"\n"
+"このダイアログを閉じることができます。Shotwell を使用している間にインポート作"
+"業がバックグラウンドで処理されます。"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot ライブラリ: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "インポートの準備中"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "デスクトップ・スライドショーに設定"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "デスクトップの背景スライドショーを作成"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "写真を表示する時間 :"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "時間"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "デスクトップの背景に写真を表示する時間です"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "検索"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "検索の名前(_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "以下のうち(_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "のものにマッチ:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>印刷する画像サイズ</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "標準サイズを使用(_S):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "カスタムサイズを使用(_U):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "写真のアスペクト比に合わせる(_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "自動サイズ調整(_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>タイトル</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "画像のタイトルを印刷(_T)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>ピクセル解像度</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "写真の出力先(_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ピクセル/インチ"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "ラベル"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell の設定"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "白"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "黒"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "ライブラリのディレクトリで新規ファイルを監視する(_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "メタデータ"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "タグ、タイトル、他のメタデータをファイルに書き込む(_M)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "表示"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "写真のインポート先(_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "背景(_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "インポート"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "ディレクトリ構造(_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "パターン(_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "例:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "インポートしたファイル名を小文字にする(_E)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW現像"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "デフォルト(_F):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "外部のフォトエディター(_X):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "外部のRAWエディター(_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "外部のエディター"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "プラグイン"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "間隔(_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "トランジションの効果(_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "トランジションの間隔(_E):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "タイトルを表示する (_I)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "秒"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "ログイン(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "既存のアルバムで公開する(_X):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "新しいアルバム名(_N):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "動画と新しいフォトアルバムを公開する範囲(_V):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "アップロード前に撮影場所やカメラ、その他の識別情報を削除する(_R)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "ログアウト(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "公開(_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"ウェブブラウザーで Flickr にログインした後に表示された確認番号を入力してくだ"
+"さい。"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "認証番号(_N):"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "写真サイズ (_S):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "既存のアルバム(_E):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "新しいアルバム名(_N):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "アルバムを一般公開ギャラリーに追加する(_I)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "プリセットの写真サイズ(_S):"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "PiwigoフォトライブラリでのURL(_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "ユーザー名(_N)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "パスワード(_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "パスワードを記憶(_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "ログイン"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "既存のカテゴリ(_E):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "写真が表示可能(_V):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "写真のサイズ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "アルバムコメント:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"タイトルが設定され、コメントが設定されていない場合、タイトルをコメントに使用"
+"する(_I)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "タグをアップロードしない(_D)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "ログアウト"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "動画のプライバシー設定(_S):"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 ピクセル"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' は、OAuth の認証要求に対して有効な応答ではありません"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): 開始できません; このパブリッシャーは開始不能です。"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"ご使用のTumblr アカウントに関連したユーザー名とパスワードを記入します。"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI を読み込めません: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"%s としてTumblr にログインしています。\n"
+"\n"
+"\n"
+"\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "ウェブサイト Yandex.Fotki を見てください"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "現在 Yandex.Fotki にログインしていません。"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "メールアドレス (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"(名前) としてTumblr にログインしています。⏎ ⏎ (このラベルの文字列は充填され"
+"て、コード内部に設定されますので、 ⏎ ここで加える変更は表示されません)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ブログ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "アルバム(または新規書き込み)(_A):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "アクセスタイプ(_T):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "コメント不可(_C)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "オリジナル写真のダウンロード禁止(_F)"
diff --git a/po/kk.po b/po/kk.po
new file mode 100644
index 0000000..23985f2
--- /dev/null
+++ b/po/kk.po
@@ -0,0 +1,4489 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-21 08:00+0000\n"
+"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
+"Language-Team: Kazakh (http://www.transifex.com/projects/p/shotwell/language/"
+"kk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: kk\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Оқиға %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Камералар"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Камера"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Камераны тіркеуден босату мүмкін емес. Камераны файлдар басқарушысынан "
+"тіркеуден босатып көріңіз."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Алдыңда импортталған фотоларды жасыру"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Тек импортталмаған фотоларды көрсету"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Импортты бастау, күте тұрыңыз..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Атаулар"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Әр фотоның атауын көрсету"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Таңд_алғанды импорттау"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Таңдалған фотоларды жинағыңызға импорттау"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Барл_ығын импорттау"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Барлық фотоларды жинағыңызға импорттау"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell камераға қолын жеткізу үшін оны алдымен тіркеуден босату керек. "
+"Жалғастыру керек пе?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Тіркеуден босату"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Камераны тіркеуден босатыңыз."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Камераны басқа бір қолданба ұстап тұр. Shotwell камераға тек ол бос кезінде "
+"ғана қолын жеткізе алады. Камераны қолданып тұрған барлық қолданбалады "
+"жабыңыз да, әрекетті қайталап көріңіз."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Камераны қолданып тұрған барлық қолданбалады жабыңыз."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Камерадан алдын-ала қарауды алу мүмкін емес:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Тіркеуден босатылуда..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Фото ақпаратын алу"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s үшін алдын-ала қарауды алу"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Камераны блоктау мүмкін емес: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Камерадан бұл %d фотоны өшіру керек пе?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Камерадан бұл %d видеоны өшіру керек пе?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Камерадан бұл %d фото/видеоны өшіру керек пе?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Бұл %d файлды камерадан өшіру керек пе?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "Ұ_стау"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Камерадан фотолар/видеоларды өшіру"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Қателер салдарынан камерадан %d фото/видеоны өшіру мүмкін емес."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "С_лайдшоу"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Слайдшоуды ойнату"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Фото/видеоны экспорттау"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Фото/видеоларды экспорттау"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Фото(лар) экспорттау"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Фотоларды экспорттау"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Айналдыру"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Айналдыруды болдырмау"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Горизонталды айналдыру"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Горизонталды айналдыруды болдырмау"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Вертикалды айналдыру"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Вертикалды айналдыруды болдырмау"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Кез-келген мәтін"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Атауы"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Тег"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Түсіндірме"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Оқиға аты"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Файл аты"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Медиа түрі"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Жалауша күйі"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Фотосурет күйі"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Рейтинг"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Күн"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "құрамында бар"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "дәл сәйкес"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "басталады"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "аяқталады"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "құрамында жоқ"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "орнатылмаған"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "екен"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "емес"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "кез-келген фото"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "raw фото"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "видео"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "бар"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "жоқ"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "өзгертулер"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "ішкі өзгертулер"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "сыртқы өзгертулер"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "жалаушасы бар"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "жалаушасы жоқ"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "және көбірек"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "тек"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "және азырақ"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "кейін"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "дейін"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "арасында"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "және"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "кез-келген"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "барлығы"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ешнәрсе"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Сақталған іздеулер"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Ж_аңа сақталған іздеу..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Сіздегі фото жинағыңыз Shotwell-дың осы нұсқасымен үйлеспейді. Ол жинақ "
+"Shotwell %s нұсқасымен жасалған сияқты (схема %d). Қазіргі нұсқасы - %s "
+"(схема %d). Shotwell-дың соңғы нұсқасын қолданыңыз."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell сіздің фото жинағыңызды %s нұсқасынан (схема %d) %s нұсқасына "
+"(схема %d) дейін жаңарта алмады. Көбірек білу үшін Shotwell Wiki оқыңыз: %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Сіздегі фото жинағыңыз Shotwell-дың осы нұсқасымен үйлеспейді. Ол жинақ "
+"Shotwell %s нұсқасымен (схема %d) жасалған сияқты. Қазіргі нұсқасы - %s "
+"(схема %d). %s өшіру арқылы жинағыңызды өшіріңіз де, фотоларды қайта "
+"импорттаңыз."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell дерекқорын тексеру талабын жасау кезіндегі белгісіз қате: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell жүктелуде"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell жеке деректеріне дейінгі жол"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "БУМА"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Жинақ бумасын өзгерістерге бақылап отырмау"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Іске қосылу үрдіс жолағын көрсетпеу"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Қолданба нұсқасын көрсету"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ФАЙЛ]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Командалық жолдың барлық опцияларын қарау үшін '%s --help' енгізіңіз.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Бүгін"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Кеше"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Атауы:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Элементтер:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d оқиға"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d фото"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d видео"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Күні:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Уақыты:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Қайдан:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Қайда:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Өлшемі:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Ұзақтығы:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f секунд"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Өндіруші:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Экспозиция:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Орналасуы:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Файл өлшемі:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Ағымдағы өндеуде:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Бастапқы өлшемдері:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Камера моделі:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Камера моделі:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Жарқылдау:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Фокустық қашықтығы:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Экспозиция күні:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Экспозиция уақыты:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Экспозицияны келтіру:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS ендігі:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS бойлығы:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Орындаушы:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Бағд. қамтамасы:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Түсіндірме:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Кеңейтілген ақпараты"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "\"%s\" тегі %d фотодан өшіріледі. Жалғастыру керек пе?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "Ба_с тарту"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "Ө_шіру"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Бұл әрекет \"%s\" сақталған іздеуін өшіреді. Жалғастыру керек пе?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Өндірушіні ауыстыру әрекеті Shotwell ішінде бұл фотосуреттерге жасалған "
+"барлық өзгерістерді болдырмайды"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "Өндірушіні ауы_стыру"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Видеоны экспорттау"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell бұл фотосуретті түзету үшін керек файлды жасай алмады, өйткені "
+"сізде %s ішіне жазу құқығыңыз жоқ."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Келесі фотоны файл қатесі нәтижесінен экспорттау мүмкін емес.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Экспорттауды жалғастыруды қалайсыз ба?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Жа_лғастыру"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Түрлендірілмеген"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Ағымдағы"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "Пі_шімі:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Сапасы:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Масштабтау шегі:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _пиксель"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Метаақпаратты экспорттау"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Ақпаратын сақтау..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Ақпаратын сақтау"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(және тағы да %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Импорттау нәтижелері"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d файлды импорттау талабы жасалды"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Осылардан, %d файл сәтті импортталды."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Импортталмаған қайталанатын фото/видеолар:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "бар болып тұрған медиа элементінің көшірмесі"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Фото/видеолар камера қатесі салдарынан импортталмады:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "қате хабарламасы:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "Файлдар фото не видео ретінде танылмағандықтан импортталмады:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Фото/видеолар Shotwell түсінетін пішімде емес болғандықтан импортталмады:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Фото/видеолар Shotwell оларды өз жинағына көшіре алмаған себебінен "
+"импортталмады:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s көшіру мүмкін емес\n"
+"\t%s ішіне"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Фото/видеолар зақымдалған болғандықтан импортталмады:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Фото/видеолар келесі себептермен импортталмады:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d қайталанатын фото импортталмаған:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d қайталанатын видео импортталмады:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d қайталанатын фото/видео импортталмады:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d фото файл не құрылғылық қате салдарынан импортталмаған:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d видео файл не құрылғылық қате салдарынан импортталмаған:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d фото/видео файл не құрылғылық қате салдарынан импортталмады:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d файл файлдық не құрылғылық қате салдарынан импортталмады:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d фотосуретті импорттау қате, өйткені фото жинақ бумасына жазу құқығы жоқ:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d видеоны импорттау қате, өйткені фото жинақ бумасына жазу құқығы жоқ:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d фото/видеоны импорттау қате, өйткені фото жинақ бумасына жазу құқығы "
+"жоқ:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d файл фото жинақ бумасына жазуға болмаған соң импортталмады:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d фото камера қате салдарынан импортталмаған:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d видео камера қате салдарынан импортталмады:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d фото/видео камера қате салдарынан импортталмады:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d файл камера қатесі салдарынан импортталмады:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d фото зақымдалған болғандықтан импортталмады:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d видео зақымдалған болғандықтан импортталмады:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d фото/видео зақымдалған болғандықтан импортталмады:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d файл зақымдалған болғандықтан импортталмады:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d қолдауы жоқ фотодан аттап өттік:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d сурет емес файлдан аттап өттік.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d фото пайдаланушы бас тарқан соң импортталмады:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d видео пайдаланушы бас тартқан соң импортталмады:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d фото/видео пайдаланушы бас тартқан соң импортталмады:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d файл пайдаланушы бас тартқан соң аттап өтілді:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d фото сәтті импортталды.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d видео сәтті импортталды.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d фото/видео сәтті импортталды.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ешбір фото не видео импортталмады.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Импорт аяқталды"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунд"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минут"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d сағат"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "%d күн"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Оқиға атын ауыстыру"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Аты:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Атауды түзету"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Оқиға түсіндірмесін түзету"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Фото/видео түсіндірмесін түзету"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Файлдарды қоқыс шелегіне тастау"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Тек ө_шіру"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Сыртқы түзетуді болдырмау керек пе?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Сыртқы түзетулерді болдырмау керек пе?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "%d сыртқы файлға жасалған өзгерістер жоғалады. Жалғастыру керек пе?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Сыр_тқы түзетуді болдырмау"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Сыр_тқы түзетулерді болдырмау керек пе?"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Жинақтан %d фото өшіріледі. Жалғастыру керек пе?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "Өші_ру"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Фотоны жинақтан өшіру"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Фотоларды жинақтан өшіру"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 сағ"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Бар_лық фото/видеоларды бірдей шамаға жылжыту"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Б_арлық фото/видеоларды бұл уақытқа орнату"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Түпнұсқа фотосурет файлын тү_зету"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Түпнұсқа фотосурет файлдарын тү_зету"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Бастапқы файлды түзету"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Баста_пқы файлдарды түзету"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Бастапқы:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ұсталым уақыты алға келесі мәнге жылжытылады:\n"
+"%d %s, %d %s, %d %s, және %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ұсталым уақыты артқа келесі мәнге жылжытылады:\n"
+"%d %s, %d %s, %d %s, және %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "күн"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "сағат"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минут"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунд"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Және %d басқа."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Тегтер (үтірмен ажыратылған):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Қош келдіңіз!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell қолданбасына қош келдіңіз!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Бастау үшін, фотоларды келесі жолдармен импорттай аласыз:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">Файл %s Бумадан импорттау</span> таңдаңыз"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Фотоларды Shotwell терезесіне тартып апарыңыз"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Компьютеріңізге камераны жалғап, ипорттаңыз"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Фотоларды сіздің %s _бумаңыздан импорттау"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Оған қоса, фотоларды осы жолдармен импорттай аласыз:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Бұ_л хабарламаны келесіде көрсетпеу"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Фотоларды сіздің %s жинағыңыздан импорттау"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Көмек)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Жыл%sАй%sКүн"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Жыл%sАй"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Жыл%sАй-Күн"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Жыл-Ай-Күн"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Таңдауыңызша"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Шаблон қате"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell фотоларды жинағыңызға көшіре алады, немесе көшірмесіз-ақ импорттай "
+"алады."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Фо_толарды көшіру"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "Кө_шірусіз импорттау"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Жинақ ішіне импорттау"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Жинақтан өшіру"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Фото(лар) жинақтан өшіру"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Фотоларды жинақтан өшіру"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Бұл әрекет сіздің Shotwell жинағыңыздан %d фото/видеоны өшіреді. Оған қоса, "
+"файлдарды қоқыс шелегіне тастауды қалайсыз ба?\n"
+"\n"
+"Бұл әрекетті болдырмау мүмкін емес болады."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Бұл әрекет сіздің Shotwell жинағыңыздан %d видеоны өшіреді. Оған қоса, "
+"файлдарды қоқыс шелегіне тастауды қалайсыз ба?\n"
+"\n"
+"Бұл әрекетті болдырмау мүмкін емес болады."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Бұл әрекет сіздің Shotwell жинағыңыздан %d фотоны өшіреді. Оған қоса, "
+"файлдарды қоқыс шелегіне тастауды қалайсыз ба?\n"
+"\n"
+"Бұл әрекетті болдырмау мүмкін емес болады."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d фото/видеоны қоқыс шелегіңізге тастауға мүмкін емес. Ол файл(дар)ды өшіру "
+"керек пе?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d фото/видеоны өшіру мүмкін емес."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Бумалар"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Тегтер"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Сәтті"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Файл қатесі"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Файлды декодалау мүмкін емес"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Дерекқор қатесі"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Пайдаланушы импортты тоқтатқан"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Файл емес"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Файл дерекқорда бар"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Қолдауы жоқ файл пішімі"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Сурет файлы емес"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Диск қатесі"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Диск толық"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Камера қатесі"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Файлды жазу қатесі"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Зақымдалған сурет файлы"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Импорттау қатесі (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "түрлендірілген"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Алдыңғы фото"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Келесі фото"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Фотоның бастапқы файлы жоқ: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Түрі"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Са_ймандар"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Ал_дыңғы фото"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Алдыңғы фото"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "К_елесі фото"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Келесі фото"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Үлке_йту"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Фотоны үлкейту"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Кі_шірейту"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Фотоны кішірейту"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Параққа сы_йдыру"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Фотоны экранды толығымен алатындай етіп келтіру"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Үлкейту - _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Фотосуретті өлшемнің 100 дейін өзгерту"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Үлкейту - _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Фотосуретті өлшемнің 200 дейін өзгерту"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "Ө_ндіруші"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s экспорттау мүмкін емес: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s дерекқоры"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s ішінен импорттау мүмкін емес, өйткені қате орын алды:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Басқа қызметтен импорттауды көру үшін, оны жоғарыдағы мәзірден таңдаңыз."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Мәлімет импорты"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Сізде іске қосулы мәліметтер импорттау плагиндері жоқ.\n"
+"\n"
+"Қолданбадан импорттау мүмкіндігін қолдану үшін, кем дегенде бір мәліметті "
+"импорттау плагинін іске қосыңыз. Плагиндерді Баптаулар сұхбатында іске "
+"қосуға болады."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Дерекқор файлы:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "И_мпорттау"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Қолданбадан импорттау"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Мульт_имедияны қайдан импорттау:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Жабу"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Баптаулар"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Слайдшоу"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Артқа"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Алдыңғы фотоға өту"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Аялдату"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Слайдшоуды аялдату"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Келесі"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Келесі фотоға өту"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Слайдшоу баптауларын өзгерту"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Барлық фотолардың бастапқы файлдары жоқ."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Ойнату"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Слайдшоуды жалғастыру"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Қайтару"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Қайтаруды болдырмау"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Жақсарту"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Жақсартуды болдырмау"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Түстер түрлендіруін іске асыру"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Түстер түрлендіруін болдырмау"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Жаңа оқиғаны жасау"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Оқиға өшірілуде"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Фотоларды жаңа оқиғаға жылжыту"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Фотоларды алдыңғы оқиғаға орнату"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Біріктіру"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Біріктіруді болдырмау"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Фотолар көшірмелерін жасау"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Фотолар көшірмелерін өшіру"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "%d фотоның файл қатесі салдарынан көшірмесін жасау мүмкін емес"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Алдыңғы рейтингті қайтару"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Рейтингтерді үлкейту"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Рейтингтерді кішірейту"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW өндірушісін орнату"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Алдыңғы RAW өндірушісін қалпына келтіру"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Өндірушіні орнату"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Бастапқы фотоны түзету мүмкін емес."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Күн мен уақытын баптау"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Күн мен уақытын баптауды болдырмау"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Келесі бастапқы фотоны баптау мүмкін емес."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Уақытты баптау қатесі"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Уақытты баптауды келесі файл(дар)ға болдырмау мүмкін емес."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Тегті жасау"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" тегін жылжыту"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Фотоларды қоқыс шелегіне тастау"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Фотоларды қоқыс шелегінен қайтару"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Фотоларды Shotwell қоқыс шелегіне тастау"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Фотоларды қайта Shotwell жинағына қалпына келтіру."
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Фотолар қоқыс шелегіне тасталуда"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Фотолар қоқыс шелегінен қайтарылуда"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Таңдалған фотоларға жалауша орнату"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Таңдалған фотолардан жалаушаны алып тастау"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Таңдалған фотоларға жалауша орнату"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Таңдалған фотолардан жалаушаны алып тастау"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Жалауша"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Жалаушаны алу"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Төмен (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Орташа (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Жоғары (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Максимум (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Фото/видеолар жоқ"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Ешбір фото/видео табылмады"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Фотоларды бұл бумаға экспорттау мүмкін емес."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Жаңартуларды бақылау мүмкін емес: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Парақты түгел толтыру"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 сурет парақта"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 сурет парақта"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 сурет парақта"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 сурет парақта"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 сурет парақта"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 сурет парақта"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "дюйм"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "см"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Wallet (2 x 3 дюйм)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 x 5 дюйм)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 дюйм"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 дюйм"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 дюйм"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 дюйм"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 дюйм"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 x 13 см)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Ашық хат (10 x 15 см)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 см"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 см"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 см"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 см"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 см"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Сурет баптаулары"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Баспаға шығару..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Фотоны баспаға шығару мүмкін емес:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "%s фотодерекқорын ашу/жасау сәтсіз: қате коды %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Фотолар дерекқор файлына жазу мүмкін емес:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Дерекқор файлына қатынау қатесі:\n"
+" %s\n"
+"\n"
+"Қате: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Видеоларды экспорттау"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To жөнелту мүмкін емес: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Қайда жіберу"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Фон суретін %s ішіне экспорттау мүмкін емес: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Жұмыс үстел слайдшоуын дайындау мүмкін емес: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Жалауша бар"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Қоқыс шелегі"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Қоқыс шелегі бос"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Өшіру"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Фотоларды өшіру"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Файлдар жоқ"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Өшірілуде..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Соңғы импорт"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Б_умадан импорттау..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Фотоларды дисктен жинаққа импорттау"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Қ_олданбадан импорттау..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Оқ_иғаларды сұрыптау"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Қоқ_ыс шелегін тазарту"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Қоқыс шелегінен барлық фотоларды өшіру"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Фото ү_шін оқиғаны қарау"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "Т_абу"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Фото мен видеоларды іздеу шартына сәйкес табу"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Файл"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "Тү_зету"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Фото"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "Фо_толар"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Оқ_иғалар"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Те_гтер"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Көмек"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Не_гізгі ақпарат"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Таңдалғаны үшін негізгі ақпаратты көрсету"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Кеңе_йтілген ақпарат"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Таңдалғаны үшін кеңейтілген ақпаратты көрсету"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Ізд_еу өрісі"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Іздеу өрісін көрсету"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Бү_йір панелі"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Бүйір панелін көрсету"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "Өс_у ретімен"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Фотоларды өсу ретімен сұрыптау"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "К_ему ретімен"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Фотоларды кему ретімен сұрыптау"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Бумадан импорттау"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Қоқыс шелегін тазарту"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Қоқыс шелегі тазартылуда..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell сіздің үй бумаңыздан фотоларды импорттауға баплатған.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Жинақтың орналасуы"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Фотоларды бұл бумадан импорттау мүмкін емес."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Жинақты жаңарту..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Фотоларды автоимпорттауды дайындау..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Фотоларды автоимпорттау..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Файлдарға метаақпаратты жазу..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Жинақ"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Импорттау..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Импортты тоқтату"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Фотолар импортын тоқтату"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Импортқа дайындау..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Импортталды %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Сақтау"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Фотоны сақтау"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Қала_йша сақтау..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Фотоны басқа атауымен сақтау"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Фотоны компьютеріңізге жалғанған принтерден басып шығару"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s жоқ болып тұр."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s файл емес."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s келесі үшін файл пішімін қолдамайды:\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Кө_шірмесін сақтау"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s үшін өзгерістерді жоғалту керек пе?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Сақтамай-ақ _жабу"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s ішіне сақтау қатесі: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Қалайша сақтау"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s бақылау мүмкін емес: Бума емес (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Фотосуреттерді басқару қолданбасы"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Фотосуреттерді көрсету"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Оңғ_а бұру"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Бұру"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Оңға бұру"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Фотосуреттерді оңға бұру (Солға бұру үшін Ctrl басыңыз)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "С_олға бұру"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Солға бұру"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Фотоларды солға бұру"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Горизонта_лды айналдыру"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Горизонталды айналдыру"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "_Вертикалды айналдыру"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Вертикалды айналдыру"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Жақсар_ту"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Жақсарту"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Фото түрін автожақсарту"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "Түстерді келтіруін _көшіріп алу"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Түстерді келтіруін көшіріп алу"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Фотосуретке іске асырылған түстерді келтіруін көшіріп алу"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Түстерді келтіруін кірі_стіру"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Түстерді келтіруін кірістіру"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Таңдалған фотоларға көшірілген түстерді келтіруін кірістіру"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Қ_иып жіберу"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Қиып жіберу"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Фотосуретті қиып жіберу"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Тура_лау"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Туралау"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Фотосуретті туралау"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Қы_зыл көздер"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Қызыл көздер"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Фотодағы қызыл көздер эффектілерін жою"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "К_елтіру"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Келтіру"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Фото түсін мен реңің келтіру"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Бастапқ_ыға тастау"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Бастапқы қалпына келтіру"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Сыртқы тү_зетулерді болдырмау"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Бас фотоға дейін тастау"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Жұмыс үс_тел тұсқағазы ретінде орнату"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Таңдалған суретті жұмыс үстелінің тұсқағазы ретінде орнату"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Жұмыс үс_тел слайдшоуы ретінде орнату..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "Бол_дырмау"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Болдырмау"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "Қа_йталау"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Қайталау"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Оқ_иға атауын өзгерту..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Оқиға үшін _негізгі фото жасау"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Оқиға үшін негізгі фото жасау"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Жаңа оқиға"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Жаңа оқиға"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Фотоларды жылжыту"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Фотоларды оқиғаға жылжыту"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Оқиғаларды біріктіру"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Біріктіру"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Оқиғаларды бір оқиғаға біріктіру"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Рейтингті орнату"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Рейтингті орнату"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Фотоңыздың рейтингін орнату"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "Ү_лкейту"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Рейтингі үлкейту"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "Кі_шірейту"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Рейтингі кішірейту"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "Рейт_ингсіз"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Рейтингсіз"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Рейтингсіз етіп белгілеу"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Рейтингсіз етіп белгілеу"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Бар рейтингілерді өшіру"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "Та_йдырылған"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Тайдырылған"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Тайдырылған етіп белгілеу"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Тайдырылған етіп белгілеу"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Рейтингі тайдырылған етіп орнату"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Тек та_йдырылған"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Тек тайдырылған"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Тек тайдырылған фотоларды көрсету"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Барл_ығы + тайдырылған"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Барлық фотоларды көрсету, тайдырылғандармен қоса"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Барлық фотолар"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Барлық фотоларды көрсету"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Р_ейтингтер"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Әр фотоның рейтингі көрсету"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "Фотоларды сүз_гілеу"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Фотоларды сүзгілеу"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Көрсетілетін фотолардың санын сүзгі негізінде азайту"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Кө_шірмесін жасау"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Көшірмесін жасау"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Фотоның көшірмесін жасау"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Экспорт..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Бас_паға шығару..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Жари_ялау..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Жариялау"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Әртүрлі веб сайттарға жариялау"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Атауын _түзету..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Тү_сіндірмені түзету..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Түсіндірмені түзету"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Оқиға тү_сіндірмесін түзету..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Күн мен уақытын түзету..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Күн мен уақытын түзету"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Тегтерді қ_осу..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Тегтерді қ_осу..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Тегтерді қосу"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "Қа_лаулар"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Сыр_тқы түзетушісімен ашу"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW түзетушісімен ашу"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Қа_йда жіберу..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Қа_йда жіберу..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Табу..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Табу"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Суретті оның аты не тегтеріндегі бар мәтін арқылы табу"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Жалауша орнату"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Жалау_шаны алып тастау"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Түзетушіні жөнелту мүмкін емес: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "\"%s\" тегін қосу"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" және \"%s\" тегтерін қосу"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "\"%s\" те_гін өшіру"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "\"%s\" тегін өшіру"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Тегті өшіру"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "Ж_аңа"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" тегінің атын ауыст_ыру..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" тегтің атын \"%s\" етіп орнату"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Атын ауыстыру..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Те_гтерді түзету..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Тегті түзету"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Фото(лар)ға \"%s\" тегін қосу"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Фотоларға \"%s\" тегін орнату"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Таңдалған фотоға \"%s\" тегін қосу"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Таңдалған фотоларға \"%s\" тегін орнату"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Фото(лар)дан \"%s\" тегін ө_шіру"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Фо_толардан \"%s\" тегін өшіру"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Фото(лар)дан \"%s\" тегін өшіру"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Фотолардан \"%s\" тегін өшіру"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Тег үшін жаңа \"%s\" атауын орнату мүмкін емес, өйткені ондай тег бар болып "
+"тұр."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Іздеудің атын \"%s\" етіп ауыстыру сәтсіз, өйткені іздеу бар болып тұр."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Сақталған іздеу"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Іздеуді өшіру"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "Тү_зету..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Ат_ын ауыстыру..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" іздеудің атын \"%s\" етіп ауыстыру"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" іздеуін өшіру"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s етіп баға беру"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Рейтингін %s етіп орнату"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Рейтинг %s етіп орнатылуда"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Көрсету %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Тек қана рейтингі %s болатын фотоларды көрсету"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s не жақсырақ"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s не жақсырақ көрсету"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Тек қана рейтингі %s не одан жақсы болатын фотоларды көрсету"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Таңдалған фотоларды қоқыс шелегінен өшіру"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Таңдалған фотоларды жинақтан өшіру"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "Қал_пына келтіру"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Таңдалған фотоларды жинаққа қайта апару"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Файлдар басқарушысында көрсету"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Таңдалған фотоның бумасын файлдар басқарушысында ашу"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Файлдар басқарушысында ашу сәтсіз: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Ж_инақтан өшіру"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Қоқы_с шелегіне тастау"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Б_арлығын таңдау"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Барлық нәрсені таңдау"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Бұрыш:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Тастау"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Фотоның бастапқы өлшемдеріне қайту"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Бұл фотоны қиып жіберу"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Қиып жіберу аймағын тік не жатық қояды"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Еркін"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Шаршы"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Экран"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Бастапқы өлшемі"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD видеосы (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD видеосы (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Хат (8.5 x 11 дюйм)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Таблоид (11 x 17 дюйм)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 мм)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 мм)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Қызыл көздер сайманын жабу"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Таңдалған аймақта \"қызыл көздер\" эффектісін өшіру"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Қаңықтылығы:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Реңі:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Температура:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Көлеңкелер:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Ерекшелеу:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Түстерді тастау"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Барлық түстерді келтірудерді бастапқы мәндеріне тастау"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Көлеңкелер"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Реңі"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Қаңықтылығы"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Экспозиция"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Көлеңкелер"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Ерекшелеу"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Контраст кеңейтілуі"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Панельді бекіту"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Панельді ашық түрінде бекіту"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Толық экраннан шығу"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Т_олық экраннан шығу"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Шығу"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "О_сы туралы"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Т_олық экранға"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "Құра_масы"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Жиі қойылатын сұрақтар"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "Мә_селе жөнінде хабарлау..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell жинағына қатынау кезінде қатаң қате орын алған. Shotwell өз жұмысын "
+"жалғастыра алмайды.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba веб сайтын шолу"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Көмек ақпаратын көрсету мүмкін емес: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Ақаулықтар дерекқорына өту мүмкін емес: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "ЖҚС көрсету мүмкін емес: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "атаусыз"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Бастапқы өлшемі"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ені не биіктігі"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ені"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Биіктігі"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Кіші көріністердің өлшемдерін баптау"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Кіші көріністерді үлкейту"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Кіші көріністерді кішірейту"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Фот_оларды сұрыптау"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Видеоны о_йнату"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Таңдалған видеоларды жүйелік видео плеерінде ашу"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Пікірлер"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Әр фотоның түсіндірмесін көрсету"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Әр фотоның тегтерін көрсету"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "А_тауы бойынша"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Фотоларды атаулары бойынша сұрыптау"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Түсірілген _күні бойынша"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Фотоларды түсірілген күні бойынша сұрыптау"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Ре_йтингі бойынша"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Фотоларды рейтингі бойынша сұрыптау"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell таңдалған видеоны ойната алмады:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d фото/видео"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Әр оқиғаның түсіндірмесін көрсету"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Оқиғалар жоқ"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Ешбір оқиға табылмады"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Оқиғалар"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Күні жоқ"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Оқиға жоқ"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "%s кэш бумасын жасау мүмкін емес: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "%s мәлімет бумасын жасау мүмкін емес: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Суреттер"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "%s уақытша бумасын жасау мүмкін емес: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "%s мәлімет ішкі бумасын жасау мүмкін емес: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ешнәрсе)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ешнәрсе"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Кездейсоқ"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Слайдшоу эффектілері"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s үшін уақытша файлды жасау мүмкін емес: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Экспорттау"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s файлы бар болып тұр. Оны алмастыру керек пе?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "А_ттап кету"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "А_лмастыру"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Барл_ығын алмастыру"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Экспорт"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Фотолар"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Видеолар"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW фотосуреттері"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW фотосуреттері"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI %s файлын жүктеу қатесі: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Түрі"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Жариялау"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Таңдалған фото/видеолар сәтті жарияланды."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Таңдалған видеолар сәтті жарияланды."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Таңдалған фотолар сәтті жарияланды."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Таңдалған видео сәтті жарияланды."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Таңдалған фото сәтті жарияланды."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Тіркелгі ақпараты алынуда..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Жүйеге кіру..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Фотоларды жариялау"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Фотоларды жари_ялау орны:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Видеоларды жариялау"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Видеоларды жари_ялау орны:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Фото мен видеоларды жариялау"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Фото мен видеоларды жари_ялау орны:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Жариялау мүмкін емес"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell таңдалған нәрселерді жариялай алмайды, өйткені іске қосулы тұрған "
+"үйлесімді жариялау плагині жоқ. Осыны түзету үшін, <b>%s баптауларын түзету</"
+"b> таңдаңыз да, <b>Плагиндер</b> бетінде бір немесе бірнеше жариялау "
+"плагинін іске қосыңыз."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Жүктеуге дайындау"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Жүктелуде %d, барлығы %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s ішіне жариялау мүмкін емес, орын алған қате:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Басқа қызметке жариялап көру үшін, үстіндегі мәзірден біреуін таңдаңыз."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Жаңа _тег..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Жариялау үшін керек уақытша файл қолжетерсіз"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Сіз осы Shotwell сессиясы кезінде Google ішіне кіріп және шығып үлгердіңіз.\n"
+"Google ішіне жариялауды жалғастыру үшін, Shotwell қайта қосыңыз, одан кейін "
+"жариялап көріңіз."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Сіз YouTube ішіне кірген жоқсыз.\n"
+"\n"
+"Сізде Google тіркелгісі болып, және оны YouTube-мен қолдануға баптауыңыз "
+"керек. Тіркелгіні осылай баптау үшін браузер көмегімен YouTube сайтына кем "
+"дегенде бір рет кіруіңіз керек."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Жариялау үшін керек файл қолжетерсіз. Youtube-ге жариялауды жалғастыру "
+"мүмкін емес."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Сіз YouTube-ге %s ретінде кірдіңіз."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Видеолар '%s' ішінде жарияланады"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Ортақ жарияланған"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Ортақ тізілмеген"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Жеке"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Жариялау қызметтері"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Сіз Flickr ішіне кірген жоқсыз.\n"
+"\n"
+"Flickr ішіне веб браузеріңізбен кіру үшін Кіру батырмасын шертіңіз. Flickr "
+"тіркелгіңізге сілтеу үшін Shotwell Connect үшін авторизация беруіңіз керек."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Сіз осы сессия кезінде Flickr ішіне кіріп және шығып үлгердіңіз.\n"
+"Flickr ішіне жариялауды жалғастыру үшін, Shotwell қайта қосыңыз, одан кейін "
+"жариялап көріңіз."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Кіру үшін дайындалу..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Жариялау үшін керек файл қолжетерсіз. Flickr-ге жариялауды жалғастыру мүмкін "
+"емес."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Авторизацияны тексеру..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Сіз Flickr-ге %s ретінде кірдіңіз.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Сіздің тегін Flickr тіркелгісі бір айда қанша мәліметті жүктеуге болатынын "
+"шектеп отыр.\n"
+"Бұл айда, сізде шекке дейін қалған %d мегабайт бар."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Сіздің Flickr Pro тіркелгіңіз шектелмеген жүктеулерді мүмкін қылады."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Фотолар кі_мге көрінеді:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Видеолар кі_мге көрінеді:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Фото мен видеолар кім_ге көрінеді:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Әркім"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Тек отбасы мен достар"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Тек отбасы"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Тек достар"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Тек мен"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 пиксель"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 пиксель"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 пиксель"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 пиксель"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s альбомын жасау..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigo-ға жариялау кезінде қате хабарламасы алынды. Қайталап көріңіз."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Piwigo фото жинағыңыздың сілтемесін, және сіздің Piwigo тіркелгіңіздің "
+"пайдаланушы атыңыз бен парольді көрсетіңіз."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell сіздің Piwigo фото жинағыңызбен байланыса алмады. Енгізілген "
+"сілтемені тексеріңіз"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Пайдаланушы аты мен/не пароль қате. Қайтадан енгізіп көріңіз."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Қате сілтеме"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Пайдаланушы аты не пароль қате"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Әкімшілер, Отбасы, Достар, Контакттар"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Әкімшілер, Отбасы, Достар"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Әкімшілер, Отбасы"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Әкімшілер"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Сіз Picasa Web Albums ішіне кірген жоқсыз.\n"
+"\n"
+"Picasa Web Albums ішіне веб браузеріңізбен кіру үшін Кіру батырмасын "
+"шертіңіз. Picasa Web Albums тіркелгіңізге сілтеу үшін Shotwell Connect үшін "
+"авторизация беруіңіз керек."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Жариялау үшін керек файл қолжетерсіз. Picasa-ға жариялауды жалғастыру мүмкін "
+"емес."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Альбомды жасау..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Сіз Picasa Web Albums ішіне %s ретінде кірдіңіз."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Видеолар жарияланатын жері:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Фотолар қайда көрінеді:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Кіші (640 x 480 пиксель)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Орташа (1024 x 768 пиксель)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Ұсынылатын (1600 x 1200 пиксель)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 пиксель)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Сіз Facebook ішіне кірген жоқсыз.\n"
+"\n"
+"Егер сізде Facebook тіркелгісі әлі жоқ болса, кіру үрдісі кезінде оны жасай "
+"аласыз. Кіру кезінде, Shotwell Connect сізден фотоларды жүктеу мен оларды "
+"сіздің таспаңызға жариялау үшін рұқсат сұрауы мүмкін. Ол рұқсаттар Shotwell "
+"Connect дұрыс жұмысы үшін керек."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Сіз осы сессия кезінде Facebook ішіне кіріп және шығып үлгердіңіз.\n"
+"Facebook ішіне жариялауды жалғастыру үшін, Shotwell қайта қосыңыз, одан "
+"кейін жариялап көріңіз."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Қалыпты (720 пиксель)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Үлкен (2048 пиксель)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook-пен байланысты сынау..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Жариялау үшін керек файл қолжетерсіз. Facebook-ке жариялауды жалғастыру "
+"мүмкін емес."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Сіз Facebook-ке %s ретінде кірдіңіз.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Таңдалған фотоларды қайда жариялауды қалайсыз?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Жүктеу ө_лшемі:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Достар"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Шашырау"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Шахмат"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Шеңберлер"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Жалюзи"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Жолақтар"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Сағат"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Шеңбер"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Слайдшоу арасында өту аралығы"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Слайд"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Сөндіру"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Шаршылар"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Өзек мәлімет импорттау қызметтері"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot жинақтарын импорттау қызметіне қош келдіңіз.\n"
+"\n"
+"Импорттау үшін жинақты таңдаңыз, Shotwell тапқан жинақтардың біреуін таңдап, "
+"немесе басқа F-Spot дерекқор файлын қолмен көрсетіңіз."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot жинақтарын импорттау қызметіне қош келдіңіз.\n"
+"\n"
+"F-Spot дерекқор файлын таңдаңыз."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Импорттау үшін F-Spot дерекқор файлын қолмен көрсетіңіз:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Таңдалған F-Spot дерекқор файлын ашу мүмкін емес: файл жоқ болып тұр немесе "
+"ол файл F-Spot дерекқор файлы емес"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Таңдалған F-Spot дерекқор файлын ашу мүмкін емес: F-Spot дерекқор нұсқасын "
+"Shotwell қолдамайды"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Таңдалған F-Spot дерекқор файлын оқу мүмкін емес: тегтер кестесін оқу қатесі"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Таңдалған F-Spot дерекқор файлын оқу мүмкін емес: фотосуреттер кестесін оқу "
+"қатесі"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell F-Spot жинағынан %d фотосуретті тапты, және оларды қазір "
+"импорттауда. Қайталанатын суреттер автоматты түрде анықталады және "
+"өшіріледі.\n"
+"\n"
+"Бұл терезені жауып, Shotwell қолдана беруіңізге болады, импорт үрдісі соңына "
+"дейін фонда орындалады."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot жинағы: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Импортқа дайындалу"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Жұмыс үстел слайдшоуы ретінде орнату"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Жұмыс үстел тұсқағаз слайдшоуын жасау"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Әр фото көрсету мерзімі"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "уақыт аралығы"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Әр фото жұмыс үстелдің түсқағазы ретінде тұратын уақыты"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Іздеу"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "Ізд_еудің аты:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Сәйкес"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "келесінің:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Басылып шығарылатын сурет өлшемі</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Қалы_пты өлшемді қолдану:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Таңдау_ыңызша өлшемді қолдану:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Фото жақтарының қатынасын сақтау"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Автоөлшем:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Атаулар</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Сурет ат_ауын да баспаға шығару"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Пиксель шешімділігі</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "Фото_ны қайда сақтау:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "дюймге пиксель"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "белгі"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell баптаулары"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "ақ"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "қара"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Жинақ бу_масын жаңа файлдарға бақылау"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Метаақпарат"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Фото файлдарына тег, атау және басқа ме_таақпаратты жазу"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Көрсету"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "Фотоларды қа_йда импорттау:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Фон:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Импорттау"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Бу_ма құрылысы:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Шаблон:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Мысалы:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Имп_ортталатын файлдар аттарын төменгі регистрге келтіру"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW өндіруші"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Ба_стапқы:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "С_ыртқы фото түзетушісі:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "С_ыртқы RAW түзетушісі:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Сыртқы түзетушілер"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Плагиндер"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Аралық:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Алма_су эффекті:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Алмасу ара_лығы:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "А_тауын көрсету"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "секунд"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Кіру"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (мәтін fb пайдаланушы атына тәуелді және қолданбада түрлендіріледі - \n"
+"осында енгізген мәтін көрсетілмейді)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "_Бар болып тұрған альбомға жариялау:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Атауы келесіде_й жаңа альбомды жасау:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Видеолар мен жаңа фото альбомдар кі_мге көрінеді:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "Жүктеу алдында орналасу, камера және басқа сілтеуші ақпаратты ө_шіру"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Шығу"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "Жари_ялау"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Веб браузеріңізде Flickr ішіне кіргеннен кейін көрсетілген растау кодын "
+"енгізіңіз."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Авторизациялық _нөмірі:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Сіз Flickr-ге (name) ретінде кірдіңіз.\\n\n"
+"(бұл белгінің жолы код ішінде толтырылады және орнатылады, \n"
+"сондықтан осындағы өзгерістер көрсетілмейді)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "_көріну белгісі (кодта толтырылады)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Фотосурет өл_шемі:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'Сіз $name ретінде кірдіңіз'\n"
+"(қолданба коды ішінде толтырылады)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Б_ар болып тұрған альбом:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Атау_ы келесідей жаңа альбомда:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "Ор_тақ галереясындағы альбомдар тізімі"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype қайда көрсетіледі\n"
+"(кодта толтырылады)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Фото өл_шемінің алдын-ала орнатуы:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Сіздің Piwigo фото ж_инағыңыздың URL-ы"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Па_йдаланушы аты"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "Пар_оль"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Парольді _сақтау"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Кіру"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Бар са_натта:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Фотоларды кі_м көре алады:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Фотосурет өлшемі:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "санатта:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Альбом түсіндірмесі:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"Егер а_тауы болса, ал түсіндірмесі болмаса, атауды түсіндірме ретінде қолдану"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "Тегтерді жү_ктемеу"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Шығу"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Видео ж_екелік баптауы:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 пиксель"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' - OAuth аутентификация сұранымына дұрыс жауап емес"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): бастау мүмкін емес; бұл жарияланушыны іске қайта "
+"қосуға болмайды."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Tumblr тіркелгіңіздің пайдаланушы аты мен паролін енгізіңіз."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI жүктеу мүмкін емес: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Сіз Tumblr-ге %s ретінде кірдіңіз.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Яндекс.Фотки веб-сайтын шолу"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Сіз қазір Яндекс.Фотки ішіне кірмегенсіз."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Эл. пошта адресі"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Сіз Tumblr-ге (name) ретінде кірдіңіз.\\n\n"
+"(бұл белгінің жолы код ішінде толтырылады және орнатылады, \n"
+"сондықтан осындағы өзгерістер көрсетілмейді)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Блогтар:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Альбомдар (не жаңасын жазыңыз):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Қатынау _түрі:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "_Пікірлерді сөндіру:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Бастапқы фото_ны жүктеп алуға тыйым салу"
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..1e2e314
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,3882 @@
+# po/shotwell-core/km.po
+# Khmer Translation for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# This file is distributed under the GNU LGPL, version 2.1.
+#
+# Translators:
+# <gospeltocambodia@gmail.com>, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: Lucas Beeler <lucas@yorba.org>\n"
+"POT-Creation-Date: 2012-09-13 13:32-0700\n"
+"PO-Revision-Date: 2012-09-17 09:16+0000\n"
+"Last-Translator: preahkumpii <gospeltocambodia@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: km\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+# Translator credits string for the about box -- translators, add your name
+# below if it's not already present
+#: src/AppWindow.vala:688 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "preahkumpii <gospeltocambodia@gmail.com>"
+
+# GNOME Application Class ("Generic Name")
+#: src/Resources.vala:15
+msgid "Photo Manager"
+msgstr "កម្ម​វិធី​គ្រប់​គ្រង​រូប​ថត"
+
+# GNOME Application Name
+msgid "Shotwell Photo Manager"
+msgstr ""
+
+# GNOME Application Class for Direct Edit Mode
+#: src/Resources.vala:16
+msgid "Photo Viewer"
+msgstr "កម្ម​វិធី​មើល​រូប​ថត"
+
+# GNOME Application Comment
+msgid "Organize your photos"
+msgstr ""
+
+# GNOME Application Name for Direct Edit Mode
+msgid "Shotwell Photo Viewer"
+msgstr ""
+
+# GNOME Application Keywords
+msgid "Camera;Picture;Photo;"
+msgstr ""
+
+#: src/AppWindow.vala:54
+msgid "Pin Toolbar"
+msgstr "ក្លាស់​របារឧបករណ៍"
+
+#: src/AppWindow.vala:55
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:58 src/AppWindow.vala:136
+msgid "Leave fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:135
+msgid "Leave _Fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:493
+msgid "_Quit"
+msgstr ""
+
+#: src/AppWindow.vala:498
+msgid "_About"
+msgstr ""
+
+#: src/AppWindow.vala:503
+msgid "Fulls_creen"
+msgstr ""
+
+#: src/AppWindow.vala:508
+msgid "_Contents"
+msgstr ""
+
+#: src/AppWindow.vala:513
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:518
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:617 src/AppWindow.vala:638 src/AppWindow.vala:655
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1058
+#: src/Dialogs.vala:1081 src/publishing/PublishingUI.vala:453
+#: src/data_imports/DataImportsUI.vala:399
+msgid "_Cancel"
+msgstr ""
+
+#: src/AppWindow.vala:665
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot continue.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/AppWindow.vala:685 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr ""
+
+#: src/AppWindow.vala:697
+#, c-format
+msgid "Unable to display help: %s"
+msgstr ""
+
+#: src/AppWindow.vala:705
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:713
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Properties.vala:38
+msgid "%I:%M %p"
+msgstr ""
+
+#: src/Properties.vala:50
+msgid "Today"
+msgstr ""
+
+#: src/Properties.vala:52
+msgid "Yesterday"
+msgstr ""
+
+#: src/Properties.vala:193 src/camera/ImportPage.vala:308
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/Properties.vala:306 src/Dialogs.vala:985
+msgid "Title:"
+msgstr ""
+
+#: src/Properties.vala:309
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:312
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+
+#: src/Properties.vala:319 src/events/EventDirectoryItem.vala:78
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] ""
+
+#: src/Properties.vala:321 src/events/EventDirectoryItem.vala:76
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+
+#: src/Properties.vala:343
+msgid "Date:"
+msgstr ""
+
+#: src/Properties.vala:347
+msgid "Time:"
+msgstr ""
+
+#: src/Properties.vala:350 src/Properties.vala:355
+msgid "From:"
+msgstr ""
+
+#: src/Properties.vala:351 src/Properties.vala:356
+msgid "To:"
+msgstr ""
+
+#: src/Properties.vala:361 src/editing_tools/EditingTools.vala:1830
+msgid "Size:"
+msgstr ""
+
+#: src/Properties.vala:370
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:370
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:374
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:402 src/Properties.vala:406 src/Properties.vala:413
+#: src/editing_tools/EditingTools.vala:2188
+msgid "Exposure:"
+msgstr ""
+
+#: src/Properties.vala:500
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:503
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:506
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:509
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:512
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:515
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:517
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:520
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:522
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:525
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:528
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:530
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:532
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:541
+msgid "Extended Information"
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr ""
+
+#: src/main.vala:334
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:338
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr ""
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:299
+msgid "Printed Image Size"
+msgstr ""
+
+#: src/Printing.vala:311
+msgid "Use a _standard size:"
+msgstr ""
+
+#: src/Printing.vala:315
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: src/Printing.vala:319
+msgid "_Autosize:"
+msgstr ""
+
+#: src/Printing.vala:388
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:389
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:405
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: src/Printing.vala:411
+msgid "Titles"
+msgstr ""
+
+#: src/Printing.vala:418
+msgid "Print image _title"
+msgstr ""
+
+#: src/Printing.vala:430
+msgid "Pixel Resolution"
+msgstr ""
+
+#: src/Printing.vala:436
+msgid "_Output photo at:"
+msgstr ""
+
+#: src/Printing.vala:451
+msgid "pixels per inch"
+msgstr ""
+
+#: src/Printing.vala:922 src/editing_tools/EditingTools.vala:729
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:925 src/editing_tools/EditingTools.vala:730
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:928 src/editing_tools/EditingTools.vala:731
+msgid "4 x 6 in."
+msgstr ""
+
+#: src/Printing.vala:931 src/editing_tools/EditingTools.vala:732
+msgid "5 x 7 in."
+msgstr ""
+
+#: src/Printing.vala:934 src/editing_tools/EditingTools.vala:733
+msgid "8 x 10 in."
+msgstr ""
+
+#: src/Printing.vala:937 src/editing_tools/EditingTools.vala:735
+msgid "11 x 14 in."
+msgstr ""
+
+#: src/Printing.vala:940 src/editing_tools/EditingTools.vala:737
+msgid "16 x 20 in."
+msgstr ""
+
+#: src/Printing.vala:946 src/editing_tools/EditingTools.vala:739
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:949 src/editing_tools/EditingTools.vala:740
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:952 src/editing_tools/EditingTools.vala:741
+msgid "13 x 18 cm"
+msgstr ""
+
+#: src/Printing.vala:955 src/editing_tools/EditingTools.vala:742
+msgid "18 x 24 cm"
+msgstr ""
+
+#: src/Printing.vala:958 src/editing_tools/EditingTools.vala:744
+msgid "20 x 30 cm"
+msgstr ""
+
+#: src/Printing.vala:961 src/editing_tools/EditingTools.vala:745
+msgid "24 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:964 src/editing_tools/EditingTools.vala:746
+msgid "30 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:980
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:993
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:1013 src/Printing.vala:1216
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/Page.vala:1265
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1269
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2555
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/SearchFilter.vala:632 src/SearchFilter.vala:633
+#: src/SearchFilter.vala:1029 src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr ""
+
+#: src/SearchFilter.vala:638 src/SearchFilter.vala:639
+msgid "Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:644 src/SearchFilter.vala:645
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:650
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:651
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:991
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:1008
+msgid "Type"
+msgstr ""
+
+#: src/SearchFilter.vala:1042 src/searches/SearchBoolean.vala:164
+msgid "Rating"
+msgstr ""
+
+#: src/Commands.vala:670
+msgid "Reverting"
+msgstr ""
+
+#: src/Commands.vala:670
+msgid "Undoing Revert"
+msgstr ""
+
+#: src/Commands.vala:714
+msgid "Enhancing"
+msgstr ""
+
+#: src/Commands.vala:714
+msgid "Undoing Enhance"
+msgstr ""
+
+#: src/Commands.vala:897
+msgid "Creating New Event"
+msgstr ""
+
+#: src/Commands.vala:898
+msgid "Removing Event"
+msgstr ""
+
+#: src/Commands.vala:907
+msgid "Moving Photos to New Event"
+msgstr ""
+
+#: src/Commands.vala:908
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:938
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:939
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:948
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:948
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:971
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+
+#: src/Commands.vala:1058
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1068 src/Commands.vala:1069
+msgid "Increasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1068 src/Commands.vala:1069
+msgid "Decreasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1119
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1119
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1120
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1210
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1231
+msgid "Adjusting Date and Time"
+msgstr ""
+
+#: src/Commands.vala:1231
+msgid "Undoing Date and Time Adjustment"
+msgstr ""
+
+#: src/Commands.vala:1262
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] ""
+
+#: src/Commands.vala:1264 src/Commands.vala:1288
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1286
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+
+#: src/Commands.vala:1500 src/Commands.vala:1523
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1558
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2210
+msgid "Move Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2210
+msgid "Restore Photos from Trash"
+msgstr ""
+
+#: src/Commands.vala:2211
+msgid "Move the photos to the Shotwell trash"
+msgstr ""
+
+#: src/Commands.vala:2211
+msgid "Restore the photos back to the Shotwell library"
+msgstr ""
+
+#: src/Commands.vala:2230
+msgid "Moving Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2230
+msgid "Restoring Photos From Trash"
+msgstr ""
+
+#: src/Commands.vala:2319
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2319
+msgid "Unflag"
+msgstr ""
+
+#: src/Commands.vala:2320
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2320
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/CollectionPage.vala:215 src/PhotoPage.vala:2553
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:216 src/PhotoPage.vala:2554
+msgid "Play a slideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:436
+msgid "Export Photo/Video"
+msgstr ""
+
+#: src/CollectionPage.vala:436
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:438 src/PhotoPage.vala:3123 src/Dialogs.vala:58
+msgid "Export Photo"
+msgstr ""
+
+#: src/CollectionPage.vala:438 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr ""
+
+#: src/CollectionPage.vala:525 src/CollectionPage.vala:541
+msgid "Rotating"
+msgstr ""
+
+#: src/CollectionPage.vala:525 src/CollectionPage.vala:541
+msgid "Undoing Rotate"
+msgstr ""
+
+#: src/CollectionPage.vala:550
+msgid "Flipping Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:551
+msgid "Undoing Flip Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:560
+msgid "Flipping Vertically"
+msgstr ""
+
+#: src/CollectionPage.vala:561
+msgid "Undoing Flip Vertically"
+msgstr ""
+
+#: src/Photo.vala:3446
+msgid "modified"
+msgstr ""
+
+#: src/VideoSupport.vala:440
+msgid "Export Videos"
+msgstr ""
+
+#: src/SlideshowPage.vala:42 src/SlideshowPage.vala:234
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:44
+msgid "_Delay:"
+msgstr ""
+
+#: src/SlideshowPage.vala:46 src/SlideshowPage.vala:48
+msgid "seconds"
+msgstr ""
+
+#: src/SlideshowPage.vala:64
+msgid "_Transition effect:"
+msgstr ""
+
+#: src/SlideshowPage.vala:91
+msgid "Transition d_elay:"
+msgstr ""
+
+#: src/SlideshowPage.vala:109
+msgid "Show t_itle"
+msgstr ""
+
+#: src/SlideshowPage.vala:200
+msgid "Slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:213
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:214
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:220 src/SlideshowPage.vala:325
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:221 src/SlideshowPage.vala:326
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:227
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:228
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:235
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:289
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:321
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:322
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:46 src/library/LibraryWindow.vala:345
+msgid "_File"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:73
+msgid "Edit"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:77 src/library/LibraryWindow.vala:357
+msgid "_Photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:81 src/PhotoPage.vala:2355
+msgid "T_ools"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:86 src/PhotoPage.vala:2360
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:87 src/PhotoPage.vala:2361
+msgid "Previous Photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:92 src/PhotoPage.vala:2366
+msgid "_Next Photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:93 src/PhotoPage.vala:2367
+msgid "Next Photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:165 src/PhotoPage.vala:2351
+#: src/library/LibraryWindow.vala:353
+msgid "_View"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:169 src/library/LibraryWindow.vala:373
+msgid "_Help"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:174 src/PhotoPage.vala:2513
+#: src/MediaPage.vala:323
+msgid "Zoom _In"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:175 src/PhotoPage.vala:2514
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:180 src/PhotoPage.vala:2519
+#: src/MediaPage.vala:329
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:181 src/PhotoPage.vala:2520
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:186 src/PhotoPage.vala:2525
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:187 src/PhotoPage.vala:2526
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:192 src/PhotoPage.vala:2531
+#, no-c-format
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:193 src/PhotoPage.vala:2532
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:198 src/PhotoPage.vala:2537
+#, no-c-format
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:199 src/PhotoPage.vala:2538
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr ""
+
+#: src/Tag.vala:815
+msgid "untitled"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:15
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:96
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:285
+msgid "None"
+msgstr ""
+
+#: src/AppDirs.vala:45 src/AppDirs.vala:96
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:55 src/AppDirs.vala:85
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "មិន​អាច​បង្កើត​ថត​ទិន្នន័យ​ %s: %s"
+
+#: src/AppDirs.vala:132
+msgid "Pictures"
+msgstr "រូបភាព"
+
+#: src/AppDirs.vala:170
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "មិន​អាច​បង្កើត​ថត​បណ្ដោះ​អាសន្ន %s: %s"
+
+#: src/AppDirs.vala:187 src/AppDirs.vala:203
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "មិន​អាច​បង្កើត​ថត​រង​ទិន្នន័យ​ %s: %s"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1170
+msgid "Original size"
+msgstr ""
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr ""
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr ""
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/sidebar/Tree.vala:196 src/library/LibraryWindow.vala:339
+#: src/searches/Branch.vala:77
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/sidebar/Tree.vala:200
+msgid "New _Tag..."
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/PhotoPage.vala:531
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:536
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1826
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2558 src/MediaPage.vala:406
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3002 src/Dialogs.vala:2321
+msgid "Remove From Library"
+msgstr ""
+
+#: src/PhotoPage.vala:3002 src/Dialogs.vala:2322
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/PhotoPage.vala:3143
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:294
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:295
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:306
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:316
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:317
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:322
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:327
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:328
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:349
+msgid "_Edit"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:361
+msgid "_Photos"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:365
+msgid "Even_ts"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:369 src/MediaPage.vala:441
+msgid "Ta_gs"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:384
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:385
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:390
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:391
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:396
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409 src/MediaPage.vala:481
+msgid "_Ascending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410 src/MediaPage.vala:482
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:416 src/MediaPage.vala:487
+msgid "D_escending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:417 src/MediaPage.vala:488
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:650
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:719
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:719
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:862
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:865 src/data_imports/DataImportsUI.vala:112
+msgid "_Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:865
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:878
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1161
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1205 src/library/LibraryWindow.vala:1213
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1218
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1223
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1228
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:164
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:165
+#: src/searches/SavedSearchDialog.vala:430
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:166
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:167
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:168
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+#: src/searches/SavedSearchDialog.vala:434
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:240
+#: src/searches/SavedSearchDialog.vala:309
+#: src/searches/SavedSearchDialog.vala:374
+msgid "is"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:241
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:247
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:248
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:249
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:303
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:304
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:367
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:368
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:369
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:431
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:432
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:433
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:446
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:653
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:654
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:655
+msgid "none"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:143
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:146
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:149
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:152
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:155
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:158
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:161
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:167
+msgid "Date"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr ""
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1026
+#: src/Resources.vala:303 src/Resources.vala:351 src/Resources.vala:615
+msgid "_Delete"
+msgstr ""
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr ""
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr ""
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr ""
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr ""
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr ""
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr ""
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:472
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:528
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:531
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:534
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:548
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:551
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:554
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:557
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:571
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:574
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:577
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:580
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:594
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:597
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:600
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:603
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:620
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:635
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:646
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:649
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:652
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:655
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:672
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:675
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:691
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:706
+msgid "Import Complete"
+msgstr ""
+
+#: src/Dialogs.vala:874
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+
+#: src/Dialogs.vala:877
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+
+#: src/Dialogs.vala:881
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+
+#: src/Dialogs.vala:884
+msgid "1 day"
+msgstr ""
+
+#: src/Dialogs.vala:975 src/Resources.vala:184
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:975
+msgid "Name:"
+msgstr ""
+
+#: src/Dialogs.vala:985 src/Resources.vala:253
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:1001
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1005
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1025 src/camera/ImportPage.vala:1681
+msgid "_Keep"
+msgstr ""
+
+#: src/Dialogs.vala:1048
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1048
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1050
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1054
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1054
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1075
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1082
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1083
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1083
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1176
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: src/Dialogs.vala:1321
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1322
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1323
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1338
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1343
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1350
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1350
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1439
+msgid "Original: "
+msgstr ""
+
+# The string %m/%d/%y, %H:%M:%S is a format string that describes a U.S.-style
+# 24 hour date and time (e.g. 9/22/2009, 13:15:04). You should translate
+# %m/%d/%y, %H:%M:%S so that it describes the 24 hour date and time format
+# used in your language and region. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#
+#: src/Dialogs.vala:1440
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr ""
+
+# The string %m/%d/%y, %I:%M:%S %p is a format string that describes a
+# U.S.-style
+# 12 hour date and time with an am/pm specifier (e.g. 9/22/2009, 1:15:04 PM).
+# You
+# should translate %m/%d/%y, %I:%M:%S %p so that it describes the 12 hour date
+# and time format used in your language and region. If 12 hour time isn't used
+# in
+# your region, then use a format string for 24 hour time. The format string
+# you
+# enter should conform to POSIX date and time formatting conventions. See the
+# strftime manpage for a list of format specifiers and their meanings.
+#
+#: src/Dialogs.vala:1441
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr ""
+
+#: src/Dialogs.vala:1530
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1531
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1533
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1534
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1535
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1536
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1580
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+
+#: src/Dialogs.vala:1602 src/Dialogs.vala:1629
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:1709
+msgid "Welcome!"
+msgstr ""
+
+#: src/Dialogs.vala:1716
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr ""
+
+#: src/Dialogs.vala:1720
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:1736
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:1737
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:1738
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:1748
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:1755
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:1765
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:1800
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:1944 src/Dialogs.vala:1948
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:1957
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:1959
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:1961
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:1963
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:1964 src/editing_tools/EditingTools.vala:749
+msgid "Custom"
+msgstr ""
+
+#: src/Dialogs.vala:2201
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2304
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2309
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2310
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2311
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2322
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2336
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2340
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2344
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2376
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:2393
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr ""
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:413
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/RawSupport.vala:300 src/camera/Branch.vala:101
+#: src/camera/ImportPage.vala:676 src/camera/ImportPage.vala:692
+#: src/MediaPage.vala:418
+msgid "Camera"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr ""
+
+#: src/camera/ImportPage.vala:433
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:741
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:742
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:810
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:837 src/MediaPage.vala:429
+msgid "_Titles"
+msgstr ""
+
+#: src/camera/ImportPage.vala:838 src/MediaPage.vala:430
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/camera/ImportPage.vala:849
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:850
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:855
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:856
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:977
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:983
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:988
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:993
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1003
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1008
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1025
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1131
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1465
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1581
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1664
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1667
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1670
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1673
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1700
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1704
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural ""
+"Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:181
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:182
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:185
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:188
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:354
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:355
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:448
+#: src/data_imports/DataImportsUI.vala:394
+msgid "_Close"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/Resources.vala:18 plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:131
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:132 src/Resources.vala:137
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:133
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:134
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:136
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:138
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:139
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:141
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:142
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:145
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:148
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:153
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:156
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:159
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:163
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:167
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:171
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:175
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:183
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:187
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:190
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:193
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:197
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:200
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:203
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:206
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:209
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:212
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:215
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:219
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:223
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:226 src/Resources.vala:227
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:229
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:230 src/Resources.vala:231
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:241
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:248
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:249
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:252
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:256
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:260 src/Resources.vala:291
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:264
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:266
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:268
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:272
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:275
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:280
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:285
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:287
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:295
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:299
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:305
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:308
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:315
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:317
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:318
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:321
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:321
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:325
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:330
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:331
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:336
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:340
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:344
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:347
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:349
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:352
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:353
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:356
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:360
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:517
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:518
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:519
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:521
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:522
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:523
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:524
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:525
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:616
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:617
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:619
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:620
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:622
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:623
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:626
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:629
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:631
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:633
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:634
+msgid "Select all items"
+msgstr ""
+
+# For events that span exactly two days, the dates in the event name are
+# formatted like so: "Tuesday, Feb 14-15, YYYY", where YYYY is a four-digit
+# year.
+# This string is the "Tuesday, Feb 14" portion. You should translate %a %b %d
+# so
+# that it describes a day of the week, a month, and a calendar day in the
+# format
+# used in your language and region. The format string you enter should conform
+# to
+# POSIX date and time formatting conventions. Please see the strftime(3)
+# manpage
+# for a list of format specifiers and their meanings.
+#
+#: src/util/misc.vala:231 src/util/misc.vala:236
+msgid "%a %b %d"
+msgstr ""
+
+# For events that span exactly two days, the dates in the event name are
+# formatted like so: "Tuesday, Feb 14-15, YYYY", where YYYY is a four-digit
+# year.
+# This string is the "15, YYYY" portion. You should translate %d, %Y so that
+# it
+# describes a calendar day and a four-digit year in the format used in your
+# language and region. The format string you enter should conform to POSIX
+# date and time formatting conventions. Please see the strftime(3) manpage for
+# a list of format specifiers and their meanings.
+#
+#: src/util/misc.vala:232
+msgid "%d, %Y"
+msgstr ""
+
+# This is a date and time format string corresponding to a US-style long-form
+# date (e.g. "Wednesday April 4, 2012"). You should translate this string into
+# a long-form date appropriate to your language, country and region. See the
+# strftime(3) man page for more information about what format specifiers are
+# available.
+#
+#: src/util/misc.vala:237 src/util/misc.vala:242 src/util/misc.vala:243
+#: src/util/misc.vala:251
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:885
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/BatchImport.vala:25
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:28
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:31
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:34
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:37
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:40
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:43
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:46
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:49
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:52
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:55
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:58
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:61
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:64
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:324
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:330
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:392
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:401
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:402
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442
+msgid "Display each photo's tags"
+msgstr ""
+
+#: src/MediaPage.vala:458
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:459
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:464
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:465
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:470
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:471
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:688
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/Event.vala:710
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/events/EventPage.vala:86
+msgid "No Event"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:74
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+
+#: src/events/EventsDirectoryPage.vala:134
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:138
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:185
+msgid "Events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:199
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:200
+msgid "%Y"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:201
+msgid "%B"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have at least one data imports plugin enabled. Plugins can be enabled in the Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s មូលដ្ឋាន​ទិន្នន័យ"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:635
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:638
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:650
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:721
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:722
+msgid "Square"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:723
+msgid "Screen"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:724
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1224
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:725
+#: src/editing_tools/EditingTools.vala:728
+#: src/editing_tools/EditingTools.vala:738
+#: src/editing_tools/EditingTools.vala:748
+msgid "-"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:726
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:727
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:734
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:736
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:743
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:747
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1845
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1848
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2177
+#: src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2195
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2202
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2210
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2217
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2270
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2270
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2614
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2627
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2640
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2653
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2666
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2676
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:427
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1291
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1072
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:466
+msgid "couldn't launch system web browser to complete Picasa Web Albums login"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:485
+#: plugins/shotwell-publishing/PicasaPublishing.vala:616
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa Web "
+"Albums can't continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:697
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:715
+#: plugins/shotwell-publishing/FacebookPublishing.vala:481
+msgid "Creating album..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1137
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1142
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1147
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1220
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1221
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1222
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1223
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:68
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the login process. During login, Shotwell Connect may ask you for permission to upload photos and publish to your feed. These permissions are required for Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:70
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:134
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:137
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:269
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:383
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1543
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1544
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1545
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1700
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1701
+msgid "All friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1702
+msgid "Friends of friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1703
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1154
+msgid "Everyone"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use with YouTube to continue. You can set up most accounts by using your browser to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:465
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:771
+msgid ""
+"Enter the email address and password associated with your YouTube account."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:772
+msgid ""
+"YouTube didn't recognize the email address and password you entered. To try "
+"again, re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:773
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that isn't set up for use with YouTube. You can set up most accounts by "
+"using your browser to log into the YouTube site at least once. To try again,"
+" re-enter your email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:774
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that has been tagged as requiring additional security. You can clear this "
+"tag by using your browser to log into YouTube. To try again, re-enter your "
+"email address and password below."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:808
+#, c-format
+msgid "Unrecognized User"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:812
+#, c-format
+msgid "Account Not Ready"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:818
+#, c-format
+msgid "Additional Security Required"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:826
+msgid "_Email address:"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:828
+msgid "_Password:"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:848
+msgid "Go _Back"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:853
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:939
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:940
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:970
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:971
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:972
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1166
+msgid "500 x 375 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1167
+msgid "1024 x 768 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1168
+msgid "2048 x 1536 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1169
+msgid "4096 x 3072 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:693
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:862
+msgid "An error message occured when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:943
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:944
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you"
+" entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:945
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:977
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:982
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1155
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1156
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1157
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1158
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:21
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:68
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing libraries found by Shotwell or by selecting an alternative F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is"
+" not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:220
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:309
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:388
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:415
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:463
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:540
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:561
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:584
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:607
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:630
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:669
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:751
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:768
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:798
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:833
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:887
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:903
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:968
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:995
+msgid "Plugins"
+msgstr ""
diff --git a/po/kn.po b/po/kn.po
new file mode 100644
index 0000000..72a61cd
--- /dev/null
+++ b/po/kn.po
@@ -0,0 +1,4295 @@
+# po/shotwell-core/cs.po
+# Kannada Translation for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# This file is distributed under the GNU LGPL, version 2.1.
+#
+# Translators:
+# Shankar Prasad <svenkate@redhat.com>, 2012.
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# See COPYING for license.
+# shankar <svenkate@redhat.com>, 2012-2013.
+# Shankar <svenkate@redhat.com>, 2013. #zanata
+# Shankar <svenkate@redhat.com>, 2014. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.14\n"
+"Report-Msgid-Bugs-To: Lucas Beeler <lucas@yorba.org>\n"
+"POT-Creation-Date: 2013-02-25 15:16-0800\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"PO-Revision-Date: 2014-01-22 02:21-0500\n"
+"Last-Translator: Shankar <svenkate@redhat.com>\n"
+"Language-Team: Kannada <kde-i18n-doc@kde.org>\n"
+"Language: kn\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Zanata 3.2.3\n"
+
+# Translator credits string for the about box -- translators, add your name
+# below if it's not already present
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "ಶಂಕರ ಪ್ರಸಾದ್ <svenkate@redhat.com>"
+
+# GNOME Application Class ("Generic Name")
+#: src/Resources.vala:15
+msgid "Photo Manager"
+msgstr "ಫೋಟೊ ವ್ಯವಸ್ಥಾಪಕ"
+
+# GNOME Application Name
+msgid "Shotwell Photo Manager"
+msgstr "Shotwell ಚಿತ್ರ ವ್ಯವಸ್ಥಾಪಕ"
+
+# GNOME Application Class for Direct Edit Mode
+#: src/Resources.vala:16
+msgid "Photo Viewer"
+msgstr "ಫೋಟೊ ವೀಕ್ಷಕ"
+
+# GNOME Application Comment
+msgid "Organize your photos"
+msgstr "ನಿಮ್ಮ ಚಿತ್ರಗಳನ್ನು ವ್ಯವಸ್ಥಿತವಾಗಿ ಜೋಡಿಸಿ"
+
+# GNOME Application Name for Direct Edit Mode
+msgid "Shotwell Photo Viewer"
+msgstr "Shotwell ಚಿತ್ರ ವೀಕ್ಷಕ"
+
+# GNOME Application Keywords
+msgid ""
+"album;camera;cameras;crop;edit;enhance;export;gallery;image;images;import;organize;photo;photographs;photos;picture;pictures;photography;print;publish;rotate;share;tags;video;facebook;flickr;picasa;youtube;piwigo;"
+msgstr ""
+"ಆಲ್ಬಮ್;ಕ್ಯಾಮೆರಾ;ಕ್ಯಾಮೆರಾಗಳು;ಓರಣಗೊಳಿಸು;ಸಂಪಾದಿಸು;ಉತ್ತಮಗೊಳಿಸು;ರಫ್ತು;ಗ್ಯಾಲರಿ;ಚಿತ್ರ;ಚಿತ್ರಗಳು;ಆಮದು;ಜೋಡಿಸು;ಫೋಟೊ;ಫೋಟೊಗ್ರಫಿಗಳು;ಫೋಟೊಗಳು;ಫೋಟೊಗ್ರಫಿ;ಮುದ್ರಿಸು;ಪ್ರಕಟಿಸು;ತಿರುಗಿಸು;ಹಂಚು;ಟ್ಯಾಗ್‌ಗಳು;ವೀಡಿಯೊ;facebook;flickr;picasa;youtube;piwigo"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "%s ಫೋಟೊ ದತ್ತಸಂಚಯವನ್ನು ತೆರೆಯಲು/ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: ದೋಷ ಸಂಕೇತ %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid "Unable to write to photo database file:\n"
+" %s"
+msgstr "ಫೋಟೊ ದತ್ತಸಂಚಯ ಕಡತಕ್ಕೆ ಬರೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid "Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr "ದತ್ತಾಂಶ ಆಕರವನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳುವಲ್ಲಿ ದೋಷ:\n"
+" %s\n"
+"\n"
+"ದೋಷ: \n"
+"%s"
+
+#: src/PhotoPage.vala:531
+msgid "Previous photo"
+msgstr "ಹಿಂದಿನ ಫೋಟೊ"
+
+#: src/PhotoPage.vala:536
+msgid "Next photo"
+msgstr "ಮುಂದಿನ ಫೋಟೊ"
+
+#: src/PhotoPage.vala:1832
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ಫೋಟೊ ಆಕರ ಕಡತ ಕಾಣೆಯಾಗಿದೆ: %s"
+
+#: src/PhotoPage.vala:2373 src/direct/DirectPhotoPage.vala:165
+#: src/library/LibraryWindow.vala:356
+msgid "_View"
+msgstr "ನೋಟ (_V)"
+
+#: src/PhotoPage.vala:2377 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "ಉಪಕರಣಗಳು (_o)"
+
+#: src/PhotoPage.vala:2382 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "ಹಿಂದಿನ ಫೋಟೊ (_P)"
+
+#: src/PhotoPage.vala:2383 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "ಹಿಂದಿನ ಫೋಟೊ"
+
+#: src/PhotoPage.vala:2388 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "ಮುಂದಿನ ಫೋಟೊ (_N)"
+
+#: src/PhotoPage.vala:2389 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "ಮುಂದಿನ ಫೋಟೊ"
+
+#: src/PhotoPage.vala:2540 src/MediaPage.vala:325
+#: src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "ಹಿಗ್ಗಿಸು (_I)"
+
+#: src/PhotoPage.vala:2541 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ಫೋಟೊದ ಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್ ಅನ್ನು ಹೆಚ್ಚಿಸಿ"
+
+#: src/PhotoPage.vala:2546 src/MediaPage.vala:331
+#: src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "ಕುಗ್ಗಿಸು (_O)"
+
+#: src/PhotoPage.vala:2547 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ಫೋಟೊದ ಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್ ಅನ್ನು ಕಡಿಮೆಮಾಡು"
+
+#: src/PhotoPage.vala:2552 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "ಪುಟಕ್ಕೆ ಸರಿಹೊಂದಿಸು (_P)"
+
+#: src/PhotoPage.vala:2553 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "ಫೋಟೊವು ತೆರೆಗೆ ಹೊಂದಿಕೊಳ್ಳುವಂತೆ ಗಾತ್ರ ಬದಲಿಸು"
+
+#: src/PhotoPage.vala:2558 src/direct/DirectPhotoPage.vala:192
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "_100% ದಷ್ಟು ಹಿಗ್ಗಿಸು "
+
+#: src/PhotoPage.vala:2559 src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ಫೋಟೊವನ್ನು 100% mಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್‌ನಷ್ಟು ಹಿಗ್ಗಿಸು"
+
+#: src/PhotoPage.vala:2564 src/direct/DirectPhotoPage.vala:198
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "_200% ದಷ್ಟು ಹಿಗ್ಗಿಸು "
+
+#: src/PhotoPage.vala:2565 src/direct/DirectPhotoPage.vala:199
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ಫೋಟೊವನ್ನು 200% mಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್‌ನಷ್ಟು ಹಿಗ್ಗಿಸು"
+
+#: src/PhotoPage.vala:2580 src/CollectionPage.vala:215
+msgid "S_lideshow"
+msgstr "ಜಾರುಫಲಕ ಪ್ರದರ್ಶನ (_l)"
+
+#: src/PhotoPage.vala:2581 src/CollectionPage.vala:216
+msgid "Play a slideshow"
+msgstr "ಜಾರುಫಲಕ ಪ್ರದರ್ಶನವನ್ನು ಚಲಾಯಿಸು"
+
+#: src/PhotoPage.vala:2585 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ವಿಕಸನಗಾರ (_D)"
+
+#: src/PhotoPage.vala:3029 src/Dialogs.vala:2584
+msgid "Remove From Library"
+msgstr "ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದುಹಾಕು"
+
+#: src/PhotoPage.vala:3029 src/Dialogs.vala:2585
+msgid "Removing Photo From Library"
+msgstr "ಫೋಟೊವನ್ನು ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದು ಹಾಕು"
+
+#: src/PhotoPage.vala:3150 src/CollectionPage.vala:438 src/Dialogs.vala:58
+msgid "Export Photo"
+msgstr "ಫೋಟೊವನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/PhotoPage.vala:3170
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s ಗೆ ರಫ್ತು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "ಅಡಕಫೋಟೊಿಕೆಗಳ ಗಾತ್ರವನ್ನು ಸರಿಹೊಂದಿಸು"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "ಅಡಕಫೋಟೊಿಕೆಗಳ ಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್ ಅನ್ನು ಹೆಚ್ಚಿಸಿ"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "ಅಡಕಫೋಟೊಿಕೆಗಳ ಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್ ಅನ್ನು ಕಡಿಮೆಮಾಡಿ"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಜೋಡಿಸಿ (_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "ವೀಡಿಯೋವನ್ನು ಚಲಾಯಿಸು (_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "ವ್ಯವಸ್ಥೆಯ ವೀಡಿಯೊ ಚಾಲಕದಲ್ಲಿ ಆಯ್ಕೆ ಮಾಡಲಾದ ವೀಡಿಯೊವನ್ನು ತೆರೆಯಿರಿ"
+
+#: src/MediaPage.vala:420 src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/MediaPage.vala:425 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/camera/Branch.vala:101
+#: src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "ಕ್ಯಾಮೆರಾ"
+
+#: src/MediaPage.vala:436 src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "ಶೀರ್ಷಿಕೆಗಳು (_T)"
+
+#: src/MediaPage.vala:437 src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "ಪ್ರತಿ ಫೋಟೊದ ಶೀರ್ಷಿಕೆಯನ್ನು ತೋರಿಸು"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "ಟಿಪ್ಪಣಿಗಳು (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ಪ್ರತಿ ಫೋಟೊದ ಟಿಪ್ಪಣಿಯನ್ನು ತೋರಿಸು"
+
+#: src/MediaPage.vala:454 src/library/LibraryWindow.vala:372
+msgid "Ta_gs"
+msgstr "ಟ್ಯಾಗ್‌ಗಳು (_g)"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ಪ್ರತಿ ಫೋಟೊದ ಟ್ಯಾಗ್‌ಗಳನ್ನು ತೋರಿಸು"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "ಶೀರ್ಷಿಕೆಯಿಂದ (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "ಫೋಟೊಗಳನ್ನು ಶೀರ್ಷಿಕೆಗಳ ಆಧಾರದಲ್ಲಿ ಜೋಡಿಸಿ"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "ಎಕ್ಸ್‌‍ಪೋಶರ್ ದಿನಾಂಕದ ಆಧಾರದಲ್ಲಿ (_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "ಫೋಟೊಗಳನ್ನು ಎಕ್ಸ್‌‍ಪೋಶರ್ ದಿನಾಂಕದ ಮೇರೆಗೆ ಜೋಡಿಸಿ"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "ದರದ ಮೇರೆಗೆ (_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "ಫೋಟೊಗಳನ್ನು ದರಗಳ ಆಧಾರದಲ್ಲಿ ಜೋಡಿಸಿ"
+
+#: src/MediaPage.vala:494 src/library/LibraryWindow.vala:418
+msgid "_Ascending"
+msgstr "ಏರಿಕೆ ಕ್ರಮ (_A)"
+
+#: src/MediaPage.vala:495 src/library/LibraryWindow.vala:419
+msgid "Sort photos in an ascending order"
+msgstr "ಫೋಟೊಗಳನ್ನು ಏರಿಕೆ ಕ್ರಮದಲ್ಲಿ ಜೋಡಿಸಿ"
+
+#: src/MediaPage.vala:500 src/library/LibraryWindow.vala:425
+msgid "D_escending"
+msgstr "ಇಳಿಕೆ ಕ್ರಮ (_D)"
+
+#: src/MediaPage.vala:501 src/library/LibraryWindow.vala:426
+msgid "Sort photos in a descending order"
+msgstr "ಫೋಟೊಗಳನ್ನು ಇಳಿಕೆ ಕ್ರಮದಲ್ಲಿ ಜೋಡಿಸಿ"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid "Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr "ಆಯ್ಕೆ ಮಾಡಿದ ವೀಡಿಯೊವನ್ನು ಚಲಾಯಿಸಲು Shotwell ನಿಂದ ಸಾಧ್ಯವಾಗಿಲ್ಲ:\n"
+"%s"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "ಸಂದರ್ಭ %s"
+
+#: src/CollectionPage.vala:436
+msgid "Export Photo/Video"
+msgstr "ಫೋಟೊವನ್ನು/ವೀಡಿಯೊವನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/CollectionPage.vala:436
+msgid "Export Photos/Videos"
+msgstr "ಫೋಟೊಗಳನ್ನು/ವೀಡಿಯೊಗಳನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/CollectionPage.vala:438 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/CollectionPage.vala:525 src/CollectionPage.vala:541
+msgid "Rotating"
+msgstr "ತಿರುಗಿಸುವಿಕೆ"
+
+#: src/CollectionPage.vala:525 src/CollectionPage.vala:541
+msgid "Undoing Rotate"
+msgstr "ತಿರುಗಿಸುವಿಕೆಯನ್ನು ರದ್ದು ಮಾಡು"
+
+#: src/CollectionPage.vala:550
+msgid "Flipping Horizontally"
+msgstr "ಅಡ್ಡವಾಗಿ ಮಗುಚುವಿಕೆ"
+
+#: src/CollectionPage.vala:551
+msgid "Undoing Flip Horizontally"
+msgstr "ಅಡ್ಡವಾಗಿ ಮಗುಚಿದ್ದನ್ನು ರದ್ದುಗೊಳಿಸು"
+
+#: src/CollectionPage.vala:560
+msgid "Flipping Vertically"
+msgstr "ಲಂಬವಾಗಿ ಮಗುಚುವಿಕೆ"
+
+#: src/CollectionPage.vala:561
+msgid "Undoing Flip Vertically"
+msgstr "ಲಂಬವಾಗಿ ಮಗುಚಿದ್ದನ್ನು ರದ್ದುಗೊಳಿಸು"
+
+#: src/BatchImport.vala:25
+msgid "Success"
+msgstr "ಯಶಸ್ವಿಯಾಗಿದೆ"
+
+#: src/BatchImport.vala:28
+msgid "File error"
+msgstr "ಕಡತದಲ್ಲಿ ದೋಷ"
+
+#: src/BatchImport.vala:31
+msgid "Unable to decode file"
+msgstr "ಕಡತವನ್ನು ಡೀಕೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ"
+
+#: src/BatchImport.vala:34
+msgid "Database error"
+msgstr "ದತ್ತಸಂಚಯ ದೋಷ"
+
+#: src/BatchImport.vala:37
+msgid "User aborted import"
+msgstr "ಬಳಕೆದಾರರು ಆಮದನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಿದ್ದಾರೆ"
+
+#: src/BatchImport.vala:40
+msgid "Not a file"
+msgstr "ಒಂದು ಕಡತವಾಗಿಲ್ಲ"
+
+#: src/BatchImport.vala:43
+msgid "File already exists in database"
+msgstr "ಕಡತವು ದತ್ತಸಂಚಯದಲ್ಲಿ ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ"
+
+#: src/BatchImport.vala:46
+msgid "Unsupported file format"
+msgstr "ಬೆಂಬಲವಿರದ ಕಡತ ವಿನ್ಯಾಸ"
+
+#: src/BatchImport.vala:49
+msgid "Not an image file"
+msgstr "ಒಂದು ಫೋಟೊ ಕಡತವಾಗಿಲ್ಲ"
+
+#: src/BatchImport.vala:52
+msgid "Disk failure"
+msgstr "ಡಿಸ್ಕ್‍ ವಿಫಲತೆ"
+
+#: src/BatchImport.vala:55
+msgid "Disk full"
+msgstr "ಡಿಸ್ಕ್‍ ತುಂಬಿದೆ"
+
+#: src/BatchImport.vala:58
+msgid "Camera error"
+msgstr "ಕ್ಯಾಮೆರಾ ದೋಷ"
+
+#: src/BatchImport.vala:61
+msgid "File write error"
+msgstr "ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ"
+
+#: src/BatchImport.vala:64
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "ಆಮದು ಮಾಡಿಕೊಂಡಿದ್ದು ವಿಫಲಗೊಂಡಿದೆ (%d)"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "ಜಾರುಫಲಕಪ್ರದರ್ಶನದ ಬದಲಾವಣೆಗಳು"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(ಯಾವದೂ ಇಲ್ಲ)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "ಯಾವುದೂ ಇಲ್ಲ"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "ಯಾವುದಾದರು"
+
+#: src/SearchFilter.vala:632 src/SearchFilter.vala:633
+#: src/SearchFilter.vala:1029 src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "ಫ್ಲ್ಯಾಗ್ ಮಾಡಿದ"
+
+#: src/SearchFilter.vala:638 src/SearchFilter.vala:639
+msgid "Photos"
+msgstr "ಫೋಟೊಗಳು"
+
+#: src/SearchFilter.vala:644 src/SearchFilter.vala:645
+msgid "Videos"
+msgstr "ವೀಡಿಯೋಗಳು"
+
+#: src/SearchFilter.vala:650
+msgid "RAW Photos"
+msgstr "RAW ಫೋಟೊಗಳು"
+
+#: src/SearchFilter.vala:651
+msgid "RAW photos"
+msgstr "RAW ಫೋಟೊಗಳು"
+
+#: src/SearchFilter.vala:991
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "%s UI ಕಡತವನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: %s"
+
+#: src/SearchFilter.vala:1008
+msgid "Type"
+msgstr "ಬಗೆ"
+
+#: src/SearchFilter.vala:1042 src/searches/SearchBoolean.vala:164
+msgid "Rating"
+msgstr "ದರನೀಡಿಕೆ"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "%s ಎಂಬ ಕ್ಯಾಶೆ ಕೋಶವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "%s ಎಂಬ ದತ್ತಾಂಶ ಕೋಶವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ಫೋಟೊಗಳು"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "%s ಎಂಬ ತಾತ್ಕಾಲಿಕ ಕೋಶವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "%s ಎಂಬ ಉಪ ಕೋಶವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/SlideshowPage.vala:43 src/SlideshowPage.vala:242
+msgid "Settings"
+msgstr "ಸಿದ್ಧತೆಗಳು"
+
+#: src/SlideshowPage.vala:45
+msgid "_Delay:"
+msgstr "ವಿಳಂಬ (_D):"
+
+#: src/SlideshowPage.vala:47 src/SlideshowPage.vala:49
+msgid "seconds"
+msgstr "ಸೆಕೆಂಡುಗಳು"
+
+#: src/SlideshowPage.vala:65
+msgid "_Transition effect:"
+msgstr "ಪರಿವರ್ತನೆಯ ಪರಿಣಾಮ (_T):"
+
+#: src/SlideshowPage.vala:92
+msgid "Transition d_elay:"
+msgstr "ಪರಿವರ್ತನೆಯ ವಿಳಂಬ (_e):"
+
+#: src/SlideshowPage.vala:110
+msgid "Show t_itle"
+msgstr "ಶೀರ್ಷಿಕೆಯನ್ನು ತೋರಿಸು (_i)"
+
+#: src/SlideshowPage.vala:201 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "ಜಾರುಫಲಕ ಪ್ರದರ್ಶನ"
+
+#: src/SlideshowPage.vala:221
+msgid "Back"
+msgstr "ಹಿಂದಕ್ಕೆ"
+
+#: src/SlideshowPage.vala:222
+msgid "Go to the previous photo"
+msgstr "ಹಿಂದಿನ ಫೋಟೊಕ್ಕೆ ತೆರಳು"
+
+#: src/SlideshowPage.vala:228 src/SlideshowPage.vala:333
+msgid "Pause"
+msgstr "ವಿರಮಿಸು"
+
+#: src/SlideshowPage.vala:229 src/SlideshowPage.vala:334
+msgid "Pause the slideshow"
+msgstr "ಜಾರುಫಲಕ ಪ್ರದರ್ಶನವನ್ನು ತಡೆಹಿಡಿ"
+
+#: src/SlideshowPage.vala:235
+msgid "Next"
+msgstr "ಮುಂದಕ್ಕೆ"
+
+#: src/SlideshowPage.vala:236
+msgid "Go to the next photo"
+msgstr "ಮುಂದಿನ ಫೋಟೊಕ್ಕೆ ತೆರಳು"
+
+#: src/SlideshowPage.vala:243
+msgid "Change slideshow settings"
+msgstr "ಜಾರುಫಲಕದ ಸಿದ್ಧತೆಗಳನ್ನು ಬದಲಾಯಿಸು"
+
+#: src/SlideshowPage.vala:297
+msgid "All photo source files are missing."
+msgstr "ಎಲ್ಲಾ ಫೋಟೊದ ಆಕರ ಕಡತಗಳು ಕಾಣೆಯಾಗಿವೆ."
+
+#: src/SlideshowPage.vala:329
+msgid "Play"
+msgstr "ಚಾಲನೆ ಮಾಡು"
+
+#: src/SlideshowPage.vala:330
+msgid "Continue the slideshow"
+msgstr "ಜಾರುಫಲಕ ಪ್ರದರ್ಶನವನ್ನು ಮುಂದುವರೆಸು"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s ಎಂಬುದಕ್ಕಾಗಿ ತಾತ್ಕಾಲಿಕ ಕಡತವನ್ನು ನಿರ್ಮಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "ರಫ್ತುಮಾಡಲಾಗುತ್ತಿದೆ"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s ಎಂಬ ಕಡತವು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ಅದನ್ನು ಬದಲಿಸಬೇಕೇ?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "ಕಡೆಗಣಿಸು (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "ಬದಲಾಯಿಸು (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "ಎಲ್ಲವನ್ನೂ ಬದಲಿಸು (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "ರಫ್ತು"
+
+#: src/Tag.vala:815
+msgid "untitled"
+msgstr "ಶೀರ್ಷಿಕೆರಹಿತ"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+msgid "Original size"
+msgstr "ಮೂಲ ಗಾತ್ರ"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "ಅಗಲ ಅಥವ ಎತ್ತರ"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "ಅಗಲ"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ಎತ್ತರ"
+
+#: src/sidebar/Tree.vala:196 src/library/LibraryWindow.vala:342
+#: src/searches/Branch.vala:77
+msgid "Ne_w Saved Search..."
+msgstr "ಹೊಸ ಉಳಿಸಿದ ಹುಡುಕಾಟ (_w)..."
+
+#: src/sidebar/Tree.vala:200
+msgid "New _Tag..."
+msgstr "ಹೊಸ ಟ್ಯಾಗ್ (_T)..."
+
+#: src/Resources.vala:18
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "ಹಕ್ಕು 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:132
+msgid "Rotate _Right"
+msgstr "ಬಲಕ್ಕೆ ತಿರುಗಿಸು (_R)"
+
+#: src/Resources.vala:133 src/Resources.vala:138
+msgid "Rotate"
+msgstr "ತಿರುಗಿಸು"
+
+#: src/Resources.vala:134
+msgid "Rotate Right"
+msgstr "ಬಲಕ್ಕೆ ತಿರುಗಿಸು"
+
+#: src/Resources.vala:135
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "ಫೋಟೊಗಳನ್ನು ಬಲಕ್ಕೆ ತಿರುಗಿಸಿ (ಎಡಕ್ಕೆ ತಿರುಗಿಸಲು Ctrl ಅನ್ನು ಒತ್ತಿ)"
+
+#: src/Resources.vala:137
+msgid "Rotate _Left"
+msgstr "ಎಡಕ್ಕೆ ತಿರುಗಿಸು (_L)"
+
+#: src/Resources.vala:139
+msgid "Rotate Left"
+msgstr "ಎಡಕ್ಕೆ ತಿರುಗಿಸು"
+
+#: src/Resources.vala:140
+msgid "Rotate the photos left"
+msgstr "ಫೋಟೊಗಳನ್ನು ಎಡಕ್ಕೆ ತಿರುಗಿಸಿ"
+
+#: src/Resources.vala:142
+msgid "Flip Hori_zontally"
+msgstr "ಅಡ್ಡವಾಗಿ ಮಗುಚು (_z)"
+
+#: src/Resources.vala:143
+msgid "Flip Horizontally"
+msgstr "ಅಡ್ಡವಾಗಿ ಮಗುಚು"
+
+#: src/Resources.vala:145
+msgid "Flip Verti_cally"
+msgstr "ಲಂಬವಾಗಿ ಮಗುಚು (_c)"
+
+#: src/Resources.vala:146
+msgid "Flip Vertically"
+msgstr "ಲಂಬವಾಗಿ ಮಗುಚು"
+
+#: src/Resources.vala:148
+msgid "_Enhance"
+msgstr "ವರ್ಧಿಸು ಸ(_E)"
+
+#: src/Resources.vala:149
+msgid "Enhance"
+msgstr "ವರ್ಧಿಸು"
+
+#: src/Resources.vala:150
+msgid "Automatically improve the photo's appearance"
+msgstr "ಫೋಟೊದ ಗೋಚರಿಕೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸುಧಾರಿಸು"
+
+#: src/Resources.vala:152
+msgid "_Crop"
+msgstr "ಅಂದಗೊಳಿಸು (_C)"
+
+#: src/Resources.vala:153
+msgid "Crop"
+msgstr "ಅಂದಗೊಳಿಸು"
+
+#: src/Resources.vala:154
+msgid "Crop the photo's size"
+msgstr "ಫೋಟೊದ ಗಾತ್ರವನ್ನು ಕತ್ತರಿಸು"
+
+#: src/Resources.vala:156 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "ನೇರವಾಗಿಸು (_S)"
+
+#: src/Resources.vala:157
+msgid "Straighten"
+msgstr "ನೇರವಾಗಿಸು"
+
+#: src/Resources.vala:158
+msgid "Straighten the photo"
+msgstr "ಫೋಟೊವನ್ನು ನೇರವಾಗಿಸು"
+
+#: src/Resources.vala:160
+msgid "_Red-eye"
+msgstr "ಕೆಂಪು ಕಣ್ಣು (_R)"
+
+#: src/Resources.vala:161
+msgid "Red-eye"
+msgstr "ಕೆಂಪು-ಕಣ್ಣು"
+
+#: src/Resources.vala:162
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+"ಫೋಟೊದಲ್ಲಿ ಇರಬಹುದಾದ ಯಾವುದೆ ಕೆಂಪು-ಕಣ್ಣಿನ ಪರಿಣಾಮಗಳನ್ನು ಕಡಿಮೆ ಮಾಡು ಅಥವ "
+"ತೆಗೆದುಹಾಕು"
+
+#: src/Resources.vala:164
+msgid "_Adjust"
+msgstr "ಸರಿಹೊಂದಿಸು (_A)"
+
+#: src/Resources.vala:165
+msgid "Adjust"
+msgstr "ಸರಿಹೊಂದಿಸು"
+
+#: src/Resources.vala:166
+msgid "Adjust the photo's color and tone"
+msgstr "ಫೋಟೊದ ಬಣ್ಣ ಮತ್ತು ಬಣ್ಣದ ಛಾಯೆಯನ್ನು ಸರಿಹೊಂದಿಸು"
+
+#: src/Resources.vala:168
+msgid "Re_vert to Original"
+msgstr "ಮೂಲಕ್ಕೆ ಮರಳಿಸು (_v)"
+
+#: src/Resources.vala:169
+msgid "Revert to Original"
+msgstr "ಮೂಲಕ್ಕೆ ಮರಳಿಸು"
+
+#: src/Resources.vala:171
+msgid "Revert External E_dits"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದನೆಯನ್ನು ಹಿಮ್ಮರಳಿಸು (_d) "
+
+#: src/Resources.vala:172
+msgid "Revert to the master photo"
+msgstr "ಮಾಸ್ಟರ್ ಫೋಟೊಕ್ಕೆ ಹಿಮ್ಮರಳಿಸು"
+
+#: src/Resources.vala:174
+msgid "Set as _Desktop Background"
+msgstr "ಗಣಕತೆರೆಯ ಹಿನ್ನಲೆಯಾಗಿ ಹೊಂದಿಸು (_D)"
+
+#: src/Resources.vala:175
+msgid "Set selected image to be the new desktop background"
+msgstr "ಆರಿಸಲಾದ ಫೋಟೊವನ್ನು ಗಣಕತೆರೆಯ ಹೊಸ ಹಿನ್ನಲೆಯಾಗಿ ಬಳಸು"
+
+#: src/Resources.vala:176
+msgid "Set as _Desktop Slideshow..."
+msgstr "ಗಣಕತೆರೆಯ ಜಾರುಫಲಕಪ್ರದರ್ಶನವಾಗಿ ಹೊಂದಿಸು (_D)..."
+
+#: src/Resources.vala:178
+msgid "_Undo"
+msgstr "ರದ್ದುಗೊಳಿಸು (_U)"
+
+#: src/Resources.vala:179
+msgid "Undo"
+msgstr "ರದ್ದುಮಾಡು"
+
+#: src/Resources.vala:181
+msgid "_Redo"
+msgstr "ಪುನಃ ಮಾಡು (_R)"
+
+#: src/Resources.vala:182
+msgid "Redo"
+msgstr "ಮತ್ತೆ ಮಾಡು"
+
+#: src/Resources.vala:184
+msgid "Re_name Event..."
+msgstr "ಸಂದರ್ಭವನ್ನು ಮರುಹೆಸರಿಸು (_n)..."
+
+#: src/Resources.vala:185 src/Dialogs.vala:1219
+msgid "Rename Event"
+msgstr "ಸಂದರ್ಭವನ್ನು ಮರುಹೆಸರಿಸು"
+
+#: src/Resources.vala:187
+msgid "Make _Key Photo for Event"
+msgstr "ಸಂದರ್ಭಕ್ಕಾಗಿ ಪ್ರಮುಖ ಫೋಟೊವನ್ನು ನಿರ್ಮಿಸು (_K)"
+
+#: src/Resources.vala:188
+msgid "Make Key Photo for Event"
+msgstr "ಸಂದರ್ಭಕ್ಕಾಗಿ ಪ್ರಮುಖ ಫೋಟೊವನ್ನು ನಿರ್ಮಿಸು"
+
+#: src/Resources.vala:190
+msgid "_New Event"
+msgstr "ಹೊಸ ಸಂದರ್ಭ (_N)"
+
+#: src/Resources.vala:191
+msgid "New Event"
+msgstr "ಹೊಸ ಸಂದರ್ಭ"
+
+#: src/Resources.vala:193
+msgid "Move Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Resources.vala:194
+msgid "Move photos to an event"
+msgstr "ಫೋಟೊಗಳನ್ನು ಒಂದು ಸಂದರ್ಭಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Resources.vala:196
+msgid "_Merge Events"
+msgstr "ಸಂದರ್ಭಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು (_M)"
+
+#: src/Resources.vala:197
+msgid "Merge"
+msgstr "ವಿಲೀನಗೊಳಿಸು"
+
+#: src/Resources.vala:198
+msgid "Combine events into a single event"
+msgstr "ಹಲವು ಸಂದರ್ಭಗಳನ್ನು ಒಂದು ಸಂದರ್ಭವಾಗಿ ವಿಲೀನಗೊಳಿಸು"
+
+#: src/Resources.vala:200
+msgid "_Set Rating"
+msgstr "ದರವನ್ನು ಹೊಂದಿಸು (_S)"
+
+#: src/Resources.vala:201
+msgid "Set Rating"
+msgstr "ದರವನ್ನು ಹೊಂದಿಸು"
+
+#: src/Resources.vala:202
+msgid "Change the rating of your photo"
+msgstr "ನಿಮ್ಮ ಫೋಟೊದ ದರವನ್ನು ಬದಲಾಯಿಸಿ"
+
+#: src/Resources.vala:204
+msgid "_Increase"
+msgstr "ಹೆಚ್ಚಿಸು (_I)"
+
+#: src/Resources.vala:205
+msgid "Increase Rating"
+msgstr "ದರವನ್ನು ಹೆಚ್ಚಿಸು"
+
+#: src/Resources.vala:207
+msgid "_Decrease"
+msgstr "ಕಡಿಮೆ ಮಾಡು (_D)"
+
+#: src/Resources.vala:208
+msgid "Decrease Rating"
+msgstr "ದರವನ್ನು ಕಡಿಮೆ ಮಾಡು"
+
+#: src/Resources.vala:210
+msgid "_Unrated"
+msgstr "ದರರಹಿತ (_U)"
+
+#: src/Resources.vala:211
+msgid "Unrated"
+msgstr "ದರರಹಿತ"
+
+#: src/Resources.vala:212
+msgid "Rate Unrated"
+msgstr "ದರರಹಿತವೆಂದು ದರನೀಡು"
+
+#: src/Resources.vala:213
+msgid "Setting as unrated"
+msgstr "ದರರಹಿತವೆಂದು ಹೊಂದಿಸುವಿಕೆ"
+
+#: src/Resources.vala:214
+msgid "Remove any ratings"
+msgstr "ಯಾವುದೆ ದರಗಳನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/Resources.vala:216
+msgid "_Rejected"
+msgstr "ತಿರಸ್ಕೃತಗೊಂಡಿವೆ (_R)"
+
+#: src/Resources.vala:217
+msgid "Rejected"
+msgstr "ತಿರಸ್ಕರಿಸಲಾಗಿದೆ"
+
+#: src/Resources.vala:218
+msgid "Rate Rejected"
+msgstr "ದರವನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ"
+
+#: src/Resources.vala:219
+msgid "Setting as rejected"
+msgstr "ಸಿದ್ಧತೆಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ"
+
+#: src/Resources.vala:220
+msgid "Set rating to rejected"
+msgstr "ದರವನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸು"
+
+#: src/Resources.vala:222
+msgid "Rejected _Only"
+msgstr "ತಿರಸ್ಕರಿಸಲಾದವು ಮಾತ್ರ (_O)"
+
+#: src/Resources.vala:223
+msgid "Rejected Only"
+msgstr "ತಿರಸ್ಕರಿಸಲಾದವು ಮಾತ್ರ"
+
+#: src/Resources.vala:224
+msgid "Show only rejected photos"
+msgstr "ಕೇವಲ ತಿರಸ್ಕರಿಸಲಾದ ಫೋಟೊಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು"
+
+#: src/Resources.vala:226
+msgid "All + _Rejected"
+msgstr "ಎಲ್ಲವೂ + ತಿರಸ್ಕೃತಗೊಂಡವು (_R)"
+
+#: src/Resources.vala:227 src/Resources.vala:228
+msgid "Show all photos, including rejected"
+msgstr "ಎಲ್ಲಾ ಫೋಟೊಗಳನ್ನು ತೋರಿಸು, ತಿರಸ್ಕೃತಗೊಂಡವೂ ಸೇರಿ"
+
+#: src/Resources.vala:230
+msgid "_All Photos"
+msgstr "ಎಲ್ಲಾ ಫೋಟೊಗಳು (_A)"
+
+#: src/Resources.vala:231 src/Resources.vala:232
+msgid "Show all photos"
+msgstr "ಎಲ್ಲಾ ಫೋಟೊಗಳನ್ನು ತೋರಿಸು"
+
+#: src/Resources.vala:234
+msgid "_Ratings"
+msgstr "ದರಗಳು (_R)"
+
+#: src/Resources.vala:235
+msgid "Display each photo's rating"
+msgstr "ಪ್ರತಿ ಫೋಟೊದ ದರಗಳನ್ನು ತೋರಿಸು"
+
+#: src/Resources.vala:237
+msgid "_Filter Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಸೋಸು (_F)"
+
+#: src/Resources.vala:238
+msgid "Filter Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಸೋಸು"
+
+#: src/Resources.vala:239
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "ಸೋಸುವಿಕೆಯ ಆಧಾರದಲ್ಲಿ ತೋರಿಸಲಾಗುವ ಫೋಟೊಗಳ ಸಂಖ್ಯೆಯನ್ನು ಮಿತಿಗೊಳಿಸು"
+
+#: src/Resources.vala:241
+msgid "_Duplicate"
+msgstr "ನಕಲು ಪ್ರತಿಯನ್ನು ಮಾಡು (_D)"
+
+#: src/Resources.vala:242
+msgid "Duplicate"
+msgstr "ನಕಲು"
+
+#: src/Resources.vala:243
+msgid "Make a duplicate of the photo"
+msgstr "ಫೋಟೊದ ನಕಲು ಪ್ರತಿಯನ್ನು ಮಾಡು"
+
+#: src/Resources.vala:245
+msgid "_Export..."
+msgstr "ರಫ್ತು ಮಾಡು (_E)..."
+
+#: src/Resources.vala:247
+msgid "_Print..."
+msgstr "ಮುದ್ರಿಸು (_P)..."
+
+#: src/Resources.vala:249
+msgid "Pu_blish..."
+msgstr "ಪ್ರಕಟಿಸು (_b)..."
+
+#: src/Resources.vala:250
+msgid "Publish"
+msgstr "ಪ್ರಕಟಿಸು"
+
+#: src/Resources.vala:251
+msgid "Publish to various websites"
+msgstr "ವಿವಿಧ ಜಾಲತಾಣಗಳಲ್ಲಿ ಪ್ರಕಟಿಸು"
+
+#: src/Resources.vala:253
+msgid "Edit _Title..."
+msgstr "ಶೀರ್ಷಿಕೆಯನ್ನು ಸಂಪಾದಿಸು (_T)..."
+
+#: src/Resources.vala:254 src/Dialogs.vala:1229
+msgid "Edit Title"
+msgstr "ಶೀರ್ಷಿಕೆಯನ್ನು ಸಂಪಾದಿಸು"
+
+#: src/Resources.vala:256
+msgid "Edit _Comment..."
+msgstr "ಟಿಪ್ಪಣಿಯನ್ನು ಸಂಪಾದಿಸು (_C)..."
+
+#: src/Resources.vala:257 src/Dialogs.vala:1243
+msgid "Edit Comment"
+msgstr "ಟಿಪ್ಪಣಿಯನ್ನು ಸಂಪಾದಿಸು"
+
+#: src/Resources.vala:259
+msgid "_Adjust Date and Time..."
+msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯವನ್ನು ಹೊಂದಿಸು (_A)..."
+
+#: src/Resources.vala:260
+msgid "Adjust Date and Time"
+msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯವನ್ನು ಹೊಂದಿಸು"
+
+#: src/Resources.vala:262
+msgid "Add _Tags..."
+msgstr "ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸು (_T)..."
+
+#: src/Resources.vala:263
+msgid "_Add Tags..."
+msgstr "ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸು (_A)..."
+
+#: src/Resources.vala:264 src/Resources.vala:295
+msgid "Add Tags"
+msgstr "ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸು"
+
+#: src/Resources.vala:266
+msgid "_Preferences"
+msgstr "ಆದ್ಯತೆಗಳು (_P)"
+
+#: src/Resources.vala:268
+msgid "Open With E_xternal Editor"
+msgstr "ಹೊರಗಿನ ಸಂಪಾದಕದೊಂದಿಗೆ ತೆರೆ (_x)"
+
+#: src/Resources.vala:270
+msgid "Open With RA_W Editor"
+msgstr "RA_W ಸಂಪಾದಕದೊಂದಿಗೆ ತೆರೆ"
+
+#: src/Resources.vala:272
+msgid "Send _To..."
+msgstr "ಇಲ್ಲಿಗೆ ಕಳುಹಿಸು (_T)..."
+
+#: src/Resources.vala:273
+msgid "Send T_o..."
+msgstr "ಇಲ್ಲಿಗೆ ಕಳುಹಿಸು (_o)..."
+
+#: src/Resources.vala:275
+msgid "_Find..."
+msgstr "ಹುಡುಕು (_F)..."
+
+#: src/Resources.vala:276
+msgid "Find"
+msgstr "ಹುಡುಕು"
+
+#: src/Resources.vala:277
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"ಒಂದು ಫೋಟೊದ ಹೆಸರು ಅಥವ ಟ್ಯಾಗ್‌ಗಳಲ್ಲಿರುವ ಪಠ್ಯವನ್ನು ನಮೂದಿಸುವ ಮೂಲಕ ಅದನ್ನು ಪತ್ತೆ "
+"ಮಾಡಿ"
+
+#: src/Resources.vala:279
+msgid "_Flag"
+msgstr "ಫ್ಲ್ಯಾಗ್‌ ಮಾಡು (_F)"
+
+#: src/Resources.vala:281
+msgid "Un_flag"
+msgstr "ಫ್ಲ್ಯಾಗ್‌ ರದ್ದುಮಾಡು (_f)"
+
+#: src/Resources.vala:284
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "ಸಂಪಾದಕವನ್ನು ಆರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/Resources.vala:289
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "\"%s\" ಎನ್ನುವ ಟ್ಯಾಗ್ ಅನ್ನು ಸೇರಿಸು"
+
+#: src/Resources.vala:291
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" \"%s\" ಎನ್ನುವ ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸು"
+
+#: src/Resources.vala:299
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "\"%s\" ಎನ್ನುವ ಟ್ಯಾಗ್ ಅನ್ನು ಅಳಿಸು (_D)"
+
+#: src/Resources.vala:303
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "\"%s\" ಎನ್ನುವ ಟ್ಯಾಗ್ ಅನ್ನು ಅಳಿಸು"
+
+#: src/Resources.vala:306
+msgid "Delete Tag"
+msgstr "ಟ್ಯಾಗ್ ಅನ್ನು ಅಳಿಸು"
+
+#: src/Resources.vala:307 src/Resources.vala:355 src/Resources.vala:619
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1284
+msgid "_Delete"
+msgstr "ಅಳಿಸಿ ಹಾಕು (_D)"
+
+#: src/Resources.vala:309
+msgid "_New"
+msgstr "ಹೊಸ (_N)"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" ಟ್ಯಾಗ್ ಅನ್ನು ಮರುಹೆಸರಿಸು (_n)..."
+
+#: src/Resources.vala:316
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" ಟ್ಯಾಗ್‌ ಅನ್ನು \"%s\" ಎನ್ನುವುದಕ್ಕೆ ಮರುಹೆಸರಿಸು"
+
+#: src/Resources.vala:319
+msgid "_Rename..."
+msgstr "ಮರುಹೆಸರಿಸು (_R)..."
+
+#: src/Resources.vala:321
+msgid "Modif_y Tags..."
+msgstr "ಟ್ಯಾಗ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸು (_y)..."
+
+#: src/Resources.vala:322
+msgid "Modify Tags"
+msgstr "ಟ್ಯಾಗ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸು"
+
+#: src/Resources.vala:325
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ಫೋಟೊವನ್ನು \"%s\" ಎಂದು ಟ್ಯಾಗ್‌ ಮಾಡು"
+
+#: src/Resources.vala:325
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ಫೋಟೊಗಳನ್ನು \"%s\" ಎಂದು ಟ್ಯಾಗ್‌ ಮಾಡು"
+
+#: src/Resources.vala:329
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "ಆಯ್ದ ಫೋಟೊವನ್ನು \"%s\" ಎಂದು ಟ್ಯಾಗ್ ಮಾಡು"
+
+#: src/Resources.vala:330
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳನ್ನು \"%s\" ಎಂದು ಟ್ಯಾಗ್ ಮಾಡು"
+
+#: src/Resources.vala:334
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ಫೋಟೊದಿಂದ \"%s\" ಎಂಬ ಟ್ಯಾಗ್ ಅನ್ನು ತೆಗೆದುಹಾಕು (_P)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ಫೋಟೊಗಳಿಂದ \"%s\" ಎಂಬ ಟ್ಯಾಗ್ ಅನ್ನು ತೆಗೆದುಹಾಕು (_P)"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ಫೋಟೊದಿಂದ \"%s\" ಎಂಬ ಟ್ಯಾಗ್ ಅನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/Resources.vala:340
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ಫೋಟೊದಿಂದ \"%s\" ಎಂಬ ಟ್ಯಾಗ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/Resources.vala:344
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"ಟ್ಯಾಗ್ ಅನ್ನು \"%s\" ಎಂಬುದಕ್ಕೆ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ, ಏಕೆಂದರೆ ಈ ಟ್ಯಾಗ್‌ "
+"ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ."
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"ಹುಡುಕಾಟವನ್ನು \"%s\" ಎಂಬುದಕ್ಕೆ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ, ಏಕೆಂದರೆ ಈ ಹುಡುಕಾಟವು "
+"ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ."
+
+#: src/Resources.vala:351
+msgid "Saved Search"
+msgstr "ಉಳಿಸಿದ ಹುಡುಕಾಟ"
+
+#: src/Resources.vala:353
+msgid "Delete Search"
+msgstr "ಹುಡುಕಾಟವನ್ನು ಅಳಿಸು"
+
+#: src/Resources.vala:356
+msgid "_Edit..."
+msgstr "ಸಂಪಾದನೆ (_E)..."
+
+#: src/Resources.vala:357
+msgid "Re_name..."
+msgstr "ಮರುಹೆಸರಿಸು (_n)..."
+
+#: src/Resources.vala:360
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" ಹುಡುಕಾಟವನ್ನು \"%s\" ಎನ್ನುವುದಕ್ಕೆ ಮರುಹೆಸರಿಸು"
+
+#: src/Resources.vala:364
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" ಹುಡುಕಾಟವನ್ನು ಅಳಿಸು"
+
+#: src/Resources.vala:521
+#, c-format
+msgid "Rate %s"
+msgstr "ದರ %s"
+
+#: src/Resources.vala:522
+#, c-format
+msgid "Set rating to %s"
+msgstr "ದರವನ್ನು %s ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸು"
+
+#: src/Resources.vala:523
+#, c-format
+msgid "Setting rating to %s"
+msgstr "ದರವನ್ನು %s ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸುವಿಕೆ"
+
+#: src/Resources.vala:525
+#, c-format
+msgid "Display %s"
+msgstr "%s ತೋರಿಸು"
+
+#: src/Resources.vala:526
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s ದರದ ಫೋಟೊಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು"
+
+#: src/Resources.vala:527
+#, c-format
+msgid "%s or Better"
+msgstr "%s ಅಥವ ಉತ್ತಮವಾದ"
+
+#: src/Resources.vala:528
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s ಅಥವ ಉತ್ತಮವಾದುದನ್ನು ತೋರಿಸು"
+
+#: src/Resources.vala:529
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s ಅಥವ ಉತ್ತಮವಾದ ದರದ ಫೋಟೊಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು"
+
+#: src/Resources.vala:620
+msgid "Remove the selected photos from the trash"
+msgstr "ಆರಿಸಲಾದ ಫೋಟೊಗಳನ್ನು ಕಸದಬುಟ್ಟಿಯಿಂದ ತೆಗೆದು ಹಾಕು"
+
+#: src/Resources.vala:621
+msgid "Remove the selected photos from the library"
+msgstr "ಆರಿಸಲಾದ ಫೋಟೊಗಳನ್ನು ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದು ಹಾಕು"
+
+#: src/Resources.vala:623
+msgid "_Restore"
+msgstr "ಮರಳಿ ಸ್ಥಾಪಿಸು (_R)"
+
+#: src/Resources.vala:624
+msgid "Move the selected photos back into the library"
+msgstr "ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಟೊಗಳನ್ನು ಲೈಬ್ರರಿಗೆ ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Resources.vala:626
+msgid "Show in File Mana_ger"
+msgstr "ಕಡತ ವ್ಯವಸ್ಥಾಪಕವನ್ನು ತೋರಿಸು (_g)"
+
+#: src/Resources.vala:627
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಟೊದ ಕೋಶವನ್ನು ಕಡತ ವ್ಯವಸ್ಥಾಪಕದಲ್ಲಿ ತೆರೆ"
+
+#: src/Resources.vala:630
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ಕಡತ ವ್ಯವಸ್ಥಾಪಕವನ್ನು ತೆರೆಯಲಾಗಿಲ್ಲ: %s"
+
+#: src/Resources.vala:633
+msgid "R_emove From Library"
+msgstr "ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದುಹಾಕು (_e)"
+
+#: src/Resources.vala:635
+msgid "_Move to Trash"
+msgstr "ಕಸದ ಬುಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸು (_M)"
+
+#: src/Resources.vala:637
+msgid "Select _All"
+msgstr "ಎಲ್ಲವನ್ನೂ ಆರಿಸು (_A)"
+
+#: src/Resources.vala:638
+msgid "Select all items"
+msgstr "ಎಲ್ಲಾ ಅಂಶಗಳನ್ನು ಆರಿಸು"
+
+# The string below is a format string that describes a U.S.-style
+# time at a minutes-level of precision (e.g. "8:18 PM"). You should translate
+# this string so that it describes the time-of-day format used in your
+# language and region. For example, in your language and region it may be
+# more common to use 24-hour time (e.g. "20:18") instead of 12-hour time with
+# a meridian specifier. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Resources.vala:716
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+# The string below is a format string that describes a U.S.-style
+# time at a seconds-level of precision (e.g. "8:18:27 PM"). You should
+# translate
+# this string so that it describes the time-of-day format used in your
+# language and region. For example, in your language and region it may be
+# more common to use 24-hour time (e.g. "20:18:27") instead of 12-hour time
+# with
+# a meridian specifier. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Resources.vala:716
+#: src/Resources.vala:717
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+# The string below is a format string that describes a U.S.-style date,
+# including
+# the day-of-week and year (e.g. "Tue Feb 26, 2013"). You should translate
+# this string so that it describes the date, including the day-of-week and
+# year,
+# in your language and region. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Resources.vala:718
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+# The string below is a format string that describes a U.S.-style date,
+# including
+# the day-of-week and but without the year (e.g. "Tue Feb 26"). You should
+# translate
+# this string so that it describes the date, including the day-of-week but
+# without the
+# year, in your language and region. This string is also used to describe the
+# opening
+# of date ranges (e.g. the "Tue, Feb 26" in "Tue, Feb 26-29, 2013"). Take this
+# fact into
+# account if it affects the format of the date. The format string you enter
+# should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Resources.vala:719 src/Resources.vala:721
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+# The string below is a format string that describes a U.S.-style date range
+# end
+# (e.g., it's the "29, 2013" in the date range "Tue, Feb 26-29, 2013"). In
+# most
+# languages and regions it's the day-of-the-month followed by a year (e.g.
+# "29, 2013").
+# You should translate this string so that it describes a date range end in
+# your language and region. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Resources.vala:720
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/direct/DirectPhotoPage.vala:46 src/library/LibraryWindow.vala:348
+msgid "_File"
+msgstr "ಕಡತ (_F)"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "ಉಳಿಸು (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ಫೋಟೊವನ್ನು ಉಳಿಸು"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "ಹೀಗೆ ಉಳಿಸು (_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ಫೋಟೊವನ್ನು ಬೇರೊಂದು ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ ಉಳಿಸು"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "ನಿಮ್ಮ ಗಣಕಕ್ಕೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವ ಮುದ್ರಕದಿಂದ ಫೋಟೊವನ್ನು ಮುದ್ರಿಸಿ"
+
+#: src/direct/DirectPhotoPage.vala:73
+msgid "Edit"
+msgstr "ಸಂಪಾದಿಸು"
+
+#: src/direct/DirectPhotoPage.vala:77 src/library/LibraryWindow.vala:360
+msgid "_Photo"
+msgstr "ಫೋಟೊ (_P)"
+
+#: src/direct/DirectPhotoPage.vala:169 src/library/LibraryWindow.vala:376
+msgid "_Help"
+msgstr "ನೆರವು (_H)"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "'%s' ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ವಸ್ತುವು ಒಂದು ಕಡತವಾಗಿಲ್ಲ."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not support the file format of\n"
+"%s."
+msgstr "%s ಎನ್ನುವುದು %s ಬಗೆಯ ಕಡತ ವಿನ್ಯಾಸವನ್ನು \n"
+"ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "ಒಂದು ಪ್ರತಿಯನ್ನು ಉಳಿಸು (_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "ಬದಲಾವನೆಗಳನ್ನು %s ಗೆ ಕಳೆದುಕೊಳ್ಳಬೇಕೆ?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "ಉಳಿಸದೆ ಮುಚ್ಚು (_W)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s ಗೆ ಉಳಿಸುವಲ್ಲಿ ದೋಷ: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "ಹೀಗೆ ಉಳಿಸು"
+
+#: src/Page.vala:1267
+msgid "No photos/videos"
+msgstr "ಯಾವುದೆ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳು ಇಲ್ಲ"
+
+#: src/Page.vala:1271
+msgid "No photos/videos found"
+msgstr "ಯಾವುದೆ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳು ಕಂಡುಬಂದಿಲ್ಲ"
+
+#: src/Page.vala:2563
+msgid "Photos cannot be exported to this directory."
+msgstr "ಈ ಕೋಶಕ್ಕೆ ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:229
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"ಕ್ಯಾಮರಾವನ್ನು ಇಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. ಕಡತ ವ್ಯವಸ್ಥಾಪಕದಿಂದ ಕ್ಯಾಮೆರಾವನ್ನು ಇಳಿಸಲು "
+"ಪ್ರಯತ್ನಿಸಿ."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ಈಗಾಗಲೆ ಆಮದು ಮಾಡಲಾದ ಫೋಟೊಗಳನ್ನು ಅಡಗಿಸು"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "ಆಮದು ಮಾಡದೆ ಇರುವ ಫೋಟೊಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "ಆಮದು ಮಾಡಲು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ಕಾಯಿರಿ..."
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "ಆಮದು ಮಾಡಿದ್ದನ್ನು ಆರಿಸು (_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಟೊಗಳನ್ನು ನಿಮ್ಮ ಲೈಬ್ರರಿಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "ಎಲ್ಲಾ ಆಮದು ಮಾಡಿ (_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "ಎಲ್ಲಾ ಫೋಟೊಗಳನ್ನು ನಿಮ್ಮ ಲೈಬ್ರರಿಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell ಅನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಕ್ಯಾಮೆರಾವನ್ನು ಕಡತವ್ಯವಸ್ಥೆಯಿಂದ ಇಳಿಸಬೇಕಾಗುತ್ತದೆ."
+" ಮುಂದುವರೆಯಬೇಕೆ?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "ಇಳಿಸು (_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "ದಯವಿಟ್ಟು ಕ್ಯಾಮೆರಾವನ್ನು ಇಳಿಸು.ಸ"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"ಕ್ಯಾಮೆರಾವನ್ನು ಬೇರೊಂದು ಅನ್ವಯದಿಂದ ಬಂಧಿಸಲಾಗಿದೆ. Shotwell ಕೇವಲ ಮುಕ್ತವಾಗಿರುವ "
+"ಕ್ಯಾಮೆರವನ್ನು ಮಾತ್ರ ಬಳಸಬಲ್ಲದು. ಕ್ಯಾಮರಾವನ್ನು ಬೇರೆ ಯಾವುದೆ ಅನ್ವಯಗಳು "
+"ಬಳಸುತ್ತಿದ್ದಲ್ಲಿ ಅದನ್ನು ಮುಚ್ಚಿ ನಂತರ ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr " ಕ್ಯಾಮರಾವನ್ನು ಬೇರೆ ಯಾವುದೆ ಅನ್ವಯಗಳು ಬಳಸುತ್ತಿದ್ದಲ್ಲಿ ಅದನ್ನು ಮುಚ್ಚು."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid "Unable to fetch previews from the camera:\n"
+"%s"
+msgstr "ಕ್ಯಾಮೆರಾದಿಂದ ಮುನ್ನೋಟಗಳನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "ಇಳಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ಫೋಟೊದ ಮಾಹಿತಿಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s ಗಾಗಿನ ಮುನ್ನೋಟವನ್ನು ಪಡೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "ಕ್ಯಾಮೆರವನ್ನು ಬಂಧಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ:%s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ಕ್ಯಾಮೆರಾದಿಂದ %d ಫೋಟೊಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ಕ್ಯಾಮೆರಾದಿಂದ %d ವೀಡಿಯೊಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ಕ್ಯಾಮೆರಾದಿಂದ %d ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "ಕ್ಯಾಮೆರಾದಿಂದ %d ಕಡತಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1283
+msgid "_Keep"
+msgstr "ಇರಿಸು (_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "ಕ್ಯಾಮೆರಾದಿಂದ ಫೋಟೊಗಳನ್ನು/ವೀಡಿಯೊಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural ""
+"Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"ದೋಷಗಳ ಕಾರಣದಿಂದ ಕ್ಯಾಮೆರಾದಿಂದ %d ಫೋಟೊಗಳು/ವೀಡಿಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ."
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "ಕ್ಯಾಮೆರಾಗಳು"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "ಕಡತಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "ಅಳಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "ಕೊನೆಯ ಆಮದು"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ಕಸದ ಬುಟ್ಟಿ"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ಕಸದ ಬುಟ್ಟಿಯು ಖಾಲಿ ಇದೆ"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "ಅಳಿಸು"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "ಅಮದು ಮಾಡಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ಆಮದನ್ನು ನಿಲ್ಲಿಸು (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸು"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "ಆಮದು ಮಾಡಲು ಅಣಿಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s ಆಮದು ಮಾಡಲಾಗಿದೆ"
+
+#: src/library/LibraryWindow.vala:297
+msgid "_Import From Folder..."
+msgstr "ಕಡತಕೋಶದಿಂದ ಆಮದು ಮಾಡಿ (_I)..."
+
+#: src/library/LibraryWindow.vala:298
+msgid "Import photos from disk to library"
+msgstr "ಫೋಟೊಗಳನ್ನು ಡಿಸ್ಕಿನಿಂದ ಲೈಬ್ರರಿಯಿಂದ ಆಮದು ಮಾಡಿ"
+
+#: src/library/LibraryWindow.vala:305
+msgid "Import From _Application..."
+msgstr "ಅನ್ವಯದಿಂದ ಆಮದು ಮಾಡಿಕೊ (_A)..."
+
+#: src/library/LibraryWindow.vala:309
+msgid "Sort _Events"
+msgstr "ಸಂದರ್ಭಗಳನ್ನು ಜೋಡಿಸು (_E)"
+
+#: src/library/LibraryWindow.vala:319
+msgid "Empty T_rash"
+msgstr "ಕಸದ ಬುಟ್ಟಿಯನ್ನು ಖಾಲಿ (_r)"
+
+#: src/library/LibraryWindow.vala:320
+msgid "Delete all photos in the trash"
+msgstr "ಕಸದ ಬುಟ್ಟಿಯಲ್ಲಿನ ಎಲ್ಲಾ ಫೋಟೊಗಳನ್ನು ಅಳಿಸಿಹಾಕು"
+
+#: src/library/LibraryWindow.vala:325
+msgid "View Eve_nt for Photo"
+msgstr "ಫೋಟೊಕ್ಕಾಗಿನ ಹೊಸ ಸಂದರ್ಭ (_n)"
+
+#: src/library/LibraryWindow.vala:330
+msgid "_Find"
+msgstr "ಹುಡುಕು (_F)"
+
+#: src/library/LibraryWindow.vala:331
+msgid "Find photos and videos by search criteria"
+msgstr "ಹುಡುಕು ಮಾನದಂಡದ ಮೇರೆಗೆ ಫೋಟೊಗಳನ್ನು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಹುಡುಕು"
+
+#: src/library/LibraryWindow.vala:352
+msgid "_Edit"
+msgstr "ಸಂಪಾದನೆ (_E)"
+
+#: src/library/LibraryWindow.vala:364
+msgid "_Photos"
+msgstr "ಫೋಟೊಗಳು (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "Even_ts"
+msgstr "ಸಂದರ್ಭಗಳು (_t)"
+
+#: src/library/LibraryWindow.vala:387
+msgid "_Basic Information"
+msgstr "ಮೂಲಭೂತ ಮಾಹಿತಿ (_B)"
+
+#: src/library/LibraryWindow.vala:388
+msgid "Display basic information for the selection"
+msgstr "ಆಯ್ಕೆಗಾಗಿ ಮೂಲಭೂತ ಮಾಹಿತಿಯನ್ನು ತೋರಿಸು"
+
+#: src/library/LibraryWindow.vala:393
+msgid "E_xtended Information"
+msgstr "ವಿಸ್ತೃತ ಮಾಹಿತಿ (_x)"
+
+#: src/library/LibraryWindow.vala:394
+msgid "Display extended information for the selection"
+msgstr "ಆಯ್ಕೆಗಾಗಿ ವಿಸ್ತೃತ ಮಾಹಿತಿಯನ್ನು ತೋರಿಸು"
+
+#: src/library/LibraryWindow.vala:399
+msgid "_Search Bar"
+msgstr "ಹುಡುಕು ಪಟ್ಟಿ (_S)"
+
+#: src/library/LibraryWindow.vala:400
+msgid "Display the search bar"
+msgstr "ಹುಡುಕುಪಟ್ಟಿಯನ್ನು ತೋರಿಸು"
+
+#: src/library/LibraryWindow.vala:405
+msgid "S_idebar"
+msgstr "ಬದಿ ಪಟ್ಟಿಕೆ (_i)"
+
+#: src/library/LibraryWindow.vala:406
+msgid "Display the sidebar"
+msgstr "ಬದಿಪಟ್ಟಿಯನ್ನು ತೋರಿಸು"
+
+#: src/library/LibraryWindow.vala:664
+msgid "Import From Folder"
+msgstr "ಕಡತಕೋಶದಿಂದ ಆಮದು ಮಾಡಿ"
+
+#: src/library/LibraryWindow.vala:733
+msgid "Empty Trash"
+msgstr "ಕಸದ ಬುಟ್ಟಿಯನ್ನು ಬರಿದು ಮಾಡು"
+
+#: src/library/LibraryWindow.vala:733
+msgid "Emptying Trash..."
+msgstr "ಕಸಬುಟ್ಟಿಯನ್ನು ಖಾಲಿಮಾಡಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/LibraryWindow.vala:890
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"ನಿಮ್ಮ ನೆಲೆಕೋಶದಿಂದ ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳುವಂತೆ Shotwell ಅನ್ನು ಸಂರಚಿಸಲಾಗಿದೆ."
+"\n"
+
+#: src/library/LibraryWindow.vala:893 src/data_imports/DataImportsUI.vala:112
+msgid "_Import"
+msgstr "ಆಮದು (_I)"
+
+#: src/library/LibraryWindow.vala:893
+msgid "Library Location"
+msgstr "ಲೈಬ್ರರಿಯ ಸ್ಥಳ"
+
+#: src/library/LibraryWindow.vala:906
+msgid "Photos cannot be imported from this directory."
+msgstr "ಈ ಕೋಶದಿಂದ ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: src/library/LibraryWindow.vala:1189
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1233 src/library/LibraryWindow.vala:1241
+msgid "Updating library..."
+msgstr "ಲೈಬ್ರರಿಯನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/LibraryWindow.vala:1246
+msgid "Preparing to auto-import photos..."
+msgstr "ಫೋಟೊಗಳ ಸ್ವಯಂ ಆಮದು ಮಾಡಲು ಅಣಿಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/LibraryWindow.vala:1251
+msgid "Auto-importing photos..."
+msgstr "ಫೋಟೊಗಳನ್ನು ಸ್ವಯಂ-ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/LibraryWindow.vala:1256
+msgid "Writing metadata to files..."
+msgstr "ಮೆಟಾಡೇಟಾವನ್ನು ಕಡತಗಳಿಗೆ ಬರೆಯಲಾಗುತ್ತಿದೆ..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ಲೈಬ್ರರಿ"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ಸಉಪಕರಣಪಟ್ಟಿಯನ್ನು ಚುಚ್ಚಿಡು"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ತೆರೆಯಲಾದ ಉಪಕರಣಪಟ್ಟಿಯನ್ನು ಚುಚ್ಚಿಡು"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "ಪೂರ್ಣತೆರೆಯಿಂದ ನಿರ್ಗಮಿಸು"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "ಪೂರ್ಣತೆರೆಯಿಂದ ನಿರ್ಗಮಿಸು (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "ನಿರ್ಗಮಿಸು (_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "ಇದರ ಬಗ್ಗೆ (_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "ಪೂರ್ಣತೆರೆ (_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "ಒಳ ವಿಷಯಗಳು (_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "ಪದೆ ಪದೆ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "ಒಂದು ತೊಂದರೆಯನ್ನು ವರದಿ ಮಾಡು (_R)..."
+
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498 src/Dialogs.vala:20
+#: src/Dialogs.vala:28 src/Dialogs.vala:1316 src/Dialogs.vala:1339
+#: src/data_imports/DataImportsUI.vala:399
+msgid "_Cancel"
+msgstr "ರದ್ದುಮಾಡು (_C)"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell ನ ಲೈಬ್ರರಿಯನ್ನು ನಿಲುಕಿಸಕೊಳ್ಳುವಲ್ಲಿ ಒಂದು ಮಾರಕ ದೋಷ ಎದುರಾಗಿದೆ. "
+"Shotwell ಮುಂದುವರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba ಜಾಲ ತಾಣಕ್ಕೆ ಭೇಟಿ ನೀಡಿ"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "ನೆರವನ್ನು ತೋರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ದೋಷದ ದತ್ತಸಂಚಯಕ್ಕೆ ತೆರಳಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ ಅನ್ನು ತೋರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/folders/Branch.vala:122
+msgid "Folders"
+msgstr "ಕಡತಕೋಶಗಳು"
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಸಿದ್ಧಗೊಳಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d (%d ರಲ್ಲಿ) ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"%s ಗೆ ಪ್ರಕಟಿಸುವುದನ್ನು ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಒಂದು ದೋಷ ಸಂಭವಿಸಿದೆ:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "ಬೇರೊಂದು ಸೇವೆಗೆ ಪ್ರಕಟಿಸಲು, ಮೇಲಿನ ಮೆನುವಿನಿಂದ ಒಂದನ್ನು ಆಯ್ಕೆ ಮಾಡಿ."
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "ಪ್ರಕಟಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳನ್ನು/ವೀಡಿಯೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "ಆಯ್ದ ವೀಡಿಯೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "ಆಯ್ದ ವೀಡಿಯೊವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "ಆಯ್ದ ಫೋಟೊವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪ್ರಕಟಿಸಲಾಗಿದೆ."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ಖಾತೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲಾಗುತ್ತಿದೆ..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಪ್ರಕಟಿಸು"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "ಫೋಟೊಗಳನ್ನು ಇಲ್ಲಿ ಪ್ರಕಟಿಸು (_t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "ವೀಡಿಯೊಗಳನ್ನು ಪ್ರಕಟಿಸು"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "ವೀಡಿಯೊಗಳನ್ನು ಇಲ್ಲಿ ಪ್ರಕಟಿಸು (_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಪ್ರಕಟಿಸು"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ಫೋಟೊಗಳನ್ನು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಇಲ್ಲಿ ಪ್ರಕಟಿಸು (_t)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "ಪ್ರಕಟಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"ಆಯ್ಕೆ ಮಾಡಿದ ಅಂಶಗಳನ್ನು ಪ್ರಕಟಿಸಲು Shotwell ನಿಂದ ಸಾಧ್ಯವಾಗಿಲ್ಲ ಏಕೆಂದರೆ ನೀವು "
+"ಸೂಕ್ತವಾದ ಪ್ರಕಟಿಸುವ ಪ್ಲಗ್‌ಇನ್‌ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ. ಇದನ್ನು ಸರಿಪಡಿಸಲು, <b>%s "
+"ಆದ್ಯತೆಗಳನ್ನು ಸಂಪಾದಿಸು</b> ಅನ್ನು ಆರಿಸಿ ಮತ್ತು <b>ಪ್ಲಗ್‌ಇನ್‌ಗಳು</b> "
+"ಟ್ಯಾಬ್‌ನಲ್ಲಿನ ಒಂದು ಅಥವ ಹೆಚ್ಚಿನ ಪ್ರಕಟಿಸುವ ಪ್ಲಗ್‌ಇನ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ."
+
+#: src/publishing/PublishingUI.vala:493
+#: src/data_imports/DataImportsUI.vala:394
+msgid "_Close"
+msgstr "ಮುಚ್ಚು (_C)"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"ನಿಮ್ಮ ಫೋಟೊದ ಲೈಬ್ರರಿಯು Shotwell ನ ಈ ಆವೃತ್ತಿಯೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. "
+"ಅದನ್ನು Shotwell %s (ಸ್ಕೀಮಾ %d) ಇಂದ ರಚಿಸಿರುವಂತೆ ಕಾಣುತ್ತದೆ. ಈ ಆವೃತ್ತಿಯು %s "
+"(ಸ್ಕೀಮಾ %d) ಆಗಿದೆ. ದಯವಿಟ್ಟು Shotwell ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ಬಳಸಿ."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell ನಿಮ್ಮ ಫೋಟೊದ ಲೈಬ್ರರಿಯನ್ನು ಆವೃತ್ತಿ %s (ಸ್ಕೀಮಾ %d) ಇಂದ %s ಗೆ (ಸ್ಕೀಮಾ "
+"%d) ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ %s ಎಂಬಲ್ಲಿರುವ Shotwell "
+"Wiki ಅನ್ನು ನೋಡಿ"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"ನಿಮ್ಮ ಫೋಟೊದ ಲೈಬ್ರರಿಯು Shotwell ನ ಈ ಆವೃತ್ತಿಯೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. "
+"ಅದನ್ನು Shotwell %s (ಸ್ಕೀಮಾ %d) ಇಂದ ರಚಿಸಿರುವಂತೆ ಕಾಣುತ್ತದೆ. ಈ ಆವೃತ್ತಿಯು %s "
+"(ಸ್ಕೀಮಾ %d) ಆಗಿದೆ. ದಯವಿಟ್ಟು %s ಅನ್ನು ಅಳಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಲೈಬ್ರರಿಯನ್ನು "
+"ಸ್ವಚ್ಛಗೊಳಿಸಿ ನಂತರ ನಿಮ್ಮ ಫೋಟೊಗಳನ್ನು ಮರಳಿ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell ನ ದತ್ತಸಂಚಯವನ್ನು ಪರಿಶೀಲಿಸುವಲ್ಲಿ ಅಜ್ಞಾತ ದೋಷ: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell ಅನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"
+
+#: src/main.vala:288
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell ನ ಖಾಸಗಿ ಮಾಹಿತಿಯ ಮಾರ್ಗ"
+
+#: src/main.vala:288
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:292
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "ಚಾಲನಾಸಮಯದಲ್ಲಿ ಬದಲಾವಣೆಗಳಿಗಾಗಿ ಲೈಬ್ರರಿ ಕೋಶವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ನಡೆಸಬೇಡ"
+
+#: src/main.vala:296
+msgid "Don't display startup progress meter"
+msgstr "ಆರಂಭಿಕ ಪ್ರಗತಿ ಮಾಪಕವನ್ನು ತೋರಿಸಬೇಡ"
+
+#: src/main.vala:300
+msgid "Show the application's version"
+msgstr "ಅನ್ವಯದ ಆವೃತ್ತಿಯನ್ನು ತೋರಿಸು"
+
+#: src/main.vala:332
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:336
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"ಲಭ್ಯವಿರುವ ಎಲ್ಲಾ ಆಜ್ಞಾ ಸಾಲಿನ ಆಯ್ಕೆಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡಲು '%s --help' ಅನ್ನು "
+"ಚಲಾಯಿಸಿ.\n"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "ಸಂಪೂರ್ಣ ಪುಟವನ್ನು ತುಂಬಿಸು"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 2 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 4 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 6 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 8 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 16 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ಪ್ರತಿ ಪುಟದಲ್ಲಿ 32 ಫೋಟೊಗಳು"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "ಇಂಚು"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "ಸೆ.ಮಿ"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:731
+msgid "Wallet (2 x 3 in.)"
+msgstr "ವ್ಯಾಲೆಟ್ (2 x 3 ಇಂ.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:732
+msgid "Notecard (3 x 5 in.)"
+msgstr "ನೋಟ್‌ಕಾರ್ಡ್ (3 x 5 ಇಂ.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:733
+msgid "4 x 6 in."
+msgstr "4 x 6 ಇಂಚು"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:734
+msgid "5 x 7 in."
+msgstr "5 x 7 ಇಂಚು"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:735
+msgid "8 x 10 in."
+msgstr "8 x 10 ಇಂಚು"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:737
+msgid "11 x 14 in."
+msgstr "11 x 14 ಇಂಚು"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:739
+msgid "16 x 20 in."
+msgstr "16 x 20 ಇಂಚು"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:741
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "ಮೆಟ್ರಿಕ್ ವ್ಯಾಲೆಟ್ (9 x 13 ಸೆಂ)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:742
+msgid "Postcard (10 x 15 cm)"
+msgstr "ಪೋಸ್ಟ್‍ಕಾರ್ಡ್ (10 x 15 ಸೆಂ)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:743
+msgid "13 x 18 cm"
+msgstr "13 x 18 ಸೆ.ಮಿ."
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:744
+msgid "18 x 24 cm"
+msgstr "18 x 24 ಸೆ.ಮಿ."
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:746
+msgid "20 x 30 cm"
+msgstr "20 x 30 ಸೆ.ಮಿ."
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:747
+msgid "24 x 40 cm"
+msgstr "24 x 40 ಸೆ.ಮಿ."
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:748
+msgid "30 x 40 cm"
+msgstr "30 x 40 ಸೆ.ಮಿ."
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ಫೋಟೊದ ಸಿದ್ಧತೆಗಳು"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "ಮುದ್ರಿಸುತ್ತಿದೆ..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid "Unable to print photo:\n"
+"\n"
+"%s"
+msgstr "ಫೋಟೊವನ್ನು ಮುದ್ರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ:\n"
+"\n"
+"%s"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ಟ್ಯಾಗ್‌ಗಳು"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "ಕೆಳಮಟ್ಟದ (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "ಮಧ್ಯಮ (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "ಉತ್ತಮ (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "ಗರಿಷ್ಟ (%d%%)"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "ಮೇಲ್ವಿಚಾರಣ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಸಂಸ್ಕರಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/Properties.vala:86
+msgid "Today"
+msgstr "ಇಂದು"
+
+#: src/Properties.vala:88
+msgid "Yesterday"
+msgstr "ನಿನ್ನೆ"
+
+#: src/Properties.vala:342 src/Dialogs.vala:1229
+msgid "Title:"
+msgstr "ಶೀರ್ಷಿಕೆ:"
+
+#: src/Properties.vala:345
+msgid "Items:"
+msgstr "ಅಂಶಗಳು:"
+
+#: src/Properties.vala:348
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ಸಂದರ್ಭಗಳು"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:78
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ಫೋಟೊಗಳು"
+
+#: src/Properties.vala:357 src/events/EventDirectoryItem.vala:76
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d ವೀಡಿಯೊಗಳು"
+
+#: src/Properties.vala:379
+msgid "Date:"
+msgstr "ದಿನಾಂಕ:"
+
+#: src/Properties.vala:383
+msgid "Time:"
+msgstr "ಸಮಯ:"
+
+#: src/Properties.vala:386 src/Properties.vala:391
+msgid "From:"
+msgstr "ಇಂದ:"
+
+#: src/Properties.vala:387 src/Properties.vala:392
+msgid "To:"
+msgstr "ಗೆ:"
+
+#: src/Properties.vala:397 src/editing_tools/EditingTools.vala:1832
+msgid "Size:"
+msgstr "ಗಾತ್ರ:"
+
+#: src/Properties.vala:406
+msgid "Duration:"
+msgstr "ಅವಧಿ:"
+
+#: src/Properties.vala:406
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f ಸೆಕೆಂಡುಗಳು"
+
+#: src/Properties.vala:410
+msgid "Developer:"
+msgstr "ವಿಕಸನೆಗಾರ:"
+
+#: src/Properties.vala:438 src/Properties.vala:442 src/Properties.vala:449
+#: src/editing_tools/EditingTools.vala:2190
+msgid "Exposure:"
+msgstr "ಎಕ್ಸ್‌‍ಪೋಶರ್:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "ಸ್ಥಳ:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ಕಡತದ ಗಾತ್ರ:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "ಪ್ರಸಕ್ತ ವಿಕಸನೆ:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "ಮೂಲ ಆಯಾಮಗಳು:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "ಕ್ಯಾಮೆರಾ ಮೇಕ್:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "ಕ್ಯಾಮೆರಾ ಮಾದರಿ:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ಮಿಂಚು:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ಫೋಕಲ್ ಉದ್ದ:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "ಎಕ್ಸ್‌‍ಪೋಶರ್ ದಿನಾಂಕ:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "ಎಕ್ಸ್‌‍ಪೋಶರ್ ಸಮಯ:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "ಎಕ್ಸ್‌ಪೋಶರ್ ಬಿಯಾಸ್:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS ಅಕ್ಷಾಂಶ:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS ರೇಖಾಂಶ:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "ಕಲಾಕಾರ:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "ಹಕ್ಕು:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "ತಂತ್ರಾಂಶ:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1243
+msgid "Comment:"
+msgstr "ಟಿಪ್ಪಣಿ:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "ವಿಸ್ತೃತ ಮಾಹಿತಿ"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "ಕೋನ:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2179
+msgid "_Reset"
+msgstr "ಮರಳಿ ಅಣಿಗೊಳಿಸು (_R)"
+
+#: src/editing_tools/EditingTools.vala:637
+msgid "Return to current photo dimensions"
+msgstr "ಪ್ರಸಕ್ತ ಫೋಟೊದ ಆಯಾಮಗಳಿಗೆ ಮರಳು"
+
+#: src/editing_tools/EditingTools.vala:640
+msgid "Set the crop for this photo"
+msgstr "ಈ ಫೋಟೊಕ್ಕಾಗಿ ಕತ್ತರಿಸುವಿಕೆಯನ್ನು ಹೊಂದಿಸು"
+
+#: src/editing_tools/EditingTools.vala:652
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "ಭಾವಫೋಟೊ ಮತ್ತು ಪ್ರಕೃತಿಫೋಟೊ ಅಭಿಮುಖಗಳ ನಡುವೆ ಕತ್ತರಿಸುವ ಆಯತವನ್ನು ತಿರುಗಿಸು"
+
+#: src/editing_tools/EditingTools.vala:723
+msgid "Unconstrained"
+msgstr "ಮಿತಿ ಇಲ್ಲದಿರುವ"
+
+#: src/editing_tools/EditingTools.vala:724
+msgid "Square"
+msgstr "ಚೌಕ"
+
+#: src/editing_tools/EditingTools.vala:725
+msgid "Screen"
+msgstr "ತೆರೆ"
+
+#: src/editing_tools/EditingTools.vala:726
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1238
+msgid "Original Size"
+msgstr "ಮೂಲ ಗಾತ್ರ"
+
+#: src/editing_tools/EditingTools.vala:727
+#: src/editing_tools/EditingTools.vala:730
+#: src/editing_tools/EditingTools.vala:740
+#: src/editing_tools/EditingTools.vala:750
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:728
+msgid "SD Video (4 : 3)"
+msgstr "SD ವೀಡಿಯೊ (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:729
+msgid "HD Video (16 : 9)"
+msgstr "HD ವೀಡಿಯೊ (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:736
+msgid "Letter (8.5 x 11 in.)"
+msgstr "ಲೆಟರ್ (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:738
+msgid "Tabloid (11 x 17 in.)"
+msgstr "ಟ್ಯಾಬ್ಲಾಯ್ಡ್‍ (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:745
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:751 src/Dialogs.vala:2227
+msgid "Custom"
+msgstr "ಅಗತ್ಯಾನುಗುಣ"
+
+#: src/editing_tools/EditingTools.vala:1847
+msgid "Close the red-eye tool"
+msgstr "ಕೆಂಪು-ಕಣ್ಣಿನ ಉಪಕರಣವನ್ನು ಮುಚ್ಚು"
+
+#: src/editing_tools/EditingTools.vala:1850
+msgid "Remove any red-eye effects in the selected region"
+msgstr "ಆಯ್ಕೆ ಮಾಡಿದ ಸ್ಥಳಗಳಲ್ಲಿರುವ ಕೆಂಪು-ಕಣ್ಣನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/editing_tools/EditingTools.vala:2197
+msgid "Saturation:"
+msgstr "ಪರಿಪೂರ್ಣತೆ:"
+
+#: src/editing_tools/EditingTools.vala:2204
+msgid "Tint:"
+msgstr "ತಿಳಿಬಣ್ಣ:"
+
+#: src/editing_tools/EditingTools.vala:2212
+msgid "Temperature:"
+msgstr "ಉಷ್ಣತೆ:"
+
+#: src/editing_tools/EditingTools.vala:2219
+msgid "Shadows:"
+msgstr "ನೆರಳುಗಳು:"
+
+#: src/editing_tools/EditingTools.vala:2272
+msgid "Reset Colors"
+msgstr "ಬಣ್ಣಗಳನ್ನು ಮರುಹೊಂದಿಸು"
+
+#: src/editing_tools/EditingTools.vala:2272
+msgid "Reset all color adjustments to original"
+msgstr "ಎಲ್ಲಾ ಬಣ್ಣದ ಸರಿಹೊಂದಿಕೆಗಳನ್ನು ಮೂಲಕ್ಕೆ ಹೊಂದಿಸು"
+
+#: src/editing_tools/EditingTools.vala:2616
+msgid "Temperature"
+msgstr "ಉಷ್ಣತೆ"
+
+#: src/editing_tools/EditingTools.vala:2629
+msgid "Tint"
+msgstr "ತಿಳಿಬಣ್ಣ"
+
+#: src/editing_tools/EditingTools.vala:2642
+msgid "Saturation"
+msgstr "ಪರಿಪೂರ್ಣತೆ"
+
+#: src/editing_tools/EditingTools.vala:2655
+msgid "Exposure"
+msgstr "ಎಕ್ಸ್‌‍ಪೋಶರ್"
+
+#: src/editing_tools/EditingTools.vala:2668
+msgid "Shadows"
+msgstr "ನೆರಳು"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Contrast Expansion"
+msgstr "ವೈದೃಶ್ಯದ ವಿಸ್ತರಣೆ"
+
+#: src/DirectoryMonitor.vala:885
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s ಅನ್ನು ನೋಡಿಕೊಳ್ಳಲಾಗಿಲ್ಲ: ಒಂದು ಕೋಶವಲ್ಲ (%s)"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus ಇಲ್ಲಿಗೆ-ಕಳುಹಿಸು ಅನ್ನು ಆರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "ಇಲ್ಲಿಗೆ ಕಳುಹಿಸು"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "ಹಿನ್ನಲೆಯನ್ನು %s ಗೆ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ಗಣಕತೆರೆ ಜಾರುತೆರೆಪ್ರದರ್ಶನವನ್ನು ಸಿದ್ಧಗೊಳಿಸಲಾಗಿಲ್ಲ: %s"
+
+#: src/searches/SearchBoolean.vala:143
+msgid "Any text"
+msgstr "ಯಾವುದೆ ಪಠ್ಯ"
+
+#: src/searches/SearchBoolean.vala:146
+msgid "Title"
+msgstr "ಶೀರ್ಷಿಕೆ"
+
+#: src/searches/SearchBoolean.vala:149
+msgid "Tag"
+msgstr "ಟ್ಯಾಗ್"
+
+#: src/searches/SearchBoolean.vala:152
+msgid "Event name"
+msgstr "ಸಂದರ್ಭದ ಹೆಸರು"
+
+#: src/searches/SearchBoolean.vala:155
+msgid "File name"
+msgstr "ಕಡತದ ಹೆಸರು"
+
+#: src/searches/SearchBoolean.vala:158
+msgid "Media type"
+msgstr "ಮಾಧ್ಯಮದ ಬಗೆ"
+
+#: src/searches/SearchBoolean.vala:161
+msgid "Flag state"
+msgstr "ಫ್ಲ್ಯಾಗ್ ಸ್ಥಿತಿ"
+
+#: src/searches/SearchBoolean.vala:167
+msgid "Date"
+msgstr "ದಿನಾಂಕ"
+
+#: src/searches/SavedSearchDialog.vala:164
+msgid "contains"
+msgstr "ಇದನ್ನು ಹೊಂದಿರುವ"
+
+#: src/searches/SavedSearchDialog.vala:165
+#: src/searches/SavedSearchDialog.vala:430
+msgid "is exactly"
+msgstr "ನಿಖರವಾದ"
+
+#: src/searches/SavedSearchDialog.vala:166
+msgid "starts with"
+msgstr "ಇದರಿಂದ ಆರಂಭಗೊಳ್ಳುವ"
+
+#: src/searches/SavedSearchDialog.vala:167
+msgid "ends with"
+msgstr "ಇದರಿಂದ ಅಂತ್ಯಗೊಳ್ಳುವ"
+
+#: src/searches/SavedSearchDialog.vala:168
+msgid "does not contain"
+msgstr "ಇದನ್ನು ಹೊಂದಿರದ"
+
+#: src/searches/SavedSearchDialog.vala:169
+#: src/searches/SavedSearchDialog.vala:434
+msgid "is not set"
+msgstr "ಹೊಂದಿಸದ"
+
+#: src/searches/SavedSearchDialog.vala:240
+#: src/searches/SavedSearchDialog.vala:309
+#: src/searches/SavedSearchDialog.vala:374
+msgid "is"
+msgstr "ಇದು ಆಗಿರುವ"
+
+#: src/searches/SavedSearchDialog.vala:241
+msgid "is not"
+msgstr "ಇದು ಆಗಿರದ"
+
+#: src/searches/SavedSearchDialog.vala:247
+msgid "any photo"
+msgstr "ಯಾವುದಾದರೂ ಫೋಟೊ"
+
+#: src/searches/SavedSearchDialog.vala:248
+msgid "a raw photo"
+msgstr "ಒಂದು ಕಚ್ಛಾ ಫೋಟೊ"
+
+#: src/searches/SavedSearchDialog.vala:249
+msgid "a video"
+msgstr "ಒಂದು ವೀಡಿಯೊ"
+
+#: src/searches/SavedSearchDialog.vala:303
+msgid "flagged"
+msgstr "ಫ್ಲ್ಯಾಗ್ ಮಾಡಿದ"
+
+#: src/searches/SavedSearchDialog.vala:304
+msgid "not flagged"
+msgstr "ಫ್ಲಾಗ್‌ ಮಾಡದ"
+
+#: src/searches/SavedSearchDialog.vala:367
+msgid "and higher"
+msgstr "ಮತ್ತು ಹೆಚ್ಚಿನ"
+
+#: src/searches/SavedSearchDialog.vala:368
+msgid "only"
+msgstr "ಮಾತ್ರ"
+
+#: src/searches/SavedSearchDialog.vala:369
+msgid "and lower"
+msgstr "ಮತ್ತು ಕೆಳಗಿನ"
+
+#: src/searches/SavedSearchDialog.vala:431
+msgid "is after"
+msgstr "ಇದರ ನಂತರ"
+
+#: src/searches/SavedSearchDialog.vala:432
+msgid "is before"
+msgstr "ಇದಕ್ಕೂ ಮೊದಲಿನ"
+
+#: src/searches/SavedSearchDialog.vala:433
+msgid "is between"
+msgstr "ಇದರ ನಡುವಿನ"
+
+#: src/searches/SavedSearchDialog.vala:446
+msgid "and"
+msgstr "ಮತ್ತು"
+
+#: src/searches/SavedSearchDialog.vala:653
+msgid "any"
+msgstr "ಯಾವುದಾದರೂ"
+
+#: src/searches/SavedSearchDialog.vala:654
+msgid "all"
+msgstr "ಎಲ್ಲಾ"
+
+#: src/searches/SavedSearchDialog.vala:655
+msgid "none"
+msgstr "ಯಾವುದೂ ಇಲ್ಲ"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "ಉಳಿಸಲಾದ ಹುಡುಕಾಟಗಳು"
+
+#: src/Photo.vala:3592
+msgid "modified"
+msgstr "ಮಾರ್ಪಡಿಲಾಗಿದೆ"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "ಹಿಮ್ಮರಳು"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "ಹಿಮ್ಮರಳಿಕೆಯನ್ನು ರದ್ದುಮಾಡು"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "ವರ್ಧನೆ"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "ವರ್ಧಿಸುವಿಕೆಯನ್ನು ರದ್ದುಮಾಡು"
+
+#: src/Commands.vala:960
+msgid "Creating New Event"
+msgstr "ಹೊಸ ಸಂದರ್ಭವನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:961
+msgid "Removing Event"
+msgstr "ಸಂದರ್ಭವನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:970
+msgid "Moving Photos to New Event"
+msgstr "ಫೋಟೊಗಳನ್ನು ಹೊಸ ಸಂದರ್ಭಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:971
+msgid "Setting Photos to Previous Event"
+msgstr "ಫೋಟೊಗಳನ್ನು ಹಿಂದಿನ ಸಂದರ್ಭಕ್ಕೆ ಸಿದ್ಧಗೊಳಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:1001
+msgid "Merging"
+msgstr "ವಿಲೀನಗೊಳಿಕೆ"
+
+#: src/Commands.vala:1002
+msgid "Unmerging"
+msgstr "ಬೇರ್ಪಡಿಸುವಿಕೆ"
+
+#: src/Commands.vala:1011
+msgid "Duplicating photos"
+msgstr "ಫೋಟೊಗಳ ನಕಲುಪ್ರತಿ ಮಾಡುವಿಕೆ"
+
+#: src/Commands.vala:1011
+msgid "Removing duplicated photos"
+msgstr "ಫೋಟೊಗಳ ನಕಲು ಪ್ರತಿಗಳನ್ನು ತೆಗೆದು ಹಾಕಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:1034
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "%d ದೋಷದ ಕಾರಣದಿಂದಾಗಿ ಒಂದು ಫೋಟೊದ ನಕಲನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ"
+
+#: src/Commands.vala:1121
+msgid "Restoring previous rating"
+msgstr "ಹಿಂದಿನ ದರವನ್ನು ಮರಳಿ ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:1131 src/Commands.vala:1132
+msgid "Increasing ratings"
+msgstr "ದರವನ್ನು ಹೆಚ್ಚಿಸು"
+
+#: src/Commands.vala:1131 src/Commands.vala:1132
+msgid "Decreasing ratings"
+msgstr "ದರವನ್ನು ಕಡಿಮೆ ಮಾಡು"
+
+#: src/Commands.vala:1182
+msgid "Setting RAW developer"
+msgstr "RAW ವಿಕಸನಗಾರನನ್ನು ಹೊಂದಿಸುವಿಕೆ"
+
+#: src/Commands.vala:1182
+msgid "Restoring previous RAW developer"
+msgstr "ಹಿಂದಿನRAW ವಿಕಸನಗಾರನನ್ನು ಮರಳಿಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:1183
+msgid "Set Developer"
+msgstr "ವಿಕಸನೆಗಾರನನ್ನು ಹೊಂದಿಸು"
+
+#: src/Commands.vala:1273
+msgid "Original photo could not be adjusted."
+msgstr "ಮೂಲ ಫೋಟೊವನ್ನು ಸರಿಹೊಂದಿಸಲಾಗಿಲ್ಲ."
+
+#: src/Commands.vala:1294
+msgid "Adjusting Date and Time"
+msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯವನ್ನು ಸರಿಹೊಂದಿಸುವಿಕೆ"
+
+#: src/Commands.vala:1294
+msgid "Undoing Date and Time Adjustment"
+msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯದ ಸರಿಹೊಂದಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:1325
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ಈ ಕೆಳಗಿನ ಮೂಲ ಫೋಟೊಗಳನ್ನು ಸರಿಹೊಂದಿಸಲಾಗಿಲ್ಲ."
+
+#: src/Commands.vala:1327 src/Commands.vala:1351
+msgid "Time Adjustment Error"
+msgstr "ಸಮಯದ ಸರಿಹೊಂದಿಕೆಯ ದೋಷ"
+
+#: src/Commands.vala:1349
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"ಈ ಕೆಳಗಿನ ಫೋಟೊ ಕಡತಗಳಲ್ಲಿ ನಡೆಸಲಾದ ಸಮಯ ಸರಿಹೊಂದಿಸುವಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿಲ್ಲ."
+
+#: src/Commands.vala:1563 src/Commands.vala:1586
+msgid "Create Tag"
+msgstr "ಟ್ಯಾಗ್ ಅನ್ನು ರಚಿಸು"
+
+#: src/Commands.vala:1621
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" ಟ್ಯಾಗ್ ಅನ್ನು ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Commands.vala:2273
+msgid "Move Photos to Trash"
+msgstr "ಫೋಟೊಗಳನ್ನು ಕಸದ ಬುಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Commands.vala:2273
+msgid "Restore Photos from Trash"
+msgstr "ಫೋಟೊಗಳನ್ನು ಕಸದ ಬುಟ್ಟಿಯಿಂದ ಹಿಂದೆ ಪಡೆ"
+
+#: src/Commands.vala:2274
+msgid "Move the photos to the Shotwell trash"
+msgstr "ಫೋಟೊಗಳನ್ನು Shotwellನ ಕಸದ ಬುಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Commands.vala:2274
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ಫೋಟೊಗಳನ್ನು Shotwell ಲೈಬ್ರರಿಗೆ ಮರಳಿ ಸ್ಥಳಾಂತರಿಸು"
+
+#: src/Commands.vala:2293
+msgid "Moving Photos to Trash"
+msgstr "ಫೋಟೊಗಳನ್ನು ಕಸದ ಬುಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:2293
+msgid "Restoring Photos From Trash"
+msgstr "ಫೋಟೊಗಳನ್ನು ಕಸದ ಬುಟ್ಟಿಯಿಂದ ಹಿಂದೆ ಪಡೆಯಲಾಗುತ್ತಿದೆ"
+
+#: src/Commands.vala:2382
+msgid "Flag"
+msgstr "ಫ್ಲ್ಯಾಗ್ ಹಾಕು"
+
+#: src/Commands.vala:2382
+msgid "Unflag"
+msgstr "ಫ್ಲಾಗ್ ತೆಗೆದುಹಾಕು"
+
+#: src/Commands.vala:2383
+msgid "Flag selected photos"
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳನ್ನು ಫ್ಲ್ಯಾಗ್ ಮಾಡು"
+
+#: src/Commands.vala:2383
+msgid "Unflag selected photos"
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳ ಫ್ಲ್ಯಾಗ್ ತೆಗೆದುಹಾಕು"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"ಇದು \"%s\" ಎಂಬ ಟ್ಯಾಗ್ ಅನ್ನು ನಿಮ್ಮ %d ಫೋಟೊಗಳಿಂದ ತೆಗೆದುಹಾಕುತ್ತದೆ. "
+"ಮುಂದುವರೆಯಬೇಕೆ?"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "ಇದು ಉಳಿಸಲಾದ \"%s\" ಹುಡುಕಾಟವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಮುಂದುವರೆಯಬೇಕೆ?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"ವಿಕಸನೆಗಾರನನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ Shotwell ನಲ್ಲಿ ಈ ಫೋಟೊಗಳಿಗೆ ನೀವು ಮಾಡಿದ ಎಲ್ಲಾ "
+"ಬದಲಾವಣೆಗಳನ್ನು ರದ್ದುಗೊಳಿಸಿದಂತಾಗುತ್ತದೆ"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ವಿಕಸನೆಗಾರನನ್ನು ಬದಲಾಯಿಸು (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ವೀಡಿಯೊವನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"ಈ ಫೋಟೊವನ್ನು ಸಂಪಾದಿಸಲು Shotwell ನಿಂದ ಒಂದು ಕಡತವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ "
+"ಏಕೆಂದರೆ %s ಗೆ ಬರೆಯುವ ಅನುಮತಿಯನ್ನು ನೀವು ಹೊಂದಿಲ್ಲ."
+
+#: src/Dialogs.vala:124
+msgid "Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr "ಕಡತದ ದೋಷದ ಕಾರಣದಿಂದಾಗಿ ಈ ಕೆಳಗಿನ ಫೋಟೊವನ್ನು ರಫ್ತು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid "\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr "\n"
+"\n"
+"ರಫ್ತು ಮಾಡುವುದನ್ನು ಮುಂದುವರೆಸಲು ಬಯಸುವಿರಾ?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "ಮುಂದುವರೆ (_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "ಮಾರ್ಪಡಿಸದಿರುವ"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "ಪ್ರಸ್ತುತ"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "ವಿನ್ಯಾಸ (_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "ಗುಣಮಟ್ಟ (_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "ಅಳತೆಬದಲಾವಣೆ ನಿರ್ಬಂಧ (_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " ಪಿಕ್ಸೆಲ್‌ಗಳು (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "ಮೆಟಾಡಾಟಾವನ್ನು ರಫ್ತು ಮಾಡು"
+
+#: src/Dialogs.vala:459
+msgid "Save Details..."
+msgstr "ವಿವರಗಳನ್ನು ಉಳಿಸು..."
+
+#: src/Dialogs.vala:460
+msgid "Save Details"
+msgstr "ವಿವರಗಳನ್ನು ಉಳಿಸು"
+
+#: src/Dialogs.vala:475
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ಹಾಗು ಇನ್ನೂ %d)\n"
+
+#: src/Dialogs.vala:528
+msgid "Import Results Report"
+msgstr "ಫಲಿತಾಂಶಗಳ ವರದಿಯನ್ನು ಆಮದು ಮಾಡು"
+
+#: src/Dialogs.vala:532
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ಕಡತಗಳನ್ನು ಆಮದು ಮಾಡಲು ಪ್ರಯತ್ನಿಸಲಾಗಿದೆ."
+
+#: src/Dialogs.vala:535
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "ಇವುಗಳಲ್ಲಿ, %d ಕಡತಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆಮದು ಮಾಡಲಾಗಿದೆ."
+
+#: src/Dialogs.vala:547
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "ನಕಲು ಪ್ರತಿ ಮಾಡಲಾದ ಫೋಟೊಗಳನ್ನು/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:"
+
+#: src/Dialogs.vala:551
+msgid "duplicates existing media item"
+msgstr "ಈಗಿರುವ ಮಾಧ್ಯಮ ಅಂಶವನ್ನು ನಕಲು ಪ್ರತಿ ಮಾಡುತ್ತದೆ"
+
+#: src/Dialogs.vala:562
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ಕ್ಯಾಮರಾ ದೋಷಗಳ ಕಾರಣಗಳಿಂದಾಗಿ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:"
+
+#: src/Dialogs.vala:565 src/Dialogs.vala:580 src/Dialogs.vala:595
+#: src/Dialogs.vala:611 src/Dialogs.vala:625
+msgid "error message:"
+msgstr "ದೋಷ ಸಂದೇಶ:"
+
+#: src/Dialogs.vala:576
+msgid ""
+"Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"ಕಡತಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಅವುಗಳನ್ನು ಫೋಟೊಗಳು ಅಥವ ವೀಡಿಯೊಗಳೆಂದು "
+"ಗುರುತಿಸಲಾಗಿಲ್ಲ.\n"
+":"
+
+#: src/Dialogs.vala:591
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಅವು Shotwell ನಿಂದ ಅರ್ಥ "
+"ಮಾಡಿಕೊಳ್ಳಲಾಗುವ ವಿನ್ಯಾಸದಲ್ಲಿ ಇಲ್ಲ :"
+
+#: src/Dialogs.vala:606
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Shotwell ನಿಂದ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಪ್ರತಿ ಮಾಡಲಾಗದೆ ಇರದ ಕಾರಣ ಅದನ್ನು ಅದರ "
+"ಲೈಬ್ರರಿಗೆ ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:"
+
+#: src/Dialogs.vala:610
+#, c-format
+msgid "couldn't copy %s\n"
+" to %s"
+msgstr "%s ಅನ್ನು %s ಗೆ ಪ್ರತಿ\n"
+" ಮಾಡಲಾಗಿಲ್ಲ"
+
+#: src/Dialogs.vala:622
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "ಬೇರೆ ಕಾರಣಗಳಿಂದಾಗಿ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:"
+
+#: src/Dialogs.vala:642
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "ನಕಲು ಪ್ರತಿ ಮಾಡಲಾದ %d ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:645
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "ನಕಲು ಪ್ರತಿ ಮಾಡಲಾದ %d ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:648
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "ನಕಲು ಪ್ರತಿ ಮಾಡಲಾದ %d ಫೋಟೊಗಳನ್ನು/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:662
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ಕಡತ ಅಥವ ಯಂತ್ರಾಂಶದ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಫೋಟೊವನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ "
+"ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:665
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ಕಡತ ಅಥವ ಯಂತ್ರಾಂಶದ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ "
+"ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:668
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ಕಡತ ಅಥವ ಯಂತ್ರಾಂಶದ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ "
+"ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:671
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ಕಡತ ಅಥವ ಯಂತ್ರಾಂಶದ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಕಡತಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ "
+"ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:685
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:"
+"\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not writable:"
+"\n"
+msgstr[0] ""
+"%d ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಫೋಟೊ ಲೈಬ್ರರಿಗೆ ಬರೆಯಲು "
+"ಸಾಧ್ಯವಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:688
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:"
+"\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not writable:"
+"\n"
+msgstr[0] ""
+"%d ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಫೋಟೊ ಲೈಬ್ರರಿಗೆ ಬರೆಯಲು "
+"ಸಾಧ್ಯವಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:691
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಫೋಟೊ ಲೈಬ್ರರಿಗೆ ಬರೆಯಲು "
+"ಸಾಧ್ಯವಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:694
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not writable:"
+"\n"
+msgstr[0] ""
+"%d ಕಡತಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಫೋಟೊ ಲೈಬ್ರರಿಗೆ ಬರೆಯಲು "
+"ಸಾಧ್ಯವಿಲ್ಲ:\n"
+
+#: src/Dialogs.vala:708
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"ಕ್ಯಾಮೆರಾ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:711
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"ಕ್ಯಾಮೆರಾ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:714
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"ಕ್ಯಾಮೆರಾ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:"
+"\n"
+
+#: src/Dialogs.vala:717
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"ಕ್ಯಾಮೆರಾ ತೊಂದರೆಯ ಕಾರಣದಿಂದಾಗಿ %d ಕಡತಗಳನ್ನು ಆಮದು ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:\n"
+
+#: src/Dialogs.vala:734
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "ಬೆಂಬಲವಿಲ್ಲದ %d ಫೋಟೊಗಳನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ:\n"
+
+#: src/Dialogs.vala:749
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d ಫೋಟೊವಲ್ಲದ ಕಡತವನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ.\n"
+
+#: src/Dialogs.vala:760
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ ಕಾರಣದಿಂದ %d ಫೋಟೊಗಳನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ:\n"
+
+#: src/Dialogs.vala:763
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ ಕಾರಣದಿಂದ %d ವೀಡಿಯೊಗಳನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ:\n"
+
+#: src/Dialogs.vala:766
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ ಕಾರಣದಿಂದ %d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ:\n"
+
+#: src/Dialogs.vala:769
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ ಕಾರಣದಿಂದ %d ಕಡತವನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ:\n"
+
+#: src/Dialogs.vala:783
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d ಫೋಟೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆಮದು ಮಾಡಲಾಗಿದೆ.\n"
+
+#: src/Dialogs.vala:786
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d ವೀಡಿಯೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆಮದು ಮಾಡಲಾಗಿದೆ.\n"
+
+#: src/Dialogs.vala:789
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆಮದು ಮಾಡಲಾಗಿದೆ.\n"
+
+#: src/Dialogs.vala:805
+msgid "No photos or videos imported.\n"
+msgstr "ಯಾವುದೆ ಫೋಟೊಗಳನ್ನು ಅಥವ ವೀಡಿಯೊಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ.\n"
+
+#: src/Dialogs.vala:812 src/Dialogs.vala:831
+msgid "Import Complete"
+msgstr "ಆಮದು ಪೂರ್ಣಗೊಂಡಿದೆ"
+
+#: src/Dialogs.vala:1059
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d ಸೆಕೆಂಡುಗಳು"
+
+#: src/Dialogs.vala:1062
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d ನಿಮಿಷಗಳು"
+
+#: src/Dialogs.vala:1066
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ಗಂಟೆಗಳು"
+
+#: src/Dialogs.vala:1069
+msgid "1 day"
+msgstr "1 ದಿನ"
+
+#: src/Dialogs.vala:1219
+msgid "Name:"
+msgstr "ಹೆಸರು:"
+
+#: src/Dialogs.vala:1259
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ಕಡತಗಳನ್ನು ಕಸಬುಟ್ಟಿಗೆ ಹಾಕು (_T)"
+
+#: src/Dialogs.vala:1263
+msgid "Only _Remove"
+msgstr "ಕೇವಲ ತೆಗೆದುಹಾಕು (_R)"
+
+#: src/Dialogs.vala:1306
+msgid "Revert External Edit?"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದನೆಯನ್ನು ಹಿಮ್ಮರಳಿಸಬೇಕೆ ?"
+
+#: src/Dialogs.vala:1306
+msgid "Revert External Edits?"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದನೆಗಳನ್ನು ಹಿಮ್ಮರಳಿಸಬೇಕೆ ?"
+
+#: src/Dialogs.vala:1308
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"ಇದು %d ಹೊರಗಿನ ಕಡತಗಳಿಗೆ ಮಾಡಲಾದ ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳು ನಾಶಗೊಳ್ಳುತ್ತದೆ. "
+"ಮುಂದುವರೆಯಬೇಕೆ?"
+
+#: src/Dialogs.vala:1312
+msgid "Re_vert External Edit"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದನೆಯನ್ನು ಹಿಮ್ಮರಳಿಸು (_v)"
+
+#: src/Dialogs.vala:1312
+msgid "Re_vert External Edits"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದನೆಗಳನ್ನು ಹಿಮ್ಮರಳಿಸು (_v)"
+
+#: src/Dialogs.vala:1333
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ಇದು ಲೈಬ್ರರಿಯಿಂದ %d ಫೋಟೊಗಳನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಮುಂದುವರೆಯಬೇಕೆ?"
+
+#: src/Dialogs.vala:1340
+msgid "_Remove"
+msgstr "ತೆಗೆದು ಹಾಕು (_R)"
+
+#: src/Dialogs.vala:1341
+msgid "Remove Photo From Library"
+msgstr "ಲೈಬ್ರರಿಯಿಂದ ಫೋಟೊವನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/Dialogs.vala:1341
+msgid "Remove Photos From Library"
+msgstr "ಲೈಬ್ರರಿಯಿಂದ ಫೋಟೊಗಳನ್ನು ತೆಗೆದುಹಾಕು"
+
+#: src/Dialogs.vala:1434
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1581
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1582
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1583
+msgid "24 Hr"
+msgstr "24 ಗಂಟೆ"
+
+#: src/Dialogs.vala:1598
+msgid "_Shift photos/videos by the same amount"
+msgstr "ಒಂದೇ ಖಾತೆಯಿಂದ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸು (_S)"
+
+#: src/Dialogs.vala:1603
+msgid "Set _all photos/videos to this time"
+msgstr "ಎಲ್ಲಾ ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಈ ಬಾರಿಗೆ ಹೊಂದಿಸು (_a)"
+
+#: src/Dialogs.vala:1610
+msgid "_Modify original photo file"
+msgstr "ಮೂಲ ಫೋಟೊ ಕಡತವನ್ನು ಮಾರ್ಪಡಿಸು (_M)"
+
+#: src/Dialogs.vala:1610
+msgid "_Modify original photo files"
+msgstr "ಮೂಲ ಫೋಟೊ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸು (_M)"
+
+#: src/Dialogs.vala:1613
+msgid "_Modify original file"
+msgstr "ಮೂಲ ಕಡತವನ್ನು ಮಾರ್ಪಡಿಸು (_M)"
+
+#: src/Dialogs.vala:1613
+msgid "_Modify original files"
+msgstr "ಮೂಲ ಕಡತಗಳನ್ನು ಮಾರ್ಪಡಿಸು (_M)"
+
+#: src/Dialogs.vala:1699
+msgid "Original: "
+msgstr "ಮೂಲ: "
+
+# The string below describes as US-style date & time stamp using a 24-hour
+# clock (e.g., "2/26/2013 20:18:27" is the date & time stamp for February 26,
+# 2013
+# at 8:18:27 PM). You should translate this string so that it describes a date
+# & time stamp using a 24-hour clock in whatever format is used in your
+# language and region. The format string you enter should conform
+# to POSIX date and time formatting conventions. See the strftime manpage for
+# a list of format specifiers and their meanings.
+#: src/Dialogs.vala:1700
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+# The string below describes as US-style date & time stamp using a 12-hour
+# clock and a meridian specifier (e.g., "2/26/2013 8:18:27 PM" is the date &
+# time stamp for February 26, 2013 at 20:18:27). You should translate this
+# string so that it describes a date & time stamp using a 12-hour clock in
+# whatever format is used in your language and region. The format string you
+# enter should conform to POSIX date and time formatting conventions. See the
+# strftime manpage for a list of format specifiers and their meanings.
+#: src/Dialogs.vala:1701
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1790
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ಎಕ್ಸ್‌‍ಪೋಶರ್ ಸಮಯವನ್ನು %d %s, %d %s, %d %s, \n"
+"ಮತ್ತು %d %s ಇಂದ ಮುಂದಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುತ್ತದೆ."
+
+#: src/Dialogs.vala:1791
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ಎಕ್ಸ್‌‍ಪೋಶರ್ ಸಮಯವನ್ನು %d %s, %d %s, %d %s, \n"
+"ಮತ್ತು %d %s ಇಂದ ಹಿಂದಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುತ್ತದೆ."
+
+#: src/Dialogs.vala:1793
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ದಿನಗಳು"
+
+#: src/Dialogs.vala:1794
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ಗಂಟೆಗಳು"
+
+#: src/Dialogs.vala:1795
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "ನಿಮಿಷಗಳು"
+
+#: src/Dialogs.vala:1796
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "ಸೆಕೆಂಡುಗಳು"
+
+#: src/Dialogs.vala:1840
+#, c-format
+msgid "\n"
+"\n"
+"And %d other."
+msgid_plural "\n"
+"\n"
+"And %d others."
+msgstr[0] "\n"
+"\n"
+"ಮತ್ತು ಇತರೆಯವು %d."
+
+#: src/Dialogs.vala:1862 src/Dialogs.vala:1889
+msgid "Tags (separated by commas):"
+msgstr "ಟ್ಯಾಗ್‌ಗಳು (ವಿರಾಮಚಿಹ್ನೆಗಳಿಂದ ಪ್ರತ್ಯೇಕಿಸಲಾಗಿದೆ):"
+
+#: src/Dialogs.vala:1969
+msgid "Welcome!"
+msgstr "ಸುಸ್ವಾಗತ!"
+
+#: src/Dialogs.vala:1976
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell ಗೆ ಸ್ವಾಗತ!"
+
+#: src/Dialogs.vala:1980
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "ಆರಂಭಗೊಳಿಸಲು, ಇಲ್ಲಿ ತಿಳಿಸಲಾದ ಯಾವುದಾದರೂ ರೀತಿಯಲ್ಲಿ ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಿ:"
+
+#: src/Dialogs.vala:1999
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">ಕಡತಕೋಶದಿಂದ ಕಡತ %s ಆಮದು</span> ಆಯ್ಕೆ ಮಾಡಿ"
+
+#: src/Dialogs.vala:2000
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Shotwell ಕಿಟಕಿಗೆ ಫೋಟೊಗಳನ್ನು ಎಳೆದು ಸೇರಿಸಿ"
+
+#: src/Dialogs.vala:2001
+msgid "Connect a camera to your computer and import"
+msgstr "ನಿಮ್ಮ ಗಣಕಕ್ಕೆ ಒಂದು ಕ್ಯಾಮೆರಾವನ್ನು ಜೋಡಿಸಿ ಮತ್ತು ಆಮದು ಮಾಡಿ"
+
+#: src/Dialogs.vala:2011
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "ನಿಮ್ಮ %s ಕಡತಕೋಶದಿಂದ ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಿ (_I)"
+
+#: src/Dialogs.vala:2018
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"ಇಲ್ಲಿ ತಿಳಿಸಲಾದ ಯಾವುದಾದರೂ ರೀತಿಯಲ್ಲಿಯೂ ಸಹ ನೀವು ಫೋಟೊಗಳನ್ನು ಆಮದು ಮಾಡಬಹುದು:"
+
+#: src/Dialogs.vala:2028
+msgid "_Don't show this message again"
+msgstr "ಈ ಸಂದೇಶವನ್ನು ಇನ್ನೊಮ್ಮೆ ತೋರಿಸಬೇಡ (_D)"
+
+#: src/Dialogs.vala:2063
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "ಫೋಟೊಗಳನ್ನು ನಿಮ್ಮ %s ಲೈಬ್ರರಿಯಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
+
+#: src/Dialogs.vala:2207 src/Dialogs.vala:2211
+msgid "(Help)"
+msgstr "(ನೆರವು)"
+
+#: src/Dialogs.vala:2220
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "ವರ್ಷ%sತಿಂಗಳು%sದಿನ"
+
+#: src/Dialogs.vala:2222
+#, c-format
+msgid "Year%sMonth"
+msgstr "ವರ್ಷ%sತಿಂಗಳು"
+
+#: src/Dialogs.vala:2224
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "ವರ್ಷ%sತಿಂಗಳ-ದಿನ"
+
+#: src/Dialogs.vala:2226
+msgid "Year-Month-Day"
+msgstr "ವರ್ಷ-ತಿಂಗಳು-ದಿನ"
+
+#: src/Dialogs.vala:2464
+msgid "Invalid pattern"
+msgstr "ಅಮಾನ್ಯವಾದ ವಿನ್ಯಾಸ"
+
+#: src/Dialogs.vala:2567
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell ನಿಮ್ಮ ಲೈಬ್ರರಿ ಕಡತಕೋಶಕ್ಕೆ ಫೋಟೊಗಳನ್ನು ಪ್ರತಿ ಮಾಡಬಲ್ಲದು ಅಥವ ಪ್ರತಿ ಮಾಡದೆ "
+"ಕೇವಲ ಆಮದು ಮಾಡಬಲ್ಲದು."
+
+#: src/Dialogs.vala:2572
+msgid "Co_py Photos"
+msgstr "ಫೋಟೊಗಳನ್ನು ಪ್ರತಿ ಮಾಡು (_p)"
+
+#: src/Dialogs.vala:2573
+msgid "_Import in Place"
+msgstr "ಸ್ಥಳಕ್ಕೆ ಆಮದು ಮಾಡು (_I)"
+
+#: src/Dialogs.vala:2574
+msgid "Import to Library"
+msgstr "ಲೈಬ್ರರಿಗೆ ಆಮದು ಮಾಡು"
+
+#: src/Dialogs.vala:2585
+msgid "Removing Photos From Library"
+msgstr "ಫೋಟೊಗಳನ್ನು ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದು ಹಾಕು"
+
+#: src/Dialogs.vala:2599
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ಇದು %d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ನಿಮ್ಮ Shotwell ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದುಹಾಕುತ್ತದೆ. ನೀವು "
+"ನಿಮ್ಮ ಗಣಕತೆರೆಯ ಕಸದಬುಟ್ಟಿಯಿಂದಲೂ ಸಹ ಕಡತಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಬಯಸುವಿರಾ?\n"
+"\n"
+"ಈ ಕಾರ್ಯವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿರುವುದಿಲ್ಲ."
+
+#: src/Dialogs.vala:2603
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ಇದು %d ವೀಡಿಯೊಗಳನ್ನು ನಿಮ್ಮ Shotwell ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದುಹಾಕುತ್ತದೆ. ನೀವು ನಿಮ್ಮ "
+"ಗಣಕತೆರೆಯ ಕಸದಬುಟ್ಟಿಯಿಂದಲೂ ಸಹ ಕಡತಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಬಯಸುವಿರಾ?\n"
+"\n"
+"ಈ ಕಾರ್ಯವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿರುವುದಿಲ್ಲ."
+
+#: src/Dialogs.vala:2607
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ಇದು %d ಫೋಟೊಗಳನ್ನು ನಿಮ್ಮ Shotwell ಲೈಬ್ರರಿಯಿಂದ ತೆಗೆದುಹಾಕುತ್ತದೆ. ನೀವು ನಿಮ್ಮ "
+"ಗಣಕತೆರೆಯ ಕಸದಬುಟ್ಟಿಯಿಂದಲೂ ಸಹ ಕಡತಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಬಯಸುವಿರಾ?\n"
+"\n"
+"ಈ ಕಾರ್ಯವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿರುವುದಿಲ್ಲ."
+
+#: src/Dialogs.vala:2639
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d ಫೋಟೊ/ವೀಡಿಯೊಗಳನ್ನು ನಿಮ್ಮ ಗಣಕತೆರೆಯ ಕಸದಬುಟ್ಟಿಗೆ ಸ್ಥಳಾಂತರಿಸು ಸಾಧ್ಯವಿಲ್ಲ. ಈ "
+"ಕಡತಗಳನ್ನು ಅಳಿಸಬೇಕೆ?"
+
+#: src/Dialogs.vala:2656
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: src/VideoSupport.vala:445
+msgid "Export Videos"
+msgstr "ವೀಡಿಯೋಗಳನ್ನು ರಫ್ತುಮಾಡು"
+
+#: src/events/EventPage.vala:86
+msgid "No Event"
+msgstr "ಯಾವುದೆ ಸಂದರ್ಭ ಇಲ್ಲ"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ಪ್ರತಿ ಘಟನೆಯ ಟಿಪ್ಪಣಿಯನ್ನು ತೋರಿಸು"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ಯಾವುದೆ ಸಂದರ್ಭಗಳಿಲ್ಲ"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ಯಾವುದೆ ಸಂದರ್ಭಗಳು ಕಂಡುಬಂದಿಲ್ಲ"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ಕಾರ್ಯಕ್ರಮಗಳು"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "ದಿನಾಂಕವಿಲ್ಲದ"
+
+# The string below is a strftime format string.
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+# The string below is a strftime format string.
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventDirectoryItem.vala:74
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ಫೋಟೊಗಳು/ವೀಡಿಯೊಗಳು"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ದತ್ತಸಂಚಯ"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"%s ಇಂದ ಆಮದು ಮಾಡುವುದನ್ನು ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಒಂದು ದೋಷ ಸಂಭವಿಸಿದೆ:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "ಬೇರೊಂದು ಸೇವೆಯಿಂದ ಆಮದು ಮಾಡಲು, ಮೇಲಿನ ಮೆನುವಿನಿಂದ ಒಂದನ್ನು ಆಯ್ಕೆ ಮಾಡಿ."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "ದತ್ತಾಂಶ ಆಮದುಗಳು"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"ನೀವು ಯಾವುದೆ ದತ್ತಾಂಶ ಆಮದುಗಳ ಪ್ಲಗ್‌ಇನ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ.\n"
+"\n"
+"ಅನ್ವಯದ ಕ್ರಿಯಾಶೀಲತೆಯಿಂದ ಆಮದು ಮಾಡಲು, ನೀವು ಕನಿಷ್ಟ ಒಂದು ದತ್ತಾಂಶ ಆಮದುಗಳ ಪ್ಲಗ್‌ಇನ್ "
+"ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು. ಪ್ಲಗ್‌ಇನ್‌ಗಳನ್ನು ಆದ್ಯತೆಗಳ ಸಂವಾದಚೌಕದಲ್ಲಿ "
+"ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ದತ್ತಸಂಚಯ ಕಡತ:"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "ಅನ್ವಯದಿಂದ ಆಮದು ಮಾಡು"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "ಮಾಧ್ಯಮವನ್ನು ಇಲ್ಲಿಂದ ಆಮದು ಮಾಡು (_f):"
+
+#: plugins/common/RESTSupport.vala:427
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ತಾತ್ಕಾಲಿಕ ಕಡತವು ಲಭ್ಯವಿಲ್ಲ"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+msgid "Shotwell Connect"
+msgstr "Shotwell ಸಂಪರ್ಕ"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"ನೀವು ಪ್ರಸಕ್ತ Facebook ಗೆ ಪ್ರವೇಶಿಸಿಲ್ಲ.\n"
+"\n"
+"ನೀವು ಒಂದು Facebook ಖಾತೆಯನ್ನು ಹೊಂದಿರದೆ ಇದ್ದಲ್ಲಿ, ಪ್ರವೇಶಿಸುವ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ "
+"ಒಂದು ಖಾತೆಯನ್ನು ರಚಿಸಬಹುದು. ಪ್ರವೇಶದ ಸಮಯದಲ್ಲಿ, Shotwell ಸಂಪರ್ಕವು ಫೋಟೊಗಳನ್ನು "
+"ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಮತ್ತು ನಿಮ್ಮ ಊಡಿಕೆಗೆ (ಫೀಡ್‌) ಪ್ರಕಟಿಸಲು ನಿಮ್ಮ ಅನುಮತಿಯನ್ನು "
+"ಕೇಳಬಹುದು. ಈ ಅನುಮತಿಗಳಿಗಾಗಿ Shotwell ಸಂಪರ್ಕವು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿರಬೇಕು."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ನೀವು ಈ Shotwell ಅಧಿವೇಶನದಲ್ಲಿ Facebook ನಿಂದ ಈಗಾಗಲೆ ನಿರ್ಗಮಿಸಿದ್ದೀರಿ.\n"
+"Facebook ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು ಮುಂದುವರೆಸಲು, Shotwell ಇಂದ ನಿರ್ಗಮಿಸಿ ಮತ್ತು "
+"ಮರಳಿ ಆರಂಭಿಸಿ, ನಂತರ ಇನ್ನೊಮ್ಮೆ ಪ್ರಕಟಿಸಲು ಪ್ರಯತ್ನಿಸಿ."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "ಶಿಷ್ಟ (720 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "ದೊಡ್ಡದು (2048 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook ನ ಸಂಪರ್ಕವನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: plugins/shotwell-publishing/PicasaPublishing.vala:715
+msgid "Creating album..."
+msgstr "ಆಲ್ಬಮ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ಒಂದು ಕಡತವು ಲಭ್ಯವಿಲ್ಲ. Facebook ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು "
+"ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid "You are logged into Facebook as %s.\n"
+"\n"
+msgstr "ನೀವು Facebook ಗೆ %s ಆಗಿ ಪ್ರವೇಶಿಸಿದ್ದೀರಿ.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "ಆಯ್ದ ಫೋಟೊಗಳನ್ನು ನೀವು ಎಲ್ಲಿ ಪ್ರಕಟಿಸಲು ಬಯಸುವಿರಿ?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "ಅಪ್‌ಲೋಡ್ ಗಾತ್ರ (_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "ನನಗೆ ಮಾತ್ರ"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "ಗೆಳೆಯರು"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+msgid "Everyone"
+msgstr "ಪ್ರತಿಯೊಬ್ಬರಿಗೂ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "\"%s\" ಆಲ್ಬಮ್ ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Piwigo ಗೆ ಪ್ರಕಟಿಸುವಲ್ಲಿ ಒಂದು ದೋಷ ಉಂಟಾಗಿದೆ. ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"ನಿಮ್ಮ Piwigo ಫೋಟೊ ಲೈಬ್ರರಿಯ ಹಾಗೂ Piwigo ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿದ ಬಳಕೆದಾರ ಹೆಸರು ಮತ್ತು "
+"ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell ನಿಂದ ನಿಮ್ಮ Piwigo ಫೋಟೊ ಲೈಬ್ರರಿಯನ್ನು ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. "
+"ದಯವಿಟ್ಟು ನೀವು ದಾಖಲಿಸಿದ URL ಅನ್ನು ಪರಿಶೀಲಿಸಿ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು/ಅಥವ ಗುಪ್ತಪದ ತಪ್ಪಾಗಿದೆ; ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "ಅಮಾನ್ಯವಾದ URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "ಅಮಾನ್ಯವಾದ ಬಳಕೆದಾರಹೆಸರು ಅಥವ ಗುಪ್ತಪದ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "ವ್ಯವಸ್ಥಾಪಕರು, ಕುಟುಂಬ, ಗೆಳೆಯರು, ಸಂಪರ್ಕಗಳು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "ವ್ಯವಸ್ಥಾಪಕರು, ಕುಟುಂಬ, ಗೆಳೆಯರು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "ವ್ಯವಸ್ಥಾಪಕರು, ಕುಟುಂಬ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "ವ್ಯವಸ್ಥಾಪಕರು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+msgid "500 x 375 pixels"
+msgstr "500 x 375 ಪಿಕ್ಸೆಲ್‌ಗಳು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 ಪಿಕ್ಸೆಲ್‌ಗಳು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 ಪಿಕ್ಸೆಲ್‌ಗಳು"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 ಪಿಕ್ಸೆಲ್‌ಗಳು"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "ಪ್ರಮುಖ ಪ್ರಕಟಿಸುವ ಸೇವೆಗಳು"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"ನೀವು ಪ್ರಸಕ್ತ Flickr ಗೆ ಪ್ರವೇಶಿಸಿಲ್ಲ\n"
+"\n"
+"ನಿಮ್ಮ ಜಾಲ ವೀಕ್ಷಕದಲ್ಲಿ Flickr ಗೆ ಪ್ರವೇಶಿಸಲು ಪ್ರವೇಶಿಸು ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. "
+"ನಿಮ್ಮ Flickr ಖಾತೆಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲು Shotwell ಗೆ ನೀವು ಅಧಿಕಾರವನ್ನು "
+"ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ನೀವು ಈ Shotwell ಅಧಿವೇಶನದಲ್ಲಿ Flickr ನಿಂದ ಈಗಾಗಲೆ ನಿರ್ಗಮಿಸಿದ್ದೀರಿ.\n"
+"Flickr ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು ಮುಂದುವರೆಸಲು, Shotwell ಇಂದ ನಿರ್ಗಮಿಸಿ ಮತ್ತು ಮರಳಿ "
+"ಆರಂಭಿಸಿ, ನಂತರ ಇನ್ನೊಮ್ಮೆ ಪ್ರಕಟಿಸಲು ಪ್ರಯತ್ನಿಸಿ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "ಪ್ರವೇಶಿಸಲು ಸಿದ್ಧಗೊಳ್ಳುತ್ತಿದೆ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ಒಂದು ಕಡತವು ಲಭ್ಯವಿಲ್ಲ. Flickr ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು "
+"ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "ದೃಢೀಕರಣವನ್ನು ಪರಿಶೀಲಿಸಿ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid "You are logged into Flickr as %s.\n"
+"\n"
+msgstr "ನೀವು Flickr ಗೆ %s ಆಗಿ ಪ್ರವೇಶಿಸಿದ್ದೀರಿ.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"ನಿಮ್ಮ ಉಚಿತ Flickr ಖಾತೆಯು ನೀವು ಪ್ರತಿ ತಿಂಗಳು ಎಷ್ಟು ದತ್ತಾಂಶವನ್ನು ಅಪ್‌ಲೋಡ್ "
+"ಮಾಡಬಹುದು \n"
+"ಎಂಬುದನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ.ಈ ತಿಂಗಳಿನ ನಿಮ್ಮ ಅಪ್‌ಲೋಡ್ ಪ್ರಮಾಣದಲ್ಲಿ %d "
+"ಮೆಗಾಬೈಟ್‌ನಷ್ಟು ಬಾಕಿ ಉಳಿದಿದೆ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"ನಿಮ್ಮ Flickr ಪ್ರೊ ಖಾತೆಯು ಅನಿಯಮಿತವಾದ ಅಪ್‌ಲೋಡ್‌ಗಳ ಅವಕಾಶವನ್ನು ಒದಗಿಸುತ್ತದೆ."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ಇಲ್ಲಿ ಗೋಚರಿಸುವ ಫೋಟೊಗಳು (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "ಇಲ್ಲಿ ಗೋಚರಿಸುವ ವೀಡಿಯೊಗಳು (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ಇಲ್ಲಿ ಗೋಚರಿಸುವ ಫೋಟೊಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "ಗೆಳೆಯರು ಮತ್ತು ಕುಟುಂಬ ಮಾತ್ರ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "ಕುಟುಂಬ ಮಾತ್ರ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "ಗೆಳೆಯರು ಮಾತ್ರ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"ನೀವು ಪ್ರಸಕ್ತ YouTube ಗೆ ಪ್ರವೇಶಿಸಿಲ್ಲ.\n"
+"\n"
+"ಮುಂದುವರೆಯಲು ನೀವು ಈಗಾಗಲೆ Google ಖಾತೆಗೆ ಹೊಂದಿರಬೇಕು ಮತ್ತು ಅದನ್ನು YouTube ನಲ್ಲಿ "
+"ಬಳಸಲು ಸಿದ್ಧಗೊಳಿಸಿರಬೇಕು. YouTube ತಾಣಕ್ಕೆ ಪ್ರವೇಶಿಸಲು ಜಾಲ ವೀಕ್ಷಕವನ್ನು ಬಳಸಿಕೊಂಡು "
+"ನಿಮ್ಮ ಹೆಚ್ಚಿನ ಎಲ್ಲಾ ಖಾತೆಗಳನ್ನು ಸಿದ್ಧಗೊಳಿಸಲು ಸಾಧ್ಯವಿರುತ್ತದೆ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:465
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ಒಂದು ಕಡತವು ಲಭ್ಯವಿಲ್ಲ. Youtube ನಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು "
+"ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:771
+msgid ""
+"Enter the email address and password associated with your YouTube account."
+msgstr ""
+"ನಿಮ್ಮ Tumblr ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿದ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:772
+msgid ""
+"YouTube didn't recognize the email address and password you entered. To try "
+"again, re-enter your email address and password below."
+msgstr ""
+"ನೀವು ನಮೂದಿಸಿದ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು YouTube ನಿಂದ ಗುರುತಿಸಲಾಗಿಲ್ಲ. "
+"ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಲು, ಈ ಕೆಳಗೆ ನಿಮ್ಮ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು ಮರಳಿ-"
+"ನಮೂದಿಸಿ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:773
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that isn't set up for use with YouTube. You can set up most accounts by "
+"using your browser to log into the YouTube site at least once. To try again, "
+"re-enter your email address and password below."
+msgstr ""
+"ನೀವು ನಮೂದಿಸಿದ Google ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿದ ಖಾತೆಯ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು "
+"YouTube ನೊಂದಿಗೆ ಬಳಸಲು ಸಿದ್ಧಗೊಳಿಸಲಾಗಿಲ್ಲ. ನಿಮ್ಮ ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ಬಳಸಿಕೊಂಡು "
+"ನೀವು ಕಡೇ ಪಕ್ಷ ಒಂದು ಬಾರಿಯಾದರೂ ಸಹ YouTube ತಾಣಕ್ಕೆ ಪ್ರವೇಶಿಸಬಹುದು. ಇನ್ನೊಮ್ಮೆ "
+"ಪ್ರಯತ್ನಿಸಲು, ಈ ಕೆಳಗೆ ನಿಮ್ಮ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು ಮರಳಿ-ನಮೂದಿಸಿ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:774
+msgid ""
+"The email address and password you entered correspond to a Google account "
+"that has been tagged as requiring additional security. You can clear this "
+"tag by using your browser to log into YouTube. To try again, re-enter your "
+"email address and password below."
+msgstr ""
+"ಒಂದು Google ಖಾತೆಗಾಗಿ ನೀವು ನಮೂದಿಸಿದ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದಕ್ಕೆ ಹೆಚ್ಚುವರಿ "
+"ಸುರಕ್ಷತೆಯ ಅಗತ್ಯವಿದೆ ಎಂದು ಟ್ಯಾಗ್‌ ಮಾಡಲಾಗಿದೆ. ಜಾಲ ವೀಕ್ಷಕದ ಮುಖಾಂತರ YouTube ಗೆ "
+"ಪ್ರವೇಶಿಸುವ ಮೂಲಕ ನೀವು ಈ ಟ್ಯಾಗ್ ಅನ್ನು ತೆರವುಗೊಳಿಸಬಹುದು. ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಲು, "
+"ನಿಮ್ಮ ವಿಅಂಚೆ ವಿಳಾಸ ಮತ್ತು ಗುಪ್ತಪದವನ್ನು ಈ ಕೆಳಗೆ ಮರಳಿ ನಮೂದಿಸಿ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:808
+#, c-format
+msgid "Unrecognized User"
+msgstr "ಗುರುತಿಸಲಾಗದ ಬಳಕೆದಾರ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:812
+#, c-format
+msgid "Account Not Ready"
+msgstr "ಖಾತೆಯು ಸಿದ್ಧಗೊಂಡಿಲ್ಲ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:818
+#, c-format
+msgid "Additional Security Required"
+msgstr "ಹೆಚ್ಚುವರಿ ಸುರಕ್ಷತೆಯ ಅಗತ್ಯವಿದೆ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:826
+msgid "_Email address:"
+msgstr "ವಿಅಂಚೆ ವಿಳಾಸ (_E):"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:828
+msgid "_Password:"
+msgstr "ಗುಪ್ತಪದ (_P):"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:848
+msgid "Go _Back"
+msgstr "ಹಿಂದಕ್ಕೆ ಮರಳು (_B)"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:853
+msgid "_Login"
+msgstr "ಪ್ರವೇಶಿಸು (_L)"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:939
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "ನೀವು YouTube ಗೆ %s ಆಗಿ ಪ್ರವೇಶಿಸಿದ್ದೀರಿ."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:940
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "ವೀಡಿಯೋಗಳು '%s' ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:970
+msgid "Public listed"
+msgstr "ಸಾರ್ವಜನಿಕವಾಗಿ ಕಾಣಿಸಿಕೊಳ್ಳುವ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:971
+msgid "Public unlisted"
+msgstr "ಸಾರ್ವಜನಿಕವಾಗಿ ಕಾಣಿಸಿಕೊಳ್ಳದ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:972
+msgid "Private"
+msgstr "ಖಾಸಗಿ"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"ನೀವು ಪ್ರಸಕ್ತ Picasa ವೆಬ್ ಆಲ್ಬಮ್‌ಗಳಿಗೆ ಪ್ರವೇಶಿಸಿಲ್ಲ.\n"
+"\n"
+"ನಿಮ್ಮ ಜಾಲ ವೀಕ್ಷಕದಲ್ಲಿ Picasa ವೆಬ್ ಆಲ್ಬಮ್‌ಗಳಿಗೆ ಪ್ರವೇಶಿಸಲು ಪ್ರವೇಶಿಸು ಅನ್ನು "
+"ಕ್ಲಿಕ್ ಮಾಡಿ. ನಿಮ್ಮ Picasa ವೆಬ್‌ ಆಲ್ಬಮ್‌ಗಳ ಖಾತೆಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲು Shotwell ಗೆ "
+"ನೀವು ಅಧಿಕಾರವನ್ನು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:466
+msgid "couldn't launch system web browser to complete Picasa Web Albums login"
+msgstr ""
+"Picasa ವೆಬ್‌ ಆಲ್ಬಮ್‌ಗಳ ಪ್ರವೇಶವನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ವ್ಯವಸ್ಥೆಯ ಜಾಲ ವೀಕ್ಷಕವನ್ನು "
+"ಆರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:485
+#: plugins/shotwell-publishing/PicasaPublishing.vala:616
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa Web "
+"Albums can't continue."
+msgstr ""
+"ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ಒಂದು ಕಡತವು ಲಭ್ಯವಿಲ್ಲ. Picasa ವೆಬ್‌ ಆಲ್ಬಮ್‌ಗಳಲ್ಲಿ "
+"ಪ್ರಕಟಿಸುವುದನ್ನು ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:697
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"ಪ್ರಕಟಿಸಲು ಅಗತ್ಯವಿರುವ ಒಂದು ಕಡತವು ಲಭ್ಯವಿಲ್ಲ. Picasa ದಲ್ಲಿ ಪ್ರಕಟಿಸುವುದನ್ನು "
+"ಮುಂದುವರೆಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1151
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "ನೀವು Picasa ಜಾಲ ಆಲ್ಬಮ್‌ಗೆ %s ಆಗಿ ಪ್ರವೇಶಿಸಿದ್ದೀರಿ."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1156
+msgid "Videos will appear in:"
+msgstr "ವೀಡಿಯೋಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1161
+msgid "Photos will appear in:"
+msgstr "ಫೋಟೊಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1234
+msgid "Small (640 x 480 pixels)"
+msgstr "ಚಿಕ್ಕದು (640 x 480 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1235
+msgid "Medium (1024 x 768 pixels)"
+msgstr "ಮಧ್ಯಮ (1024 x 768 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1236
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "ಸಲಹೆ ಮಾಡಲಾಗುವುದು (1600 x 1200 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:1237
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 ಪಿಕ್ಸೆಲ್‌ಗಳು)"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "ಚೆಸ್"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "ಪಟ್ಟಿಗಳು"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "ವೃತ್ತ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "ಪ್ರಮುಖ ಜಾರುಫಲಕಪ್ರದರ್ಶನದ ಬದಲಾವಣೆಗಳು"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "ಹಕ್ಕು 2010 Maxim Kartashev, ಹಕ್ಕು 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ಪರದೆಗಳು"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ಚೌಕಗಳು"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "ವೃತ್ತಗಳು"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ಗಡಿಯಾರ"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "ಜಾರುಫಲಕ"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "ಮುದುರು"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "ಮಬ್ಬು"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot ಲೈಬ್ರರಿ ಆಮದು ಸೇವೆಗೆ ಸ್ವಾಗತ.\n"
+"\n"
+"Shotwell ಇಂದ ಪತ್ತೆ ಮಾಡಲಾದ ಈಗಿರುವ ಲೈಬ್ರರಿಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡುವ ಮೂಲಕ ಅಥವ ಒಂದು "
+"ಪರ್ಯಾಯ F-Spot ದತ್ತಸಂಚಯ ಕಡತವನ್ನು ಆಯ್ಕೆ ಮಾಡುವ ಮೂಲಕ ಆಮದು ಮಾಡಲು ಒಂದು "
+"ಲೈಬ್ರರಿಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot ಲೈಬ್ರರಿ ಆಮದು ಸೇವೆಗೆ ಸ್ವಾಗತ.\n"
+"\n"
+"ದಯವಿಟ್ಟು ಒಂದು F-Spot ದತ್ತಸಂಚಯ ಕಡತವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "ಆಮದು ಮಾಡಲು F-Spot ದತ್ತಸಂಚಯ ಕಡತವನ್ನು ಕೈಯಾರೆ ಆಯ್ಕೆ ಮಾಡಿ:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"ಆಯ್ಕೆ ಮಾಡಿದ F-Spot ದತ್ತಸಂಚಯವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: F-Spot ನ "
+"ದತ್ತಸಂಚಯದಲ್ಲಿ ಈ ಕಡತವು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"ಆಯ್ಕೆ ಮಾಡಿದ F-Spot ದತ್ತಸಂಚಯವನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: F-Spot ನ ಈ "
+"ದತ್ತಸಂಚಯಕ್ಕೆ Shotwell ನಿಂದ ಬೆಂಬಲವಿಲ್ಲ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags "
+"table"
+msgstr ""
+"ಆಯ್ಕೆ ಮಾಡಿದ F-Spot ದತ್ತಸಂಚಯವನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: ಟ್ಯಾಗ್‌ಗಳ ಕೋಷ್ಟಕದಿಂದ "
+"ಓದುವಲ್ಲಿ ದೋಷ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"ಆಯ್ಕೆ ಮಾಡಿದ F-Spot ದತ್ತಸಂಚಯವನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: ಫೋಟೊಗಳ ಕೋಷ್ಟಕದಿಂದ "
+"ಓದುವಲ್ಲಿ ದೋಷ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell ಗೆ %d F-Spot ಲೈಬ್ರರಿಯಲ್ಲಿ ಫೋಟೊಗಳು ಕಂಡುಬಂದಿವೆ ಮತ್ತು ಪ್ರಸಕ್ತ ಆಮದು "
+"ಮಾಡಿಕೊಳ್ಳುತ್ತಿದೆ. ದ್ವಿಪ್ರತಿಗಳು ಇದ್ದಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪತ್ತೆ ಮಾಡುತ್ತದೆ ಮತ್ತು "
+"ಅದನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.\n"
+"\n"
+"ಆಮದು ಮಾಡುವಿಕೆಯು ಹಿನ್ನಲೆಯಲ್ಲಿ ನಡೆಯುತ್ತಿರುವಾಗ ನೀವು ಈ ಸಂವಾದಚೌಕವನ್ನು ಮುಚ್ಚಿ "
+"ಮತ್ತು Shotwell ಅನ್ನು ಬಳಸಿಕೊಂಡು ಆರಂಭಿಸಿ."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot ಲೈಬ್ರರಿ: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "ಆಮದು ಮಾಡಲು ಅಣಿಗೊಳಿಸಲಾಗುತ್ತಿದೆ"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "ಪ್ರಮುಖ ದತ್ತಾಂಶ ಆಮದು ಸೇವೆಗಳು"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "ಗಣಕತೆರೆಯ ಜಾರುಫಲಕಪ್ರದರ್ಶನವಾಗಿ ಹೊಂದಿಸು"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "ಗಣಕತೆರೆ ಹಿನ್ನೆಲೆಯ ಜಾರುಫಲಕ ಪ್ರದರ್ಶನವನ್ನು ಉತ್ಪಾದಿಸು"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "ಪ್ರತಿ ಫೋಟೊಗಳನ್ನು ಈ ಸಮಯದವರೆಗೆ ತೋರಿಸು"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ಸಮಯದ ಅವಧಿ"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"ಗಣಕತೆರೆ ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು ಫೋಟೊವನ್ನು ಎಷ್ಟು ಹೊತ್ತಿನವರೆಗೆ ತೋರಿಸಬೇಕು"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "ಹುಡುಕು"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "ಹುಡುಕಾಟದ ಹೆಸರು (_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "ಹೊಂದಿಸು (_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "ಈ ಕೆಳಗಿನವುಗಳಲ್ಲಿ:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>ಮುದ್ರಿತ ಫೋಟೊದ ಗಾತ್ರ</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "ಒಂದು ಶಿಷ್ಟ ಗಾತ್ರವನ್ನು ಬಳಸು (_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "ಒಂದು ಅಗತ್ಯಾನುಗುಣವಾದ ಗಾತ್ರವನ್ನು ಬಳಸು (_u):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ಫೋಟೊದ ಆಕಾರ ಅನುಪಾತಕ್ಕೆ ಹೊಂದಿಸು (_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "ಸ್ವಯಂಗಾತ್ರ (_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>ಶೀರ್ಷಿಕೆಗಳು</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ಫೋಟೊದ ಶೀರ್ಷಿಕೆಯನ್ನು ಮುದ್ರಿಸು (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>ಪಿಕ್ಸೆಲ್ ರೆಸಲ್ಯೂಶನ್</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "ಫೋಟೊವನ್ನು ಇಲ್ಲಿಗೆ ಕಳುಹಿಸು (_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ಪ್ರತಿ ಇಂಚುಗಳಲ್ಲಿನ ಪಿಕ್ಸೆಲ್‌ಗಳು"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+msgid "label"
+msgstr "ಲೇಬಲ್"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell ಆದ್ಯತೆಗಳು"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "ಬಿಳಿ"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "ಕಪ್ಪು"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "ಹೊಸ ಕಡತಗಳಿಗಾಗಿ ಲೈಬ್ರರಿ ಕೋಶವನ್ನು ನೋಡು (_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "ಮೆಟಾಡೇಟಾ"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"ಫೋಟೊ ಕಡತಗಳಿಗೆ ಟ್ಯಾಗ್‌ಗಳನ್ನು ಬರೆಯಿರಿ, ಮತ್ತು ಇತರೆ ಮೆಟಾಡೇಟಾವನ್ನು ಬರೆ (_m)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "ತೋರಿಸು"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "ಫೋಟೊಗಳನ್ನು ಆಮದು ಇಲ್ಲಿಗೆ ಮಾಡು (_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "ಹಿನ್ನಲೆ (_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "ಅಮದು ಮಾಡಲಾಗುತ್ತಿದೆ"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "ಕೋಶದ ರಚನೆ (_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ನಮೂನೆ (_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ಉದಾಹರಣೆಗೆ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "ಆಮದು ಮಾಡಲಾದ ಕಡತಗಳನ್ನು ಸಣ್ಣಕ್ಷರಗಳಲ್ಲಿ ಮರುಹೆಸರಿಸು (_e)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW ವಿಕಸನೆಗಾರ"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "ಪೂರ್ವನಿಯೋಜಿತ (_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "ಬಾಹ್ಯ ಫೋಟೊ ಸಂಪಾದಕ (_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "ಬಾಹ್ಯ _RAW ಸಂಪಾದಕಗಳು:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "ಬಾಹ್ಯ ಸಂಪಾದಕಗಳು"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "ಪ್ಲಗ್‌ಇನ್‌ಗಳು"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..67ab5d3
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,4481 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# boram <boramism@gmail.com>, 2011
+# boram <boramism@gmail.com>, 2013
+# boram <boramism@gmail.com>, 2011-2012
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-10-01 16:28+0000\n"
+"Last-Translator: boram <boramism@gmail.com>\n"
+"Language-Team: Korean (http://www.transifex.com/projects/p/shotwell/language/"
+"ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "이벤트 %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "카메라"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "카메라"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"카메라를 마운트 해제할 수 없습니다. 카메라를 파일 관리자에서 마운트 해제해 보"
+"십시오."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "이미 가져온 사진 감추기"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "이전에 가져오지 않은 사진만 표시합니다"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "가져오기를 시작합니다. 기다려 주십시오..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "제목(_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "각 사진의 제목을 표시합니다"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "선택한 것 가져오기(_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "선택한 사진을 라이브러리로 가져옵니다"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "모두 가져오기(_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "모든 사진을 라이브러리로 가져옵니다"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"샷웰이 카메라에 접근하려면 파일 시스템에서 카메라를 마운트 해제해야 합니다. "
+"계속하시겠습니까?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "마운트 해제(_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "카메라를 마운트 해제해 주십시오."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"다른 프로그램이 카메라를 사용하고 있습니다. 다른 프로그램이 사용 중이면 샷웰"
+"이 카메라에 접근할 수 없습니다. 카메라를 사용 중인 다른 프로그램을 닫으신 후 "
+"다시 시도하십시오."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "카메라를 사용 중인 다른 프로그램을 닫으세요."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"카메라에서 미리 보기를 가져올 수 없습니다:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "마운트 해제 중..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "사진 정보 가져오기"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s의 미리 보기 가져오는 중"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "카메라를 잠글 수 없습니다: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "이 사진 %d매를 카메라에서 지우시겠습니까?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "카메라에서 비디오 %d편을 지우시겠습니까?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "카메라에서 사진/비디오 %d개를 지우시겠습니까?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "파일 %d개를 카메라에서 삭제하시겠습니까?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "유지(_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "카메라에서 사진/비디오에서 제거는 중입니다"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "오류로 인하여 사진/비디오 %d개를 카메라에서 지울 수 없습니다."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "슬라이드 쇼(_L)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "슬라이드 쇼 시작"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "사진/비디오 내보내기"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "사진/비디오 내보내기"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "사진 내보내기"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "사진 내보내기"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "회전"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "회전 취소"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "좌우로 뒤집기"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "좌우로 뒤집기 취소"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "상하 뒤집기"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "상하로 뒤집기 취소"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "모든 텍스트"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "제목"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "태그"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "설명"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "이벤트 이름"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "파일 이름"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "미디어 형식"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "표시 상태"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "사진 상태"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "평점"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "날짜"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "포함"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "정확하게 일치"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "다음으로 시작"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "다음으로 끝남"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "포함하지 않음"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "설정하지 않음"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "같음"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "같지 않음"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "모든 사진"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW 사진"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "비디오"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "다음 항목이 있음"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "다음 항목이 있음"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "수정"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "내부 수정"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "외부 수정"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "표시함"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "표시하지 않음"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "이상인 것"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "일치하는 것"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "이하인 것"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "다음 값 다음"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "다음 값 전"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "다음 값 사이"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "그리고"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "일부 일치"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "모두 일치"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "없음"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "저장한 검색"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "새 저장한 검색(_W)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"사진 라이브러리가 이 버전의 샷웰과는 호환되지 않습니다. 이 라이브러리는 샷웰 "
+"%s (schema %d)(으)로 만들어진 것으로 보이지만 이 프로그램의 버전은 %s "
+"(schema %d)입니다. 최신 버전의 샷웰을 사용하십시오."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"샷웰이 사진 라이브러리를 버전 %s (schema %d)에서 %s (schema %d)(으)로 업그레"
+"이드 할 수 없습니다. 더 많은 정보는 %s에 있는 샷웰 위키에서 찾을 수 있습니다."
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"사진 라이브러리가 이 버전의 샷웰과는 호환되지 않습니다. 이 라이브러리는 샷웰 "
+"%s (schema %d)(으)로 만들어진 것으로 보이지만 이 프로그램의 버전은 %s "
+"(schema %d)입니다. %s(을)를 지우셔서 라이브러리를 지우신 후 사진을 다시 가져"
+"오십시오."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "샷웰 데이터베이스 확인 시도 중 알 수 없는 오류가 발생했습니다: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "샷웰 불러오는 중"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "샷웰 개인 정보 저장 경로"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "디렉터리"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "시작할 때 라이브러리 디렉터리에 바뀐 점이 있는지 확인하지 않기"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "시작 진행 상태 표시하지 않기"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "프로그램 버전 보이기"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[파일]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"사용 가능한 명령 줄 옵션을 모두 보려면 '%s --help' 명령어를 실행하십시오.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "오늘"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "어제"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "제목:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "항목:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "이벤트 %d개"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "사진 %d장"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "비디오 %d편"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "날짜:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "시간:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "시작:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "끝:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "크기:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "재생 시간:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f 초"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "편집 프로그램:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "노출:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "위치:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "파일 크기:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "현재 편집 프로그램:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "원래 크기:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "카메라 제조사:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "카메라 모델:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "플래시:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "초점 거리:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "촬영 날짜:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "촬영 시간:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "노출 보정:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS 위도:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS 경도:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "아티스트:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "저작권:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "소프트웨어:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "설명:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "확장 정보"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "태그 \"%s\"(을)를 %d장의 사진에서 제거합니다. 계속하시겠습니까?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "취소(_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "삭제(_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "검색 \"%s\"을(를) 제거합니다. 계속하시겠습니까?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "편집 프로그램을 전환하면 사진에 샷웰이 바꾼 내용을 모두 취소합니다."
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "편집 프로그램 전환(_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "비디오 내보내기"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"%s에 쓸 수 있는 권한이 없기 때문에 이 사진을 편집할 때 사용하는 파일을 만들 "
+"수 없습니다."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"파일 오류로 다음 사진을 내보낼 수 없습니다.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"계속 내보내시겠습니까?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "계속(_T):"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "바꾸지 않음"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "현재"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "형식(_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "화질(_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "크기 조정 제한(_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "픽셀(_P)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "메타 정보 내보내기"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "자세한 내용 저장..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "자세한 내용 저장"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(그리고 %d개 더)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "결과 보고서 가져오기"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "파일 %d개를 가져옵니다."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "그 중 파일 %d개를 가져왔습니다."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "가져오지 않은 사진 또는 비디오 복제:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "이미 존재하는 미디어 항목 복제"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "카메라 오류로 사진 또는 비디오를 가지고 오지 않았습니다:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "오류 메시지:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "파일을 사진이나 비디오로 인식할 수 없어 가지고 오지 않았습니다:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "샷웰이 파일 형식을 인식할 수 없어 가지고 오지 않았습니다:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"샷웰이 파일을 라이브러리로 복사할 수 없어 사진이나 비디오로 인식할 수 없어 가"
+"지고 오지 않았습니다:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s을(를)\n"
+"\t%s(으)로 복사할 수 없음"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "파일 이름에 문제가 있어 사진/비디오를 가져오지 않았습니다:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "다른 이유로 사진 또는 비디오를 가지고 오지 않았습니다:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "중복된 사진 %d매를 가져오지 않았습니다:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "중복된 비디오 %d편을 가져오지 않았습니다:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "중복된 사진/비디오 %d개를 가져오지 않았습니다:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "파일 또는 하드웨어 오류로 사진 %d매를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "파일 또는 하드웨어 오류로 비디오 %d편을 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"파일 또는 하드웨어 오류로 %d장의 사진/비디오를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "하드웨어 오류로 파일 %d개를 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"사진 라이브러리 폴더에 기록할 수 없어 사진 %d매를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"사진 라이브러리 폴더에 기록할 수 없어 비디오 %d편을 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"사진 라이브러리 폴더에 기록할 수 없어 사진/비디오 %d개를 가져오지 못했습니"
+"다:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"사진 라이브러리 폴더에 기록할 수 없어 파일 %d개를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "카메라 오류로 사진 %d매를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "카메라 오류로 비디오 %d편을 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "카메라 오류로 사진/비디오 %d개를 가져오지 못했습니다:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "카메라 오류로 파일 %d개를 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "파일 이름에 문제가 있어 사진 %d매를 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "파일 이름에 문제가 있어 비디오 %d편을 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "파일 이름에 문제가 있어 사진/비디오 %d개를 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "파일 이름에 문제가 있어 파일 %d개를 가져올 수 없습니다:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d매의 지원하지 않는 사진을 건너 뛰었습니다:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "그림이 아닌 파일 %d개를 건너 뛰었습니다.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "사용자의 요청으로 사진 %d매를 건너 뛰었습니다:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "사용자의 요청으로 사진 %d매를 건너 뛰었습니다:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "사용자의 요청으로 사진/비디오 %d개를 건너 뛰었습니다:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "사용자가 취소하여 파일 %d개를 건너뛰었습니다:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "사진 %d매를 성공적으로 가져왔습니다.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "비디오 %d편을 성공적으로 가져왔습니다.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "사진/비디오 %d개를 성공적으로 가져왔습니다.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "가져온 사진 또는 비디오가 없습니다.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "가져오기 완료"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 초"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 분"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 시간"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 일"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "이벤트 이름 바꾸기"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "이름:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "제목 편집"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "이벤트 설명 편집"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "사진/비디오 설명 편집"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "휴지통에 버리기(_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "라이브러리에서 제거(_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "외부 편집 프로그램으로 한 편집을 되돌리시겠습니까?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "외부 편집 프로그램으로 한 편집을 되돌리시겠습니까?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"외부 파일에 적용한 바뀐 내용 %d개를 모두 취소합니다. 계속하시겠습니까?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "외부 편집 프로그램으로 한 편집 되돌리기(_V)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "외부 편집 프로그램으로 한 편집 되돌리기(_V)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "라이브러리에서 사진 %d매를 제거합니다. 계속하시겠습니까?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "제거(_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "라이브러리에서 사진 제거"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "사진 라이브러리에서 제거"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "오전"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "오후"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24시간"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "같은 크기의 사진/비디오 옮기기(_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "모든 사진/비디오를 이 시간으로 설정(_A)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "원본 사진 파일 수정(_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "원본 사진 파일 수정(_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "원본 파일 수정(_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "원본 파일 수정(_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "원본:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d, %p %I:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"촬영 시간을 %d %s, %d %s, %d %s, %d %s\n"
+"전으로 바꿉니다."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"촬영 시간을 %d %s, %d %s, %d %s, %d %s\n"
+"후로 바꿉니다."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "일"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "시"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "분"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "초"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"그리고 다른 %d개."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "태그(쉼표로 구분):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "환영합니다!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "샷웰 사용을 환영합니다!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "시작 하시려면, 다음 중 하나의 방법으로 사진을 가져오십시오:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">폴더에서 가져오기 %s</span> 선택"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "샷웰 창으로 사진 끌어다 놓기"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "컴퓨터에 카메라를 연결한 후 가져오기"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "%s 폴더에서 사진 가져오기(_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "다음 중 하나의 방법으로도 사진을 가져올 수 있습니다:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "이 메시지 표시하지 않기(_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "라이브러리 %s에서 사진 가져오기"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(도움말)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "연%s월%s일"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "연%s월"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "연%s월-일"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "연-월-일"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "사용자 설정"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "부적절한 패턴"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"샷웰은 사진을 라이브러리 폴더로 복사할 수 있고 사진을 복사하지 않고 가져올 수"
+"도 있습니다."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "사진 복사(_P)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "복사하지 않고 가져오기(_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "라이브러리로 가져오기"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "라이브러리에서 제거"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "사진을 라이브러리에서 제거하는 중"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "사진을 라이브러리에서 제거하는 중"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"샷웰 라이브러리에서 사진/비디오 %d개를 제거합니다.제거한 후 파일도 데스크톱 "
+"휴지통으로 옮기시겠습니까?\n"
+"\n"
+"이 동작은 취소할 수 없습니다."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"샷웰 라이브러리에서 비디오 %d편을 제거합니다.제거한 후 파일도 데스크톱 휴지통"
+"으로 옮기시겠습니까?\n"
+"\n"
+"이 동작은 취소할 수 없습니다."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"샷웰 라이브러리에서 사진 %d매를 제거합니다.제거한 후 파일도 데스크톱 휴지통으"
+"로 옮기시겠습니까?\n"
+"이 동작은 취소할 수 없습니다."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"사진/비디오 %d개를 데스크톱 휴지통으로 옮길 수 없습니다.이 파일을 삭제하시겠"
+"습니까?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "사진/비디오 %d개를 삭제할 수 없습니다."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "폴더"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "태그"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "성공"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "파일 오류"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "파일을 해석할 수 없습니다"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "데이터베이스 오류"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "사용자가 가져오기를 취소했습니다"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "파일 아님"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "파일이 데이터베이스에 이미 존재함"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "지원하지 않는 파일 형식"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "이미지 파일 아님"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "디스크 오류"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "디스크 꽉 참"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "카메라 오류"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "파일 쓰기 오류"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "문제가 있는 이미지 파일"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "가져오기 실패(%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "수정함"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "이전 사진"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "다음 사진"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "사진 파일을 찾을 수 없습니다: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "보기(_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "도구(_O)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "이전 사진(_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "이전 사진"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "다음 사진(_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "다음 사진"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "확대(_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "사진 확대 배율 늘리기"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "축소(_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "사진 확대 배율 줄이기"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "페이지에 맞추기(_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "화면에 꼭 맞게 사진을 확대합니다"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "원본 크기로 확대(_1)"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "사진을 원본 크기로 확대합니다"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "원본 두 배 크기로 확대(_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "사진을 원본 두 배 크기로 확대합니다"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "편집 프로그램(_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s(을)를 내보낼 수 없습니다: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s 데이터 베이스"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "오류로 인해 %s에서 가져올 수 없습니다:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "다른 서비스에서 가져오려면 위 메뉴에서 하나를 선택해주십시오."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "데이터 가져오기"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"사용하고 있는 데이터 가져오기 플러그인이 없습니다.\n"
+"\n"
+"프로그램에서 가져오기 기능을 사용하려면 최소 하나 이상의 데이터 가져오기 플러"
+"그인을 사용해야 합니다. 플러그인은 기본 설정 대화 상자에서 사용하도록 설정할 "
+"수 있습니다."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "데이터베이스 파일:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "가져오기(_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "프로그램에서 가져오기"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "프로그램에서 미디어 가져오기(_F):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "닫기(_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "설정"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "슬라이드 쇼"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "뒤로"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "이전 사진으로 이동합니다"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "일시 중지"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "슬라이드 쇼 일시 정지"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "다음"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "다음 사진으로 이동합니다"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "슬라이드 쇼 설정을 바꿉니다"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "모든 사진 파일을 찾을 수 없습니다."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "재생"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "슬라이드 쇼 계속하기"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "되돌리기"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "되돌리기 취소"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "화질 높이기"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "화질 높이기 취소"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "색 변환을 적용하는 중"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "색 전환을 취소하는 중"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "새 이벤트 만들기"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "이벤트 제거"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "사진 새 이벤트로 옮기기"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "사진을 이전 이벤트로 설정"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "합치기"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "합치기 취소"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "사진 복제"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "복제한 사진 삭제"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "파일 오류로 사진 %d매를 복제할 수 없습니다"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "이전 평점으로 되돌리기"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "평점 높이기"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "평점 낮추기"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW 편집 프로그램 설정"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "이전 RAW 편집 프로그램 되돌리기"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "편집 프로그램 설정"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "원본 사진은 조정할 수 없습니다."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "날짜와 시간 조정"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "날짜 시간 조정 취소"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "원본 사진은 조정할 수 없습니다."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "시간 조정 오류"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "다음 사진 파일에 적용한 시간 조정은 취소할 수 없습니다."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "태그 만들기"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "태그 \"%s\" 이동"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "사진 휴지통으로 보내기"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "휴지통에 있는 사진 되살리기"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "사진을 샷웰 휴지통으로 옮깁니다"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "휴지통에 있는 사진을 샷웰 라이브러리로 다시 가져옵니다"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "사진을 휴지통으로 보내기"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "휴지통에 있는 사진 되살리기"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "선택한 사진 표시"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "선택한 사진 표시 제거"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "선택한 사진 표시"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "선택한 사진 표시 제거"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "표시"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "표시 제거"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "샷웰"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BPM"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "낮음(%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "중간(%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "높음(%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "최대(%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "사진/비디오가 없음"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "사진/비디오를 찾을 수 없습니다"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "사진을 이 디렉터리로 내보낼 수 없습니다."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "감시 업데이트를 처리할 수 없습니다: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "전체 페이지 채우기(_F)"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "페이지 당 2장의 사진"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "페이지 당 4장의 사진"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "페이지 당 6장의 사진"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "페이지 당 8장의 사진"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "페이지 당 16장의 사진"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "페이지 당 32장의 사진"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "인치."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "센티미터"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "지갑(2 x 3 인치)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "노트 카드(3 x 5 인치)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 인치"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 인치"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 인치"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 인치"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 인치"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet(9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "엽서(10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "이미지 설정"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "인쇄..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"사진을 인쇄할 수 없습니다::\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "사진 데이터 베이스 %s을(를) 만들 수 없습니다: 오류 코드 %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"사진 데이터베이스 파일에 쓸 수 없습니다:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"데이터베이스 파일에 접근할 수 없습니다:\n"
+" %s\n"
+"\n"
+"오류: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "비디오 내보내기"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "노틸러스 보내기를 실행할 수 없습니다: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "보내기"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "배경을 %s(으)로 내보낼 수 없습니다: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "데스크톱 슬라이드 쇼를 준비할 수 없습니다: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "표시함"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "휴지통"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "휴지통이 비어있습니다"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "삭제"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "사진 삭제"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "찾을 수 없는 파일"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "삭제하는 중..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "최근 가져온 항목"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "폴더에서 가져오기(_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "사진을 디스크에서 라이브러리로 가져옵니다"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "프로그램에서 가져오기(_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "이벤트 정렬(_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "휴지통 비우기(_R)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "휴지통 안의 모든 사진을 지움"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "사진 이벤트 보기(_N)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "찾기(_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "검색 기준에 따라 사진과 비디오를 찾아봅니다"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "파일(_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "편집(_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "사진(_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "사진(_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "이벤트(_T)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "태그(_G)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "도움말(_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "기본 정보(_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "선택한 사진의 기본 정보를 표시합니다"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "확장 정보(_X)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "선택한 사진의 확장 정보를 표시합니다"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "검색 표시줄(_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "검색 표시줄 표시"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "사이드바(_I)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "사이드바 표시"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "오름차순(_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "사진을 오름차순으로 정렬합니다"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "내림차순(_E)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "사진을 내림차순으로 정렬합니다"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "폴더에서 가져오기"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "휴지통 비우기"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "휴지통을 비우는 중..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "샷웰이 사진을 사용자 홈 디렉터리로 가져오도록 설정했습니다.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "라이브러리 위치"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "이 디렉터리에서 사진을 가져올 수 없습니다."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "라이브러리 업데이트 중..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "사진을 자동으로 가져올 준비를 하는 중..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "사진을 자동으로 가져오는 중..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "파일에 메타 정보 쓰는 중..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "라이브러리"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "가져오는 중..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "가져오기 중지(_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "사진 가져오기를 중지합니다"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "가져오기 준비 중..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s 가져옴"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "저장(_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "사진 저장"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "다른 이름으로 저장(_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "사진을 다른 이름으로 저장합니다"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "컴퓨터와 연결한 프린터로 사진을 인쇄합니다"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s(이)가 존재하지 않습니다."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s(은)는 파일이 아닙니다."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s(이)가 다음의 파일 형식을 지원하지 않습니다\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "사본 저장(_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%sd에 바뀐 점을 버리시겠습니까?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "저장하지 않고 닫기(_W)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s(으)로 저장하는 중 오류 발생: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "다른 이름으로 저장"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%1$s을(를) 감시할 수 없습니다: 디렉터리 아님(%2$s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "사진 관리자"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "사진 보기"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "오른쪽으로 회전(_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "회전"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "오른쪽으로 회전"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "사진을 오른쪽으로 회전(컨트롤을 누르면 왼쪽으로 회전)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "왼쪽으로 회전(_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "왼쪽으로 회전"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "사진을 왼쪽으로 회전합니다"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "좌우로 뒤집기(_Z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "좌우로 뒤집기"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "상하로 뒤집기(_C)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "상하로 뒤집기"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "화질 강화(_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "화질 강화"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "사진의 화질을 자동으로 개선합니다"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "색 조절 복사(_C)"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "색 조절 복사"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "사진에 적용한 색 조절 복사"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "색 조절 붙여넣기(_P)"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "색 조절 붙여넣기"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "선택한 사진에 복사한 색 조정을 적용합니다."
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "잘라내기(_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "잘라내기"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "사진을 잘라냅니다"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "바로잡기(_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "바로잡기"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "사진 바로잡기"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "적목 현상(_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "적목"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "사진의 적목 현상을 줄이거나 제거합니다"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "조정(_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "조정"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "사진의 색과 색조를 조정합니다"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "원래 이미지로 돌려놓기(_V)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "원래 이미지로 돌려놓기"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "외부 편집기로 편집한 것 되돌리기(_D)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "마스터 사진으로 되돌리기"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "데스크톱 배경 화면으로 설정(_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "선택한 그림을 새 데스크톱 배경으로 설정합니다"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "데스크톱 슬라이드 쇼로 설정(_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "실행 취소(_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "실행 취소"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "다시 실행(_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "다시 실행"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "이벤트 이름 바꾸기(_N)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "이벤트 대표 사진으로 사용(_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "이 사진을 이벤트를 대표하는 사진으로 사용합니다"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "새 이벤트(_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "새 이벤트"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "사진 이동"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "사진을 이벤트로 옮기기"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "이벤트 합치기(_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "합치기"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "이벤트를 단일 이벤트로 합치기"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "평점 설정(_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "평점 설정"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "사진의 평점을 바꿉니다"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "높이기(_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "평점 높이기"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "낮추기(_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "평점 낮추기"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "평점 없음(_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "평점 지정 안 함"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "평점 없는 것으로 설정"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "평점 없는 것으로 설정"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "모든 평점 제거"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "등급 외(_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "등급 외"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "등급 외로 평점 매기기"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "등급 외 사진으로 설정"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "등급 외 사진에 평점 설정"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "등급 외 사진만(_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "등급 외 사진만"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "등급 외 사진만 보입니다"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "모두 + 등급 외 사진(_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "등급 외 사진을 포함한 모든 사진 보기"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "모든 사진(_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "모든 사진 보기"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "평점(_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "각 사진의 평점을 표시합니다"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "사진 거르기(_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "사진 거르기"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "필터에 따라 표시할 사진의 수를 제한합니다"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "복제(_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "복제"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "이 사진을 복제합니다"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "내보내기(_E)..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "인쇄(_P)..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "사진 업로드(_B)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "사진 업로드"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "다양한 웹 사이트로 업로드합니다"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "제목 편집(_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "설명 편집(_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "설명 편집"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "이벤트 설명 편집(_C)..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "시간과 날짜 조정(_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "시간과 날짜 조정"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "태그 추가(_T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "태그 추가(_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "태그 추가"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "기본 설정(_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "외부 편집기로 열기(_X)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW 편집기로 열기(_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "보내기(_T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "보내기(_O)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "찾기(_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "찾기"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "이름이나 태그를 나타내는 텍스트를 입력하여 사진을 찾습니다"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "표시(_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "표시 제거(_F)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "편집기를 실행할 수 없습니다: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "태그 \"%s\" 추가"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "태그 \"%s\"과(와) \"%s\" 추가"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "태그 \"%s\" 삭제(_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "태그 \"%s\"(을)를 삭제합니다"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "태그 삭제"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "새 항목(_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "태그 \"%s\" 이름 바꾸기(_N)..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "태그 이름을 \"%s\"에서 \"%s\"(으)로 바꿉니다."
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "이름 바꾸기(_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "태그 수정(_Y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "태그 수정"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "사진에 \"%s\" 태그를 붙입니다"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "사진에 \"%s\"태그를 붙입니다"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "선택한 사진에 \"%s\"태그를 붙입니다"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "선택한 사진에 \"%s\"태그를 붙입니다"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "사진에서 \"%s\" 태그를 제거합니다(_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "사진에서 \"%s\" 태그를 제거합니다(_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "사진에서 \"%s\" 태그를 제거합니다"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "사진에서 \"%s\" 태그를 제거합니다"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "태그가 이미 존재하기 때문에 태그 이름을 \"%s\"(으)로 바꿀 수 없습니다."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "검색이 이미 존재하기 때문에 검색 \"%s\"의 이름을 바꿀 수 없습니다."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "저장한 검색 결과"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "검색 삭제"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "편집(_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "이름 바꾸기(_N)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "검색 \"%s\"의 이름을 \"%s\"(으)로 바꾸기"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "검색 \"%s\" 삭제"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s의 평점"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "%s에 평점 설정"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s의 평점 설정"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s 표시"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "평점이 %s 인 사진만 보기"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s 또는 그 이상인 것"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s 또는 그 이상인 것 표시"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "평점이 %s이거나 그 이상인 사진만 보기"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "선택한 사진을 휴지통에서 제거합니다"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "선택한 사진을 라이브러리에서 제거합니다"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "복구(_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "선택한 사진을 라이브러리 안으로 이동합니다"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "파일 관리자로 보이기(_G)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "선택한 사진이 있는 디렉터리를 파일 관리자로 열어봅니다"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "파일 관리자로 열 수 없습니다: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "라이브러리에서 제거(_E)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "휴지통에 버리기(_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "모두 선택(_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "모든 항목 선택"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%p %-I:%M"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%p %-I:%M:%S"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%Y년 %b %d일 (%a)"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%b %d일 (%a)"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%Y년 %d일"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "각도:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "되돌리기(_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "현재 사진 크기로 되돌리기"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "이 사진을 얼마나 잘라낼지 설정"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "사진 줄이기 사각형을 가로 세로 방향으로 돌립니다"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "자르지 않음"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "정사각형"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "화면"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "원본 크기"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD 비디오(4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD 비디오(16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "편지(8.5 x 11 인치)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "타블로이(11 x 17 인치)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "적목 현상 제거 도구 닫기"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "선택한 범위 안의 모든 적목 현상 제거"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "채도:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "색조:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "온도:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "그림자:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "강조:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "색 되돌리기"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "모든 색 조정을 원래대로 되돌립니다"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "온도"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "색조"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "채도"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "노출"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "그림자"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "강조"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "대비 확장"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "도구 모음 고정"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "열린 도구 모음 고정"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "전체 화면 나가기"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "전체 화면 나가기(_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "끝내기(_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "정보(_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "전체 화면(_C)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "차례(_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "자주 하는 질문(_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "문제 보고(_R)..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"샷웰 라이브러리에 접근하던 중 치명적인 오류가 발생했습니다.샷웰을 계속 실행"
+"할 수 없습니다.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "제작자 웹 사이트 방문"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Kim, Boram <boramism@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "도움말을 표시할 수 없습니다: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "버그 데이터베이스로 이동할 수 없음: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "자주 하는 질문을 표시할 수 없습니다: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "제목 없음"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "원본 크기"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "너비와 높이"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "너비"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "높이"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "섬네일 크기를 조정합니다"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "섬네일을 확대합니다"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "섬네일을 축소합니다"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "사진 정렬(_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "비디오 재생(_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "시스템의 비디오 재생 프로그램으로 선택한 비디오 열기"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "설명(_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "각 사진의 설명 표시"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "각 사진의 태그를 표시합니다"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "제목 순으로(_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "사진을 제목 순으로 정렬합니다"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "촬영 날짜 순(_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "사진을 촬영 날짜 순으로 정렬합니다"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "평점으로(_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "평점 순으로 사진 정렬"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"샷웰이 선택한 비디오를 재생할 수 없습니다:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "사진/비디오 %d개"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "각 이벤트의 설명 표시"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "이벤트 없음"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "이벤트가 없습니다"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "이벤트"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "업데이트 함"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "이벤트 없음"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "캐시 디렉터리 %s을(를) 만들 수 없습니다: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "데이터 디렉터리 %1$s을(를) 만들 수 없습니다: %2$s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "사진"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "임시 디렉터리 %1$s을(를) 만들 수 없습니다: %2$s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "데이터 하위 디렉터리 %1$s을(를) 만들 수 없습니다: %2$s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(없음)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "없음"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "임의"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "슬라이드 쇼 전환 효과"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s의 임시 파일을 만들 수 없습니다: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "내보내는 중"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "파일 %s(이)가 이미 존재합니다. 바꾸시겠습니까?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "건너 뛰기(_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "바꾸기(_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "모두 바꾸기(_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "내보내기"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "사진"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "비디오"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW 사진"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW 사진"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI 파일 %s을(를) 불러올 수 없습니다: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "형식"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "업로드 중 "
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "선택하신 사진/비디오를 성공적으로 업로드했습니다."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "선택하신 비디오를 성공적으로 업로드했습니다."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "선택하신 사진을 성공적으로 업로드했습니다."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "선택하신 비디오를 성공적으로 업로드했습니다."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "선택하신 사진을 성공적으로 업로드했습니다."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "계정 정보 가져오는 중..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "로그인 중..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "사진 업로드"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "사진을 업로드할 곳(_T):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "비디오 업로드"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "다음에 비디오 업로드(_T):"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "사진과 비디오 업로드"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "다음에 사진과 비디오 업로드(_T)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "사진을 업로드 할 수 없음"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"알맞은 업로드 플러그인을 사용하고 있지 않아 선택한 항목을 업로드할 수 없습니"
+"다.이 문제를 해결하려면 <b>편접 %s 기본 설정</b>을 선택한 뒤 <b>플러그인</b> "
+"탭에서사용할 플러그인을 선택해주십시오."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "업로드 준비 중"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "전체 %2$d개 가운데 %1$d개 업로드 중"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "오류가 발생하여 %s(으)로 업로드할 수 없습니다:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "위 메뉴에서 하나를 선택하여 다른 서비스로 업로드하십시오."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "새 태그(_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"업로드에 필요한 임시 파일을 사용할 수 없습니다 "
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"이 샷웰 세션 사용 중 이미 구글 서비스에 로그인 후 로그아웃 하셨습니다.\n"
+"계속 구글 서비스로 업로드하시려면, 샷웰을 끝낸 후 다시 시작한 후업로드하십시"
+"오."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"현재 유튜브에 로그인하지 않았습니다.\n"
+"\n"
+"계속 하시려면 구글 계정 등록이 되어있어야 하고 유튜브를 사용할 수 있도록 설정"
+"해야 합니다. 웹 브라우저를 이용하여 한번 이상 유튜브 사이트에 로그인 하시면 "
+"대부분의 계정을 설정할 수 있습니다."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"업로드에 필요한 파일을 사용할 수 없습니다. 유튜브로 계속 업로드할 수 없습니"
+"다."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "유튜브에 %s(으)로 로그인했습니다."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "'%s' 안에 비디오가 나타납니다."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "목록에 있는 것 공개"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "목록에 없는 것 공개"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "개인"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "핵심 업로드 서비스"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"플리커 서비스에 로그인하지 않았습니다.\n"
+"\n"
+"웹 브라우저로 Flickr 사이트를 여신 후 로그인을 클릭해주십시오. 샷웰이 플리커 "
+"계정 링크에 접근하는 것을 허용해야 합니다."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"이 샷웰 세션 사용 중 이미 Flickr에 로그인 후 로그아웃 하셨습니다.\n"
+"계속 플리커로 업로드하시려면, 샷웰을 끝낸 후 다시 시작하여 업로드하십시오."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "로그인 준비 중..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"업로드에 필요한 파일을 사용할 수 없습니다. 플리커로 계속 업로드할 수 없습니"
+"다."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "인증 확인 중..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"플리커에 %s(으)로 로그인했습니다.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"플리커 무료 계정은 한 달에 업로드할 수 있는 데이터에 제한이 있습니다.\n"
+"이 달에 업로드할 수 있는 데이터는 %d 메가바이트가 남아있습니다."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "플리커 프로 계정은 업로드에 제한이 없습니다."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "사진을 보여줄 사람(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "비디오를 보여줄 사람(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "사진과 비디오를 보여줄 사람(_V):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "모두"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "가족과 친구만"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "가족만 "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "친구만"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "나만"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 픽셀"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 픽셀"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 픽셀"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 픽셀"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "앨범 %s 만드는 중..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"피위고로 사진을 업로드 하던 중 오류가 발생했습니다. 다시 시도해주십시오."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"피위고 사진 라이브러리 주소와 이 계정의 라이브러리를 사용할 수 있는 사용자 이"
+"름 및 암호를 입력하십시오."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"샷웰이 피위고 사진 라이브러리에 접근할 수 없습니다. 입력한 주소를 확인하십시"
+"오."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"사용자 이름이나 암호 혹은 모든 항목이 올바르지 않습니다. 다시 시도해주십시오."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "올바르지 않은 주소"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "사용자 이름 또는 암호가 올바르지 않습니다."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "샷웰 접속"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "관리자, 가족, 친구, 연락처"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "관리자, 가족, 친구 "
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "관리자, 가족"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "관리자"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"현재 피카사 웹 앨범에 로그인하지 않았습니다.\n"
+"\n"
+"웹 브라우저에서 로그인을 클릭하여 피카사 웹 앨범으로 로그인합니다. 피카사 웹 "
+"앨범 계정에 연결하려면 샷웰 연결을 승인해야 합니다."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"업로드에 필요한 파일을 사용할 수 없습니다. 피카사로 계속 업로드할 수 없습니"
+"다."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "앨범 만드는 중..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "피카사 웹 앨범에 %s(으)로 로그인 했습니다."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "비디오가 나타나는 시간:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "사진이 나타나는 시간:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "작게(640 x 480 픽셀)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "중간(1024 x 768 픽셀)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "추천(1600 x 1200 픽셀)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "구글+(2048 x 1536 픽셀)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"현재 페이스 북에 로그인하지 않았습니다.\n"
+"\n"
+"페이스 북 계정이 아직 없는 경우 로그인 과정 중 만드실 수 있습니다. 로그인 중 "
+"샷웰 연결이 사진을 업로드하거나 피드에 업로드할 권한을 요구할 수 있습니다. "
+"이 권한은 샷웰 연결이 동작하는데 필요합니다."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"이 샷웰 세션에서는 이미 페이스 북에 로그인과 로그아웃을 하셨습니다.\n"
+"계속 페이스 북에 업로드하시려면, 샷웰을 다시 시작한 후 업로드하십시오."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "표준(720 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "큼(2048 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "페이스북 연결을 확인하는 중..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"업로드에 필요한 파일을 사용할 수 없습니다. 페이스북으로 계속 업로드할 수 없습"
+"니다."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr "페이스 북에 %s(으)로 로그인했습니다.\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "선택한 사진을 어디로 업로드하시겠습니까?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "업로드 크기(_S):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "친구"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "부서지는 효과"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "체스판 무늬"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "여러 개의 동그라미"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "블라인드"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "줄무늬"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "시계 효과"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "동그라미"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "핵심 슬라이드 쇼 전환 효과 잼-전이: EOF "
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "슬라이드"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "사라지는 효과"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "여러 사각형"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "핵심 데이터 가져오기 서비스"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot 라이브러리 가져오기 서비스 사용을 환영합니다.\n"
+"\n"
+"샷웰이 발견한 라이브러리를 선택하거나 F-Spot 데이터베이스 파일을 선택해주십시"
+"오."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot 라이브러리 가져오기 서비스 사용을 환영합니다.\n"
+"\n"
+"F-Spot 데이터베이스 파일을 선택해주십시오."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "가져올 F-Spot 데이터베이스 파일 직접 선택:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"선택한 F-Spot 데이터베이스 파일을 열 수 없습니다: 파일이 존재하지 않거나 F-"
+"Spot 데이터베이스 파일이 아닙니다."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"선택한 F-Spot 데이터베이스 파일을 열 수 없습니다: 샷웰이 이 버전의 F-Spot 데"
+"이터베이스 파일을 지원하지 않습니다."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"선택한 F-Spot 데이터베이스 파일을 읽을 수 없습니다: 태그 테이블을 읽던 중 오"
+"류가 발생했습니다."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"선택한 F-Spot 데이터베이스 파일을 읽을 수 없습니다: 사진 테이블을 읽던 중 오"
+"류가 발생했습니다."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"샷웰이 F-Spot 라이브러리에서 %d매의 사진을 발견했으며 지금 가져오고 있습니"
+"다. 중복된 파일은 자동으로 검출한 후 제거합니다.\n"
+"\n"
+"가져오기 작업은 백그라운드에서 계속되기 때문에 이 대화 상자를 닫은 후 샷웰을 "
+"계속 사용할 수 있습니다."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot 라이브러리: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "가져오기 준비 중 "
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "데스크톱 슬라이드 쇼로 설정"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "데스크톱 배경 슬라이드 쇼 만들기"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "각 사진을 표시할 시간"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "시간"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "각 그림이 데스크톱 배경에 얼마나 오래 표시될지 설정합니다"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "검색"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "검색 이름(_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "일치(_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "조건:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>인쇄한 사진 크기</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "표준 크기 사용(_S):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "사용자 설정 크기 사용(_U):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "사진 비율 맞추기(_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "자동으로 크기 조정(_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>제목</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "이미지 제목 인쇄(_T)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>픽셀 해상도</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "인쇄할 사진 해상도(_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "PPI"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"이름표"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "샷웰 기본 설정"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "흰색"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "검정"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "라이브러리 감시해 디렉터리에 있는 새 파일 찾기(_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "메타 데이터"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "태그, 제목 그리고 다른 메타 데이터를 사진 파일에 기록합니다(_M)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "표시"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "다음 위치로 사진 가져오기(_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "배경(_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "가져오기"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "디렉터리 구조(_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "패턴(_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "예제:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "가져온 파일 이름을 소문자로 바꿉니다(_E)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW 편집 프로그램"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "기본값(_F):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "외부 사진 편집기(_X):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "외부 RAW 편집 프로그램(_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "외부 편집 프로그램"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "플러그인"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "지연 시간(_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "전환 효과(_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "전환 지연 시간(_E):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "제목 표시(_I)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "초"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "로그인(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+"(텍스트는 페이스북 사용자 이름에 의존하며 프로그램에서 수정했습니다 - \n"
+"이 항목에 입력하는 모든 내용은 표시하지 않습니다)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "이미 존재하는 앨범에 업로드(_X):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "다음 이름을 가진 새 앨범 만들기(_N):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "사진과 비디오를 보여줄 사람(_V):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "업로드 전에 위치, 카메라 등의 개인을 식별할 수 있는 정보를 제거(_R)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "로그아웃(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "업로드(_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"웹 브라우저로 플리커에 로그인한 후 나타나는 확인 번호를 입력해주십시오."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "인증 번호(_N):"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"플리커에 (name)(으)로 로그인했습니다.\n"
+"\n"
+"(이 레이블의 문자열은 혼잡한 상태이며 코드 내부에 설정되어 있습니다, \n"
+"그러므로 여기서 만든 모든 바뀐 내용은 표시되지 않습니다)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "사진 표시 라벨(_V)(코드가 혼잡합니다)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "사진 크기(_S):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"$name(으)로 로그인했습니다.\n"
+"(프로그램 코드가 혼잡합니다)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "이미 존재하는 앨범에 업로드(_E):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "다음 이름의 앨범 만들기(_N):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "공개 갤러리에 있는 앨범 목록 보이기(_I)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype이(가) 잠시 후 나타납니다\n"
+"(코드가 혼잡합니다)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "사진 크기 프리셋(_S):"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "피위고 사진 라이브러리 주소(_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "사용자 이름(_N)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "암호(_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "암호 저장(_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "로그인"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "이미 존재하는 분류에 업로드(_E):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "사진을 보여줄 사람(_V):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "사진 크기:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "업로드할 분류:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "앨범 설명:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "사진 제목은 설정했지만 설명이 없으면 제목을 설명으로 사용합니다(_I)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "업로드 태그를 사용하지 않음(_D)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "로그아웃"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "비디오 사생활 설정(_S):"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 픽셀"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s'이(가) OAuth 인증 요청에 올바른 응답을 보내지 않습니다 "
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): 시작할 수 없습니다; 이 업로드 도구를 다시 시작할 "
+"수 없습니다."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Tumblr 계정을 사용할 수 있는 사용자 이름과 암호를 입력해주십시오."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI를 불러올 수 없음: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"%s 계정으로 Tumblr에 로그인했습니다..\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki 웹사이트 방문"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Yandex.Fotki에 로그인하지 않았습니다."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "전자 메일 주소(_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"(name)으로 Tumblr에 로그인했습니다.\n"
+"\n"
+"(이 라벨의 문자열이 배치되어 코드 내부에 설정되기 때문에 \n"
+"여기에서 바꾼 내용은 표시하지 않습니다)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "블로그:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "앨범(또는 새 것 만들기)(_A):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "접근 형식(_T):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "설명 감추기(_C)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "원본 사진 다운로드를 허용하지 않음(_F)"
diff --git a/po/ky.po b/po/ky.po
new file mode 100644
index 0000000..07e51f0
--- /dev/null
+++ b/po/ky.po
@@ -0,0 +1,4191 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# chingis, 2012
+# chingis, 2012
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:13+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Kirgyz (http://www.transifex.com/projects/p/shotwell/language/ky/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ky\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr ""
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr ""
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr ""
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr ""
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Калтыруу"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural ""
+"Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr ""
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Фотография экспорттоо"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr ""
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Айлантуу"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr ""
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr ""
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr ""
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr ""
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr ""
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr ""
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Ат:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] ""
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr ""
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr ""
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr ""
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr ""
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Өлчөм:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Экспозиция:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Айнуу"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Өчүрүү"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Видео экспорттоо"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Улантуу"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Кезектеги"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Сапат:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _пиксель"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid ""
+"Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Импорттоо аякталды"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунда"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d мүнөт"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d саат"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 күн"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Окуянын атын өзгөртүү"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Ат:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr ""
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr ""
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr ""
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Кош келиңиз!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell'ге кош келиңиз!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Тапшырылма"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Фотографияларды ко_пиялоо"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr ""
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr ""
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr ""
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr ""
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s маалымат базасы"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have at least one data imports plugin enabled. Plugins can be enabled in the Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr ""
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Жаңы окуяны жаратуу"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr ""
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr ""
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr ""
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] ""
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr ""
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr ""
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr ""
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr ""
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr ""
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr ""
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr ""
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr ""
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr ""
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 см"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 см"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 см"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 см"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 см"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Жөнөтүү"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Окуялар"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Тегдер"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Фотография менеджери"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Фотосүрөт көрсөткүчү"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr ""
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Түшүрүү"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Чарчы"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Экран"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Чыгуу"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "Программа _жөнүндө"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Толук экран"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Мазмун"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot continue.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr ""
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr ""
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr ""
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Туурасы же бийиктиги"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Туурасы"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Бийиктик"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr ""
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Окуялар"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Сүрөттөр"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Экспорттоо"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Өткөрүү"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Алмаштыруу"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_Баарын алмаштыруу"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Экспорттоо"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Фотографиялар"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use with YouTube to continue. You can set up most accounts by using your browser to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Баары"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you"
+" entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Альбом жаратуу..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the login process. During login, Shotwell Connect may ask you for permission to upload photos and publish to your feed. These permissions are required for Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing libraries found by Shotwell or by selecting an alternative F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is"
+" not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr ""
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr ""
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr ""
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr ""
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+msgid "_Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+msgid "_Publish"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000..feee48c
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,4753 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# gintaras <gintaras@inbox.lt>, 2013
+# Baltix kūrėjas <mantas@akl.lt>, 2011
+# verayin <vera@yorba.org>, 2011
+# menesis <menesis@pov.lt>, 2013, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-03-04 22:34+0000\n"
+"PO-Revision-Date: 2014-03-07 22:43+0200\n"
+"Last-Translator: menesis <menesis@pov.lt>\n"
+"Language-Team: Lithuanian (http://www.transifex.com/projects/p/shotwell/"
+"language/lt/)\n"
+"Language: lt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Laikinasis failas, reikalingas paskelbimui, neprieinamas"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Šiame Shotwell seanse jau prisijungėte ir atsijungėte nuo Google tarnybos.\n"
+"\n"
+"Jei norite toliau viešinti naudodami Google tarnybas, paleiskite Shotwell "
+"išnaujo ir vėl bandykite viešinti."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:688
+msgid "Visit the Yorba web site"
+msgstr "Aplankyti Yorba tinklalapį"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:691
+msgid "translator-credits"
+msgstr ""
+"Žygimantas Beručka <zygis@gnome.org>\n"
+"Mantas Kriaučiūnas <mantas@akl.lt>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Autorinės teisės 2009-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Sveiki pradėję naudoti F-Spot bibliotekos importavimo tarnybą.\n"
+"\n"
+"Pasirinkite importuojamą biblioteką nurodydami vieną iš esamų Shotwell "
+"bibliotekų arba alternatyvų F-Spot duomenų bazės failą."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Sveiki pradėję naudoti F-Spot bibliotekos importavimo tarnybą.\n"
+"\n"
+"Pasirinkite F-Spot duomenų bazės failą."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Pasirinkite F-Spot duomenų bazės failą importui:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nepavyksta atverti pasirinkto F-Spot duomenų bazės failo: tokio failo nėra "
+"arba tai ne F-Spot duomenų bazė"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nepavyksta atverti pasirinkto F-Spot duomenų bazės failo: Shotwell nepalaiko "
+"šios F-Spot duomenų bazės versijos"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nepavyksta perskaityti pasirinkto F-Spot duomenų bazės failo: klaida "
+"skaitant žymų lentelę"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nepavyksta perskaityti pasirinkto F-Spot duomenų bazės failo: klaida "
+"skaitant nuotraukų lentelę"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell rado %d nuotraukų F-Spot bibliotekoje ir šiuo metu jas importuoja. "
+"Dublikatai bus automatiškai aptikti ir pašalinti.\n"
+"\n"
+"Galite užverti šį dialogą ir pradėti naudoti Shotwell, kol importas vykdomas "
+"fone."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot biblioteka: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Ruošiamasi importui"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Pagrindinės duomenų importo tarnybos"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Autorinės teisės 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pikselių"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pikselių"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pikseliai"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "„%s“ nėra tinkamas OAuth tapatybės patvirtinimo užklausos atsakas"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): nepavyksta paleisti; šio viešintojo negalima "
+"paleisti iš naujo."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Įveskite su savo Tumblr paskyra susietą naudotojo vardą ir slaptažodį."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Naudotojo vardas ir (arba) slaptažodis neteisingas. Bandykite dar kartą"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Netinkamas naudotojo vardas arba slaptažodis"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nepavyko įkelti naudotojo sąsajos: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Prisijungėte prie Tumblr kaip %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Autorinės teisės 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Aplankykite Yandex.Fotki tinklapį"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Šiuo metu nesate prisijungęs prie Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell papildomos viešinimo tarnybos"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "etiketė"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_El. pašto adresas"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "Sla_ptažodis"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Prisijungimo vardas"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Žiniatinkliai:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Nuotraukos _dydis:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Atsijungti"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Skelbti"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Albumai (arba įrašykite naują):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "Prieigos _tipas:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Išjungti _komentarus"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Drausti parsiųsti originalią nuotrauką"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+#| msgid "Publish"
+msgid "Public"
+msgstr "Vieša"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Draugams"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privatus"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Jūs šiuo metu neprisijungę prie „Facebook“.\n"
+"\n"
+"Jei dar neturite „Facebook“ paskyros, galite ją susikurti prisijungimo metu. "
+"Prisijungimo metu Shotwell Connect gali paprašyti jūsų leidimo įkelti ir "
+"skelbti nuotraukas jūsų sklaidos kanale. Toks leidimas yra būtinas norint, "
+"kad Shotwell Connect galėtų veikti."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Jūs šio Shotwell seanso metu jau buvote prisijungę ir atsijungę nuo "
+"„Facebook“.\n"
+"Norėdami ką nors paskelbti savo „Facebook“ sklaidos kanale, užverkite ir "
+"paleiskite Shotwell iš naujo, tada bandykite skelbti dar kartą."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standartinis (720 pikselių)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Didelis (2048 taškai)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Tikrinamas ryšys su „Facebook“..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Kuriamas albumas..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Viešinimui reikalingas failas nepasiekiamas. Negalima viešinti Facebook."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Jūs esate prisijungę prie „Facebook“ kaip %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kur jūs norėtumėte paskelbti parinktas nuotraukas?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "Įkėlimo _dydis:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Tik aš"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Visi"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Šiuo metu nesate prisijungę prie „Flickr“.\n"
+"\n"
+"Spauskite „Prisijungti“, kad prisijungtumėte prie „Flickr“ naudodami "
+"naršyklę. Jūs turėsite suteikti leidimą „Shotwell Connect“ jungtis prie Jūsų "
+"„Flickr“ paskyros."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Jūs šio Shotwell seanso metu jau buvote prisijungę ir atsijungę nuo "
+"„Flickr“.\n"
+"Norėdami ką nors paskelbti savo „Flickr“ sklaidos kanale, užverkite ir "
+"paleiskite Shotwell iš naujo, tada bandykite skelbti dar kartą."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Ruošiamasi prisijungti..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "Viešinimui reikalingas failas nepasiekiamas. Negalima viešinti Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Tikrinama autorizacija..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Esate prisijungę prie „Flickr“ kaip %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Jūsų nemokama „Flickr“ paskyra riboja per mėnesį galimų įkelti duomenų "
+"kiekį.\n"
+"Šį mėnesį jums dar liko %d megabaitų."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Jūsų „Flickr Pro“ paskyra leidžia jums įkelti neribotą duomenų kiekį."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Nuotraukas gali _matyti:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Vaizdo įrašus gali _matyti:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Nuotraukas ir vaizdo įrašus gali _matyti:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Tik draugai ir šeima"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Tik šeimai"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Tik draugams"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pikselių"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pikselių"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Pradinis dydis"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Šiuo metu nesate prisijungę prie „Picasa Web Albums“.\n"
+"\n"
+"Spauskite „Prisijungti“, kad prisijungtumėte prie „Picasa Web Albums“ "
+"naudodami naršyklę. Jūs turėsite suteikti leidimą „Shotwell Connect“ jungtis "
+"prie Jūsų „Picasa Web Albums“ paskyros."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Viešinimui reikalingas failas nepasiekiamas. Negalima viešinti į Picasa."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Esate prisijungę prie „Picasa Web Albums“ kaip %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Vaizdo įrašai pasirodys:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Nuotraukos bus rodomos:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Maža (640 x 480 pikselių)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Vidutinė (1024 x 768 pikselių)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Rekomenduojama (1600 x 1200 pikselių)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pikselių)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Pradinis dydis"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Kuriamas albumas %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Viešinant į Piwigo kilo klaida. Bandykite dar kartą."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Įveskite savo Piwigo nuotraukų bibliotekos URL ir naudotojo vardą bei "
+"slaptažodį, susietus su jūsų Piwigo paskyra tai bibliotekai."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell negali prisijungti prie jūsų Piwigo nuotraukų bibliotekos. "
+"Patikrinkite įvestą URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Netinkamas URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratoriai, šeima, draugai, kontaktai"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratoriai, šeima, draugai"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratoriai, šeima"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratoriai"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Šiuo metu esate neprisijungę prie „Youtube“.\n"
+"\n"
+"Norėdami tęsti, turite būti jau anksčiau susikūrę „Google“ paskyrą ir "
+"sukonfigūravę ją darbui su „Youtube“. Daugumą paskyrų galite sukonfigūruoti "
+"savo naršykle bent kartą prisijungdami prie „Youtube“ svetainės."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Viešinimui reikalingas failas neprieinamas. Negalima viešinti į Youtube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Esate prisijungę prie „Youtube“ kaip %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Vaido įrašai pasirodys „%s“"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Viešas"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Neįtrauktas į sąrašą"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Skelbti jau _esančiame albume:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Sukurti _naują albumą pavadinimu:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Vaizdo įrašus ir naujus nuotraukų albumus galės žiūrėti:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Prieš nusiunčiant pašalinti vietos, kameros ir kitą identifikuojančią "
+"informaciją"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Įveskite patvirtinimo numerį, kuris pasirodyt jums prisijungus prie jūsų "
+"Flickr naršyklėje."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "Autorizacijos _numeris:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Tęsti"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Jau _esančiame albume:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "_Naujame albume pavadinimu:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "_Rodyti albumą viešojoje galerijoje"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Nuotraukos _dydžio šablonas:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "Jūsų Piwigo nuotraukų bibliotekos _URL"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "Naudotojo _vardas"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Atsiminti slaptažodį"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "_Esama kategorija:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Nuotraukas _matys:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Nuotraukos dydis:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "kategorijoje:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Albumo komentaras:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Jei pavadinimas nustatytas, o komentaras nenustatytas, naudoti pavadinimą "
+"kaip komentarą"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Neįkelti žymų"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Atsijungti"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Skelbti"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Pagrindinės viešinimo tarnybos"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "Vaizdo įrašų privatumo _nustatymas:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Uždengimas"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Šachmatai"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Skritulys"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Skrituliai"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Laikrodis"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Sutrupėjimas"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Išnykimas"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slinkimas"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Kvadratai"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Brūkšniai"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Pagrindiniai skaidrių perėjimai"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr ""
+"Autorinės teisės 2010 Maxim Kartashev, Autorinės teisės 2011-2014 Yorba "
+"Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nepavyko sukurti podėlio aplanko %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nepavyko sukurti duomenų aplanko %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Paveikslėliai"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nepavyko sukurti laikinojo aplanko %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nepavyko sukurti duomenų poaplankio %s: %s"
+
+#. restore pin state
+#: ../src/AppWindow.vala:52
+msgid "Pin Toolbar"
+msgstr "Prisegti įrankinę"
+
+#: ../src/AppWindow.vala:53
+msgid "Pin the toolbar open"
+msgstr "Prisegti atvertą įrankinę"
+
+#: ../src/AppWindow.vala:57 ../src/AppWindow.vala:135
+msgid "Leave fullscreen"
+msgstr "Išjungti viso ekrano veikseną"
+
+#: ../src/AppWindow.vala:134
+msgid "Leave _Fullscreen"
+msgstr "Išjungti _viso ekrano veikseną"
+
+#: ../src/AppWindow.vala:496
+msgid "_Quit"
+msgstr "Iš_eiti"
+
+#: ../src/AppWindow.vala:501
+msgid "_About"
+msgstr "_Apie"
+
+#: ../src/AppWindow.vala:506
+msgid "Fulls_creen"
+msgstr "_Visame ekrane"
+
+#: ../src/AppWindow.vala:511
+msgid "_Contents"
+msgstr "_Turinys"
+
+#: ../src/AppWindow.vala:516
+msgid "_Frequently Asked Questions"
+msgstr "_Dažniausiai užduodami klausimai"
+
+#: ../src/AppWindow.vala:521
+msgid "_Report a Problem..."
+msgstr "P_ranešti apie problemą..."
+
+#: ../src/AppWindow.vala:620 ../src/AppWindow.vala:641
+#: ../src/AppWindow.vala:658 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Atšaukti"
+
+#: ../src/AppWindow.vala:668
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Gaunant prieigą prie Shotwell bibliotekos iškilo lemtinga klaida. Shotwell "
+"nebegali tęsti darbo.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:700
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nepavyko parodyti žinyno: %s"
+
+#: ../src/AppWindow.vala:708
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nepavyksta nueiti į klaidų duomenų bazę: %s"
+
+#: ../src/AppWindow.vala:716
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nepavyko parodyti DUK: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Atlikta sėkmingai"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Failo klaida"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nepavyko iškoduoti failo"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Duomenų bazės klaida"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Naudotojas nutraukė importavimą"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ne failas"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Failas jau yra duomenų bazėje"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nepalaikomas failo formatas"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ne paveikslėlio failas"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Disko gedimas"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Diskas pilnas"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Fotoaparato klaida"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Failo rašymo klaida"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Sugadintas paveikslėlio failas"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importuoti nepavyko (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "S_kaidrių rodymas"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Paleisti demonstraciją"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksportuoti nuotraukas ar video"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksportuoti nuotraukas/vaizdo įrašus"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Eksportuoti nuotraukas"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksportuoti nuotraukas"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Pasukama"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Atšaukiamas pasukimas"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Apsukama horizontaliai"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Atšaukiamas horizontalus apsukimas"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Apsukama vertikaliai"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Atšaukiamas vertikalus apsukimas"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Atkuriama"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Atšaukiamas atkūrimas"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Gerinama"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Atšaukiamas gerinimas"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Pritaikomos spalvų transformacijos"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Atšaukiamos spalvų transformacijos"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Kuriamas naujas įvykis"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Šalinamas įvykis"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Nuotraukos perkeliamos į naują įvykį"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Nuotraukos priskiriamos ankstesniam įvykiui"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Suliejama"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Atskiriama"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Dubliuojamos nuotraukos"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Šalinamos besidubliuojančios nuotraukos"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Nepavyko sukurti %d nuotraukos kopijos dėl failo klaidos"
+msgstr[1] "Nepavyko sukurti %d nuotraukų kopijų dėl failo klaidos"
+msgstr[2] "Nepavyko sukurti %d nuotraukų kopijų dėl failo klaidos"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Atstatomas ankstesnis įvertinimas"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Didinamas įvertinimas"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Mažinamas įvertinimas"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Nustatomas RAW kūrėjas"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Atstatomas ankstesnis RAW kūrėjas"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Nustatyti kūrėją"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Pradinės nuotraukos pakoreguoti nepavyko."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Koreguojama data ir laikas"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Atšaukiama datos ir laiko korekcija"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Vienos pradinės nuotraukos pakoreguoti nepavyko."
+msgstr[1] "Šių pradinių nuotraukų pakoreguoti nepavyko."
+msgstr[2] "Šių pradinių nuotraukų pakoreguoti nepavyko."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Laiko koregavimo klaida"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Nepavyko atšaukti laiko korekcijų šios nuotraukos faile."
+msgstr[1] "Nepavyko atšaukti laiko korekcijų šių nuotraukų failuose."
+msgstr[2] "Nepavyko atšaukti laiko korekcijų šių nuotraukų failuose."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Sukurti žymą"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Perkelti žymą „%s“"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Perkelti nuotraukas į šiukšlinę"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Grąžinti nuotraukas iš šiukšlinės"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Perkelti nuotraukas į Shotwell šiukšlinę"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Grąžinti nuotraukas atgal į Shotwell biblioteką"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Perkeliamos nuotraukos į šiukšlinę"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Grąžinamos nuotraukos iš šiukšlinės"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Pažymėti pasirinktas nuotraukas"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Atžymėti pasirinktas nuotraukas"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Žymimos pasirinktos nuotraukos"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Atžymimos pasirinktos nuotraukos"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Pažymėti"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Atžymėti"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nepavyko paleisti Nautilus Send-To: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Siųsti"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Nepavyko eksportuoti fono į %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nepavyko parengti darbalaukio skaidrių peržiūros: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Bus pašalinta žyma „%s“ iš %d nuotraukos. Tęsti?"
+msgstr[1] "Bus pašalinta žyma „%s“ iš %d nuotraukų. Tęsti?"
+msgstr[2] "Bus pašalinta žyma „%s“ iš %d nuotraukų. Tęsti?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Ištrinti"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Tai pašalins įrašytą paiešką „%s“. Tęsti?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Kūrėjo pakeitimas atšauks visus su Shotwell padarytus šių nuotraukų "
+"pakeitimus"
+msgstr[1] ""
+"Kūrėjo pakeitimas atšauks visus su Shotwell padarytus šių nuotraukų "
+"pakeitimus"
+msgstr[2] ""
+"Kūrėjo pakeitimas atšauks visus su Shotwell padarytus šių nuotraukų "
+"pakeitimus"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Keisti kūrėją"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Eksportuoti video"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell negalėjo sukurti failo šios nuotraukos redagavimui, kadangi "
+"neturite teisių rašyti į %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nepavyko eksportuoti šios nuotraukos dėl failo klaidos.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Ar norite tęsti eksportavimą?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nepakeista"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Dabartinis"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formatas:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kokybė:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Ištempimo apribojimas:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pikselių"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Eksportuoti metaduomenis"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Įrašyti detales..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Įrašyti detales"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ir %d daugiau)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importo rezultatų ataskaita"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Bandyta importuoti %d failą"
+msgstr[1] "Bandyta importuoti %d failus"
+msgstr[2] "Bandyta importuoti %d failų"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Iš jų, %d sėkmingai importuotas."
+msgstr[1] "Iš jų, %d sėkmingai importuoti."
+msgstr[2] "Iš jų, %d sėkmingai importuota."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Neimportuoti dublikatai:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "dubliuoja esamą elementą"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Nuotraukos/Vaizdo įrašai, neimportuoti dėl kameros klaidų:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "klaidos pranešimas:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Failai neimportuoti, nes nebuvo atpažinti kaip nuotraukos ar vaizdo įrašai:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Neimportuotos nuotraukos/vaizdo įrašai, nes nėra Shotwell suprantamo formato:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Neimportuotos nuotraukos/vaizdo įrašai, nes Shotwell negalėjo jų nukopijuoti "
+"į savo biblioteką:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"nepavyko nukopijuoti %s\n"
+"\tį %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Neimportuotos nuotraukos/vaizdo įrašai, nes failai yra sugadinti:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Neimportuotos nuotraukos/vaizdo įrašai dėl kitų priežasčių:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d vienoda nuotrauka nebuvo importuota:\n"
+msgstr[1] "%d vienodos nuotraukos nebuvo importuotos:\n"
+msgstr[2] "%d vienodų nuotraukų nebuvo importuotos:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d vienodų vaizdo įrašų nebuvo importuoti:\n"
+msgstr[1] "%d vienodas vaizdo įrašas nebuvo importuotas:\n"
+msgstr[2] "%d vienodi vaizdo įrašai nebuvo importuoti:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d vienodų nuotraukų ar video nebuvo importuota:\n"
+msgstr[1] "%d vienoda nuotrauka ar video nebuvo importuota:\n"
+msgstr[2] "%d vienodos nuotraukos ar video nebuvo importuotos:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d nuotraukos nepavyko importuoti dėl failo ar įrangos klaidos:\n"
+msgstr[1] "%d nuotraukų nepavyko importuoti dėl failų ar įrangos klaidų:\n"
+msgstr[2] "%d nuotraukų nepavyko importuoti dėl failų ar įrangos klaidų:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d vaizdo įrašų nepavyko importuoti dėl failo ar įrangos klaidos:\n"
+msgstr[1] "%d vaizdo įrašo nepavyko importuoti dėl failo ar įrangos klaidos:\n"
+msgstr[2] "%d vaizdo įrašų nepavyko importuoti dėl failo ar įrangos klaidos:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d nuotraukų ar video nepavyko importuoti dėl failų ar įrangos klaidų:\n"
+msgstr[1] ""
+"%d nuotraukos ar video nepavyko importuoti dėl failo ar įrangos klaidos:\n"
+msgstr[2] ""
+"%d nuotraukų ar video nepavyko importuoti dėl failų ar įrangos klaidų:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d failo nepavyko importuoti dėl aparatinės įrangos klaidos:\n"
+msgstr[1] "%d failų nepavyko importuoti dėl aparatinės įrangos klaidos:\n"
+msgstr[2] "%d failų nepavyko importuoti dėl aparatinės įrangos klaidos:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d failo nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[1] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[2] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d failo nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[1] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[2] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d failo nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[1] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[2] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d failo nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[1] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+msgstr[2] ""
+"%d failų nepavyko importuoti, nes negalima rašyti į nuotraukų aplanką:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d nuotraukos nepavyko importuoti:\n"
+msgstr[1] "%d nuotraukų nepavyko importuoti dėl fotoaparato klaidos:\n"
+msgstr[2] "%d nuotraukų nepavyko importuoti dėl fotoaparato klaidos:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d vaizdo įrašų nepavyko importuoti dėl fotoaparato klaidos:\n"
+msgstr[1] "%d vaizdo įrašo nepavyko importuoti dėl fotoaparato klaidos:\n"
+msgstr[2] "%d vaizdo įrašų nepavyko importuoti dėl fotoaparato klaidos:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d nuotraukų ar video nepavyko importuoti dėl fotoaparato klaidos:\n"
+msgstr[1] ""
+"%d nuotraukos ar video nepavyko importuoti dėl fotoaparato klaidos:\n"
+msgstr[2] ""
+"%d nuotraukų ar video nepavyko importuoti dėl fotoaparato klaidos:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d failo nepavyko importuoti dėl kameros klaidos:\n"
+msgstr[1] "%d failų nepavyko importuoti dėl kameros klaidos:\n"
+msgstr[2] "%d failų nepavyko importuoti dėl kameros klaidos:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d nuotraukos nepavyko importuoti, nes ji buvo sugadinta:\n"
+msgstr[1] "%d nuotraukų nepavyko importuoti, nes jos buvo sugadintos:\n"
+msgstr[2] "%d nuotraukų nepavyko importuoti, nes jos buvo sugadintos:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d vaizdo įrašo nepavyko importuoti, nes jis buvo sugadintas:\n"
+msgstr[1] "%d vaizdo įrašų nepavyko importuoti, nes jie buvo sugadinti:\n"
+msgstr[2] "%d vaizdo įrašų nepavyko importuoti, nes jie buvo sugadinti:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d failo nepavyko importuoti, nes jis buvo sugadintas:\n"
+msgstr[1] "%d failų nepavyko importuoti, nes jie buvo sugadinti:\n"
+msgstr[2] "%d failų nepavyko importuoti, nes jie buvo sugadinti:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d failo nepavyko importuoti, nes jis buvo sugadintas:\n"
+msgstr[1] "%d failų nepavyko importuoti, nes jie buvo sugadinti:\n"
+msgstr[2] "%d failų nepavyko importuoti, nes jie buvo sugadinti:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d nepalaikoma nuotrauka buvo praleista:\n"
+msgstr[1] "%d nepalaikomos nuotraukos buvo praleistos:\n"
+msgstr[2] "%d nepalaikomų nuotraukų buvo praleista:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d ne paveikslėlio failas buvo praleistas.\n"
+msgstr[1] "%d ne paveikslėlių failai buvo praleisti.\n"
+msgstr[2] "%d ne paveikslėlių failų buvo praleista.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d nuotrauka praleista naudotojui atšaukus:\n"
+msgstr[1] "%d nuotraukos praleistos naudotojui atšaukus:\n"
+msgstr[2] "%d nuotraukų praleista naudotojui atšaukus:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d vaizdo įrašų praleista naudotojui atšaukus:\n"
+msgstr[1] "%d vaizdo įrašas praleistas naudotojui atšaukus:\n"
+msgstr[2] "%d vaizdo įrašai praleisti naudotojui atšaukus:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d nuotraukų ar video praleista naudotojui atšaukus:\n"
+msgstr[1] "%d nuotrauka ar video praleista naudotojui atšaukus:\n"
+msgstr[2] "%d nuotraukos ar video praleistos naudotojui atšaukus:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d failas praleistas, nes naudotojas atsisakė:\n"
+msgstr[1] "%d failai praleisti, nes naudotojas atsisakė:\n"
+msgstr[2] "%d failų praleista, nes naudotojas atsisakė:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d nuotrauka sėkmingai importuota.\n"
+msgstr[1] "%d nuotraukos sėkmingai importuotos.\n"
+msgstr[2] "%d nuotraukų sėkmingai importuota.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d vaizdo įrašų sėkmingai importuota.\n"
+msgstr[1] "%d vaizdo įrašas sėkmingai importuotas.\n"
+msgstr[2] "%d vaizdo įrašai sėkmingai importuoti.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d nuotraukų ar video sėkmingai importuota.\n"
+msgstr[1] "%d nuotrauka ar video sėkmingai importuota.\n"
+msgstr[2] "%d nuotraukos ar video sėkmingai importuotos.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Neimportuota jokių nuotraukų ar video įrašų\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importavimas baigtas"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekundžių"
+msgstr[1] "%d sekundė"
+msgstr[2] "%d sekundės"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minučių"
+msgstr[1] "%d minutė"
+msgstr[2] "%d minutės"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d valandų"
+msgstr[1] "%d valanda"
+msgstr[2] "%d valandos"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 diena"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Pervadinti įvykį"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Pavadinimas:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Taisyti antraštę"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Pavadinimas:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Keisit įvykio komentarą"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Keisti nuotraukos/vaizdo įrašo komentarą"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Komentaras:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Perkelti failą į šiukšlinę"
+msgstr[1] "_Perkelti failus į šiukšlinę"
+msgstr[2] "_Perkelti failus į šiukšlinę"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Tik pašalinti"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Palikti"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Atstatyti išorinį redagavimą?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Atstatyti išorinius redagavimus?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "Bus prarasti visi %d išorinio failo pakeitimai. Tęsti?"
+msgstr[1] "Bus prarasti visi %d išorinių failų pakeitimai. Tęsti?"
+msgstr[2] "Bus prarasti visi %d išorinių failų pakeitimai. Tęsti?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Grąžinti išorinius pakeitimus"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Atstatyti išorinį redagavimą?"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Bus pašalinta %d nuotrauka iš bibliotekos. Tęsti?"
+msgstr[1] "Bus pašalintos %d nuotraukos iš bibliotekos. Tęsti?"
+msgstr[2] "Bus pašalinta %d nuotraukų iš bibliotekos. Tęsti?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Pašalinti"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Pašalinti nuotraukas iš bibliotekos"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Pašalinti nuotraukas iš bibliotekos"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 val."
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Vienodai pa_stumti nuotraukas/vaizdo įrašus"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Nustatyti _visas nuotraukas/vaizdo įrašus į šį laiką"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Keisti originalų nuotraukos failą"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Keisti originalius nuotraukų failus"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Pakeisti originalius failus"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Keisti originalius failą"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Pradinis: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ekspozicijos laikas bus paslinktas pirmyn per\n"
+"%d %s, %d %s, %d %s ir %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ekspozicijos laikas bus paslinktas atgal per\n"
+"%d %s, %d %s, %d %s ir %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dieną"
+msgstr[1] "dienas"
+msgstr[2] "dienų"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "valandą"
+msgstr[1] "valandas"
+msgstr[2] "valandų"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutę"
+msgstr[1] "minutes"
+msgstr[2] "minučių"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekundę"
+msgstr[1] "sekundes"
+msgstr[2] "sekundžių"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Ir %d kita."
+msgstr[1] ""
+"\n"
+"\n"
+"Ir %d kitos."
+msgstr[2] ""
+"\n"
+"\n"
+"Ir %d kitų."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Žymos (atskirtos kableliais):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Sveiki!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Sveikiname paleidus Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Pradėkite importuodami nuotraukas ar vaizdo įrašus bet kuriuo šių būdų:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Pasirinkite <span weight=\"bold\">Failas %s Importavimas iš aplanko</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Vilkite ir numeskite nuotraukas ant Shotwell lango"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Prijunkite prie kompiuterio fotoaparatą ir importuokite"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importuoti nuotraukas iš aplanko %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Nuotraukų taip pat galite importuoti šiais būdais:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Daugiau neberodyti šio pranešimo"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importuoti nuotraukas iš %s bibliotekos"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Žinynas)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Metai%sMėnuo%sDiena"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Metai%sMėnuo"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Metai%sMėnuo-Diena"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Metai-Mėnuo-Diena"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Pasirinktinis"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Netinkamas šablonas"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell gali nukopijuoti nuotraukas į jūsų nuotraukų bibliotekos aplanką "
+"arba gali jas „importuoti“ nekopijuojant"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Kopijuoti nuotraukas"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importuoti nekopijuojant"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importuoti į biblioteką"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Pašalinti iš bibliotekos"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Šalinamos nuotraukos iš bibliotekos"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Šalinamos nuotraukos iš bibliotekos"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalinta %d nuotrauka ar vaizdo įrašas. "
+"Ar norite, kad šis failas taip pat būtų perkeltas į jūsų darbo aplinkos "
+"šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[1] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalintos %d nuotraukos ar vaizdo "
+"įrašai. Ar norite, kad šie failai taip pat būtų perkelti į jūsų darbo "
+"aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[2] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalinta %d nuotraukų ar vaizdo įrašų. "
+"Ar norite, kad šie failai taip pat būtų perkelti į jūsų darbo aplinkos "
+"šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalintas %d vaizdo įrašas. Ar norite, "
+"kad šis failas taip pat būtų perkeltas į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[1] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalinti %d vaizdo įrašai. Ar norite, "
+"kad šie failai taip pat būtų perkelti į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[2] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalinta %d vaizdo įrašų. Ar norite, kad "
+"šie failai taip pat būtų perkelti į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Iš jūsų Shotwell bibliotekos bus pašalinta %d nuotrauka. Ar norite, kad šis "
+"failas taip pat būtų perkeltas į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[1] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalintos %d nuotraukos. Ar norite, kad "
+"šie failai taip pat būtų perkelti į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+msgstr[2] ""
+"Iš jūsų „Shotwell“ bibliotekos bus pašalinta %d nuotraukų. Ar norite, kad "
+"šie failai taip pat būtų perkelti į jūsų darbo aplinkos šiukšlinę?\n"
+"\n"
+"Šio veiksmo nebegalėsite atšaukti."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d nuotrauka ar vaizdo įrašas negali būti perkeltas į darbo aplinkos "
+"šiukšlinę. Ištrinti šį failą?"
+msgstr[1] ""
+"%d nuotraukos ar vaizdo įrašai negali būti perkelti į darbo aplinkos "
+"šiukšlinę. Ištrinti šiuos failus?"
+msgstr[2] ""
+"%d nuotraukų ar vaizdo įrašų negali būti perkelta į darbo aplinkos "
+"šiukšlinę. Ištrinti šiuos failus?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d nuotrauka ar vaizdo įrašas negali būti ištrintas."
+msgstr[1] "%d nuotraukos ar vaizdo įrašai negali būti ištrinti."
+msgstr[2] "%d nuotraukų ar vaizdo įrašų negali būti ištrinti."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Plotis arba aukštis"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Plotis"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Aukštis"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Nepavyko stebėti %s: Ne aplankas (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:753
+#, c-format
+msgid "Event %s"
+msgstr "Įvykis %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nepavyko sukurti laikinojo failo, skirto %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Eksportuojama"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Failas %s jau yra. Pakeisti?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "P_raleisti"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Pakeisti"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Pakeisti _visus"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Eksportuoti"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nepavyksta apdoroti stebėjimo atnaujinimų: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Koreguoti miniatiūrų dydį"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "_Didinti"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Padidinti miniatiūras"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "_Mažinti"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Sumažinti miniatiūras"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Rikiuoti _nuotraukas"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Rodyti video"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Rodyti pasirinktus vaizdo įrašus su įprasta filmų peržiūros programa"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Kūrėjas"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Fotoaparatas"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Antraštės"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Rodyti kiekvienos nuotraukos antraštę (pavadinimą)"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Komentarai"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Rodyti kiekvienos nuotraukos komentarą"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "_Gairės"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Rodyti kiekvienos nuotraukos žymas"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Pagal _antraštę"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Rikiuoti nuotraukas pagal pavadinimą"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Pagal ekspozicijos _datą"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Rikiuoti nuotraukas pagal ekspozicijos datą"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Pagal į_vertinimą"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Rikiuoti nuotraukas pagal įvertinimą"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Didėjančiai"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Rikiuoti nuotraukas didėjimo tvarka"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "_Mažėjančiai"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Rikiuoti nuotraukas mažėjimo tvarka"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"„Shotwell“ negali parodyti pasirinkto vaizdo įrašo:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nėra nuotraukų/vaizdo įrašų"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nerasta nuotraukų/vaizdo įrašų"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Nuotraukų negalima eksportuoti į šį aplanką."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "pakeista"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Ankstesnė nuotrauka"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Kita nuotrauka"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Nėra nuotraukos šaltinio failo: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Rodymas"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Į_rankiai"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Ankstesnė nuotrauka"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Ankstesnė nuotrauka"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Kita nuotrauka"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Kita nuotrauka"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Padidinti nuotraukos išdidinimą"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Sumažinti nuotraukos išdidinimą"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Sutalpinti _puslapyje"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Padidinti nuotrauką, kad tilptų ekrane"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "_Tikrasis mastelis"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Rodyti tikrąjį nuotraukos dydį"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "_Dvigubas dydis"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Rodyti dvigubai didesnę nuotrauką"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nepavyko eksportuoti %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Užpildyti visą puslapį"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 paveikslėliai puslapyje"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 paveikslėliai puslapyje"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 paveikslėliai puslapyje"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 paveikslėliai puslapyje"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 paveikslėlių puslapyje"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 paveikslėliai puslapyje"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "col."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Piniginė (2 x 3 col.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Užrašinė (3 x 5 col.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 col."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 col."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 col."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 col."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 col."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Piniginė (dešimtainė) (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Atvirukas (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Paveikslėlio parametrai"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Spausdinama..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nepavyko išspausdinti nuotraukos:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Šiandien"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Vakar"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementai:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d įvykis"
+msgstr[1] "%d įvykiai"
+msgstr[2] "%d įvykių"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d nuotrauka"
+msgstr[1] "%d nuotraukos"
+msgstr[2] "%d nuotraukų"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vaizdo įrašas"
+msgstr[1] "%d vaizdo įrašai"
+msgstr[2] "%d vaizdo įrašų"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Laikas:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Nuo:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Iki:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Dydis:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Trukmė:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekundžių"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Kūrėjas:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Ekspozicija:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Vieta:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Failo dydis:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Dabartinis kūrimas:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Originalus matmenys:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Fotoaparato gamintojas:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Fotoaparato modelis:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blykstė:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Židinio nuotolis:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Ekspozicijos data:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Ekspozicijos laikas:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Ekspozicijos paklaida:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS platuma:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS ilguma:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Menininkas:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Autoriaus teisės:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Programinė įranga:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Papildoma informacija"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Nuotraukų tvarkymo programa"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Paveikslėlių peržiūra"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Pasukti _dešinėn"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Pasukti"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Pasukti dešinėn"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Pasukti nuotraukas dešinėn (kairėn pasuksite spausdami Ctrl klavišą)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Pasukti _kairėn"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Pasukti kairėn"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Pasukti nuotraukas kairėn"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Apsukti hori_zontaliai"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Apsukti horizontaliai"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Apsukti verti_kaliai"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Apsukti vertikaliai"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Pa_gerinti"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Pagerinti"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatiškai pagerinti nuotraukos vaizdą"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Kopijuoti spalvų korekcijas"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Kopijuoti spalvų korekcijas"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Kopijuoti nuotraukai pritaikytas spalvų korekcijas"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Į_dėti spalvų korekcijas"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Įdėti spalvų korekcijas"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Pritaikyti nukopijuotas spalvų korekcijas pažymėtoms nuotraukoms"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Apkirpti"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Apkirpti"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Apkirpti nuotraukos dydį"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Iš_tiesinti"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Ištiesinti"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Ištiesinti nuotrauką"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Raudonų akių efektas"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Raudonų akių efektas"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Sumažinti arba panaikinti raudonų akių efektą nuotraukoje"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Koreguoti"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Koreguoti"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Koreguoti nuotraukos spalvą ir toną"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "A_tstatyti originalią"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Atstatyti originalią"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Panaikinti išorinius _pakeitimus"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Atstatyti pagrindinę nuotrauką"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Nustatyti kaip _darbastalio foną"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Padaryti pasirinktą paveikslėlį naujuoju darbastalio paveikslėliu"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Sukurti _darbalaukio fonų demonstraciją..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Atšaukti"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Atšaukti"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "Paka_rtoti"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Pakartoti"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Per_vadinti įvykį..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Padaryti _pagrindine įvykio nuotrauka"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Padaryti pagrindine įvykio nuotrauka"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Naujas įvykis"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Naujas įvykis"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Perkelti nuotraukas"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Perkelti nuotraukas į įvykį"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Sujungti įvykius"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Sujungti"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Sujungti įvykius į vieną"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Į_vertinti"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Pridėti vertinimą"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Pakeisti nuotraukos įvertinimą"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Padidinti"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Padidinti įvertinimą"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Sumažinti"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Sumažinti įvertinimą"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Neįvertinta"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Neįvertinta"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Pašalinti įvertinimą"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Šalinamas įvertinimas"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Pašalinti visus įvertinimus"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Atmesta"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Atmesta"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Įvertinti kaip atmestą"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Įvertinama kaip atmesta"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Įvertinti kaip atmestą"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Tik _atmestos"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Tik atmestos"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Rodyti tik atmestas nuotraukas"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Visos + _atmestos"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Rodyti visas nuotraukas, įskaitant atmestas"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Visos nuotraukos"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Rodyti visas nuotraukas"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Įve_rtinimai"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Rodyti kiekvienos nuotraukos įvertinimą"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtruoti nuotraukas"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtruoti nuotraukas"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Atsižvelgiant į filtrą, riboti rodytinų nuotraukų skaičių"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Sukurti kopiją"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Sukurti kopiją"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Sukurti nuotraukos kopiją"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Eksportuoti..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "S_pausdinti..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "S_kelbti..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Skelbti įvairiose svetainėse"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Keisti _pavadinimą..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Keisti _komentarą..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Keisti komentarą"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Keisti įvykio _komentarą..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Taisyti datą ir laiką..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Taisyti datą ir laiką"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Pridėti ž_ymų..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Pri_dėti žymų..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Pridėti žymų"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Nustatymai"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Atverti išoriniu _redaktoriumi"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Atverti RA_W rengyklėje"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Siųsti į..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Kam _siųsti..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Ieškoti..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Ieškoti"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Rasti paveikslėlį rašant tekstą, kuris yra jo pavadinime ar žymose"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Žymėti"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "At_žymėti"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nepavyko paleisti rengyklės: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Pridėti žymą „%s“"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Pridėti žymas „%s“ ir „%s“"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Šalinti žymą „%s“"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Šalinti žymą „%s“"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Šalinti žymą"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Nauja"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Per_vadinti žymą „%s“..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Pervadinti žymą „%s“ į „%s“"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Pe_rvadinti..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Keisti žymas..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Keisti žymą"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Pridėti nuotraukoms žymą „%s“"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Žymėti nuotraukas kaip „%s“"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Žymėti nuotrauką kaip „%s“"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Žymėti nuotraukas kaip „%s“"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Pašalinti žymą „%s“ iš _nuotraukų"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Pašalinti žymą „%s“ iš _nuotraukų"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Pašalinti žymą „%s“ iš nuotraukos"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Pašalinti žymą „%s“ iš nuotraukų"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Nepavyko pervadinti žymos į „%s“, kadangi tokia žyma jau yra."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Nepavyko pervadinti paieškos į „%s“, nes tokia paieška jau yra."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Įrašyta paieška"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Ištrinti paiešką"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "K_eisti..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Per_vadinti..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Pervadinti paiešką „%s“ į „%s“"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Ištrinti paiešką „%s“"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Įvertinti %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Įvertinti %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Įvertinama %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Rodyti %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Rodyti tik nuotraukas, įvertintas %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ar geresnes"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Rodyti %s ar geresnes"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Rodyti nuotraukas, įvertintas %s ar geriau"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Ištrinti pasirinktas nuotraukas iš šiukšlinės"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Pašalinti pasirinktas nuotraukas iš bibliotekos"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Grąžinti"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Perkelti pasirinktas nuotraukas atgal į biblioteką"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Rodyti failų _naršyklėje"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Atverti pasirinktos nuotraukos aplanką failų naršyklėje"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nepavyko atverti failų naršyklėje: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Pašalinti iš bibliotekos"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Perkelti į šiukšlinę"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "P_asirinkti visas"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Pasirinkti visus elementus"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%Y %b %d, %a"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Demonstracija"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Pažymėtas"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Nuotraukos"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vaizdo įrašai"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW nuotraukos"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW nuotraukos"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Klaida įkeliant naudotojo sąsajos failą %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipas"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Reitingas"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Parametrai"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Atgal"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Pereiti prie ankstesnės nuotraukos"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pristabdyti"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pristabdyti skaidrių peržiūrą"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Kita"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Pereiti prie kitos nuotraukos"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Keisti skaidrių peržiūros parametrus"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Trūksta visų nuotraukų šaltinių failų."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Rodyti"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Toliau rodyti skaidrių peržiūrą"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "nepavadinta"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:486
+msgid "Export Videos"
+msgstr "Eksportuoti vaizdo įrašus"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fotoaparatai"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Nepavyko atjungti fotoaparato. Pabandykite jį atjungti failų naršyklėje."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Slėpti jau importuotas nuotraukas"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Rodyti tik neimportuotas nuotraukas"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Pradedamas importas, palaukite..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importuoti _pasirinktas"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importuoti pasirinktas nuotraukas į jūsų biblioteką"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importuoti _viską"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importuoti visas nuotraukas į jūsų biblioteką"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Norint suteikti Shotwell prieigą prie fotoaparato, reikia atjungti "
+"fotoaparatą nuo failų sistemos. Tęsti?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Atjungti"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Atjunkite fotoaparatą."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kita programa užblokavus fotoaparatą. Shotwell gali gauti prieigą prie "
+"fotoaparato tik kai jis neužblokuotas. Užverkite visas kitas programas, "
+"naudojančias fotoaparatą, ir bandykite dar kartą."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Užverkite visas kitas fotoaparatą naudojančias programas."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nepavyko iš fotoaparato gauti peržiūrų:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Atjungiama..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Gaunama nuotraukų informacija"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Gaunama %s peržiūra"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Nepavyko užrakinti fotoaparato: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Ištrinti šią %d nuotrauką iš fotoaparato?"
+msgstr[1] "Ištrinti šias %d nuotraukas iš fotoaparato?"
+msgstr[2] "Ištrinti šias %d nuotraukų iš fotoaparato?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Pašalinti šiuos %d aizdo įrašus iš kameros?"
+msgstr[1] "Pašalinti šiuos %d vaizdo įrašų iš kameros?"
+msgstr[2] "Pašalinti šiuos %d vaizdo įrašų iš kameros?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Pašalinti šias %d nuotraukas ar vaizdo įrašus iš fotoaparato?"
+msgstr[1] "Pašalinti šias %d nuotraukų ar vaizdo įrašų iš fotoaparato?"
+msgstr[2] "Pašalinti šias %d nuotraukų ar vaizdo įrašų iš fotoaparato?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Ištrinti šį %d failą iš kameros?"
+msgstr[1] "Ištrinti šiuos %d failus iš kameros?"
+msgstr[2] "Ištrinti šiuos %d failų iš kameros?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Nuotraukos ir video šalinamos iš fotoaparato (kameros)"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Nepavyko pašalinti %d nuotraukos ar vaizdo įrašo iš fotoaparato dėl klaidų."
+msgstr[1] ""
+"Nepavyko pašalinti %d nuotraukų ar vaizdo įrašų iš fotoaparato dėl klaidų."
+msgstr[2] ""
+"Nepavyko pašalinti %d nuotraukų ar vaizdo įrašų iš fotoaparato dėl klaidų."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Duomenų importai"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Duomenų bazė %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importavimo iš %s negalima tęsti, nes kilo klaida:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Importavimui iš kitos tarnybos, ją pasirinkite iš meniu."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Neturite jokių įjungtų duomenų importo įskiepių.\n"
+"\n"
+"Duomenų importavimo funkcionalumui naudoti reikia turėti įjungtą bent vieną "
+"importo įskiepį. Įskiepius galima įjungti nustatymų dialoge."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Duomenų bazės failas:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importuoti"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importuoti iš programos"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importuoti _iš:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Užverti"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nepavyko atverti/sukurti nuotraukų duomenų bazės %s: klaidos kodas %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nepavyko rašyti į nuotraukų duomenų bazės failą:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Klaida pasiekiant duomenų bazės failą:\n"
+" %s\n"
+"\n"
+"Klaida buvo: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Failas"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "Į_rašyti"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Įrašyti nuotrauką"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Įrašyti _kaip..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Įrašyti nuotrauką kitu vardu"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Spausdinti nuotrauką prie jūsų kompiuterio prijungtu spausdintuvu"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Taisa"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Nuotrauka"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Pagalba"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s neegzistuoja."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nėra failas."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s nepalaiko %s failo formato."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "Į_rašyti kopiją"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Panaikinti %s pakeitimus?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Užverti _neįrašant"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Klaida rašant į %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Įrašyti kaip"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Grįžti prie dabartinių nuotraukos matmenų"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Nurodyti šios nuotraukos apkirptiną sritį"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Pasukti apkirpimo stačiakampį keičiant orientaciją tarp stačios ir gulsčios"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Nesuvaržytas"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Kvadratas"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Ekranas"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "–"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD vaizdo įrašas (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD vaizdo įrašas (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Laiškas (8.5 x 11 colių)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Įrėminama (11 x 17 colių)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Užverti raudonų akių pašalinimo priemonę"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Pašalinti raudonų akių efekto poveikį pasirinktoje srityje"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Atstatyti"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Grynis:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Atspalvis:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Temperatūra:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Šešėliai:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Paryškinimai:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Atstatyti spalvas"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Atstatyti visas spalvų korekcijas į pradines"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Temperatūra"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Atspalvis"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Grynis"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Ekspozicija"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Šešėliai"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Paryškinimai"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Kontrasto išplėtimas"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Kampas:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d nuotrauka ar video"
+msgstr[1] "%d nuotraukos ar video"
+msgstr[2] "%d nuotraukų ar video"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Jokio įvykio"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Rodyti kiekvieno įvykio komentarą"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Nėra įvykių"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nerasta įvykių"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Įvykiai"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Be datos"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Aplankai"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Biblioteka"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importuojama..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Sustabdyti importavimą"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Sustabdyti nuotraukų importavimą"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Ruošiamasi importuoti..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importuota %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Paskutinis importavimas"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importuoti iš aplanko..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importuoti nuotraukas iš disko į biblioteką"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importuoti iš _programos..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Rikiuoti į_vykius"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Išvalyti ši_ukšlinę"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Ištrinti visas šiukšlinėje esančias nuotraukas "
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Rodyti šios nuotraukos į_vykį"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Rasti"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Rasti nuotraukas ir vaizdo įrašus pagal paieškos kriterijų"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Nauja įrašyta paieška..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Nuotraukos"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Į_vykiai"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Pagrindinė informacija"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Rodyti pagrindinę pažymėtų elementų informaciją"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Papildoma informacija"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Rodyti papildomą parinktų elementų informaciją"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Paieškos juosta"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Rodyti paieškos juostą"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Šoninį _juosta"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Rodyti šoninę juostą"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importuoti iš aplanko"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Išvalyti šiukšlinę"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Išvaloma šiukšlinė..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell yra sukonfigūruota importuoti nuotraukas į namų aplanką.\n"
+"Rekomenduojame pakeisti šį nustatymą <span weight=\"bold\">Keisti %s "
+"nustatymus</span>.\n"
+"Ar norite tęsti nuotraukų importą?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Bibliotekos vieta"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Nuotraukų negalima importuoti iš šio aplanko."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Atnaujinama biblioteka..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Ruošiamasi automatiškai importuoti nuotraukas..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automatiškai impotuojamos nuotraukos..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Metainformacija rašoma į failus..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Trūkstami failai"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Trinama..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Šiukšlinė"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Šiukšlinė yra tuščia"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Ištrinti"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Trinamos nuotraukos"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Jūsų nuotraukų biblioteka nesuderinama su šia „Shotwell“ versija. Atrodo, "
+"kad ji buvo sukurta su Shotwell %s (schema %d). Ši versija yra %s (schema "
+"%d). Prašom naudoti naujausią „Shotwell“ versiją."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"„Shotwell“ nepavyko naujovinti jūsų nuotraukų bibliotekos iš versijos %s "
+"(schema %d) į %s (schema %d). Daugiau informacijos ieškokite „Shotwell Wiki“ "
+"adresu %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Jūsų nuotraukų biblioteka nesuderinama su šia „Shotwell“ versija. Atrodo, "
+"kad ji buvo sukurta su Shotwell %s (schema %d). Ši versija yra %s (schema "
+"%d). Jums teks išvalyti savo biblioteką ištrinant %s ir importuoti "
+"nuotraukas iš naujo."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Nežinoma klaida bandant patikrinti „Shotwell“ duomenų bazę: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Įkeliama Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Kelias iki Shotwell privačių duomenų"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KATALOGAS"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Nestebėti bibliotekos aplanko pakeitimų"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Nerodyti paleidimo eigos"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Rodyti programos versiją"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FAILAS]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Norėdami pamatyti visą galimų komandų eilutės parinkčių sąrašą, paleiskite "
+"„%s --help“.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Žemas (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Vidutinė (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Didelė (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Didžiausia (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Paskelbiama"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Ruošiamasi nusiuntimui"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Nusiunčiama %d iš %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Paskelbiama, kad %s negali tęsti dėl klaidos:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Pabandykite skelbti naudodami kitą tarnybą, pasirinkite aukščiau esančiame "
+"meniu."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Pasirinktos nuotraukos bei vaizdo įrašai buvo sėkmingai paskelbtos."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Pasirinkti vaizdo įrašai buvo sėkmingai paskelbti."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Pasirinktos nuotraukos buvo sėkmingai paskelbtos."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Pasirinktas vaizdo įrašas sėkmingai paskelbtas."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Pasirinkta nuotrauka buvo sėkmingai paskelbta."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Gaunama paskyros informacija..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Jungiamasi..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Skelbti nuotraukas"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Skelb_ti nuotraukas:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Paskelbti vaizdo įrašus"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publikuoti video į"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Paskelbti nuotraukas ar vaizdo įrašus"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Skelbti nuotraukas ar vaizdo įrašus _į"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nepavyko paskelbti"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell negali paskelbti pasirinktų elementų, nes neturite įjungę tinkamų "
+"paskelbimo įskiepių. Pataisymui, pasirinkite <b>Keisti %s nustatymus</b> ir "
+"įjunkite vieną ar daugiau viešinimo įskiepių kortelėje <b>įskiepiai</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Įrašytos paieškos"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "turi"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "tiksliai"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "prasideda"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "baigiasi"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "neturi"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nenustatyta"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "–"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nėra"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "bet kokia nuotrauka"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "tiesioginė nuotrauka"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "vaizdo įrašas"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "turi"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "neturi"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "pakeitimai"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "vidiniai pakeitimai"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "išoriniai pakeitimai"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "pažymėta"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "nepažymėta"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ir aukštesnė"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "tik"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ir žemesnė"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "yra po"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "yra prieš"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "yra tarp"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ir"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "bet kuri"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "visos"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "jokios"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Bet koks tekstas"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Pavadinimas"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Žyma"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Komentaras"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Įvykio pavadinimas"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Failo pavadinimas"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Laikmenos tipas"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Žymėjimo būsena"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Nuotraukos būsena"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nauja _žyma..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Skaidrių perėjimai"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nėra)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nėra"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Atsitiktinis"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Žymos"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Nustatyti kaip darbastalio fonų demonstraciją"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Generuoti darbastalio fonų demonstraciją"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Rodyti kiekvieną nuotrauką"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "laiko tarpą"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Kiek ilgai kiekviena nuotrauka yra rodoma darbalaukio fone"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Ieškoti"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "Pa_vadinimo paieška:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Atitinka"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "vieną iš:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Atspausdinto paveikslėlio dydis</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Naudoti _standartinį dydį:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Naudoti _pasirinktinį dydį:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Išlaikyti nuotraukos proporcijas"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Automatinis dydis:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Pavadinimai</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Atspausdinti paveikslėlio _pavadinimą"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pikselių raiška</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Išvesti nuotrauką:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "pikselių colyje"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell nustatymai"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "baltas"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "juodas"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Tikrinti (ieškoti) naujų failų bibliotekos aplanke"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metaduomenys"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Įrašyti žymas, gaires, antraštes, komentarus ir kitą informaciją į nuotraukų "
+"failus"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Rodymas"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importuoti nuotraukas į:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Fonas:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importavimas"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "_Aplankų struktūra:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "Ša_blonas:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Pavyzdys:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "P_ervadinti importuotus failus mažosiomis raidėmis"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW kūrėjas"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Numatyta:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Iš_orinis nuotraukų redaktorius:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Išorinė _RAW rengyklė:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Išoriniai redagavimo įrankiai"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Įskiepiai"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Delsa:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Kei_timo efektas:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Keitimo d_elsa:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Rodyti _pavadinimą"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "sek."
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Prisijungti"
diff --git a/po/lv.po b/po/lv.po
new file mode 100644
index 0000000..9273dad
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,4645 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2011
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2012
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
+"Language-Team: Latvian (http://www.transifex.com/projects/p/shotwell/"
+"language/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Notikums %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameras"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Neizdevās nomonēt kameru. Mēģiniet nomontēt kameru no datņu pārvaldnieka."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Slēpt jau importētās fotogrāfijas"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Rādīt tikai fotogrāfijas, kas nav importētas"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Sāk importēšanu. Lūdzu, uzgaidiet..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Nosaukumi"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Rādīt nosaukumu katrai fotogrāfijai"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importēt izvēlētā_s"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importēt izvēlētās fotogrāfijās savā bibliotēkā"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importēt vis_as"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importēt visas fotogrāfijas savā bibliotēkā"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell ir jānomontē kamera no datņu sistēmas, lai tai piekļūtu. Turpināt?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "No_montēt"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Lūdzu, nomontējiet kameru."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kameru ir noslēgusi cita lietotne. Shotwell var piekļūt kamerai tikai tad, "
+"kad tā nav noslēgta. Lūdzu, aizveriet jebkuru citu lietotni, kas izmanto "
+"kameru, un mēģiniet vēlreiz."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Lūdzu, aizveriet jebkuru citu lietotni, kas izmanto kameru."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Neizdevās iegūt priekšskatījumus no kameras:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Nomontē..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Iegūst informāciju par fotogrāfiju"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Iegūst %s priekšskatījumu"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Neizdevās noslēgt kameru — %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Izdzēst šo %d fotogrāfiju no kameras?"
+msgstr[1] "Izdzēst šīs %d fotogrāfijas no kameras?"
+msgstr[2] "Izdzēst šīs %d fotogrāfijas no kameras?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Dzēst šo %d video no kameras?"
+msgstr[1] "Dzēst šos %d video no kameras?"
+msgstr[2] "Dzēst šos %d video no kameras?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Dzēst šo %d fotogrāfiju/video no kameras?"
+msgstr[1] "Dzēst šīs %d fotogrāfijas/video no kameras?"
+msgstr[2] "Dzēst šīs %d fotogrāfijas/video no kameras?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Dzēst šo %d datni no kameras?"
+msgstr[1] "Dzēst šīs %d datnes no kameras?"
+msgstr[2] "Dzēst šīs %d datnes no kameras?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Paturēt"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Izņem fotogrāfijas/video no kameras"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Neizdevās dzēst %d fotogrāfiju/video no kameras, jo bija kļūdas."
+msgstr[1] "Neizdevās dzēst %d fotogrāfijas/video no kameras, jo bija kļūdas."
+msgstr[2] "Neizdevās dzēst %d fotogrāfijas/video no kameras, jo bija kļūdas."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "S_laidrāde"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Rādīt slaidrādi"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksportēt fotogrāfijas/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksportēt fotogrāfijas/video"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Eksportēt fotogrāfiju"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksportēt fotogrāfijas"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Pagriešana"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Atsauc pagriešanu"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Apmet horizontāli"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Atsauc horizontālo apmešanu"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Apmet vertikāli"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Atsauc vertikālo apmešanu"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Jebkurš teksts"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Virsraksts"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Birka"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Notikuma nosaukums"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Datnes nosaukums"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Datu nesēja veids"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Atzīmes stāvoklis"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Vērtējums"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datums"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "satur"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "ir tieši"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "sākas ar"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "beidzas ar"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "nesatur"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nav iestatīts"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "ir"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nav"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "jebkura fotogrāfija"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "raw fotogrāfija"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "atzīmēts"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "neatzīmēts"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "un vairāk"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "tikai "
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "un mazāk"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "ir pēc"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "ir pirms"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ir starp"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "un"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "jebkurš"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "visi"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nekas"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Saglabātās meklēšanas"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Jauna saglabātā meklēšana..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Šī fotogrāfiju bibliotēka nav savietojama ar šo Shotwell versiju. Izskatās, "
+"ka tā tika veidota ar Shotwell %s (shēma %d). Šī versija ir %s (shēma %d). "
+"Lūdzu, lietojiet jaunāko Shotwell versiju."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell nevarēja uzlabot šo fotogrāfiju bibliotēku no versijas %s (shēma "
+"%d) uz %s (shēma %d). Lai uzzinātu vairāk, apskatiet Shotwell viki lapu %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Šī fotogrāfiju bibliotēka nav savietojama ar šo Shotwell versiju. Izskatās, "
+"ka tā tika veidota ar Shotwell %s (shēma %d). Šī versija ir %s (shēma %d). "
+"Lūdzu, attīriet savu bibliotēku, dzēšot %s un atkal importējot fotogrāfijas."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Nezināma kļūda, mēģinot pārbaudīt Shotwell datubāzi — %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Ielādē Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[DATNE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Palaidiet “%s --help”, lai redzētu pilnu pieejamo komandrindas opciju "
+"sarakstu.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Šodiena"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Vakardiena"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Nosaukums:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Vienumi:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d notikums"
+msgstr[1] "%d notikumi"
+msgstr[2] "%d notikumu"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotogrāfija"
+msgstr[1] "%d fotogrāfijas"
+msgstr[2] "%d fotogrāfiju"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d video"
+msgstr[2] "%d video"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datums:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Laiks:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "No:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Uz:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Izmērs:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Ilgums:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekundes"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Attīstītājs:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Ekspozīcija:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Atrašanās vieta:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Datnes izmērs:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Sākotnējās dimensijas:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kameras ražotājs:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kameras modelis:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Zibspuldze:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Fokusa attālums:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Ekspozīcijas nobīde:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS platums:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS garums:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Mākslinieks:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Autortiesības:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Programmatūra:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Paplašināta informācija"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Tiks izņemta birka “%s” no %d fotogrāfijas. Turpināt?"
+msgstr[1] "Tiks izņemta birka “%s” no %d fotogrāfijām. Turpināt?"
+msgstr[2] "Tiks izņemta birka “%s” no %d fotogrāfijām. Turpināt?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "At_celt"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Dzēst"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Šī darbība izņems saglabāto meklēšanu “%s”. Turpināt?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Attīstītāju pārslēgšana atsauks visas izmaiņas, ko veicāt šai fotogrāfijai "
+"ar Shotwell"
+msgstr[1] ""
+"Attīstītāju pārslēgšana atsauks visas izmaiņas, ko veicāt šīm fotogrāfijām "
+"ar Shotwell"
+msgstr[2] ""
+"Attīstītāju pārslēgšana atsauks visas izmaiņas, ko veicāt šīm fotogrāfijām "
+"ar Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "Pār_slēgt attīstītāju"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Eksportēt video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell nevar izveidot datni šīs fotogrāfijas rediģēšanai, jo jums nav "
+"tiesību rakstīt %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nevar eksportēt sekojošo fotogrāfiju, jo gadījās datnes kļūda.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Vai vēlaties turpināt eksportēšanu?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Turpinā_t"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nemainīts"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Pašreizējais"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formāts:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalitāte:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Mērogošanas ierobežojums:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pikseļi"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Eksportēt metadatus."
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(un vēl %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Netika importēta %d dublējoša fotogrāfija:\n"
+msgstr[1] "Netika importētas %d dublējošas fotogrāfijas:\n"
+msgstr[2] "Netika importētas %d dublējošu fotogrāfijas:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Netika importēts %d dublējošs video:\n"
+msgstr[1] "Netika importēti %d dublējoši video:\n"
+msgstr[2] "Netika importēti %d dublējošu video:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Netika importēta %d dublējoša fotogrāfija/video:\n"
+msgstr[1] "Netika importētas %d dublējošas fotogrāfijas/video:\n"
+msgstr[2] "Netika importētas %d dublējošu fotogrāfijas/video:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotogrāfijas importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[1] ""
+"%d fotogrāfiju importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[2] ""
+"%d fotogrāfiju importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d video importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[1] "%d video importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[2] "%d video importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotogrāfijas/video importēšana neizdevās dēļ datnes vai aparatūras "
+"kļūdas:\n"
+msgstr[1] ""
+"%d fotogrāfiju/video importēšana neizdevās dēļ datnes vai aparatūras "
+"kļūdas:\n"
+msgstr[2] ""
+"%d fotogrāfiju/video importēšana neizdevās dēļ datnes vai aparatūras "
+"kļūdas:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d datnes importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[1] "%d datņu importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+msgstr[2] "%d datņu importēšana neizdevās dēļ datnes vai aparatūras kļūdas:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotogrāfijas importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[1] ""
+"%d fotogrāfiju importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[2] ""
+"%d fotogrāfiju importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d video importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[1] "%d video importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[2] "%d video importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotogrāfijas/video importēšana neizdevās, jo fotogrāfiju mape nav "
+"rakstāma:\n"
+msgstr[1] ""
+"%d fotogrāfiju/video importēšana neizdevās, jo fotogrāfiju mape nav "
+"rakstāma:\n"
+msgstr[2] ""
+"%d fotogrāfiju/video importēšana neizdevās, jo fotogrāfiju mape nav "
+"rakstāma:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d datnes importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[1] "%d datņu importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+msgstr[2] "%d datņu importēšana neizdevās, jo fotogrāfiju mape nav rakstāma:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d fotogrāfijas importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[1] "%d fotogrāfiju importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[2] "%d fotogrāfiju importēšana neizdevās dēļ kameras kļūdas:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d video importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[1] "%d video importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[2] "%d video importēšana neizdevās dēļ kameras kļūdas:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d fotogrāfijas/video importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[1] "%d fotogrāfiju/video importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[2] "%d fotogrāfiju/video importēšana neizdevās dēļ kameras kļūdas:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d datnes importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[1] "%d datņu importēšana neizdevās dēļ kameras kļūdas:\n"
+msgstr[2] "%d datņu importēšana neizdevās dēļ kameras kļūdas:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Izlaista %d neatbalstīta fotogrāfija:\n"
+msgstr[1] "Izlaistas %d neatbalstītas fotogrāfijas:\n"
+msgstr[2] "Izlaistas %d neatbalstītas fotogrāfijas:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Izlaista %d ne-attēla datne.\n"
+msgstr[1] "Izlaistas %d ne-attēla datnes.\n"
+msgstr[2] "Izlaistu %d ne-attēla datņu.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Izlaista %d lietotāja atcelta fotogrāfija:\n"
+msgstr[1] "Izlaistas %d lietotāja atceltas fotogrāfijas:\n"
+msgstr[2] "Izlaistas %d lietotāja atceltas fotogrāfijas:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Izlaists %d lietotāja atcelts video:\n"
+msgstr[1] "Izlaisti %d lietotāja atcelti video:\n"
+msgstr[2] "Izlaisti %d lietotāja atcelti video:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Izlaista %d lietotāja atcelta fotogrāfija/video:\n"
+msgstr[1] "Izlaistas %d lietotāja atceltas fotogrāfijas/video:\n"
+msgstr[2] "Izlaistas %d lietotāja atceltas fotogrāfijas/video:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Izlaista %d lietotāja atcelta datne:\n"
+msgstr[1] "Izlaistas %d lietotāja atceltas datnes:\n"
+msgstr[2] "Izlaistas %d lietotāja atceltas datnes:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d fotogrāfija veiksmīgi importēta.\n"
+msgstr[1] "%d fotogrāfijas veiksmīgi importētas.\n"
+msgstr[2] "%d fotogrāfijas veiksmīgi importētas.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d video veiksmīgi importēts.\n"
+msgstr[1] "%d video veiksmīgi importēti.\n"
+msgstr[2] "%d video veiksmīgi importēti.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d fotogrāfija/video veiksmīgi importēts.\n"
+msgstr[1] "%d fotogrāfijas/video veiksmīgi importēti.\n"
+msgstr[2] "%d fotogrāfijas/video veiksmīgi importēti.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Neviena fotogrāfija netika importēta.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importēšana pabeigta"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunde"
+msgstr[1] "%d sekundes"
+msgstr[2] "%d sekunžu"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minūte"
+msgstr[1] "%d minūtes"
+msgstr[2] "%d minūšu"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d stunda"
+msgstr[1] "%d stundas"
+msgstr[2] "%d stundu"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 diena"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Pārsaukt notikumu"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nosaukums:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Rediģēt nosaukumu"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Izmes_t datni"
+msgstr[1] "Izmes_t datnes"
+msgstr[2] "Izmes_t datnes"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Tikai _izņemt"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Atgriezt ārējo izmaiņu?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Atgriezt ārējās izmaiņas?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Šī darbība iznīcinās visas izmaiņas, kas ir veiktas ar %d ārējo datni. "
+"Turpināt?"
+msgstr[1] ""
+"Šī darbība iznīcinās visas izmaiņas, kas ir veiktas ar %d ārējām datnēm. "
+"Turpināt?"
+msgstr[2] ""
+"Šī darbība iznīcinās visas izmaiņas, kas ir veiktas ar %d ārējām datnēm. "
+"Turpināt?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "At_griezt ārējo izmaiņu"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "At_griezt ārējās izmaiņas"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Šī darbība izņems %d fotogrāfiju no bibliotēkas. Turpināt?"
+msgstr[1] "Šī darbība izņems %d fotogrāfijas no bibliotēkas. Turpināt?"
+msgstr[2] "Šī darbība izņems %d fotogrāfijas no bibliotēkas. Turpināt?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Izņemt"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Izņemt fotogrāfiju no bibliotēkas"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Izņemt fotogrāfijas no bibliotēkas"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 st"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Pabīdīt fotogrāfija_s/video par vienādu attālumu"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Iest_atīt visas fotogrāfijas/video uz šo laiku"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Mainīt sākotnējo fotogrāfijas datni"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Mainīt sākotnējās fotogrāfijas datnes"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Mainīt sākotnējo datni"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Mainīt sākotnējās datnes"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Oriģināls: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ekspozīcijas laiks tiks pabīdīts uz priekšu par\n"
+"%d %s, %d %s, %d %s un %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Ekspozīcijas laiks tiks pabīdīts atpakaļ par\n"
+"%d %s, %d %s, %d %s un %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diena"
+msgstr[1] "dienas"
+msgstr[2] "dienu"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "stunda"
+msgstr[1] "stundas"
+msgstr[2] "stundu"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minūte"
+msgstr[1] "minūtes"
+msgstr[2] "minūšu"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekunde"
+msgstr[1] "sekundes"
+msgstr[2] "sekunžu"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Un %d cits."
+msgstr[1] ""
+"\n"
+"\n"
+"Un %d citi."
+msgstr[2] ""
+"\n"
+"\n"
+"Un %d citu."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Birkas (atdalītas ar komatu):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Laipni lūdzam!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Laipni lūdzam Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Lai sāktu, importējiet fotogrāfijas kādā no šiem veidiem:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Izvēlieties <span weight=\"bold\">Datne %s Importēt no mapes</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Velciet un nometiet fotogrāfijas Shotwell logā"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Pievienojiet kameru datoram un importējiet"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importēt fotogrāfijas no savas %s mapes"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Jūs varat arī importēt fotogrāfijas kādā no šiem veidiem:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Vairs nerādīt šo _ziņojumu"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importēt fotogrāfijas no %s bibliotēkas"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Palīdzība)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Gads%sMēnesis%sDiena"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Gads%sMēnesis"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Gads%sMēnesis-Diena"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Gads-Mēnesis-Diena"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Pielāgots"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Nederīgs raksts"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell var kopēt fotogrāfijas jūsu bibliotēkas mapē, vai tās var tikt "
+"importētas bez kopēšanas."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_pēt fotogrāfijas"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importēt vietā"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importēt bibliotēkā"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Izņemt no bibliotēkas"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Izņem fotogrāfijas no bibliotēkas"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Izņem fotogrāfijas no bibliotēkas"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Šī darbība izņems %d fotogrāfiju/video no jūsu Shotwell bibliotēkas. Vai "
+"vēlaties pārvietot šo datni uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[1] ""
+"Šī darbība izņems %d fotogrāfijas/video no jūsu Shotwell bibliotēkas. Vai "
+"vēlaties pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[2] ""
+"Šī darbība izņems %d fotogrāfijas/video no jūsu Shotwell bibliotēkas. Vai "
+"vēlaties pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Šī darbība izņems %d video no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šo datni uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[1] ""
+"Šī darbība izņems %d video no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[2] ""
+"Šī darbība izņems %d video no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Šī darbība izņems %d fotogrāfiju no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šo datni uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[1] ""
+"Šī darbība izņems %d fotogrāfijas no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+msgstr[2] ""
+"Šī darbība izņems %d fotogrāfijas no jūsu Shotwell bibliotēkas. Vai vēlaties "
+"pārvietot šīs datnes uz miskasti?\n"
+"\n"
+"Šo darbību nevar atsaukt."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Šo %d fotogrāfiju vai video nevar pārvietot uz miskasti. Dzēst šo datni?"
+msgstr[1] ""
+"Šīs %d fotogrāfijas vai video nevar pārvietot uz miskasti. Dzēst šīs datnes?"
+msgstr[2] ""
+"Šīs %d fotogrāfijas vai video nevar pārvietot uz miskasti. Dzēst šīs datnes?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Šo %d fotogrāfiju vai video nevar izdzēst."
+msgstr[1] "Šīs %d fotogrāfijas vai video nevar izdzēst."
+msgstr[2] "Šīs %d fotogrāfijas vai video nevar izdzēst."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Birkas"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Izdevās"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Datnes kļūda"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Neizdevās atkodēt datni"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Datubāzes kļūda"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Lietotājs pārtrauca importēšanu"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nav datne"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Datne jau eksistē datubāzē"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Neatbalstīts datnes formāts"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nav attēla datne"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Diska kļūme"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disks ir pilns"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kameras kļūda"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Datnes rakstīšanas kļūda"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Neizdevās importēšana (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificēts"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Iepriekšējā fotogrāfija"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Nākamā fotogrāfija"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Pazudusi fotogrāfijas avota datne — %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Skats"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Rīki"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Ie_priekšējā fotogrāfija"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Iepriekšējā fotogrāfija"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Nākamā fotogrāfija"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Nākamā fotogrāfija"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Tuv_ināt"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Palielināt fotogrāfijas palielinājumu"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Tā_lināt"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Samazināt fotogrāfijas palielinājumu"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Ietil_pināt lapā"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Mainīt mērogu, lai fotogrāfija ietilptu ekrānā"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Mērogs _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Mainīt fotogrāfijas mērogu uz 100% palielinājumu"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Mērogs _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Mainīt fotogrāfijas mērogu uz 200% palielinājumu"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Attīstītājs"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Neizdevās eksportēt %s — %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s datubāze"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Nevar turpināt importēt no %s, jo gadījās kļūda:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Lai mēģinātu importēt no cita servisa, izvēlieties kādu no augšpusē esošās "
+"izvēlnes."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Datu imports"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nav aktivētu datu importēšanas spraudņu.\n"
+"\n"
+"Lai lietotu “Importēt no lietotnes” funkcionalitāti, jābūt aktivētam vismaz "
+"vienam datu importēšanas spraudnim. Spraudņus var aktivēt iestatījumu "
+"dialoglodziņā."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Datubāzes datne:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importēt"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importēt no lietotnes"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importēt datu _nesēju no:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Aizvērt"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Iestatījumi"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Slaidrāde"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Atpakaļ"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Doties uz iepriekšējo fotogrāfiju"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pauzēt"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pauzēt slaidrādi"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Nākamais"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Doties uz nākamo fotogrāfiju"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Izmainīt slaidrādes iestatījumus"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Trūkst visas fotogrāfiju avotu datnes."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Rādīt"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Turpināt slaidrādi"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Atgriež"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Atsauc atgriešanu"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Uzlabo"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Atsauc uzlabošanu"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Izveido jaunu notikumu"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Izņem notikumu"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Pārvieto fotogrāfiju uz jaunu notikumu"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Iestata fotogrāfiju uz iepriekšējo notikumu"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Apvieno"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Atsauc apvienošanu"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Dublē fotogrāfijas"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Izņem fotogrāfiju dublikātus"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Neizdevās dublēt %d fotogrāfiju dēļ datnes kļūdas"
+msgstr[1] "Neizdevās dublēt %d fotogrāfijas dēļ datnes kļūdas"
+msgstr[2] "Neizdevās dublēt %d fotogrāfiju dēļ datnes kļūdas"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Atjauno iepriekšējo vērtējumu"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Palielina vērtējumus"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Samazina vērtējumus"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Iestata RAW attīstītāju"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Atjauno iepriekšējo RAW attīstītāju"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Iestatīt attīstītāju"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Nevarēja pielāgot sākotnējo fotogrāfiju."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Pielāgo datumu un laiku"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Atsauc datuma un laika pielāgošanu"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Nevarēja pielāgot %d sākotnējo fotogrāfiju."
+msgstr[1] "Nevarēja pielāgot %d sākotnējās fotogrāfijas."
+msgstr[2] "Nevarēja pielāgot %d sākotnējo fotogrāfiju."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Laika pielāgošanas kļūda"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Nevarēja atsaukt laika pielāgojumu sekojošajai fotogrāfijas datnei."
+msgstr[1] "Nevarēja atsaukt laika regulējumu sekojošajām fotogrāfiju datnēm."
+msgstr[2] "Nevarēja atsaukt laika regulējumu sekojošajām fotogrāfiju datnēm."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Izveidot birku"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Pārvietot birku “%s”"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Pārvietot fotogrāfijas uz miskasti"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Atjaunot fotogrāfijas no miskastes"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Pārvietot fotogrāfijas uz Shotwell miskasti"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Atjaunot fotogrāfijas atpakaļ uz Shotwell bibliotēku"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Pārvieto fotogrāfijas uz miskasti"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Atjauno fotogrāfijas no miskastes"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marķēt izvēlētās fotogrāfijas"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Noņemt marķējumu no izvēlētajām fotogrāfijām"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marķēt"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Noņemt marķējumu"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Zema (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Vidēja (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Augsta (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksimālā (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nav fotogrāfijas/video"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Netika atrastas fotogrāfijas/video"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Uz šo mapi nevar eksportēt fotogrāfijas."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nevar apstrādāt pārraudzības atjauninājumus — %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Aizpildīt visu lapu"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 attēli uz lapas"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 attēli uz lapas"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 attēli uz lapas"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 attēli uz lapas"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 attēli uz lapas"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 attēli uz lapas"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "colla"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Maks (2 x 3 collas)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Piezīmjkartiņa (3 x 5 collas)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 collas"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 collas"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 collas"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 collas"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 collas"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metriskais maks (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Pastkarte (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Attēla iestatījumi"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Drukā..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nevar izdrukāt fotogrāfiju:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nevar atvērt/izveidot fotogrāfiju datubāzi %s — kļūdas kods %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nevar ierakstīt fotogrāfiju datubāzes datnē:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Kļūda, piekļūstot datubāzes datnei:\n"
+" %s\n"
+"\n"
+"Kļūda bija: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Eksportēt video"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nevar palaist Nautilus sūtīt-uz — %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Sūtīt uz"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Neizdevās eksportēt fonu uz %s — %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Neizdevās sagatavot darbvirsmu slaidrādei — %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Ar karodziņu"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Miskaste"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Miskaste ir tukša"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Dzēst"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Dzēš fotogrāfijas"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Iztrūkstošās datnes"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Dzēš..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Pēdējais imports"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importēt no mapes..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importēt fotogrāfijas no diska uz bibliotēku"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importēt no _lietotnes..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Kārtot _notikumus"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Iztukšot _miskasti"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Dzēst visas fotogrāfijas no miskastes"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Skatīt fotogrāfijas _notikumu"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Meklēt"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Meklēt fotogrāfijas un video pēc meklēšanas kritērija"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Datne"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "R_ediģēt"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotogrāfija"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotogrāfijas"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "No_tikumi"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Birkas"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Palīdzība"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Pamatinformācija"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Rādīt pamatinformāciju par izvēli"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Pa_plašināta informācija"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Rādīt paplašinātu informāciju par izvēli"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Meklēšana_s josla"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Rādīt meklēšanas joslu"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Augošā"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Kārtot fotogrāfijas augošā secībā"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Dilstošā"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Kārtot fotogrāfijas dilstošā secībā"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importēt no mapes"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Iztukšot miskasti"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Iztukšo miskasti..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell ir nokonfigurēts, lai importētu fotogrāfijas uz mājas direktoriju.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Bibliotēkas atrašanās vieta"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "No šīs direktorijas fotogrāfijas nevar importēt."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Atjaunina bibliotēku..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Gatavojas automātiski importēt fotogrāfijas..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automātiski importē fotogrāfijas..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Datnēs raksta metadatus..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliotēka"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importē..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Apturēt importēšanu"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Apturēt fotogrāfiju importēšanu"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Gatavojas importēt..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importētas %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Saglabāt"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Saglabāt fotogrāfiju"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "S_aglabāt kā..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Saglabāt fotogrāfiju ar citu nosaukumu"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Drukāt fotogrāfiju ar printeri, kas ir pievienots pie datora"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s neeksistē."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nav datne."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s neatbalsta %s datnes formātu."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Saglabāt kopiju"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Zaudēt %s izmaiņas?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Aizvērt _nesaglabājot"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Kļūda, saglabājot kā %s — %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Saglabāt kā"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Nevar pārraudzīt %s — nav direktorija (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotogrāfiju pārvaldnieks"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotogrāfiju skatītājs"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Pag_riezt pa labi"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Pagriezt"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Pagriezt pa labi"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Pagriezt fotogrāfijas pa labi (piespiediet Ctrl, lai pagrieztu pa kreisi)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Pagriezt pa _kreisi"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Pagriezt pa kreisi"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Pagriezt fotogrāfijas pa kreisi"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Apmest hori_zontāli"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Apmest horizontāli"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Apmest verti_kāli"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Apmest vertikāli"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Uzlabot"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Uzlabot"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automātiski uzlabot fotogrāfijas izskatu"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "Ap_cirst"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Apcirst"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Apcirst fotogrāfijas izmēru"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Iztai_snot"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Iztaisnot"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Iztaisnot fotogrāfiju"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Sa_rkanās acis"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Sarkanās acis"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Samazināt vai likvidēt sarkano acu efektu fotogrāfijā"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "Pielāg_ot"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Pielāgot"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Pielāgot fotogrāfijas krāsu un toni"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "At_griezties pie oriģināla"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Atgriezties pie oriģināla"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "At_griezt ārējās izmaiņas"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Atgriezt uz sākotnējo fotogrāfiju"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Iestatīt kā _darbvirsmas fonu"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Iestatīt izvēlētos attēlus kā jaunos darbvirsmas fonus"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Iestatīt kā _darbvirsmas slaidrādi..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "Atsa_ukt"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Atsaukt"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "Ata_tsaukt"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Atatsaukt"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Pārsaukt _notikumu..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Izvēlēties kā _atslēgas fotogrāfiju notikumam"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Izvēlēties kā atslēgas fotogrāfiju notikumam"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Jau_ns notikums"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Jauns notikums"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Pārvietot fotogrāfijas"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Pārvietot fotogrāfijas uz notikumu"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Apvienot notiku_mus"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Apvienot"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Apvienot notikumus vienā notikumā"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Ie_statīt vērtējumu"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Iestatīt vērtējumu"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Mainīt savas fotogrāfijas vērtējumu"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "Pal_ielināt"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Palielināt vērtējumu"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Samazināt"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Samazināt vērtējumu"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Nav vērtēts"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Nav vērtēts"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Vērtējums nevērtēts"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Iestata kā nevērtētu"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Noņem jebkuru vērtējumu"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "No_raidīts"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Noraidīts"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Vērtējums noraidīts"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Iestata kā noraidītu"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Iestatīt vērtējumu uz “noraidīts”"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Tikai n_oraidītās"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Tikai noraidītās"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Rādīt tikai noraidītās fotogrāfijas"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Visas un no_raidītās"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Rādīt visas fotogrāfijas, tai skaita noraidītās"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Vis_as fotogrāfijas"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Rādīt visas fotogrāfijas"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Vē_rtējumi"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Rādīt katras fotogrāfijas vērtējumu"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrēt fotogrāfijas"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrēt fotogrāfijas"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ierobežot fotogrāfiju skaitu, ko rādīt pēc filtrēšanas"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Dublēt"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Dublēt"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Izveidot fotogrāfijas dublikātu"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Eksportēt..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Drukāt..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicēt..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicēt"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicēt uz dažādām tīmekļa vietnēm"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Rediģē_t nosaukumu..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Pielāgot d_atumu un laiku..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Pielāgot datumu un laiku"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Pievieno_t birkas..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Pievienot birk_as..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Pievienot birkas"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Iestatījumi"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Atvērt ar ārēju reda_ktoru"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Atvērt ar RA_W redaktoru"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Sū_tīt uz..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Sūtīt _uz..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Meklēt..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Meklēt"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Meklēt attēlu, ierakstot tekstu, kas parādās tā nosaukumā vai birkās"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marķēt"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Noņemt _marķējumu"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nevar palaist redaktoru — %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Pievienot birku “%s”"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Pievienot birkas “%s” un “%s”"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Dzēst birku “%s”"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Dzēst birku “%s”"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Dzēst birku"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "Jau_ns"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Pārsaukt _birku “%s”..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Pārsaukt birku “%s” uz “%s”"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Pā_rsaukt..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Mod_ificēt birkas..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificēt birkas"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Fotogrāfijām pielikt birku “%s”"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Marķēt fotogrāfijas kā “%s”"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Izvēlētajām fotogrāfijām pielikt birku “%s”"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Marķēt izvēlētās fotogrāfijas kā “%s”"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "No _fotogrāfijām izņemt birku “%s”"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Izņemt birku “%s” no _fotogrāfijām"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "No fotogrāfijām izņemt birku “%s”"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Izņemt birku “%s” no fotogrāfijām"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Birku “%s” nevar pārsaukt, jo tāda birka jau eksistē."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Nevar pārsaukt meklēšanu uz “%s”, jo tāda jau eksistē."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Saglabātais meklējums"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Dzēst meklēšanu"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "R_ediģēt..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Pārsaukt..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Pārsaukt meklēšanu “%s” uz “%s”"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Dzēst meklēšanu “%s”"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Vērtēt %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Iestatīt vērtējumu uz %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Iestata vērtējumu uz %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Rādīt %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Rādīt tikai bildes ar vērtējumu %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s vai labāka"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Rādīt %s vai labākas"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Rādīt tikai bildes ar vērtējumu %s vai labāku"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Izņemt izvēlētās fotogrāfijas no miskastes"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Izņemt izvēlētās fotogrāfijas no bibliotēkas"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Atjaunot"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Pārvietot izvēlētās fotogrāfijas atpakaļ bibliotēkā"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Rādīt datņu _pārvaldniekā"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Atvērt izvēlētās fotogrāfijas mapi datņu pārvaldniekā"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Neizdevās atvērt datņu pārvaldniekā — %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Izņ_emt no bibliotēkas"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Pārvietot uz _miskasti"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Izvēlēties vis_as"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Izvēlēties visus vienumus"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Leņķis:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "Pā_rstatīt"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Atgriezties uz pašreizējiem fotogrāfijas izmēriem"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Iestatīt apciršanu šai fotogrāfijai"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Pārslēgt apciršanas četrstūri starp portreta un ainavas novietojumiem"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Neierobežots"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Kvadrāts"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Ekrāns"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Sākotnējais izmērs"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Vēstule (8.5 x 11 collas)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloīds (11 x 17 collas)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Aizvērt sarkano acu rīku"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Izņemt sarkano acu efektu izvēlētajā reģionā"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Piesātinājums:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tonis:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatūra:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Ēnas:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Pārstatīt krāsas"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Pārstatīt visus krāsu pielāgojumu atpakaļ uz oriģinālu"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatūra"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tonis"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Piesātinājums"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Ekspozīcija"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Ēnas"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrasta palielināšana"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Piefiksēt rīkjoslu"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Piefiksēt rīkjoslu atvērtu"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Iziet no pilnekrāna režīma"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Iziet no _pilnekrāna režīma"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Iziet"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "P_ar"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Pilnekrāns"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Saturs"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Biežāk uzdotie jautājumi"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "Ziņot par p_roblēmu..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Gadījās fatāla kļūda, piekļūstot Shotwell bibliotēkām. Shotwell nevar "
+"turpināt.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Apmeklējiet Yorba tīmekļa vietni"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Pēteris Krišjānis <pecisk@gmail.com>\n"
+"Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nevar parādīt palīdzību — %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nevar pārvietoties pa kļūdu datubāzi — %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nevar parādīt BUJ — %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "nenosaukts"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Sākotnējais izmērs"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Platums vai augstums"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Platums"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Augstums"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Pielāgot sīktēlu izmēru"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Palielināt sīktēlu palielinājumu"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Samazināt sīktēlu palielinājumu"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Kārtot _fotogrāfijas"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Atskaņot video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Atvērt izvēlētos video sistēmas video atskaņotājā"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Rādīt katras fotogrāfijas birku"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Pēc _nosaukuma"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Kārtot fotogrāfijas pēc nosaukuma"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Pēc uzņemšanas _datuma"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Kārtot fotogrāfijas pēc uzņemšanas datuma"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Pēc vē_rtējuma"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Kārtot fotogrāfijas pēc vērtējuma"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell nevar atskaņot izvēlēto video:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotogrāfija/video"
+msgstr[1] "%d fotogrāfijas/video"
+msgstr[2] "%d fotogrāfiju/video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Nav notikumu"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nav atrastu notikumu"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Notikumi"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Nav datēts"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Nav notikuma"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nevar izveidot keša direktoriju %s — %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nevar izveidot datu direktoriju %s — %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Attēli"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Neizdevās izveidot pagaidu direktoriju %s — %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nevar izveidot datu apakšdirektoriju %s — %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nekādas)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nekādas"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Slaidrādes pārejas"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nevar ģenerēt %s pagaidu datni — %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Eksportē"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Datne %s jau eksistē. Aizvietot?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Izlai_st"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Aizvietot"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Aizvietot _visu"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Eksportēt"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotogrāfijas"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW fotogrāfijas"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW fotogrāfijas"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Kļūda, ielādējot UI datni “%s” — %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tips"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicē"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Izvēlētās fotogrāfijas/video tika veiksmīgi publicētas."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Izvēlētie video tika veiksmīgi publicēti."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Izvēlētās fotogrāfijas tika veiksmīgi publicētas."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Izvēlētais video tika veiksmīgi publicēts."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Izvēlētā fotogrāfija tika veiksmīgi publicēta."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Saņem konta informāciju..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Ierakstās..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicēt fotogrāfijas"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicēt fo_togrāfijas uz:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicēt video"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicē_t video uz"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicēt fotogrāfijas un video"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicēt fo_togrāfijas un video uz"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nevar publicēt"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell nevar publicēt izvēlētos vienumus, jo nav aktivēts savietojams "
+"publicēšanas spraudnis. Lai to labotu, izvelieties <b>Rediģēt %s "
+"Iestatījumi</b> un aktivējiet vienu vai vairākus publicēšanas spraudņus "
+"cilnē <b>Spraudņi</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Gatavo augšupielādēšanai"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Augšupielādē %d no %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Nevar turpināt publicēšanu uz %s, jo gadījās kļūda:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Lai mēģinātu publicēt citā servisā, izvēlieties to no augstāk redzamās "
+"izvēlnes."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Jauna _birka..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Publicēšanai nepieciešama pagaidu datne"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Jūs pašlaik neesat ierakstījies YouTube\n"
+"\n"
+"Jums jau ir jābūt izveidotam Google kontam un tur ir jābūt iestatītai "
+"YouTube izmantošanai, lai turpinātu. Jūs varat iestatīt vairums kontu, "
+"izmantojot pārlūku un ierakstoties YouTube vismaz vienreiz."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Nav pieejama publicēšanai vajadzīgā datne. Nevar turpināt publicēt uz "
+"Youtube."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Jūs esat ierakstījies YouTube kā “%s”."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Video parādīsies “%s”"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Publiskā sarakstā"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Nav publiskā sarakstā"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privāts"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Pamata publicēšanas servisi"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Jūs pašlaik neesat ierakstījies Flickr vietnē.\n"
+"\n"
+"Spiediet “Login”, lai ierakstītos Flickr vietnē tīmekļa pārlūkā. Jums "
+"vajadzēs pilnvarot Shotwell savienojumu, lai sasaistītu to ar Flickr kontu."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Jūs jau esat ierakstījies un izrakstījies no Flickr sistēmas Shotwell "
+"sesijas laikā.\n"
+"Lai turpinātu publicēšanu Flickr sistēmā, izejiet no Shotwell un pārlaidiet "
+"to vēlreiz."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Gatavojas ierakstīties..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Nav pieejama publicēšanai vajadzīgā datne. Nevar turpināt publicēt uz Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Pārbauda pilnvarojumu..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Jūs esat ierakstījies Flickr kā %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Jūsu bezmaksas Flickr konts ierobežo mēnesī augšupielādējamo datu apjomu.\n"
+"Šomēnes jums ir atlikuši %d megabaiti augšupielādēšanas kvotas."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Jūsu Flickr Pro konts ļauj jums izmantot neierobežotu datu apjomu."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotogrāfijas, _kas redzamas:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Video, _kas redzami:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotogrāfijas un video, _kas redzami:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Ikviens"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Tikai draugiem un ģimenei"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Tikai ģimenei"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Tikai draugiem"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Tikai es"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pikseļi"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pikseļi"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pikseļi"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pikseļi"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Veido albumu %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Ievadiet savas fotogrāfiju bibliotēkas URL, kā arī lietotājvārdu un paroli, "
+"kas ir saistīta ar Piwigo kontu tai bibliotēkai."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell nevar sazināties ar jūsu Piwigo fotogrāfiju bibliotēku. Lūdzu, "
+"pārbaudiet ievadīto URL."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Lietotājvārds un / vai parole nav pareiza. Lūdzu, mēģiniet vēlreiz"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Nederīgs URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Nederīgs lietotājvārds vai parole"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell savienojumi"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratori, ģimene, draugi, kontakti"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratori, ģimene, draugi"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratori, ģimene"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratori"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Jūs pašlaik neesat ierakstījies Picasa Web Albums vietnē.\n"
+"\n"
+"Spiediet “Login”, lai ierakstītos Picasa Web Albums vietnē tīmekļa pārlūkā. "
+"Jums vajadzēs pilnvarot Shotwell savienojumu, lai sasaistītu to ar Picasa "
+"Web Albums kontu."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Nav pieejama publicēšanai vajadzīgā datne. Nevar turpināt publicēt uz Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Veido albumu..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Jūs esat ierakstījies Picasa Web Albums kā “%s”."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video parādīsies:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotogrāfijas parādīsies:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Mazs (640 x 480 pikseļi)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Vidējs (1024 x 768 pikseļi)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Ieteiktais (1600 x 1200 pikseļi)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pikseļi)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Jūs pašlaik neesat pieteicies Facebook.\n"
+"\n"
+"Ja jums vēl nav Facebook konta, jūs to varat izveidot ierakstīšanās procesā. "
+"Tās laikā Shotwell Connect var jums prasīt atļauju augšupielādēt "
+"fotogrāfijas un publicēt tās jūsu plūsmā. Šīs atļaujas ir nepieciešamas, lai "
+"Shotwell Connect varētu darboties."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Jūs jau esat ierakstījies un izrakstījies no Facebook sistēmas Shotwell "
+"sesijas laikā.\n"
+"Lai turpinātu publicēšanu Facebook sistēmā, izejiet no Shotwell un "
+"pārlaidiet to vēlreiz."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standarta (720 pikseļi)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Liels (2048 pikseļi)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testē savienojumu ar Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Nav pieejama publicēšanai vajadzīgā datne. Nevar turpināt publicēt uz "
+"Facebook."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Jūs esat ierakstījies Facebook kā %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kur vēlaties publicēt izvēlētās fotogrāfijas?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Augšupielāde_s izmērs:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Sairt"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Pamata slaidrādes pārejas"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slaids"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Izgaist"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Kodola datu importēšanas servisi"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Laipni lūdzam F-Spot bibliotēkas importēšanas servisā.\n"
+"\n"
+"Lūdzu, izvēlieties bibliotēku, ko importēt, vai nu izvēloties kādu no "
+"bibliotēkām, ko ir atradis Shotwell, vai arī izvēloties alternatīvu F-Spot "
+"datubāzes datni."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Laipni lūdzam F-Spot bibliotēkas importēšanas servisā.\n"
+"\n"
+"Lūdzu, izvēlieties F-Spot datubāzes datni."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Manuāli izvēlieties F-Spot datubāzes datni, ko importēt:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nevar atvērt izvēlēto F-Spot datubāzes datni — datne neeksistē vai nav F-"
+"Spot datubāze"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nevar atvērt izvēlēto F-Spot datubāzes datni — šo F-Sopt datubāzes datnes "
+"versiju Shotwell neatbalsta"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nevar nolasīt izvēlēto F-Spot datubāzes datni — kļūda, nolasot birku tabulu"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nevar nolasīt izvēlēto F-Spot datubāzes datni — kļūda, nolasot fotogrāfiju "
+"tabulu"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell ir atradis %d fotogrāfijas F-Spot bibliotēkā un tās pašlaik "
+"importē. Dublikāti tiks automātiski atrasti un izņemti.\n"
+"\n"
+"Jūs varat aizvērt šo dialoglodziņu un sākt lietot Shotwell, kamēr fonā "
+"notiek importēšana."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot bibliotēka — %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Gatavojas importēt"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Iestatīt kā darbvirsmas slaidrādi"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Veidot darbvirsmu no fona slaidrādes"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Rādīt katru fotogrāfiju"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "laika periods"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Cik ilgi katra fotogrāfija tiek rādīta uz darbvirsmas fona"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Meklēt"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "Meklēšanas _nosaukums"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Sakrīt"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "no sekojošajiem:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Lietot _standarta izmēru:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Lietot pielāgot_u izmēru:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "Atbilst fotogrāfijas sa_mēram"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automātisks izmērs:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Drukā_t attēla nosaukumu"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "Izvadīt f_otogrāfiju uz:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pikseļi uz collu"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiķete"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell iestatījumi"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "balts"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "melns"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Sekot līdzi jaunām datnēm manā bibliotēkā"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadati"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Rakstīt birkas, nosaukumus un citus _metadatus fotogrāfiju datnēs"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Attēlot"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importēt fotogrāfijas uz:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Fons:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importē"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Direktoriju struktūra:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "Šabl_ons:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Piemērs:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Pārsaukt importētās datnes uz mazajiem burti_em"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW attīstītājs"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "No_klusējuma:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Ārējais fotogrāfiju r_edaktors:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Ārējais _RAW redaktors:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Ārējie redaktori"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Spraudņi"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "Ai_zture:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Pārejas efek_ti:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Pār_ejas aizture:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Rādīt v_irsrakstu"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekundes"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Ierakstīties"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publicēt e_ksistējošā albumā:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Izveidot jau_nu albumu ar nosaukumu:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "_Video un jaunie fotogrāfiju albumi ir redzami:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Izrakstīties"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publicēt"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Ievadiet apstiprināšanas skaitli, kas parādīsies pēc tam, kad būsiet "
+"ierakstījies Flickr vietnē."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autorizācijas _skaitlis:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Fotogrāfiju izmēr_s:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Esošs albums:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Jau_ns albums ar nosaukumu:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "L_ikt albumu publiskā galerijā"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Fotogrāfiju izmēra regulējum_s:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Jūsu Piwigo _URL fotogrāfiju bibliotēka"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Lietotājvārds"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Parole"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Atce_rēties paroli"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Ierakstīties"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Esoša kategorija:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotogrāfijas _varēs redzēt:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Fotogrāfijas izmērs:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Izrakstīties"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Video privātuma ie_statījumi:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Autortiesības 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pikseļi"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "“%s” nav derīga atbilde OAuth autentifikācijas pieprasījumam"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): nevar startēt; publicētājs nav pārstartējams."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Ievadiet lietotājvārdu un paroli, kas ir saistītas ar jūsu Tumblr kontu."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nevarēja ielādēt saskarni — %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Jūs esat ierakstījies Tumblr kā %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Autortiesības 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Apmeklējiet Yandex.Fotki tīmekļa vietni"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Jūs šobrīd neesat ierakstījies Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_E-pasta adrese"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Jūs esat ierakstījies Tumblr kā (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Emuāri:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albums (vai rakstīt jaunu):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Piekļuves _tips:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Deaktivēt _komentārus"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Aizliegt lejupielādēt sākotnējo _fotogrāfiju"
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..2413c72
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,4514 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Mitko Krstev <m.krstev@hotmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Macedonian (http://www.transifex.com/projects/p/shotwell/"
+"language/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Настан %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Фотоапарати"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Фотоапарат"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Не можам да го демонтирам фотоапаратот. Обиди се да го демонтираш "
+"фотоапаратот од менаџерот на датотеки."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Сокриј веќе увезени фотографии"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Покажи само фотографии кои не се увезени"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Наслови"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Прикажи го насловот на секоја фотографија"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Увези ги _селектираните"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Увези ги избраните фотографии во својата библиотека"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Увези _се"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Увези ги сите фотографии во својата библиотека"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell треба да го одмонтира фотоапаратот од датотечниот систем, со цел "
+"пристап до него. Дали да продолжам?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Демонтирај"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Те молам демонтири го фотоапаратот."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Камерата е заклучен од страна на друга апликација. Shotwell може да пристапи "
+"до фотоапаратот само кога е отклучен. Те молам затвори ја апликацијата и "
+"обиди се повторно."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"Те молам затвори ја било која друга апликација што го користи фотоапаратот."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Не можам да добијам прегледи од фотоапаратот:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Демонтирање ..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Примам информации од фотографијата"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Примам приказ за %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Не може да се заклучи фотоапаратот: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Избриши ги овие %d фотографии од фотоапаратот?"
+msgstr[1] "Избриши ја оваа %d фотографија од фотоапаратот?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Избриши ги овие %d видеа од фотоапаратот?"
+msgstr[1] "Избриши го оваа %d видео од фотоапаратот?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Избриши ги овие %d фотографии/видеа од фотоапаратот?"
+msgstr[1] "Избриши ја/го оваа %d фотографија/видео од фотоапаратот?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Зачувај"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Отстранување на фотографии/видеа од фотоапаратот"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Не може да се избришат %d фотографии/видеа од фотоапаратот поради грешки."
+msgstr[1] ""
+"Не може да се избрише %d фотографија/видео од фотоапаратот поради грешки."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Пушти слајдшоу"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Извези слика/видео"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Извези слика"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Извези фотографии"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Ротирање"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Враќање на ротација"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Хоризонтално вртење"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Враќање на хоризонтално вртење"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Вертикално вртење"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Враќање на вертикално вртење"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Твојата фото библиотека не е компатибилна со оваа верзија на Shotwell. "
+"Креирана е од Shotwell %s (%d издание). Оваа верзија е %s (%d издание). Те "
+"молам користи ја најновата верзија на Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell не беше во можност да ја надгради твојата фото библиотека од "
+"верзија %s (%d издание) во %s (%d издание). За повеќе информации провери "
+"Shotwell Wiki на %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Твојата фото библиотека не е компатибилна со оваа верзија на Shotwell. "
+"Креирана е од Shotwell %s (%d издание). Оваа верзија е %s (%d издание). Те "
+"молам да ја исчистиш твојата библиотека со бришење на %s и повторно увези ги "
+"твоите фотографии."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Непозната грешка при обидот за верификација на база на податоци на Shotwell :"
+"%s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Вчитување на Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ДАТОТЕКА]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Испрати '%s - help' за да ја видиш комплетната листа на опции за командната "
+"линија.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Денес"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Наслов:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Предмети:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d настани"
+msgstr[1] "%d настан"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d фотографии"
+msgstr[1] "%d фотографија"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d видеа"
+msgstr[1] "%d видео"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Датум:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Време:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Од:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "До:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Големина:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Времетраење:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f секунди"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Експозиција:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Локација:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Големина на датотеката:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Оригинални димензии:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Марка на фотоапарат:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Модел на фотоапаратот:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Блиц:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Фокусна должина:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Експозиција на пристрасност:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS географска ширина:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS географска должина:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Фотограф:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Авторско право:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Софтвер:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Додатни информации"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Ова ќе ја отстрани ознаката \"%s\" од %d фотографии. Да продолжам?"
+msgstr[1] "Ова ќе ја отстрани ознаката \"%s\" од %d фотографија. Да продолжам?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Откажи "
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Избриши"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Извези видео"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Нееможноста да се извезе следната фотографија се должи на грешки во "
+"датотеката.\n"
+"\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Дали сакаш да продолжеш со извезувањето?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Продолжи"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Непроменето"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Тековно"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Квалитет:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Scaling Ограничување:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _пиксели"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+"(и уште %d)\n"
+"\n"
+"\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+"%d дупликат фотографии не се увезени:\n"
+"\n"
+msgstr[1] ""
+"%d дупликат фотографија не е увезена:\n"
+"\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+"%d дупликат видеа не се увезени:\n"
+"\n"
+"\n"
+msgstr[1] ""
+"%d дупликат видео не е увезено:\n"
+"\n"
+"\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+"%d дупликат фотографии/видеа не се увезени:\n"
+"\n"
+"\n"
+"\n"
+msgstr[1] ""
+"%d дупликат фотографија/видео не е увезена/о:\n"
+"\n"
+"\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d фотографии не се внесени успешно поради датотечна или хардверска грешка.\n"
+msgstr[1] ""
+"%d фотографија не е внесена успешно поради датотечна или хардверска грешка.\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d видеа не се внесени успешно поради датотечна или хардверска грешка.\n"
+msgstr[1] ""
+"%d видео не е внесено успешно поради датотечна или хардверска грешка.\n"
+"\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d фотографии/видеа не се внесени успешно поради датотечна или хардверска "
+"грешка.\n"
+msgstr[1] ""
+"%d фотографија/видео не е внесена/о успешно поради датотечна или хардверска "
+"грешка.\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d фотографии не се внесени успешно поради грешка во камерата.\n"
+"\n"
+msgstr[1] ""
+"%d фотографија не е внесена успешно поради грешка во камерата.\n"
+"\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d видеа не се внесени успешно поради грешка во камерата.\n"
+msgstr[1] "%d видео не е внесено успешно поради грешка во камерата.\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d фотографии/видеа не се внесени успешно поради грешка во камерата.\n"
+msgstr[1] ""
+"%d фотографија/видео не е внесена/о успешно поради грешка во камерата.\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d неподдржани фотографии се пропуштени:\n"
+msgstr[1] "%d неподдржана фотографија е пропуштена:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d датотеки што не се слики се пропуштени.\n"
+msgstr[1] "%d датотека што не е слика е пропуштена.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d фотографии се пропуштени поради откажување на корисникот.\n"
+msgstr[1] "%d фотографија е пропуштена поради откажување на корисникот.\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d видеа се пропуштени поради откажување на корисникот.\n"
+msgstr[1] "%d видео е пропуштено поради откажување на корисникот.\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d фотографии/видеа се пропуштени поради откажување на корисникот\n"
+msgstr[1] ""
+"%d фотографија/видео е пропуштена/о поради откажување на корисникот.\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d фотографии успешно се увезени.\n"
+msgstr[1] "%d фотографија успешно е увезена.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+"%d видеа успешно се увезени.\n"
+"\n"
+msgstr[1] "%d видео успешно е увезено.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d фотографии/видеа успешно се увезени.\n"
+msgstr[1] "%d фотографија/видео успешно е увезена/о.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Нема увезено фотографија или видео.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Увозот е завршен"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунди"
+msgstr[1] "%d секунда"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минути"
+msgstr[1] "%d минута"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d часа"
+msgstr[1] "%d час"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ден"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Преименувај го настанот "
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Име:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Уреди го насловот"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Датотеки во ѓубре"
+msgstr[1] "_Датотека во ѓубре"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Само _отстрани"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Ова ќе ги уништи сите промени направени на %d надворешни датотеки. Да "
+"продолжам?"
+msgstr[1] ""
+"Ова ќе ги уништи сите промени направени на %d надворешна датотека. Да "
+"продолжам?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Врати на надворешно уредување"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Ова ќе отстрани %d фотографии од библиотеката. Да продолжам?"
+msgstr[1] "Ова ќе отстрани %d фотографија од библиотеката. Да продолжам?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Отстрани"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Избриши ја фотографијата од библиотеката"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ч."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Измени ја оригиналната датотека"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Оригинал: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Времето на експозиција ќе биде префрлено напред за\n"
+"\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Времето на експозиција ќе биде префрлено назад за\n"
+"\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "дена"
+msgstr[1] "ден"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "часа"
+msgstr[1] "час"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минути"
+msgstr[1] "минута"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунди"
+msgstr[1] "секунда"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"и %d други."
+msgstr[1] ""
+"\n"
+"и %d друга."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Ознаки (одделени со запирки):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Добредојде!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Добредојде во Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "За да започнеш, увези фотографии на некој од следниве начини:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Избери <span weight=\"bold\">Датотека %s Увоз од папката</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Влечи и пушти фотографии на прозорецот на Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Поврзи го фотоапаратот на твојот компјутер и увезувај"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Увези фотографии од вашата %s папка"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Исто така може да се внесуваат фотографии на некој од следниве начини:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Не ја покажувај оваа порака повторно"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Прилагодено"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell може да ја копира фотографијата во твојата збирка или може да ги "
+"увезе без копирање."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Копирај фотографии"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Увези на место"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Увоз на библиотеката"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Отстрани од библиотеката"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Отстранување на фотографијата од библиотеката"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ова ќе отстрани %d фотографии/видеа од твојата Shotwell библиотека. Дали "
+"сакаш да ја преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+msgstr[1] ""
+"Ова ќе отстрани %d фотографија/видео од твојата Shotwell библиотека. Дали "
+"сакаш да ја преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ова ќе отстрани %d видеа од твојата Shotwell библиотека. Дали сакаш да ја "
+"преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+msgstr[1] ""
+"Ова ќе отстрани %d видео од твојата Shotwell библиотека. Дали сакаш да ја "
+"преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Ова ќе отстрани %d фотографии од твојата Shotwell библиотека. Дали сакаш да "
+"ја преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+msgstr[1] ""
+"Ова ќе отстрани %d фотографија од твојата Shotwell библиотека. Дали сакаш да "
+"ја преместиш датотеката во ѓубрето? \n"
+"Ова дејство не може да се врати назад."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d фотографии или видеа не може да се преселат во ѓубрето. Да ја избришам "
+"оваа датотека?"
+msgstr[1] ""
+"%d фотографија или видео не може да се пресели во ѓубрето. Да ги избришам "
+"овие датотеки?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d фотографии или видеа не можат да бидат избришани."
+msgstr[1] "%d фотографија или видео не може да биде избришана/о."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Ознаки"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Успешно"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Грешка во датотеката"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Не може да се декодира датотеката"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Грешка во базата на податоци"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Корисникот го прекина увозот"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Не е датотека"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Датотеката веќе постои во базата на податоци"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Неподдржан формат на датотека"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Не е датотека со слики"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Грешка во дискот"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Дискот е полн"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Грешка во фотоапаратот"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Увезувањето не успеа (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "изменето"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Претходна фотографија"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Следна фотографија"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Недостасува изворна датотека на фотографијата: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Поглед"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Претходна фотографија"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Претходна фотографија"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Следна фотографија"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Следна фотографија"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Зголеми"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Зголемување на големината на фотографијата"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Намали"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Намалување на големината на фотографијата"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Собери на _страницата"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Зумирај ја фотографијата за да ја собере на екранот"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_Зумирај 100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Зумирање на фотографијата со 100% зголемување "
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_Зумирај 200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Зумирање на фотографијата со 200% "
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Не може да се извезува %s:%s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "База на податоци за %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Увези"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Затвори"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Подесувања"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Слајдшоу"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Назад"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Оди на претходната фотографија"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Пауза"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Пауза на слајдшоу"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Следна"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Оди на следната фотографија"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Промена на поставувањата на слајдшоу"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Сите фото изворни датотеки се водат за исчезнати."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Пушти"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Продолжи слајдшоу"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Обновување"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Враќање на обновување"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Подобрување"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Враќање на подобрувањето"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Креирање нов настан"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Отстранување на настанот"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Преместување на фотографиите во новиот настан"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Поставување на фотографиите во претходниот настан"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Спојување"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Враќање на спојувањето"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Дуплирање на фотографии"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Отстранување на дупликат фотографии"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Не може да се дуплираат %d фотографии поради грешка во датотеката"
+msgstr[1] "Не може да се дуплира %d фотографија поради грешка во датотеката"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Враќање на претходниот рејтинг"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Зголемување на рејтингот"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Намалување на рејтингот"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Оригиналната фотографија не може да се прилагоди."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Прилагоди го датумот и времето"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Враќање на прилагодувањето на датумот и времето"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Следните оригинални фотографии не можат да се прилагодат."
+msgstr[1] "Оригиналната фотографија не може да се прилагоди."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Грешка во прилагодувањето на времето"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Прилагодувањето не може да се врати назад на следните фотографии."
+msgstr[1] "Прилагодувањето не може да се врати назад на следната фотографија."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Премести ги фотографиите во ѓубрето"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Врати ги фотографиите од ѓубрето"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Помести ги фотографиите во ѓубрето на Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Врати ги фотографиите назад во библиотеката на Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Преместување на фотографиите во ѓубрето"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Враќање на фотографиите од ѓубрето"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Обележи ги избраните фотографии"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Отстрани обележје од избраните фотографии"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Обележи"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Отстрани обележје"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Ниско (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Средно (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Високо (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Максимално (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Фотографиите не можат да се извезат на оваа папка."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "инчи"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "см"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Паричник (2 x 3 инча)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Белешка (3 х 5 инча)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 инча"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 х 7 инча"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 инча"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 х 14 инча"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 х 20 инча"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Метрички Паричник (9 х 13 см)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Разгледница (10 x 15 см)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 х 18 см"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 х 24 см"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 х 40 см"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 х 40 см"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Подесувања на сликата"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Фотографијата не може да се печати:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Не можам да ја отворам/креирам базата на податоци со фотографии %s: код за "
+"грешка %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Извези видеа"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Не може да се стартува Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Испрати до"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Не може да се извезува позадина на %s:%s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Не може да се подготви десктоп слајдшоу: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Обележано"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Ѓубре"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Бриши"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Датотеки што недостасуваат"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Бришење ..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Последен увоз"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Увези од папката ..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Увоз на фотографиите од дискот на библиотеката"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Подреди ги _настаните"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Испразни го _ѓубрето"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Бришење на сите фотографии во ѓубре"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Погледни го _настанот за фотографијата"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Датотека"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Уреди"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Фотографија"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Фотографии"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Настани "
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Ознаки"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Помош"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Основни информации"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Прикажи основни информации за изборот"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Додатни информации"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Прикажи додатни информации за избраното"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Растење"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Подреди фотографии во растечки редослед"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Опаѓање"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Подреди фотографии во опаѓачки редослед"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Увоз од папката"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Испразни го ѓубрето"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Празнење на ѓубрето ..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell е конфигуриран за увоз на фотографии на твојата домашна папка.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Локација на библиотеката"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Фотографиите не можат да бидат увезени од оваа папка."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Ажурирање на библиотеката ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Подготвување на автоматско увезување на фотографии..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Автоматско увезување на фотографии..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Пишување на метаподатоци во датотеки ..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Увезување..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Стопирање на увезувањето"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Прекини го увезувањето на фотографии"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Подготвување за увоз ..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Увезени %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Зачувај"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Зачувај фотографија"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Зачувај _како..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Зачувај Ја фотографијата со друго име"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Печати ја фотографијата со принтер поврзан на твојот компјутер"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s не постои."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s не е датотека."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s не го подржува форматот на датотеката на\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Зачувај ја копијата"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Заборави ја промената на %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Затвори _без зачувување"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Грешка при зачувувањето на %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Зачувај како"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Не може да се следи %s: Не постои папка (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Менаџер на фотографии"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Фото прегледувач"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Ротација _десно"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Ротација"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Ротирај десно"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Ротација на фотографии во десно (притисни Ctrl за да ги ротираш лево)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Ротација _лево"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Ротација лево"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Ротација на фотографијата во лево"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Заврти _хоризонтално"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Заврти хоризонтално"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Заврти _вертикално"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Заврти вертикално"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Подобри"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Подобри"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Автоматски подобри го изгледот на фотографијата"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Исечи"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Исечи"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Ја отсекува големината на фотографијата "
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Црвени очи"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Црвени очи"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+"Намалување или елиминирање на сите ефекти на црвени очи на фотографијата"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Прилагоди"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Прилагоди"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Прилагоди боја и тон на фотографијата"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Врати на оригиналот"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Врати на оригиналот"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Врати ги надворешните _уредувања"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Врати се на главната фотографија"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Постави како _позадина на работната површина"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Постави ја избраната слика како позадина на работната површина"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Постави како _слајдшоу на работната површина"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Врати"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Врати"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Повтори"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Повтори"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Пре_именувај настан ..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Направи ја како _клучна фотографија за настанот"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Направи ја како клучна фотографија за настанот"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Нов настан"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Нов настан"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Премести ги фотографиите"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Премести ги фотографиите на настанот"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Спој ги настаните"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Спој"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Постави рејтинг"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Постави рејтинг"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Промена на рејтингот на твојата фотографија"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Зголеми"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Зголеми рејтинг"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Намали"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Намали рејтинг"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Без рејтинг"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Оцени како нерангирани"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Поставување како без рејтинг"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Отстрани ги сите рејтинзи"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Отфрлено"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Оцени како отфрлено"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Поставување како отфрлено"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Постави го рејтингот на отфрлени"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Само отфрлени"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Само отфрлени"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Покажи ги само отфрлените фотографии"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Сите + _Отфрлени"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Прикажи ги сите фотографиите, вклучувајќи ги отфрлените"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Сите фотографии"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Прикажи ги сите фотографии"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Рејтинг"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Прикажи го рејтингот на секоја фотографија"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Филтрирање на фотографијата"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Филтрирање на фотографијата"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ограничи го бројот на фотографии прикажани врз основа на филтер"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Дупликат"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Дупликат"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Направи дупликат на фотографијата"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Извоз..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Печати..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Објави..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Објави"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Објавување на различни веб страници"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Прилагоди го датумот и времето..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Прилагоди го датумот и времето"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Додај _ознаки..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Додај ознаки"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Опции "
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Отвори со RA_W уредникот"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Испрати _на..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Обележи"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Отстрани _обележје"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Не е можно да го стартуваш уредникот: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Додај ознака '%s'"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Додади ознаки \"%s\" и \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Избриши ознака '%s' "
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Избриши ознака '%s'"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Избриши ознака"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Пре_именувај ја ознаката \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Преименувај ја ознаката \"%s\" во \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Измени ја ознаката..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Измени ја ознаката"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Означи ја фотографијата како \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Означи ја избраната фотографијата како \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Отстрани ја ознаката \"%s\" од _фотографијата"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Отстрани ја ознаката \"%s\" од фотографијата"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Не можам да ја преименувам ознаката во \"%s\", бидејќи ознаката веќе постои."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Оцени го %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Постави рејтинг на %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Поставување на рејтинг на %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Прикажи %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Покажи ги само фотографиите со рејтинг %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s или подобар"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Прикажи %s или подобар"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Покажи ги само фотографиите со рејтинг %s или подобар"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Отстрани ги избраните фотографии од ѓубрето"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Отстрани ги избраните фотографии од библиотеката"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Врати"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Премести ги избраните фотографии назад во библиотеката"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Прикажи "
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Отвори ја избраната папка со фотографии во менаџерот на датотеки"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Неможе да се отвори во менаџерот на датотеки: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Отстрани од библиотеката"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Премеси во ѓубрето"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Избери _се"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Избери ги сите предмети"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Ресетирај"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Врати се на тековната димензија на фотографијата"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Поставува отсечување за оваа фотографија "
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Ја врти рамката на отсекување на фотографијата во позиција пејзаж или "
+"портрет "
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Неограничено"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Квадрат"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Екран"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Оригинална големина"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD видео (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD видео (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Затвори ја алатката црвени очи "
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Отстрани ги сите ефекти на црвени очи во избраниот регион"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Заситување:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Нијанса:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Температура:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Сенки:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Ресетирај бои"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Ресетирај ги сите прилагодувања на боја за да се оригинални"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Температура"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Нијанса"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Заситеност"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Изложеност"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Сенки"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Спротивно на Експанзија"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Прикачи лента со алатки "
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Прикачување на лентата со алатки е отворено"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Напушти цел екран"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Напушти цел екран"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Напушти"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_За "
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Цел екран"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Содржина"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Настана фатална грешка кога се пристапуваше на библиотеката Shotwell. "
+"Shotwell не може да продолжи. \n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Посети ја веб-страницата на Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Mitko Krstev <m.krstev@hotmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Не можам да прикажам помош:%s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Оригинална големина"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ширина или висина"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ширина"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Висина"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Прилагоди ја големината на сликите"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Зголемување на големината на сликичките"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Намалување на големината на сликичките"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Подреди ги _фотографиите"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Пушти го видеото"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Отвори ги избраните видеа во системскиот видео плеер"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Прикажи ги ознаките за секоја слика"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "По _наслов"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Подреди ги фотографиите по наслов"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "По _датум на сликање"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Подреди ги фотографиите по датумот на сликање"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "По _рејтинг"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Подреди ги фотографиите по рејтинг"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr "Shotwell не беше во состојба да ги пушти одбраните видеа :%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Фотографии/Видеа"
+msgstr[1] "%d Фотографија/Видео"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Настани"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Без датум"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Нема настани"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Не можам да направам папка со податоци %s:%s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Слики"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Не можам да направам привремена папка %s:%s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Не можам да креирам подпапка со податоци %s:%s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Не можам да генерирам привремена датотека за %s:%s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Извезување"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Датотеката %s веќе постои. Дали да се замени?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Прескокни"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Замени"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Замени _се"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Извоз"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Слики"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Видеа"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Избраните фотографии/видеа беа успешно објавени."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Избраните видеа беа успешно објавени."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Избраните фотографии беа успешно објавени."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Собирам информации за сметката ..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Се пријавувам во .."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Објави фотографии"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Објавување на _фотографии во:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Објави видеа"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Објавување на _видеа во:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Објави фотографии и видеа"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Објавување на фотографии и видеа _во:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Подготовки за качување"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Качувам %d од %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Одбери друг сервис од менито за објавување на фотографии. "
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Привремената датотека која е потребна за објавување е недостапна"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Не си најавен во моментов во YouTube.\n"
+"За да продолжите мора да имате Google сметка која е поставена за користење "
+"со YouTube. Може да ја поставиш сметката со помош на твојот веб пребарувач "
+"за да влезеш во YouTube сајтот."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Најавени сте на YouTube како %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Јавно наведени"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Јавно ненаведени"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Приватно"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Веќе сте најавени во и надвор од Flickr во текот на оваа седница Shotwell. "
+"За да продолжи објавување на Фликр, цигарите и да го рестартирате Shotwell, "
+"тогаш обидете се повторно објавување."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Најавен си во Flickr како %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Твојата слободна Flickr сметка те ограничува колку податоци можеш да "
+"испратиш месечно. Овој месец имате %d мегабајти останато за качување."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Твојата Flickr Про сметка ви дава право на неограничено качување."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Фотографиите се _видливи за:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Видеата се _видливи за:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Фотографиите и видеа се _видливи за:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Сите"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Само пријателите и семејството"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Само јас"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 пиксели"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 пиксели"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 пиксели"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 пиксели"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell поврзување"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Креирање на албум..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Најавен си во Picasa Web Albums како %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Фотографиите ќе се појават во:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Мала (640 x 480 пиксели)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Средна (1024 x 768 пиксели)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Препорачана (1600 x 1200 пиксели)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Не си најавен во моментов во Фејсбук. \n"
+"Ако сеуште немаш Фејсбук сметка, може да се создаде за време на процесот. За "
+"време на пријавувањето, Shotwell поврзувањето може да ви побара дозвола за "
+"качување и објавување на фотографии. Овие дозволи се потребни за Shotwell "
+"поврзувањето да функционира."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Веќе си најавен и одјавен од Фејсбук во текот на оваа сесија Shotwell.\n"
+"За да продолжи објавувањето на Фејсбук, напушти го и рестартирај го "
+"Shotwell, и обиди се со повторно објавување."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Тестирање на поврзувањето со Фејсбук..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Најавен си на Фејсбук како %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Каде би сакал да ги објавиш избраните фотографии?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Постави како слајдшоу за работна површина"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Генерирање на слајдшоу позадина за работна површина"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Покажи ја секоја фотографија за"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "временски период"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"Колку долго секоја фотографија е прикажана на позадината на работната "
+"површина"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Користи _стандардна големина:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Користи _сопствена големина:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Запази го соодносот на фотографијата"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Излез на фотографијата како: "
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "пиксели по инч"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell опции"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "бело"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "црно"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Види ја папката на библиотеката за нови датотеки"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Метаподатоци"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"Напиши ознаки, наслови, и други _метаподатоци во датотеката за фотографии"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Покажи"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Увези фотографии во:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Позадина"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Надворешен _RAW уредник:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Надворешни уредници"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "секунди"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Пријави се"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Објави во _постоечкиот албум:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Создади _нов албум со име:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Видеата и новите фото албуми се видливи: "
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Одјави се"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Објави"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Големина на фотографија:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Постоечки албум: "
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Нов албум именуван:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Листа на албуми во јавната галерија "
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Големина на фотографија:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "_Подесување на приватност на видеата"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Не си најавен во моментов во Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 0000000..73eba2c
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,4559 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Ani Peter <apeter@redhat.com>, 2013
+# Ani Peter <peter.ani@gmail.com>, 2013
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-23 10:50+0000\n"
+"Last-Translator: Ani Peter <apeter@redhat.com>\n"
+"Language-Team: Malayalam (http://www.transifex.com/projects/p/shotwell/"
+"language/ml/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ml\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "%s എന്ന ഇവന്റ് "
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "ക്യാമറകള്‍"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "ക്യാമറ"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "അസംസ്കൃതം : ജേപെഗ് "
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"ക്യാമറയുമായുള്ള ബന്ധം വിച്ഛേദിക്കാന്‍ സാധിച്ചില്ല , ഫയല്‍ മാനേജറില്‍ നിന്നും ബന്ധം "
+"വിച്ഛേദിക്കാന്‍ ശ്രമിക്കൂ"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ഇറക്കുമതി ചെയ്തുകഴിഞ്ഞ ചിത്രങ്ങള്‍ മറയ്കുക"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "ഇറക്കുമതി ചെയ്യാത്ത ഫോട്ടോകള്‍ മാത്രം കാണിക്കുക"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "ഇറക്കുമതി തുടങ്ങുന്നു, ദയവായി കാത്തിരിക്കുക"
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_തലക്കെട്ടുകള്‍"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "ഓരോ ഫോട്ടോയുടേയും തലക്കെട്ട് കാണിക്കുക"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "തിരഞ്ഞെടുത്തവ ഇറക്കുമതി _ചെയ്യുക"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകള്‍ ലൈബ്രറിയിലേക്ക് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_എല്ലാം ഇറക്കുമതി ചെയ്യുക"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "എല്ലാ ഫോട്ടോകളും ലൈബ്രറിയിലേക്ക് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"ഷോട്ട്‌‌വെല്ലിനു ക്യാമറ ഉപയോഗിക്കുന്നതിനായി അതിനെ ഫയല്‍സിസ്റ്റത്തില്‍ നിന്ന് "
+"വിച്ഛേദിക്കേണ്ടതായിട്ടുണ്ട്. തുടരാമോ?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_ബന്ധം വിച്ഛേദിക്കുക"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "ദയവായി ക്യാമറയുമായുള്ള ബന്ധം വിച്ഛേദിക്കുക"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"ക്യാമറ മറ്റൊരു പ്രയോഗം ബന്ധിച്ചിരിക്കുകയാണ്. ബന്ധിക്കാതെ ഇരിക്കുമ്പോഴെ ഷോട്ട്‌‌വെല്ലിന് ക്യാമറ "
+"ഉപയോഗിക്കാന്‍ കഴിയൂ. ദയവായി ക്യാമറ ഉപയോഗിക്കുന്ന മറ്റു പ്രയോഗങ്ങള്‍ നിര്‍ത്തിവെക്കുക"
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "ക്യാമറ ഉപയോഗിക്കുന്ന മറ്റു പ്രയോഗങ്ങള്‍ ദയവായി നിര്‍ത്തുക"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"ക്യമറയില്‍ നിന്ന് തൊട്ടു മുന്‍പത്തേത് ശേഖരിക്കാന്‍ കഴിഞ്ഞില്ല : \n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "ബന്ധം വിച്ഛേദിക്കുന്നു... "
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ഫോട്ടോയുടെ വിവരങ്ങള്‍ ശേഖരിക്കുന്നു"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s നു വേണ്ടി തിരനോട്ടം ശേഖരിക്കുന്നു "
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "ക്യാമറ ബന്ധിക്കാന്‍ സാധിച്ചില്ല : %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ഈ ഫോട്ടോ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+msgstr[1] "%d ഫോട്ടോകള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ഈ ചലച്ചിത്രം ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+msgstr[1] "%d ചലച്ചിത്രങ്ങള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ഈ ഫോട്ടോ/ചലച്ചിത്രം ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+msgstr[1] " ഈ %d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "ഈ ഫയല്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+msgstr[1] "ഈ %d ഫയലുകള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യട്ടെ?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_സൂക്ഷിക്കുക"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "ഫോട്ടോകള്‍/വീഡിയോകള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യുന്നു."
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"ഒരു പിഴവു സംഭവിച്ചതിനാല്‍ %d എന്ന ഫോട്ടോ/ചലച്ചിത്രം ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യാന്‍ "
+"സാധിച്ചില്ല"
+msgstr[1] ""
+"ഒരു പിഴവു സംഭവിച്ചതിനാല്‍ %d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ക്യാമറയില്‍ നിന്ന് നീക്കം ചെയ്യാന്‍ "
+"സാധിച്ചില്ല"
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "സ്ലൈ_ഡ്ഷോ"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "ഒരു സ്ലൈഡ്ഷോ പ്രവര്‍ത്തിപ്പിക്കുക"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ഫോട്ടോ/ചലച്ചിത്രം കയറ്റുമതി ചെയ്യുക"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ കയറ്റുമതി ചെയ്യുക"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ഫോട്ടോ കയറ്റുമതി ചെയ്യുക "
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ഫോട്ടോകള്‍ കയറ്റുമതി ചെയ്യുക"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "കറക്കുക"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "കറക്കല്‍ നിരാകരിക്കുക"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "വിലങ്ങനെ അകമ്പുറം മറിക്കുക"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "വിലങ്ങനെ അകമ്പുറം മറിച്ചത് നിരാകരിക്കുക"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "കുത്തനെ അകമ്പുറം മറിക്കുക"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "കൂത്തനെ അകമ്പുറം മറിച്ചത് നിരാകരിക്കുക"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "എന്തെങ്കിലും എഴുത്ത്"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "തലക്കെട്ട്"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ടാഗ്"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "അഭിപ്രായം"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ഇവന്റിന്റെ പേര്"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ഫയലിന്റെ പേര്:"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "മീഡിയ തരം "
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "അടയാള സ്ഥിതി"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "ചിത്രത്തിന്റെ സ്ഥിതി"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "നിലവാരം"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "തിയ്യതി"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "അടങ്ങുന്നു"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "കൃത്യമായി "
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ഇതില്‍ തുടങ്ങുന്ന"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "അവസാനിക്കുന്നത്"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "അടങ്ങാത്തത്"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "സെറ്റ് ചെയ്തിട്ടില്ല"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "ആണ്"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "അല്ല"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "ഏതെങ്കിലും ഫോട്ടോ"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ഒരു റോ ഫോട്ടോ"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ഒരു ചലച്ചിത്രം"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "ഉണ്ടു്"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "ഇല്ല"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "വരുത്തിയ മാറ്റങ്ങള്‍"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "വരുത്തിയ ആന്തരിക മാറ്റങ്ങള്‍"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "വരുത്തിയ ബാഹ്യ മാറ്റങ്ങള്‍"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "മുദ്രവെച്ചവ"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "മുദ്രവെക്കാത്തവ "
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "കൂടുതല്‍ നല്ലതും"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "മാത്രം"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "കുറഞ്ഞതും"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "ശേഷമാണ്"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "മുന്‍പാണ്"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ഇടക്കാണ്"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "കൂടാതെ"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ഏതെങ്കിലും"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "എല്ലാം"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ഒന്നുമില്ല"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "സംരക്ഷിച്ച തിരച്ചിലുകള്‍"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "പുതി_യ സംരക്ഷിച്ച തിരച്ചില്‍"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറി ഷോട്ട്‌‌വെലിന്റെ ഈ പതിപ്പ് പിന്തുണക്കുന്നില്ല. അത് ഷോട്ട്‌‌വെല്‍ %s (സ്കീമ "
+"%d) ഉപയോഗിച്ച് നിര്‍മിച്ചതാണ്. ഈ പതിപ്പ് %s (സ്കീമ %d) ആണ്. ദയവായി ഷോട്ട്‌‌വെലിന്റെ പുതിയ "
+"പതിപ്പ് ഉപയോഗിക്കുക"
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"നിങ്ങളുടെ ഫോട്ടൊ ലൈബ്രറി വേര്‍ഷന്‍ %s (സ്കീമ %d)യില്‍ നിന്നും %s(സ്കീമ %d)യിലേക്ക് ഉയര്‍ത്താന്‍ "
+"ഷോട്ട്‌‌വെലിനു സാധിച്ചില്ല. കൂടൂതല്‍ വിവരങ്ങള്‍ക്ക് ഷോട്ട്‌‌വെല്‍ വിക്കി %s കാണുക "
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറി ഷോട്ട്‌‌വെലിന്റെ ഈ പതിപ്പ് പിന്തുണക്കുന്നില്ല. ഇത് ഷോട്ട്‌‌വെല്‍ %s (%d "
+"സ്കീമ ) ഉപയോഗിച്ച് സൃഷ്ടിച്ചതായി കാണുന്നു. ഈ പതിപ്പ് %s (%d സ്കീമ )ആണ്. ദയവായി %s "
+"മാച്ച്കളഞ്ഞ് നിങ്ങളുടെ ലൈബ്രറി വെടിപ്പാക്കുക , അതിനു ശേഷം ഫോട്ടോകള്‍ വീണ്ടും ഇറക്കുമതി ചെയ്യുക "
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "ഷോട്ട്‌വെല്‍ ഡാറ്റാബേസ് ഉറപ്പുവരുത്തുന്നതില്‍ പിഴവ് :%s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "ഷോട്ട്‌‌വെല്‍ ലോഡ് ചെയ്യുന്നു..."
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "ഷോട്ട്‌വെല്ലിന്റെ സ്വകാര്യ ഡേറ്റയിലേക്കുള്ള വഴി"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "മാറ്റങ്ങള്‍ക്കായി പ്രവര്‍ത്തന സമയത്തു് ലൈബ്രറി ഡയറക്ടറി നിരീക്ഷിക്കേണ്ടതില്ല"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "പ്രാരംഭത്തിലുള്ള പുരോഗതി കാണിയ്ക്കുന്ന മീറ്റര്‍ കാണിയ്ക്കരുതു്"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "പ്രയോഗത്തിന്റെ പതിപ്പു് കാണിയ്ക്കുക"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ഫയല്‍]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "'%s --help' ഉപയോഗിച്ച് ലഭ്യമായ കമാന്റ് ലൈന്‍ ഓപ്ഷനുകള്‍ കാണാവുന്നതാണ് . \n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "ഇന്നു്"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "ഇന്നലെ"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "തലക്കെട്ട്:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "ഇനങ്ങള്‍:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ഇവന്റ്"
+msgstr[1] "%d ഇവന്റുകള്‍"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ചിത്രം"
+msgstr[1] "%d ചിത്രങ്ങള്‍"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d ചലച്ചിത്രം"
+msgstr[1] "%d ചലച്ചിത്രങ്ങള്‍"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "തീയതി:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "സമയം:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "ഇവിടെ നിന്നും:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "എങ്ങോട്ട്:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "വലിപ്പം:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "ദൈര്‍ഘ്യം:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f സെക്കന്‍ഡുകള്‍"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "ഡവലപ്പര്‍ :"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "എക്സ്പോഷര്‍ :"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "സ്ഥലം:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ഫയലിന്റെ വലിപ്പം:‌‌"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "നിലവിലുള്ള പുരോഗതി: "
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "യഥാര്‍ത്ഥ അളവുകള്‍"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "ക്യാമറ നിര്‍മിതം : "
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "ക്യാമറ മോഡല്‍"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ഫ്ലാഷ്"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ഫോക്കല്‍ ലെങ്ങ്ത്"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "എക്സോപഷര്‍ തീയതി:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "എക്സ്പോഷര്‍ സമയം:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "എക്സ്പോഷര്‍ ബയസ്:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "ജിപിഎസ് അക്ഷാംശം: "
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "ജിപിഎസ് രേഖാംശം: "
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "കലാകാരന്‍/കലാകാരി:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "പകര്‍പ്പവകാശം:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "സോഫ്റ്റ്‌വെയര്‍:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "അഭിപ്രായം:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "വിശദവിവരങ്ങള്‍"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "ഇത് \"%s \" എന്ന ടാഗ് ഫോട്ടോയില്‍ നിന്ന് നീക്കം ചെയ്യും , തുടരട്ടെ?"
+msgstr[1] "ഇത് \"%s \" എന്ന ടാഗ് %d ഫോട്ടോകളില്‍ നിന്ന് നീക്കം ചെയ്യും , തുടരട്ടെ?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_റദ്ദാക്കുക"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_നീക്കം ചെയ്യുക"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "ഇത് \"%s\" എന്ന സംരക്ഷിച്ച് തിരച്ചില്‍ മായ്ചു കളയും , തുടരണോ?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"ഡെവലപ്പേഴ്സ് മാറ്റുന്നത് ഈ ഫോട്ടോയില്‍ ഷോട്ട്‌‌വെല്‍ ഉപയോഗിച്ച് നിങ്ങള്‍ വരുത്തിയ എല്ലാ മാറ്റങ്ങളും "
+"ഒഴിവാക്കും "
+msgstr[1] ""
+"ഡെവലപ്പേഴ്സ് മാറ്റുന്നത് ഈ ഫോട്ടോകളില്‍ ഷോട്ട്‌‌വെല്‍ ഉപയോഗിച്ച് നിങ്ങള്‍ വരുത്തിയ എല്ലാ മാറ്റങ്ങളും "
+"ഒഴിവാക്കും "
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_ഡെവലപ്പര്‍ മാറ്റുക"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ചലച്ചിത്രം കയറ്റുമതി ചെയ്യുക"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"%s ലേക്കു എഴുതാന്‍ താങ്കള്‍ക്ക് അനുമതിയില്ലാത്തതിനാല്‍ ഈ ഫോട്ടോ തിരുത്തുന്നതിനാവശ്യമായ ഒരു ഫയല്‍ "
+"സൃഷ്ടിക്കാന്‍ ഷോട്ട്‌‌വെല്ലിനു കഴിഞ്ഞില്ല"
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ഒരു ഫയല്‍ പിഴവു മൂലം താഴെപ്പറയുന്ന ഫോട്ടോ കയറ്റുമതി ചെയ്യാന്‍ സാധിച്ചില്ല \n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"കയറ്റുമതി ചെയ്യുന്നതു തുടരണോ?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_തുടരുക"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "തിരുത്താത്തവ"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "ഇപ്പോഴത്തേത്"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_ഫോര്‍മാറ്റ് "
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_ഗുണനിലവാരം"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_ആനുപാതിക നിയന്ത്രകം/പരിധി:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_പിക്സലുകള്‍"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "മെറ്റാഡാറ്റ കയറ്റുമതി ചെയ്യുന്നു"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "വിശദവിവരങ്ങള്‍ സൂക്ഷിയ്ക്കുക..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "വിശദവിവരങ്ങള്‍ സൂക്ഷിയ്ക്കുക"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(%d എണ്ണം കൂടി )\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "ഫലങ്ങളുടെ റിപോര്‍ട്ട് ഇംപോര്‍ട്ട് ചെയ്യുക"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ഫയല്‍ ഇംപോര്‍ട്ട് ചെയ്യുന്നതിനു് ശ്രമിച്ചു."
+msgstr[1] "%d ഫയലുകള്‍ ഇംപോര്‍ട്ട് ചെയ്യുന്നതിനു് ശ്രമിച്ചു."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "ഇവയില്‍, %d ഫയല്‍ വിജയകരമായി ഇംപോര്‍ട്ട് ചെയ്തിരിയ്ക്കുന്നു."
+msgstr[1] "ഇവയില്‍, %d ഫയലുകള്‍ വിജയകരമായി ഇംപോര്‍ട്ട് ചെയ്തിരിയ്ക്കുന്നു."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "ആവര്‍ത്തിച്ചുള്ള ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് ചെയ്തിട്ടില്ല:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "നിലവിലുള്ള മീഡിയാ വസ്തു ആര്‍ത്തിയ്ക്കുന്നു"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ക്യാമറ പിശകുകള്‍ കാരണം ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് ചെയ്തിട്ടില്ല:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "പിശക് സന്ദേശം:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"ഫയലുകള്‍ ഇംപോര്‍ട്ട് ചെയ്തിട്ടില്ല, കാരണം ഇവ ഫോട്ടോകള്‍ അല്ലെങ്കില്‍ വീഡിയോകളായി "
+"തിരിച്ചറിഞ്ഞിട്ടില്ല:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ഷോട്ട്‌വെല്ലിനു് തിരിച്ചറിയുവാന്‍ സാധ്യമാകുന്ന രീതിയിലല്ലാത്തതിനാല്‍ ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് "
+"ചെയ്തിട്ടില്ല:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"ഷോട്ട്‌വെല്ലിനു് ഈ ലൈബ്രറിയിലേക്കു് പകര്‍ത്തുവാന്‍ സാധ്യമല്ലാത്തതിനാല്‍ ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് "
+"ചെയ്തിട്ടില്ല:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s-നെ %s-ലേക്കു്\n"
+"\t പകര്‍ത്തുവാന്‍ സാധ്യമായില്ല"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "ഫയലുകളില്‍ തകരാറുള്ളതിനാല്‍ ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് ചെയ്തിട്ടില്ല:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "മറ്റു് കാരണങ്ങള്‍ കാരണം ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഇംപോര്‍ട്ട് ചെയ്തില്ല:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "ഒരു പകര്‍പ്പായ ഫോട്ടോ ഇറക്കുമതി ചെയ്തില്ല\n"
+msgstr[1] "%d പകര്‍പ്പായ ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്തില്ല\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 വീഡിയോയുടെ പകര്‍പ്പ് ഇറക്കുമതി ചെയ്തില്ല: \n"
+msgstr[1] "%d വീഡിയോയുടെ പകര്‍പ്പ് ഇറക്കുമതി ചെയ്തില്ല: \n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 ഫോട്ടോ/ചലച്ചിത്രം പകര്‍പ്പായതിനാല്‍ ഇറക്കുമതി ചെയ്തില്ല \n"
+msgstr[1] "%d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ പകര്‍പ്പായതിനാല്‍ ഇറക്കുമതി ചെയ്തില്ല \n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം 1 ഫോട്ടോ ഇറക്കുമതി ചെയ്യാന്‍ സാധിച്ചില്ല\n"
+msgstr[1] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം %d ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ സാധിച്ചില്ല \n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം 1 ചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം %d ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം 1 ഫോട്ടോചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം %d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം 1 ഫയല്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ഹാര്‍ഡ്‌‌വെയര്‍ പിഴവുമൂലം %d ഫയലുകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ 1 ഫോട്ടോ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ %d ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ "
+"കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ 1 ചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ "
+"കഴിഞ്ഞില്ല \n"
+msgstr[1] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ %d ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യാന്‍ "
+"കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ 1 ഫോട്ടോ/ചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ "
+"കഴിഞ്ഞില്ല \n"
+msgstr[1] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ %d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി "
+"ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ 1 ഫയല്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] ""
+"ഫോട്ടോ ലൈബ്രറി ഫോള്‍ഡറില്‍ എഴുതാന്‍ കഴിയാത്തതിനാല്‍ %d ഫയലുകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "ക്യാമറ പിഴവുകാരണം 1 ഫോട്ടോ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ക്യാമറ പിഴവുകാരണം %d ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "ക്യാമറ പിഴവുകാരണം 1 ചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ക്യാമറ പിഴവുകാരണം %d ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "ക്യാമറ പിഴവുകാരണം 1 ഫോട്ടോ/ചലച്ചിത്രം ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ക്യാമറ പിഴവുകാരണം %d ഫോട്ടോകള്‍ /ചലച്ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "ക്യാമറ പിഴവുകാരണം 1 ഫോട്ടോ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+msgstr[1] "ക്യാമറ പിഴവുകാരണം %d ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല \n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "ഒരു ചിത്രത്തിനു് തകരാറുള്ളതിനാല്‍ അതു് ഇറക്കുമതി ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു:\n"
+msgstr[1] "%d ചിത്രങ്ങളില്‍ തകരാറുള്ളതിനാല്‍ അതു് ഇറക്കുമതി ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "ഒരു വീഡിയോയില്‍ തകരാറുള്ളതിനാല്‍ അതു് ഇറക്കുമതി ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു:\n"
+msgstr[1] "%d വീഡിയോയില്‍ തകരാറുള്ളതിനാല്‍ അതു് ഇറക്കുമതി ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 പിന്തുണക്കാത്ത ഫോട്ടോ ഒഴിവാക്കി \n"
+msgstr[1] "%d പിന്തുണക്കാത്ത ഫോട്ടോകള്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 ചിത്രമല്ലാത്ത ഫയല്‍ ഒഴിവാക്കി \n"
+msgstr[1] "%d ചിത്രമല്ലാത്ത ഫയലുകള്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 ഫോട്ടോ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+msgstr[1] "%d ഫോട്ടോകള്‍ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 ചലച്ചിത്രം ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+msgstr[1] "%d ചലച്ചിത്രങ്ങള്‍ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 ഫോട്ടോ/ചലച്ചിത്രം ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+msgstr[1] "%d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 ഫയല്‍ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+msgstr[1] "%d ഫയലുകള്‍ ഉപയോക്താവ് നിരാകരിച്ചതിനാല്‍ ഒഴിവാക്കി \n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 ഫോട്ടോ വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+msgstr[1] "%d ഫോട്ടോകള്‍ വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 ചലച്ചിത്രം വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+msgstr[1] "%d ചലച്ചിത്രങ്ങള്‍ വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 ഫോട്ടോ/വീഡിയോ വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+msgstr[1] "%d ഫോട്ടോകള്‍ /വീഡിയോകള്‍ വിജയകരമായി ഇറക്കുമതി ചെയ്തു \n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "ഒരു ഫോട്ടോയോ ചലച്ചിത്രമോ ഇറക്കുമതി ചെയ്തില്ല \n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "ഇറക്കുമതി പൂര്‍ത്തിയാക്കി"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d സെക്കന്റ്"
+msgstr[1] "%d സെക്കന്റുകള്‍"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d മിനിറ്റ്"
+msgstr[1] "%d മിനിറ്റുകള്‍"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d മണിക്കൂര്‍"
+msgstr[1] "%d മണിക്കൂറുകള്‍"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ദിവസം"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "ഇവന്റിന്റെ പേരു മാറ്റുക"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "പേരു്:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "തലക്കെട്ടു തിരുത്തുക"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "ഇവന്റിനെപ്പറ്റിയുള്ള അഭിപ്രായം ചിട്ടപ്പെടുത്തുക"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "ചിത്രം/വിഡിയോയുടെ അഭിപ്രായം ചിട്ടപ്പെടുത്തുക"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "‌_ഫയല്‍ ചവറ്റുകൊട്ടയിലിടുക "
+msgstr[1] "‌‌_ഫയലുകള്‍ ചവറ്റുകൊട്ടയിലിടുക"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_നീക്കം ചെയ്യല്‍ മാത്രം"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "ബാഹ്യ തിരുത്തല്‍ എടുത്തുകളയട്ടെ?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "ബാഹ്യ തിരുത്തലുകള്‍ എടുത്തുകളയട്ടെ?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "ബാഹ്യഫയലിനു വരുത്തിയ മാറ്റങ്ങള്‍ നഷ്ടപ്പെടാന്‍ ഇതു കാരണമാകും . തുടരണോ?"
+msgstr[1] "%d ബാഹ്യഫയലുകള്‍ക്ക് വരുത്തിയ മാറ്റങ്ങള്‍ നഷ്ടപ്പെടാന്‍ ഇതു കാരണമാകും . തുടരണോ?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "ബാ_ഹ്യ തിരുത്തല്‍ എടുത്തുകളയുക"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "ബാ_ഹ്യ തിരുത്തലുകള്‍ എടുത്തുകളയുക"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ഇങ്ങനെ ചെയ്യുന്നതു ഫോട്ടോ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യാന്‍ കാരണമാകും . തുടരണോ?"
+msgstr[1] ""
+"ഇങ്ങനെ ചെയ്യുന്നതു %d ഫോട്ടോകള്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യാന്‍ കാരണമാകും . തുടരണോ?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ഫോട്ടോ ലൈബ്രറിയില്‍ നിന്ന് കളയുക"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "ഫോട്ടോകള്‍ ലൈബ്രറിയില്‍ നിന്ന് കളയുക"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "രാവിലെ"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "ഉച്ചകഴിഞ്ഞ്"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 മണിക്കൂര്‍"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "ഇതേ മൂല്യത്തില്‍ ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ _ഷിഫ്റ്റ് ചെയ്യുക"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "എല്ലാ ഫോട്ടോകളും / വീഡിയോകളും ഈ സമയത്തേക്ക് ക്രമീകരിക്കുക"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_യഥാര്‍ത്ഥ ഫോട്ടോ ഫയല്‍ തിരുത്തുക"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_യഥാര്‍ത്ഥ ഫോട്ടോ ഫയലുകള്‍ തിരുത്തുക"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_യഥാര്‍ത്ഥ ഫയല്‍ തിരുത്തുക"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_യഥാര്‍ത്ഥ ഫയലുകള്‍ തിരുത്തുക"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "ശരിക്കുമുള്ളത്:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"എക്സ്പോഷര്‍ സമയം താഴെ കൊടുത്ത സമയമാകുമ്പോള്‍ മുന്നോട്ടാക്കും \n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"എക്സ്പോഷര്‍ സമയം താഴെ കൊടുത്ത സമയമാകുമ്പോള്‍ തിരിച്ചാക്കും \n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ദിവസം"
+msgstr[1] "ദിവസങ്ങള്‍"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "മണിക്കൂര്‍"
+msgstr[1] "മണിക്കൂറുകള്‍"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "മിനിട്ട്"
+msgstr[1] "മിനിട്ടുകള്‍"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "സെക്കന്റ്"
+msgstr[1] "സെക്കന്റുകള്‍"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"കൂടാതെ %d വേറെയും "
+msgstr[1] ""
+"\n"
+"\n"
+"കൂടാതെ %d വേറെയും "
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "ടാഗുകള്‍ (കോമ ഉപയോഗിച്ച് വേര്‍തിരിച്ചത്):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "സ്വാഗതം!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "ഷോട്ട്‌‌വെല്ലിലേക്ക് സ്വാഗതം!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "തുടങ്ങാനായി, താഴെപറയുന്ന ഏതെങ്കിലും രീതി ഉപയോഗിച്ച് ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യുക: "
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"<span weight=\"bold\">ഫോള്‍ഡറില്‍ നിന്നും %s ഇറക്കുമതി ചെയ്യാന്‍ </span> തിരഞ്ഞെടുക്കുക"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "ഫോട്ടോകള്‍ ഷോട്ട്‌‌വെല്‍ ജാലകത്തിലേക്ക് വലിച്ചിടുക"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "ക്യാമറ നിങ്ങളുടെ കമ്പ്യൂട്ടറുമായി ബന്ധിപ്പിച്ച് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_നിങ്ങളുടെ %s ഫോള്‍ഡറില്‍ നിന്നും ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യുക"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "ഇപ്പറഞ്ഞ ഏതെങ്കിലും രീതികളിലും താങ്കള്‍ക്ക് ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാവുന്നതാണ്"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ഈ സന്ദേശം ഇനി കാണിക്കരുതു്"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "%s ലൈബ്രറിയില്‍ നിന്നും ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യുക"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(സഹായം)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "വര്‍ഷം%sമാസം%sദിവസം"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "വര്‍ഷം%sമാസം"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "വര്‍ഷം%sമാസം-ദിവസം"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "വര്‍ഷം-മാസം-ദിവസം"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "ഇച്ഛാനുസൃതം"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "സാധുവല്ലാത്ത ക്രമരൂപം"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"ഷോട്ട്‌‌വെല്ലിന് ഫോട്ടോകളെ നിങ്ങളുടെ ലൈബ്രറിയിലേക്ക് കോപ്പി ചെയ്യാനും , കോപ്പി ചെയ്യാതെ തന്നെ "
+"ഇറക്കുമതി ചെയ്യാനും കഴിയും. "
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ഫോട്ടോകളുടെ പകര്‍പ്പു_കള്‍ എടുക്കുന്നു"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_ഇനി പറയുന്ന സ്ഥലത്തേക്ക് ഇറക്കുമതി ചെയ്യുക "
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "ലൈബ്രറിയിലേക്ക് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യുക "
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യുന്നു"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "ഫോട്ടോകള്‍ ലൈബ്രറിയില്‍ നിന്നും നീക്കം ചെയ്യുന്നു"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ ഫോട്ടോ/ചലച്ചിത്രം ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യപ്പെടും , "
+"ഒപ്പം ഈ ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+msgstr[1] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ %d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം "
+"ചെയ്യപ്പെടും , ഒപ്പം ഈ ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ ചലച്ചിത്രം ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യപ്പെടും , ഒപ്പം ഈ "
+"ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+msgstr[1] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ %d ചലച്ചിത്രങ്ങള്‍ ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യപ്പെടും , "
+"ഒപ്പം ഈ ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ ഫോട്ടോ ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യപ്പെടും , ഒപ്പം ഈ "
+"ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+msgstr[1] ""
+"ഇങ്ങനെ ചെയ്യുന്നതിലൂടെ %d ഫോട്ടോകള്‍ ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യപ്പെടും , ഒപ്പം "
+"ഈ ഫയല്‍ ഡെസ്ക്ടോപ്പ് ചവറ്റുകുട്ടയിലേക്കു കൂടി നീക്കണോ?\n"
+"ഒരിക്കല്‍ ചെയ്താല്‍ അതു തിരസ്കരിക്കാന്‍ കഴിയില്ല "
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ഈ ഫോട്ടോ അഥവാ വീഡിയോ ഡെസ്ക്ടോപ്പിലെ ചവറ്റുകുട്ടിയിലിടാന്‍ കഴിഞ്ഞില്ല. ഈ ഫയല്‍ മായ്കണോ? "
+msgstr[1] ""
+"%d ഫോട്ടോകള്‍/വീഡിയോകള്‍ ഡെസ്ക്ടോപ്പിലെ ചവറ്റുകുട്ടിയിലിടാന്‍ കഴിഞ്ഞില്ല. ഈ ഫയല്‍ മായ്കണോ? "
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ഈ ഫോട്ടോ/ചലച്ചിത്രം മായ്കാന്‍ സാധ്യമല്ല"
+msgstr[1] "%d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍ മാക്കാന്‍ കഴിയില്ല"
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "ഫോള്‍ഡറുകള്‍"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ടാഗുകള്‍"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "വിജയിച്ചു"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ഫയലില്‍ പിഴവ്"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ഫയല്‍ ഡീക്കോഡ്‌ ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ഡാറ്റാബേസ് പിഴവ് "
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ഇറക്കുമതി ഉപയോക്താവ് ഉപേക്ഷിച്ചു"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ഇതൊരു ഫയലല്ല"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ഫയല്‍ ഡാറ്റാബേസില്‍ ഉള്ളതാണ്"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "പിന്തുണക്കാത്ത ഫയല്‍ ഫോര്‍മാറ്റ്"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ഇതൊരു ചിത്ര ഫയല്‍ അല്ല"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ഡിസ്ക് പിഴവ്"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ഡിസ്ക് നിറഞ്ഞിരിക്കുന്നു"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "ക്യാമറയില്‍ പിഴവ്"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ഫയല്‍ എഴുതുന്നതില്‍ പിഴവ്"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "തെറ്റായ ചിത്ര ഫയല്‍"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "ഇറക്കുമതിചെയ്തത് പരാജയപ്പെട്ടു (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "പരിഷ്കരിച്ചു"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "പുറകിലത്തെ ഫോട്ടോ"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "അടുത്ത ഫോട്ടോ"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ഫോട്ടോയുടെ ശ്രോതസ്സ് കണ്ടെത്താനായില്ല : %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_കാണുക"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_പണിയായുധങ്ങള്‍"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_കഴിഞ്ഞ ഫോട്ടോ"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "‌_മുമ്പുള്ള ഫോട്ടോ"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_അടുത്ത ഫോട്ടോ"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "അടുത്ത ഫോട്ടോ"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_വലുതാക്കുക"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ഫോട്ടോയുടെ പര്‍വതീകരണം കൂട്ടുക"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_ചെറുതാക്കുക"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ഫോട്ടോയുടെ പര്‍വതീകരണം കുറക്കുക"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "‌_പേജില്‍ കൊള്ളിക്കുക"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "സ്ക്രീനില്‍ പാകത്തിനു കാണിക്കുന്നതിനായി ഫോട്ടോ പര്‍വതീകരിക്കുക"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_100% വലുതാക്കുക"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "100% പര്‍വതീകരിക്കാനായി ഫോട്ടോ വലുതാക്കുക"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_200% വലുതാക്കുക"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "200% പര്‍വതീകരണത്തിനായി ഫോട്ടോ വലുതാക്കുക"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_ഡെവെലപ്പര്‍"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s കയറ്റുമതി ചെയ്യാന്‍ കഴിഞ്ഞില്ല : %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ഡാറ്റാബേസ് "
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "ഒരു പിഴവു സംഭവിച്ചതിനാല്‍ %s ല്‍ നിന്ന് ഇറക്കുമതി ചെയ്യാന്‍ സാധ്യമല്ല"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"മറ്റൊരു സേവനത്തില്‍ നിന്ന് ഇറക്കുമതി ചെയ്യാന്‍ മുകളിലെ മെനുവില്‍ നിന്ന് ഒരെണ്ണം തിരഞ്ഞെടുക്കുക "
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "ഡാറ്റ ഇറക്കുമതി "
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr "നിങ്ങള്‍ ഒരു ഡാറ്റാ ഇറക്കുമതി പ്ലഗ്ഗിനും ഉപയോഗസജ്ജമാക്കിയിട്ടില്ല"
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ഡാറ്റാബേസ് ഫയല്‍:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_ഇറക്കുമതി"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "പ്രയോഗത്തില്‍ നിന്നും ഇറക്കുമതി ചെയ്യുക"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "പാട്ടുകളും പടങ്ങളും ഇവിടെ നിന്ന് ഇറക്കുമതി ചെയ്യുക:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_അടക്കുക"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "സജ്ജീകരണങ്ങള്‍"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "സ്ലൈഡ്ഷോ"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "പുറകോട്ട്"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "മുമ്പുള്ള ഫോട്ടോയിലേക്ക് പോകുക"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "ഇടവേള"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "സ്ലൈഡ്ഷോ താത്കാലികമായി നിര്‍ത്തുക"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "അടുത്തത്"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "അടുത്ത ഫോട്ടോയിലേക്ക് പോകുക"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "സ്ലൈഡ്ഷോ ക്രമീകരണങ്ങള്‍ മാറ്റുക"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ഒരു ഫോട്ടോകളുടെയും സോഴ്സ്ഫയലുകള്‍ ലഭ്യമല്ല"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "പ്രവര്‍ത്തിപ്പിക്കുക"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "സ്ലൈഡ്ഷോ തുടരുക"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "പൂര്‍വ്വസ്ഥിതിയിലാക്കുന്നു"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "വരുത്തിയ മാറ്റങ്ങള്‍ ഒഴിവാക്കണമോ?"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "പരിഷ്കരിക്കുക"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "പരിഷ്കരിച്ചത് തിരസ്കരിക്കുക"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "ഒരു പുതിയ ഇവന്‍റ് ഉണ്ടാക്കുന്നു"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ഇവന്റ് നീക്കം ചെയ്യുക"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ചിത്രങ്ങള്‍ ഒരു പുതിയ ഇവന്റിലേക്ക് മാറ്റുക "
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ചിത്രങ്ങള്‍ പഴയ ഇവന്റിലേക്ക് സെറ്റ് ചെയ്യുക"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "ലയിപ്പിക്കുക"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "വേര്‍പെടുത്തുക"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "അപര ചിത്രങ്ങള്‍"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "ചിത്രങ്ങളുടെ പകര്‍പ്പുകള്‍ നീക്കം ചെയ്യുന്നു "
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ഫയല്‍ പിഴവുകാരണം ഫോട്ടോയുടെ പകര്‍പ്പുണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു"
+msgstr[1] "ഫയല്‍ പിഴവുകള്‍ കാരണം %d ഫോട്ടോകളുടെ പകര്‍പ്പുണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "പഴയ നിലവാരം പുനസ്ഥാപിക്കുക"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "നിലവാരം കൂട്ടുന്നു"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "നിലവാരം കുറക്കുന്നു"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW വികസനം സജ്ജമാക്കുന്നു"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "പഴയ RAW വികസന ക്രമീകരണം പുനസ്ഥാപിക്കുന്നു"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "ഡെവലപ്പര്‍ സജ്ജമാക്കുക"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "യഥാര്‍ത്ഥ ചിത്രം ക്രമീകരിക്കാന്‍ കഴിഞ്ഞില്ല "
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "തിയ്യതിയും സമയവും തിരുത്തുന്നു"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "തിയ്യതിയും സമയവും ക്രമീകരിച്ചത് പൂര്‍വസ്ഥിതിയിലാക്കുന്നു"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ഒരു യഥാര്‍ത്ഥ ഫോട്ടോ ക്രമീകരിക്കാന്‍ കഴിഞ്ഞില്ല"
+msgstr[1] "ഈ യഥാര്‍ത്ഥ ഫോട്ടോകള്‍ ക്രമീകരിക്കാന്‍ കഴിഞ്ഞില്ല"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "സമയക്രമീകരണത്തില്‍ പിഴവ്"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "ഈ ഫോട്ടോഫയലില്‍ സമയക്രമീകരണം പുനസ്ഥാപിക്കാന്‍ കഴിഞ്ഞില്ല"
+msgstr[1] "ഈ ഫോട്ടോഫയലുകളില്‍ സമയക്രമീകരണം പുനസ്ഥാപിക്കാന്‍ കഴിഞ്ഞില്ല"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ടാഗ് നിര്‍മിക്കുക"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" എന്ന ടാഗ് ഇവിടെ നിന്നും മാറ്റുക"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "-ചിത്രങ്ങള്‍ ചവറ്റുകുട്ടയിലേക്ക് നീക്കുക"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ഫോട്ടോകള്‍ ചവറ്റുകുട്ടയില്‍ നിന്നും തിരിച്ചെടുക്കുക"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ഫോട്ടോകള്‍ ഷോട്ട്‌‌വെലിന്റെ ചവറ്റുകുട്ടയിലേക്ക് നീക്കുക"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ഫോട്ടോകള്‍ ഷോട്ട്‌‌വെല്‍ ലൈബ്രറിയിലേക്ക് പുനസ്ഥാപിക്കുക"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ചിത്രങ്ങള്‍ ചവറ്റുകുട്ടയിലേക്കു് നീക്കുന്നു"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "ചവറ്റുകുട്ടയില്‍ നിന്ന് ഫോട്ടോകള്‍ തിരിച്ചെടുക്കുന്നു "
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകള്‍ മുദ്രവെക്കുക "
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകളില്‍ നിന്ന് മുദ്ര ഒഴിവാക്കുക "
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "തെരഞ്ഞെടുത്ത ചിത്രങ്ങള്‍ മുദ്രവെയ്ക്കുന്നു"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകളില്‍ നിന്ന് മുദ്ര ഒഴിവാക്കുന്നു"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "മുദ്രവെക്കുക "
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "മുദ്ര കളയുക "
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "അസംസ്കൃതം "
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "ഷോട്ട്‌‌വെല്‍"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "ബിഎംപി"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "ജെപെഗ്"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "കുറവ്(%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "ഇടത്തരം(%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "ഉയര്‍ന്ന(%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "പരമാവധി (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "പിഎന്‍ജി"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "ടിഫ്"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "ഒരു ഫോട്ടോയും/വീഡിയോയും ഇല്ല "
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "ഒരു ഫോട്ടോയും/വീഡിയോയും കണ്ടില്ല"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ഈ ഡയറക്റ്ററിയിലേക്ക് ഫോട്ടോകള്‍ കയറ്റുമതി ചെയ്യാന്‍ കഴിയില്ല"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "നിരീക്ഷണ പുതുക്കലുകള്‍ ചെയ്യാന്‍ സാധ്യമല്ല : %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "മുഴുവന്‍ ഫയലും നിറക്കുക"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ഒരു പേജില്‍ 2 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ഒരു പേജില്‍ 4 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ഒരു പേജില്‍ 6 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ഒരു പേജില്‍ 8 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ഒരു പേജില്‍ 16 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ഒരു പേജില്‍ 32 ചിത്രങ്ങള്‍"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "അകത്ത്"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "സെമീ"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "മടിശീല (2x3 ഇഞ്ച്)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "കുറിപ്പുചട്ട (3x5 ഇഞ്ച്)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 ഇഞ്ച്."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 ഇഞ്ച്"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr ".8 x 10 ഇഞ്ച്."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 ഇഞ്ച്."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 ഇഞ്ച്."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "മെട്രിക്ക് മടിശീല (9x13 സെമീ)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "പോസ്റ്റ്കാര്‍ഡ്(10x15 സെമീ)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 സെ.മീ"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 സെമീ"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr ".20 x 30 സെമീ."
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 സെമീ"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr ".30 x 40 സെമീ. "
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ചിത്രങ്ങളുടെ ക്രമീകരണം"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "പ്രിന്‍റ് ചെയ്യുന്നു..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ഫോട്ടോ പ്രിന്റ് ചെയ്യാന്‍ സാധിച്ചില്ല: \n"
+"\n"
+"%s "
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "%s എന്ന ഫോട്ടോ ഡാറ്റാബേസ് തുറക്കാന്‍/നിര്‍മിക്കാന്‍ സാധിച്ചില്ല : എറര്‍ കോഡ് %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ഡാറ്റാബേസ് ഫയലിലേക്ക് ഫോട്ടോ ചേര്‍ക്കാന്‍ സാധിച്ചില്ല : \n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ഡാറ്റാബേസ് ഫയല്‍ ഉപയോഗിക്കാന്‍ ശ്രമിക്കുന്നതില്‍ പിഴവ്:\n"
+"%s\n"
+"\n"
+"പിഴവ്:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "ചലച്ചിത്രങ്ങള്‍ കയറ്റുമതി ചെയ്യുക "
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "നോട്ടിലസ് സെന്റ്-റ്റു തുറക്കാന്‍ കഴിഞ്ഞില്ല : %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "അയയ്ക്കേണ്ടത്:"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "പ്ശ്ചാത്തലം %s ലേക്ക് കയറ്റുമതി ചെയ്യാന്‍ സാധിച്ചില്ല : %s "
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ഡെസ്ക്ടോപ്പ് സ്ലൈഡ്ഷോ തയാറാക്കാന്‍ കഴിഞ്ഞില്ല : %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "മുദ്രവെച്ചവ"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ചവറ്റുകുട്ട"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ചവറ്റുകുട്ട കാലിയാണ്"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "നീക്കം ചെയ്യുക"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ഫോട്ടോകള്‍ കളയുന്നു..."
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "കാണാത്ത ഫയലുകള്‍"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "...കളയുന്നു"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "അവസാനത്തെ ഇറക്കുമതി "
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ഫോള്‍ഡറില്‍ നിന്ന് _ഇറക്കുമതി ചെയ്യുക..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ഡിസ്കില്‍ നിന്നും ഫോട്ടോകള്‍ ലൈബ്രറിയിലേക്ക് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "പ്രയോഗത്തില്‍ നിന്നും ഇ_റക്കുമതി ചെയ്യുക..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_ഇവന്റുകള്‍ ക്രമീകരിക്കുക"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ചവറ്റുകൊട്ട _കാലിയാക്കുക"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "ചവറ്റുകൊട്ടയിലെ എല്ലാ ഫോട്ടോകളും നീക്കം ചെയ്യുക "
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ഫോട്ടോയുടെ ഇവന്റ് കാ_ണുക"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_കണ്ടെത്തുക"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "തിരയുന്നതിനുള്ള മാനദണ്ഡമനുസരിച്ച് ഫോട്ടോകള്‍ കണ്ടെത്തുക "
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_ഫയല്‍"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "‌_തിരുത്തുക"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_ഫോട്ടോ "
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_ചിത്രങ്ങള്‍"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ഇവന്റു_കള്‍ "
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ടാഗുക_ള്‍"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_സഹായം"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_പ്രാധമിക വിവരങ്ങള്‍ "
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "തിരഞ്ഞെടുക്കുന്നതിനായി പ്രാധമികവിവരങ്ങള്‍ കാണിക്കുക"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "കൂടുതല്‍ വി_വരങ്ങള്‍"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "തിരഞ്ഞെടുത്തതിന്റെ കൂടുതല്‍ വിവരങ്ങള്‍ കാണിക്കുക"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_തിരച്ചില്‍ പട്ട"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "തിരച്ചില്‍ പട്ട കാണിക്കുക"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_വശത്തുള്ള പാളി"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "വശത്തുള്ള പാളി കാണിയ്ക്കുക"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_ആരോഹണം"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "ഫോട്ടോകള്‍ ആരോഹണക്രമത്തില്‍ അടുക്കുക"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "അ_വരോഹണം"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "ഫോട്ടോകള്‍ അവരോഹണ ക്രമത്തില്‍ അടുക്കുക"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ഫോള്‍ഡറില്‍ നിന്ന് ഇറക്കുമതി ചെയ്യുക"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ചവറ്റുകൊട്ട കാലിയാക്കുക"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "...ചവറ്റുകൊട്ട കാലിയാക്കുന്നു"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"നിങ്ങളുടെ ഹോം‌ ഡയറക്റ്ററിയിലേക്ക് ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ ഷോട്ട്‌‌വെലിനെ "
+"ക്രമീകരിച്ചിരിക്കുന്നു \n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "ലൈബ്രറി സ്ഥലം"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ഈ ഡയറക്റ്ററിയില്‍ നിന്ന് ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യാന്‍ സാധിക്കില്ല"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "ലൈബ്രറി നവീകരിക്കുന്നു..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "ഫോട്ടോകള്‍ താനേ ഇറക്കുമതി ചെയ്യാന്‍ തയാറെടുക്കുന്നു... "
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "ഫോട്ടോകള്‍ താനേ ഇറക്കുമതി ചെയ്യുന്നു..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "ഫയലുകളിലേക്ക് മെറ്റാഡാറ്റ ചേര്‍ക്കുന്നു..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ലൈബ്രറി"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "ഇറക്കുമതി ചെയ്യുന്നു..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ഇറക്കുമതി _നിര്‍ത്തുക"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ഫോട്ടോകള്‍ ഇറക്കുമതി ചെയ്യുന്നത് നിര്‍ത്തുക"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "ഇറക്കുമതി ചെയ്യാന്‍ തയാറെടുക്കുന്നു"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "ഇറക്കുമതി ചെയ്തു %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_സൂക്ഷിയ്ക്കുക"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ഫോട്ടോ സംരക്ഷിക്കുക"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "ഈരീതിയില്‍ _സൂക്ഷിക്കുക..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ചിത്രം മറ്റൊരു പേരില്‍ സൂക്ഷിയ്ക്കുക"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+"നിങ്ങളൂടെ കമ്പ്യൂട്ടറുമായി ബന്ധിപ്പിച്ചിട്ടുള്ള ഒരു പ്രിന്റഉപയോഗിച്ച് ഈ ഫോട്ടോ പ്രിന്റ് ചെയ്യുക."
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s നിലവിലില്ല "
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ഒരു ഫയലല്ല "
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s %s എന്ന ഫയല്‍ഫോര്‍മാറ്റ് സപ്പോര്‍ട്ട് ചെയ്യുന്നില്ല. "
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_ഒരു പതിപ്പ് സൂക്ഷിച്ചുവെക്കുക"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s നുശേഷമുള്ള മാറ്റങ്ങള്‍ നശിപ്പിക്കട്ടെ?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "സംരക്ഷിക്കാതെ _അടക്കുക"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s ലേക്ക് സൂക്ഷിക്കുന്നതില്‍ പിഴവ് : %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "ഇങ്ങനെ സംരക്ഷിക്കുക"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s നിരീക്ഷിക്കാന്‍ കഴിയില്ല : ഒരു ഡയറക്റ്ററി അല്ല (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ചിത്ര പാലകന്‍"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ചിത്രദര്‍ശിനി"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "പകര്‍പ്പവകാശം 2009-2013 യോര്‍ബാ ഫൌണ്ടേഷന്‍"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "വലത്തോട്ട് _തിരിക്കുക"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "തിരിക്കുക"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "വലത്തോട്ട് തിരിക്കുക"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "കഫോട്ടോകള്‍ വലത്തോട്ട് കറക്കുക (ഇടത്തോട്ട് കറക്കാന്‍ Cntrl ഞെക്കുക)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "_ഇടത്തേക്ക് തിരിയ്ക്കുക"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "ഇടത്തേക്ക് തിരിയ്ക്കുക"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ഫോട്ടോകള്‍ ഇടത്തോട്ട് കറക്കുക"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "വിലങ്ങനെ അക_മ്പുറം മറിക്കുക"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "വിലങ്ങനെ അകമ്പുറം മറിക്കുക "
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "വിലങ്ങനെ അകമ്പുറം _മറിക്കുക"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "കുത്തനെ അകമ്പുറം മറിക്കുക"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_മെച്ചപ്പെടുത്തുക"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "മെച്ചപ്പെടുത്തുക"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "ഫോട്ടോയുടെ പുറംകാഴ്ച താനേ മെച്ചപ്പെടുത്തുക"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_മുറിക്കുക"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "മുറിക്കുക"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ഫോട്ടോയുടെ വലുപ്പം ക്രോപ്പ് ചെയ്യുക"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "ക_നേരെയാക്കു"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "കനേരെയാക്കു"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "കഈ ഫോട്ടോ നേരെയാക്കു"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_ചെങ്കണ്ണ്"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "ചെങ്കണ്ണ് "
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "കഈ ഫോട്ടോയിലുള്ള ചെങ്കണ്ണ് പ്രതീതി കുറക്കുകയോ ഇല്ലാതാക്കുകയോ ചെയ്യുക"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "‌_അനുയോജ്യമാക്കുക "
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "കക്രമീകരിക്കു"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "കഫോട്ടോയുടെ നിറവും നിറഭേദവും ക്രമീകരിക്കു"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_നിലവിലുള്ളതാക്കുക"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "നിലവിലുള്ളതാക്കുക"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "കബാഹ്യതിരുത്തലുകള്‍ നിരാകരിക്കു"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "കതുടങ്ങിയ നിലയിലേക്ക് പുനസ്ഥാപിക്കു"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ഡെസ്ക്ടോപ്പ് _പശ്ചാത്തലമാക്കുക"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "തിരഞ്ഞെടുത്ത ചിത്രം ഡെസ്ക്ടോപ്പ് പശ്ചാത്തലമാക്കുക"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "ഡെസ്ക്ടോപ്പ് സ്ലൈഡ്ഷോ ആക്കി വെക്കുക..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_തിരസ്കരിക്കുക"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "തിരസ്കരിക്കുക"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "വീണ്ടും _ചെയ്യുക"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "വീണ്ടും ചെയ്യുക"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "ഇവന്റിന്റെ പേ_രു മാറ്റുക "
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "ഇവന്റിന്റെ _പ്രധാന ഫോട്ടോ ആക്കി മാറ്റുക"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "ഇവന്റിന്റെ പ്രധാന ഫോട്ടോ ആക്കി മാറ്റുക"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "പുതിയ _ഇവന്റ് "
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "പുതിയ ഇവന്റ് "
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ഫോട്ടോകള്‍ നീക്കുക"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ഫോട്ടോകള്‍ ഒരു ഇവന്റിലേക്ക് നീക്കുക"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ഇവന്റുകളെ _ഒന്നിച്ചു ചേര്‍ക്കുക"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "ഒന്നിച്ചു ചേര്‍ക്കുക"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "പല ഇവന്റുകള്‍ ചേര്‍ത്ത് ഒരൊറ്റ ഇവന്റു നി‌‌ര്‍മിക്കുക"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "നിലവാരം _ക്രമീകരിക്കുക"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "നിലവാരം ക്രമീകരിക്കുക"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "നിങ്ങളുടെ ഫോട്ടോയുടെ നിലവാരം ക്രമീകരിക്കുക"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_വര്‍ദ്ധിപ്പിക്കുക"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "നിലവാരം വര്‍ദ്ധിപ്പിക്കുക"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_കുറക്കുക"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "നിലവാരം കുറക്കുക "
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_വിലയിരുത്താത്തത് "
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "വിലയിരുത്താത്തത് "
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "വിലയിരുത്താത്തതാക്കി വിലയിരുത്തുക"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "വായിക്കാത്തതാക്കി സെറ്റ് ചെയ്യുന്നു"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "എല്ലാ നിലവാരങ്ങളും നീക്കം ചെയ്യുക"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_തിരസ്കരിച്ചവ"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "തിരസ്കരിച്ചവ"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "തിരസ്കരിച്ചവ വിലയിരുത്തുക "
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "തിരസ്കരിച്ചതായി കണക്കാക്കല്‍ "
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "തിരസ്കരിക്കേണ്ടുന്ന നിലവാരം സൃഷ്ടിച്ച "
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "തിരസ്കരിച്ചവ _മാത്രം "
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "തിരസ്കരിച്ചവ മാത്രം "
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "തിരസ്കരിച്ച ചിത്രങ്ങള്‍ മാത്രം കാണിക്കുക "
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "എല്ലാം + _തിരസ്കരിച്ചവ "
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "തിരസ്കരിച്ച്തുള്‍പ്പെടെ എല്ലാ ഫോട്ടോകളും കാണിക്കുക"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_എല്ലാ ഫോട്ടോകളും"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "എല്ലാ ഫോട്ടോകളും കാണിക്കുക "
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_നിലവാരങ്ങള്‍ "
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "ഓരോ ഫോട്ടോയുടെയും നിലവാരം കാണിക്കുക "
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ഫോട്ടോകള്‍ _ഫില്‍ട്ടര്‍ ചെയ്യുക "
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ഫോട്ടോകള്‍ ഫില്‍ട്ടര്‍ ചെയ്യുക "
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "ഒരു ഫില്‍ട്ടറിന്റെ അടിസ്ഥാനത്തില്‍ കാണിച്ചിരിക്കുന്ന ഫോട്ടോകളുടെ എണ്ണം നിയന്ത്രിക്കുക "
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_പകര്‍പ്പ്"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "പകര്‍പ്പ് "
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ഫോട്ടോയുടെ ഒരു പകര്‍പ്പ് സൃഷ്ടിക്കുക "
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "..._കയറ്റുമതി"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_പ്രിന്റ്"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "പ്ര‌_സിദ്ധീകരിക്കുക"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "പ്രസിദ്ധീകരിക്കുക"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "വിവിധ വെബ് സൈറ്റുകളിലേക്ക് പ്രസിദ്ധീകരിക്കുക "
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "തലക്കെട്ട് _തിരുത്തുക"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "_അഭിപ്രായം ചിട്ടപ്പെടുത്തുക..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "അഭിപ്രായം ചിട്ടപ്പെടുത്തുക"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_സമയവും തിയ്യതിയും ക്രമീകരിക്കുക "
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "സമയവും തിയ്യതിയും ക്രമീകരിക്കുക "
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_ടാഗുകള്‍ ചേര്‍ക്കുക"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_ടാഗുകള്‍ ചേര്‍ക്കുക"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "ടാഗുകള്‍ ചേര്‍ക്കുക"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_മുന്‍ഗണനകള്‍"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "ഒരു ബാഹ്യ എഡിറ്റര്‍ ഉപയോഗിച്ച് തുറക്കുക "
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "ഒരു _റോ എഡിറ്റര്‍ തുറക്കുക "
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_ഇതിലേക്ക് അയക്കുക "
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_ഇതിലേക്ക് അയക്കുക:"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "..._തിരയുക"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "തിരയുക "
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "പേരിലോ ടാഗുകളിലോ ഉള്ള വാക്കുകളുപയോഗിച്ച് ഒരു ചിത്രം കണ്ടെത്തുക "
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "‌‌_മുദ്രവെക്കുക"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "‌_‌‌_മുദ്ര കളയുക"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "എഡിറ്റര്‍ തുറക്കാന്‍ സാധിച്ചില്ല : %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "\"%s\" എന്ന ടാഗ് ചേര്‍ക്കുക "
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" , \"%s\" എന്നീ ടാഗുകള്‍ ചേര്‍ക്കുക "
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "\"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "\"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_പുതിയ"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" എന്ന ടാഗിന്റെ പേരു _മാറ്റുക "
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "`%s' എന്ന ടാഗ് `%s' ആയി പേര് മാറ്റുക"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "പേരു് _മാറ്റുക..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ടാഗു_കള്‍ തിരുത്തുക "
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "ടാഗുകള്‍ തിരുത്തുക "
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ഫോട്ടോ \"%s\" ആയി ടാഗ് ചെയ്യുക "
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ഫോട്ടോകള്‍ \"%s\" ആയി ടാഗ് ചെയ്യുക "
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോ \"%s\" എന്ന പേരില്‍ ടാഗ് ചെയ്യുക "
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോക്ക് \"%s\" എന്ന ടാഗ് കൊടുക്കുക "
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "_ഫോട്ടോയില്‍ നിന്ന് \"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "_ഫോട്ടോകളില്‍ നിന്ന് \"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ഫോട്ടോയില്‍ നിന്ന് \"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ഫോട്ടോകളില്‍ നിന്ന് \"%s\" എന്ന ടാഗ് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"\"%s\" എന്ന് ടാഗിനെ പേരുമാറ്റാന്‍ കഴിയില്ല കാരണം ആ പേരില്‍ ഒരു ടാഗ് ആദ്യമേ നിലവിലുണ്ട്."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"തിരച്ചിലിന് \"%s\" എന്നു പേരുമാറ്റാന്‍ സാധ്യമല്ല കാരണം ആ പേരില്‍ ഒരു തിരച്ചില്‍ ആദ്യമേ "
+"നിലവിലുണ്ട് "
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "സംരക്ഷിച്ച തിരച്ചിലുകള്‍"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "തിരച്ചില്‍ മായ്കുക"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "‌‌_തിരുത്തുക..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "പേര് _മാറ്റുക "
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" എന്ന തിരച്ചില്‍ \"%s\" എന്ന പേരിലാക്കുക"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" എന്ന തിരച്ചില്‍ മായ്ച് കളയുക"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "നിലവാരം : %s "
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "%s എന്ന് നിലവാരം കൊടുക്കുക "
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s എന്ന് നിലവാരം കൊടുക്കുന്നു "
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s കാണിക്കുക "
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s നിലവാരം ഉള്ള ഫോട്ടോകള്‍ മാത്രം കാണീക്കുക "
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s അല്ലെങ്കില്‍ കൂടുതല്‍ നല്ലത് "
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s അല്ലെങ്കില്‍ അതിലും നല്ലതു കാണിക്കുക "
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s ഓ അതിലധികമോ നിലവാരമുള്ള ഫോട്ടോകള്‍ മാത്രം കാണിക്കുക "
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകള്‍ ചവറ്റുകുട്ടയില്‍ നിന്നും നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "തിരഞ്ഞെടുത്ത ചിത്രങ്ങള്‍ ലൈബ്രറിയില്‍ നിന്ന് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_പുനഃസ്ഥാപിയ്ക്കുക"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "തിരഞ്ഞെടുത്ത ചിത്രങ്ങള്‍ ലൈബ്രറിയിലേക്ക് തിരിച്ചെടുക്കുക"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ഫയല്‍ മാനേ_ജറില്‍ കാണിക്കുക"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോയുടെ ഡയറക്റ്ററി ഫയല്‍ മാനേജറില്‍ തുറക്കുക"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ഫയല്‍ മാനേജര്‍ തുറക്കാന്‍ കഴിഞ്ഞില്ല :%s "
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "ലൈബ്രറിയില്‍ _നിന്ന് നീക്കം ചെയ്യുക "
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_ചവറ്റുകുട്ടയിലേക്ക് നീക്കുക"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "എല്ലാം _തിരഞ്ഞെടുക്കുക"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "എല്ലാ ഇനങ്ങളൂം തിരഞ്ഞെടുക്കുക"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "കോണ്‍:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_പുനഃസ്ഥാപിക്കുക "
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "ഇപ്പോഴത്തെ ഫോട്ടോ അളവുകളിലേക്ക് തിരിച്ചുപോവുക"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "ഈ ഫോട്ടോക്ക് ക്രോപ്പ് നിശ്ചയിക്കുക"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "വെട്ടിയ ചതുരത്തെ കേന്ദ്രമാക്കി വെച്ച് വിലങ്ങനെയോ കുത്തനെയോ വിന്യസിക്കുക\""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "അനിയന്ത്രിതമായ"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "ചതുരം "
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "സ്ക്രീന്‍"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "യഥാര്‍ത്ഥ വലുപ്പം"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "സാധാരണ നിലവാരമുള്ള വീഡിയോ (4:3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "കൂടിയ നിലവാരമുള്ള ചലച്ചിത്രം (16:9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "കത്ത് (8.5 x 11 ഇഞ്ച്)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "ടാബ്ലോയിഡ് (11 x 17 മി.മീ)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "എ4 (210 x 297 മി.മീ )"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "എ3 (210 x 420 മി.മീ)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "ചെങ്കണ്ണ് നീക്കം ചെയ്യാനുപയോഗിക്കുന്ന ഉപകരണം അടക്കുക"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "തിരഞ്ഞെടുത്ത സ്ഥലത്തെ ചെങ്കണ്ണുപ്രതീതി ഒഴിവാക്കുക"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "സാച്ചുറേഷന്‍:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "ടിന്റ്:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "താപനില:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "നിഴലുകള്‍:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "നിറങ്ങള്‍ പൂര്‍വസ്ഥിതിയിലാക്കുക"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "എല്ലാ നിറഭേദഗതികളും പൂര്‍വ്വസ്ഥിതിയിലാക്കി മാറ്റുക"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "താപനില"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "ടിന്റ്"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "സാച്ചുറേഷന്‍"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "എക്സ്പോഷര്‍ "
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "നിഴലുകള്‍"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "കോണ്‍ട്രാസ്റ്റ് വികാസം "
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ടൂള്‍ബാര്‍ ഉറപ്പിക്കുക"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ടൂള്‍ബാര്‍ തുറന്ന നിലയില്‍ ഉറപ്പിക്കുക"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "പൂര്‍ണ്ണസ്ക്രീനില്‍ നിന്നും പുറത്ത് കടക്കുക"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_പൂര്‍ണ്ണസ്ക്രീനില്‍ നിന്നും പുറത്ത് കടക്കുക"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "‌‌_നിര്‍ത്തുക"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_ഇതിനെപ്പറ്റി"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "സ്ക്രീന്‍ ‌_നിറച്ച്"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_ഉള്ളടക്കം"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_പതിവു ചോദ്യങ്ങള്‍"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_ഒരു പ്രശ്നം അറിയിക്കുക"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"ഷോട്ട്‌‌വെല്‍ ലൈബ്രറി ഉപയോഗിക്കുമ്പോള്‍ ഒരു പ്രധാന പിഴവു സംഭവിച്ചതിനാല്‍ ഷോട്ട്വെല്ലിന് തുടര്‍ന്നു "
+"പ്രവര്‍ത്തിക്കാന്‍ സാധ്യമല്ല \n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "യോര്‍ബ വെബ്സൈറ്റ് സന്ദര്‍ശിക്കുക"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Hrishikesh K B (ഋഷികേഷ്)"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "സഹായം ലഭ്യമാകുന്നതില്‍ പരാജയം: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ബഗ്ഡാറ്റാബേസിലേക്ക് കടക്കാന്‍ സാധിച്ചില്ല : %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "പതിവുചോദ്യങ്ങള്‍ പ്രദര്‍ശിപ്പിക്കാന്‍ കഴിയുന്നില്ല: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "തലക്കെട്ടില്ലാത്ത"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "ശരിയായ വലിപ്പം "
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "നീളം അല്ലെങ്കില്‍ വീതി "
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "വീതി"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ഉയരം"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "നഖചിത്രങ്ങളുടെ വലുപ്പം ക്രമീകരിക്കുക"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "നഖചിത്രങ്ങളുടെ വിസ്തരിക്കല്‍ കൂട്ടുക"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "നഖചിത്രങ്ങളുടെ വിസ്തരിക്കല്‍ കുറക്കുക"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ഫോട്ടോകള്‍ _അടുക്കുക "
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "ചലച്ചിത്രം _പ്ലേ ചെയ്യുക"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "തിരഞ്ഞെടുത്ത ചലച്ചിത്രങ്ങള്‍ സിസ്റ്റത്തിന്റെ വീഡിയോ പ്ലേയറില്‍ തുറക്കുക"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_അഭിപ്രായങ്ങള്‍"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ഓരോ ഫോട്ടോയിലുമുള്ള കമന്റുകള്‍ കാണിയ്ക്കുക"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ഓരോ ഫോട്ടോയുടേയും ടാഗുകള്‍ കാണിക്കുക "
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr " _തലക്കെട്ടനുസരിച്ച് "
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "തലക്കെട്ട് അനുസരിച്ച് അടുക്കുക"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "_എടുത്ത ദിവസത്തിനനുസരിച്ച് "
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "എടുത്ത ദിവസമനുസരിച്ച് അടുക്കുക"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "_നിലവാരമനുസരിച്ച് "
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "നിലവാരമനുസരിച്ച് ഫോട്ടോകള്‍ അടുക്കുക"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"തിരഞ്ഞെടുത്ത ചലച്ചിത്രം പ്രവര്‍ത്തിപ്പിക്കാന്‍ ഷോട്ട്‌‌വെല്ലിനു കഴിഞ്ഞില്ല \n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ഫോട്ടോ/ചലച്ചിത്രം"
+msgstr[1] "%d ഫോട്ടോകള്‍/ചലച്ചിത്രങ്ങള്‍"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ഓരോ ഇവന്റിനുമുള്ള അഭിപ്രായം കാണിയ്ക്കുക"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ഒരു ഇവന്റും ഇല്ല"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ഒരു ഇവന്റും കണ്ടെത്താനായില്ല"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ഇവന്റുകള്‍"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "തിയതി അടയാളപ്പെടുത്താത്തവ"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "ഒരു ഇവന്റും ഇല്ല "
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "കാഷേ ഡയറക്ടറി'%s' ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "ഡേറ്റാ ഡയറക്ടറി'%s' ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ചിത്രങ്ങള്‍"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "%s എന്ന താത്കാലിക ഡയറക്റ്ററി നിര്‍മിക്കുന്നതില്‍ പിഴവ് : %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "%s എന്ന ഡാറ്റാ ഉപഡയറക്റ്ററി സൃഷ്ടിക്കുന്നതില്‍ പിഴവ് :%s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(ഒന്നുമില്ല)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "ഒന്നുമില്ല"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "പെട്ടെന്നുള്ളതു്"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "സ്ലൈഡ്ഷോ ട്രാന്‍സിഷനുകള്‍"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s നു വേണ്ടി താത്കാലിക ഫയല്‍ സൃഷ്ടിക്കാന്‍ കഴിഞ്ഞില്ല :%s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "കയറ്റുമതി ചെയ്യുന്നു"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s എന്ന ഫയല്‍ നിലവിലുള്ളതാണ്. അതു മാറ്റണോ?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_വേണ്ടെന്നുവയ്ക്കുക"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_മാറ്റിവയ്ക്കുക"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_എല്ലാം മാറ്റിയെഴുതുക"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "കയറ്റുമതി"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ചിത്രങ്ങള്‍"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "വീഡിയോകള്‍"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "അസംസ്കൃത ചിത്രങ്ങള്‍"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "അസംസ്കൃത ചിത്രങ്ങള്‍"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "%s എന്ന യുഐ ഫയല്‍ ലോഡ് ചെയ്യുന്നതില്‍ പിഴവ് : %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "തരം"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "പ്രസിദ്ധീകരിക്കുന്നു"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകള്‍/വീഡിയോകള്‍ വിജയകരമായി പ്രസിദ്ധീകരിച്ചു."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "തിരഞ്ഞെടുത്ത ചലച്ചിത്രങ്ങള്‍ വിജയകരമായി പ്രസിദ്ധീകരിച്ചു."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോകള്‍ വിജയകരമായി പ്രസിദ്ധീകരിച്ചു."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ".തിരഞ്ഞെടുത്ത ചലച്ചിത്രം വിജയകരമായി പ്രസിദ്ധീകരിച്ചു"
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "തിരഞ്ഞെടുത്ത ഫോട്ടോ വിജയകരമായി പ്രസിദ്ധീകരിച്ചു."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "അക്കൗണ്ട് വിവരങ്ങള്‍ ശേഖരിക്കുന്നു..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "പ്രവേശിക്കുക..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ഫോട്ടോകള്‍ പ്രസിദ്ധീകരിക്കുക"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "ഫോട്ടോകള്‍ ഇങ്ങോ_ട്ട് പ്രസിദ്ധീകരിക്കുക :"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "ചലച്ചിത്രങ്ങള്‍ പ്രസിദ്ധീകരിക്കുക"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "ചലച്ചിത്ര_ങ്ങള്‍ ഇങ്ങോട്ട് പ്രസിദ്ധീകരിക്കുക"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ഫോട്ടോകളും ചലച്ചിത്രങ്ങളും പ്രസിദ്ധീകരിക്കുക"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ഫോട്ടോകളും ചലച്ചിത്രങ്ങളും ഇവിടേക്ക് _പ്രസിദ്ധീകരിക്കുക"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "പ്രസിദ്ധീകരിക്കാന്‍ കഴിഞ്ഞില്ല"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"അനുയോജ്യമായ ഒരു പ്രസിദ്ധീകരണ സംയോജകം ഇല്ലാത്തതിനാല്‍ തിരഞ്ഞെടുത്ത ഇനങ്ങള്‍ പ്രസിദ്ധീകരിക്കാന്‍ "
+"ഷോട്ട്‌‌വെല്ലിനു കഴിയില്ല. ഇതു ശരിയാക്കാന്‍ <b>Edit %s Preferences </b> തിരഞ്ഞെടുത്തതിനു "
+"ശേഷം <b> Plugins </b> ടാബില്‍ നിന്നും ആവശ്യമായ പ്ലഗ്ഗിനുകള്‍ തിരഞ്ഞെടുക്കുക"
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "അപ്പ്‌‌ലോഡ് ചെയ്യാന്‍ തയാറെടുക്കുന്നു."
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d എണ്ണത്തില്‍ %d എണ്ണം അപ്പ്ലോഡ് ചെയ്യുന്നു"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "ഒരു പിഴവു സംഭവിച്ചതിനാല്‍ %s ലേക്ക് പ്രസിദ്ധീകരിക്കാന്‍ സാധ്യമല്ല"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"മറ്റൊരു സേവനത്തിലേക്ക് പ്രസിദ്ധീകരിക്കാനായി മുകളിലെ മെനുവില്‍ നിന്ന് ഒരെണ്ണം തിരഞ്ഞെടുക്കുക."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "പുതിയ ടാ_ഗ്..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"പ്രസിദ്ധീകരണത്തിനാവശ്യമായ ഒരു താത്കാലിക ഫയല്‍ ലഭ്യമല്ല"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"നിങ്ങള്‍ യൂട്യൂബിലേക്ക് പ്രവേശിച്ചിട്ടില്ല \n"
+"\n"
+"നിങ്ങള്‍ ഒരു ഗൂഗ്ഗിള്‍ അക്കൗണ്ട് നിര്‍മിച്ചിരിക്കും എന്നു പ്രതീക്ഷിക്കുന്നു. നിങ്ങള്‍ക്ക് ബ്രൗസറിലൂടെ "
+"യൂട്യൂബില്‍ ലോഗിന്‍ ചെയ്ത് അക്കൗണ്ട് ശരിയാക്കാവുന്നതാണ്."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "പ്രസിദ്ധീകരണത്തിനാവശ്യമായ ഒരു ഫയല്‍ ലഭ്യമല്ല. യൂട്യൂബിലേക്ക് പ്രസിദ്ധീകരിക്കാന്‍ സാധ്യമല്ല"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "നിങ്ങള്‍ യൂട്യൂബില്‍ %s ആയി പ്രവേശിച്ചിരിക്കുന്നു."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "ചലച്ചിത്രങ്ങള്‍ '%s' ല്‍ കാണാം "
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "ലിസ്റ്റുചെയ്ത പൊതുവായവ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "ലിസ്റ്റ് ചെയ്യാത്ത പൊതുവായവ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "സ്വകാര്യം "
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "പ്രധാന പ്രസിദ്ധീകരണ സേവങ്ങള്‍"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"നിങ്ങള്‍ ഇപ്പോള്‍ ഫ്ലിക്കറില്‍ ലോഗിന്‍ ചെയ്തിട്ടില്ല \n"
+"\n"
+"ബ്രൗസറിലൂടെ ഫ്ലിക്കറില്‍ ലോഗിന്‍ ചെയ്യുന്നതിനായി ലോഗിന്‍ ക്ലിക്ക് ചെയ്യുക. ഫ്ലിക്കര്‍ "
+"ഉപയോഗിക്കുന്നതിനായി ഷോട്ട്‌‌വെല്ലിനെ അധികാരപ്പെടുത്തേണ്ടതായി വരും "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ഈ സെഷനില്‍ നിങ്ങള്‍ ഇപ്പോള്‍ തന്നെ ഫ്ലിക്കറില്‍ പ്രവേശിക്കുകയും പുറത്തുകടക്കുകയും ചെയ്തിരിക്കുന്നു.\n"
+"ഫ്ലിക്കറില്‍ പ്രസിദ്ധീകരിക്കുന്നതു തുടരാനായി ഷോട്ട്‌‌വെല്‍ അടച്ചതിനു ശേഷം വീണ്ടും തുറക്കുക"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "പ്രവേശിക്കാന്‍ തയാറെടുക്കുന്നു..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"പ്രസിദ്ധീകരണത്തിനാവശ്യമായ ഒരു ഫയല്‍ ലഭ്യമല്ലാത്തതിനാല്‍ ഫ്ലിക്കറിലേക്ക് പ്രസിദ്ധീകരിക്കാന്‍ "
+"സാധ്യമല്ല"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "അധികാരപ്പെടുത്തല്‍ വിലയിരുത്തുന്നു..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"നിങ്ങള്‍ ഫ്ലിക്കറിലേക്ക് %s ആയി പ്രവേശിച്ചിരിക്കുന്നു. \n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"നിങ്ങളുടെ സൗജന്യ ഫ്ലിക്കര്‍ അക്കൗണ്ട് ഓരോമാസവും അപ്‌‌ലോഡ് ചെയ്യാവുന്ന വിവരങ്ങള്‍ക്ക് പരിധി "
+"നിശ്ചയിച്ചിരിക്കുന്നു \n"
+"നിങ്ങളുടെ ക്വാട്ടയില്‍ ഈ മാസം %d മെഗാബൈറ്റ് ബാക്കിയുണ്ട് "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "നിങ്ങളൂടെ ഫ്ലിക്കര്‍ പ്രൊ അക്കൗണ്ട് നിങ്ങള്‍ക്ക് പരിധിയില്ലാത്ത അപ്‌‌ലോഡുകള്‍ അനുവദിക്കുന്നു"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ഫോട്ടോകള്‍ ആര്‍ക്കൊക്കെ കാണാം : "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "ചലച്ചിത്രങ്ങള്‍ ആര്‍ക്കൊക്കെ കാണാം :"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ഫോട്ടോകളും ചലച്ചിത്രങ്ങളൂം ആര്‍ക്കൊക്കെ കാണാം:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "എല്ലാവരും "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "കൂട്ടുകാരും കുടുംബക്കാരും മാത്രം "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "കുടുംബക്കാര്‍ മാത്രം"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "സുഹൃത്തുകള്‍ മാത്രം"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "ഞാന്‍ മാത്രം "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 കുത്തുകള്‍"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 കുത്തുകള്‍"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 പിക്സലുകള്‍"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 പിക്സലുകള്‍."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "ആല്‍ബം %s ഉണ്ടാക്കുന്നു..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "പിവിഗോയിലേക്കു് ലഭ്യമാക്കുന്നതില്‍ പിശക്. ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"നിങ്ങളുടെ പിവിഗോ ഫോട്ടോ ലൈബ്രറിയുടെ ലിങ്കും അതുമായി ബന്ധപ്പെട്ട പിവിഗോ അക്കൗണ്ടിന്റെ "
+"ഉപയോക്തൃനാമവും പാസ്‌‌വേഡും നല്‍കുക"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"ഷോട്ട്‌‌‌‌വെല്ലിന് താങ്കളുടേ പിവിഗോ ഫോട്ടോ ലൈബ്രറിയുമായി ബന്ധപ്പെടാന്‍ സാധിച്ചില്ല. ദയവായി "
+"താങ്കള്‍ നല്‍കിയ യുആര്‍‌‌എല്‍ പരിശോധിക്കുക"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"ഉപയോക്തൃനാമം അടയാളവാക്കു് എന്നിവ/ഇതിലൊന്ന് അസാധുവാണ്, ദയവായി വീണ്ടും ശ്രമിക്കുക"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "സാധുവല്ലാത്ത യുആര്‍‌‌എല്‍"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"ഉപയോക്തൃനാമം അല്ലെങ്കില്‍ അടയാളവാക്കു് അസാധുവാണ്"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "ഷോട്ട്‌‌വെല്ലിലേക്ക് ബന്ധിപ്പിക്കുക"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "കാര്യകര്‍ത്താക്കള്‍, കുടുംബക്കാര്‍, കൂട്ടുകാര്‍ , ബന്ധക്കാര്‍"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "കാര്യകര്‍ത്താക്കള്‍, കുടുംബക്കാര്‍, കൂട്ടുകാര്‍"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "കാര്യകര്‍ത്താക്കള്‍,കുടുംബക്കാര്‍"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "കാര്യകര്‍ത്താക്കള്‍"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"താങ്കള്‍ ഇപ്പോള്‍ പിക്കാസ വെബ് ആല്‍ബത്തിലേക്ക് പ്രവേശിച്ചിട്ടില്ല \n"
+"\n"
+"ലോഗിന്‍ എന്നതില്‍ ക്ലിക്ക് ചെയ്ത് പിക്കാസ വെബ് ആല്ബത്തിലേക്ക് പ്രവേശിക്കാവുന്നതാണ്. നിങ്ങള്‍ ഷോട്ട്‌‌വെല്‍ "
+"കണക്റ്റിന് പിക്കാസ വെബ് ആല്‍ബവുമായി കണക്റ്റ് ചെയ്യാനുള്ള അനുമതി നല്‍കേണ്ടതായി വരും"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"പ്രസിദ്ധീകരണത്തിനാവശ്യമായ ഒരു ഫയല്‍ ലഭ്യമല്ലാത്തതിനാല്‍ പിക്കാസയിലേക്ക് പ്രസിദ്ധീകരിക്കാന്‍ "
+"സാധ്യമല്ല"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "ആല്‍ബം ഉണ്ടാക്കുന്നു..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "നിങ്ങള്‍ പിക്കാസ വെബ് ആല്‍ബത്തില്‍ %s ആയി ലോഗിന്‍ ചെയ്തിരിക്കുന്നു "
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "ചലച്ചിത്രങ്ങള്‍ ഇവിടെ കാണാം: "
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ഫോട്ടോകള്‍ ഇവിടെ കാണാം :"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "ചെറുത് (640x480 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "ഇടത്തരം (1024x768 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "ശുപാര്‍ശചെയ്യുന്നത് (1600 x 1200 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "ഗൂഗിള്‍+ (2048x1536 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"നിങ്ങള്‍ ഇപ്പോള്‍ ഫേസ്ബുക്കിലേക്ക് പ്രവേശിച്ചിട്ടില്ല \n"
+"\n"
+"നിങ്ങള്‍ക്ക് ഒരു ഫേസ്ബുക്ക് അക്കൗണ്ട് ഇല്ലെങ്കില്‍ ലോഗിന്‍ ചെയ്യുന്ന സമയത്ത് ഒരെണ്ണം സൃഷ്ടിക്കാവുന്നതാണ്. "
+"പ്രവേശിക്കുന്ന സമയത്ത് ഷോട്ട്‌‌വെല്‍ കണക്റ്റ് നിങ്ങളുടെ ഫീഡിലേക്ക് ചിത്രങ്ങള്‍ അപ്‌‌ലോഡ് ചെയ്യാനും "
+"പ്രസിദ്ധീകരിക്കാനും അനുവാദം ചോദിക്കും . ഷോട്ട്‌‌വെല്‍ കണക്റ്റ് പ്രവര്‍ത്തിക്കുന്നതിന് ഈ അനുമതി "
+"ആവശ്യമാണ്. "
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"നിങ്ങള്‍ ഈ സെഷനില്‍ ഫേസ്ബുക്കിലേക്ക് പ്രവേശിക്കുകയും പുറത്തുകടക്കുകയും ചെയ്തിരിക്കുന്നു \n"
+"ഫേസ്ബുക്കിലേക്ക് പ്രസിദ്ധീകരിക്കുന്നത് തുടരാന്‍ , ഷോട്ട്‌‌വെല്‍ അടച്ചതിനു ശേഷം വീണ്ടും തുറക്കുക, "
+"എന്നിട്ട് പ്രസിദ്ധീകരിക്കാന്‍ ശ്രമിക്കൂ"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "സ്വാഭാവികം (720 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "വലുത് (2048 കുത്തുകള്‍)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "ഫേസ്ബുക്കിലേക്കുള്ള ബന്ധം പരീക്ഷിക്കുന്നു..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"പ്രസിദ്ധീകരണത്തിനാവശ്യമായ ഒരു ഫയല്‍ ലഭ്യമല്ല. ഫേസ്ബുക്കിലേക്ക് പ്രസിദ്ധീകരിക്കാന്‍ സാധ്യമല്ല"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"നിങ്ങള്‍ ഫേസ്ബുക്കിലേക്ക് %s ആയി പ്രവേശിച്ചിരിക്കുന്നു. \n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "തിരഞ്ഞെടുത്ത ചിത്രങ്ങള്‍ എങ്ങോട്ടാണ് പ്രസിദ്ധീകരിക്കേണ്ടത് ?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "അപ്പ്ലോഡ് _വലുപ്പം "
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "കൂട്ടുകാര്‍"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "പൊടിഞ്ഞുപോകല്‍"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "ചെസ്സ്"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "വൃത്തങ്ങള്‍"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ബ്ലൈന്‍ഡുകള്‍"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "സ്ട്രൈപ്പുകള്‍"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ഘടികാരം"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "വൃത്തം"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "പ്രധാനപ്പെട്ട സ്ലൈഡ്ഷോ ട്രാന്‍സിഷനുകള്‍"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "പകര്‍പ്പവകാശം 2010 മാക്സിം കാര്‍ത്താശേവ്, പകര്‍പ്പവകാശം 2011-2013 യോര്‍ബാ ഫൌണ്ടേഷന്‍"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "സ്ലൈഡ്"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "മങ്ങല്‍"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ചതുരങ്ങള്‍"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "പ്രധാന വിവര ഇറക്കുമതി സേവനങ്ങള്‍"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"എഫ്-സ്പോട്ട് ലൈബ്രറി ഇറക്കുമതി സേവനത്തിലേക്ക് സ്വാഗതം \n"
+" \n"
+"ഇറക്കുമതി ചെയ്യാനായി ഒരു ലൈബ്രറി തിരഞ്ഞെടുക്കുക, ഷോട്ട്‌‌വെല്‍ കണ്ടെത്തിയ നിലവിലുള്ള "
+"ലൈബ്രറികളില്‍ നിന്ന് ഒന്നു തിരഞ്ഞെടുക്കുകയോ പകരം ഒരു എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ തിരഞ്ഞെടുക്കുകയോ "
+"ചെയ്യാവുന്നതാണ് "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"എഫ്-സ്പോട്ട് ലൈബ്രറി ഇറക്കുമതി സേവനത്തിലേക്ക് സ്വാഗതം \n"
+" \n"
+"ദയവായി ഒരു എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ തിരഞ്ഞെടുക്കുക "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "ഇറക്കുമതി ചെയ്യേണ്ട ഡാറ്റാബേസ് ഫയല്‍ തിരഞ്ഞെടുക്കുക: "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"തിരഞ്ഞെടുത്ത എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ വായിക്കാന്‍ കഴിഞ്ഞില്ല : ഒന്നുകില്‍ ഫയല്‍ നിലവിലില്ല , "
+"അല്ലെങ്കില്‍ ഇതൊരു എഫ്-സ്പോട്ട് ഡാറ്റാബേസല്ല."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"തിരഞ്ഞെടുത്ത എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ വായിക്കാന്‍ കഴിഞ്ഞില്ല : എഫ്‌‌-സ്പോട്ടിന്റെ ഈ ഡറ്റാബേസ് "
+"പതിപ്പ് ഷോട്ട്‌‌വെല്‍ പിന്തുണക്കുന്നില്ല"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"തിരഞ്ഞെടുത്ത എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ വായിക്കാന്‍ കഴിഞ്ഞില്ല : ടാഗുകളെക്കുറിച്ചുള്ള പട്ടിക "
+"വായിക്കുന്നതില്‍ പിഴവ്"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"തിരഞ്ഞെടുത്ത എഫ്-സ്പോട്ട് ഡാറ്റാബേസ് ഫയല്‍ വായിക്കാന്‍ കഴിഞ്ഞില്ല : ചിത്രങ്ങളെക്കുറിച്ചുള്ള പട്ടിക "
+"വായിക്കുന്നതില്‍ പിഴവ്"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"എഫ്-സ്പോട്ട് ലൈബ്രറിയില്‍ കണ്ടെത്തിയ %d ഫോട്ടോകള്‍ ഷോട്ട്‌‌വെല്‍ ഇറക്കുമതി ചെയ്തുകൊണ്ടിരിക്കുകയാണ്. "
+"ചിത്രങ്ങളുടെ പകര്‍പ്പുകള്‍ സ്വാഭാവികമായി കണ്ടെത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നതാണ് \n"
+"\n"
+"നിങ്ങള്‍ക്ക് ഈ വിന്‍ഡോ ക്ലോസ് ചെയ്ത് ഷോട്ട്‌‌വെല്‍ ഉപയോഗിച്ച് തുടങ്ങാവുന്നതാണ്. ഇറക്കുമതി പുറകില്‍ "
+"നടന്നുകൊള്ളും "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "എഫ്-സ്പോട്ട് ലൈബ്രറി : %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "ഇറക്കുമതി ചെയ്യാന്‍ തയാറെടുക്കുന്നു"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "ഡെസ്ക്ടോപ്പ് സ്ലൈഡ്ഷോ ആയി സെറ്റ് ചെയ്യുക"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "ഡെസ്ക്ടോപ്പ് പശ്ചാത്തല സ്ലൈഡ്ഷോ നിര്‍മിക്കുക "
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "ഒരു ചിത്രം എത്ര സമയത്തേക്ക് കാണിക്കണം"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "സമയ ദൈര്‍ഘ്യം"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "ഓരോ ചിത്രവും എത്ര നേരത്തേക്ക് ഡെസ്ക്ടോപ്പ് പശ്ചാത്തലമാക്കി വെക്കണം"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "തിരയുക"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_തിരച്ചിലിന്റെ പേര്:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_താരതമ്യപ്പെടുത്തുക"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "താഴെക്കൊടുത്തവയില്‍ "
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>പ്രിന്റ് ചെയ്ത ചിത്രത്തിന്റെ വ്യാപ്തി</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "സാധാ_രണ കാഴ്ചയ്ക്കുള്ള വലിപ്പമുപയോഗിയ്ക്കുക"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "ഇച്ഛാനുസൃതമുള്ള ഒരു വലുപ്പം ഉപയോഗിക്കുക:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ഫോട്ടോയുടെ ആസ്പക്റ്റ് അനുപാതം ആനുപാതികമാക്കുക"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "സ്വാഭാവികമായ വലുപ്പം : "
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>തലക്കെട്ടുകള്‍</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ചിത്രം പ്രിന്റ് ചെയ്യുമ്പോഴത്തെ വലുപ്പം "
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>പിക്സല്‍ റിസല്യൂഷന്‍</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "ഔട്ട്പുട്ട് ഫോട്ടോ ഉണ്ടാക്കേണ്ട സ്ഥലം : "
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ഒരു ഇഞ്ചിലുള്ള കുത്തുകള്‍ "
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"ലേബല്‍ "
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "ഷോട്ടെല്‍ മുന്‍ഗണനകള്‍"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "വെള്ള"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "കറുപ്പ്"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "പുതിയഫയലുകള്‍ ഡയറക്റ്ററിയില്‍ വരുന്നോ എന്ന് _നോക്കുക "
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "ചിത്രത്തെക്കുറിച്ചുള്ള വിവരങ്ങള്‍(മെറ്റാഡാറ്റ)"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "ടാഗുകള്‍, തലക്കെട്ടുകള്‍ മറ്റു മെറ്റാഡറ്റകള്‍ എന്നിവ ചിത്രത്തില്‍ ചേര്‍ക്കുക"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "ദര്‍ശിനി"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "‌_ഇനി പറയുന്ന സ്ഥലത്തേക്ക് ചിത്രങ്ങള്‍ ഇറക്കുമതി ചെയ്യുക"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_പശ്ചാത്തലം"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "ഇറക്കുമതി ചെയ്യുന്നു "
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_ഡയറക്റ്ററി ഘടന"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_പാറ്റേണ്‍:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ഉദാഹരണം:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "ഇറക്കുമതി ചെയ്ത ഫലുകളുടെ പേര് ചെറിയക്ഷരത്തിലേക്ക് മാറ്റുക"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "റോ ഡെവലെപ്പര്‍"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_സഹജമായതു്:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "ബാഹ്യ ഫോട്ടോ എഡിറ്ററുകള്‍"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "ബാഹ്യ _റോ എഡിറ്ററുകള്‍"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "ബാഹ്യ എഡിറ്ററുകള്‍"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "സംയോജകങ്ങള്‍"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_താമസം:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "നീങ്ങുന്ന പ്രതീതി"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "നീങ്ങുന്നതിന്റെ ദൈര്‍ഘ്യം "
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "അവതരണത്തിന്റെ തലക്കെട്ട്"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "നിമിഷങ്ങള്‍"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_പ്രവേശിക്കുക"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "പുറത്ത് _കടക്കുക"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_പ്രസിദ്ധീകരിക്കുക"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "ഫോട്ടോയുടെ _വലുപ്പം:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_അടയാളവാക്ക്:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "പ്രവേശിക്കുക"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "പകര്‍പ്പവകാശം 2012 BJA ഇലക്ട്രോണിക്സ്"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 കുത്തുകള്‍"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' എന്നത് ഒരു OAuth ഓഥന്റിക്കേഷന്‍ അപേക്ഷക്ക് കിട്ടാവുന്ന സാധുവായ മറുപടിയല്ല"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"ടംബ്ലര്‍ പബ്ലിഷര്‍: start() : തുടങ്ങാന്‍ സാധിച്ചില്ല; ഈ പബ്ലിഷര്‍ വീണ്ടും തുടങ്ങാന്‍ സാധിക്കില്ല"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "താങ്കളുടെ ടംബ്ലര്‍ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട ഉപയോക്തൃനാമവും രഹസ്യവാക്കും നല്‍കുക"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI ലോഡ് ചെയ്യാന്‍ സാധിച്ചില്ല : %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"താങ്കള്‍ ടംബ്ലറിലേക്ക് %s ആയി ലോഗിന്‍ ചെയ്തിരിക്കുന്നു \n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "പകര്‍പ്പവകാശം 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki വെബ്സൈറ്റ് സന്ദര്‍ശിക്കുക"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "താങ്കള്‍ നിലവില്‍ Yandex.Fotki ലേക്ക് പ്രവേശിച്ച നിലയിലല്ല."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_ഈമെയില്‍ വിലാസം"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ബ്ലോഗുകള്‍:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_ആല്‍ബങ്ങള്‍ (അല്ലെങ്കില്‍ പുതിയത് എഴുതുക):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_ഉപയോഗരീതി"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "അഭിപ്രായങ്ങള്‍ അനു_വദിക്കാതിരിക്കുക"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "യഥാര്‍ത്ഥ ചിത്രം _ഡൗണ്‍ലോഡ് ചെയ്യുന്നത് തടയുക"
diff --git a/po/mr.po b/po/mr.po
new file mode 100644
index 0000000..101eb03
--- /dev/null
+++ b/po/mr.po
@@ -0,0 +1,4512 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# sandeeps <sshedmak@redhat.com>, 2012
+# sandeeps <sshedmak@redhat.com>, 2012-2013
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: sandeeps <sshedmak@redhat.com>\n"
+"Language-Team: Marathi (http://www.transifex.com/projects/p/shotwell/"
+"language/mr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mr\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "घटना %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "कॅमेराज्"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "कॅमेरा"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"कॅमेरा माउंट अशक्य करणे अशक्य. फाइल व्यवस्थापकपासून कॅमेरा माउंट अशक्य करायचा प्रयत्न करा."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "आधिपासूनच आयात केलेले छायाचित्र लपवा"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "फक्त आयात न केलेले छायाचित्र दाखवा"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "आयात सुरू करत आहे, कृपया थांबा..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "शीर्षक (_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "प्रत्येक छायाचित्राचे शीर्षक दाखवा"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "आयात नीवडले (_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "नीवडलेल्या छायाचित्रांना लाइब्ररिमध्ये आयात करा"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "सर्व आयात करा (_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "सर्व छायाचित्रांना लाइब्ररिमध्ये आयात करा"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "शॉटवेलला फाइलप्रणालीपासून कॅमराला माउंट अशक्य करण्याची आवश्यकता आहे. पुढे जायचे?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "माऊंट अशक्य करा (_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "कृपया कॅमेराला माउंट अशक्य करा."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"कॅमेरा इतर ॲप्लिकेशनतर्फे कुलूपबंद आहे. कुलूपबंद असल्यावरच शॉटवेल कॅमेराकरीता प्रवेश प्राप्त करू "
+"शकतो. कृपया कॅमेराचा वापर करून इतर कोणतेहि ॲप्लिकेशन बंद करा व पुन्हा प्रयत्न करा."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "कॅमेराचा वापर करून कृपया इतर कोणतेहि ॲप्लिकेशन बंद करा."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"कॅमेरापासून पूर्वावलोकन प्राप्त करणे अशक्य:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "माउंट अशक्य करत आहे..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "छायाचित्र माहिती प्राप्त करत आहे"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s करीता पूर्वावलोकन प्राप्त करत आहे"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "कॅमेरा: %s कुलूपबंद करत आहे"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "कॅमेरापासून हे छायाचित्र नष्ट करायचे?"
+msgstr[1] "कॅमेरापासून हे %d छायाचित्र नष्ट करायचे?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "कॅमेरातून हे व्हिडिओ नष्ट करायचे?"
+msgstr[1] "कॅमेरातून हे %d व्हिडिओ नष्ट करायचे?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ह्या छायाचित्र/व्हिडिओला कॅमेराऱ्यातून नष्ट करायचे?"
+msgstr[1] "ह्या %d छायाचित्र/व्हिडिओला कॅमेराऱ्यातून नष्ट करायचे?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "कॅमेरापासून ह्या फाइल्स् नष्ट करायचे?"
+msgstr[1] "कॅमेरापासून ह्या %d फाइल्स् नष्ट करायचे?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "जपवून ठेवा (_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "कॅमेरापासून छायाचित्र/व्हिडिओज् काढून टाकत आहे"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "त्रुटींमुळे कॅमेरापासून %d छायाचित्र/व्हिडिओ नष्ट करणे अशक्य."
+msgstr[1] "त्रुटींमुळे कॅमेरापासून %d छायाचित्र/व्हिडिओ नष्ट करणे अशक्य."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "स्लाइडशो (_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "स्लाइडशो दाखवा"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "छायाचित्र/व्हिडिओ एक्सपोर्ट करा"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "छायाचित्र/व्हिडिओ एक्सपोर्ट करा"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "छायाचित्र एक्सपोर्ट करा"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "छायाचित्र एक्सपोर्ट करा"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "फिरवत आहे"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "फिरवणे पूर्ववत् करत आहे"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "आडवे पलटी करा"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "आडवे पलटवणे पूर्ववत् करा"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "उभेरित्या पलटवत आहे"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "उभेरित्या पलटवणे पूर्ववत् करत आहे"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "कोणतेहि मजकूर"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "शीर्षक"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "टॅग"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "इव्हेंट नाव"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "फाइल नाव"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "मिडिया प्रकार"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "प्लॅग स्तर"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "रेटिंग"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "दिनांक"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "समाविष्टीत"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "हुबेहुब"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "सुरू होते"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "समाप्त होते"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "समाविष्ट नाही"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "सेट केले नाही"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "is"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "is not"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "कोणतेहि फोटो"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "रॉ फोटो"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "व्हिडिओ"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "फ्लॅग केले"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "फ्लॅग केले नाही"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "व जास्त"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "फक्त"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "व कमी"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "नंतर"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "अगोदर"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "मध्ये आहे"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "व"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "कोणतेहि"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "सर्व"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "काहिच नाही"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "साठवलेले शोध"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "नवीन साठवलेला शोध (_w)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"तुमची छायाचित्र लाइब्ररि शॉटवेलच्या या आवृत्तीसह सहत्व नाही. शॉटवेल %s (स्किमा %d) तर्फे "
+"निर्माण केले नाही, असे आढळते. हि आवृत्ती %s (schema %d) आहे. कृपया शॉटवेलच्या दुसऱ्या "
+"आवृत्तीचा वापर करा."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"आवृत्ती %s (स्किमा %d) पासून %s (स्किमा %d) करीता शॉटवेल छायाचित्र लाइब्ररि सुधारित "
+"करण्यास अशक्य. अधिक माहितीकरीता %s येथे कृपया शॉटवेल विकि तपासा"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"तुमची छायाचित्र लाइब्ररि शॉटवेलच्या ह्या आवृत्तीसह सहत्व नाही. हे शॉटवेल %s (स्किमा %d) "
+"तर्फे निर्मीत आहे, असे आढळते. हि आवृत्ती %s (स्किमा %d) आहे. कृपया %s नष्ट करून लाइब्ररि "
+"नष्ट करा व छायाचित्र पुनः आयात करा."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "शॉटवेलचे डाटाबेस: %s याची तपासणी करतेवेळी अपरिचीत त्रुटी आढळली"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "शॉटवेल लोड करत आहे"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "शॉटवेलच्या वैयक्तिक डाटाकरिता मार्ग"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "डिरेक्ट्री"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "बदलकरिता रनटाइमवेळी लाइब्ररि डिरेक्ट्री मॉनिटर करू नका"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "स्टार्टअप प्रगती मिटिर दाखवू नका"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "ॲप्लिकेशनची आवृत्ती दाखवा"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "उपलब्ध आदेश ओळ पर्यायांची संपूर्ण सूची पहाण्याकरीता '%s --help' चालवा.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "आज"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "काल"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "शीर्षक:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "d घटके:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d इव्हेंट"
+msgstr[1] "%d इव्हेंट्स्"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d छायाचित्र"
+msgstr[1] "%d छायाचित्र"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d व्हिडिओ"
+msgstr[1] "%d व्हिडिओज्"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "दिनांक:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "वेळ:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "येथून:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "करीता:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "आकार:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "कालावधी:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f सेकंद"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "डेव्हलपर:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "एक्सपोजर:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "ठिकाण:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "फाइल आकार:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "सध्याचे डेव्हलपमेंट:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "मूळ आकार:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "कॅमेरा मेक्:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "कॅमेरा मॉडल:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "फ्लॅश:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "फोकल लेंग्थ्:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "एक्सपोजर दिनांक:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "एक्सपोजर वेळ:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "एक्सपोजर बायस:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS लॅटिट्युड:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS लाँजिट्युड:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "कलाकार:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "सर्वहक्काधिकार:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "सॉफ्टवेअर:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "टिपण्णी:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "वाढिव माहिती"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "यामुळे टॅग \"%s\" एका छायाचित्रातून काढून टाकले जाईल. सुरू ठेवायचे?"
+msgstr[1] "यामुळे टॅग \"%s\", %d छायाचित्रातून काढून टाकले जाईल. सुरू ठेवायचे?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "रद्द करा (_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "नष्ट करा (_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "यामुळे साठवलेले सर्च \"%s\" काढून टाकले जाईल. सुरू ठेवायचे?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "डेव्हलपर्स् बदल्याने शॉटवेलमध्ये ह्या छायाचित्रकरीता केलेले सर्व बदल पूर्ववत् केले जाईल"
+msgstr[1] ""
+"डेव्हलपर्स् बदल्याने शॉटवेलमध्ये ह्या छायाचित्रकरीता केलेले सर्व बदल पूर्ववत् केले जातिल"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "स्विच् डेव्हलपर (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "व्हिडिओ एक्सपोर्ट करा"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"%s करीता लिहण्यास परवानगी नसल्यामुळे, हे छायाचित्र संपादित करण्यासाठी शॉटवेल फाइल "
+"निर्माण करण्यास अशक्य."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"फाइल त्रुटीमुळे खालिल छायाचित्र एक्सपोर्ट करण्यास अशक्य.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"तुम्हाला एक्सपोर्ट करणे सुरू ठेवायचे?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "सुरू ठेवायचे (_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "संपादन अशक्य"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "सध्याचे"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "रूपण (_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "दर्जा (_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "स्केलिंग कंस्ट्रेंट (_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " पिक्सेल्स् (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Export metadata"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "तपशील दाखवा..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "तपशील दाखवा"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(व %d जास्त)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "आयात परिणामचा अहवाल"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d फाइल आयात करायचा प्रयत्न केले."
+msgstr[1] "%d फाइल्स आयात करायचा प्रयत्न केला."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "यापैकी, %d फाइल यशस्वीरित्या आयात झाले."
+msgstr[1] "यापैकी, %d फाइल्स यशस्वीरित्या आयात झाले."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "हुबेहुब छायाचित्र किंवा व्हिडिओज आयात केले नाही:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "हुबेहुब अस्तित्वातील मिडिया घटक"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "कॅमेरा त्रुटींमुळे छायाचित्र किंवा व्हिडिओज आयात केले नाही:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "त्रुटी संदेश:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "छायाचित्र किंवा व्हिडिओ म्हणून न ओळखल्यामुळे फाइल्स आयात झाले नाही:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "छायाचित्र किंवा व्हिडिओज आयात केले नाही कारण ते शॉटवेलला कळेल अशा स्वरूपात नाही:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"फोटो किंवा व्हिडिओज आयात केले नाही कारण शॉटवेल त्यास लाइब्ररिमध्ये आयात करू शकले नाही:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%sला\n"
+"\t%s करिता प्रत बनवणे अशक्य"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "इतर कारणास्तव फोटो किंवा व्हिडिओज आयात केले नाही:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 हुबेहुब छायाचित्र आयात केले नाही:\n"
+msgstr[1] "%d हुबेहुब छायाचित्र आयात केले नाही:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 हुबेहुब व्हिडिओ आयात केले नाही:\n"
+msgstr[1] "%d हुबेहुब व्हिडिओ आयात केले नाही:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 हुबेहुब छायाचित्र/व्हिडिओ आयात केले नाही:\n"
+msgstr[1] "%d हुबेहुब छायाचित्र/व्हिडिओ आयात केले नाही:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "फाइल किंवा हार्डवेअर त्रुटीमुळे 1 छायाचित्र आयात करणे अपयशी:\n"
+msgstr[1] "फाइल किंवा हार्डवेअर त्रुटीमुळे %d छायाचित्र आयात करणे अपयशी:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "फाइल किंवा हार्डवेअर त्रुटीमुळे 1 व्हिडिओ आयात होण्यास अपयशी:\n"
+msgstr[1] "फाइल किंवा हार्डवेअर त्रुटीमुळे %d व्हिडिओ आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "फाइल किंवा हार्डवेअर त्रुटीमुळे 1 छायाचित्र/व्हिडिओ अपयशी:\n"
+msgstr[1] "फाइल किंवा हार्डवेअर त्रुटीमुळे %d छायाचित्र/व्हिडिओ अपयशी:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "फाइल किंवा हार्डवेअर त्रुटीमुळे 1 फाइल आयात करणे अपयशी:\n"
+msgstr[1] "फाइल किंवा हार्डवेअर त्रुटीमुळे %d फाइल आयात करणे अपयशी:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"छायाचित्र लाइब्ररि फोल्डर लेखनजोगी नसल्याने 1 छायाचित्र आयात होण्यास अपयशी:\n"
+msgstr[1] ""
+"छायाचित्र लाइब्ररि फोल्डर लेखनजोगी नसल्याने %d छायाचित्र आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "छायाचित्र लाइब्ररि लेखनजोगी नसल्याने 1 व्हिडिओ आयात होण्यासअपयशी:\n"
+msgstr[1] "छायाचित्र लाइब्ररि लेखनजोगी नसल्याने %d व्हिडिओज् आयात होण्यासअपयशी:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"छायाचित्र लाइब्ररि लेखनजोगी नसल्याने 1 छायाचित्र/व्हिडिओ आयात होण्यासअपयशी:\n"
+msgstr[1] ""
+"छायाचित्र लाइब्ररि लेखनजोगी नसल्याने %d छायाचित्र/व्हिडिओ आयात होण्यासअपयशी:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "छायाचित्र लाइब्ररि फोल्डर लेखनजोगी नसल्याने 1 फाइल आयात होण्यास अपयशी:\n"
+msgstr[1] "छायाचित्र लाइब्ररि फोल्डर लेखनजोगी नसल्याने %d फाइल्स् आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "कॅमेरा त्रुटीमुळे 1 छायाचित्र आयात होण्यास अपयशी:\n"
+msgstr[1] "कॅमेरा त्रुटीमुळे %d छायाचित्र आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "कॅमेरा त्रुटीमुळे 1 छायाचित्र आयात होण्यास अपयशी:\n"
+msgstr[1] "कॅमेरा त्रुटीमुळे %d छायाचित्र आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "कॅमेरा त्रुटीमुळे 1 छायाचित्र/व्हिडिओ आयात होण्यास अपयशी:\n"
+msgstr[1] "कॅमेरा त्रुटीमुळे %d छायाचित्र/व्हिडिओ आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "कॅमेरा त्रुटीमुळे 1 फाइल आयात होण्यास अपयशी:\n"
+msgstr[1] "कॅमेरा त्रुटीमुळे %d फाइल्स् आयात होण्यास अपयशी:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 असमर्थीत छायाचित्र वगळले:\n"
+msgstr[1] "%d असमर्थीत छायाचित्र वगळले:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 विना-प्रतिमा फाइल वगळले.\n"
+msgstr[1] "%d विना-प्रतिमा फाइल वगळले.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "वापरकर्ता रद्द झाल्याने 1 छायाचित्र वगळले:\n"
+msgstr[1] "वापरकर्ता रद्द झाल्याने %d छायाचित्र वगळले:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "वापरकर्ता रद्द झाल्याने 1 व्हिडिओ वगळले:\n"
+msgstr[1] "वापरकर्ता रद्द झाल्याने %d व्हिडिओ वगळले:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "वापरकर्ता रद्द झाल्याने 1 छायाचित्र/व्हिडिओ वगळले:\n"
+msgstr[1] "वापरकर्ता रद्द झाल्याने %d छायाचित्र/व्हिडिओ वगळले:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "वापरकर्ता रद्द झाल्याने 1 फाइल वगळले:\n"
+msgstr[1] "वापरकर्ता रद्द झाल्याने %d फाइल वगळले:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 छायाचित्र यशस्वीरित्या आयात केले.\n"
+msgstr[1] "%d छायाचित्र यशस्वीरित्या आयात केले.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 व्हिडिओ यशस्वीरित्या आयात केले.\n"
+msgstr[1] "%d व्हिडिओ यशस्वीरित्या आयात केले.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 छायाचित्र/व्हिडिओ यशस्वीरित्या आयात केले.\n"
+msgstr[1] "%d छायाचित्र/व्हिडिओ यशस्वीरित्या आयात केले.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "छायाचित्र किंवा व्हिडिओ आयात केले नाही:\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "आयात पूर्ण झाले"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d सेकंद"
+msgstr[1] "%d सेकंद"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d मिनिट"
+msgstr[1] "%d मिनिटे"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d तास"
+msgstr[1] "%d तास"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 दिवस"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "घटनाचे पुनःनामांकन करा"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "नाव:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "शीर्षक संपादित करा"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ट्रॅश फाइल (_T)"
+msgstr[1] "ट्रॅश फाइल्स् (_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "फक्त काढून टाका (_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "बाहेरिल संपादन पूर्वस्थितीत आणायचे?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "बाहेरिल संपादन पूर्वस्थितीत आणायचे?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "यामुळे बाहेरिल फाइलकरीता केलेले सर्व बदल नष्ट होतील. सुरू ठेवायचे?"
+msgstr[1] "यामुळे बाहेरिल %d फाइलकरीता केलेले सर्व बदल नष्ट होतील. सुरू ठेवायचे?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "बाहेरिल संपादन पूर्वस्थितीत आणा (_v)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "बाहेरिल संपादन पूर्वस्थितीत आणा (_v)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "यामुळे लाइब्ररितून छायाचित्र काढून टाकले जाईल. सुरू ठेवायचे?"
+msgstr[1] "यामुळे लाइब्ररितून %d छायाचित्र काढून टाकले जाईल. सुरू ठेवायचे?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "काढून टाका (_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "लाइब्ररिपासून छायाचित्र काढून टाका"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "लाइब्ररितून छायाचित्र काढून टाका"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 तास"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "समान प्रमाणात चायाचित्र/व्हिडिओ शिफ्ट करा (_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "सर्व छायाचित्र/व्हिडिओजना यावेळकरीता सेट करा (_a)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "मूळ छायाचित्र फाइल संपादित करा (_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "मुळ छायाचित्र फाइल्स् संपादित करा (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "मुळ फाइल संपादित करा (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "मूळ फाइल्स् संपादित करा (_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "मूळ: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"एक्सपोजर वेळ\n"
+"%d %s, %d %s, %d %s, व %d %s तर्फे पुढे हलविला जाईल."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"एक्सपोजर वेळ\n"
+"%d %s, %d %s, %d %s, व %d %s तर्फे मागे हलविला जाईल."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "दिवस"
+msgstr[1] "दिवस"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "तास"
+msgstr[1] "तास"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "मिनिट"
+msgstr[1] "मिनिटे"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "सेकंद"
+msgstr[1] "सेंकद"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"व %d इतर."
+msgstr[1] ""
+"\n"
+"\n"
+"व %d इतर."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "टॅग्स् (स्वल्पविरामतर्फे विभाजीत):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "स्वागत आहे!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "शॉटवेलवर स्वागत आहे!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "सुरू करण्यासाठी, छायाचित्रांना खालिलपैकी कोणत्याहि पद्धतीने आयात करा:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">फाइल %s फोल्डरपासून आयात करा</span> पसंत करा"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "शॉटवेल पटलावर छायाचित्र ओढा व टाका"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "संगणकाशी कॅमेराची जोडणी करा व आयात करा"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "%s फोल्डरपासून छायाचित्र आयात करा (_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "छायाचित्रांना खालिलपैकी कोणत्याहि पद्धतीने आयात करणे शक्य आहे:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "हे संदेश पुन्हा दाखवू नका (_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "%s लाइब्ररितून छायाचित्र आयात करा"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(मदत)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "वर्ष%sमहिना%sदिवस"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "वर्ष%sमहिना"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "वर्ष%sमहिना-दिवस"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "वर्ष-महिना-दिवस"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "पसंतीचे"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "अवैध रचना"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"शॉटवेल छायाचित्रांना लाइब्ररि फोल्डरमध्ये प्रत बनवतो किंवा त्यास प्रत न बनवता आयात करणे "
+"शक्य आहे."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "छायाचित्रांचे प्रत बनवा (_p)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "आयात जागेवर आहे (_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "लाइब्ररिमध्ये आयात करा"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "लाइब्ररितून काढून टाका"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "लाइब्ररितून छायाचित्र काढून टाका"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "लाइब्ररिपासून छायाचित्र काढून टाकत आहे"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यामुळे शॉटवेल लाइब्ररिपासून छायाचित्र/व्हिडिओ काढून टाकले जाईल. तुम्हाला फाइलला डेस्कटॉप "
+"ट्रॅशकडे हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+msgstr[1] ""
+"यामुळे शॉटवेल लाइब्ररिपासून %d छायाचित्र/व्हिडिओ काढून टाकले जाईल. तुम्हाला फाइलला "
+"डेस्कटॉप ट्रॅशकडे हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यामुळे शॉटवेल लाइब्ररिपासून व्हिडिओ काढून टाकले जाईल. तुम्हाला फाइलला डेस्कटॉप ट्रॅशकडे "
+"हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+msgstr[1] ""
+"यामुळे शॉटवेल लाइब्ररिपासून %d व्हिडिओज् काढून टाकले जाईल. तुम्हाला फाइलला डेस्कटॉप "
+"ट्रॅशकडे हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"यामुळे शॉटवेल लाइब्ररिपासून छायाचित्र काढून टाकले जाईल. तुम्हाला फाइलला डेस्कटॉप ट्रॅशकडे "
+"हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+msgstr[1] ""
+"यामुळे शॉटवेल लाइब्ररिपासून %d छायाचित्र काढून टाकले जाईल. तुम्हाला फाइलला डेस्कटॉप "
+"ट्रॅशकडे हलवायचे?\n"
+"\n"
+"हि कृती पूर्ववत् करणे अशक्य."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"डेस्कटॉप ट्रॅशककरीता छायाचित्र किंवा व्हिडिओ स्थानांतरीत करणे अशक्य. फाइल नष्ट करायची?"
+msgstr[1] ""
+"डेस्कटॉप ट्रॅशककरीता %d छायाचित्र/व्हिडिओ स्थानांतरीत करणे अशक्य. फाइल नष्ट करायचे?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "छायचित्र किंवा व्हिडिओ नष्ट करणे अशक्य."
+msgstr[1] "%d छायचित्र/व्हिडिओ नष्ट करणे अशक्य."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "फोल्डर्स"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "टॅग्स्"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "यश"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "फाइल त्रुटी"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "फाइल डिकोड करणे अशक्य"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "डाटाबेस त्रुटी"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "वापरकर्तातर्फे आयात रद्द केले"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "फाइल नाही"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "फाइल आधिपासूनच माहितीकोषमध्ये आहे"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "असमर्थीत फाइल रूपण"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "प्रतिमा फाइल नाही"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "डिस्क अपयश"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "डिस्क भरले"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "कॅमेरा त्रुटी"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "फाइल लिहतेवेळी त्रुटी"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "आयात अपयशी (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "संपादित केले"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "मागील छायाचित्र"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "पुढील छायाचित्र"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "छायाचित्र स्रोत फाइल: %s आढळले नाही"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "अवलोकन (_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "साधने (_o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "मागील छायाचित्र (_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "मागील छायाचित्र"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "पुढील छायाचित्र (_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "पुढील छायाचित्र"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "मोठे करा (_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "छायाचित्राचे वर्धन वाढवा"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "लहान करा (_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "छायाचित्राचे वर्धन कमी करा"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "पृष्ठात घट्ट बसवा (_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "पडद्यात घट्ट बसवण्याकरीता छायाचित्राला मोठे करा"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "100% मोठे करा (_1)"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "छायाचित्राला 100% वर्धन मोठे करा"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "200% मोठे करा (_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "छायाचित्राला 200% वर्धन मोठे करा"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "डेव्हलपर (_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s: %s एक्सपोर्ट करणे अशक्य"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s डाटाबेस"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "त्रुटी आढळल्यामुळे %s पासून आयात करणे पुढे सुरू ठेवणे आवश्यक:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "इतर सर्व्हिसपासून आयात करण्यासठी, वरील मेन्युपासून नीवडा."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "डाटा इम्पोर्टस्"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"तुमच्याकडे कोणतेहि डाटा इम्पोर्टस् प्लगइन्स् सुरू केले नाही.\n"
+"\n"
+"ॲप्लिकेशन फंक्शनॅलिटिपासून आयात करायचे असल्यास, किमान एक डाटा इम्पोर्टस् प्लगइन सुरू असणे "
+"आवश्यक आहे. प्लगइन्स्ला पसंती संवादात सुरू करणे शक्य आहे."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "माहितीकोष फाइल:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "आयात करा (_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "ॲप्लिकेशनपासून आयात करा"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "मिडिया आयात करा (_f):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "बंद करा (_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "सेटिंग्स्"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "स्लाइशो"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "मागे"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "मागील छायाचित्राकडे जा"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "थांबा"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "स्लाइडशो थांबवा"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "पुढे"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "पुढच्या छायाचित्राकडे जा"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "स्लाइडशो सेटिंग्स् बदलवा"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "सर्व छायाचित्र स्रोत फाइल्स् आढळले नाही."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "चालवा"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "स्लाइडशो सुरू ठेवा"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "पूर्वस्थितीत आणात आहे"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "पूर्वस्थितीत आणने अशक्य"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "सुधारित करत आहे"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "सुधारणा पूर्ववत् करणे अशक्य"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "नवीन घटना निर्माण करत आहे"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "घटना काढून टाकत आहे"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "छायाचित्रांना नवीन घटनाकरीता हलवत आहे"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "छायाचित्रांना मागील घटनाकरीता सेट करत आहे"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "एकत्र करत आहे"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "एकत्र अशक्य करत आहे"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "छायाचित्रांना हुबेहुब करत आहे"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "हुबेहुब छायाचित्रांना काढून टाकत आहे"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "फाइल त्रुटीमुळे एक छायाचित्र हुबेहुब करण्यास अशक्य"
+msgstr[1] "फाइल त्रुटीमुळे %d छायाचित्रांना हुबेहुब करण्यास अशक्य"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "मागील रेटिंग पूर्वस्थितीत आणात आहे"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "रेटिंग वाढवत आहे"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "रेटिंग कमी करत आहे"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW डेव्हलपर सेट करत आहे"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "मागील RAW डेव्हलपर पूर्वस्थितीत आणात आहे"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "डेव्हलपर सेट करत आहे"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "मूळ छायाचित्र सुस्थित करणे अशक्य."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "दिनांक व वेळ सुस्थीत करत आहे"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "दिनांक व वेळ सुस्थीत करणे पूर्ववत् करत आहे"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "एक मूळ छायाचित्र सुस्थीत करणे अशक्य."
+msgstr[1] "खालिल मूळ छायाचित्रांना सुस्थीत करणे अशक्य."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Time Adjustment Error"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "खालिल छायाचित्र फाइलवर वेळ सुस्थीत करणे पूर्ववत् करण्यास अशक्य."
+msgstr[1] "खालिल छायाचित्र फाइलवर वेळ सुस्थीत करणे पूर्ववत् करण्यास अशक्य."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "टॅग निर्माण करा"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "टॅग \"%s\" स्थानांतरीत करा"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "छायाचित्रांना ट्रॅशकडे स्थानांतरीत करा"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ट्रॅशपासून छायाचित्रांना पूर्वस्थितीत आणा"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "शॉटवेल ट्रॅशकरीता छायाचित्र स्थानांतरीत करत आहे"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "शॉटवेल लाइब्ररिकरीता छायाचित्राला पूर्वस्थितीत आणा"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "छायाचित्रांना कचरापेटिकडे स्थानांतरीत करत आहे"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "कचरापेटिपासून छायाचित्र पूर्वस्थितीत आणात आहे"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "नीवडलेल्या छायाचित्रांना फ्लॅग करा"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "नीवडलेल्या छायाचित्रांना फ्लॅग अशक्य करा"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "फ्लॅग"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "फ्लॅग अशक्य"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "शॉटवेल"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "कमी (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "मध्यम (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "जास्त (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "कमाल (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "छायाचित्र/व्हिडिओज् नाही"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "छायाचित्र/व्हिडिओज् आढळले नाही"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ह्या डिरेक्ट्रीमध्ये छायाचित्र एक्सपोर्ट करणे अशक्य."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "मॉनिटरिंग सुधारणा: %s चे विश्लेषण अश्कय"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "संपूर्ण पृष्ठ भरून काढा"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 प्रतिमा दर पृष्ठ"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "इन."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "सेमि"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "वॅलेट (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "नोटकार्ड (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 इंच"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 इंच"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 इंच"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 इंच"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 इंच"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "मेट्रिक वॅलेट (9 x 13 सेमि)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "पोस्टकार्ड (10 x 15 सेमि)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 सेमि"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 सेमि"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 सेमि"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 सेमि"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 सेमि"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "प्रतिमा सेटिंग्स्"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "छपाई..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"छायाचित्राची छपाई करणे अशक्य:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "छायाचित्र माहितीकोष %s उघडणे/निर्माण करणे अशक्य: त्रुटी कोड %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"छायाचित्र माहितीकोष फाइलकरीता लिहणे अशक्य:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"माहितीकोष फाइलकरीता प्रवेश प्राप्त करतेवेळी त्रुटी:\n"
+" %s\n"
+"\n"
+"त्रुटी: \n"
+"%s अशी होती"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "व्हिडिओज् एक्सपोर्ट करा"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "नॉटिलस सेंड-टू: %s सुरू करणे अशक्य"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "येथे पाठवा"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s: %s करीता पार्श्वभूमी एक्सपोर्ट करणे अशक्य"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "डेस्कटॉप स्लाइडशो: %s तयार करणे अशक्य"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "फ्लॅग केले"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "कचरापेटी"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "कचरपेटी रिकामी आहे"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "नष्ट करा"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "छायाचित्रांना नष्ट करत आहे"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "फाइल्स् आढळले नाही"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "नष्ट करत आहे..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "शेवटचे आयात"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "फोल्डरपासून आयात करा (_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "डिस्क ते लाइब्ररि छायाचित्र आयात करा"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "ॲप्लिकेशनपासून आयात करा (_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "घटनांना क्रमवारित लावा (_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "कचरापेटी रिकामी करा (_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "कचरापेटितील सर्व छायाचित्र नष्ट करा"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "छायाचित्रकरीता घटनाचे अवलोकन (_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "शोधा (_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "सर्च तपशीलतर्फे छायाचित्र व व्हिडिओज शोधा"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "फाइल (_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "संपादित करा (_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "छायाचित्र (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "छायाचित्र (_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "घटना (_t)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "टॅग्स् (_g)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "मदत (_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "मुळ माहिती (_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "नीवडकरीता मुळ माहिती दाखवा"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "विस्तारित माहिती (_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "नीवडकरीता विस्तारित माहिती दाखवा"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "सोध पट्टी (_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "शोध पट्टी दाखवा"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "बाजूचीपट्टी (_i)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "बाजूचीपट्टी दाखवा"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "चढता क्रम (_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "चढत्या क्रमवारित छायाचित्र लावा"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "उतरते क्रम (_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "उतरत्या क्रमवारित छायाचित्र लावा"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "फोल्डरपासून आयात करा"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "कचरापेटी रिकामी करा"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "कचरापेटी रिकामी करत आहे..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "होम डिरेक्ट्रीपासून छायाचित्रांना आयात करण्यासाठी शॉटवेलला संरचीत केले आहे.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "लाइब्ररिचे ठिकाण"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "छायाचित्रांना ह्या डिरेक्ट्रीपासून आयात करणे अशक्य."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "लाइब्ररि सुधारित करत आहे..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "छायाचित्रांना स्वयं-आयात करण्यास तयार करत आहे..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "छायाचित्रांना स्वयं-आयात करत आहे..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "मेटाडाटाला फाइल्स्करीता लिहत आहे..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "लाइब्ररि"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "आयात करत आहे..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "आयात थांबवा (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "छायाचित्रांना आयात करणे थांबवा"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "आयात करण्यास तयार करत आहे..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s आयात केले"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "साठवा (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "छायाचित्र साठवा"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "असे साठवा (_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "वेगळ्या नावाने छायाचित्र साठवा"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "संगणकाशी जुळलेल्या छपाईयंत्राशी छायाचित्राची छपाई करा"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s अस्तित्वात नाही."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s फाइल नाही."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s फाइल रूपणकरीता\n"
+"%s समर्थन पुरवत नाही."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "प्रत साठवा (_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s करीता बदल साठवायचे?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "न साठवता बंद करा (_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s: %s करीता साठवतेवेळी त्रुटी"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "असे साठवा"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s नियंत्रीत करणे अशक्य: डिरेक्ट्री नाही (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "छायाचित्र व्यवस्थापक"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "फोटो दर्शक"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "सर्वहक्काधिकार 2009-2013 योर्बा फाउंडेशन"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "उजवीकडून फिरवा ( _R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "फिरवा"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "उजवीकडे फिरवा"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "चित्रांना उजवीकडे फिरवा (डाविकडे फिरवण्यासाठी Ctrl दाबा)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "डावीकडे फिरवा (_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "डावीकडे फिरवा"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "चित्रांना डावीकडे फिरवा"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "आडवे पलटी करा (_z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "आडवे पलटी करा"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "उभे पलटी करा (_c)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "उभे पलटी करा"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "सुधारित करा (_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "सुधारणा करा"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "छायाचित्राचे आगमन स्वयं सुधारित करा"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "क्रॉप करा (_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "क्रॉप"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "छायाचित्राचे आकार क्रॉप करा"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "सरळ करा (_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "सरळ करा"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "छायाचित्र सरळ करा"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "रेड-आय (_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "रेड-आय"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "छायाचित्रातील कोणतेहि रेड-आय प्रभाव कमी किंवा काढून टाका"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "सुस्थीत करा (_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "सुस्थीत करा"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "छायाचित्राचे रंग व टोन सुस्थीत करा"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "मूळ पूर्वस्थितीत आणा (_v)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "मूळ स्थितीत आणा"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "बाहेरिल संपादन पूर्वस्थितीत आणा (_d)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "मास्टर छायाचित्राकडे जा"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "डेस्कटॉप पार्श्वभूमी म्हणून सेट करा (_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "नीवडलेल्या प्रतिमेला नवीन डेस्टॉप पार्श्वभूमी म्हणून निश्चित करा"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "डेस्कटॉप स्लाइडशो म्हणून ठरवा (_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "पूर्ववत् करा (_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "पूर्ववत् करा"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "पुनः करा (_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "पुन्हा करा"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "घटनाला पुनःनामांकीत करा (_n)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "घटनाकरीता कि छायाचित्र बनवा (_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "घटनाकरीता कि छायाचित्र बनवा"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "नवीन घटना (_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "नवीन घटना"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "छायाचित्रांना स्थानांतरीत करा"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "छायाचित्रांना घटनाकरीता स्थानांतरीत करा"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "घटना एकत्र करा (_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "एकत्र करा"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "घटनाला एकाच घटनामध्ये एकत्र करा"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "रेटिंग ठरवा (_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "रेटिंग ठरवा"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "छायाचित्राचे रेटिंग बदला"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "वाढवा (_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "रेटिंग वाढवा"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "कमी करा (_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "रेटिंग कमी करा"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "रेटिंग न केलेले (_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "रेटिंग न केलेले"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "रेटिंग न केलेल्यांना रेट करा"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "रेट न केलेले म्हणून ठरवत आहे"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "कोणतेहि रेटिंग्स् काढून टाका"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "नकारले (_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "नकारले"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "रेट नकारले"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "नकारले म्हणून ठरवत आहे"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "रेटिंगला नकारले म्हणून ठरवत आहे"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "फक्त नकारलेले (_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "फक्त नकारलेले"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "फक्त नकारलेले छायाचित्र दाखवा"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "सर्व + नकारलेले (_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "सर्व छायाचित्र दाखवा, नकारलेले समाविष्टीत"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "सर्व छायाचित्र (_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "सर्व छायाचित्र दाखवा"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "रेटिंग्स् (_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "प्रत्येक छायाचित्राचे रेटिंग दाखवा"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "छायाचित्र फिल्टर करा (_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "छायाचित्र फिल्टर करा"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "फिल्टरवर आधारित दाखवलेल्या छायाचित्रांची मर्यादा ठरवा"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "हुबेहुब (_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "हुबेहुब"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "छायाचित्राचे हुबेहुब करा"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "एक्सपोर्ट करा (_E)..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "छपाई (_P)..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "प्रकाशित करा (_b)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "प्रकाशित करा"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "विविध संकेतस्थळांवर प्रकाशित करा"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "शीर्षक संपादित करा (_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "टिपण्णी संपादित करा (_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "टिपण्णी संपादित करा"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "दिनांक व वेळ सुस्थीत करा (_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "दिनांक व वेळ सुस्थीत करा"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "टॅग्स् समाविष्टीत करा (_T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "टॅग्स् समाविष्ट करा (_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "टॅग्स् समाविष्ट करा"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "पसंती (_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "बाहेरिल संपादकसह उघडा (_x)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW संपादकासह उघडा (_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "येथे पाठवा (_T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "येथे पाठवा (_o)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "शोधा (_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "शोधा"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "नाव किंवा टॅग्समध्ये आढळणारे मजकूर टाइप करून प्रतिमा शोधा"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "फ्लॅग (_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "फ्लॅग अशक्य करा (_f)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "संपादक सुरू करण्यास अशक्य: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "टॅग \"%s\" समाविष्ट करा"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" व \"%s\" टॅग्स् समाविष्ट करा"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "टॅग \"%s\" नष्ट करा (_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "टॅग \"%s\" नष्ट करा"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "टॅग नष्ट करा"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "नवीन (_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "टॅग \"%s\" ला पुनःनाव द्या..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" ला \"%s\" असे पुनः टॅग द्या"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "पुनःनामांकित करा (_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "टॅग्स् संपादित करा (_y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "टॅग्स् संपादित करा"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "फोटोला \"%s\" म्हणून टॅग लावा"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "फोटोला \"%s\" म्हणून टॅग लावा"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "नीवडलेल्या छायाचित्रांना \"%s\" म्हणून टॅग करा"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "नीवडलेल्या छायचित्रांना \"%s\" म्हणून टॅग करा"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "छायाचित्रपासून टॅग \"%s\" काढून टाका (_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "छायाचित्रांपासून टॅग \"%s\" काढून टाका (_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "छायाचित्रांपासून टॅग \"%s\" काढून टाका"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "छायाचित्रांपासून टॅग \"%s\" काढून टाका"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "टॅग आधिपासूनच अस्तित्वात असल्यास टॅगला \"%s\" करीता पुनःनामांकीत करा."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "शोध आधिपासूनच अस्तित्वात असल्यास शोधला \"%s\" करीता पुनःनामांकीत करणे अशक्य."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "साठवलेला शोध"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "शोध नष्ट करा"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "संपादित करा (_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "पुनःनामांकन करा (_n)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "शोध \"%s\" ला \"%s\" करीता पुनःनामांकीत करा"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "शोध \"%s\" नष्ट करा"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s ला रेट करा"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "रेटिंगला %s करीता ठरवा"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "रेटिंगला %s करीता ठरवा"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s दाखवा"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "फक्त %s रेटिंगचे फोटज दाखवा"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s किंवा उत्तम"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s किंवा उत्तम दाखवा"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s किंवा उत्तम असलेले रेटिंगचे छायाचित्र दाखवा"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "कचरापेटीपासून नीवडलेले छायाचित्र काढून टाका"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "लाइब्ररिपासून नीवडलेलेल छायाचित्र काढून टाका"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "पूर्वस्थितीत आणा (_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "लाइब्ररिमध्ये नीवडलेल्या छायाचित्रांना पुनः हलवा"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "फाइल व्यवस्थापकात दाखवा (_g)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "फाइल व्यवस्थापकात नीवडलेली छायाचित्र डिरेक्ट्री उघडा"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "फाइल व्यवस्थापक: %s मध्ये उघडणे अशक्य"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "लाइब्ररिपासून काढून टाका (_e)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "कचरापेटीकडे स्थानांतरीत करा (_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "सर्व नीवडा (_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "सर्व घनकांना नीवडा"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "b %-d %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "कोन:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "मूळस्थितीत आणा (_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "सध्याच्या छायाचित्र आकारकडे या"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "ह्या छायाचित्रकरीता क्रॉप ठरवा"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "उभे व आडवे निर्देशन अंतर्गत क्रॉप चौकोनला पिवोट करा"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "भाग पाडणे अशक्य"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "चौकोन"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "पडदा"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "मूळ आकार"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD व्हिडिओ (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD व्हिडिओ (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "लेटर (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "टॅब्लॉइड (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "रेड-आय साधन बंद करा"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "नीवडलेल्या क्षेत्रात कोणतेहि रेड-आय प्रभाव काढून टाका"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "संर्पुक्तता:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "टिंट:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "तापमान:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "छाया:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "रंग मूळस्थितीत आणा"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "सर्व रंग आयोजनाला मूळस्थितीत आणा"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "तापमान"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "टिंट"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "संर्पुक्तता"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "एक्सपोजर"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "छाया"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "काँट्रास्ट एक्सपाँशन"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "साधनपट्टीला पिन लावा"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "साधनपट्टी उगडाला पिन करा"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "पडदाभर सोडा"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "पडदाभर सोडा (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "बाहेर पडा (_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "विषयी (_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "पडदाभर (_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "अंतर्भुत माहिती (_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "फ्रिक्वेंटलि आस्कड् क्वेशन्स् (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "अडचण कळवा (_R)..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"शॉटवेलच्या लाइब्ररिकरीता प्रवेश प्राप्त करतेवेळी धोकादायक त्रुटी आढळली. शॉटवेल पुढे सुरू "
+"ठेवणेअशक्य.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "योर्बा संकेतस्थावर भेट द्या"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "संदिप शेडमाके <sshedmak@redhat.com>, 2012"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "मदत: %s दाखवणे अशक्य"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "बग डाटाबेस: %s करीता संरचना अशक्य"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ: %s दाखवणे अशक्य"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "विनाशीर्षक"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "मूळ आकार"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "रूंदी किंवा ऊंची"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "रूंदी"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ऊंची"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "थंबनेल्स्चा आकार आयोजीत करा"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "थंबनेल्स्चे वर्धन वाढवा"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "थंबनेल्स्चे वर्धन कमी करा"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "छायाचित्र क्रमवारीत लावा (_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "व्हिडिओ चालवा (_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "सिस्टम व्हिडिओ प्लेअरमध्ये नीवडलेले व्हिडिओज् उघडा"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "टिपण्णी (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "प्रत्येक छायाचित्राची टिपण्णी दाखवा"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "प्रत्येक छायाचित्राचे टॅग्स् दाखवा"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "शीर्षक प्रमाणे (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "छायाचित्रांना शीर्षक प्रमाणे क्रमवारीत लावा"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "एक्सपोजर दिनांक प्रमाणे (_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "एक्सपोजर दिनांक प्रमाणे छायाचित्र क्रमवारित लावा"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "रेटिंग प्रमाणे (_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "रेटिंग प्रमाणे छायाचित्र क्रमवारित लावा"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"शॉटवेल नीवडलेले व्हिडिओ चालवण्यास अशक्य:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d छायाचित्र/व्हिडिओ"
+msgstr[1] "%d छायाचित्र/व्हिडिओ"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "प्रत्येक घटनाची टिपण्णी दाखवा"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "घटना आढळली नाही"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "घटना आढळली नाही"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "घटना"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "दिनांक नाही"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "घटना आढळली नाही"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "कॅशे डिरेक्ट्री %s: %s निर्माण करण्यास अशक्य"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "डाटा डिरेक्ट्री %s: %s निर्माण करणे अशक्य"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "चित्र"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "तात्पुर्ते डिरेक्ट्री %s: %s निर्माण करणे अशक्य"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "डाटा सबडिरेक्ट्री %s: %s निर्माण करणे अशक्य"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(काहिच नाही)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "काहिच नाही"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "विनाक्रम"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "स्लाइडशो ट्रांजिशन्स्"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s: %s करीता तात्पुर्ती फाइल निर्माण करणे अशक्य"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "एस्पोर्ट करत आहे"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "फाइल %s आधिपासूनच अस्तित्वात आहे. अदलाबदल करायचे?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "वगळा (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "अदलाबदल करा (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "सर्व अदलाबदल करा (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "एक्सपोर्ट करा"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "छायाचित्र"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "व्हिडिओज्"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW छायाचित्र"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW छायाचित्र"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI फाइल %s: %s लोड करतेवेळी त्रुटी"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "प्रकार"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "प्रकाशित करत आहे"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "नीवडलेले छायाचित्र/व्हिडिओज् यशस्वीरित्या प्रकाशित केले."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "नीवडलेले व्हिडिओज यशस्वीरित्या प्रकाशित केले."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "नीवडलेले छायाचित्र यशस्वीरित्या प्रकाशित केले."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "नीवडलेले व्हिडिओज् यशस्वीरित्या प्रकाशित केले."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "नीवडलेले छायाचित्र यशस्वीरित्या प्रकाशित केले."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "खाते माहिती प्राप्त करत आहे..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "प्रवेश करत आहे..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "छायाचित्र प्रकाशित करा"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "छायाचित्र येथे प्रकाशित करा (_t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "व्हिडिओज प्रकाशित करा"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "व्हिडिओज प्रकाशित करा (_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "छायाचित्र व व्हिडिओज प्रकाशित करा"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publish photos and videos _to"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "प्रकाशित करणे अशक्य"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"सहत्व प्रकाशन प्लगइन सुरू नसल्यामुळे शॉटवेल नीवडलेल्या घटकांना प्रकाशित करण्यास अशक्य आहे. "
+"यास योग्य करायचे असल्यास, <b>%s पसंती संपादित करत आहे</b> पसंत करा व <b>प्लगइन्स्</b> "
+"टॅबवर एक किंवा त्यापेक्षा जास्त प्रकाशन प्लगइन्स् सुरू किंवा बंद करा."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "अपलोडची तयारी करत आहे"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d सुधारित करत आहे, %d पैकी"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "त्रुटी आढळल्यामुळे %s चे प्रकाशन पुढे सुरू ठेवणे अशक्य:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "इतर सर्व्हिसकरीता प्रकाशन सुरू ठेवण्यासाठी, वरीलपासून एक पसंत करा."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "नवीन टॅग (_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "प्रकाशनकरीता आवश्यक तात्पुर्ती फाइल अनुपलब्ध आहे"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"तुम्ही सध्या युट्युबमध्ये प्रवेश केला आहे.\n"
+"\n"
+"तुम्ही आधिपासूनच गूगल खातेकरीता स्वाक्षरि केली व पुढे जाण्यासाठी युट्युबसह वापर सेट केले आहे. "
+"युट्युब स्थळावर किमान एकदा प्रवेश करण्यासाठी ब्राऊजरचा वापर करून अनेक खाते ठरवणे शक्य आहे."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "प्रकाशनकरीता आवश्यक फाइल अनुपलब्ध आहे. युट्युबकरीता प्रकाशन चालू ठेवणे अशक्य."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "तुम्ही आता युट्युबमध्ये %s म्हणून प्रवेश केला."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "व्हिडिओज् '%s' मध्ये आढळतील"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "ब्लिक लिस्टेड"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "पब्लिक लिस्ट अशक्य"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "खाजगी"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "कोर पब्लिशिंग सर्व्हिसेस्"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"तुम्ही सध्या फ्लिकरमध्ये प्रवेश केला नाही.\n"
+"\n"
+"वेब ब्राउजरमध्ये फ्लिकरमध्ये प्रवेश करा क्लिक करा. फ्लिकर खात्याशी जोडणी करण्यासाठी "
+"तुम्हाला शॉटवेल कनेक्टशी ओळख पटवावी लागेल."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ह्या शॉटवेल सत्रवेळी तुम्ही अनेकवेळा फ्लिकरमध्ये प्रवेश केला व बाहेर पडले.\n"
+"फ्लिकरवर प्रकाशन सुरू ठेवायचे असल्यास, शॉटवेलमधून बाहेर पडा व पुनः सुरू करा, व त्यानंतर "
+"पुनःप्रकाशनकरीता प्रयत्न करा."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "प्रवेशकरीता तयार होत आहे..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "प्रकाशनकरीता आवश्यक फाइल अनुपलब्ध आहे. फ्लिकरकरीता प्रकाशन चालू ठेवणे अशक्य."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "ओळख पटवणे तपासत आहे..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"तुम्ही आता फ्लिकरमध्ये %s म्हणून प्रवेश केला.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"तुमचे मोफत फ्लिकर खाते प्रत्येक महिन्याला तुम्ही किती डाटा अपलोड करू शकता, ते ठरवते.\n"
+"ह्या महिन्यात, अपलोड कोटामध्ये तुमच्याकडे %d मेगाबाइट्स् उर्वरित आहेत."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "तुमचे फ्लिकर प्रो अकाउंट तुम्हाला अमर्यादीत अपलोड्स्करीता परवानगी देते."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "छायाचित्र यांस दृष्यास्पद आहे (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "यास व्हिडिओज् दृष्यास्पद आहे (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "छायाचित्र व व्हिडिओज् दृष्यास्पद आहे (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "सर्व"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "मित्र & फक्त फॅमिलि"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "xफक्त फॅमिलि"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "फक्त मित्र"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "फक्त मी"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 पिक्सेल्स्"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 पिक्सेल्स्"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 पिक्सेल्स्"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 पिक्सेल्स्"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "अल्बम %s निर्माण करत आहे..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigoकरिता प्रकाशीत करतेवेळी त्रुटी संदेश आढळले. कृपया पुन्हा प्रयत्न करा."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Piwigo छायाचित्र लाइब्ररिचे URL तसेच वापरकर्तानाव व त्या लाइब्ररिशी संबंधित Piwigo "
+"खात्याचे पासवर्ड द्या."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"शॉटवेल Piwigo छायाचित्र लाइब्ररिसह संपर्क करण्यास अशक्य. कृपया दिलेल्या URLची तपासणी "
+"करा"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "वापरकर्तानाव व/किंवा पासवर्ड अवैध आहे. कृपया पुन्हा प्रयत्न करा"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "अवैध URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "अवैध वापरकर्ता नाव किंवा पासवर्ड"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "शॉटवेल कनेक्ट"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "ॲडमिन्स्, फॅमिलि, मित्र, संपर्क"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "ॲडमिन्स्, फॅमिलि, मित्र"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "ॲडमिन्स्, फॅमिलि"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "ॲडमिन्स्"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"तुम्ही सध्या पिकासा वेब अल्बममध्ये प्रवेश केला नाही.\n"
+"\n"
+"वेब ब्राउजरमध्ये पिकासा वेब अल्बममध्ये प्रवेश करण्यासाठी प्रवेश करा क्लिक करा. पिकासा वेब "
+"अल्बम खात्याशी जोडणी करण्यासाठी शॉटवेल कनेक्टशी ओळख पटवणे आवश्यक आहे."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr "प्रकाशनकरीता आवश्यक फाइल अनुपलब्ध आहे. पिकासाकरीता प्रकाशन चालू ठेवणे अशक्य."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "अल्बम निर्माण करत आहे..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "तुम्ही आता पिकासा वेब अल्बम्समध्ये %s म्हणून प्रवेश केला."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "व्हिडिओज् येथे आढळतील:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "छायाचित्र येथे आढळतील:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "लहान (640 x 480 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "मध्यम (1024 x 768 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "शिफारसीय (1600 x 1200 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"तुम्ही सध्या फेसबूकमध्ये प्रवेश केला आहे.\n"
+"\n"
+"अजूनही फेसबूक खाते नसल्यास, प्रवेश करतेवेळी त्यास निर्माण करणे शक्य आहे. प्रवेश करतेवेळी, "
+"शॉटवेल कनेक्ट छायाचित्र अपलोड करण्यास व फीड प्रकाशीत करण्यास तुम्हाला परवानगीकरीता "
+"विचारेल. हि परवानगी शॉटवेल कनेक्टला योग्यरित्या कार्य करण्याकरीता आवश्यक आहे."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ह्या शॉटवेल सत्रवेळी तुम्ही अनेकवेळा फेसबूकमध्ये प्रवेश केला व बाहेर पडले.\n"
+"फेसबूकवर प्रकाशन सुरू ठेवायचे असल्यास, शॉटवेलमधून बाहेर पडा व पुनः सुरू करा, व त्यानंतर "
+"पुनःप्रकाशनकरीता प्रयत्न करा."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "मानक (720 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "मोठे (2048 पिक्सेल्स्)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "फेसबूकसह जोडणीची चाचणी करत आहे..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "प्रकाशनकरीता आवश्यक फाइल अनुपलब्ध आहे. फेसबूककरीता प्रकाशन चालू ठेवणे अशक्य."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"तुम्ही फेसबूकमध्ये %s म्हणून प्रवेश केला आहे.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "नीवडलेले छायाचित्र कुठे प्रकाशित करायला आवडेल?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "अपलोड आकार (_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "प्रिय"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "चुरा"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "बुद्धिबळ"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "वर्तुळ"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ब्लाइंड्स"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "स्ट्राइप्स"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "घड्याळ"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "वर्तुळ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "कोर स्लाइडशो ट्रांजिशन्स्"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "सर्वहक्काधिकार 2010 मॅक्सिम कार्ताशेव, सर्वहक्काधिकार 2011-2013 योर्बा फाउंडेशन"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "स्लाइड"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "फिकट"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "चौरस"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "कोर डाटा इम्पोर्ट सर्व्हिसेस्"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"एफ्-स्पॉट लाइब्ररि इम्पोर्ट सर्व्हिसवर आपले स्वागत.\n"
+"\n"
+"शॉटवेलतर्फे आढळलेले अस्तित्वातील लाइब्ररिज्चा पसंत करून किंवा वैकल्पिक एफ्-स्पॉट डाटाबेस फाइल "
+"नीवडून, आयात करण्यासाठी कृपया लाइब्ररि पसंत करा."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"एफ्-स्पॉट लाइब्ररि इम्पोर्ट सर्व्हिसवर आपले स्वागत.\n"
+"\n"
+"कृपया एफ्-स्पॉट डाटाबेस फाइल नीवडा."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "आयातकरीता स्वहस्ते एफ्-स्पॉट डाटाबेस फाइल नीवडा:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"नीवडलेले एफ्-स्पॉट डाटाबेस फाइल उघडणे अशक्य: फाइल अस्तित्वात नाही किंवा एफ्-स्पॉट "
+"माहितीकोष नाही"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"नीवडलेले एफ्-स्पॉट डाटाबेस फाइल उघडणे अशक्य: एफ्-स्पॉट माहितीकोषची हि आवृत्ती शॉटवेलतर्फे "
+"समर्थीत नाही"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "नीवडलेली एफ्-स्पॉट डाटाबेस फाइल वाचणे अशक्य: टॅग्स् तक्ता वाचतेवेळी त्रुटी"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "नीवडलेली एफ्-स्पॉट डाटाबेस फाइल वाचणे अशक्य: छायाचित्र तक्ता वाचतेवेळी त्रुटी"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"एफ्-स्पॉट लाइब्ररिमध्ये शॉटवेलकडे %d छायाचित्र आढळली व सध्या त्यास आयात करत आहे. "
+"ड्युप्लिकेट्स् स्वयंरित्या आढळतील व काढून टाकले जातील.\n"
+"\n"
+"पार्श्वभूमीत आयात सुरू असताना तुम्ही हा संवाद बंद करू शकता व शॉटवेलचा वापर करून सुरू करू "
+"शकता."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "एफ्-स्पॉट लाइब्ररि: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "आयात करण्यास तयार करत आहे"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "डेस्कटॉप स्लाइडशो म्हणून ठरवा"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "डेस्कटॉप पार्श्वभूमी स्लाइडसो निर्माण करा"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "करीता प्रत्येक छायाचित्र दाखवा"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "वेळेचा कालवधी"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "डेस्कटॉप पार्श्वभूमीवर प्रत्येक छायाचित्र कितिवेळ दाखवले जाते"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "शोध"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "शोधचे नाव (_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "जुळवा (_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "खालिलपैकी:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>छपाई प्रतिमा आकार</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "मानक आकारचा वापर करा (_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "पसंतीचे आकारचा वापर करा (_s):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "छायाचित्र ॲस्पेक्ट प्रमाण जुळवा(_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "स्वयंआकार (_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>शीर्षक</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "प्रतिमा शीर्षकाची छापाई करा (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>पिक्सेल रेजोल्युशन</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "चायाचित्राचे येथे आउटपुट करा (_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "पिक्सेल्स् दर इंच"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "लेबल"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "शॉटवेल पसंती"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "पांढरे"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "काळे"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "नवीन फाइल्स् करीता लाइब्ररि डिरेक्ट्री पहा (_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "मेटाडेटा"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "फोटो फाइल्सकरीता टॅग्स्, शीर्षक, व इतर मेटाडेटा लिहा (_m)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "डिस्पले"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "येथे छायाचित्र आयात करा (_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "पार्श्वभूमी (_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "आयात करत आहे"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "डिरेक्ट्री मांडणी (_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "रचना (_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "उदाहरणार्थ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "आयात केलेल्या फाइल्स्ला छोट्या आकारात पुनःनामांकीत करा (_e)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW डेव्हलपर"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "पूर्वनिर्धारित (_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "बाहेरिल संपादकसह उघडा (_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "बाहेरिल RAW संपादक (_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "बाहेरिल संपादक"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "प्लगइन्स्"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "विलंब (_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "ट्रांजिशन प्रभाव (_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "ट्रांजिशन विलंब (_e):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "शीर्षक दाखवा (_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "सेंकद"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "प्रवेश करा (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "अस्तित्वातील अल्बमकरीता प्रकाशित करा (_x):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "ह्या नावाचे नवीन अल्बम निर्माण करा (_n):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "व्हिडिओज् व दृष्यास्पद नवीन छायाचित्र अल्बम्स् (_v):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "बाहेर पडा (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "प्रकाशित करा (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "वेब ब्राउजरतर्फे फ्लिकरमध्ये प्रवेश केल्यानंतर कंफर्मेशन क्रमांक द्या."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "ओळख पटवण्यासाठी क्रमांक (_N):"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "छायाचित्राचे आकार (_s):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "अस्तित्वातील अल्बम (_e):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "या नावाचे नवीन अल्बम (_n):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "पब्लिक कलादालनमध्ये अल्बम दाखवा (_i)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "छायाचित्र आकार प्रिसेट (_s):"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Piwigo छायाचित्र लाइब्ररिचे URL (_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "वापरकर्तानाव (_n)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "पासवर्ड (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "पासवर्ड लक्षात ठेवा (_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "प्रवेश"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "अस्तित्वातील विभाग (_e):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "छायाचित्र यातर्फे दिसतील (_v):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "छायाचित्र आकार:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "बाहेर पडा"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "व्हिडिओ गोपणियता सेटिंग (_s):"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "सर्वहक्काधिकार 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 पिक्सेल्स्"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "OAuth ओळख पटवण्याकरीता विनंतीकरीता '%s' वैध प्रतिसाद नाही"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr "TumblrPublisher: start( ): सुरू करणे अशक्य; ह्या पब्लिशरला पुनःसुरू करणे अशक्य."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Tumblr खात्यासह सबंधित वापरकर्तानाव व पासवर्ड द्या."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI: %s लोड करणे अशक्य"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Tumblr मध्ये %s प्रमाणे प्रवेश केला आहे.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "सर्वहक्काधिकार 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki संकेतस्थळ येथे भेट द्या"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "तुम्ही सध्या Yandex.Fotki मध्ये प्रवेश केला नाही."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "इमेल पत्ता (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Tumblr मध्ये तुम्ही यानुरूप (नाव) प्रवेश केला आहे.\n"
+"\n"
+"(ह्या लेबलचे स्ट्रिंग आढळले व कोड अंतर्गत सेट केले आहे, \n"
+"त्यामुळे येथे केलेले बदल दाखवणे अशक्य आहे)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ब्लॉग्स्:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "अल्बम्स् (किंवा नवीन लिहा) (_A):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "प्रवेश प्रकार (_t):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "टिपण्णी बंद करा (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "मुळ छायाचित्र डाउनलोड करण्यास परवानगी नाही (_F)"
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..1d9883d
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,4597 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# janroar <janroed@gmail.com>, 2011-2012
+# janroar <janroed@gmail.com>, 2012
+# janroar <janroed@gmail.com>, 2011
+# unhammer <unhammer+dill@mm.st>, 2013
+# unhammer <unhammer+dill@mm.st>, 2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-25 08:30+0000\n"
+"Last-Translator: unhammer <unhammer+dill@mm.st>\n"
+"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/"
+"shotwell/language/nb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Hendelse %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameraer"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kan ikke avmontere kameraet. Prøv å avmontere kameraet fra filbehandleren."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skjul bilder som allerede er importert"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Vis kun bilder som ikke har blitt importert"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Importering starter, vennligst vent..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titler"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Vis titlene for hvert bilde"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importer _valgte"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importer de valgte bildene til ditt bildebibliotek"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importer _alle"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importer alle bildene til ditt bildebibliotek"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell trenger å avmontere kameraet fra filsystemet for å få tilgang til "
+"det. Fortsett?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Avmonter"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Vennligst avmonter kameraet."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kameraet er låst av et annet program. Shotwell kan bare få tilgang til "
+"kameraet når det er ulåst. Vennligst steng andre programmer som bruker "
+"kameraet, og prøv igjen."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Vennligst lukk alle andre programmer som bruker kameraet."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kan ikke hente forhåndsvisninger fra kameraet:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Avmonterer..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Henter bildeinformasjon"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "innhenter forhåndsvisning for %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kan ikke låse kamera: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Vil du slette dette bildet fra kameraet?"
+msgstr[1] "Vil du slette disse %d bildene fra kameraet?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Vil du slette denne videoen fra kameraet?"
+msgstr[1] "Vil du slette disse %d videoene fra kameraet?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Slette bildet/videoen fra kameraet?"
+msgstr[1] "Slette disse %d bildene/videoene fra kameraet?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Vil du slette disse filene fra kameraet?"
+msgstr[1] "Vil du slette disse %d filene fra kameraet?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Behold"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fjerner bilder/videoer fra kameraet"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Kan ikke slette %d bildet/videoen fra kameraet pga. feil."
+msgstr[1] "Kan ikke slette %d bildene/videoene fra kameraet pga. feil."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "L_ysbildefremvisning"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "vis et diasshow"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksporter bilder / videoer"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksporterer bilder/videoer"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Eksporter bilder"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksporter bilder"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotering"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "angre rotering"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Flipper horisontalt"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Angre horisontal flipp"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Flipper vertikalt"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Angre vertikal flipp"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "allslags tekst"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Tittel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tagg"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Hendelsesnavn"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Filnavn"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Mediatype"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Flaggtilstand"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Fototilstand"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Rangering"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dato"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "inneholder"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "er eksakt"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "starter med"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "slutter med"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "inneholder ikke"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "er ikke satt"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "er"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "er ikke"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "hvilket som helst bilde"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "et RAW-bilde"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "en video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "har"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "har ikke"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "endringer"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "interne endringer"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "eksterne endringer"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "flagget"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ikke flagget"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "og høyere"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "bare"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "og lavere"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "er etter"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "er før"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "er mellom"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "og"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "enhver"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alle"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ingen"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Lagrede søk"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Nyt_t lagret søk..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Ditt bildebibliotek er ikke kompatibel med denne versjonen av Shotwell. Det "
+"ser ut til at det var laget med Shotwell %s (skjema %d). Denne versjonen er "
+"%s (skjema %d). Vennligst bruk den nyeste versjonen av Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell var ikke istand til å oppgradere ditt bildebibliotek fra versjon "
+"%s (skjema %d) til %s (skjema %d). For mer informasjon, vennligst sjekk "
+"Shotwells Wiki på %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Ditt bildebibliotek er ikke kompatibel med denne versjonen av Shotwell. Det "
+"ser ut til at det var laget med Shotwell %s (skjema %d). Denne versjonen er "
+"%s. (skjema %d). Vennligst rydd opp i biblioteket ved å slette %s og "
+"importer bildene dine på nytt."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Ukjent feil under verifisering av Shotwells database: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Laster Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "sti til Shotwells private data"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KATALOG"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Ikke kontroller for endringer i bibliotek-katalogen under kjøring"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Ikke vis oppstartsprogresjon"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Vis applikasjonsversjonen"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FIL]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Kjør '%s --help' for å se en fullstendig liste over tilgjengelige "
+"kommandolinje kommandoer.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Idag"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Igår"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Tittel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Punkter:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d hendelse"
+msgstr[1] "%d hendelser"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d bilde"
+msgstr[1] "%d bilder"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videoer"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Dato:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Tid:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Fra:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Til:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Størrelse:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Varighet:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekunder"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Fremkaller:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Eksponering:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Plassering:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Filstørrelse:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Gjeldende fremkalling:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Orginaldimensjoner:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kamera merke:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kamera modell:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blits:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Brennvidde:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Eksponerings dato:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Eksponeringstid:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Eksponeringsjustering:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS-breddegrad:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS-lengdegrad:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Kunstner:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Opphavsrett:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Programvare:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Kommenter:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Utvidet informasjon"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Dette vil fjerne taggen \"%s\" fra ett bilde. Fortsett?"
+msgstr[1] "Dette vil fjerne taggen \"%s\" fra %d bilder. Fortsett?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Avbryt"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Slett"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Dette vil fjerne det lagrede søket \"%s\". Forsette?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Å forandre fremkaller vil fjerne alle endringer du har gjort på dette bildet "
+"i Shotwell"
+msgstr[1] ""
+"Å forandre fremkaller vil fjerne alle endringer du har gjort disse bildene i "
+"Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Bytt fremkaller"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Eksporter video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell kunne ikke lage en fil for redigering av dette bildet da du ikke "
+"har tillatelse for å skrive til %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"kan ikke eksportere dette bildet p.g.a en filfeil.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Vil du fortsette eksporteringen?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "For_tsett"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "umodifisert"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Nåværende"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalitet"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_skaleringsbegrensing"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_bildepunkter"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Eksporter metadata"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Lagre detaljer..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Lagre detaljer"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(og %d flere)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importeringsrapport"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Prøvde å importere %d fil."
+msgstr[1] "Prøvde å importere %d filer."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "av disse, %d fil ble importert uten feil."
+msgstr[1] "av disse, %d filer ble importert uten feil"
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplikat bilder/Videoer som ikke ble importert:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "Duplikater finnes i dette mediet"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Bilder/Videoer ble ikke importert p.g.a kamerafeil:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "Feilmelding:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Filene ble ikke importert da de ikke ble oppfattet som bilder eller videoer:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Bilder/videoer ble ikke importert fordi de er i et format som er ukjent for "
+"Shotwell:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Bilder/videoer ble ikke importert da Shotwell ikke greide å kopiere de til "
+"sitt bibliotek:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"kunne ikke kopiere %s\n"
+"\ttil %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Bilder/videoer ble ikke importert fordi filene har feil i seg:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Bilder/videoer ble ikke importert p.g.a andre årsaker:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 duplikatbilde ble ikke importert:\n"
+msgstr[1] "%d duplikatbilder ble ikke importert:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 duplikatvideo ble ikke importert:\n"
+msgstr[1] "%d duplikatvideoer ble ikke importert:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 duplikatbilde/video ble ikke importert:\n"
+msgstr[1] "%d duplikatbilder/videoer ble ikke importert:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 bilde ble ikke importert p.g.a en filfeil eller maskinvarefeil:\n"
+msgstr[1] "%d bilder ble ikke importert p.g.a en fil- eller hardwarefeil:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "1 video ble ikke importert p.g.a en filfeil eller maskinvarefeil:\n"
+msgstr[1] "%d videoer ble ikke importert p.g.a en fil- eller maskinvarefeil:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 bilde/video ble ikke importert p.g.a en filfeil eller maskinvarefeil:\n"
+msgstr[1] ""
+"%d bilder/videoer ble ikke importert p.g.a en fil- eller maskinvarefeil:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "1 fil ble ikke importert p.g.a en fil- eller maskinvarefeil:\n"
+msgstr[1] "%d filer ble ikke importert p.g.a en fil- eller maskinvarefeil:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 bilde feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+msgstr[1] ""
+"%d bilder feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 video feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+msgstr[1] "%d bla bla\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 bilde/video feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+msgstr[1] ""
+"%d videoer feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 fil feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+msgstr[1] ""
+"%d filer feilet under importering fordi bildebibliotekmappen ikke var "
+"skrivbar:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 bilde ble ikke importert p.g.a. en kamerafeil:\n"
+msgstr[1] "%d bilder ble ikke importert p.g.a. en kamerafeil:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video ble ikke importert p.g.a. en kamerafeil:\n"
+msgstr[1] "%d videoer ble ikke importert p.g.a. en kamerafeil:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 bilde/video ble ikke importert p.g.a. en kamerafeil:\n"
+msgstr[1] "%d bilder/videoer ble ikke importert p.g.a. en kamerafeil:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 fil ble ikke importert pg.a. en kamerafeil.\n"
+msgstr[1] "%d filer ble ikke importert p.g.a. en kamerafeil:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "Ett bilde ble ikke importert fordi fila hadde feil i seg:\n"
+msgstr[1] "%d bilder ble ikke importert fordi filene hadde feil i seg:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "Én video ble ikke importert fordi fila hadde feil i seg:\n"
+msgstr[1] "%d videoer ble ikke importert fordi filene hadde feil i seg:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 bilde/video ble ikke importert fordi fila hadde feil i seg:\n"
+msgstr[1] ""
+"%d bilder/videoer ble ikke importert fordi filene hadde feil i seg:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 fil ble ikke importert fordi den hadde feil i seg:\n"
+msgstr[1] "%d filer ble ikke importert fordi de hadde feil i seg:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 bilde ble utelatt (formatet støttes ikke):\n"
+msgstr[1] "%d bilder ble utelatt (formatet støttes ikke):\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 fil, som ikke er et bilde, ble utelatt.\n"
+msgstr[1] "%d filer, som ikke er bilder, ble utelatt.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 bilde utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+msgstr[1] "%d bilder utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+msgstr[1] "%d videoer utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 bilde/video ble utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+msgstr[1] "%d bilder/videoer ble utelatt p.g.a. brukeren avbrøt operasjonen:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 fil utelatt p.g.a. brukeren avbrøt operasjonen.\n"
+msgstr[1] "%d filer utelatt p.g.a. brukeren avbrøt operasjonen.\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 bilde importert.\n"
+msgstr[1] "%d bilder importert.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video ble importert.\n"
+msgstr[1] "%d videoer ble importert.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 bilde/video ble importert.\n"
+msgstr[1] "%d bilder/videoer ble importert.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ingen bilder eller videoer ble importert.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import ferdig"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minutt"
+msgstr[1] "%d minutter"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d time"
+msgstr[1] "%d timer"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dag"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "gi nytt navn til en hendelse"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Navn:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Endre tittel"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Rediger hendelseskommentar"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Rediger bilde-/videokommentar"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Slett fil"
+msgstr[1] "_Slett filer"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Fjern kun"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Omgjør eksterne redigeringer?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "nullstille eksterne redigeringer?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Dette vil ødelegge alle endringer som er gjort i den eksterne filen. "
+"Fortsett?"
+msgstr[1] ""
+"Dette vil ødelegge alle endringer som er gjort i de %d eksterne filene. "
+"Fortsett?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "omgj_ør eksterne redigeringer"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "nu_llstille ekstern redigering"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Dette vil fjerne bildet fra bildebiblioteket. Fortsett?"
+msgstr[1] "Dette vil fjerne %d bilder fra bildebiblioteket. Fortsett?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Fjern"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Fjerner bilder fra bildebiblioteket"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Fjern bilder fra bildebiblioteket"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 t."
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_flytt bilder/videoer med den samme mengden"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Gi _alle bilder/videoer denne dato/tid"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifiser bildets originalfil"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifiser bildenes originalfiler"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modifiser orginalfilene"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifiser originalfiler"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%M/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Eksponeringstiden vil bli flyttet fram med\n"
+"%d %s, %d %s, %d %s, og %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Eksponeringstidspunktet vil bli satt tilbake med\n"
+"%d %s, %d %s, %d %s, og %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dager"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "time"
+msgstr[1] "timer"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutt"
+msgstr[1] "minutter"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekund"
+msgstr[1] "sekunder"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"og %d annen."
+msgstr[1] ""
+"\n"
+"\n"
+"Og %d andre."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Tagger (kommaseparert):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Velkommen!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Velkommen til Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "For å komme igang, kan du importere bilder på en av følgende måter:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Velg <span weight=\"bold\">Import av fil %s fra en mappe</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Dra og slipp bilder inn i Shotwellvinduet"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Koble et kamera til din datamaskin og importer bilder"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importer bilder fra din %s mappe"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Du kan også importere bilder på en av følgende måter:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Vis ikke denne beskjeden igjen"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importer bilder fra ditt %s bibliotek "
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Hjelp)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "År%sMåned%sDag"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "År%sMåned"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "År%sMåned-Dag"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "År-Måned-Dag"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Tilpasset"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Ugyldig mønster"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell kan kopiere bildene til din bildebibliotekmappe, eller lenke til "
+"bildene uten å kopiere dem. "
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_pier bilder"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importer til sted"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importer til biblioteket"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Fjern fra bildebiblioteket"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Fjerner bilder fra bildebiblioteket"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Fjerner bilder fra bildebiblioteket"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne bildet/videoen fra ditt Shotwell bildebibliotek. Vil du "
+"også flytte filen til din søppelkasse? (slette bildefilen)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+msgstr[1] ""
+"Dette vil fjerne %d bilder/videoer fra ditt Shotwell bildebibliotek. Vil du "
+"også flytte filene til din søppelkasse? (slette bildefilene)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne videoen fra ditt Shotwellbibliotek. Vil du også flytte "
+"filen til din søppelkasse? (slette bildefilen)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+msgstr[1] ""
+"Dette vil fjerne %d bilder fra ditt Shotwell bildebibliotek. Vil du også "
+"flytte filene til din søppelkasse? (slette bildefilene)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dette vil fjerne bildet fra ditt Shotwell bildebibliotek. Vil du også flytte "
+"filen til din søppelkasse? (slette bildefilen)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+msgstr[1] ""
+"Dette vil fjerne %d bilder fra ditt Shotwell bildebibliotek. Vil du også "
+"flytte filene til din søppelkasse? (slette bildefilene)\n"
+"\n"
+"Denne operasjonen kan ikke angres / omgjøres"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Bildet eller videoen kan ikke bli flyttet til søppelbøtten på skrivebordet. "
+"Slett denne filen?"
+msgstr[1] ""
+"%d bilder/videoer kan ikke bli flyttet til søppelbøtten på ditt skrivebord. "
+"Slett disse filene?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Bildet eller videoen kan ikke slettes."
+msgstr[1] "%d bilder/videoer kan ikke slettes."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Mapper"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Tagger"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Vellykket"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Filfeil"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "kan ikke dekode filen"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Databasefeil"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Brukeren avbrøt import"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ikke en fil"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Filen finnes allerede i databasen"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Filformatet er ikke støttet"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ikke en bildefil"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "diskfeil"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disken er full"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamerafeil"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Feil under filskriving"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Skadd bildefil"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Import feilet (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modifisert"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Forrige bilde"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Neste bilde"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Kildefil for bilde mangler: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Vis"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "V_erktøy"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Forrige bilde"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Forrige bilde"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Neste bilde"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Neste bilde"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "Zoom _inn"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Øk bildets forstørrelsesgrad"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Zoom _ut"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "minsk bildets forstørrelsesgrad"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Tilpass til _Side"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoom til å passe til skjermen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zoom bildet til 100% magnifisering"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zoom bildet til 200% magnifisering"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Fremkaller"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Kan ikke eksportere %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Database"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importering fra %s kan ikke fortsette pga. en feil:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"For å forsøke å importere fra en annen tjeneste, velg tjeneste fra "
+"ovenstående meny."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Dataimporteringer"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Du har ingen aktiverte innstikk for dataimportering\n"
+"\n"
+"For å bruke funksjonen \"Importer fra program\", må du ha minst ett innstikk "
+"for dataimportering aktivert.Innstikk kan aktiveres via menyen: Innstillinger"
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Databasefil:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importer"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importer fra program"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importer media _fra:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Lukk"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Innstillinger"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "blidefremvising"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Tilbake"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Gå tilbake til forrige bilde"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pause"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pause bildefremvisningen"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Neste"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Gå til det neste bilde"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Endre instillinger for bildefremviser"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Alle bildekildefiler mangler"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "avspill"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Fortsett bildefremvisningen"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Forkaster"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Angre forkastelse"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Gjør skarpere"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Angre oppskarping"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Legger til fargetransformasjoner"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Gjør om fargetransformasjoner"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Oppretter ny hendelse"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Fjerner hendelse"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Flytter bilder til den nye hendelsen"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "angi bilder til forrige hendelse"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Fletter"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Fjerner fletting"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplikerer bilder"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Fjerner duplikatbilder"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kunne ikke duplisere et bilde p.g.a en filfeil"
+msgstr[1] "kunne ikke duplisere %d bilder p.g.a filfeil"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Gjenoppretter tidligere rangering"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Øker rangeringer"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Senker rangeringer"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Velger RAW-fremkaller"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "gjenoppretter forrige RAW-fremkaller"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "juster fremkaller"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Orginalbildet kunne ikke justeres"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Justerer tid og dato"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "fjerner justering av tid og dato"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Ett orginalbilde kunne ikke justeres"
+msgstr[1] "Følgende orginalbilder kunne ikke justeres."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Tidsjusteringsfeil"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Tidsjusteringer kunne ikke omgjøres på den følgende bildefilen."
+msgstr[1] "Tidsjusteringen kunne ikke omgjøres på de følgende bildefiler."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Lag en tagg"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Flytt taggen \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Flytt bilder til søppelbøtten"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Gjenopprett bilder fra søppelkassen"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Flytt bildene til Shotwells søppelbøtte"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Gjenopprett bildene i Shotwells bildebibliotek"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Flytter bilder til søppelbøtten"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Gjenoppretter bilder fra søppelbøtten"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Flagg valgte bilder"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Fjern flagget fra valgte bilder"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Flagger valgte bilder"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Fjerner flagg fra valgte bilder"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Flagg"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Fjern flagg"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Lav (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Medium (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Høy (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksimum (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Ingen bilder/videoer"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Ingen bilder/videoer funnet"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Bilder kan ikke eksporteres til denne mappen."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Greide ikke å behandle mon. oppdateringene :%s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Fyll hele siden"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 bilder pr. side"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 bilder pr. side"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 bilder pr. side"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 bilder pr. side"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 bilder pr. side"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 bilder pr. side"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "tomme"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Lommebok (2 x 3 tommer)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notekort (3 x 5 tommer)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 tommer"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 tommer"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 tommer"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 tommer"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 tommer"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrisk Lommebok (9x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postkort (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Bildeinnstillinger"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Skriver ut..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Kan ikke skrive ut bildet:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Kan ikke åpne/lage bildedatabase %s: feilkode %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"kan ikke skrive til databasefilen:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Feil ved tilgang til databasefilen:\n"
+" %s\n"
+"\n"
+"Feilen er: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Eksporter videoer"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Klarer ikke å starte Nautilus send-til:: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Send til"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Kan ikke eksportere bakgrunn til %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Klarer ikke å forberede lysbildeshow med skrivebordsbakgrunner: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Flagget"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Søppelbøtte"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Søppeldunken er tom"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Slett"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Sletter bilder"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Manglende filer"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Sletter..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Siste importering"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importer fra mappe..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importer bilder fra harddisken til biblioteket"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importer fra _program..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sorter _hendelser"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Tøm _Søppelbøtten"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Slett alle bilder som befinner seg i søppelbøtten"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Se hen_delsen bildet tilhører"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Finn"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Finn bilder og videoer via søkekriterier"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fil"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Rediger"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Bilde"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Bilder"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Hendelse"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ta_gger"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hjelp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Grunnleggende informasjon"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Vis grunnleggende informasjon for denne markeringen"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Utvidet informasjon"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Vis utvidet informasjon for denne markeringen"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Søkefelt"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Vis søkefeltet"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "S_idestolpe"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Vis sidestolpen"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Stigende"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sorter bilder i stigende rekkefølge"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "S_ynkende"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sorter bilder i synkende rekkefølge"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importer fra mappe"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Tøm søppelbøtten"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "tømmer søppelbøtten..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell er satt opp til å importere bilder inn i ditt hjemmeområde.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Bildebibliotekets plassering:"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Ingen bilder kan importeres fra denne mappen."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Oppdaterer bildebiblioteket..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "forbereder automatisk importering av bilder..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automatisk importering av bilder..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Skriver metadata til filer..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliotek"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importerer..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Stopp import"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Stopp importering av bilder"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Gjør klart til importering..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importerte %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Lagre"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Lagre bilde"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Lagre _som..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Lagre bilde med et annet navn"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "skriv ut bildet med en skriver tilkoplet din datamaskin"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s finnes ikke."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s er ingen fil."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s støtter ikke filformatet til\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Lagre en kopi"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Fjern endringer til %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Lukk _uten å lagre"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Feil under lagring til %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Lagre som"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kan ikke overvåke %s: Dette er ingen mappe (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotobehandler"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotofremviser"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Roter _høyre"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Roter"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Roter høyre"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Roter bildene mot høyre (trykk Ctrl for å rotere mot venstre)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Roter _venstre"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Roter venstre"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Roter bildet mot venstre"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Flipp Hori_sontalt"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Flipp horisontalt"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Flipp Verti_kalt"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Flipp vertikalt"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_gjør skarpere"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Gjør skarpere"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatisk forbedring av bildet"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Kopier fargejusteringer"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Kopier fargejusteringer"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Kopier fargejusteringene brukt på bildet"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Lim inn fargejusteringer"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Lim inn fargejusteringer"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Bruk de kopierte fargejusteringene på de valgte bildene"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Beskjær"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Beskjær"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Beskjær bildets størrelse"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Oppretting"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Oppretting"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Rett opp bildet"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Rødeøyne"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Rødøye"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reduser eller fjern eventuelle rødeøyer i bildet"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Juster"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Juster"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Juster bildets farge og tonegjengivelse"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "omgj_ør til orginal"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Omgjør til orginal"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Omgjør eksterne re_digeringer"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "gå tilbake til orginalbildet"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Angi som _skrivebordsbakgrunn"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Angi valgte bilde til å bli din nye skrivebordsbakgrunn"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Angi som lysbildeshow med _skrivebordsbakgrunner"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Gjenskap"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Gjenskap"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Omgjør"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "omgjør"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Omdøp hendelsen..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Lag nøkkelfoto for hendelsen"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Lag et nøkkelbilde for hendelsen"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Ny hendelse"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Ny hendelse"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Flytt bildene"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "flytt bildene til en hendelse"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Flett hendelser"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Flett"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Slå sammen flere hendelser til en enkelt hendelse"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Gi Rangering"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Gi rangering"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Forandre rangeringen av ditt bilde"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "Ø_k"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Øk rangeringen"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Senk"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Senk rangering"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Urangert"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "urangert"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Ranger urangerte"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Satt som urangert"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Fjern alle rangeringer"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Forkastet"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "forkastet"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "rangering forkastet"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Satt som forkastet"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Sett rangeringen til forkastet"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Bare forkastede"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Bare forkastede"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Vis bare forkastede bilder"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Alle + fo_rkastet"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Vis alle bilder, inkludert de som er forkastet"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Alle bilder"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Vis alle bilder"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Rangering"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Vis rangeringen for hvert bilde"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrer bilder"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrer bilder"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Begrens antall bilder vist basert på et filter"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Dupliker"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Dupliker"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Lag et duplikat av bildet"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Eksporter..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Utskrift..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_bliser..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publiser"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publiser til diverse nettsteder"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Endre _tittel..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "endre_kommentar"
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Endre kommentar"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Rediger _hendelseskommentar …"
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Juster dato og tid..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Juster dato og tid"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Legg til _Tagger"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Legge til tagger..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Legg til tagger"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferanser"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Åpne i en e_kstern bildebehandler"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Åpne med en RA_W behandler"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Send _til..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Send T_il..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Finn..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Finn"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Finn et bilde ved å skrive tekst som finnes i navn eller nøkkelord"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Flagg"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "av_flagg"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Klarer ikke å starte bildebehandleren: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Legg til tagg \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Legg til taggene \"%s\" og \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Slett tagg \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Slett tag \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Slett tagg"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Ny"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Omdøp tagg \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Omdøp taggen \"%s\" til \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Gi nytt navn..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Modif_iser tagger..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modifiser tagger"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Tagg bildene som \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Tagg bildet som \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Tagg de valgte bildene som \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Tagg de utvalgte bildene som \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Fjern taggen \"%s\" fra _bildene"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Fjern taggen \"%s\" fra _bildene"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Fjern taggen \"%s\" fra bildene"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Fjern taggen \"%s\" fra bildene"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Kan ikke omdøpe taggen til \"%s\" fordi den allerede finnes."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Kan ikke endre søket til \"%s\" da søket allerede finnes."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Lagrede søk"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "slett søk"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Redger..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "nytt_navn...."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "omdøp søk \"%s\" til \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Slett søk \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Ranger %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Sett rangering til %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Setter rangering til %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Vis %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Bare vis bilder som er rangert til %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s eller bedre"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Vis %s eller bedre"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Bare vis bilder med en rangering på %s eller bedre"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Fjern de valgte bildene fra søppelkassen"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Fjern de utvalgte bildene fra bildebiblioteket"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Gjenopprett"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Flytt de valgte bildene tilbake til biblioteket"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Åpne med filhåndtereren"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Åpne de valgte bildemappene i filbehandleren"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Kan ikke åpnes i filbehandleren: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Fj_ern fra bildebiblioteket"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Flytt til søppelkassen"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Velg _alle"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Velg alle"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b. %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Vinkel:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Nullstill"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Gå tilbake til aktuelle bildedimensjoner"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Angi beskjæring av dette bildet"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Pivoter beskjæringsrektanglet mellom stående eller liggende"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Ubegrenset"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Firkant"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Skjerm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Opprinnelig størrelse"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5\" x 11\" )"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11\" x 17\")"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Steng ned rødøye-verktøyet"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Fjern eventuelle rødeøyer i det valgte området"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Metning:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Nyanse"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Skygger:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Uthevinger:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Nullstill farger"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "tilbakestill alle fargejusteringer til orginalverdiene"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Nyanse"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Metning"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Eksponering"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Skygger"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Uthevinger"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastutvidelse"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Lås verktøylinjen"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Lås verktøylinjen åpen"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Forlat fullskjerm"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Forlat _fullskjerm"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Avslutt"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Om"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Fulls_kjerm"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Innhold"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Ofte spurte spørsmål (OSS)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Rapporter et problem..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"En alvorlig feil oppstod når du hentet data fra Shotwells bibliotek. "
+"Shotwell kan ikke fortsette.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Besøk Yorbas nettsted"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Jan Roar Roed <janroed@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Kan ikke vise hjelp: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Kan ikke navigere til feilkodedatabase: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Kan ikke vise OSS: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "Uten tittel"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Orginalstørrelse"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Bredde eller høyde"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Bredde"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Høyde"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Juster størrelsen på miniatyrbildene"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Øk forstørrelsen på miniatyrbildene"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "minske forstørrelsen på miniatyrbildene"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Sorter _bilder"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "S_pill Video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Åpne de valgte videoene i systemets videoavspiller"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Kommentarer:"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Vis kommentar for hvert bilde"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Vis taggene for hvert bilde"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Etter _tittel"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Sorter bilder etter tittel"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "_Etter eksponeringsdato"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Sorter bildene etter eksponeringsdato"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Etter _Rangering"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Sorter bilder etter rangering"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell greide ikke å spille den valgte videoen:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d bilde/Video"
+msgstr[1] "%d bilder / videoer"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Vis kommentaren for hver begivenhet"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Ingen eventer"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Ingen eventer funnet"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Hendelser"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "udatert"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ingen hendelse"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Kan ikke lage mellomlagerkatalog %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Kan ikke lage datakatalog %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Bilder"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Kan ikke midlertidig katalog %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Kan ikke lage data for underkatalog %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ingen)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ingen"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Tilfeldig"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Overganger for lysbildefremvisning"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Kan ikke generere en midlertidig fil for %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exporterer"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "filen %s finnes fra før. Overskriv?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Utelat"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Overskriv"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Overskriv _alle"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Eksporter"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Bilder"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videoer"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-bilder"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-bilder"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Feil under innlasting av UI-fil %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Skriv"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publiserer"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "vellykket publisering av de utvalgte bildene/videoene."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Vellykket publisering av de utvalgte videoene."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "de valgte bildene ble publisert."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Vellykket publisering av den valgte videoen."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Vellykket publisering av det valgte bildet."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Henter kontoinformasjon..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Logger inn..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publiser bilder"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publiserer bilder _til:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publiser videoer"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publiserer videoer _til"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publiser bilder og videoer"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publiserer bilder og videoer _til"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "kan ikke publisere"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell kan ikke publisere de valgte elementene, da du ikke har aktivert et "
+"kompatibelt publiseringsinnstikk. For å rette på dette, velg <b>Rediger %s "
+"Preferanser</b> og slå på en eller flere av publiseringsinnstikkene på "
+"<b>Innstikk</b> fanen. "
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Gjør klart til opplasting"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Laster opp %d av %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Publisering til %s kan ikke fortsette pga. en feil:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"For å forsøke å publisere til en annen tjeneste: velg tjeneste fra "
+"ovenstående meny."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "<ny _Tagg..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"En midlertidig fil som kreves for å publisere er ikke tilgjengelig"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Du har allerede logget inn og ut av en Google-tjeneste i denne Shotwell-"
+"økten.\n"
+"\n"
+"For å fortsette å publisere til Google-tjenester må du avslutte og omstarte "
+"Shotwell, og så prøve å publisere igjen."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Du er ikke innlogget på YouTube.\n"
+"\n"
+"Du må ha en gyldig konto hos Google, som er satt opp for bruk med Youtube "
+"for å fortsette. Du kan sette opp de fleste kontoene ved å bruke nettleseren "
+"og logge på YouTube minst en gang."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"En fil som er nødvendig for publisering er ikke tilgjengelig. Publisering "
+"til Youtube kan ikke fortsette."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Du er innlogget på YouTube som %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videoer vil dukke opp i '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Offentlig listet"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Offentlig ulistet"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Hovedtjeneste for publisering"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Du er ikke innlogget på Flickr.\n"
+"\n"
+"Klikk for å logge på Flickr i din nettleser. Under påloggingen må du gi "
+"tillatelse til at Shotwell Connect peker til din Flickr-konto."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har alerede logget inn og ut av Flickr under denne Shotwell økten.\n"
+"For å fortsette publiseringen til Flickr: Avslutt og start Shotwell. "
+"Deretter kan du forsøke å publisere igjen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Forbereder pålogging..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"En fil som er nødvendig for publisering er ikke tilgjengelig. Publisering "
+"til Flickr kan ikke fortsette."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Kontrollerer autorisasjon..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Du er innlogget på Flickr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Din gratiskonto hos Flickr begrenser hvor mye data du kan laste opp pr. "
+"mnd.\n"
+"Denne måneden har du %d megabytes igjen av din opplastingskvote."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Din Flickr Pro-konto gir deg rett til ubegrenset opplastingsmengde."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Bilder er _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videoer er _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Bilder og videoer er _synlige for:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Alle"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Kun venner & familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Kun familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Kun venner"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Bare meg selv"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 bildepunkter"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 bildepunkter"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 piksler"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 piksler"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Lager album %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "En feil oppsto under publisering til Piwigo. Vennligst prøv igjen."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Legg inn adressen (URL)til ditt Piwigo fotobibliotek med tilhørende "
+"brukernavn og passord for dette bilioteket."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell kan ikke kontakte ditt Piwigo fotobibliotek. Vennligst verifiser "
+"adressen (URL)"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Brukernavn og/eller passord er feil. Vennligst prøv igjen"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "ikke gyldig URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"Ugyldig brukernavn og passord"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell - tilkopling"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratorer, familie, venner, kontakter"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratorer, familie, venner"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratorer, Familie"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "administratorer"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Du er ikke innlogget på Picasa Web Album.\n"
+"\n"
+"Klikk Logg inn for å logge "
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"En fil som er nødvendig for publisering er ikke tilgjengelig. Publisering "
+"til Picasa kan ikke fortsette."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Oppretter album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Du er innlogget hos Picasa Web Albums som %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videoer vil dukke opp i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Bildene vil vises i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Liten (640 x 480 piksler)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Medium (1024 x 768 piksler)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Anbefalt (1600 x 1200 piksler)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 bildepunkter)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Det er nå ikke innlogget på Facebook.\n"
+"\n"
+"Hvis du ikke har en Facebook-konto, kan du opprette en under "
+"innloggingsprosessen. Under innloggingen, kan Shotwell komme til å spørre "
+"deg om tillatelse til å laste opp bilder og publisere dem i din Facebook-"
+"strøm. Disse tillatelsene er påkrevd for at Shotwell Connector skal fungere."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har allerede logget inn og ut av Facebook under denne Shotwell- økten.\n"
+"For å fortsette å publisere ttil Facebook: Avslutt og restart Shotwell, "
+"deretter forsøk å publiser igjen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 piksler)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Stor (2048 piksler)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Tester forbindelsen til Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"En fil som er nødvendig for publisering er ikke tilgjengelig. Publisering "
+"til Facebook kan ikke fortsette."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Du er innlogget på Facebook som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Hvor vil du publisere de utvalgte bildene?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Opplastningsstørrelse"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Venner"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Bryte opp"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Sjakk"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Sirkler"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Gardiner"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Striper"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Klokke"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Sirkel"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Hovedoverganger for lysbildefremviser"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Lysbilde"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Tone"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Kvadrat"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Kjerne Data Import tjenester"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Velkommen til tjenesten for importering av F-Spot biblioteker\n"
+"\n"
+"Vennligst velg et bibliotek for importering, enten ved å velge et av de "
+"eksisterende biblioteker funnet av Shotwell, eller ved å velge en alternativ "
+"F-Spot-databasefil."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Velkommen til tjenesten for importering av F-Spot-bibliotek\n"
+"\n"
+"Vennligst velg en F-Spot databasefil."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Manuelt valg av en F-Spot database som skal importeres:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Kan ikke åpne den valgte F-Spotdatabasen: filen eksisterer ikke eller er "
+"ikke en F-Spot-database"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Kan ikke åpne den valgte F-Spotdatabasen: Dene versjonen av F-Spot-databasen "
+"støttes ikke av Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Kan ikke lese den valgte F-Spot-databasefilen: Feil ved lesing av taggtabell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Kan ikke lese den valgte F-Spot-databasefilen: Feil ved lesing av bildetabell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell har funnet %d bilder i F-Spot biblioteket, og er i gang med å "
+"importere dem. Duplikater vil automatisk bli oppdaget og fjernet.\n"
+"\n"
+"Du kan stenge dette dialogvinduet, og bruke Shotwell. Importeringen vil "
+"fortsette i bakgrunnen."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot bibliotek: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Klargjør for importering"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Angi som lysbildeshow for skrivebordsbakgrunn"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Generer lysbildeshow for skrivebordsbakgrunn"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Vis alle bilder for"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "Tidsperiode"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Hvor lenge hvert bilde er vist på skrivebordsbakgrunnen"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Søk"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Søkets navn:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Treff"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "for de følgende:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Utskriftstørrelse</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Bruk en _standardstørrelse:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Bruk en _tilpasset størrelse:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "oppretthold bildedi_Mensjonene"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Autostørrelse:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titler</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "skriv ut bilde_tittel"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Oppløsning i bildepunkter</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Send bilde til:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "piksler per tomme"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "Etikett"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell innstillinger"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "hvit"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "svart"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Følg med biblioteksmappen for å oppdage nye filer"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Skriv merkelapper, titler og andre _metadata for bildefiler"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Display"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importer bilde til:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Bakgrunn:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importerer"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Mappestruktur"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Mønster:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Eksempel:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "E_ndre filnavnene til importerte filer til småbokstaver."
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-Fremkaller"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "St_andard:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_kstern bilderedigeringsprogram:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Ekstern _RAW behandler:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Ekstern bildebehandler"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Innstikk"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Forsinkelse:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Overgangseffekt:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Overgangsforsink_else:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Vis t_ittel"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "Sekunder"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Logg inn"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+"(teksten avhenger av fb-brukernavnet og er endret i applikasjonen –\n"
+"det du skriver i dette feltet vil ikke vises)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publiser til et eks_isterende album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Lag et _nytt album med navnet:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "videoer og nye fotoalbum er _synlige for:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Fjern sted, kamera og annen identifiserende informasjon før opplasting"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Logg ut"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publiser"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Skriv inn bekreftelsesnummeret som dukker opp etter du logger på Flickr i "
+"din nettleser."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autorisasjons_nummer:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Du er logget inn på Flickr som (name).\n"
+"\n"
+"(dette feltet er fylt inn i koden,\n"
+"så endringer her vil ikke vises)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "_synlighetsmerke (fylt inn i koden)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Bilde_størrelse:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"«du er logget inn som $name»\n"
+"(fylt inn i applikasjonskoden)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Et _eksisterende album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Et _nytt album ved navn:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "V_is albumet i offentlig galleri"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype vil vises i\n"
+"(fylt inn i koden)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Standardstørrelse på bildet:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL til ditt Piwigo bildebibliotek"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Bruker_navn"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Passord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Husk passord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Logg inn"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "en _eksisterende kategori:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Bilder vil være _synlig for:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Bildestørrelse:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "innenfor kategori:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Albumkommentar:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "_Hvis en tittel er gitt og kommentaren tom, bruk tittel som kommentar"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "_Ikke last opp tagger"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Logg ut"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "video inn_stilling for personvern:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 bildepunkter"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' er ikke et gyldig svar på en OAuth autentiseringsforespørsel"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): kan ikke starte; Dette publiseringsverktøyet kan "
+"ikke omstartes."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Skriv inn brukernavnet og passordet som tilhører din Tumblrkonto"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Kunne ikke laste UI:%s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Du er innlogger på Tumblr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Besøk nettsiden Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Du er nå innlogget på Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Epostadresse"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Du er innlogget på Tumblr som (navn).\n"
+"\n"
+"Denne strengen er satt inn i koden,\n"
+"Så endringer her vil ikke vises)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogger:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumer (eller lag nye):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Tilgangs_type:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Koble ut _kommentarer"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Forby nedlastning av originalbilde"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..fb1d5f6
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,4621 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Heimen Stoffels <vistausss@gmail.com>, 2012-2013
+# Rob van den Berg <linuxned@gmail.com>, 2011, 2012
+# Rob van den Berg <linuxned@gmail.com>, 2011
+# Rob van den Berg <linuxned@gmail.com>, 2012-2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Rob van den Berg <linuxned@gmail.com>\n"
+"Language-Team: Dutch (http://www.transifex.com/projects/p/shotwell/language/"
+"nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Gebeurtenis %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Camera's"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Camera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kon camera niet afkoppelen. Probeer de camera via de bestandsbeheerder af te "
+"koppelen."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Verberg foto's die al geïmporteerd zijn"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Toon alleen foto's die nog niet geïmporteerd zijn"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Importeren wordt gestart, een moment geduld…"
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titels"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Toon de titel van elke foto"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Selectie importeren"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importeer de geselecteerde foto's naar uw bibliotheek"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_Alles importeren"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importeer alle foto's naar uw bibliotheek"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell moet de camera afkoppelen om er toegang tot te kunnen krijgen. "
+"Doorgaan?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Afkoppelen"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Ontkoppel de camera."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"De camera is vergrendeld door een andere toepassing. Shotwell kan alleen "
+"toegang krijgen tot de camera als deze ontgrendeld is. Sluit alle "
+"toepassingen die de camera gebruiken en probeer het opnieuw."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Sluit alle andere toepassingen af die de camera gebruiken."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kon geen voorbeelden ophalen vanaf de camera:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Afkoppelen..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Ophalen van foto-informatie"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Voorbeeld ophalen voor %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kan de camera niet vergrendelen: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Deze foto van de camera verwijderen?"
+msgstr[1] "Deze %d foto's van de camera verwijderen?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Deze video van de camera verwijderen?"
+msgstr[1] "Deze %d video's van de camera verwijderen?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Deze foto/video van de camera verwijderen?"
+msgstr[1] "Deze %d foto's/video's van de camera verwijderen?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Dit bestand van de camera verwijderen?"
+msgstr[1] "Deze %d bestanden van de camera verwijderen?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Bewaren"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Foto's/video's verwijderen van de camera"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Kon %d foto/video niet van de camera verwijderen wegens een probleem."
+msgstr[1] ""
+"Kon %d foto's/video's niet van de camera verwijderen wegens een probleem."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "Diavoorste_lling"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Diavoorstelling afspelen"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exporteer foto/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Foto's/video's exporteren"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exporteren foto"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exporteer foto's"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Aan het draaien"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Draaien aan het ongedaan maken"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Bezig met horizontaal spiegelen"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Ongedaan maken van horizontaal spiegelen"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Verticaal spiegelen"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Verticaal spiegelen ongedaan maken"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Alle tekst"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Label"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Gebeurtenisnaam"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Bestandsnaam"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Mediatype"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Markeringsstatus"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Waardering"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datum"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "bevat"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "is gelijk aan"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "begint met"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "eindigt op"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "bevat niet"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "is niet ingesteld"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "is"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "is niet"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "een foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "een RAW-foto"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "een video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "gemarkeerd"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "niet gemarkeerd"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "en hoger"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "alleen"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "en lager"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "is na"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "is voor"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "is tussen"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "en"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "elk"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alles"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "geen"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Opgeslagen zoekopdrachten"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Nieu_we opgeslagen zoekopdracht…"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Uw fotobibliotheek is niet compatibel met deze versie van Shotwell. Het "
+"lijkt erop dat hij gemaakt is met Shotwell %s (schema %d). Dit is versie %s "
+"(schema %d). Gebruik a.u.b. de nieuwste versie van Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell was niet in staat om uw fotobibliotheek te upgraden van versie %s"
+"(schema %d) naar %s (schema %d). Voor meer informatie, zie de (Engelstalige) "
+"Shotwell-wiki op %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Uw fotobibliotheek is niet compatibel met deze versie van Shotwell. Het "
+"lijkt erop dat hij gemaakt is met Shotwell %s (schema %d). Dit is versie %s "
+"(schema %d). Wis uw bibliotheek door %s te verwijderen en herimporteer "
+"daarna uw foto's ."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Er is een onbekende fout opgetreden bij het controleren van Shotwell's "
+"database: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Bezig met laden van Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Pad naar Shotwell's privédata"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "MAP"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Bibliotheekmap niet controleren op wijzigingen na opstarten"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Opstartvoortgangsmeter niet tonen"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Versie van toepassing tonen"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[BESTAND]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Voer '%s --help' uit voor een volledige lijst met beschikbare "
+"opdrachtregelopties.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Vandaag"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Gisteren"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Items:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d gebeurtenis"
+msgstr[1] "%d gebeurtenissen"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d foto's"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d video's"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Tijd:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Van:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Tot:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Grootte:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Lengte:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f seconden"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Ontwikkelaar:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Belichting:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Locatie:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Bestandsgrootte:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Huidige ontwikkelingsversie:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Originele afmetingen:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Camerafabrikant:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Cameramodel:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flitser:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Brandpuntsafstand:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Tijd:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Belichtingscompensatie:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS-breedtegraad:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS-lengtegraad:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artiest:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Commentaar:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Uitgebreide informatie"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Dit zal het label \"%s\" van één foto verwijderen. Doorgaan?"
+msgstr[1] "Dit zal het label \"%s\" van %d foto's verwijderen. Doorgaan?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Annuleren"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "Verwij_deren"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Dit zal de opgeslagen zoekopdracht \"%s\" verwijderen. Doorgaan?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Het wisselen van ontwikkelaar zal alle wijzigingen ongedaan maken aan deze "
+"foto in Shotwell"
+msgstr[1] ""
+"Het wisselen van ontwikkelaar zal alle wijzigingen ongedaan maken aan deze "
+"foto's in Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "Ontwikkelaar _wisselen"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exporteer video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell kon geen bestand aanmaken voor het bewerken van deze foto omdat u "
+"geen schrijfrechten hebt voor %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Kan de volgende foto niet exporteren door een bestandsfout.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Wilt u doorgaan met exporteren?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Doorgaan"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Onaangepast"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Huidige"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Grootte:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kwaliteit:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Schaalbeperking:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixels"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Metadata exporteren"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Details opslaan…"
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Details opslaan"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(en %d andere)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importresultatenrapport"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Geprobeerd om %d bestand te importeren."
+msgstr[1] "Geprobeerd om %d bestanden te importeren."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Hiervan werd %d bestand succesvol geïmporteerd."
+msgstr[1] "Hiervan werden %d bestanden succesvol geïmporteerd."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplicaatfoto's/-video's die niet werden geïmporteerd:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "dupliceert bestaand media-item"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Foto's/video's niet geïmporteerd door camerafouten:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "foutbericht:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Bestanden niet geïmporteerd omdat ze niet herkend werden als foto's of "
+"video's:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Foto's/video's niet geïmporteerd omdat ze in een bestandsformaat zijn dat "
+"Shotwell niet kent:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Foto's/video's niet geïmporteerd omdat Shotwell ze niet kon kopiëren naar de "
+"bibliotheek:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"kon %s niet kopiëren\n"
+"\tnaar %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Foto's/video's niet geïmporteerd om andere redenen:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 duplicaatfoto is niet geïmporteerd:\n"
+msgstr[1] "%d duplicaatfoto's zijn niet geïmporteerd:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+"1 duplicaatvideo is niet geïmporteerd:\n"
+"\n"
+msgstr[1] ""
+"%d duplicaatvideo's zijn niet geïmporteerd:\n"
+"\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+"1 duplicaatfoto/video is niet geïmporteerd:\n"
+"\n"
+msgstr[1] ""
+"%d duplicaatfoto's/video's zijn niet geïmporteerd:\n"
+"\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Kon 1 foto niet importeren wegens een bestands- of hardwareprobleem:\n"
+msgstr[1] ""
+"Kon %d foto's niet importeren wegens een bestands- of hardwareprobleem:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Kon 1 video niet importeren wegens een bestands- of hardwareprobleem:\n"
+msgstr[1] ""
+"Kon %d video's niet importeren wegens een bestands- of hardwareprobleem:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Kon 1 foto/video niet importeren wegens een bestands- of hardwareprobleem:\n"
+msgstr[1] ""
+"Kon %d foto's/video's niet importeren wegens een bestands- of "
+"hardwareprobleem:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Kon 1 bestand niet importeren wegens een bestands- of hardwareprobleem:\n"
+msgstr[1] ""
+"Kon %d bestanden niet importeren wegens een bestands- of hardwareprobleem:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Kon 1 foto niet importeren omdat de fotobibliotheekmap niet beschrijfbaar "
+"is:\n"
+msgstr[1] ""
+"Kon %d foto's niet importeren omdat de fotobibliotheekmap niet beschrijfbaar "
+"is:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Kon 1 video niet importeren omdat de fotobibliotheekmap niet beschrijfbaar "
+"is:\n"
+msgstr[1] ""
+"Kon %d video's niet importeren omdat de fotobibliotheekmap niet "
+"beschrijfbaar is: \n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Kon 1 foto/video niet importeren omdat de fotobibliotheekmap niet "
+"beschrijfbaar is:\n"
+msgstr[1] ""
+"Kon %d foto's/video's niet importeren omdat de fotobibliotheekmap niet "
+"beschrijfbaar is:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Kon 1 bestand niet importeren omdat de fotobibliotheekmap niet beschrijfbaar "
+"is:\n"
+msgstr[1] ""
+"Kon %d bestanden niet importeren omdat de fotobibliotheekmap niet "
+"beschrijfbaar is:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Kon 1 foto niet importeren wegens een cameraprobleem:\n"
+msgstr[1] "Kon %d foto's niet importeren wegens een cameraprobleem:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Kon 1 video niet importeren wegens een cameraprobleem:\n"
+msgstr[1] "Kon %d video's niet importeren wegens een cameraprobleem:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Kon 1 foto/video niet importeren wegens een cameraprobleem:\n"
+msgstr[1] "Kon %d foto's/video's niet importeren wegens een cameraprobleem:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Kon 1 bestand niet importeren wegens een cameraprobleem:\n"
+msgstr[1] "Kon %d bestanden niet importeren wegens een cameraprobleem:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 foto overgeslagen die niet ondersteund wordt:\n"
+msgstr[1] "%d foto's overgeslagen die niet ondersteund worden:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 bestand overgeslagen dat geen afbeelding is.\n"
+msgstr[1] "%d bestanden overgeslagen die geen afbeeldingen zijn.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 foto overgeslagen wegens het annuleren door de gebruiker:\n"
+msgstr[1] "%d foto's overgeslagen wegens het annuleren door de gebruiker:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video overgeslagen wegens het annuleren door de gebruiker:\n"
+msgstr[1] "%d video's overgeslagen wegens het annuleren door de gebruiker:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 foto/video overgeslagen wegens het annuleren door de gebruiker:\n"
+msgstr[1] ""
+"%d foto's/video's overgeslagen wegens het annuleren door de gebruiker:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 bestand overgeslagen wegens het annuleren door de gebruiker:\n"
+msgstr[1] "%d bestanden overgeslagen wegens het annuleren door de gebruiker:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto succesvol geïmporteerd.\n"
+msgstr[1] "%d foto's succesvol geïmporteerd.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 video succesvol geïmporteerd.\n"
+msgstr[1] "%d video's succesvol geïmporteerd.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto/video succesvol geïmporteerd.\n"
+msgstr[1] "%d foto's/video's succesvol geïmporteerd.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Geen foto's of video's geïmporteerd.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importeren voltooid."
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d seconde"
+msgstr[1] "%d seconden"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuut"
+msgstr[1] "%d minuten"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d uur"
+msgstr[1] "%d uren"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dag"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Hernoem Gebeurtenis"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Naam:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Titel bewerken"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Bestand naar prullenbak _verplaatsen"
+msgstr[1] "Bestanden naar prullenbak _verplaatsen"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Alleen ve_rwijderen"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Externe veranderingen herstellen?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Externe veranderingen herstellen?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Dit zal alle wijzigingen aan het externe bestand ongedaan maken. Doorgaan?"
+msgstr[1] ""
+"Dit zal alle wijzigingen aan %d externe bestanden ongedaan maken. Doorgaan?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Externe _veranderingen ongedaan maken"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Externe veran_deringen herstellen"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Dit zal de foto uit de bibliotheek verwijderen. Doorgaan?"
+msgstr[1] "Dit zal %d foto's uit de bibliotheek verwijderen. Doorgaan?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "Ve_rwijderen"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Foto uit bibliotheek verwijderen"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Foto's uit bibliotheek verwijderen"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 uur"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Foto's/video's evenveel ver_schuiven"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Deze tijd voor _alle foto's/video's gebruiken"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "Originele foto _aanpassen"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "Originele foto's _aanpassen"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Originele bestanden _aanpassen"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Originele bestanden _aanpassen"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Origineel: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"De aanmaakdatum zal naar voren worden opgeschoven met\n"
+"%d %s, %d %s, %d %s en %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"De aanmaakdatum zal naar achteren worden opgeschoven met\n"
+"%d %s, %d %s, %d %s en %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagen"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uur"
+msgstr[1] "uren"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuut"
+msgstr[1] "minuten"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "seconde"
+msgstr[1] "seconden"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"En %d andere."
+msgstr[1] ""
+"\n"
+"\n"
+"En %d anderen."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Labels (gescheiden door komma's):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Welkom!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Welkom bij Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Om te beginnen, importeer uw foto's op een van deze manieren:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Kies <span weight=\"bold\">Bestand %s importeren uit map</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Versleep foto's naar het Shotwell-venster"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Verbind een camera met uw computer en importeer de foto's"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "Foto's uit uw %s-map _importeren"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "U kunt foto's ook op één van de volgende manieren importeren:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Laat _dit bericht nooit meer zien"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Foto's importeren uit uw %s-bibliotheek"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Hulp)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Jaar%sMaand%sDag"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Jaar%sMaand"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Jaar%sMaand-Dag"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Jaar-Maand-Dag"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Aangepast"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Ongeldig patroon"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell kan de foto's kopiëren naar uw bibliotheekmap of kan ze importeren "
+"zonder ze te kopiëren."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Foto's ko_piëren"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importeren naar locatie"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importeren naar bibliotheek"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Verwijder uit bibliotheek"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Verwijderen van foto uit bibliotheek"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Foto's uit bibliotheek verwijderen"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dit zal de foto/video uit uw Shotwell-bibliotheek verwijderen. Wilt u dit "
+"bestand ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt!"
+msgstr[1] ""
+"Dit zal %d foto's/video's uit uw Shotwell-bibliotheek verwijderen. Wilt u "
+"deze bestanden ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt!"
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dit zal de video uit uw Shotwell-bibliotheek verwijderen. Wilt u dit bestand "
+"ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt."
+msgstr[1] ""
+"Dit zal %d video's uit uw Shotwell-bibliotheek verwijderen. Wilt u deze "
+"bestanden ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Dit zal de foto uit uw Shotwell-bibliotheek verwijderen. Wilt u dit bestand "
+"ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt!"
+msgstr[1] ""
+"Dit zal %d foto's uit uw Shotwell-bibliotheek verwijderen. Wilt u deze "
+"bestanden ook naar de systeemprullenbak verplaatsen?\n"
+"\n"
+"Dit kan niet ongedaan worden gemaakt!"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"De foto of video kan niet naar de systeemprullenbak worden verplaatst. Dit "
+"bestand verwijderen?"
+msgstr[1] ""
+"%d foto's/video's kunnen niet naar de systeemprullenbak worden verplaatst. "
+"Deze bestanden verwijderen?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "De foto of video kan niet worden verwijderd."
+msgstr[1] "%d foto's/video's kunnen niet worden verwijderd."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Mappen"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Labels"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Succes"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Bestandsfout"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Kon het bestand niet decoderen"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Databasefout"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Importeren afgebroken door gebruiker"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Geen bestand"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Bestand bestaat al in de database"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Niet-ondersteund bestandsformaat"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Geen afbeeldingsbestand"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Schijfprobleem"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Schijf is vol"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Camerafout"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Schrijffout bestand"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importeren mislukt (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "aangepast"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Vorige foto"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Volgende foto"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Bronbestand van foto ontbreekt: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Weergave"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Hulpmiddelen"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Vo_rige foto"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Vorige foto"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Volge_nde foto"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Volgende foto"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Inzoomen"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Foto vergroten"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Uitz_oomen"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Foto verkleinen"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "_Passend op pagina"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zoom de foto om op het scherm te passen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_100% zoomen"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Foto zoomen naar 100% vergroting"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_200% zoomen"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Foto zoomen naar 200% vergroting"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Ontwikkelaar"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Kon %s niet exporteren: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s-database"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"Het importeren vanaf %s kan niet doorgaan omdat er een fout is opgetreden:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Indien u wilt importeren vanaf een andere dienst, dan kunt u deze selecteren "
+"in het bovenstaande menu."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Data-import"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"U heeft geen data-importplug-in ingeschakeld.\n"
+"\n"
+"Om het mogelijk te maken om data te importeren vanuit een toepassing, dient "
+"u minimaal één data-importplug-in in te schakelen. Plug-ins kunt u "
+"inschakelen in de Voorkeuren-dialoog."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Databasebestand:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importeer"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importeren vanuit toepassing"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Media importeren _vanaf:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Sluiten"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Instellingen"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diavoorstelling"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Terug"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ga naar de vorige foto"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pauzeer"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Diavoorstelling pauzeren"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Volgende"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ga naar de volgende foto"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Instellingen diavoorstelling wijzigen"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "De bronbestanden van alle foto's ontbreken."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Afspelen"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Doorgaan met de diavoorstelling"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Bezig met herstellen"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Herstellen ongedaan maken"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Verbeteren"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Verbeteren ongedaan maken"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Nieuwe gebeurtenis aanmaken"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Gebeurtenis verwijderen"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Foto's verplaatsen naar nieuwe gebeurtenis"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Foto's verplaatsen naar vorige gebeurtenis"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Samenvoegen"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Samenvoegen ongedaan maken"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Foto's dupliceren"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Gedupliceerde foto's verwijderen"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kan één foto niet dupliceren door een bestandsfout"
+msgstr[1] "Kan %d foto's niet dupliceren door bestandsfouten"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Vorige waardering herstellen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Waarderingen verhogen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Waarderingen verlagen"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW-ontwikkelaar instellen"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Vorige RAW-ontwikkelaar herstellen"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Ontwikkelaar instellen"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Originele foto kon niet worden aangepast."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Datum en tijd aanpassen"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Datum- en tijdsaanpassingen ongedaan maken"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Eén originele foto kon niet worden aangepast."
+msgstr[1] "De volgende originele foto's konden niet worden aangepast."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Fout bij aanpassen tijd"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Het aanpassen van de tijd kon niet ongedaan worden gemaakt bij het volgende "
+"fotobestand."
+msgstr[1] ""
+"Het aanpassen van de tijd kon niet ongedaan worden gemaakt bij de volgende "
+"fotobestanden."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Label aanmaken"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Label \"%s\" verplaatsen"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Verplaats foto's naar de prullenbak"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Haal foto's terug uit de prullenbak"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Verplaats foto's naar de Shotwell-prullenbak"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Haal foto's terug naar de Shotwell-bibliotheek"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Foto's naar prullenbak verplaatsen "
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Foto's uit prullenbak terugplaatsen "
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Geselecteerde foto's markeren"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Geselecteerde foto's demarkeren"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Markeren"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Demarkeren"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Laag (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Middel (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Hoog (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximaal (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Geen foto's/video's"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Geen foto's/video's gevonden"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Foto's kunnen niet worden geëxporteerd naar deze map."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Kon monitorende updates niet verwerken: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Hele pagina vullen"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 afbeeldingen per pagina"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 afbeeldingen per pagina"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 afbeeldingen per pagina"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 afbeeldingen per pagina"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 afbeeldingen per pagina"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 afbeeldingen per pagina"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Portemonnee (2 x 3 inch)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notitiekaart (3 x 5 inch)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 inch"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 inch"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 inch"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 inch"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 inch"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrische portemonnee (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Briefkaart (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Afbeeldingsinstellingen"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Afdrukken…"
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Kon foto niet afdrukken:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Kon fotodatabase %s niet openen/aanmaken: foutcode %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Kon foto niet schrijven naar database:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Fout bij toegang tot database:\n"
+" %s\n"
+"\n"
+"Fout was: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exporteer video's"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Kon Nautilus Send-To (versturen naar) niet openen: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Versturen naar"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Kon achtergrond niet exporteren naar %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Kon bureaubladdiavoorstelling niet voorbereiden: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Gemarkeerd"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Prullenbak"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "De prullenbak is leeg"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Foto's worden verwijderd"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Ontbrekende bestanden"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Verwijderen…"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Laatste import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importeren uit map…"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importeer foto's van schijf naar bibliotheek"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importeren vanuit toe_passing…"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "G_ebeurtenissen sorteren"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Prulle_nbak legen"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Alle foto's uit de prullenbak verwijderen"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Gebeurte_nis van foto bekijken"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Zoeken"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Foto's en video's zoeken door middel van zoekcriteria"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Bestand"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "Be_werken"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Foto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Foto's"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Gebeur_tenissen"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Labels"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hulp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Basisinformatie"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Laat basisinformatie van selectie zien"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Uitgebreide informatie"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Laat uitgebreide informatie van selectie zien"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Zoek_balk"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Zoekbalk tonen"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Z_ijbalk"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Zijbalk tonen"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Oplopend"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Foto's sorteren in oplopende volgorde"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "Aflop_end"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Foto's sorteren in aflopende volgorde"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importeren uit map"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Prullenbak legen"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Prullenbak legen…"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell is ingesteld om foto's naar uw persoonlijke map te importeren.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Bibliotheeklocatie"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Foto's uit deze map kunnen niet worden geïmporteerd."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Bijwerken van bibliotheek…"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Voorbereiden om foto's automatisch te importeren…"
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automatisch importeren van foto's…"
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Webschrijvan van metadata naar bestanden…"
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliotheek"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importeren…"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Importeren _stoppen"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Stoppen met het importeren van foto's"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Importeren voorbereiden…"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s geïmporteerd"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "Op_slaan"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Foto opslaan"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Opslaan _als…"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Foto opslaan met een andere naam"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Foto afdrukken met een aan de computer aangesloten printer"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s bestaat niet."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s is geen bestand."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ondersteunt het bestandsformaat van\n"
+"%s niet."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Een kopie op_slaan"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Wijzigingen aan %s niet opslaan?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Sluiten _zonder op te slaan"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Fout bij het opslaan in %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Opslaan als"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kon %s niet controleren: is geen map (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotobeheerder"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotobekijker"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Naar _rechts draaien"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Draaien"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Naar rechts draaien"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Foto's naar rechts draaien (druk op Ctrl om naar links te draaien)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Naar _links draaien"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Naar links draaien"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Foto's naar links draaien"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Hori_zontaal spiegelen"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Horizontaal spiegelen"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Verti_caal spiegelen"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Verticaal spiegelen"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Verbeteren"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Verbeteren"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "De foto automatisch verbeteren"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Bijsnijden"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Bijsnijden"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Grootte van de foto bijsnijden"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Rechtmaken"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Rechtmaken"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Foto rechtmaken"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Rode-ogen"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Rode-ogen"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Corrigeer rode ogen in de foto"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Aanpassen"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Aanpassen"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Kleur en kleurtoon van foto's aanpassen"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Herstellen naar origineel"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Herstellen naar origineel"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Externe veran_deringen herstellen"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Herstellen naar de originele foto"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Instellen als bureau_bladachtergrond"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Geselecteerde afbeelding instellen als nieuwe bureaubladachtergrond"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Instellen als bureaubla_ddiavoorstelling…"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Ongedaan maken"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Ongedaan maken"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Opnieuw doen"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Opnieuw doen"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Gebeurtenis her_noemen…"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Sleutelfoto voor deze gebeurtenis aanma_ken"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Sleutelfoto voor deze gebeurtenis aanmaken"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nieuwe gebeurtenis"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Nieuwe gebeurtenis"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Foto's verplaatsen"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Foto's naar een gebeurtenis verplaatsen "
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Gebeurtenissen sa_menvoegen"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Samenvoegen"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Gebeurtenissen samenvoegen tot een enkele gebeurtenis"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Waardering in_stellen"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Waardering instellen"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Waardering van foto wijzigen"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "Ver_hogen"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Waardering verhogen"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "Ver_lagen"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Waardering verlagen"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "Onge_waardeerd"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Niet gewaardeerd"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Ongewaardeerde foto's waarderen"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Instellen als ongewaardeerd"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Alle waarderingen verwijderen"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "Afgewe_zen"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Afgewezen"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Afgewezen foto's waarderen"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Instellen als afgewezen"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Waardering instellen als afgewezen"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Alleen _afgewezen"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Alleen afgewezen"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Alleen afgewezen foto's laten zien"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Alle + de afgewe_zen foto's"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Alle foto's tonen, inclusief de afgewezen foto's"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Alle foto's"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Alle foto's tonen"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Waa_rderingen"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Waardering van elke foto tonen"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "Foto's _filteren"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Foto's filteren"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Beperk het aantal getoonde foto's door een filter te gebruiken"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicaat maken"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicaat maken"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Duplicaat van foto maken"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exporteer…"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Af_drukken…"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_bliceren…"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publiceren"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publiceren naar verschillende websites"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "_Titel bewerken…"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "_Commentaar bewerken…"
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Commentaar bewerken"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Datum en tijd _aanpassen…"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Datum en tijd aanpassen"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Labels toevoegen…"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "Labels _toevoegen…"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Labels toevoegen"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Voorkeuren"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Openen met e_xterne editor"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Met RA_W-bewerker openen"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Versturen _naar…"
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Versturen _naar…"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Zoeken…"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Zoeken"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Zoek een afbeelding door het intypen van tekst die voorkomt in de naam of "
+"labels"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Markeer"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "De_markeer"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Kon bewerker niet starten: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Label \"%s\" toevoegen"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Labels \"%s\" en \"%s\" toevoegen"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Label \"%s\" verwij_deren"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Label \"%s\" verwijderen"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Label verwijderen"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nieuw"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Label \"%s\" her_noemen…"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Hernoem label \"%s\" naar \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Hernoemen…"
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Labels aan_passen…"
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Labels aanpassen"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Foto's labelen als \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Foto's labelen als \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Geselecteerde foto's labelen als \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Geselecteerde foto's labelen als \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Label \"%s\" van _foto verwijderen"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Label \"%s\" van _foto's verwijderen"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Label \"%s\" van foto verwijderen"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Label \"%s\" van foto's verwijderen"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Kon label niet hernoemen naar \"%s\" omdat dit label al bestaat."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Kon zoekopdracht niet hernoemen naar \"%s\" omdat deze zoekopdracht al "
+"bestaat."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Opgeslagen zoekopdracht"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Zoekopdracht verwijderen"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "Be_werken…"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Hernoemen…"
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Hernoem zoekopdracht \"%s\" naar \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Zoekopdracht \"%s\" verwijderen"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Waardering %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Waardering instellen op %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Waardering wordt ingesteld op %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s tonen"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Toon alleen foto's met een waardering van %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s of hoger"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s of hoger tonen"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Toon alleen foto's met een waardering van %s of hoger"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Geselecteerde foto's uit de Shotwell-prullenbak verwijderen"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Geselecteerde foto's uit de bibliotheek verwijderen"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "He_rstellen"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Geselecteerde foto's herstellen naar de bibliotheek"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Laat zien in _bestandsbeheerder"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Geselecteerde map met foto's in bestandsbeheerder openen"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Kon niet geopend worden in bestandsbeheerder: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "V_erwijder uit bibliotheek"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Naar prullenbak _verplaatsen"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "_Selecteer alles"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Selecteer alle items"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Hoek:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "He_rstellen"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Herstellen naar huidige fotoafmetingen"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Stel de uitsnede voor deze foto in"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Bijsnijdrechthoek wisselen tussen staande en liggende oriëntatie"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Onbeperkt"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Vierkant"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Scherm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Originele grootte"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD-video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD-video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "US Letter (215,9 mm × 279,4 mm)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (279,4 x 431,8 mm)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Sluit Rode ogen-hulpmiddel"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Rode ogen in het geselecteerde gebied verwijderen"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Verzadiging:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tint:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatuur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Schaduwen:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Kleuren herstellen"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Alle kleuraanpassingen naar de oorspronkelijke waarden herstellen"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatuur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tint"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Verzadiging"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Belichting"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Schaduwen"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Contrast vergroten"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Werkbalk vastzetten"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Werkbalk open vastzetten"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Volledig scherm verlaten"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Volledig scherm verlaten"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "A_fsluiten"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "O_ver"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Volledig s_cherm"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Inhoud"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_FAQ (veelgestelde vragen)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "Een probleem _rapporteren…"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Er is een fatale fout opgetreden bij het inlezen van de Shotwell-"
+"bibliotheek. Shotwell kan niet doorgaan.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Bezoek de Yorba-website"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Kaj-Ivar van der Wijst <kaj-ivar@vanderwijst.com>\n"
+"Rob <linuxned@gmail.com>\n"
+"Redmar <redmar@ubuntu-nl.org>\n"
+"Heimen Stoffels <vistausss@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Kan hulp niet laten zien: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Kon niet navigeren naar foutendatabase: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Kon FAQ niet tonen: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "naamloos"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Originele grootte"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Breedte of hoogte"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Breedte"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Hoogte"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Pas de grootte van de miniaturen aan"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Vergroting van miniaturen verhogen"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Vergroting van miniaturen verlagen"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Foto's sorteren"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Video afs_pelen"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "De geselecteerde video's openen met de systeemvideospeler"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Commentaren"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Toon commentaar van elke foto"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Labels van elke foto tonen"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Op _titel"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Foto's sorteren op titel"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Op _datum"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Foto's sorteren op datum"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Op waa_rdering"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Foto's sorteren op waardering"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell kon de geselecteerde video niet afspelen:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d foto's/video's"
+msgstr[1] "%d foto/video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Toon commentaar van elke gebeurtenis"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Geen gebeurtenissen"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Geen gebeurtenissen gevonden"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Gebeurtenissen"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Zonder datum"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Geen gebeurtenis"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Kon buffermap %s niet aanmaken: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Kon datamap %s niet aanmaken: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Foto's"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Kon tijdelijke map %s niet aanmaken: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Kon datasubmap %s niet aanmaken: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Geen)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Geen"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Willekeurig"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Diavoorstellingsovergangen"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Kon tijdelijk bestand voor %s niet aanmaken: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exporteren"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Bestand %s bestaat al. Vervangen?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Over_slaan"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "Ve_rvangen"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_Alles vervangen"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exporteer"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Foto's"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video's"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-foto's"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-foto"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Fout bij het laden van UI-bestand %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Type"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publiceren"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "De geselecteerde foto's/video's zijn succesvol gepubliceerd."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "De geselecteerde video's zijn succesvol gepubliceerd."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "De geselecteerde foto's zijn succesvol gepubliceerd."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "De geselecteerde video is succesvol gepubliceerd."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "De geselecteerde foto is succesvol gepubliceerd."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Accountinformatie wordt opgehaald…"
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Bezig met inloggen…"
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publiceer foto's"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publiceer foto's _naar:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publiceer video's"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publiceer video's _naar:"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publiceer foto's en video's"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publiceer foto's en video's _naar:"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Kon niet publiceren"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell kan de geselecteerde items niet publiceren, omdat u geen "
+"compatibele publicatieplug-in ingeschakeld heeft. Om dit te corrigeren, "
+"selecteert u <b>Bewerken %s Voorkeuren</b> en schakelt u één of meer "
+"publicatieplug-ins in in het tabblad <b>Plug-in</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Voorbereiden van het uploaden"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d van %d uploaden"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"Het publiceren naar %s kan niet doorgaan omdat er een fout is opgetreden:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Indien u wilt publiceren naar een andere dienst, dan kunt u deze selecteren "
+"in het bovenstaande menu."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nieuw _label…"
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Een tijdelijk bestand dat nodig is voor het publiceren is niet beschikbaar"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"U bent momenteel niet ingelogd bij YouTube.\n"
+"\n"
+"U moet al een Google-account hebben en deze ingesteld hebben voor YouTube om "
+"door te kunnen gaan. U kunt de meeste accounts instellen door minstens "
+"eenmaal in te loggen bij YouTube in uw webbrowser."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Een bestand dat nodig is voor het publiceren is niet beschikbaar. Publiceren "
+"naar Youtube kan niet doorgaan."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "U bent ingelogd bij YouTube als %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Video's zullen verschijnen in '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Openbaar"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Beperkt openbaar"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privé"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Kern-publiceerdiensten"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"U bent momenteel niet aangemeld bij Flickr.\n"
+"\n"
+"Klik op aanmelden om uzelf in uw webbrowser aan te melden bij Flickr. U "
+"dient Shotwell-verbinden te autoriseren om een verbinding te maken met uw "
+"Flickr-account."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"U heeft zich reeds in- en uitgelogd bij Flickr tijdens deze Shotwell-"
+"sessie.\n"
+"Om door te kunnen gaan met het publiceren naar Flickr dient u Shotwell af te "
+"sluiten en te herstarten waarna u het opnieuw kunt proberen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Aanmelden voorbereiden…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Een bestand dat nodig is voor het publiceren is niet beschikbaar. Publiceren "
+"naar Flickr kan niet doorgaan."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Autorisatie controleren…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"U bent ingelogd bij Flickr als %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Uw gratis Flickr-account heeft een limiet voor wat u maandelijks mag "
+"uploaden.\n"
+"Voor deze maand heeft u nog %d megabytes aan ruimte over."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Uw Flickr Pro-account geeft u het recht om ongelimiteerd te uploaden."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Foto's zichtbaar _voor:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Video's zichtbaar _voor:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Foto's en video's zichtbaar _voor:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Iedereen"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Alleen vrienden & familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Alleen familie"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Alleen vrienden"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Alleen ik"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Album %s aanmaken…"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Er is een fout opgetreden bij het publiceren naar Piwigo. Probeer het a.u.b. "
+"opnieuw."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Voer de URL van uw Piwigo-fotobibliotheek in, evenals de gebruikersnaam en "
+"wachtwoord van uw Piwigo-account."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell kan geen contact met uw Piwigo-fotobibliotheek maken. Controleer de "
+"opgegeven URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Gebruikersnaam en/of wachtwoord onjuist. Probeer het a.u.b opnieuw"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Ongeldige URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Ongeldige gebruikersnaam of wachtwoord"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell-verbinden"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Beheerders, Familie, Vrienden, Contacten"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Beheerders, Familie, Vrienden"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Beheerders, Familie"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Beheerders"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"U bent momenteel niet aangemeld bij Picasa Web Albums.\n"
+"\n"
+"Klik op aanmelden om uzelf via uw webbrowser aan te melden bij Picasa Web "
+"Albums. U dient Shotwell te autoriseren om verbinding te kunnen maken met uw "
+"Picasa Web Albums-account."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Een bestand dat nodig is voor het publiceren is niet beschikbaar. Publiceren "
+"naar Picasa kan niet doorgaan."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Aanmaken van album…"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "U bent ingelogd bij Picasa Web Albums als %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video's zullen verschijnen in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Foto's zullen verschijnen in:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Klein (640 x 480 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Middel (1024 x 768 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Aanbevolen (1600 x 1200 pixels)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"U bent momenteel niet ingelogd bij Facebook.\n"
+"\n"
+"Als u nog geen Facebook-account heeft, dan kunt u die aanmaken tijdens het "
+"inlogproces. Tijdens het inloggen kan Shotwell-verbinden u om toestemming "
+"vragen om foto's te uploaden en om naar uw prikbord te publiceren. Deze "
+"toestemming is nodig zodat Shotwell-verbinden kan functioneren."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"U heeft zich reeds in- en uitgelogd bij Facebook tijdens deze Shotwell-"
+"sessie.\n"
+"Om door te kunnen gaan met het publiceren naar Facebook dient u Shotwell af "
+"te sluiten en te herstarten waarna u het opnieuw kunt proberen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standaard (720 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Groot (2048 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Verbinding met Facebook testen…"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Een bestand dat nodig is voor het publiceren is niet beschikbaar. Publiceren "
+"naar Facebook kan niet doorgaan."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"U bent ingelogd bij Facebook als %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Waar wilt u de geselecteerde foto's publiceren?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Upload_grootte:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Vrienden"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Uiteenvallen"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Schaakbord"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Cirkels"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Lamellen"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Strepen"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Klok"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Cirkel"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Kern-diavoorstellingsovergangen"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Dia"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Vervagen"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Vierkanten"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Kern-data-importdiensten"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Welkom bij de bibliotheekimportdienst van F-Spot.\n"
+"\n"
+"Selecteer a.u.b. een bibliotheek om te importeren, hetzij door een van de "
+"bestaande bibliotheken te selecteren die Shotwel heeft gevonden, hetzij door "
+"een alternatief databasebestand van F-Spot te selecteren."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Welkom bij de bibliotheekimportdienst van F-Spot.\n"
+"\n"
+"Selecteer a.u.b. een databasebestand van F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Handmatig een databasebestand van F-Spot selecteren om te importeren:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Kan het geselecteerde databasebestand van F-Spot niet openen: het bestand "
+"bestaat niet of is geen F-Spot-database"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Kan het geselecteerde databasebestand van F-Spot niet openen: deze versie "
+"van de F-Spot-database wordt niet ondersteund door Shotwell."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Kan het geselecteerde databasebestand van F-Spot niet lezen: fout bij het "
+"lezen van de labeltabel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Kan het geselecteerde databasebestand van F-Spot niet lezen: fout bij het "
+"lezen van de fototabel"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell heeft %d foto's gevonden in de F-Spot-bibliotheek en is ze thans "
+"aan het importeren. Dubbele exemplaren zullen automatisch worden herkend en "
+"verwijderd.\n"
+"\n"
+"U kunt dit dialoogvenster sluiten en beginnen met het gebruiken van "
+"Shotwell, terwijl de import plaatsvindt in de achtergrond."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot-bibliotheek: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Importeren voorbereiden"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Instellen als bureaubladdiavoorstelling"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Bureaubladdiavoorstelling aanmaken"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Toon elke foto gedurende"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "tijdsduur"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Hoe lang elke foto zichtbaar is op de bureaubladachtergrond"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Zoeken"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Naam van zoekopdracht:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "Overeenko_mend met"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "van het volgende:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Afbeeldingsgrootte afdruk</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "_Standaardgrootte gebruiken:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Aangepaste grootte gebr_uiken:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Beeldverhouding behouden"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automatisch schalen:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titels</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Afbeeldings_titel afdrukken"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Pixelresolutie</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Voer foto uit op:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixels per inch"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "label"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell-voorkeuren"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "wit"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "zwart"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Bibliotheekmap monitoren voor nieuwe bestanden"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Labels, titels, en andere _metadata naar fotobestanden schrijven"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Weergave"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Foto's importeren naar:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Achtergrond"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importeren"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Mapstructuur:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Patroon:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Voorbeeld:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Geïmporteerde bestanden _hernoemen naar kleine letters"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-ontwikkelaar"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Standaard:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_xterne foto-editor:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Externe _RAW-editor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Externe bewerkers"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Plug-ins"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Vertraging"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Overgangseffec_t:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Overgangsv_ertraging:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "_Titel tonen"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "seconden"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "In_loggen"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publiceren in een _bestaand album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "_Nieuw album aanmaken met de naam:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Video's en nieuwe fotoalbums zichtbaar _voor:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "Afme_lden"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publiceren"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Voer het bevestigingsnummer in dat verschijnt nadat u zich, in uw "
+"webbrowser, aangemeld heeft op Flickr."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autorisatie_nummer:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Foto_grootte:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Een b_estaand album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "A _new album named:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "A_lbum in openbare galerij plaatsen"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Standaard fotogrootte:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL van uw Piwigo-fotobibliotheek"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Gebruikers_naam"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Wachtwoord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Wachtwoord _onthouden"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Aanmelden"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Een _bestaande categorie:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Foto's zullen zichtbaar zijn _voor:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Fotogrootte:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Afmelden"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Privacy-in_stellingen video:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' is geen geldig antwoord op een OAuth-authenticatieverzoek"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): kan niet starten; deze publicist is niet "
+"herstartbaar."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Voer uw gebruikersnaam en wachtwoord in voor uw Tumbir-account."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Kon gebruikersinterface niet laden: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"U bent op Tumbir aangemeld als %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Bezoek de Yandex.Fotki-website"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "U bent momenteel niet aangemeld op Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_E-mailadres"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"U bent bij Tumblr aangemeld als (naam).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albums (of maak nieuwe aan):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Toegangs_type:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "_Commentaar uitschakelen"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Downloaden van originele _foto niet toestaan"
diff --git a/po/nn.po b/po/nn.po
new file mode 100644
index 0000000..cc3c82a
--- /dev/null
+++ b/po/nn.po
@@ -0,0 +1,4381 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-25 08:40+0000\n"
+"Last-Translator: unhammer <unhammer+dill@mm.st>\n"
+"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/"
+"p/shotwell/language/nn_NO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nn_NO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Hending %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kamera"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Klarte ikkje avmontera kameraet. Prøv å avmontera kameraet frå "
+"filhandsamaren."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skjul bilete som allereie er importerte"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Vis berre bilete som ikkje har vorte importerte"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Byrjar å importera, ver venleg og vent …"
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_titlar"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Vis titlane for kvart bilete"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importer _valte"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importer dei valde bileta til biletbiblioteket ditt"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importer _alle"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importer alle bileta til biletbiblioteket ditt"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell treng å avmontera kameraet frå filsystem for å få tilgjenge til "
+"det. Hald fram?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Avmonter"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Ver venleg og avmonter kameraet."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kameraet er låst av eit anna program. Shotwell kan berre få tilgjenge til "
+"kameraet når det er ulåst. Ver venleg og steng andre program som brukar "
+"kameraet, og prøv igjen."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Ver venleg og lukk alle andre program som brukar kameraet."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Klarte ikkje henta førehandsvisning frå kameraet:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Avmonterer …"
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Hentar biletinformasjon"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Hentar førehandsvisning for %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Klarte ikkje låsa kameraet: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Vil du sletta dette biletet frå kameraet?"
+msgstr[1] "Vil du sletta desse %d bileta frå kameraet?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Vil du sletta denne videoen frå kameraet?"
+msgstr[1] "Vil du sletta desse %d videoane frå kameraet?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Slett biletet/videoen frå kameraet?"
+msgstr[1] "Slett desse %d bileta/videoane frå kameraet?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Vil du sletta desse filene frå kameraet?"
+msgstr[1] "Vil du sletta desse %d filene frå kameraet?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Spar"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fjernar bilete/videoar frå kameraet"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Kan ikkje sletta %d bilete/video frå kameraet pga. feil."
+msgstr[1] "Kan ikkje sletta %d bilete/videoar frå kameraet pga. feil."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "L_ysbiletframvisning"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Vis lysbilete"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksporter bilete/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksporter bilete/videoar"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Eksporter bilete"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksporter bilete"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotering"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Angrar rotering"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Vender vassrett"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Angrar vassrett vending"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vend loddrett"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Angrar loddrett vending"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Allslags tekst"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Tittel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Tagg"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Hendingsnamn"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Filnamn"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Mediatype"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Flaggtilstand"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Fototilstand"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Rangering"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dato"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "inneheld"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "er eksakt"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "byrjar med"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "sluttar med"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "inneheld ikkje"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "er ikkje sett"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "er"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "er ikkje"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "kva som helst bilete"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "eit RAW-bilete"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ein video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "har"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "har ikkje"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "endringar"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "interne endringar"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "eksterne endringar"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "flagga"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ikkje flagga"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "og høgare"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "berre"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "og lågare"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "er etter"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "er før"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "er mellom"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "og"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ein av dei"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alle"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ingen"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Lagra søk"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "N_ytt lagra søk …"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Lastar Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Stig til Shotwells private data"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KATALOG"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Ikkje vis oppstartsprogresjon"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Vis utgåva av programmet"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FIL]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "I dag"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "I går"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Tittel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d bilete"
+msgstr[1] "%d bilete"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d video"
+msgstr[1] "%d videoar"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Dato:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Tid:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Frå:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Til:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Storleik:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr ""
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr ""
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr ""
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr ""
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr ""
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr ""
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr ""
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr ""
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr ""
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr ""
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr ""
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr ""
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr ""
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr ""
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr ""
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr ""
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr ""
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr ""
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr ""
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr ""
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr ""
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr ""
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr ""
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr ""
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr ""
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr ""
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr ""
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr ""
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr ""
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr ""
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr ""
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr ""
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr ""
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr ""
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr ""
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr ""
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr ""
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr ""
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr ""
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr ""
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr ""
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr ""
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr ""
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr ""
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr ""
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr ""
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr ""
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr ""
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr ""
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr ""
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr ""
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr ""
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr ""
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr ""
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr ""
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr ""
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr ""
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr ""
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr ""
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr ""
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr ""
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr ""
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr ""
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr ""
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr ""
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr ""
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr ""
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr ""
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr ""
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr ""
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr ""
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr ""
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr ""
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr ""
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr ""
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr ""
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr ""
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr ""
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr ""
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr ""
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr ""
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr ""
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr ""
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr ""
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr ""
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr ""
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr ""
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr ""
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr ""
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr ""
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr ""
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr ""
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr ""
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr ""
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr ""
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr ""
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr ""
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr ""
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr ""
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr ""
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr ""
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr ""
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr ""
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr ""
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr ""
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr ""
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr ""
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr ""
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr ""
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr ""
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr ""
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr ""
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr ""
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr ""
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr ""
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr ""
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr ""
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr ""
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr ""
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr ""
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr ""
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr ""
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr ""
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr ""
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr ""
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr ""
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr ""
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr ""
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr ""
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr ""
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr ""
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr ""
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr ""
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr ""
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr ""
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr ""
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr ""
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr ""
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr ""
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr ""
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr ""
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr ""
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr ""
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr ""
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr ""
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr ""
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr ""
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr ""
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr ""
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr ""
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr ""
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr ""
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr ""
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr ""
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Ei mellombels fil som trengst for å publisera er ikkje tilgjengeleg"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr ""
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 biletpunkt"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 biletpunkt"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Brukarnamn og/eller passord er feil. Ver venleg og prøv igjen"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Ugyldig brukarnamn og passord"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr ""
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr ""
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr ""
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr ""
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr ""
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr ""
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "Etikett"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr ""
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr ""
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr ""
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr ""
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr ""
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr ""
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr ""
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr ""
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr ""
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr ""
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr ""
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr ""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr ""
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Logg ut"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publiser"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Bilete_storleik:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Passord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Logg inn"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Opphavsrett 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 biletpunkt"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "«%s» er ikkje eit gyldig svar på ein OAuth-autentiseringsførespurnad"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): kan ikkje starta. Dette publiseringverktøyet kan "
+"ikkje omstartast."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Skriv inn brukarnamnet og passordet til Tumblr-kontoen din."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Kunne ikkje lasta UI: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Du er logga inn på Tumblr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Opphavsrett 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Sjå nettsida Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Du er ikkje logga inn på Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Epostadresse"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Du er logga inn på Tumblr som (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Bloggar:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Album (eller lag nye):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tilgjengetype:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Skru av _kommentarar"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Forby nedlasting av originalbilete"
diff --git a/po/or.po b/po/or.po
new file mode 100644
index 0000000..f0ff15b
--- /dev/null
+++ b/po/or.po
@@ -0,0 +1,4532 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Manoj Kumar Giri <mgiri@redhat.com>, 2012-2013
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
+"Language-Team: Oriya (http://www.transifex.com/projects/p/shotwell/language/"
+"or/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: or\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "ଘଟଣା %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "କ୍ୟାମେରାଗୁଡ଼ିକ"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "କ୍ଯାମେରା"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"କ୍ୟାମେରାକୁ ବିସ୍ଥାପନ କରିବାରେ ଅସମର୍ଥ। କ୍ୟାମେରାକୁ ଫାଇଲ ପରିଚାଳକରୁ ବିସ୍ଥାପିତ କରିବା ପାଇଁ ଚେଷ୍ଟା "
+"କରନ୍ତୁ।"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ପୂର୍ବରୁ ଆମଦାନୀ କରାଯାଇଥିବା ଫୋଟୋଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "କେବଳ ଆମଦାନୀ କରାଯାଇନଥିବା ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "ଆମଦାନୀ ଆରମ୍ଭ କରୁଅଛି, ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "ଶୀର୍ଷକ (_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "ପ୍ରତ୍ୟେକ ଫୋଟୋର ଶୀର୍ଷକ ଦର୍ଶାନ୍ତୁ"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "ବଚ୍ଛିତକୁ ଆମଦାନୀ କରନ୍ତୁ ( _S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଲାଇବ୍ରେରୀକୁ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "ସମସ୍ତଙ୍କୁ ଆମଦାନୀ କରନ୍ତୁ (_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "ସମସ୍ତ ଫୋଟୋଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଲାଇବ୍ରେରୀକୁ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"ଅଭିଗମ୍ୟ କରିବା ପାଇଁ Shotwell କ୍ୟାମେରାକୁ ଫାଇଲତନ୍ତ୍ରରୁ ବିସ୍ଥାପିତ କରିବା ଆବଶ୍ୟକ ହୋଇଥାଏ।ଆଗକୁ ବଢ଼ିବେ "
+"କି?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "ବିସ୍ଥାପନ କରନ୍ତୁ (_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "ଦୟାକରି କ୍ୟାମେରାକୁ ବିସ୍ଥାପିତ କରନ୍ତୁ।"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"କ୍ୟାମେରାଟି ଅନ୍ୟ ଏକ ପ୍ରୟୋଗ ଦ୍ୱାରା ଅପରିବର୍ତ୍ତନୀୟ ହୋଇଛି। Shotwell କେବଳ ଅପରିବର୍ତ୍ତନୀୟ ନଥିବା "
+"ସମୟରେ ପ୍ରବେଶାନୁମତି ପାଇବ। ଦୟାକରି ଅନ୍ୟ ଯେକୌଣସି ପ୍ରୟୋଗକୁ କ୍ୟାମେରା ବ୍ୟବହାର କରି ବନ୍ଦ କରିଥାଏ "
+"ଏବଂ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "କ୍ୟାମେରା ବ୍ୟବହାର କରି ଯେକୌଣସି ପ୍ରୟୋଗକୁ ବନ୍ଦ କରନ୍ତୁ।"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"କ୍ୟାମେରାରୁ ପ୍ରାକଦର୍ଶନକୁ ଆଣିବାରେ ଅସମର୍ଥ:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "ବିସ୍ଥାପିତ କରୁଅଛି..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ଫୋଟୋ ସୂଚନା ଆଣୁଅଛି"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s ପାଇଁ ଫୋଟୋ ସୂଚନା ଆଣୁଅଛି"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "କ୍ୟାମେରାକୁ ଅପରିବର୍ତ୍ତନୀୟ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ଏହି ଫୋଟୋକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+msgstr[1] "%d ଫୋଟୋଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ଏହି ଭିଡ଼ିଓକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+msgstr[1] "%d ଭିଡ଼ିଓଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ଏହି ଫୋଟୋ/ଭିଡ଼ିଓକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+msgstr[1] "%d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "ଏହି ଫାଇଲକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+msgstr[1] "%d ଫାଇଲଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବେ କି?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "ରଖନ୍ତୁ (_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ବାହାର କରୁଅଛି"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "ତ୍ରୁଟି ବଶତଃ %d ଫୋଟୋ/ଭିଡ଼ିଓକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବାରେ ଅସମର୍ଥ।"
+msgstr[1] "ତ୍ରୁଟି ବଶତଃ %d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ କ୍ୟାମେରାରୁ ଅପସାରଣ କରିବାରେ ଅସମର୍ଥ।"
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "ସ୍ଲାଇଡ ଦୃଶ୍ୟ (_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "ସ୍ଲାଇଡ ଦୃଶ୍ୟ ଚଲାନ୍ତୁ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓ ପଠାନ୍ତୁ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ପଠାନ୍ତୁ"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ଫୋଟୋକୁ ପଠାନ୍ତୁ"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ରତ୍ପାନୀ କରନ୍ତୁ"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ବୁଲାଉଅଛି"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "ଘୁରାଉ ନାହିଁ"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "ଭୂ-ସମାନ୍ତରାଳ ଭାବରେ ଓଲଟାଉଛି"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "ଭୂ-ସମାନ୍ତରାଳ ଭାବରେ ଓଲଟାଉ ନାହିଁ"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "ଭୂ-ଲମ୍ବ ଭାବରେ ଓଲଟାଉଛି"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "ଭୂ-ଲମ୍ବ ଭାବରେ ଓଲଟାଉ ନାହିଁ"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "ଯେକୌଣସି ପାଠ୍ୟ"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "ଶୀର୍ଷକ"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ଟ୍ୟାଗ"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ଘଟଣା ନାମ"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ଫାଇଲ ନାମ"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "ମିଡିଆ-ପ୍ରକାର"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ସୂଚକ ସ୍ଥିତି"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "ମାନ୍ୟତା"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "ତାରିଖ"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "ଧାରଣ କରିଥାଏ"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "ଏହି ପରି"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ସହିତ ଆରମ୍ଭ ହୋଇଥାଏ"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ସହିତ ଶେଷ ହୋଇଥାଏ"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ଧାରଣ କରିନଥାଏ"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ସେଟ କରାଯାଇନାହିଁ"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "ଅଟେ"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ଅଟେ ନାହିଁ"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "ଯେକୌଣସି ଫୋଟୋ"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ଏକ ଫୋଟୋ"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ଏକ ଭିଡ଼ିଓ"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ବିଶେଷ ଭାବରେ ସୂଚିତ"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ବିଶେଷ ଭାବରେ ଚିହ୍ନଟ ହୋଇ ନାହିଁ"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ଏବଂ ଉଚ୍ଚତର"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "କେବଳ"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ଏବଂ ନିମ୍ନତର"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "ପରେ ଅଟେ"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "ପୂର୍ବରୁ ଅଟେ"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ଏହା ମଧ୍ଯରେ"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ଏବଂ"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ଯେକୌଣସି"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "ସମସ୍ତ"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "କିଛି ନାହିଁ"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "ସଂରକ୍ଷିତ ସନ୍ଧାନଗୁଡ଼ିକ"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "ନୂତନ ସଂରକ୍ଷିତ ସନ୍ଧାନ (_w)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"ଆପଣଙ୍କର ଫୋଟୋ ଲାଇବ୍ରେରୀ Shotwell ର ଏହି ସଂସ୍କରଣ ସହିତ ସୁସଙ୍ଗତ ନୁହଁ। ଏହା Shotwell %s "
+"(ଯୋଜନା %d) ଦ୍ୱାରା ଦୃଶ୍ୟମାନ ହୋଇଥାଏ। ଏହି ସଂସ୍କରଣଟି ହେଉଛି %s (ଯୋଜନା %d)। ଦୟାକରି "
+"Shotwell ର ନୂତନତମ ସଂସ୍କରଣକୁ ବ୍ୟବହାର କରନ୍ତୁ।"
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell ଆପଣଙ୍କର ଫୋଟୋ ଲାଇବ୍ରେରୀକୁ ସଂସ୍କରଣ %s ରୁ ଉନ୍ନୟନ କରିବାରେ ଅସମର୍ଥ (ଯୋଜନା %d) ରୁ "
+"%s (ଯୋଜନା %d)କୁ। ଅଧିକ ସୂଚନା ପାଇଁ ଦୟାକରି Shotwell ୱିକିକୁ%s ରେ ଯାଞ୍ଚ କରନ୍ତୁ"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"ଆପଣଙ୍କର ଫୋଟୋ ଲାଇବ୍ରେରୀ Shotwell ର ଏହି ସଂସ୍କରଣ ସହିତ ସୁସଙ୍ଗତ ନୁହଁ। ଏହା Shotwell %s "
+"(ଯୋଜନା %d) ଦ୍ୱାରା ନିର୍ମିତ ହେବା ପରି ଦେଖାଯାଉଛି। ଏହି ସଂସ୍କରଣଟି ହେଉଛି %s (ଯୋଜନା %d)। "
+"ଦୟାକରି ଆପଣଙ୍କର %s କୁ ଅପସାରଣ କରି ଲାଇବ୍ରେରୀକୁ ସଫା କରନ୍ତୁ ଏବଂ ଆପଣଙ୍କର ଫୋଟୋଗୁଡ଼ିକୁ ପୁଣି ଭରଣ "
+"କରନ୍ତୁ।"
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell ର ତଥ୍ୟାଧାରକୁ ଯାଞ୍ଚ କରିବା ସମୟରେ ଅଜଣା ତ୍ରୁଟି: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell କୁ ଧାରଣ କରୁଅଛି"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell ର ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ଡିରେକ୍ଟୋରି"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "ପରିବର୍ତ୍ତନ ପାଇଁ ଚାଲୁଥିବା ସମୟରେ ଲାଇବ୍ରେରୀ ଡିରେକ୍ଟୋରୀକୁ ନିରୀକ୍ଷଣ କରନ୍ତୁ ନାହିଁ"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "ପ୍ରାରମ୍ଭିକ ଉନ୍ନତି ମିଟରକୁ ଦର୍ଶାନ୍ତୁ ନାହିଁ"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "ପ୍ରୟୋଗର ସଂସ୍କରଣକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "ଉପଲବ୍ଧ ପାଠ୍ଯ ନିର୍ଦ୍ଦେଶ ବିକଳ୍ପର ସମ୍ପୂର୍ଣ୍ଣ ତାଲିକା ପାଇଁ '%s --help' ଚଳାନ୍ତୁ.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "ଆଜି"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "ଗତକାଲି"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "ଶୀର୍ଷକ:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "ବସ୍ତୁଗୁଡ଼ିକ:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ଘଟଣା"
+msgstr[1] "%d ଘଟଣାଗୁଡ଼ିକ"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ଫୋଟୋ"
+msgstr[1] "%d ଫୋଟୋଗୁଡ଼ିକ"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d ଭିଡ଼ିଓ"
+msgstr[1] "%d ଭିଡ଼ିଓଗୁଡ଼ିକ"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "ତାରିଖ:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "ସମୟ:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "ଠାରୁ:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "କୁ:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "ଆକାର:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "ଅବଧି:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f ସେକଣ୍ଡ"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "ବିକାଶକାରୀ:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "ଅନାବୃତ୍ତ:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "ଅବସ୍ଥାନ:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ଫାଇଲର ଆକାର:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "ପ୍ରଚଳିତ ବିକାଶ:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "ପ୍ରକୃତ ଆକାର:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "କ୍ଯାମେରା ନିର୍ମାତା:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "କେମେରା ମୋଡେଲ:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ଫ୍ଲାସ:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr " ବିକରଣ ଲମ୍ବ:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "ଅନାବୃତ୍ତ ତାରିଖ:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "ଅନାବୃତ୍ତ ସମୟ:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "ଅନାବୃତ୍ତ ଭାବ:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS ଅକ୍ଷାଂଶ:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS ଦ୍ରାଘିମା:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "କଳାକାର:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "ସ୍ବତ୍ତ୍ବାଧୀକାର:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "ସଫ୍ଟୱେର:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "ମନ୍ତବ୍ଯ:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "ଅନୁଲମ୍ବିତ ସୂଚନା"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "ଏହା ଟ୍ୟାଗ \"%s\" କୁ ଏକ ଫୋଟୋରୁ ବାହାର କରିଦେବ। ଆଗକୁ ବଢ଼ିବେ କି?"
+msgstr[1] "ଏହା ଟ୍ୟାଗ \"%s\" କୁ %d ଫୋଟୋଗୁଡ଼ିକରୁ ବାହାର କରିଦେବ। ଆଗକୁ ବଢ଼ିବେ କି?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "ବାତିଲ କରନ୍ତୁ (_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "ଅପସାରଣ କରନ୍ତୁ (_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "ଏହା ସଂରକ୍ଷିତ ସନ୍ଧାନ \"%s\" କୁ ବାହାର କରିଦେବ। ଆଗକୁ ବଢ଼ିବେ କି?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"ବିକାଶକାରୀମାନଙ୍କୁ ବଦଳାଇବା ଦ୍ୱାରା ତାହା Shotwell ରେ ଏହି ଫୋଟୋରେ ଆପଣ କରିଥିବା ସମସ୍ତ "
+"ପରିବର୍ତ୍ତନଗୁଡ଼ିକର ପଦକ୍ଷେପ ବାତିଲ କରିଥାଏ"
+msgstr[1] ""
+"ବିକାଶକାରୀମାନଙ୍କୁ ବଦଳାଇବା ଦ୍ୱାରା ତାହା Shotwell ରେଆପଣ କରିଥିବା ଫୋଟୋଗୁଡ଼ିକର ସମସ୍ତ "
+"ପରିବର୍ତ୍ତନଗୁଡ଼ିକର ପଦକ୍ଷେପ ବାତିଲ କରିଥାଏ"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ବିକାଶକାରୀ ବଦଳାନ୍ତୁ (_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ଭିଡ଼ିଓ ରତ୍ପାନୀ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"ଏହି ଫୋଟୋକୁ ସମ୍ପାଦନ କରିବା ପାଇଁ Shotwell କୌଣସି ଫାଇଲ ନିର୍ମାଣ କରିନଥିଲା କାରଣ ଆପଣଙ୍କ ପାଖରେ%s "
+"ରେ ଲେଖିବା ପାଇଁ କୌଣସି ଅନୁମତି ନାହିଁ।"
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ଏକ ଫାଇଲ ତ୍ରୁଟି ହେତୁ ନିମ୍ନଲିଖିତ ଫୋଟୋକୁ ପଠାଇବାରେ ଅସମର୍ଥ ହୋଇଛି।\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"ଆପଣ ରପ୍ତାନୀ କ୍ରିୟା ଆଗକୁ ବଢାଇବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "ଆଗକୁ ବଢ଼ନ୍ତୁ (_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "ଅପରିବର୍ତ୍ତିତ"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "ପ୍ରଚଳିତ"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "ସଜ୍ଜିକରଣ ଶୈଳୀ (_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "ବିଶୋଷତା (_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "ପ୍ରତିବନ୍ଧକୁ ମାପୁଅଛି (_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " ପିକସେଲଗୁଡ଼ିକ (_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "ଅଧିତଥ୍ୟ ପଠାନ୍ତୁ"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "ବିସ୍ତୃତ ବିବରଣୀକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "ବିସ୍ତୃତ ବିବରଣୀକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ଏବଂ %d ଅଧିକ)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "ଫଳାଫଳ ବିବରଣୀକୁ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ଫାଇଲକୁ ଆମଦାନୀ କରିବାକୁ ଚେଷ୍ଟାକରୁଅଛି।"
+msgstr[1] "%d ଫାଇଲଗୁଡ଼ିକୁ ଆମଦାନୀ କରିବାକୁ ଚେଷ୍ଟାକରୁଅଛି।"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "ଏମାନଙ୍କ ମଧ୍ଯରୁ, %d ଫାଇଲକୁ ସଫଳତାର ସହିତ ଆମଦାନୀ କରାଯାଇଥିଲା।"
+msgstr[1] "ଏମାନଙ୍କ ମଧ୍ଯରୁ, %d ଫାଇଲଗୁଡ଼ିକୁ ସଫଳତାର ସହିତ ଆମଦାନୀ କରାଯାଇଥିଲା।"
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "ନକଲି ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "ନକଲି ସ୍ଥିତବାନ ମେଡିଆ ବସ୍ତୁ"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "ତୃଟି ସନ୍ଦେଶ:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "ଫାଇଲଗୁଡ଼ିକୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ କାରଣ ସେଗୁଡ଼ିକୁ ଫୋଟୋ କିମ୍ବା ଭିଡ଼ିଓ ଭାବରେ ଚିହ୍ନଟ ହୋଇନାହିଁ :"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ କାରଣ ସେଗୁଡ଼ିକ Shortwell ଚିହ୍ନିପାରିବା ଭଳି ସ୍ଥିତିରେ ନାହିଁ:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ କାରଣ Shortwell ସେଗୁଡ଼ିକୁ ଏହି ଲାଇବ୍ରେରୀ ମଧ୍ଯକୁ ନକଲ "
+"କରିପାରିଲା ନାହିଁ:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s କୁ \n"
+"\t %s ସ୍ଥାନକୁ ନକଲ କରିପାରିଲା ନାହିଁ"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଅନ୍ୟ କାରଣ ହେତୁ ଆମଦାନୀ କରାଯାଇ ନାହିଁ:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 ଟି ନକଲି ଫୋଟୋ ପଠାଯାଇ ନାହିଁ:\n"
+msgstr[1] "%d ଟି ନକଲି ଫୋଟୋ ପଠାଯାଇ ନାହିଁ:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 ଟି ନକଲି ଭିଡ଼ିଓ ପଠାଯାଇ ନାହିଁ:\n"
+msgstr[1] "%d ଟି ନକଲି ଭିଡ଼ିଓ ପଠାଯାଇ ନାହିଁ:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 ଟି ନକଲି ଫୋଟୋ/ଭିଡ଼ିଓ ପଠାଯାଇ ନାହିଁ:\n"
+msgstr[1] "%d ଟି ନକଲି ଫୋଟୋ/ଭିଡ଼ିଓ ପଠାଯାଇ ନାହିଁ:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ 1 ଫୋଟୋ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+msgstr[1] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ %d ଟି ଫୋଟୋ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ 1 ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+msgstr[1] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ %d ଟି ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ 1 ଫୋଟୋ/ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+msgstr[1] ""
+"ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ %d ଟି ଫୋଟୋ/ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ 1 ଫାଇଲ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+msgstr[1] "ଏକ ଫାଇଲ କିମ୍ବା ହାର୍ଡୱେର ତ୍ରୁଟି ହେତୁ %d ଟି ଫାଇଲ ଆମଦାନୀ ହେବାରେ ବିଫଳ ହୋଇଛି:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 ଫୋଟୋ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+msgstr[1] ""
+"%d ଫୋଟୋଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+msgstr[1] "%d ଭିଡ଼ିଓଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 ଫୋଟୋ/ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+msgstr[1] ""
+"%d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1ଫାଇଲ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+msgstr[1] ""
+"%d ଫାଇଲଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ କାରଣ ଫୋଟୋ ଲାଇବ୍ରେରୀ ଫୋଲଡରଟି ଲିଖନଯୋଗ୍ୟ ନୁହଁ:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ 1 ଫୋଟୋ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+msgstr[1] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ %d ଫୋଟୋଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ 1 ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+msgstr[1] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ %d ଭିଡ଼ିଓଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ 1 ଫୋଟୋ/ଭିଡ଼ିଓ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+msgstr[1] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ %d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ 1ଫାଇଲ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+msgstr[1] "କ୍ୟାମେରା ତ୍ରୁଟି ହେତୁ %d ଫାଇଲଗୁଡ଼ିକ ଆମଦାନୀ ହେବାରେ ବିଫଳ:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 ଅସମର୍ଥିତ ଫୋଟୋକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+msgstr[1] "%d ଅସମର୍ଥିତ ଫୋଟୋଗୁଡ଼ିକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 ପ୍ରତିଛବି ହୋଇନଥିବା ଫାଇଲକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି।\n"
+msgstr[1] "%d ପ୍ରତିଛବି ହୋଇନଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି।\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ଚାଳକ ବାତିଲ ହେତୁ1 ଫୋଟୋ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+msgstr[1] "ଚାଳକ ବାତିଲ ହେତୁ %d ଫୋଟୋଗୁଡ଼ିକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "ଚାଳକ ବାତିଲ ହେତୁ1 ଭିଡ଼ିଓ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+msgstr[1] "ଚାଳକ ବାତିଲ ହେତୁ %d ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "ଚାଳକ ବାତିଲ ହେତୁ1 ଫୋଟୋ/ଭିଡ଼ିଓ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+msgstr[1] "ଚାଳକ ବାତିଲ ହେତୁ %d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "ଚାଳକ ବାତିଲ ହେତୁ1 ଫାଇଲକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+msgstr[1] "ଚାଳକ ବାତିଲ ହେତୁ %d ଫାଇଲକୁ ଏଡ଼ାଇ ଦିଆଯାଇଛି:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 ଫୋଟୋ ସଫଳଭାବରେ ପଠାହେଲା।\n"
+msgstr[1] "%d ଫୋଟୋଗୁଡ଼ିକ ସଫଳଭାବରେ ପଠାହେଲା।\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 ଭିଡ଼ିଓ ସଫଳତାର ସହିତ ଆମଦାନୀ ହୋଇଛି।\n"
+msgstr[1] "%d ଭିଡ଼ିଓ ସଫଳତାର ସହିତ ଆମଦାନୀ ହୋଇଛି।\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 ଫୋଟୋ/ଭିଡ଼ିଓ ସଫଳତାର ସହିତ ଆମଦାନୀ ହୋଇଛି।\n"
+msgstr[1] "%d ଫୋଟୋ/ଭିଡ଼ିଓ ସଫଳତାର ସହିତ ଆମଦାନୀ ହୋଇଛି।\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "କୌଣସି ଫୋଟୋ କିମ୍ବା ଭିଡ଼ିଓ ଆମଦାନୀ ହୋଇ ନାହିଁ।\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "ଆମଦାନୀ ସମ୍ପୂର୍ଣ ହୋଇଛି"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d ସେକେଣ୍ଡ"
+msgstr[1] "%d ସେକେଣ୍ଡ"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d ମିନିଟ"
+msgstr[1] "%d ମିନିଟ"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ଘଣ୍ଟା"
+msgstr[1] "%d ଘଣ୍ଟା"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ଦିନ"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "ଘଟଣାର ନାମ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "ନାମ:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "ଶୀର୍ଷକକୁ ସମ୍ପାଦନ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ଆବର୍ଜନା ପାତ୍ର ଫାଇଲ (_T)"
+msgstr[1] "ଆବର୍ଜନା ପାତ୍ର ଫାଇଲଗୁଡ଼ିକ (_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "କେବଳ କାଢ଼ନ୍ତୁ ( _R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦନକୁ ଓଲଟାଇବେ କି?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦନଗୁଡ଼ିକୁ ଓଲଟାଇବେ କି?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "ଏହା ବାହ୍ୟ ଫାଇଲରେ ଆପଣ କରିଥିବା ସମସ୍ତ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ନଷ୍ଟ କରିଥାଏ। ଆଗକୁ ବଢ଼ିବେ କି?"
+msgstr[1] "%d ବାହ୍ୟ ଫାଇଲଗୁଡ଼ିକରେ ଆପଣ କରିଥିବା ସମସ୍ତ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ନଷ୍ଟ କରିଥାଏ। ଆଗକୁ ବଢ଼ିବେ କି?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦନକୁ ଓଲଟାନ୍ତୁ (_v)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦନଗୁଡ଼ିକୁ ଓଲଟାନ୍ତୁ (_v)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ଏହା ଲାଇବ୍ରେରୀରୁ ଫୋଟୋକୁ ବାହାର କରିଥାଏ। ଆଗକୁ ବଢ଼ିବେ କି?"
+msgstr[1] "ଏହା ଲାଇବ୍ରେରୀରୁ %d ଫୋଟୋଗୁଡ଼ିକୁ ବାହାର କରିଥାଏ। ଆଗକୁ ବଢ଼ିବେ କି?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "ଅପସାରଣ କରନ୍ତୁ (_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ଫୋଟୋକୁ ବାହାର କରନ୍ତୁ"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ଫୋଟୋଗୁଡ଼ିକୁ ବାହାର କରନ୍ତୁ"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ଘଣ୍ଟା"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ସମାନ ପରିମାଣରେ ଘୁଞ୍ଚାନ୍ତୁ (_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "ସମସ୍ତ ଫୋଟୋ ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଏହି ସମୟରେ ସେଟ କରନ୍ତୁ (_a)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "ପ୍ରକୃତ ଫୋଟୋ ଫାଇଲକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "ପ୍ରକୃତ ଫୋଟୋ ଫାଇଲଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "ପ୍ରକୃତ ଫାଇଲକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "ପ୍ରକୃତ ଫାଇଲଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "ମୂଳ: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ଅନାବୃତ ସମୟକୁ \n"
+"%d %s, %d %s, %d %s, ଏବଂ %d %s ଦ୍ୱାରା ଆଗକୁ କରାଯିବ।"
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ଅନାବୃତ ସମୟକୁ \n"
+"%d %s, %d %s, %d %s, ଏବଂ %d %s ଦ୍ୱାରା ପଛକୁ କରାଯିବ।"
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ଦିନ"
+msgstr[1] "ଦିନଗୁଡିକ"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ଘଣ୍ଟା"
+msgstr[1] "ଘଣ୍ଟା"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "ମିନିଟ"
+msgstr[1] "ମିନିଟ"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "ସେକେଣ୍ଡ"
+msgstr[1] "ସେକଣ୍ଡ"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"ଏବଂ %d ଅନ୍ୟାନ୍ୟ।"
+msgstr[1] ""
+"\n"
+"\n"
+"ଏବଂ %d ଅନ୍ୟାନ୍ୟ।"
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "ଟ୍ୟାଗଗୁଡ଼ିକ (କମାଗୁଡିକ ଦ୍ବାରା ପୃଥକ):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "ସ୍ୱାଗତମ!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell ରେ ଆପଣଙ୍କୁ ସ୍ୱାଗତ କରୁଅଛୁ!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "ଆରମ୍ଭ କରିବା ପାଇଁ, ଏହି ଉପାୟଗୁଡ଼ିକ ମଧ୍ଯରୁ ଗୋଟିଏରେ ଫୋଟୋଗୁଡ଼ିକୁ ଆମଦାନୀ କରନ୍ତୁ:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">ଫାଇଲ %s ଫୋଲଡରରୁ ଆମଦାନୀ କରନ୍ତୁ</span> କୁ ବାଛନ୍ତୁ"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Shotwell ୱିଣ୍ଡୋ ମଧ୍ଯକୁ ଫୋଟୋଗୁଡ଼ିକୁ ଆଣିକରି ପକାନ୍ତୁ"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "ଆପଣଙ୍କ କମ୍ପୁଟରରେ ଏକ କ୍ୟାମେରା ସଂଯୋଗ କରନ୍ତୁ ଏବଂ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "ଆପଣଙ୍କ %s ଫୋଲଡରରୁ ଫୋଟୋଗୁଡ଼ିକୁ ଆଣନ୍ତୁ (_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "ଆପଣ ଏହି ଉପାୟଗୁଡ଼ିକ ମଧ୍ଯରୁ ଯୋକୌଣସି ଉପାୟରେ ଫୋଟୋଗୁଡ଼ିକୁ ଆଣିପାରିବେ:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ଏହି ସନ୍ଦେଶକୁ ପୁଣିଥରେ ଦର୍ଶାନ୍ତୁ ନାହିଁ (_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "ଆପଣଙ୍କ %s ଲାଇବ୍ରେରୀରୁ ଫୋଟୋଗୁଡ଼ିକୁ ଆଣନ୍ତୁ"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(ସହାୟତା)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "ବର୍ଷ%sମାସ%sଦିନ"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "ବର୍ଷ%sମାସ"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "ବର୍ଷ%sମାସ-ଦିନ"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "ବର୍ଷ-ମାସ-ଦିନ"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "ଇଚ୍ଛାରୂପଣ"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "ଅବୈଧ ବାକ୍ୟଖଣ୍ଡ"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell ଆପଣଙ୍କର ଲାଇବ୍ରେରୀ ଫୋଲଡର ମଧ୍ଯରେ ଫୋଟୋଗୁଡ଼ିକୁ ନକଲ କରିପାରେ ଅଥବା ଏହା ସେଗୁଡ଼ିକୁ ନକଲ "
+"ନକରି ଆମଦାନୀ କରିପାରିବ।"
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ନକଲ କରନ୍ତୁ (_p)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "ଆମଦାନୀ ଚାଲିଛି (_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "ଲାଇବ୍ରେରୀ ମଧ୍ଯକୁ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ବାହାର କରନ୍ତୁ"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "ଫୋଟୋକୁ ଲାଇବ୍ରେରୀରୁ ବାହାର କରୁଅଛି"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ଫୋଟୋଗୁଡ଼ିକୁ କାଢୁଅଛି"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ ଫୋଟୋ/ଭିଡ଼ିଓକୁ ବାହାର କରିଦେବ। ତଥାପି ଆପଣ ଡେସ୍କଟପ ଆବର୍ଜନା "
+"ପାତ୍ରକୁ ଫାଇଲକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିହେବ ନାହିଁ।"
+msgstr[1] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ %d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ବାହାର କରିଦେବ। ତଥାପି ଆପଣ ଡେସ୍କଟପ "
+"ଆବର୍ଜନା ପାତ୍ରକୁ ଫାଇଲକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିହେବ ନାହିଁ।"
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ ଭିଡ଼ିଓକୁ ବାହାର କରିଦେବ। ଆପଣ ସେହି ଫାଇଲକୁ ଡେସ୍କଟପ ଆବର୍ଜନା "
+"ପାତ୍ରକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିପାରିବେ ନାହିଁ।"
+msgstr[1] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ %d ଭିଡ଼ିଓକୁ ବାହାର କରିଦେବ। ଆପଣ ସେହି ଫାଇଲକୁ ଡେସ୍କଟପ "
+"ଆବର୍ଜନା ପାତ୍ରକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିପାରିବେ ନାହିଁ।"
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ ଫୋଟୋକୁ ବାହାର କରିଦେବ। ଆପଣ ସେହି ଫାଇଲକୁ ଡେସ୍କଟପ "
+"ଆବର୍ଜନା ପାତ୍ରକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିପାରିବେ ନାହିଁ।"
+msgstr[1] ""
+"ଏହା ଆପଣଙ୍କର Shotwell ଲାଇବ୍ରେରୀରୁ %d ଫୋଟୋକୁ ବାହାର କରିଦେବ। ଆପଣ ସେହି ଫାଇଲକୁ ଡେସ୍କଟପ "
+"ଆବର୍ଜନା ପାତ୍ରକୁ ଘୁଞ୍ଚାଇବାକୁ ଚାହୁଁଛନ୍ତି କି?\n"
+"\n"
+"ଏହି କାର୍ଯ୍ୟକୁ ବାତିଲ କରିପାରିବେ ନାହିଁ।"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ଫୋଟୋ କିମ୍ବା ଭିଡ଼ିଓକୁ ଆପଣଙ୍କ ଡେସ୍କଟପ ଆବର୍ଜନା ପାତ୍ରକୁ ପଠାଯାଇପାରିବ ନାହିଁ। ଏହି ଫାଇଲକୁ ଅପସାରଣ "
+"କରିବେ କି?"
+msgstr[1] ""
+"%d ଫୋଟୋ କିମ୍ବା ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଡେସ୍କଟପ ଆବର୍ଜନା ପାତ୍ରକୁ ପଠାଯାଇପାରିବ ନାହିଁ। ଏହି ଫାଇଲଗୁଡ଼ିକୁ "
+"ଅପସାରଣ କରିବେ କି?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ଫୋଟୋ କିମ୍ବା ଭିଡ଼ିଓକୁ ଅପସାରଣ କରିପାରିବେ ନାହିଁ।"
+msgstr[1] "%d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଅପସାରଣ କରିପାରିବେ ନାହିଁ।"
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "ଫୋଲଡରଗୁଡିକ"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ଟ୍ଯାଗଗୁଡ଼ିକ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "ସଫଳତା"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ଫାଇଲ ତ୍ରୁଟି"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ଫାଇଲକୁ ଖୋଲିବାରେ ଅସମର୍ଥ"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ତଥ୍ଯାଧାର ତୃଟି"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ଚାଳକ ଆମଦାନୀ କ୍ରିୟାକୁ ପରିତ୍ୟାଗ କରିଛି"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ଏହା ଗୋଟିଏ ଫାଇଲ ନୁହଁ"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ଫାଇଲ ପୂର୍ବରୁ ତଥ୍ୟାଧାରରେ ଅବସ୍ଥିତ ଅଛି"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "ଅସମର୍ଥିତ ଫାଇଲ ସଜ୍ଜିକରଣ ଶୈଳୀ"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ଏକ ପ୍ରତିଛବି ଫାଇଲ ନୁହଁ"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ଡିସ୍କ ବିଫଳତା"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ଡିକ୍ସ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "କ୍ଯାମେରା ତ୍ରୁଟି"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ଫାଇଲ ଲେଖିବା ତୃଟି"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "ଆମଦାନି ବିଫଳ ହୋଇଛି (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "ପରିବର୍ତ୍ତିତ"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "ପୂର୍ବ ଫୋଟୋ"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "ପରବର୍ତ୍ତୀ ଫୋଟୋ"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ଫୋଟୋ ଉତ୍ସ ଫାଇଲ ଅନୁପସ୍ଥିତ: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "ଦୃଶ୍ଯ (_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "ସାଧନଗୁଡ଼ିକ ( _o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "ପୂର୍ବ ଫୋଟୋ (_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "ପୂର୍ବ ଫୋଟୋ"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "ପରବର୍ତ୍ତୀ ଫୋଟୋ (_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "ପରବର୍ତ୍ତୀ ଫୋଟୋ"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "ବଡ଼ କରନ୍ତୁ (_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ଫୋଟୋର ଆକାରବୃଦ୍ଧିକୁ ବଡ଼ କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "ସାନ କରନ୍ତୁ (_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ଫୋଟୋର ଆକାରବୃଦ୍ଧିକୁ କମ କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "ପୃଷ୍ଠା ସହିତ ସେଟ କରନ୍ତୁ (_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "ସମ୍ପୂର୍ଣ୍ଣ ପରଦାରେ ଦର୍ଶାଇବା ପାଇଁ ଫୋଟୋକୁ ବଡ଼ କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "100% କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ଫୋଟୋକୁ 100% ବଡ଼ କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "200% ବଡ଼ କରନ୍ତୁ (_2)"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ଫୋଟୋକୁ 200% ବଡ଼ କରନ୍ତୁ"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ବିକାଶକାରୀ (_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s କୁ ପଠାଇବାରେ ଅସମର୍ଥ: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ତଥ୍ୟାଧାର"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s ରୁ ଆମଦାନୀ କରିବା ଫଳରେ ତାହାକୁ ଆଗକୁ ନେଇପାରିବେ ନାହିଁ କାରଣ ଏକ ତ୍ରୁଟି ଘଟିଛି:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"ଅନ୍ୟ ଏକ ସର୍ଭିସରୁ ଆମଦାନୀ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବା ସମୟରେ, ଉପର ଲିଖିତ ତାଲିକାରୁ ଗୋଟିଏକୁ ବାଛନ୍ତୁ।"
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "ତଥ୍ୟ ଆମଦାନୀଗୁଡ଼ିକ"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"ଆପଣଙ୍କ ପାଖରେ କୌଣସି ତଥ୍ୟ ଆମଦାନୀ ପ୍ଲଗଇନ ସକ୍ରିୟ ନାହିଁ।\n"
+"\n"
+"ପ୍ରୟୋଗରୁ ଆମଦାନୀ କରନ୍ତୁ କାର୍ଯ୍ୟକୁ ବ୍ୟବହାର କରିବା ପାଇଁ, ଆପଣଙ୍କୁ ଅତିକମରେ ଗୋଟିଏ ତଥ୍ୟ ଆମଦାନୀ "
+"ପ୍ଲଗଇନ ସକ୍ରିୟ କରିବାକୁ ହେବ। ପ୍ଲଗଇନଗୁଡ଼ିକୁ ପସନ୍ଦ ସଂଳାପରେ ସକ୍ରିୟ କରିପାରିବେ।"
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ତଥ୍ଯାଧାର ଫାଇଲ:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "ଆମଦାନୀ କରନ୍ତୁ (_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "ପ୍ରୟୋଗରୁ ଆମଦାନୀ କରନ୍ତୁ"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "ମେଡିଆକୁ ଏଥିରୁ ଆମଦାନୀ କରନ୍ତୁ (_f):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "ବନ୍ଦ କରନ୍ତୁ (_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "ସଂରଚନା"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "ସ୍ଲାଇଡ଼ ଦୃଶ୍ୟ"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "ପଛକୁ"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "ପୂର୍ବ ଫୋଟୋକୁ ଯାଆନ୍ତୁ"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "ବିରାମ"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "ସ୍ଲାଇଡ ଦୃଶ୍ଯକୁ କିଛି ସମୟ ପାଇଁ ବନ୍ଦ କରନ୍ତୁ"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "ପରବର୍ତ୍ତୀ"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "ପରବର୍ତ୍ତୀ ଫୋଟୋକୁ ଯାଆନ୍ତୁ"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "ସ୍ଲାଇଡ ଦୃଶ୍ୟ ସେଟିଙ୍ଗଗୁଡିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ସମସ୍ତ ଫୋଟୋ ଉତ୍ସ ଫାଇଲଗୁଡ଼ିକୁ ଅନୁପସ୍ଥିତ ଅଛି।"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "ଚଲାନ୍ତୁ"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "ସ୍ଲାଇଡ ଦୃଶ୍ୟକୁ ଆଗକୁ ବଢ଼ାନ୍ତୁ"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "ପ୍ରତ୍ୟାବୃତ କରାଯାଉଛି"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "ପ୍ରତ୍ୟାବୃତ ପଦକ୍ଷେପକୁ ବାତିଲ କରୁଅଛି"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "ଉନ୍ନତତର କରୁଅଛି"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "ଉନ୍ନତତର କ୍ରିୟାକୁ ବାତିଲ କରୁଛି"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "ନୂତନ ଘଟଣା ସୃଷ୍ଟି କରୁଅଛି"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ଘଟଣାକୁ ବାହାର କରୁଛି"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ନୂତନ ଘଟଣାକୁ ଘୁଞ୍ଚାଯାଉଛି"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ପୂର୍ବ ଘଟଣାରେ ସେଟ କରାଯାଉଛି"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "ମିଶ୍ରଣ କରୁଛି"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "ମିଶ୍ରଣରୁ ବିଚ୍ଛେଦ କରୁଅଛି"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକର ନକଲ କରାଯାଉଛି"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "ନକଲି ଫୋଟୋଗୁଡ଼ିକୁ ବାହାର କରୁଅଛି"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ଫାଇଲ ତ୍ରୁଟି ହେତୁ ଏକ ଫୋଟୋକୁ ନକଲ କରିବାରେ ଅସମର୍ଥ"
+msgstr[1] "ଫାଇଲ ତ୍ରୁଟିଗୁଡ଼ିକ ହେତୁ %d ଫୋଟୋଗୁଡ଼ିକୁ ନକଲ କରିବାରେ ଅସମର୍ଥ"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "ପୂର୍ବବର୍ତ୍ତୀ ମାନ୍ୟତାକୁ ପୁନଃସ୍ଥାପନ କରୁଅଛି"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "ମାନ୍ୟତାଗୁଡ଼ିକୁ ବଢ଼ାଉଛି"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "ମାନ୍ୟତାଗୁଡ଼ିକୁ କମ କରୁଅଛି"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW ବିକାଶକାରୀକୁ ସେଟ କରୁଅଛି"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "ପୂର୍ବ RAW ବିକାଶକାରୀକୁ ପୁନଃସ୍ଥାପନ କରୁଅଛି"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "ବିକାଶକାରୀକୁ ସେଟ କରନ୍ତୁ"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "ପ୍ରକୃତ ଫୋଟୋକୁ ସଜାଡ଼ି ହେଲା ନାହିଁ।"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "ତାରିଖ ଏବଂ ସମୟକୁ ସଜାଡ଼ୁଛି"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "ତାରିଖ ଏବଂ ସମୟକୁ ସଜଡ଼ାକୁ ବାତିଲ କରୁଅଛି"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ଗୋଟିଏ ପ୍ରକୃତ ଫୋଟୋକୁ ସଜାଡ଼ି ହେଲା ନାହିଁ।"
+msgstr[1] "ନିମ୍ନଲିଖିତ ପ୍ରକୃତ ଫୋଟୋଗୁଡ଼ିକୁ ସଜାଡ଼ି ହେଲା ନାହିଁ।"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "ସମୟ ସଜଡ଼ା ତ୍ରୁଟି"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "ନିମ୍ନଲିଖିତ ଫୋଟୋ ଫାଇଲରେ ସମୟ ସଜଡ଼ାକୁ ବାତିଲ କରିହେଲା ନାହିଁ।"
+msgstr[1] "ନିମ୍ନଲିଖିତ ଫୋଟୋ ଫାଇଲଗୁଡ଼ିକରେ ସମୟ ସଜଡ଼ାକୁ ବାତିଲ କରିହେଲା ନାହିଁ।"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ଟ୍ୟାଗ ନିର୍ମାଣ କରନ୍ତୁ"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" କୁ ଘୁଞ୍ଚାନ୍ତୁ"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଆବର୍ଜନା ପାତ୍ରକୁ ପଠାନ୍ତୁ"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ଆବର୍ଜନା ପାତ୍ରରୁ ଫୋଟୋଗୁଡ଼ିକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ Shotwell ର ଆବର୍ଜନା ପାତ୍ରକୁ ପଠାନ୍ତୁ"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ Shotwell ଲାଇବ୍ରେରୀ ମଧ୍ଯରେ ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଆବର୍ଜନା ପାତ୍ରକୁ ଫଠାଉଛି"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଆବର୍ଜନା ପାତ୍ରରୁ ସଂରକ୍ଷଣ କରୁଅଛି"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକରେ ସୂଚକ ଲଗାନ୍ତୁ"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକରେ ସୂଚକୁ ହଟାନ୍ତୁ"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "ସୂଚକ"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "ସୂଚକ ହୀନ କରନ୍ତୁ"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "ନିମ୍ନ୍ (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "ମଧ୍ଯମ (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "ଉଚ୍ଚ (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "ସର୍ବାଧିକ (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "କୌଣସି ଫୋଟୋ/ଭିଡ଼ିଓ ନାହିଁ"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "କୌଣସି ଫୋଟୋ/ଭିଡ଼ିଓ ମିଳିଲା ନାହିଁ"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଏହି ଡିରେକ୍ଟୋରୀକୁ ରପ୍ତାନୀ କରିପାରିବେ ନାହିଁ।"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "ଅଦ୍ୟତନଗୁଡ଼ିକୁ ନିରୀକ୍ଷଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "ସମଗ୍ର ପୃଷ୍ଠାକୁ ପୁରଣ କରନ୍ତୁ"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 2 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 4 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 6 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 8 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 16 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ପ୍ରତି ପୃଷ୍ଠାରେ 32 ଟି ପ୍ରତିଛବି"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "ଇଞ୍ଚ"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "ସେଣ୍ଟିମିଟର"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "ୱାଲେଟ (2 x 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "ନୋଟକାର୍ଡ (3 x 5 ଇଞ୍ଚ)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 ଇଞ୍ଚ"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 ଇଞ୍ଚ"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 ଇଞ୍ଚ"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 ଇଞ୍ଚ"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 ଇଞ୍ଚ"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "ମେଟ୍ରିକ ୱାଲେଟ (9 x 13 ସେମି)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "ପୋଷ୍ଟକାର୍ଡ (10 x 15 ସେମି)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 ସେମି"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 ସେମି"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 ସେମି"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 ସେମି"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 ସେମି"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ପ୍ରତିଛବି ବିନ୍ୟାସ"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "ମୁଦ୍ରଣ କରୁଅଛି ..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ଫୋଟୋକୁ ମୁଦ୍ରଣ କରିବାରେ ଅସମର୍ଥ:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ଫୋଟୋ ତଥ୍ୟାଧାର %s ଖୋଲିବା/ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: ତ୍ରୁଟି ସଂକେତ %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ଫୋଟୋ ତଥ୍ୟାଧାର ଫାଇଲରେ ଲେଖିବାରେ ଅସମର୍ଥ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ତଥ୍ୟାଧାର ଫାଇଲକୁ ଅଭିଗମ୍ୟ କରିବାରେ ତ୍ରୁଟି:\n"
+" %s\n"
+"\n"
+"ତ୍ରୁଟି ହେଉଛି: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "ଭିଡ଼ଓଗୁଡ଼ିକୁ ପଠାନ୍ତୁ"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "ନଟିଲୋସ ଏଠାକୁ ପଠାନ୍ତୁକୁ ଆରମ୍ଭ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "ଏଠାକୁ ପଠାନ୍ତୁ"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "ପୃଷ୍ଠଭୂମିକୁ %s କୁ ପଠାଇବାରେ ଅସମର୍ଥ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ଡେସ୍କଟପ ସ୍ଲାଇଟ ପ୍ରଦର୍ଶନ ପ୍ରସ୍ତୁତ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "ବିଶେଷ ଭାବରେ ସୂଚିତ"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ଆବର୍ଜନା ପାତ୍ର"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ଆବର୍ଜନା ପାତ୍ରଟି ଖାଲି ଅଛି"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଅପସାରଣ କରୁଅଛି"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "ଅନୁପସ୍ଥିତ ଫାଇଲଗୁଡ଼ିକ"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "ଅପସାରଣ କରୁଅଛି..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "ଶେଷ ଆମଦାନୀ"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "ଫୋଲଡରରୁ ଆମଦାନୀ କରନ୍ତୁ (_I)..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ଡିସ୍କରୁ ଲାଇବ୍ରେରୀକୁ ଫୋଟୋଗୁଡ଼ିକୁ ଆଣନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "ପ୍ରୟୋଗରୁ ଆଣନ୍ତୁ (_A)..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "ଘଟଣାଗୁଡ଼ିକୁ ସଜାଅ (_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ଆବର୍ଜନା ପାତ୍ରକୁ ଖାଲି କରନ୍ତୁ (_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "ଆବର୍ଜନା ପାତ୍ରରେ ଥିବା ଫୋଟୋଗୁଡ଼ିକୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ଫୋଟୋ ପାଇଁ ଘଟଣାକୁ ଦେଖନ୍ତୁ (_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "ଖୋଜନ୍ତୁ (_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "ସନ୍ଧାନ ଲକ୍ଷଣ ଅନୁସାରେ ଫୋଟୋ ଏବଂ ଭିଡ଼ିଓଗୁଡ଼ିକୁ ଖୋଜନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ଫାଇଲ (_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "ସମ୍ପାଦନ କରନ୍ତୁ (_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "ଫଟୋ (_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ଫଟୋଗୁଡ଼ିକ (_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ଘଟଣାଗୁଡ଼ିକ ( _t)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ଟ୍ୟାଗଗୁଡ଼ିକ (_g)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "ସହାୟତା (_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "ମୌଳିକ ସୂଚନା (_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "ଚୟନ ପାଇଁ ମୌଳିକ ସୂଚନା ଦର୍ଶାନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "ବିସୃତ ସୂଚନା (_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "ଚୟନ ପାଇଁ ବିସୃତ ସୂଚନା ଦର୍ଶାନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "ସନ୍ଧାନ ପଟି (_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "ସନ୍ଧାନ ପଟି ଦର୍ଶାନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "ପାର୍ଶ୍ୱପଟି (_i)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "ପାର୍ଶ୍ୱପଟି ଦର୍ଶାନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "ସାନରୁ ବଡ କ୍ରମରେ ସଜାଡନ୍ତୁ (_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ସାନରୁ ବଡ କ୍ରମରେ ସଜାଡନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "ବଡ଼ରୁ ସାନ କ୍ରମରେ ସଜାଡନ୍ତୁ (_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ବଡ଼ରୁ ସାନ କ୍ରମରେ ସଜାଡନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ଫୋଲଡରରୁ ଆଣନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ଆବର୍ଜନା ପାତ୍ରକୁ ଖାଲି କରନ୍ତୁ"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "ଆବର୍ଜନା ପାତ୍ରକୁ ଖାଲି କରୁଅଛି..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell କୁ ଆପଣଙ୍କ ମୂଖ୍ୟ ଡିରେକ୍ଟୋରୀକୁ ଫୋଟୋଗୁଡ଼ିକୁ ପଠାଇବା ପାଇଁ ଆମଦାନୀ କରାଯାଇଥାଏ।\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "ଲାଇବ୍ରେରୀ ଅବସ୍ଥାନ"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଏହି ଡିରେକ୍ଟୋରୀରୁ ଆମଦାନୀ କରାଯାଇପାରିବ ନାହିଁ।"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "ଲାଇବ୍ରେରୀକୁ ଅଦ୍ୟତନ କରୁଅଛି ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ସ୍ୱୟଂ-ଆମଦାନୀ କରିବାକୁ ପ୍ରସ୍ତୁତ କରୁଅଛି ..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ସ୍ୱୟଂ-ଆମଦାନୀ କରୁଅଛି ..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "ଫାଇଲଗୁଡ଼ିକରେ ଅଧିତଥ୍ୟ ଲେଖୁଅଛି ..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ଲାଇବ୍ରେରୀ"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "ଆମଦାନୀ କରୁଅଛି..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ଆମଦାନୀ ବନ୍ଦ କରନ୍ତୁ (_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଆମଦାନୀ କରିବା ବନ୍ଦ କରନ୍ତୁ"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "ଆମଦାନୀ କରିବାକୁ ପ୍ରସ୍ତୁତ କରୁଅଛି ..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "ଆମଦାନୀ କରାଯାଇଥିବା %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "ସଂରକ୍ଷଣ କରନ୍ତୁ (_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ଫୋଟୋକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "ଏହିପରି ସଂରକ୍ଷଣ କରନ୍ତୁ (_A)..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ଫୋଟୋକୁ ଭିନ୍ନ ଏକ ନାମରେ ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "ଆପଣଙ୍କ କମ୍ପୁଟର ସହିତ ସଂଯୁକ୍ତ ମୁଦ୍ରଣୀରେ ଫୋଟୋକୁ ମୁଦ୍ରଣ କରନ୍ତୁ"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ଅବସ୍ଥିତ ନଥାଏ।"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ଟି ଏକ ଫାଇଲ ନୁହଁ।"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ଫାଇଲ ଶୈଳୀକୁ %s \n"
+"ସଜାଡ଼ି ନଥାଏ"
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "ଗୋଟିଏ ନକଲକୁ ସଂରକ୍ଷଣ କରନ୍ତୁ (_S) "
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ %s ରେ ହଜାଇଛି?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "ସଂରକ୍ଷଣ କରିବା ବିନା ବନ୍ଦ କରନ୍ତୁ (_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s ରେ ସଂରକ୍ଷଣ କରିବା ସମୟରେ ତ୍ରୁଟି: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "ଏହିପରି ସଂରକ୍ଷଣ କରନ୍ତୁ"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s କୁ ନିରୀକ୍ଷଣ କରିବାରେ ଅସମର୍ଥ: ଏକ ଡିରେକ୍ଟୋରୀ ନୁହଁ (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ଫୋଟୋ ପରିଚାଳକ"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ଫୋଟୋ ପ୍ରଦର୍ଶିକା"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "ଡାହାଣକୁ ଘୂରାନ୍ତୁ (_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "ଘୂରାଇବା"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "ଡ଼ାହାଣକୁ ଘୁରାନ୍ତୁ"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଡ଼ାହାଣକୁ ଘୁରାନ୍ତୁ (ବାମକୁ ବୁଲାଇବା ପାଇଁ Ctrl ଦବାନ୍ତୁ)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "ବାମକୁ ଘୂରାନ୍ତୁ (_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "ବାମକୁ ଘୂରାନ୍ତୁ"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ବାମକୁ ଘୂରାନ୍ତୁ"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "ଭୂ-ସମାନ୍ତରାଳ ଭାବରେ ପଲଟାନ୍ତୁ (_z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "ଭୂ-ସମାନ୍ତରାଳ ଭାବରେ ପଲଟାନ୍ତୁ"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "ଭୂ-ଲମ୍ବ ଭାବରେ ପଲଟାନ୍ତୁ (_c)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "ଭୂ-ଲମ୍ବ ଭାବରେ ପଲଟାନ୍ତୁ"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "ଉନ୍ନତତର କରନ୍ତୁ (_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "ଉନ୍ନତତର କରନ୍ତୁ"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "ଫୋଟୋ ଦୃଶ୍ୟକୁ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଉନ୍ନତତର କରନ୍ତୁ"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "କାଟିକରି ଛୋଟ କରନ୍ତୁ (_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "କାଟିକରି ଛୋଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ଫୋଟୋର ଆକାରକୁ କାଟିକରି ଛୋଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "ସିଧା କରନ୍ତୁ (_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "ସିଧା କରନ୍ତୁ"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "ଫୋଟୋକୁ ସିଧା କରନ୍ତୁ"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "ଲାଲି ଆଖି (_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "ଲାଲି ଆଖି"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ଲାଲି ଆଖି ପ୍ରଭାବକୁ ଫୋଟୋରୁ କମ କରନ୍ତୁ କିମ୍ବା ଲିଭାଇ ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "ସଜାଡ଼ନ୍ତୁ (_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "ସଜାଡ଼ନ୍ତୁ"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ଫୋଟୋର ରଙ୍ଗ ଏବଂ ଗାଢ଼ତାକୁ ସଜାଡ଼ନ୍ତୁ"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "ପ୍ରକୃତ ରୂପକୁ ପ୍ରତ୍ଯାବ୍ରୁତ କରନ୍ତୁ (_v)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "ପ୍ରକୃତ ରୂପକୁ ପ୍ରତ୍ଯାବ୍ରୁତ କରନ୍ତୁ"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦନଗୁଡ଼ିକୁ ପ୍ରତ୍ଯାବ୍ରୁତ କରନ୍ତୁ (_d)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "ମୂଖ୍ୟ ଫୋଟୋକୁ ପ୍ରତ୍ୟାବୃତ କରନ୍ତୁ"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ଡେସ୍କଟପ ପୃଷ୍ଠଭୂମି ରୂପେ ସେଟକରନ୍ତୁ (_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "ବଚ୍ଛିତ ପ୍ରତିବିମ୍ବକୁ ନୂତନ ଡେସ୍କଟପ ପୃଷ୍ଠଭୂମୀ ଭାବରେ ସେଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "ଡେସ୍କଟପ ସ୍ଲାଇଡ ଦୃଶ୍ୟ ରୂପେ ସେଟକରନ୍ତୁ (_D)..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "ପଦକ୍ଷେପ ବାତିଲ କରନ୍ତୁ (_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "ପଦକ୍ଷେପ ବାତିଲ କରନ୍ତୁ"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "ପୁଣି କରନ୍ତୁ (_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "ପୁନଃକର"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "ଘଟଣାର ନାମ ବଦଳାନ୍ତୁ ‍‌(_n)..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "ଘଟଣା ପାଇଁ ମୂଖ୍ୟ ଫୋଟୋ ପ୍ରସ୍ତୁତ କରନ୍ତୁ (_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "ଘଟଣା ପାଇଁ ମୂଖ୍ୟ ଫୋଟୋ ପ୍ରସ୍ତୁତ କରନ୍ତୁ"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "ନୂତନ ଘଟଣା (_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "ନୂଆ ଘଟଣା"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଘୁଞ୍ଚାନ୍ତୁ"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଏକ ଘଟଣାକୁ ଘୁଞ୍ଚାନ୍ତୁ"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ଘଟଣାଗୁଡିକୁ ମିଶାନ୍ତୁ (_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "ମିଶ୍ରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "ସମସ୍ତ ଘଟଣାଗୁଡ଼ିକୁ ଏକ ଘଟଣା ମଧ୍ଯରେ ଏକତ୍ରିତ କରନ୍ତୁ"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "ମାନ୍ୟତା ସେଟ କରନ୍ତୁ (_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "ମାନ୍ୟତା ସେଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "ଆପଣଙ୍କର ଫୋଟୋର ମାନ୍ୟତାକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "ବଢ଼ାନ୍ତୁ (_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "ମାନ୍ୟତା ବଢ଼ାନ୍ତୁ"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "କମକରନ୍ତୁ (_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "ମାନ୍ୟତା କମ କରନ୍ତୁ"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "ମାନ୍ୟତା ହୀନ (_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "ମାନ୍ୟତା ହୀନ"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "ମାନ୍ୟତା ହୀନକୁ ମାନ୍ୟତା ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "ଏକ ମାନ୍ୟତା ହୀନ ଭାବରେ ସେଟ କରୁଅଛି"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "ସମସ୍ତ ମାନ୍ୟତାକୁ ବାହାର କରନ୍ତୁ"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "ଅସ୍ବୀକୃତ (_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "ଅସ୍ବୀକୃତ"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "ଅସ୍ବୀକୃତକୁ ମାନ୍ୟତା ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr " ଅସ୍ବୀକୃତ ଭାବରେ ସେଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "ଅସ୍ବୀକୃତ ପାଇଁ ମାନ୍ୟତା ସେଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "କେବଳ ଅସ୍ବୀକୃତ (_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "କେବଳ ଅସ୍ବୀକୃତ"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "କେବଳ ଅସ୍ବୀକୃତ ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "ସମସ୍ତ + ଅସ୍ବୀକୃତ (_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "ଅସ୍ବୀକୃତ ଫୋଟୋଗୁଡ଼ିକ ସହିତ ସମସ୍ତ ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "ସମସ୍ତ ଫୋଟୋଗୁଡ଼ିକ (_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "ସମସ୍ତ ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "ମାନ୍ୟତା (_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "ପ୍ରତ୍ୟେକ ଫୋଟୋର ମାନ୍ୟତା ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଛାଣନ୍ତୁ (_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଛାଣନ୍ତୁ"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "ଛାଣକ ଉପରେ ଆଧାର କରି ଦର୍ଶାଯାଇଥିବା ଫୋଟୋଗୁଡ଼ିକୁ ସୀମିତ କରନ୍ତୁ"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "ନକଲି (_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "ନକଲି"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ଏହି ଫୋଟୋର ଏକ ନକଲ କରନ୍ତୁ"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "ରପ୍ତାନି କରନ୍ତୁ (_E)..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "ମୂଦ୍ରଣ କରନ୍ତୁ (_P) ..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "ପ୍ରକାଶନ କରନ୍ତୁ (_b)..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "ପ୍ରକାଶନ କରନ୍ତୁ"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "ବିଭିନ୍ନ ୱେବସାଇଟରେ ପ୍ରକାଶନ କରନ୍ତୁ"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "ଶୀର୍ଷକକୁ ସମ୍ପାଦନ କରନ୍ତୁ (_T)..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "ମନ୍ତବ୍ଯକୁ ସମ୍ପାଦନ କରନ୍ତୁ (_C)"
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "ମନ୍ତବ୍ଯ ସଂପାଦନ କରନ୍ତୁ"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "ତାରିଖ ଏବଂ ସମୟକୁ ମେଳାନ୍ତୁ (_A)..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "ତାରିଖ ଏବଂ ସମୟକୁ ମେଳାନ୍ତୁ"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "ଟ୍ୟାଗଗୁଡ଼ିକୁ ଯୋଗକରନ୍ତୁ (~T)..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "ଟ୍ୟାଗଗୁଡ଼ିକୁ ଯୋଗ କରନ୍ତୁ (_A)..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "ଟ୍ୟାଗଗୁଡ଼ିକୁ ଯୋଗକରନ୍ତୁ"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "ପସନ୍ଦ (_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦକ ସହିତ ଖୋଲନ୍ତୁ (_x)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW ସମ୍ପାଦକ ସହିତ ଖୋଲନ୍ତୁ (_W)"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "ଏଠାକୁ ପଠାନ୍ତୁ (~T)..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "ଏଠାକୁ ପଠାନ୍ତୁ (_o)..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "ଖୋଜନ୍ତୁ (_F)..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "ଖୋଜନ୍ତୁ"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "ଏହାର ନାମ ଅଥବା ଟ୍ୟାଗଗୁଡ଼ିକରେ ଦୃଶ୍ୟମାନ ହେଉଥିବା ଛବିକୁ ପାଠ୍ୟଆକାରରେ ଲେଖି ଖୋଜନ୍ତୁ"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "ସୂଚକ ଚିହ୍ନ (_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "ସୂଚକ ହୀନ (_ f)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "ସମ୍ପାଦକକୁ ଆରମ୍ଭ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" କୁ ଯୋଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" ଏବଂ \"%s\" କୁ ଯୋଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" କୁ ଅପସାରଣ କରନ୍ତୁ (_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" କୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ଟ୍ୟାଗକୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "ନୂତନ (_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "ଟ୍ୟାଗ \"%s\" ର ନାମ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_n)..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "ଟ୍ୟାଗ \"%s\" ର ନାମକୁ \"%s\" କୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "ନାମ ବଦଳାନ୍ତୁ (_R)..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ଟ୍ଯାଗଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ (_y)..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "ଟ୍ଯାଗଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ "
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ଫୋଟୋକୁ \"%s\" ଭାବରେ ଟ୍ୟାଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ଫୋଟୋକୁ \"%s\" ଭାବରେ ଟ୍ୟାଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "ବଚ୍ଛିତ ଫୋଟୋକୁ \"%s\" ଭାବରେ ଟ୍ୟାଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ \"%s\" ଭାବରେ ଟ୍ୟାଗ କରନ୍ତୁ"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ଫୋଟୋରୁ ଟ୍ୟାଗ \"%s\" କୁ କାଢ଼ି ଦିଅନ୍ତୁ (_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକରୁ ଟ୍ୟାଗ \"%s\" କୁ କାଢ଼ି ଦିଅନ୍ତୁ (_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ଫୋଟୋରୁ ଟ୍ୟାଗ \"%s\" କୁ କାଢ଼ି ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକରୁ ଟ୍ୟାଗ \"%s\" କୁ କାଢ଼ି ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "ଟ୍ୟାଗକୁ \"%s\" ରେ ପୁନଃ ନାମକରଣ କରିବାରେ ଅସମର୍ଥ କାରଣ ସେହି ଟ୍ୟାଗଟି ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି।"
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"ସନ୍ଧାନକୁ \"%s\" ରେ ପୁନଃ ନାମକରଣ କରିବାରେ ଅସମର୍ଥ କାରଣ ସେହି ସନ୍ଧାନଟି ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି।"
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "ସନ୍ଧାନକୁ ସଂରକ୍ଷିତ କରନ୍ତୁ"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "ସନ୍ଧାନକୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "ସମ୍ପାଦନ କରନ୍ତୁ (_E)..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "ନାମ ବଦଳାନ୍ତୁ ‍‌(_n)..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "ସନ୍ଧାନ \"%s\" କୁ \"%s\" କୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "ସନ୍ଧାନ \"%s\"କୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s କୁ ମାନ୍ୟତା ଦିଅନ୍ତୁ"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "%s ପାଇଁ ମାନ୍ୟତା ସେଟ କରନ୍ତୁ"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s ପାଇଁ ମାନ୍ୟତା ସେଟ କରୁଅଛି"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "ପ୍ରଦର୍ଶନ %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "କେବଳ %s ମାନ୍ୟତା ପ୍ରାପ୍ତ ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ଅଥବା ଉତ୍ତମ"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s ଅଥବା ଉତ୍ତମ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "କେବଳ %s ଅଥବା ଉତ୍ତମ ମାନ୍ୟତାପ୍ରାପ୍ତ ଫୋଟୋଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "ଆବର୍ଜନା ପାତ୍ରରୁ ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ ଅପସାରଣ କରନ୍ତୁ"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "ପୁନଃସ୍ଥାପନ କରନ୍ତୁ (_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ ଲାଇବ୍ରେରୀ ମଧ୍ଯକୁ ପଠାନ୍ତୁ"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ଫାଇଲ ପରିଚାଳକରେ ଦର୍ଶାନ୍ତୁ (_g)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ଫାଇଲ ପରିଚାଳକରେ ବଚ୍ଛିତ ଫୋଟୋର ଡିରେକ୍ଟୋରୀକୁ ଖୋଲନ୍ତୁ"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ଫାଇଲ ପରିଚାଳକରେ ଖୋଲିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "ଲାଇବ୍ରେରୀରୁ ବାହାର କରନ୍ତୁ (_e)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ଆବର୍ଜନାପାତ୍ର ମଧ୍ଯକୁ ଅପସାରଣ କରନ୍ତୁ (_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "ସବୁକିଛି ଚୟନ କରନ୍ତୁ (_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "ସମସ୍ତ ବସ୍ତୁଗୁଡ଼ିକୁ ବାଛନ୍ତୁ"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "କୋଣ:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "ପୁଣି ସେଟ କରନ୍ତୁ (_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "ପ୍ରଚଳିତ ଫୋଟୋ ଆକାରରେ ଫେରାନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "ଏହି ଫୋଟୋ କାଟିବାକୁ ସେଟ କରନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "କଟା ଆୟତନକୁ ପୋର୍ଟ୍ରେଟ ଏବଂ ଲ୍ୟାଣ୍ଡସ୍କେପ ଆବର୍ତ୍ତନ ମଧ୍ଯରେ ଓଲଟାନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "ନିରୁଦ୍ଧ ହୋଇନଥିବା"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "ବର୍ଗାକାର"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "ପରଦା"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "ମୂଳ ଆକାର"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD ଭିଡ଼ିଓ (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD ଭିଡ଼ିଓ (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "ଅକ୍ଷର (8.5 x 11 ଇଞ୍ଚ)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "ଟ୍ୟାବଲଏଡ଼ (11 x 17 ଇଞ୍ଚ)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 ମିମି)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 ମିମି)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "ବନ୍ଦ ଥିବା ଆଖି ଏବଂ ଲାଲି-ଆଖି ଉପକରଣ"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "କୌଣସି ଲାଲି-ଆଖି ପ୍ରଭାବକୁ ବଚ୍ଛିତ ସ୍ଥାନରେ ବାହାର କରନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "ପରିପୃକ୍ତତା:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "ରଙ୍ଗ:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "ତାପମାନ:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "ଛାୟା:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "ରଙ୍ଗଗୁଡକୁ ପୁଣି ସେଟ କରନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "ସମସ୍ତ ରଙ୍ଗ ସଂରଚନାକୁ ପ୍ରକୃତ ଅବସ୍ଥାରେ ପୁଣି ସେଟ କରନ୍ତୁ"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "ତାପମାନ"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "ରଙ୍ଗ"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "ପରିପୃକ୍ତତା"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "ଅନାବୃତ୍ତ"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "ଛାୟା"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "ବୈଷମ୍ୟତା ବୃଦ୍ଧି"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ପିନ ସାଧନ ପଟି"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ସାଧନ ପଟି ଖୋଲିବାରେ ପିନ ଲଗାନ୍ତୁ"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "ସମ୍ପୁର୍ଣ୍ଣ ପରଦା ଛାଡ଼ି ଦିଅନ୍ତୁ"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "ସମ୍ପୁର୍ଣ୍ଣ ପରଦା ଛାଡ଼ି ଦିଅନ୍ତୁ (_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "ବିଦାୟ ନିଅନ୍ତୁ (_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "ବିବରଣୀ (_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "ସମ୍ପୁର୍ଣ୍ଣ ପରଦା (_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "ସୂଚୀପତ୍ର (_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନଗୁଡ଼ିକ (_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "ସମସ୍ୟା ଖବର କରନ୍ତୁ (_R)..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell ର ଲାଇବ୍ରେରୀରେ ପ୍ରବେଶ କରିବା ସମୟରେ ଏକ ମାରାତ୍ମକ ତ୍ରୁଟି ଘଟିଛି। Shotwell କୁ ଆଗେଇ "
+"ପାରିବେ ନାହିଁ।\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba ୱେବ ସାଇଟକୁ ପରିଦର୍ଶନ କରନ୍ତୁ"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "ମନୋଜ କୁମାର ଗିରି <mgiri@redhat.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "ସହାୟତା ପ୍ରଦର୍ଶନ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ତ୍ରୁଟି ତଥ୍ୟାଧାରରେ ପ୍ରଚଳନ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନକୁ ପ୍ରଦର୍ଶନ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "ଶୀର୍ଷକ-ରହିତ"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "ପ୍ରକୃତ ଆକାର"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "ଓସାର କିମ୍ବା ଉଚ୍ଚତା"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "ଓସାର"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ଉଚ୍ଚତା"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "ଅଙ୍ଗୁଳି ଚିହ୍ନର ଆକାରକୁ ସଜାଡ଼ନ୍ତୁ"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "ଅଙ୍ଗୁଳି ଚିହ୍ନର ଆକାର ବୃଦ୍ଧି କରନ୍ତୁ"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "ଅଙ୍ଗୁଳିଚିହ୍ନର ଆକାର ବୃଦ୍ଧିକୁ କମ କରନ୍ତୁ"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ସଜାଡ଼ନ୍ତୁ (_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "ଭିଡ଼ିଓ ଚଲାନ୍ତୁ (_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "ବଚ୍ଛିତ ଭିଡିଓଗୁଡ଼ିକୁ ତନ୍ତ୍ରର ଭିଡିଓ ଚାଳକରେ ଖୋଲନ୍ତୁ"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "ଟିପ୍ପଣୀ (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ପ୍ରତ୍ୟେକ ଫୋଟୋର ଟିପ୍ପଣୀ ଦର୍ଶାନ୍ତୁ"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ପ୍ରତ୍ୟେକ ଫୋଟୋର ଟ୍ୟାଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "ଶୀର୍ଷକ ଦ୍ୱାରା (_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "ଶୀର୍ଷକ ଦ୍ୱାରା ଫୋଟୋଗୁଡ଼ିକୁ ସଜାଡ଼ନ୍ତୁ"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "ଅନାବୃତ୍ତ ତାରିଖ ଅନୁସାରେ (_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଅନାବୃତ୍ତ ତାରିଖ ଅନୁସାରେ ସଜାଡ଼ନ୍ତୁ"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "ମାନ୍ୟତା ଦ୍ୱାରା (_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "ମାନ୍ୟତା ଅନୁସାରେ ଫୋଟୋଗୁଡ଼ିକୁ ସଜାଡ଼ନ୍ତୁ"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell ବଚ୍ଛିତ ଭିଡ଼ିଓକୁି ଚଲାଇବାରେ ଅସମର୍ଥ:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ଫୋଟୋ/ଭିଡ଼ିଓ"
+msgstr[1] "%d ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକ"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ପ୍ରତ୍ୟେକ ଘଟଣାର ମନ୍ତବ୍ୟକୁ ଦର୍ଶାନ୍ତୁ"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "କୌଣସି ଘଟଣା ନାହିଁ"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "କୌଣସି ଘଟଣା ମିଳିଲା ନାହିଁ"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ଘଟଣାଗୁଡିକ"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "ଅଦ୍ୟତିତ"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "କୌଣସି ଘଟଣା ନାହିଁ"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "କ୍ୟାସେ ଡିରେକ୍ଟୋରୀ %s ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "ତଥ୍ୟ ଡିରେକ୍ଟୋରୀ %s ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ଚିତ୍ରଗୁଡିକ"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "ଅସ୍ଥାୟୀ ଡିରେକ୍ଟୋରୀ %s ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "ତଥ୍ୟ ଉପ ଡିରେକ୍ଟୋରୀ %s ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(କିଛି ନାହିଁ)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "କିଛି ନାହିଁ"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "ମନଇଚ୍ଛା"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "ସ୍ଲାଇଡ଼ ଦୃଶ୍ୟ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s ପାଇଁ ଏକ ଅସ୍ଥାୟୀ ଫାଇଲ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "ରପ୍ତାନି କରୁଅଛି"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ଫାଇଲ %s ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି। ଏହାକୁ ସ୍ଥାନାନ୍ତରିତ କରିବେ କି?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "ଏଡାଇ ଦିଅନ୍ତୁ (_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "ବଦଳାନ୍ତୁ (_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "ସବୁକିଛି ବଦଳାନ୍ତୁ (_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "ରତ୍ପାନୀ କର"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକ"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "ଭିଡିଓଗୁଡ଼ିକ"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ଫୋଟୋଗୁଡ଼ିକ"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ଫୋଟୋଗୁଡ଼ିକ"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ଫାଇଲ %s କୁ ଧାରଣ କରିବାରେ ତ୍ରୁଟି:%s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "ପ୍ରକାର"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "ପ୍ରକାଶନ କରୁଅଛି"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "ବଚ୍ଛିତ ଫୋଟୋ/ଭିଡ଼ିଓଗୁଡ଼ିକ ସଫଳତାର ସହିତ ପ୍ରକାଶିତ ହୋଇସାରିଛି।"
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "ବଚ୍ଛିତ ଭିଡ଼ିଓଗୁଡ଼ିକ ସଫଳତାର ସହିତ ପ୍ରକାଶିତ ହୋଇସାରିଛି।"
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକ ସଫଳତାର ସହିତ ପ୍ରକାଶିତ ହୋଇସାରିଛି।"
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "ବଚ୍ଛିତ ଭିଡ଼ିଓଟି ସଫଳତାର ସହିତ ପ୍ରକାଶିତ ହୋଇସାରିଛି।"
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଟି ସଫଳତାର ସହିତ ପ୍ରକାଶିତ ହୋଇସାରିଛି।"
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ଖାତା ସୂଚନାକୁ ଆଣୁଅଛି..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "ଲଗଇନ କରୁଅଛି..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ପ୍ରକାଶନ କରନ୍ତୁ"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "ଫୋଟୋଗୁଡ଼ିକୁ ଏଠାରେ ପ୍ରକାଶନ କରନ୍ତୁ ( _t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "ଭିଡିଓଗୁଡ଼ିକୁ ପ୍ରକାଶନ କରନ୍ତୁ"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "ଭିଡିଓଗୁଡ଼ିକୁ ଏଠାରେ ପ୍ରକାଶନ କରନ୍ତୁ (_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ଫୋଟୋ ଏବଂ ଭିଡିଓଗୁଡ଼ିକୁ ପ୍ରକାଶନ କରନ୍ତୁ"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ଫୋଟୋ ଏବଂ ଭିଡିଓଗୁଡ଼ିକୁ ଏଠାରେ ପ୍ରକାଶନ କରନ୍ତୁ (_t)"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "ପ୍ରକାଶନ କରିବାରେ ଅସମର୍ଥ"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell ବଚ୍ଛିତ ବସ୍ତୁଗୁଡ଼ିକୁ ପ୍ରକାଶ କରିପାରିବ ନାହିଁ କାରଣ ଆପଣଙ୍କ ପାଖରେ ସୁସଙ୍ଗତ ପ୍ରକାଶନ ପ୍ଲଗଇନ "
+"ସକ୍ରିୟ ନାହିଁ। ଏହାକୁ ଠିକ କରିବା ପାଇଁ, <b>%s ପସନ୍ଦକୁ ସମ୍ପାଦନ କରନ୍ତୁ</b> କୁ ବାଛନ୍ତୁ ଏବଂ ଗୋଟିେ "
+"କିମ୍ବା ଅନେକ ପ୍ରକାଶନ ପ୍ଲଗଇନଗୁଡ଼ିକୁ <b>ପ୍ଲଗଇନ</b> ଟ୍ୟାବରେ ସକ୍ରିୟ କରନ୍ତୁ।"
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "ଧାରଣ କରିବା ପାଇଁ ପ୍ରସ୍ତୁତ କରୁଅଛି"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d ର %d କୁ ଧାରଣ କରୁଅଛି"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "ଏକ ତ୍ରୁଟି ଘଟିଥିବାରୁ%s ର ପ୍ରକାଶନକୁ ଆଗକୁ ବଢ଼ାଇ ପାରିବେ ନାହିଁ:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "ଅନ୍ୟ ଏକ ଉପକରଣରେ ପ୍ରକାଶ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ, ଉପର ଲିଖିତ ତାଲିକାରୁ ଗୋଟିଏକୁ ବାଛନ୍ତୁ।"
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "ନୂତନ ଟ୍ୟାଗ (_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "ପ୍ରକାଶନ ପାଇଁ ଆବଶ୍ୟକ ଏକ ଅସ୍ଥାୟୀ ଫାଇଲ ଉପଲବ୍ଧ ନାହିଁ"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"ଆପଣ ବର୍ତ୍ତମାନ YouTube ରେ ଲଗଇନ ହୋଇ ନାହାନ୍ତି।\n"
+"\n"
+"ଆପଣ ନିଶ୍ଚିତ ଭାବରେ ପୂର୍ବରୁ Google ଖାତାରେ ସାଇନଅପ କରିଛନ୍ତି ଏବଂ YouTube ରେ ବ୍ୟବହାର କରିବା "
+"ପାଇଁ ବ୍ୟବସ୍ଥା କରିଛନ୍ତି। ଆପଣ ଅଧିକାଂଶ ଖାତାକୁ ଆପଣଙ୍କର ବ୍ରାଉଜର ବ୍ୟବହାର କରି YouTube ସାଇଟରେ "
+"ଅତିକମରେ ଥରେ ଲଗଇନ କରି ସେଟ କରିପାରିବେ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"ପ୍ରକାଶନ ପାଇଁ ଆବଶ୍ୟକୀୟ ଫାଇଲ ଉପଲବ୍ଧ ନାହିଁ। Youtube ରେ ପ୍ରକାଶନକୁ ଆଗକୁ ବଢ଼ାଇ ପାରିବେ ନାହିଁ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "ଆପଣ %s ଭାବରେ You Tube ରେ ଲଗଇନ ହୋଇଛନ୍ତି।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "'%s' ରେ ଭିଡ଼ିଓ ଦୃଶ୍ୟମାନ ହେବ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "ସାର୍ବଜନୀନ ଭାବରେ ତାଲିକାଭୁକ୍ତ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "ସାର୍ବଜନୀନ ଭାବରେ ତାଲିକାଭୁକ୍ତ ହୋଇ ନାହିଁ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "ବ୍ଯକ୍ତିଗତ"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "ମୂଖ୍ୟ ପ୍ରକାଶନ ସର୍ଭିସଗୁଡ଼ିକ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"ଆପଣ ବର୍ତ୍ତମାନ Flickr ରେ ଲଗଇନ ହୋଇନାହାନ୍ତି।\n"
+"\n"
+"Flickr ରେ ଲଗଇନ ହେବା ପାଇଁ ଆପଣଙ୍କ ୱେବ ବ୍ରାଉଜରରେ ଲଗଇନକୁ କ୍ଲିକ କରନ୍ତୁ। Flickr ଖାତାସହିତ "
+"ସଂଯୁକ୍ତ ହେବା ପାଇଁ ଆପଣଙ୍କୁ Shotwell କୁ ବୈଧିକୃତ କରିବାକୁ ହେବ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ଏହି Shotwell ଅଧିବେଶନରେ ଆପଣ ପୂର୍ବରୁ Flickr ରେ ଲଗଇନ କରି ଲଗଆଉଟ ହୋଇ ସାରିଛନ୍ତି।\n"
+"Flickr ରେ ପ୍ରକାଶନକୁ ଆଗେଇବା ପାଇଁ, Shotwell ରୁ ବିଦାୟ ନିଅନ୍ତୁ ଏବଂ ପୁନଃଚାଳନ କରନ୍ତୁ, ତାପରେ "
+"ପୁଣିଥରେ ପ୍ରକାଶନ କରନ୍ତୁ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "ଲଗଇନ ପାଇଁ ପ୍ରସ୍ତୁତ କରୁଅଛି ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"ପ୍ରକାଶନ ପାଇଁ ଆବଶ୍ୟକୀୟ ଏକ ଫାଇଲ ଉପଲବ୍ଧ ନାହିଁ। Flickr ରେ ପ୍ରକାଶନକୁ ଆଗେଇ ପାରିବେ ନାହିଁ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "ବୈଧିକରଣ ଯାଞ୍ଚ କରୁଅଛି ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"ଆପଣ Flickr ରେ %s ଭାବରେ ଲଗଇନ କରିଛନ୍ତି।\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"ଆପଣଙ୍କର Flickr ଖାତାରେ ଗୋଟିଏ ମାସରେ ତଥ୍ୟ ଧାରଣ ସୀମିତ ଅଛି।\n"
+"ଏହି ମାସ, ଆପଣଙ୍କ ପାଖରେ %d ମେଗା ବାଇଟ ଧାରଣ ସୀମା ବଳିଛି।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "ଆପଣଙ୍କର Flickr ପ୍ରୋ ଖାତାରେ ଅସୀମିତ ଧାରଣ କ୍ଷମତା ଅଛି।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ଫୋଟୋଗୁଡ଼ିକ ଏହାକୁ ଦୃଶ୍ୟମାନ (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "ଭିଡ଼ିଓଗୁଡ଼ିକ ଏହାକୁ ଦୃଶ୍ୟମାନ (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ଫୋଟୋ ଏବଂ ଭିଡ଼ିଓଗୁଡ଼ିକ ଏହାକୁ ଦୃଶ୍ୟମାନ (_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "ସମସ୍ତେ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "କେବଳ ସାଙ୍ଗ ଏବଂ ପରିବାର"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "କେବଳ ପରିବାର"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "କେବଳ ସାଙ୍ଗ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "କେବଳ ମୁଁ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 ପିକସେଲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 ପିକସେଲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 ପିକସେଲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 ପିକସେଲ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s ଆଲବମ ନିର୍ମାଣ କରୁଅଛି ..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigo ରେ ପ୍ରକାଶ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ସନ୍ଦେଶ ଘଟିଛି। ଦୟାକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"ଆପଣଙ୍କର Piwigo ଫୋଟୋ ଲାଇବ୍ରେରୀର URL ଏବଂ ଆପଣଙ୍କ Piwigo ଖାତା ସହିତ ସମ୍ପୃକ୍ତ ସେହି "
+"ଲାଇବ୍ରେରୀ ପାଇଁ ଚାଳକ ନାମ ଏବଂ ପ୍ରବେଶ ସଂକେତକୁ ମଧ୍ଯ ଭରଣ କରନ୍ତୁ।"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell ଆପଣଙ୍କର Piwigo ଫୋଟୋ ଲାଇବ୍ରେରୀକୁ ସମ୍ପର୍କ କରିପାରିବ ନାହିଁ। ଦୟାକରି ଆପଣ ଭରଣ କରିଥିବା "
+"URL କୁ ଯାଞ୍ଚ କରନ୍ତୁ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"ଚାଳକ ନାମ ଏବଂ/କିମ୍ବା ପ୍ରବେଶ ସଂକେତଟି ଅବୈଧ ଅଟେ। ଦୟାକରି ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "ଅବୈଧ URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "ଅବୈଧ ଚାଳକ ନାମ ଅଥବା ପ୍ରବେଶ ସଂକେତ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell ସଂଯୋଗ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "ପ୍ରଶାସନ, ପରିବାର, ସାଙ୍ଗ, ସମ୍ପର୍କୀୟମାନେ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "ପ୍ରଶାସନ, ପରିବାର, ସାଙ୍ଗମାନେ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "ପ୍ରଶାସନ, ପରିବାର"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "ପ୍ରଶାସନ"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"ଆପଣ ବର୍ତ୍ତମାନ ପିକାସା ୱେବ ଆଲବମରେ ଲଗଇନ ହୋଇ ନାହାନ୍ତି।\n"
+"\n"
+"ଆପଣଙ୍କ ୱେବ ବ୍ରାଉଜରରେ ପିକାସା ୱେବ ଆଲବମରେ ଲଗଇନ କରିବା ପାଇଁ କ୍ଲିକ କରନ୍ତୁ। ଆପଣଙ୍କୁ Shotwell "
+"କୁ ଆପଣଙ୍କ ପିକାସା ୱେବ ଆଲବମରେ ସଂଯୋଗ କରିବା ପାଇଁ ଅନୁମତି ଦେବାକୁ ହେବ।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"ପ୍ରକାଶନ ପାଇଁ ଆବଶ୍ୟକ ଫାଇଲ ଉପଲବ୍ଧ ନାହିଁ। ପିକାସାରେ ପ୍ରକାଶନ କରିବାରେ ଅଗ୍ରସର ହୋଇପାରିବେ ନାହିଁ।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "ଆଲବମ ନିର୍ମାଣ କରୁଅଛି ..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "ଆପଣ ପିକାସା ୱେବ ଆଲବମଗୁଡ଼ିକରେ %s ଭାବରେ ଲଗଇନ ହୋଇଛନ୍ତି।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "ଭିଡ଼ିଓ ଏଥିରେ ଦୃଶ୍ୟମାନ ହେବ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ଫୋଟୋଗୁଡ଼ିକ ଏଥିରେ ଦୃଶ୍ୟମାନ ହେବ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "ଛୋଟ (640 x 480 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "ମଧ୍ଯମ (1024 x 768 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "ପରାମର୍ଶିତ (1600 x 1200 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"ଆପଣ ବର୍ତ୍ତମାନ Facebook ରେ ଲଗଇନ କରି ନାହାନ୍ତି।\n"
+"\n"
+"ଯଦି ଆପଣଙ୍କ ପାଖରେ ଏପର୍ଯ୍ୟନ୍ତ Facebook ଖାତା ନାହିଁ, ତେବେ ଆପଣ ଲଗଇନ ସମୟରେ ଏକ ଖାତା ନିର୍ମାଣ "
+"କରିପାରିବେ। ଲଗଇନ ସମୟରେ, Shotwell ସଂଯୋଗ ହୁଏତଃ ଆପଣଙ୍କୁ ଫୋଟୋ ଧାରଣ ପାଇଁ ଅନୁମତି ମାଗିପାରେ। "
+"ଏହି ଅନୁମତିଗୁଡ଼ିକ Shotwell ସଂଯୋଗ ପାଇଁ ଆବଶ୍ୟକ ହୋଇଥାଏ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ଆପଣ ପୂର୍ବରୁ Facebook ରୁ Shotwell ଅଧିବେଶନ ସମୟରେ ଲଗଇନ କରି ଲଗଆଉଟ କରି ସାରିଛନ୍ତି।\n"
+"Facebook ପ୍ରକାଶନକୁ ଆଗେଇବା ପାଇଁ, ପ୍ରସ୍ଥାନ କରନ୍ତୁ ଏବଂ Shotwell କୁ ପୁନଃଚାଳନ କରନ୍ତୁ, ତାପରେ "
+"ପୁଣିଥରେ ପ୍ରକାଶ କରନ୍ତୁ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "ମାନକ (720 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "ବଡ଼ (2048 ପିକସେଲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook ସଂଯୋଗକୁ ପରୀକ୍ଷା କରୁଅଛି ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "ପ୍ରକାଶନ ପାଇଁ ଆବଶ୍ୟକ ଫାଇଲ ଉପଲବ୍ଧ ନାହିଁ। Facebook ରେ ପ୍ରକାଶନ ଆଗକୁ ବଢ଼ି ପାରିବ ନହିଁ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"ଆପଣ Facebook ରେ %s ଭାବରେ ଲଗଇନ ହୋଇଛନ୍ତି।\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "ବଚ୍ଛିତ ଫୋଟୋଗୁଡ଼ିକୁ ଆପଣ କେଉଁଠି ପ୍ରକାଶ କରିବାକୁ ଚାହୁଁଛନ୍ତି?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "ଧାରଣ ଆକାର (_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "ସାଙ୍ଗମାନେ"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "କ୍ରମ୍ବଲ"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "ଚେସ"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "ବୃତ୍ତଗୁଡିକ"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ଅପ୍ରତ୍ୟକ୍ଷ"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "ରେଖାମାନ"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ଘଣ୍ଟା"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "ବୃତ୍ତ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "ମୂଖ୍ୟ ସ୍ଲାଇଡ ଦୃଶ୍ୟ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "ସ୍ଲାଇଡ୍"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "ଫିକା"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ବର୍ଗକ୍ଷେତ୍ରଗୁଡିକ"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "ମୂଖ୍ୟ ତଥ୍ୟ ଆମଦାନୀ ସର୍ଭିସଗୁଡ଼ିକ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-ସ୍ପଟ ଲାଇବ୍ରେରୀ ଆମଦାନୀ ସର୍ଭିସରେ ସ୍ୱାଗତ।\n"
+"\n"
+"ଆମଦାନୀ କରିବା ପାଇଁ ଏକ ଲାଇବ୍ରେରୀ ବାଛନ୍ତୁ, Shotwell ଦ୍ୱାରା ମିଳିଥିବା ସ୍ଥିତବାନ ଲାଇବ୍ରେରୀ ଅଥବା "
+"କୌଣସି ବୈକଳ୍ପିକ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ବାଛନ୍ତୁ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-ସ୍ପଟ ଲାଇବ୍ରେରୀ ଆମଦାନୀ ସର୍ଭିସରେ ସ୍ୱାଗତ।\n"
+"\n"
+"କୌଣସି ବୈକଳ୍ପିକ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ବାଛନ୍ତୁ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "ଆମଦାନୀ କରିବା ପାଇଁ ହସ୍ତକୃତ ଭାବରେ କୌଣସି F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ବାଛନ୍ତୁ:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"ବଚ୍ଛିତ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ଖୋଲି ପାରିବେ ନାହିଁ: ସେହି ଫାଇଲଟି ଅବସ୍ଥିତ ନାହିଁ ଅଥବା ତାହା ଏକ F-"
+"ସ୍ପଟ ତଥ୍ୟାଧାର ନୁହଁ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"ବଚ୍ଛିତ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ଖୋଲି ପାରିବେ ନାହିଁ: F-ସ୍ପଟ ତଥ୍ୟାଧାରର ଏହି ସଂସ୍କରଣଟି Shotwell "
+"ଦ୍ୱାରା ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "ବଚ୍ଛିତ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ପଢ଼ିପାରିବେ ନାହିଁ: ଟ୍ୟାଗଗୁଡ଼ିକର ସାରଣୀକୁ ପଢ଼ିବା ସମୟରେ ତ୍ରୁଟି"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "ବଚ୍ଛିତ F-ସ୍ପଟ ତଥ୍ୟାଧାର ଫାଇଲକୁ ପଢ଼ିପାରିବେ ନାହିଁ: ଫୋଟୋଗୁଡ଼ିକର ସାରଣୀକୁ ପଢ଼ିବା ସମୟରେ ତ୍ରୁଟି"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell F-ସ୍ପଟ ଲାଇବ୍ରେରୀରୁ %d ଟି ଫୋଟୋ ପାଇଛି ଏବଂ ବର୍ତ୍ତମାନ ସେଗୁଡିକୁ ଆମଦାନୀ କରୁଅଛି। "
+"ନକଲିଗୁଡ଼ିକୁ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଚିହ୍ନିକରି ବାହାର କରିଦିଆଯିବ।\n"
+"\n"
+"ଆପଣ ଏହି ସଂଳାପକୁ ବନ୍ଦ କରିପାରିବେ ଏବଂ ପଛରେ ଆମଦାନୀ ହେଉଥିବା ସମୟରେ Shotwell କୁ ବ୍ୟବହାର "
+"କରିପାରିବେ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-ସ୍ପଟ ଲାଇବ୍ରେରୀ: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "ଆମଦାନୀ ପାଇଁ ପ୍ରସ୍ତୁତ କରୁଅଛି"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "ଡେସ୍କଟପ ସ୍ଲାଇଡ ଦୃଶ୍ୟ ଭାବରେ ସେଟ କରନ୍ତୁ"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "ଡେସ୍କଟପ ପୃଷ୍ଠଭୂମି ସ୍ଲାଇଡ ଦୃଶ୍ୟ ସୃଷ୍ଟି କରନ୍ତୁ"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "ପ୍ରତ୍ୟେକ ଫୋଟୋକୁ ଏହା ପାଇଁ ଦର୍ଶାନ୍ତୁ"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ସମୟ ଅବଧି"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "ଡେସ୍କଟପ ପୃଷ୍ଠଭୂମି ଉପରେ କେତେ ସମୟ ପର୍ଯ୍ୟନ୍ତ ପ୍ରତ୍ୟେକ ଫୋଟୋକୁ ଦର୍ଶାଯାଇ ପାରିବ"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "ସନ୍ଧାନ କରନ୍ତୁ"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "ସନ୍ଧାନ ନାମ (_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "ମେଳ (_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "ନିମ୍ନଲିଖିତଗୁଡ଼ିକର:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>ମୁଦ୍ରିତ ଚିତ୍ରର ଆକାର</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "ଏକ ମାନକ ଆକାର ବ୍ୟବହାର କରନ୍ତୁ (_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "ଏକ ଇଚ୍ଛାରୂପଣ ଆକାର ବ୍ୟବହାର କରନ୍ତୁ (_u):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ଫୋଟୋ ପରିମାପ ଅନୁପାତକୁ ମେଳାନ୍ତୁ (_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "ସ୍ୱୟଂ ଆକାର ଧାରଣ (_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>ଶୀର୍ଷକଗୁଡ଼ିକ</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ପ୍ରତିଛବି ଶୀର୍ଷକକୁ ମୁଦ୍ରଣ କରନ୍ତୁ (_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>ପିକସେଲ୍‌ ବିଭେଦନ</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "ଏଠାରେ ଫୋଟୋକୁ ଦର୍ଶାନ୍ତୁ (_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ପିକ୍ସେଲ/ଇଞ୍ଚ"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "ନାମପଟି"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell ପସନ୍ଦ"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "ଧଳା"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "କଳା"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "ନୂତନ ଫାଇଲଗୁଡ଼ିକ ପାଇଁ ଲାଇବ୍ରେରୀ ଡିରେକ୍ଟୋରୀ ଦେଖନ୍ତୁ (_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "ଅଧିତଥ୍ୟ"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "ଫୋଟୋ ଫାଇଲଗୁଡ଼ିକ ପ୍ରତି ଧଳା ଟ୍ୟାଗଗୁଡ଼ିକ, ଶୀର୍ଷକ, ଏବଂ ଅନ୍ୟାନ୍ୟ ଅଧିତଥ୍ୟ (_m)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "ଦର୍ଶାନ୍ତୁ"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "ଏଠାକୁ ଫୋଟୋଗୁଡ଼ିକୁ ପଠାନ୍ତୁ (_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "ପୃଷ୍ଠଭୂମି (_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "ଆମଦାନୀ କରୁଅଛି "
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "ଡିରେକ୍ଟୋରି ସଂରଚନା (_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ପ୍ରକାର (_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ଉଦାହରଣ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "ଛୋଟ ଅକ୍ଷରରେ ଆମଦାନୀ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକର ନାମ ବଦଳାନ୍ତୁ (_e)"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW ବିକାଶକାରୀ"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ (_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "ବାହ୍ୟ ଫୋଟୋ ସମ୍ପାଦକ (_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "ବାହ୍ୟ RAW ସମ୍ପାଦକ (_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "ବାହ୍ୟ ସମ୍ପାଦକମାନେ"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "ପ୍ଲଗଇନଗୁଡ଼ିକ"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "ବିଳମ୍ବ (_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "ପରିବର୍ତ୍ତନ ପ୍ରଭାବ (_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "ପରିବର୍ତ୍ତନ ବିଳମ୍ବ (_e):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "ଶୀର୍ଷକ ଦର୍ଶାନ୍ତୁ (_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "ସେକେଣ୍ଡ"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "ଲଗଇନ କରନ୍ତୁ ‍‌(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "ଲଗଆଉଟ (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "ପ୍ରକାଶ କରନ୍ତୁ (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "ଫୋଟୋ ଆକାର ( _s):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "ଏହି ନାମରେ ଏକ ନୂତନ ଚିତ୍ର ପୁସ୍ତକ (_n):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "ଆପଣଙ୍କର Piwigo ଫୋଟୋ ଲାଇବ୍ରେରୀର URL (_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "ଚାଳକ ନାମ (_n)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "ପ୍ରବେଶ ସଂଙ୍କେତ (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "ପ୍ରବେଶ ସଂକେତକୁ ମନେରଖନ୍ତୁ (_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "ଲଗଇନ"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "ଏକ ସ୍ଥିତବାନ ବିଭାଗ ( _e):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "ଫୋଟୋଗୁଡ଼ିକ ଏହା ଦ୍ୱାରା ଦୃଶ୍ୟମାନ ହେବ (_v):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "ଫୋଟୋ ଆକାର:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "ଲଗଆଉଟ"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 ପିକସେଲ"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' ଟି OAuth ବୈଧିକରଣ ଅନୁରୋଧ ପାଇଁ ଏକ ବୈଧ ଉତ୍ତର ନୁହଁ"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr "Tumblrପ୍ରକାଶକ: start( ): ଆରମ୍ଭ କରିପାରିବ ନାହିଁ; ଏହି ପ୍ରକାଶକକୁ ପୁନଃଆରମ୍ଭ କରିହେବ ନାହିଁ।"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "ଆପଣଙ୍କର Tumblr ଖାତା ସହିତ ସମ୍ପୃକ୍ତ ଚାଳକ ନାମ ଏବଂ ପ୍ରବେଶ ସଂକେତକୁ ଭରଣ କରନ୍ତୁ।"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI କୁ ଧାରଣ କରିପାରିଲା ନାହିଁ: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"ଆପଣ Tumblr ରେ %s ଭାବରେ ଲଗଇନ କରିଛନ୍ତି।\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki ୱେବ ସାଇଟକୁ ପରିଦର୍ଶନ କରନ୍ତୁ"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "ଆପଣ ବର୍ତ୍ତମାନ Yandex.Fotki ରେ ଲଗଇନ ହୋଇନାହାନ୍ତି।"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "ଇମେଲ ଠିକଣା (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"ଆପଣ Tumblr ରେ (ନାମ) ଭାବରେ ଲଗଇନ କରିଛନ୍ତି।\n"
+"\n"
+"(ଏହା ନାମର ବାକ୍ୟଖଣ୍ଡକୁ ପ୍ରଚାର କରାଯାଇଛି ଏବଂ ସଂକେତ ମଧ୍ଯରେ ସେଟ କରାଯାଇଛି, \n"
+"ତେଣୁ ଏଥିରେ କରାଯାଇଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ଦର୍ଶାଯିବ ନାହିଁ)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ବ୍ଲଗଗୁଡ଼ିକ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "ଚିତ୍ରପୁସ୍ତକଗୁଡ଼ିକ (_A) (ଅଥବା ନୂଆ ଲେଖନ୍ତୁ):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "ଅଭିଗମ୍ୟତା ପ୍ରକାର (_t):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "ଟିପ୍ପଣୀଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "ପ୍ରକୃତ ଫୋଟୋକୁ ଆହରଣ କରିବାରୁ ବାରଣ କରନ୍ତୁ (_F)"
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..75cbbb7
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,4553 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# asaini <asaini@redhat.com>, 2013
+# A S Alam <aalam@users.sf.net>, 2012
+# A S Alam <apreet.alam@gmail.com>, 2012
+# Jaswinder Singh <jsingh@redhat.com>, 2012
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-21 12:30+0000\n"
+"Last-Translator: asaini <asaini@redhat.com>\n"
+"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/projects/p/"
+"shotwell/language/pa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pa\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "ਈਵੈਂਟ %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "ਕੈਮਰੇ"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "ਕੈਮਰਾ"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "ਕੈਮਰਾ ਅਨਮਾਊਟ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਫਾਇਲ ਮੈਨੇਜਰ ਵਿੱਚੋਂ ਕੈਮਰਾ ਅਨਮਾਊਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ਪਹਿਲਾਂ ਹੀ ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਫੋਟੋ ਓਹਲੇ"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "ਕੇਵਲ ਉਹੀ ਫੋਟੋ ਵੇਖਾਉ ਜੋ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "ਇੰਪੋਰਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕੀਤਾ, ਉਡੀਕੋ ਜੀ..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "ਟਾਈਟਲ(_T)"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "ਹਰੇਕ ਫੋਟੋ ਲਈ ਟਾਈਟਲ ਵੇਖਾਓ"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "ਚੁੁਣੀਆਂ ਇੰਪੋਰਟ ਕਰੋ(_S)"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋ ਆਪਣੀ ਲਾਇਬਰੇਰੀ ਵਿੱਚ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "ਸਭ ਇੰਪੋਰਟ(_A)"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "ਸਭ ਫੋਟੋ ਨੂੰ ਆਪਣੀ ਲਾਇਬਰੇਰੀ ਵਿੱਚ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"ਸ਼ੂਟਵੈੱਲ ਨੂੰ ਫਾਇਲ-ਸਿਸਟਮ ਤੋਂ ਕੈਮਰੇ ਨੂੰ ਵਰਤਣ ਵਾਲੇ ਅਣ-ਮਾਊਂਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਕੀ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "ਅਣ-ਮਾਊਂਟ(_U)"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "ਕੈਮਰਾ ਅਣ-ਮਾਊਂਟ ਕਰੋ ਜੀ।"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"ਕੈਮਰਾ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨ ਰਾਹੀਂ ਲਾਕ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਸ਼ੂਟਵੈੱਲ ਕੇਵਲ ਤਾਂ ਹੀ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਸਕਦਾ ਹੈ, ਜਦੋਂ ਇਹ "
+"ਅਣ-ਲਾਕ ਹੋਵੇ। ਕੈਮਰੇ ਨੂੰ ਵਰਤਣ ਵਾਲੀ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।"
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੀ ਕੋਈ ਵੀ ਹੋਰ ਐਪਲੀਕੇਸ਼ਨ ਬੰਦ ਕਰੋ ਜੀ।"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"ਕੈਮਰੋ ਤੋਂ ਝਲਕ ਲੈਣ ਲਈ ਅਸਮਰੱਥ:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "ਅਣ-ਮਾਊਂਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ਫੋਟੋ ਜਾਣਕਾਰੀ ਲਈ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s ਲਈ ਝਲਕ ਲਈ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "ਕੈਮਰਾ ਲਾਕ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ਕੈਮਰੇ ਤੋਂ ਇਹ ਫੋਟੋ ਹਟਾਉਣੀ ਹੈ?"
+msgstr[1] "ਕੈਮਰੇ ਤੋਂ ਇਹ %d ਫੋਟੋ ਹਟਾਉਣੀਆਂ ਹਨ?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ਕੈਮਰੇ ਤੋਂ ਇਹ ਵਿਡੀਓ ਹਟਾਉਣੀ ਹੈ?"
+msgstr[1] "ਕੈਮਰੇ ਤੋਂ ਇਹ %d ਵਿਡੀਓ ਹਟਾਉਣੀਆਂ ਹਨ?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ਕੈਮਰੇ ਤੋਂ ਇਹ ਫੋਟੋ/ਵਿਡੀਓ ਹਟਾਉਣੀ ਹੈ?"
+msgstr[1] "ਕੈਮਰੇ ਤੋਂ ਇਹ %d ਫੋਟੋ/ਵਿਡੀਓ ਹਟਾਉਣੀਆਂ ਹਨ?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "ਕੈਮਰੇ ਤੋਂ ਇਹ ਫਾਇਲਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"
+msgstr[1] "ਕੈਮਰੇ ਤੋਂ ਇਹ %d ਫਾਇਲਾਂ ਹਟਾਉਣੀਆਂ ਹਨ?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "ਰੱਖੋ(_K)"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "ਕੈਮਰੇ ਤੋਂ ਫੋਟੋ/ਵਿਡੀਓ ਹਟਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "ਗਲਤੀਆਂ ਕਰਕੇ ਕੈਮਰੇ ਵਿੱਚੋਂ %d ਫੋਟੋ/ਵੀਡੀਓ ਹਟਾ ਨਹੀਂ ਸਕਿਆ।"
+msgstr[1] "ਗਲਤੀਆਂ ਕਰਕੇ ਕੈਮਰੇ ਵਿੱਚੋਂ %d ਫੋਟੋਆਂ/ਵੀਡੀਓ ਹਟਾ ਨਹੀਂ ਸਕਿਆ।"
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "ਸਲਾਇਡ ਸ਼ੋ(_l)"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "ਸਲਾਇਡ-ਸ਼ੋ ਚਲਾਓ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ਫੋਟੋ/ਵਿਡੀਓ ਐਕਸਪੋਰਟ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ਫੋਟੋ/ਵਿਡੀਓ ਐਕਸਪੋਰਟ ਕਰੋ"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ਫੋਟੋ ਐਕਸਪੋਰਟ"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ਫੋਟੋ ਐਕਸਪੋਰਟ"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "ਘੁੰਮਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "ਘੁੰਮਾਉਣ ਨੂੰ ਵਾਪਸ ਲਵੋ"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "ਹਰੀਜਟਲ ਪਲਟੋ"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "ਹਰੀਜੱਟਲ ਪਲਟਣਾ ਵਾਪਸ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "ਲੰਬਕਾਰੀ ਪਲਟੋ"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "ਵਰਟੀਕਲ ਪਲਟਣਾ ਵਾਪਸ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "ਕੋਈ ਟੈਕਸਟ"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "ਟਾਈਟਲ"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ਟੈਗ"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "ਟਿੱਪਣੀ"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "ਈਵੈਂਟ ਨਾਂ"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ਫਾਇਲ ਨਾਂ"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "ਮੀਡਿਆ ਕਿਸਮ"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ਫਲੈਗ ਸਥਿਤੀ"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "ਤਸਵੀਰ ਹਾਲਤ"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "ਰੇਟਿੰਗ"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "ਮਿਤੀ"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "ਵਿੱਚ ਸ਼ਾਮਿਲ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "ਸੱਚ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ਇਸ ਨਾਲ ਸ਼ੁਰੂ"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ਨਾਲ ਸਮਾਪਤ"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ਸ਼ਾਮਿਲ ਨਹੀ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ਸੈੱਟ ਨਹੀਂ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ਇਹ ਨਹੀਂ"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "ਕੋਈ ਫੋਟੋ"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ਕੋਈ ਰਾਅ ਫੋਟੋ"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ਵਿਡੀਓ"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "ਕੋਲ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "ਕੋਲ ਨਹੀਂ"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "ਸੁਧਾਰ"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "ਅੰਦਰੂਨੀ ਸੁਧਾਰ"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "ਬਾਹਰੀ ਸੁਧਾਰ"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "ਫਲੈਗ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ਫਲੈਗ ਨਹੀਂ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ਅਤੇ ਉੱਪਰਲਾ"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "ਕੇਵਲ"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ਅਤੇ ਘੱਟ"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "ਬਾਅਦ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "ਪਹਿਲਾਂ ਹੈ"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "ਵਿੱਚ"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ਅਤੇ"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ਕੋਈ ਵੀ"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "ਸਭ"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "ਸੰਭਾਲੀਆਂ ਖੋਜਾਂ"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "ਨਵੀਂ ਸੰਭਾਲੀ ਖੋਜ(_w)..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "ਸ਼ਾਟਵੈੱਲ ਡਾਟਾਬੇਸ ਦੀ ਜਾਂਚ ਕਰਨ ਤੇ ਅਣਜਾਣ ਗਲਤੀ ਆਈ ਹੈ: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "ਸ਼ੂਟਵੈੱਲ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell ਦੇ ਨਿੱਜੀ ਡਾਟੇ ਵੱਲ ਰਾਹ"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "ਡਾਇਰੈਕਟਰੀ"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "ਬਦਲਾਅ ਲਈ runtime ਵੇਲੇ ਲਾਇਬ੍ਰੇਰੀ ਡਾਇਰੈਕਟਰੀ ਤੇ ਨਜ਼ਰ ਨਾ ਰੱਖੋ"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਤਰੱਕੀ ਮੀਟਰ ਨਾਂ ਵਿਖਾਓ"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਸੰਸਕਰਣ ਵਿਖਾਓ"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ਫਾਇਲ]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "ਉਪਲੱਬਧ ਕਮਾਂਡ ਲਾਈਨ ਚੋਣਾਂ ਦੀ ਪੂਰੀ ਲਿਸਟ ਵੇਖਣ ਲਈ '%s --help' ਚਲਾਓ।\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "ਅੱਜ"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "ਕੱਲ੍ਹ"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "ਟਾਈਟਲ:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "ਆਈਟਮਾਂ:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d ਸਮਾਗਮ"
+msgstr[1] "%d ਸਮਾਗਮ"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ਫੋਟੋ"
+msgstr[1] "%d ਫੋਟੋ"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d ਵਿਡੀਓ"
+msgstr[1] "%d ਵਿਡੀਓ"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "ਮਿਤੀ:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "ਸਮਾਂ:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "ਵਲੋਂ"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "ਵੱਲ:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "ਸਾਈਜ਼:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "ਅੰਤਰਾਲ:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f ਸਕਿੰਟ"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "ਡਿਵੈਲਪਰ:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "ਪੱਖ:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "ਟਿਕਾਣਾ:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ਫਾਇਲ ਸਾਈਜ਼:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "ਮੌਜੂਦਾ ਵਿਕਾਸ:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "ਅਸਲੀ ਮਾਪ:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "ਕੈਮਰਾ ਮੇਕ:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "ਕੈਮਰਾ ਮਾਡਲ:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "ਫਲੈਸ਼:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ਫੋਕਲ ਲੰਬਾਈ:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "ਐਕਸਪੋਜ਼ਰ ਮਿਤੀ:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "ਐਕਸਪੋਜ਼ਰ ਸਮਾਂ:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "ਐਕਸਪੋਜ਼ਰ ਬਾਇਆਸ:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS latitude:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS ਲੰਬਕਾਰ:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "ਕਲਾਕਾਰ:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "ਕਾਪੀਰਾਈਟ:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "ਸਾਫਟਵੇਅਰ:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "ਟਿੱਪਣੀ:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "ਵਾਧੂ ਜਾਣਕਾਰੀ"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "ਇਸ ਨਾਲ \"%s\" ਟੈਗ ਨੂੰ ਇੱਕ ਫੋਟੋ ਤੋਂ ਹਟਾਏਗਾ। ਜਾਰੀ?"
+msgstr[1] "ਇਸ ਨਾਲ \"%s\" ਟੈਗ ਨੂੰ %d ਫੋਟੋਆਂ ਤੋਂ ਹਟਾਏਗਾ। ਜਾਰੀ?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "ਰੱਦ ਕਰੋ(_C)"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "ਹਟਾਓ(_D)"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "ਇਸ ਨਾਲ ਸੰਭਾਲੀ ਖੋਜ \"%s\" ਹਟਾਈ ਜਾਵੇਗੀ। ਜਾਰੀ?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"ਡਿਵੈਲਪਰ ਤਬਦੀਲ ਕਰਨ ਨਾਲ ਸ਼ਾਟਵੈੱਲ ਵਿੱਚ ਇਸ ਫੋਟੋ ਤੇ ਕੀਤੀਆਂ ਸਭ ਤਬਦੀਲੀਆਂ ਖਤਮ ਹੋ ਜਾਣਗੀਆਂ"
+msgstr[1] ""
+"ਡਿਵੈਲਪਰ ਤਬਦੀਲ ਕਰਨ ਨਾਲ ਸ਼ਾਟਵੈੱਲ ਵਿੱਚ ਇਹਨਾਂ ਫੋਟੋਆਂ ਤੇ ਕੀਤੀਆਂ ਸਭ ਤਬਦੀਲੀਆਂ ਖਤਮ ਹੋ ਜਾਣਗੀਆਂ"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "ਡਿਵੈਲਪਰ ਬਦਲੋ(_S)"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ਵਿਡੀਓ ਐਕਸਪੋਰਟ"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ਫਾਇਲ ਗਲਤੀ ਕਰਕੇ ਹੇਠਲੀ ਫੋਟੋ ਐਕਸਪੋਰ ਨਹੀਂ ਹੋ ਸਕਦੀ।\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"ਕੀ ਤੁਸੀਂ ਐਕਸਪੋਰਟ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "ਜਾਰੀ ਰੱਖੋ(_t)"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "ਨਾ-ਸੋਧਿਆ"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "ਮੌਜੂਦਾ"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "ਫਾਰਮੈਟ(_F):"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "ਕੁਆਲਟੀ(_Q):"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "ਸਕੇਲ ਕਰਨ ਹੱਦ(_S):"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " ਪਿਕਸਲ(_p)"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "ਮੇਟਾਡਾਟਾ ਐਕਸਪੋਰਟ"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "ਵੇਰਵੇ ਸੰਭਾਲੋ..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "ਵੇਰਵੇ ਸੰਭਾਲੋ"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ਅਤੇ %d ਹੋਰ)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "ਨਤੀਜਿਆਂ ਦੀ ਸੂਚਨਾ ਆਯਾਤ ਕਰੋ"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ਫਾਈਲ ਆਯਾਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।"
+msgstr[1] "%d ਫਾਈਲਾਂ ਆਯਾਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "ਇਹਨਾਂ ਵਿੱਚੋਂ, %d ਫਾਈਲ ਸਫਲਤਾ ਪੂਰਵਕ ਆਯਾਤ ਕੀਤੀ ਗਈ।"
+msgstr[1] "ਇਹਨਾਂ ਵਿੱਚੋਂ, %d ਫਾਈਲਾਂ ਸਫਲਤਾ ਪੂਰਵਕ ਆਯਾਤ ਕੀਤੀਆਂ ਗਈਆਂ।"
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "ਤਸਵੀਰਾਂ/ਵਿਡੀਓ ਦੀਆਂ ਨਕਲਾਂ ਆਯਾਤ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "ਮੌਜੂਦਾ ਮੀਡੀਆ ਆਈਟਮਾਂ ਦੀ ਨਕਲ ਬਣਾਉਂਦਾ ਹੈ"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ ਤਸਵੀਰਾਂ/ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਏ:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "ਗਲਤੀ ਦਾ ਸੁਨੇਹਾ:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "ਫਾਈਲਾਂ ਆਯਾਤ ਨਹੀਂ ਹੋਈਆਂ ਉਹਨਾਂ ਦੀ ਤਸਵੀਰਾਂ ਜਾਂ ਵੀਡੀਓ ਦੇ ਵਜੋਂ ਸ਼ਨਾਖਤ ਨਹੀਂ ਹੋਈ:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ਤਸਵੀਰਾਂ/ ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਈਆਂ ਕਿਉਂਕਿ ਉਹਨਾਂ ਦੀ ਬਨਾਵਟ ਅਜਿਹੀ ਨਹੀਂ ਸੀ ਕਿ ਜਿਸ ਨੂੰ "
+"Shotwell ਸਮਝਦਾ ਹੈ:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"ਤਸਵੀਰਾਂ/ ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਈਆਂ ਕਿਉਂਕਿ shotwell ਆਪਣੀ ਲਾਇਬ੍ਰੇਰੀ ਵਿੱਚ ਉਹਨਾਂ ਦੀ ਨਕਲ ਨਹੀਂ "
+"ਕਰ ਸਕਿਆ:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s ਨੂੰ ਨਕਲ ਨਹੀਂ ਕਰ ਸਕਿਆ\n"
+"\t%s ਤੇ"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "ਤਸਵੀਰਾਂ/ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਏ ਕਿਉਂਕਿ ਫਾਈਲਾਂ ਭ੍ਰਿਸ਼ਟ ਹਨ:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "ਤਸਵੀਰਾਂ/ਵੀਡੀਓ ਹੋਰ ਕਾਰਨਾਂ ਕਰ ਕੇ ਆਯਾਤ ਨਹੀਂ ਕੀਤੇ ਗਏ:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 ਡੁਪਲੀਕੇਟ ਫੋਟੋ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਗਈ:\n"
+msgstr[1] "%d ਡੁਪਲੀਕੇਟ ਫੋਟੋ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 ਡੁਪਲੀਕੇਟ ਵਿਡੀਓ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਗਈ:\n"
+msgstr[1] "%d ਡੁਪਲੀਕੇਟ ਵਿਡੀਓ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 ਡੁਪਲੀਕੇਟ ਫੋਟੋ/ਵਿਡੀਓ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਗਈ:\n"
+msgstr[1] "%d ਡੁਪਲੀਕੇਟ ਫੋਟੋ/ਵਿਡੀਓ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ 1 ਫੋਟੋ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ %d ਫੋਟੋਆਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ 1 ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ %d ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ 1 ਫੋਟੋ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ %d ਫੋਟੋਆਂ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ 1 ਫਾਇਲ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਫਾਇਲ ਜਾਂ ਹਾਰਡਵੇਅਰ ਗਲਤੀ ਕਰਕੇ %d ਫਾਇਲਾਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 ਫੋਟੋ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+msgstr[1] ""
+"%d ਫੋਟੋਆਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਕਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+msgstr[1] ""
+"%d ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 ਫੋਟੋ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+msgstr[1] ""
+"%d ਫੋਟੋਆਂ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "1 ਫਾਇਲ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+msgstr[1] ""
+"%d ਫਾਇਲਾਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ ਕਿਉਂ ਕਿ ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਲਿਖਣਯੋਗ ਨਹੀਂ ਸੀ:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ 1 ਫੋਟੋ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ %d ਫੋਟੋਆਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ 1 ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ %d ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ 1 ਫੋਟੋ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ %d ਫੋਟੋ/ਵੀਡੀਓ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ 1 ਫਾਇਲ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈ ਹੈ:\n"
+msgstr[1] "ਕੈਮਰਾ ਗਲਤੀ ਕਰਕੇ %d ਫਾਇਲਾਂ ਇੰਪੋਰਟ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 ਤਸਵੀਰ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸੀ:\n"
+msgstr[1] "%d ਤਸਵੀਰਾਂ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸਨ:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 ਵੀਡੀਓ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸੀ:\n"
+msgstr[1] "%d ਵੀਡੀਓ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸਨ:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 ਤਸਵੀਰ/ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਈ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸੀ:\n"
+msgstr[1] "%d ਤਸਵੀਰਾਂ/ਵੀਡੀਓ ਆਯਾਤ ਨਹੀਂ ਹੋਏ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸਨ:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 ਫਾਈਲ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸੀ:\n"
+msgstr[1] "%d ਫਾਈਲਾਂ ਆਯਾਤ ਹੋਣੋ ਅਸਫਲ ਕਿਉਂਕਿ ਇਹ ਭ੍ਰਿਸ਼ਟ ਸਨ:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 ਨਾ-ਸਹਿਯੋਗੀ ਫੋਟੋ ਛੱਡੀ ਗਈ:\n"
+msgstr[1] "%d ਨਾ-ਸਹਿਯੋਗੀ ਫੋਟੋਆਂ ਛੱਡੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 ਨਾਨ-ਇਮੇਜ਼ ਫਾਇਲ ਛੱਡੀ ਗਈ।\n"
+msgstr[1] "%d ਨਾਨ-ਇਮੇਜ਼ ਫਾਇਲਾਂ ਛੱਡੀਆਂ ਗਈਆਂ।\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ 1 ਫੋਟੋ ਛੱਡੀ ਗਈ:\n"
+msgstr[1] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ %d ਫੋਟੋਆਂ ਛੱਡੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ 1 ਵੀਡੀਓ ਛੱਡੀ ਗਈ:\n"
+msgstr[1] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ %d ਵੀਡੀਓ ਛੱਡੀਆਂ ਗਈਆਂ:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ 1 ਫੋਟੋ/ਵੀਡੀਓ ਛੱਡੀ ਗਈ ਹੈ:\n"
+msgstr[1] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ %d ਫੋਟੋਆਂ/ਵੀਡੀਓ ਛੱਡੀਆਂ ਗਈਆਂ ਹਨ:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ 1 ਫਾਇਲ ਛੱਡੀ ਗਈ:\n"
+msgstr[1] "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੱਦ ਕਰਕੇ %d ਫਾਇਲ ਛੱਡੀ ਗਈ:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "੧ ਫੋਟੋ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀ ਗਈ।\n"
+msgstr[1] "%d ਫੋਟੋ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਗਈਆਂ।\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 ਵਿਡੀਓ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀ ਗਈ।\n"
+msgstr[1] "%d ਵਿਡੀਓ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਗਈਆਂ।\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 ਫੋਟੋ/ਵਿਡੀਓ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀ ਗਈ।\n"
+msgstr[1] "%d ਫੋਟੋ/ਵਿਡੀਓ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਗਈਆਂ।\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "ਕੋਈ ਫੋਟੋ ਜਾਂ ਵਿਡੀਓ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਗਈ।\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "ਇੰਪੋਰਟ ਮੁਕੰਮਲ"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d ਸਕਿੰਟ"
+msgstr[1] "%d ਸਕਿੰਟ"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d ਮਿੰਟ"
+msgstr[1] "%d ਮਿੰਟ"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ਘੰਟਾ"
+msgstr[1] "%d ਘੰਟੇ"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ਦਿਨ"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "ਈਵੈਂਟ ਨਾਂ ਬਦਲੋ"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "ਨਾਂ:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "ਟਾਈਟਲ ਸੋਧ"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "ਈਵੈਂਟ ਟਿੱਪਣੀ ਸੋਧੋ"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "ਤਸਵੀਰ/ਵੀਡੀਓ ਟਿੱਪਣੀ ਸੋਧੋ"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ਫਾਇਲ ਰੱਦੀ 'ਚ(_T)"
+msgstr[1] "ਫਾਇਲਾਂ ਰੱਦੀ 'ਚ(_T)"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "ਕੇਵਲ ਹਟਾਓ(_R)"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "ਬਾਹਰੀ ਸੋਧ ਵਾਪਸ?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "ਬਾਹਰੀ ਸੋਧਾਂ ਵਾਪਸ?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "ਇਸ ਨਾਲ ਬਾਹਰੀ ਫਾਇਲ ਵਿਚਲੀਆਂ ਸਭ ਤਬਦੀਲੀਆਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ। ਜਾਰੀ?"
+msgstr[1] "ਇਸ ਨਾਲ %d ਬਾਹਰੀ ਫਾਇਲਾਂ ਵਿਚਲੀਆਂ ਸਭ ਤਬਦੀਲੀਆਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ। ਜਾਰੀ?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "ਬਾਹਰੀ ਸੋਧ ਵਾਪਸ ਲਵੋ(_v)"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "ਬਾਹਰੀ ਸੋਧ ਵਾਪਸ ਲਵੋ(_v)"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ਇਸ ਨਾਲ ਲਾਇਬਰੇਰੀ ਵਿੱਚੋਂ ਫੋਟੋ ਹਟਾਈ ਜਾਵੇਗੀ। ਜਾਰੀ?"
+msgstr[1] "ਇਸ ਨਾਲ ਲਾਇਬਰੇਰੀ ਵਿੱਚੋਂ %d ਫੋਟੋਆਂ ਹਟਾਈਆਂ ਜਾਣਗੀਆਂ। ਜਾਰੀ?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "ਹਟਾਓ(_R)"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਤੋਂ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਤੋਂ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "ਸਵੇਰ"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "ਸ਼ਾਮ"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "੨੪ ਘੰਟੇ"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "ਉਸੇ ਮਾਤਰਾ ਦੁਾਰਾ ਫੋਟੋਆਂ/ਵੀਡੀਓ ਸ਼ਿਫਟ ਕਰੋ(_S)"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "ਸਭ ਫੋਟੋ/ਵਿਡੀਓ ਲਈ ਇਹ ਸਮਾਂ ਸੈੱਟ ਕਰੋ"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "ਅਸਲੀ ਫੋਟੋ ਫਾਇਲ ਸੋਧੋ(_M)"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "ਅਸਲੀ ਫੋਟੋ ਫਾਇਲਾਂ ਸੋਧੋ(_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "ਅਸਲੀ ਫਾਇਲ ਸੋਧੋ(_M)"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "ਅਸਲੀ ਫਾਇਲਾਂ ਸੋਧੋ(_M)"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "ਅਸਲੀ: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ਐਕਸਪੋਜ਼ਰ ਟਾਈਮ ਅੱਗੇ ਸ਼ਿਫਟ ਕੀਤਾ ਜਾਵੇਗਾ ਇਹਨਾਂ ਦੁਆਰਾ\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ਐਕਸਪੋਜ਼ਰ ਟਾਈਮ ਪਿੱਛੇ ਸ਼ਿਫਟ ਕੀਤਾ ਜਾਵੇਗਾ ਇਹਨਾਂ ਦੁਆਰਾ\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ਦਿਨ"
+msgstr[1] "ਦਿਨ"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ਘੰਟਾ"
+msgstr[1] "ਘੰਟੇ"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "ਮਿੰਟ"
+msgstr[1] "ਮਿੰਟ"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "ਸਕਿੰਟ"
+msgstr[1] "ਸਕਿੰਟ"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"ਅਤੇ %d ਹੋਰ।"
+msgstr[1] ""
+"\n"
+"\n"
+"ਅਤੇ %d ਹੋਰ।"
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "ਟੈਗ (ਕਾਮਿਆਂ ਨਾਲ ਵੱਖ):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "ਜੀ ਆਇਆਂ ਨੂੰ!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "ਸ਼ੂਟਵੈੱਲ ਵਲੋਂ ਜੀ ਆਇਆਂ ਨੂੰ!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਇਹਨਾਂ ਢੰਗਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਨਾਲ ਫੋਟੋ ਇੰਪੋਰਟ ਕਰੋ:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "<span weight=\"bold\">ਫੋਲਡਰ ਵਿੱਚੋਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ %s ਫਾਇਲ</span> ਚੁਣੋ"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "ਫੋਟੋ ਨੂੰ ਸ਼ੂਟਵੈੱਲ ਵਿੰਡੋ ਵਿੱਚ ਡਰੈੱਗ ਡਰੋਪ ਕਰੋ"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "ਕੈਮਰਾ ਕੰਪਿਊਟਰ ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ ਤੇ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "ਆਪਣਾ %s ਫੋਲਡਰ ਤੋਂ ਫੋਟੋ ਇੰਪੋਰਟ ਕਰੋ(_I)"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "ਤੁਸੀਂ ਫੋਟੋ ਨੂੰ ਇਹ ਢੰਗਾਂ ਨਾਲ ਇੰਪੋਰਟ ਕਰ ਸਕਦੇ ਹੋ:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ਇਹ ਸੁਨੇਹਾ ਮੁੜ ਨਾ ਵੇਖਾਓ(_D)"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "ਆਪਣੀ %s ਲਾਇਬਰੇਰੀ ਤੋਂ ਫੋਟੋ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(ਮੱਦਦ)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Year%sMonth%sDay"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Year%sMonth"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Year%sMonth-Day"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Year-Month-Day"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "ਪਸੰਦੀਦਾ"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "ਗਲਤ ਪੈਟਰਨ"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"ਸ਼ਾਟਵੈੱਲ ਫੋਟੋਆਂ ਨੂੰ ਤੁਹਾਡੇ ਲਾਇਬਰੇਰੀ ਫੋਲਡਰ ਵਿੱਚ ਕਾਪੀ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਇਹਨਾਂ ਨੂੰ ਬਿਨਾਂ ਕਾਪੀ ਕੀਤੇ "
+"ਇੰਪੋਰਟ ਕਰ ਸਕਦੀ ਹੈ।"
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ਫੋਟੋ ਕਾਪੀ ਕਰੋ(_p)"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "ਥਾਂ ਵਿੱਚ ਇੰਪੋਰਟ(_I)"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "ਲਾਇਬਰੇਰੀ 'ਚ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਵਿੱਚੋਂ ਹਟਾਓ"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਤੋਂ ਹਟਾਓ"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਤੋਂ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[1] ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ਫੋਟੋ ਜਾਂ ਵਿਡੀਓ ਨੂੰ ਤੁਹਾਡੇ ਡੈਸਕਟਾਪ ਰੱਦੀ ਵਿੱਚ ਨਹੀਂ ਭੇਜਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਇਹ ਫਾਇਲ ਹਟਾਉਣੀ ਹੈ?"
+msgstr[1] ""
+"%d ਫੋਟੋ ਜਾਂ ਵਿਡੀਓ ਨੂੰ ਤੁਹਾਡੇ ਡੈਸਕਟਾਪ ਰੱਦੀ ਵਿੱਚ ਨਹੀਂ ਭੇਜਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਇਹਨਾਂ ਫਾਇਲਾਂ ਨੂੰ ਹਟਾਉਣਾ "
+"ਹੈ?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ਫੋਟੋ ਜਾਂ ਵਿਡੀਓ ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"
+msgstr[1] "%d ਫੋਟੋ/ਵਿਡੀਓ ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "ਫੋਲਡਰ"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ਟੈਗ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "ਸਫ਼ਲ"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "ਫਾਇਲ ਗਲਤੀ"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ਫਾਇਲ ਡੀਕੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "ਡਾਟਾਬੇਸ ਗਲਤੀ"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ਯੂਜ਼ਰ ਦੁਆਰਾ ਰੋਕਿਆ ਇੰਪੋਰਟ"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ਫਾਇਲ ਨਹੀਂ ਹੈ"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ਫਾਇਲ ਡਾਟਾਬੇਸ 'ਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਫਾਇਲ ਫਾਰਮੈਟ"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ਚਿੱਤਰ ਫਾਇਲ ਨਹੀਂ ਹੈ"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ਡਿਸਕ ਫੇਲ੍ਹ"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ਡਿਸਕ ਭਰ ਗਈ"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "ਕੈਮਰਾ ਗਲਤੀ"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ਫਾਇਲ ਲਿਖਣ ਗਲਤੀ"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "ਭ੍ਰਿਸ਼ਟ ਇਮੇਜ ਫਾਈਲ"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "ਇੰਪੋਰਟ ਕਰਨਾ ਫੇਲ੍ਹ (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "ਕੀਤੀ ਸੋਧ"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "ਪਿਛਲੀ ਫੋਟੋ"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "ਅਗਲੀ ਫੋਟੋ"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ਫੋਟੋ ਸਰੋਤ ਫਾਇਲ ਗੁੰਮ ਹੈ: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "ਵੇਖੋ(_V)"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "ਟੂਲ(_o)"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "ਪਿਛਲੀ ਫੋਟੋ(_P)"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "ਪਿਛਲੀ ਫੋਟੋ"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "ਅਗਲੀ ਫੋਟੋ(_N)"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "ਅਗਲੀ ਫੋਟੋ"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "ਜ਼ੂਮ ਇਨ(_I)"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ਫੋਟੋ ਦੀ ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਵਧਾਓ"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "ਜ਼ੂਮ ਆਉਟ(_O)"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ਫੋਟੋ ਦੀ ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਘਟਾਓ"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "ਪੇਜ਼ ਲਈ ਫਿੱਟ(_P)"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "ਸਕਰੀਨ ਵਿੱਚ ਫਿੱਟ ਹੋਣ ਲਈ ਫੋਟੋ ਜ਼ੂਮ ਕਰੋ"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "ਜ਼ੂਮ _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ਫੋਟੋ ਨੂੰ ੧੦੦% ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "ਜ਼ੂਮ _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ਫੋਟੋ ਨੂੰ ੨੦੦% ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "ਡਿਵੈਲਪਰ(_D)"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s ਐਕਸਪੋਰਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ਡਾਟਾਬੇਸ"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s ਤੋਂ ਇੰਪੋਰਟ ਜਾਰੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "ਹੋਰ ਜੰਤਰ ਤੋਂ ਇੰਪੋਰਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ, ਉੱਪਰਲੇ ਮੇਨੂ ਵਿੱਚੋਂ ਕੋਈ ਇੱਕ ਚੁਣੋ।"
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "ਡਾਟਾ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਡਾਟਾ ਇੰਪੋਰਟ ਪਲੱਗਇਨ ਯੋਗ ਨਹੀਂ ਹੈ।\n"
+"\n"
+"ਐਪਲੀਕੇਸ਼ਨ ਫੰਕਸ਼ਨੈਲਿਟੀ ਵਿੱਚੋਂ ਇੰਪੋਰਟ ਵਰਤਣ ਲਈ, ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਡਾਟਾ ਇੰਪੋਰਟ ਪਲੱਗਇਨ ਯੋਗ ਕਰਨ ਦੀ "
+"ਲੋੜ ਹੈ। ਪਲੱਗਇਨ ਨੂੰ ਪਸੰਦੀ ਸਹਾਇਕ ਵਿੱਚ ਯੋਗ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "ਡਾਟਾਬੇਸ ਫਾਇਲ:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "ਇੰਪੋਰਟ(_I)"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "ਐਪਲੀਕੇਸ਼ਨ ਤੋਂ ਇੰਪੋਰਟ"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "ਮੀਡੀਆ ਜਿਸਤੋਂ ਇੰਪੋਰਟ ਕਰਨਾ(_f):"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "ਬੰਦ ਕਰੋ(_C)"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "ਸੈਟਿੰਗ"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "ਸਲਾਇਡ-ਸ਼ੋ"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "ਪਿੱਛੇ"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "ਪਿਛਲੀ ਫੋਟੋ ਉੱਤੇ ਜਾਓ"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "ਵਿਰਾਮ"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "ਸਲਾਈਡ-ਸ਼ੋ ਰੋਕੋ"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "ਅੱਗੇ"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "ਅਗਲੀ ਫੋਟੋ ਉੱਤੇ ਜਾਓ"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "ਸਲਾਈਡ-ਸ਼ੋ ਸੈਟਿੰਗ ਬਦਲੋ"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ਸਭ ਫੋਟੋ ਸਰੋਤ ਗੈਰਮੌਜੂਦ ਹਨ।"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "ਚਲਾਓ"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "ਸਲਾਈਡ-ਸ਼ੋ ਜਾਰੀ ਰੱਖੋ"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "ਰੀਵਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "ਰੀਵਰਟ ਨੂੰ ਵਾਪਸ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "ਇੰਹਾਂਸ ਕਰਨਾ"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "ਇੰਹਾਂਸ ਵਾਪਸ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "ਰੰਗ ਰੂਪਾਂਤਰ ਲਾਗੂ ਕਰ ਰਿਹਾ"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "ਲਾਗੂ ਰੰਗ ਰੂਪਾਂਤਰ ਹਟਾ ਰਿਹਾ"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "ਨਵਾਂ ਸਮਾਗਮ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ਸਮਾਗਮ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ਫੋਟੋ ਨੂੰ ਨਵੇਂ ਸਮਾਗਮ 'ਚ ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ਪਿਛਲੇ ਸਮਾਗਮ ਲਈ ਫੋਟੋ ਸੈਟਿੰਗ"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "ਮਿਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "ਅਨਮਰਜਿੰਗ"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ਫੋਟੋੋ ਡੁਪਲੀਕੇਟ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "ਡੁਪਲੀਕੇਟ ਫੋਟੋ ਹਟਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ਫਾਇਲ ਗਲਤੀ ਕਰਕੇ ਇੱਕ ਫੋਟੋ ਡੁਪਲੀਕੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+msgstr[1] "ਫਾਇਲ ਗਲਤੀਆਂ ਕਰਕੇ %d ਫੋਟੋ ਡੁਪਲੀਕੇਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "ਪਿਛਲੀ ਰੇਟਿੰਗ ਮੁੜ-ਸਟੋਰ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "ਰੇਟਿੰਗ ਵਧਾਈ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "ਰੇਟਿੰਗ ਘਟਾਈ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW ਡਿਵੈਲਪਰ ਸੈੱਟ ਕਰ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "ਪਿਛਲੇ RAW ਡਿਵੈਲਪਰ ਨੂੰ ਰੀਸਟੋਰ ਕਰ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "ਡਿਵੈਲਪਰ ਸੈੱਟ ਕਰੋ"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "ਅਸਲੀ ਫੋਟੋ ਨੂੰ ਅਡਜੱਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਅਡਜੱਸਟ ਕਰੋ"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਅਡਜੱਸਟ ਕਰਨ ਨੂੰ ਵਾਪਸ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ਅਸਲੀ ਫੋਟੋ ਨੂੰ ਅਡਜੱਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"
+msgstr[1] "ਅਸਲੀ ਫੋਟੋਆਂ ਨੂੰ ਅਡਜੱਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "ਸਮਾਂ ਅਡਜੱਸਟਮੈਂਟ ਗਲਤੀ"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "ਅੱਗੇ ਦਿੱਤੀ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।"
+msgstr[1] "ਅੱਗੇ ਦਿੱਤੀਆਂ ਫਾਇਲਾਂ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ਟੈਗ ਬਣਾਓ"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "ਟੈਗ \"%s\" ਬਦਲੋ"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ਫੋਟੋ ਰੱਦੀ 'ਚ ਭੇਜੋ"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "ਫੋਟੋ ਰੱਦੀ 'ਚੋਂ ਮੁੜ-ਸਟੋਰ ਕਰੋ"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ਫੋਟੋ ਸ਼ੂਟਵੈੱਲ ਰੱਦੀ 'ਚ ਭੇਜੋ"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ਫੋਟੋਆਂ ਨੂੰ ਵਾਪਸ ਸ਼ਾਟਵੈੱਲ ਲਾਇਬਰੇਰੀ ਵਿੱਚ ਰੀਸਟੋਰ ਕਰੋ"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ਫੋਟੋ ਰੱਦੀ 'ਚ ਭੇਜੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "ਰੱਦੀ ਤੋਂ ਫੋਟੋ ਮੁੜ-ਸਟੋਰ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋ ਫਲੈਗ ਕਰੋ"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "ਚੁਣੀ ਫੋਟੋ ਦਾ ਫਲੈਗ ਹਟਾਓ"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "ਚੁਣੀਆਂ ਤਸਵੀਰਾਂ ਨੂੰ ਨਿਸ਼ਾਨੀਬੱਧ ਕਰ ਰਿਹਾ"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "ਚੁਣੀਆਂ ਤਸਵੀਰਾਂ ਤੋਂ ਨਿਸ਼ਾਨੀਆਂ ਹਟਾ ਰਿਹਾ"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "ਫਲੈਗ"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "ਫਲੈਗ ਹਟਾਓ"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "ਸ਼ੂਟਵੈੱਲ"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "ਘੱਟ (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "ਮੱਧਮ (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "ਵੱਧ (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "ਸਭ ਤੋਂ ਵੱਧ (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "ਕੋਈ ਫੋਟੋ/ਵਿਡੀਓ"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "ਕੋਈ ਫੋਟੋ/ਵਿਡੀਓ ਨਹੀਂ ਲੱਭੀ"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ਇਸ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਫੋਟੋ ਐਕਸਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "ਨਿਗਰਾਨੀ ਅੱਪਡੇਟ ਵਰਤਣ ਤੋਂ ਅਸਮਰਥ: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "ਪੂਰਾ ਪੇਜ਼ ਭਰੋ"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 2 ਚਿੱਤਰ"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 4 ਚਿੱਤਰ"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 6 ਚਿੱਤਰ"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 8 ਚਿੱਤਰ"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 16 ਚਿੱਤਰ"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ਹਰੇਕ ਪੇਜ਼ ਲਈ 32 ਚਿੱਤਰ"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "ਇੰਚ"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "ਵਾਲਿਟ (੨ x ੩ ਇੰਚ)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "ਨੋਟਕਾਰਡ (3 x 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "੪ x ੬ ਇੰਚ"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "੫ x ੭ ਇੰਚ"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "੮ x ੧੦ ਇੰਚ"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "੧੧ x ੧੪ ਇੰਚ"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "੧੬ x ੨੦ ਇੰਚ"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "ਮੀਟਰਿਕ ਵੈਲੇਟ (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "ਪੋਸਟਕਾਰਡ (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "੧੨ x ੧੮ cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "੧੮ x ੨੪ cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "੨੦ x ੩੦ cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "੨੪ x ੪੦ cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "੩੦ x ੪੦ cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ਚਿੱਤਰ ਸੈਟਿੰਗ"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "...ਪਰਿੰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ਫੋਟੋ ਪਰਿੰਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ਫੋਟੋ ਡਾਟਾਬੇਸ %s ਬਣਾਉਣ/ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ: ਗਲਤੀ ਕੋਡ %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ਫੋਟੋ ਡਾਟਾਬੇਸ ਫਾਇਲ ਲਿਖਣ ਲਈ ਅਸਮਰੱਥ:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"ਡਾਟਾਬੇਸ ਫਾਇਲ ਵਰਤਣ ਲਈ ਗਲਤੀ:\n"
+"%s\n"
+"\n"
+"ਗਲਤੀ ਸੀ: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "ਵਿਡੀਓ ਐਕਸਪੋਰਟ ਕਰੋ"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "ਨਟੀਲਸ ਭੇਜਣ ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "ਭੇਜੋ"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "ਬੈਕਗਰਾਊਂਡ %s ਲਈ ਐਕਸਪੋਰਟ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "ਡੈਸਕਟਾਪ ਸਲਾਈਡ-ਸ਼ੋ ਤਿਆਰ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "ਫਲੈਗ ਹੈ"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ਰੱਦੀ"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ਰੱਦੀ ਖਾਲੀ ਹੈ"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "ਹਟਾਓ"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ਫੋਟੋ ਹਟਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "ਗੁੰਮ ਫਾਇਲਾਂ"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "...ਹਟਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "ਆਖਰੀ ਇੰਪੋਰਟ"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "...ਫੋਲਡਰ ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ(_I)"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "ਡਿਸਕ ਤੋਂ ਫੋਟੋ ਨੂੰ ਲਾਇਬਰੇਰੀ ਵਿੱਚ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "...ਐਪਲੀਕੇਸ਼ਨ ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ(_A)"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "ਈਵੈਂਟ ਲੜੀਬੱਧ(_E)"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ਰੱਦੀ ਖਾਲੀ ਕਰੋ(_r)"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "ਰੱਦੀ 'ਚੋਂ ਸਭ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ਫੋਟੋ ਵਿੱਚ ਈਵੈਂਟ ਵੇਖੋ(_n)"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "ਖੋਜ(_F)"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "ਖੋਜ ਅਨੁਸਾਰ ਫੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਲੱਭੋ"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "ਫਾਇਲ(_F)"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "ਸੋਧ(_E)"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "ਫੋਟੋ(_P)"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ਫੋਟੋ(_P)"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "ਈਵੈਂਟ(_t)"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "ਟੈਗ(_g)"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "ਮੱਦਦ(_H)"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ(_B)"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "ਚੋਣ ਬਾਰੇ ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ ਵੇਖਾਓ"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "ਪੂਰੀ ਜਾਣਕਾਰੀ(_x)"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "ਚੋਣ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਵੇਖਾਓ"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "ਖੋਜ ਪੱਟੀ(_S)"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "ਖੋਜ ਪੱਟੀ ਵੇਖਾਓ"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "ਪਾਸੇ ਵਾਲੀ ਬਾਹੀ (_i)"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "ਪਾਸੇ ਵਾਲੀ ਬਾਹੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "ਵੱਧਦੇ ਕ੍ਰਮ(_A)"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "ਫੋਟੋਆਂ ਵਧਦੇ ਕ੍ਰਮ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "ਘੱਟਦੇ ਕ੍ਰਮ(_e)"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "ਫੋਟੋਆਂ ਘਟਦੇ ਕ੍ਰਮ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "ਫੋਲਡਰ ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ਰੱਦੀ ਖਾਲੀ ਕਰੋ"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "...ਰੱਦੀ ਖਾਲੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "ਸ਼ੂਟਵੈੱਲ ਤੁਹਾਡੀ ਘਰ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਫੋਟੋ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਸੰਰਚਿਤ ਹੈ।\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "ਲਾਇਬਰੇਰੀ ਟਿਕਾਣਾ"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ਇਸ ਡਾਇਰੈਕਟਰੀ ਤੋਂ ਫੋਟੋ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "...ਲਾਇਬਰੇਰੀ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "...ਆਟੋ-ਇੰਪੋਰਟ ਫੋਟੋ ਲਈ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "...ਫੋਟੋ ਆਟੋ-ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "...ਫਾਇਲਾਂ ਲਈ ਮੇਟਾਡਾਟਾ ਲਿਖਿਆ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ਲਾਇਬਰੇਰੀ"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "...ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "ਇੰਪੋਰਟ ਰੋਕੋ(_S)"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ਫੋਟੋ ਇੰਪੋਰਟ ਕਰਨ ਨੂੰ ਰੋਕੋ"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "...ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਤਿਆਰੀ"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s ਇੰਪੋਰਟ ਕੀਤੀਆਂ"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "ਸੰਭਾਲੋ(_S)"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ਫੋਟੋ ਸੰਭਾਲੋ"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "...ਵਜੋਂ ਸੰਭਾਲੋ(_A)"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ਫੋਟੋ ਵੱਖਰੇ ਨਾਂ ਨਾਲ ਸੰਭਾਲੋ"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "ਫੋਟੋ ਨੂੰ ਆਪਣੇ ਸਿਸਟਮ ਨਾਲ ਜੁੜੇ ਪਰਿੰਟਰ ਤੇ ਪਰਿੰਟ ਕਰੋ"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ਮੌਜੂਦ ਨਹੀਂ ਹੈ।"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ਫਾਇਲ ਨਹੀਂ ਹੈ।"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ਦੁਆਰਾ %s ਦੇ ਫਾਇਲ ਫਾਰਮੈਟ ਨੂੰ\n"
+"ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।"
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "ਕਾਪੀ ਸੰਭਾਲੋ(_S)"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s ਲਈ ਬਦਲਾਅ ਖਤਮ ਕਰਨੇ ਹਨ?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "ਬਿਨਾਂ ਸੰਭਾਲੇ ਬੰਦ(_w)"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s ਸੰਭਾਲਣ ਦੌਰਾਨ ਗਲਤੀ: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "ਇੰਝ ਸੰਭਾਲੋ"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s ਦਾ ਪਰਬੰਧਨ ਨਹੀਂ ਕਰ ਸਕਦਾ: ਇੱਕ ਡਾਇਰੈਕਟਰੀ (%s) ਨਹੀਂ ਹੈ"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ਫੋਟੋ ਮੈਨੇਜਰ"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ਫੋਟੋ ਦਰਸ਼ਕ"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "ਨਕਲ ਹੱਕ 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "ਸੱਜੇ ਘੁੰਮਾਓ(_R)"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "ਘੁੰਮਾਓ"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "ਸੱਜੇ ਘੁੰਮਾਓ"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "ਫੋਟੋਆਂ ਸੱਜੇ ਘੁੰਮਾਓ (ਖੱਬੇ ਘੁਮਾਉਣ ਲਈ Ctrl ਦਬਾਓ)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "ਖੱਬੇ ਘੁੰਮਾਓ(_L)"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "ਖੱਬੇ ਘੁੰਮਾਓ"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ਫੋਟੋ ਨੂੰ ਖੱਬੇ ਘੁੰਮਾਓ"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "ਹਰੀਜੱਟਲ ਪਲਟੋ(_z)"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "ਖਿਤਿਜੀ ਝਟਕੋ"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "ਵਰਟੀਕਲ ਪਲਟੋ(_c)"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "ਲੰਬਕਾਰੀ ਝਟਕੋ"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "ਇੰਹਾਂਸ(_E)"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "ਇੰਹਾਂਸ"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "ਫੋਟੋ ਦੀ ਦਿੱਖ ਆਪਣੇ-ਆਪ ਸੁਧਾਰੋ"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "ਰੰਗ ਅਨੁਕੂਲਤਾ ਨਕਲ ਕਰੋ (_C)"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "ਰੰਗ ਅਨੁਕੂਲਤਾ ਨਕਲ ਕਰੋ"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "ਤਸਵੀਰ ਤੇ ਲਾਗੂ ਰੰਗ ਅਨੁਕੂਲਤਾ ਨਕਲ ਕਰੋ"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "ਰੰਗ ਅਨੁਕੂਲਤਾ ਚੇਪੋ (_P)"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "ਰੰਗ ਅਨੁਕੂਲਤਾ ਚੇਪੋ"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "ਚੁਣੀਆਂ ਹੋਈਆਂ ਤਸਵੀਰਾਂ ਤੇ ਨਕਲ ਕੀਤੀਆਂ ਰੰਗ ਅਨੁਕੂਲਤਾ ਲਾਗੂ ਕਰੋ"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "ਕਰੋਪ(_C)"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "ਕਰੋਪ"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ਫੋਟੋ ਦਾ ਆਕਾਰ ਕਰੋਪ ਕਰੋ"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "ਸਿੱਧਾ ਕਰੋ(_S)"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "ਸਿੱਧਾ ਕਰੋ"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "ਫੋਟੋ ਸਿੱਧੀ ਕਰੋ"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "ਰੈੱਡ-ਆਈ(_R)"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "ਰੈੱਡ ਆਈ"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ਫੋਟੋ ਵਿਚਲੇ ਲਾਲ-ਅੱਖ ਪ੍ਰਭਾਵ ਨੂੰ ਹਟਾਓ"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "ਅਡਜੱਸਟ(_A)"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "ਅਡਜੱਸਟ"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ਫੋਟੋ ਦਾ ਰੰਗ ਅਤੇ ਟੋਨ ਅਡਜੱਸਟ ਕਰੋ"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "ਅਸਲੀ ਲਈ ਬਦਲੋ(_v)"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "ਅਸਲੀ ਲਈ ਬਦਲੋ"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "ਬਾਹਰੀ ਸੋਧਾਂ ਵਾਪਸ(_d)"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "ਮੁੱਖ ਫੋਟੋ ਵੱਲ ਵਾਪਸ"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ਡੈਸਕਟਾਪ ਬੈਕਗਰਾਊਂਡ ਵਜੋਂ ਸੈੱਟ ਕਰੋ(_D)"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "ਚੁਣੇ ਚਿੱਤਰ ਨੂੰ ਨਵੀਂ ਡੈਸਕਟਾਪ ਬੈਕਗਰਾਊਂਡ ਸੈੱਟ ਕਰੋ"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "...ਡੈਸਕਟਾਪ ਸਲਾਇਡ-ਸ਼ੋ ਵਜੋਂ ਸੈੱਟ ਕਰੋ(_D)"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "ਵਾਪਸ(_U)"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "ਵਾਪਸ"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "ਪਰਤਾਓ(_R)"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "ਪਰਤਾਓ"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "...ਈਵੈਂਟ ਨਾਂ ਬਦਲੋ(_n)"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "ਈਵੈਂਟ ਲਈ ਮੁੱਖ ਫੋਟੋ ਬਣਾਓ(_K)"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "ਈਵੈਂਟ ਲਈ ਮੁੱਖ ਫੋਟੋ ਬਣਾਓ"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "ਨਵਾਂ ਈਵੈਂਟ(_N)"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "ਨਵਾਂ ਈਵੈਂਟ"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ਫੋਟੋ ਭੇਜੋ"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ਫੋਟੋ ਈਵੈਂਟ 'ਚ ਭੇਜੋ"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "ਈਵੈਂਟ ਰਲਾਓ(_M)"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "ਰਲਾਉ"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "ਬਹੁ-ਈਵੈਂਟ ਨੂੰ ਇੱਕ ਈਵੈਂਟ ਵਿੱਚ ਜੋੜੋ"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "ਰੇਟਿੰਗ ਦਿਓ(_S)"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "ਰੇਟਿੰਗ ਦਿਓ"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "ਆਪਣੀ ਫੋਟੋ ਦੀ ਰੇਟਿੰਗ ਬਦਲੋ"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "ਵਧਾਓ(_I)"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "ਰੇਟਿੰਗ ਵਧਾਓ"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "ਘਟਾਓ(_D)"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "ਰੇਟਿੰਗ ਘਟਾਓ"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "ਅਨਰੇਟਡ(_U)"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "ਬਿਨ-ਰੇਟ"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "ਅਨਰੇਟਡ ਨੂੰ ਰੇਟ ਕਰੋ"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "ਅਨਰੇਟਡ ਸੈਟਿੰਗ ਕਰੋ"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "ਕੋਈ ਰੇਟਿੰਗ ਹਟਾਓ"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "ਰੱਦ ਕੀਤੀ(_R)"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "ਰੱਦ ਕੀਤੀ"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "ਰੱਦ ਕਰੇ ਰੇਟ ਕਰੋ"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "ਰੱਦ ਕੀਤਾ ਸੈਟਿੰਗ ਕਰੋ"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "ਰੇਟਿੰਗ ਨੂੰ ਰੱਦ ਕੀਤਾ ਸੈੱਟ ਕਰੋ"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "ਸਿਰਫ ਰੱਦ ਕੀਤਾ(_O)"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "ਕੇਵਲ ਰੱਦ ਕੀਤੀਆਂ"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "ਕੇਵਲ ਰੱਦ ਕੀਤੀਆਂ ਫੋਟੋ ਹੀ ਵੇਖਾਓ"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "ਸਭ + ਰੱਦ ਕੀਤੀਆਂ(_R)"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "ਸਭ ਫੋਟੋ ਵੇਖਾਓ, ਰੱਦ ਕੀਤੀਆਂ ਸਮੇਤ"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "ਸਭ ਫੋਟੋ(_A)"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "ਸਭ ਫੋਟੋ ਵੇਖਾਓ"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "ਰੇਟਿੰਗ(_R)"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "ਹਰੇਕ ਫੋਟੋ ਦੀ ਰੇਟਿੰਗ ਵੇਖਾਓ"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ਫੋਟੋ ਫਿਲਟਰ(_F)"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ਫੋਟੋ ਫਿਲਟਰ ਕਰੋ"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "ਫਿਲਟਰ ਦੇ ਅਧਾਰ ਤੇ ਵੇਖਾਈਆਂ ਫੋਟੋ ਦੀ ਗਿਣਤੀ ਸੀਮਿਤ ਕਰੋ"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "ਡੁਪਲੀਕੇਟ(_D)"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "ਡੁਪਲੀਕੇਟ"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ਫੋਟੋ ਦੀ ਡੁਪਲੀਕੇਟ ਕਾਪੀ ਬਣਾਓ"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "...ਐਕਸਪੋਰਟ(_E)"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "...ਪਰਿੰਟ ਕਰੋ(_P)"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "...ਪਬਲਿਸ਼ ਕਰੋ(_b)"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "ਕਈ ਸਾਈਟਾਂ ਉੱਤੇ ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "...ਟਾਈਟਲ ਸੋਧ(_T)"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "ਟਿੱਪਣੀ ਸੋਧੋ(_C)..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "ਟਿੱਪਣੀ ਸੋਧੋ"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "ਈਵੈਂਟ ਕਮੈਂਟ ਸੋਧੋ (_C)..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "...ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਅਡਜੱਸਟ ਕਰੋ(_A)"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "ਮਿਤੀ ਅਤੇ ਸਮਾਂ ਅਡਜੱਸਟ ਕਰੋ"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "...ਟੈਗ ਸ਼ਾਮਲ ਕਰੋ(_T)"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "...ਟੈਗ ਸ਼ਾਮਿਲ(_A)"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "ਟੈਗ ਸ਼ਾਮਲ"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ(_P)"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "ਬਾਹਰੀ ਐਡੀਟਰ ਨਾਲ ਖੋਲ੍ਹੋ(_x)"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RA_W ਐਡੀਟਰ ਨਾਲ ਖੋਲ੍ਹੋ"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "...ਨੂੰ ਭੇਜੋ(_T)"
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "...ਨੂੰ ਭੇਜੋ(_o)"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "...ਖੋਜ(_F)"
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "ਖੋਜ"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "ਨਾਂ ਜਾਂ ਟੈਗ ਵਿਚਲਾ ਟੈਕਸਟ ਟਾਈਪ ਕਰਕੇ ਈਮੇਜ਼ ਲੱਭੋ"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "ਫਲੈਗ(_F)"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "ਫਲੈਗ ਹਟਾਓ(_f)"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "ਐਡੀਟਰ ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "ਟੈਗ \"%s\" ਸ਼ਾਮਲ"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" ਅਤੇ \"%s\" ਟੈਗ ਸ਼ਾਮਿਲ"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "ਟੈਗ \"%s\" ਹਟਾਓ(_D)"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "ਟੈਗ \"%s\" ਹਟਾਓ"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ਟੈਗ ਹਟਾਓ"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "ਨਵਾਂ(_N)"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "...\"%s\" ਟੈਗ ਨਾਂ ਬਦਲੋ(_n)"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "ਟੈਗ ਨੂੰ \"%s\" ਤੋਂ \"%s\" ਰੀਨੇਮ ਕਰੋ"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "...ਨਾਂ ਬਦਲੋ(_R)"
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "...ਟੈਗ ਸੋਧ(_y)"
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "ਟੈਗ ਸੋਧੋ"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ਫੋਟੋ ਨੂੰ \"%s\" ਵਾਂਗ ਟੈਗ ਕਰੋ"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ਫੋਟੋ ਨੂੰ \"%s\" ਵਾਂਗ ਟੈਗ ਕਰੋ"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "ਚੁਣੀ ਫੋਟੋ ਨੂੰ \"%s\" ਵਾਂਗ ਟੈਗ ਕਰੋ"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋਆਂ ਨੂੰ \"%s\" ਵਾਂਗ ਟੈਗ ਕਰੋ"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ਟੈਗ \"%s\" ਨੂੰ ਫੋਟੋ ਤੋਂ ਹਟਾਓ(_P)"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ਟੈਗ \"%s\" ਨੂੰ ਫੋਟੋਆਂ ਤੋਂ ਹਟਾਓ(_P)"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ਫੋਟੋ ਤੋਂ \"%s\" ਟੈਗ ਹਟਾਓ"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ਫੋਟੋਆਂ ਤੋਂ \"%s\" ਟੈਗ ਹਟਾਓ"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "ਟੈਗ ਦਾ ਨਾਂ \"%s\" ਦੇਣ ਤੋਂ ਅਸਮਰਥ ਕਿਉਂਕਿ ਟੈਗ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "ਖੋਜ ਦਾ ਨਾਂ \"%s\" ਦੇਣ ਤੋਂ ਅਸਮਰਥ ਕਿਉਂਕਿ ਖੋਜ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "ਸੰਭਾਲੀ ਖੋਜ"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "ਖੋਜ ਹਟਾਓ"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "...ਸੋਧ(_E)"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "...ਨਾਂ ਬਦਲੋ(_n)"
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "ਖੋਜ ਦਾ ਨਾਂ \"%s\" ਤੋਂ \"%s\" ਬਦਲੋ"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" ਖੋਜ ਹਟਾਓ"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s ਰੇਟ"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "ਰੇਟਿੰਗ %s ਸੈੱਟ ਕਰੋ"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "ਰੇਟਿੰਗ %s ਸੈੱਟ ਕਰੋ"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s ਡਿਸਪਲੇਅ"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s ਰੇਟਿੰਗ ਦੀਆਂ ਹੀ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ਜਾਂ ਵਧੀਆ"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s ਜਾਂ ਵਧੀਆ ਵੇਖਾਓ"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "ਸਿਰਫ ਉਹੀ ਫੋਟੋ ਵੇਖਾਓ ਜਿਨਾਂ ਦੀ ਰੇਟਿੰਗ %s ਜਾਂ ਵਧੀਆਂ ਹੈ"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "ਰੱਦੀ ਵਿੱਚੋਂ ਚੁਣੀਆਂ ਫੋਟੋਆਂ ਹਟਾਓ"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "ਲਾਇਬਰੇਰੀ ਤੋਂ ਚੁਣੀਆਂ ਫੋਟੋ ਹਟਾਓ"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "ਰੀਸਟੋਰ(_R)"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋਆਂ ਨੂੰ ਲਾਇਬਰੇਰੀ ਵਿੱਚ ਵਾਪਸ ਲਿਜਾਓ"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ਫਾਇਲ ਮੈਨੇਜਰ ਨਾਲ ਖੋਲ੍ਹੋ(_g)"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ਚੁਣੀ ਫੋਟੋ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਫਾਇਲ ਮੈਨੇਜਰ ਵਿੱਚ ਖੋਲੋ"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ਫਾਇਲ ਮੈਨੇਜਰ ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "ਲਾਇਬਰੇਰੀ ਵਿੱਚੋਂ ਹਟਾਓ(_e)"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ਰੱਦੀ ਵਿੱਚ ਭੇਜੋ(_M)"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "ਸਭ ਚੁਣੋ(_A)"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "ਸਭ ਆਈਟਮਾਂ ਚੁਣੋ"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "ਕੋਣ:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "ਮੁੜ-ਸੈੱਟ(_R)"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "ਮੌਜੂਦਾ ਫੋਟੋ ਦਿਸ਼ਾਵਾਂ ਵਿੱਚ ਜਾਓ"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "ਇਹ ਫੋਟੋ ਲਈ ਕਰੋਪ ਸੈੱਟ ਕਰੋ"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "ਕੱਟੇ ਆਇਤ ਨੂੰ ਪੋਰਟਰੇਟ ਅਤੇ ਲੈਂਡਸਕੇਪ ਦਿਸ਼ਾਵਾਂ ਵਿੱਚ ਪਿਵੋਟ ਕਰੋ"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "ਬਿਨਾਂ ਹੱਦ"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "ਵਰਗ"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "ਸਕਰੀਨ"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "ਅਸਲੀ ਆਕਾਰ"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD ਵਿਡੀਓ (੪ : ੩)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD ਵਿਡੀਓ (੧੬ : ੯)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "ਪੱਤਰ (8.5 x 11 ਇੰਚ)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "ਟਾਬਲੋਇਡ (11 x 17 ਇੰਚ)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "ਰੈੱਡ-ਆਈ ਟੂਲ ਬੰਦ ਕਰੋ"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "ਚੁਣੇ ਖੇਤਰ ਵਿੱਚ ਲਾਲ-ਅੱਖ ਦਾ ਪ੍ਰਭਾਵ ਹਟਾਓ"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "ਸੰਤ੍ਰਿਪਤ:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "ਟਿੰਟ:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "ਤਾਪਮਾਨ:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "ਸ਼ੈਡੋ:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "ਮੁੱਖ ਗੱਲਾਂ:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "ਰੰਗ ਮੁੜ-ਸੈੱਟ"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "ਸਭ ਸਥਾਪਨ ਅਸਲੀ ਬਣਾਓ"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "ਤਾਪਮਾਨ"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "ਟਿੰਟ"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "ਸੰਤ੍ਰਿਪਤਾ"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "ਐਕਸਪੋਜ਼ਰ"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "ਸ਼ੈਡੋ"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "ਮੁੱਖ ਗੱਲਾਂ"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "ਉਭਾਰ ਵਾਧਾ"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "ਟੂਲਬਾਰ ਪਿੰਨ ਕਰੋ"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "ਟੂਲਬਾਰ ਪਿੰਨ ਕਰੋ"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "ਪੂਰੀ ਸਕਰੀਨ ਛੱਡੋ"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "ਪੂਰੀ ਸਕਰੀਨ ਛੱਡੋ(_F)"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "ਬਾਹਰ(_Q)"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "ਇਸ ਬਾਰੇ(_A)"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "ਪੂਰੀ ਸਕਰੀਨ(_c)"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "ਸਮੱਗਰੀ(_C)"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "ਆਮ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ(_F)"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "...ਸਮੱਸਿਆ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦਿਉ(_R)"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"ਸ਼ਾਟਵੈੱਲ ਦੀ ਲਾਇਬਰੇਰੀ ਵਰਤਣ ਸਮੇਂ ਘਾਤਕ ਗਲਤੀ ਆਈ ਹੈ। ਸ਼ਾਟਵੈੱਲ ਜਾਰੀ ਨਹੀਂ ਰਹਿ ਸਕਦਾ।\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "ਯੋਰਬਾ ਵੈੱਬ ਸਾਈਟ ਵੇਖੋ"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"ਅਮਨਦੀਪ ਸਿੰਘ ਸੈਣੀ <jimidar@gmail.com>, ਜਸਵਿੰਦਰ ਸਿੰਘ ਫੂਲੇਵਾਲਾ <j.phulewala@gmail."
+"com>, ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ <aalam@users.sf.net>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "ਮੱਦਦ ਵੇਖਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "ਬੱਗ ਡਾਟਾਬੇਸ ਵਿੱਚ ਵੇਖਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "ਸਵਾਲ-ਜਵਾਬ ਵੇਖਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "ਬਿਨ-ਨਾਂ"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "ਅਸਲੀ ਅਕਾਰ"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "ਚੌੜਾਈ ਜਾਂ ਉਚਾਈ"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "ਚੌੜਾਈ"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ਉਚਾਈ"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "ਥੰਬਨੇਲ ਦਾ ਅਕਾਰ ਅਨੁਕੂਲ ਕਰੋ"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "ਥੰਬਨੇਲ ਦੀ ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਵਧਾਓ"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "ਥੰਬਨੇਲ ਦੀ ਮੈਗਨੀਫਿਕੇਸ਼ਨ ਘਟਾਓ"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ਫੋਟੋ ਲੜੀਬੱਧ(_P)"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "ਵਿਡੀਓ ਚਲਾਓ(_P)"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "ਚੁਣੇ ਵਿਡੀਓ ਨੂੰ ਸਿਸਟਮ ਵਿਡੀਓ ਪਲੇਅਰ ਨਾਲ ਖੋਲ੍ਹੋ"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "ਟਿੱਪਣੀਆਂ (_C)"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ਹਰੇਕ ਤਸਵੀਰ ਦੀ ਟਿੱਪਣੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ਹਰੇਕ ਫੋਟੋ ਲਈ ਟੈਗ ਵੇਖਾਓ"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "ਨਾਂ ਮੁਤਾਬਕ(_T)"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "ਫੋਟੋ ਟਾਈਟਲ ਰਾਹੀਂ ਲੜੀਬੱਧ"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "ਪਹੁੰਚ ਮਿਤੀ ਤੱਕ(_D)"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "ਫੋਟੋਆਂ ਨੂੰ ਪਹੁੰਚ ਮਿਤੀ ਮੁਤਾਬਿਕ ਕ੍ਰਮਬੱਧ ਕਰੋ"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "ਰੇਟਿੰਗ ਮੁਤਾਬਕ(_R)"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "ਰੇਟਿੰਗ ਅਨੁਸਾਰ ਕ੍ਰਮਬੱਧ"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"ਸ਼ੂਟਵੈੱਲ ਚੁਣੀ ਵਿਡੀਓ ਚਲਾਉਣ ਲਈ ਅਸਮਰੱਥ:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ਫੋਟੋ/ਵਿਡੀਓ"
+msgstr[1] "%d ਫੋਟੋ/ਵਿਡੀਓ"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ਹਰੇਕ ਈਵੈਂਟ ਦੀਆਂ ਟਿੱਪਣੀਆਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ਕੋਈ ਈਵੈਂਟ ਨਹੀਂ"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ਕੋਈ ਈਵੈਂਟ ਨਹੀਂ ਲੱਭਿਆ"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "ਸਮਾਗਮ"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "ਬਿਨ-ਮਿਤੀ"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "ਕੋਈ ਈਵੈਂਟ ਨਹੀਂ"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "ਕੈਸ਼ ਡਾਇਰੈਕਟਰੀ %s ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "%s ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ਤਸਵੀਰਾਂ"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "%s ਆਰਜ਼ੀ ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "ਡਾਟਾ ਸਬ-ਡਾਇਰੈਕਟਰੀ %s ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(ਕੋਈ ਨਹੀਂ)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "ਬੇਤਰਤੀਬ"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "ਸਲਾਈਡ-ਸ਼ੋ ਟਰਾਂਜੀਸ਼ਨ"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s ਲਈ ਆਰਜ਼ੀ ਫਾਇਲ ਤਿਆਰ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "ਐਕਸਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ਫਾਇਲ %s ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ, ਬਦਲਣੀ ਹੈ?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "ਛੱਡੋ(_S)"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "ਬਦਲੋ(_R)"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "ਸਭ ਬਦਲੋ(_A)"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "ਐਕਸਪੋਰਟ"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ਫੋਟੋ"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "ਵਿਡੀਓ"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ਫੋਟੋ"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ਫੋਟੋ"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "ਫਾਇਲ %s ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "ਕਿਸਮ"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "ਪਰਕਾਸ਼ਨ"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋਆਂ/ਵੀਡੀਓ ਸਫਲਤਾਪੂਰਕ ਪਬਲਿਸ਼ ਹੋ ਚੁੱਕੀਆਂ ਹਨ।"
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "ਚੁਣੀਆਂ ਵੀਡੀਓ ਸਫਲਤਾਪੂਰਕ ਪਬਲਿਸ਼ ਹੋ ਚੁੱਕੀਆਂ ਹਨ।"
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "ਚੁਣੀਆਂ ਫੋਟੋਆਂ ਸਫਲਤਾਪੂਰਕ ਪਬਲਿਸ਼ ਹੋ ਚੁੱਕੀਆਂ ਹਨ।"
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "ਚੁਣੀ ਵੀਡੀਓ ਸਫਲਤਾਪੂਰਕ ਪਬਲਿਸ਼ ਹੋ ਚੁੱਕੀ ਹੈ।"
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "ਚੁਣੀ ਫੋਟੋ ਸਫਲਤਾਪੂਰਕ ਪਬਲਿਸ਼ ਹੋ ਚੁੱਕੀ ਹੈ।"
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ਅਕਾਊਂਟ ਜਾਣਕਾਰੀ ਲਈ ਜਾ ਰਹੀ ਹੈ..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "ਲਾਗਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ਫੋਟੋ ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "ਫੋਟੋ ਪਬਲਿਸ਼ ਕਰੋ(_t):"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "ਵਿਡੀਓ ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "ਵੀਡੀਓ ਏਥੇ ਪਬਲਿਸ਼ ਕਰੋ(_t)"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ਫੋਟੋ ਅਤੇ ਵਿਡੀਓ ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ਫੋਟੋ ਅਤੇ ਵੀਡੀਓ ਏਥੇ ਪਬਲਿਸ਼ ਕਰੋ"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "ਪਬਲਿਸ਼ ਕਰਨ ਤੇ ਅਸਮਰਥ"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%2$d ਵਿੱਚੋਂ %1$d ਅੱਪਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s ਉੱਪਰ ਪਬਲਿਸ਼ ਜਾਰੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਕਿਉਂਕਿ ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "ਹੋਰ ਸਰਵਿਸ ਤੇ ਪਬਲਿਸ਼ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ, ਉੱਪਰਲੇ ਮੇਨੂ ਵਿੱਚੋਂ ਇੱਕ ਚੁਣੋ।"
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "ਨਵਾਂ ਟੈਗ(_T)..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "ਇੱਕ ਰਜੀ ਫਾਇਲ ਪਬਲਿਸ਼ ਕਰਨ ਲਈ ਖਾਲੀ ਹੈ"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਇਸ ਸ਼ਾਟਵੈੱਲ ਸੈਸ਼ਨ ਦੌਰਾਨ ਇੱਕ ਗੂਗਲ ਸੇਵਾ ਵਿੱਚੋਂ ਲਾਗ ਇਨ ਅਤੇ ਆਊਟ ਕਰ ਚੁੱਕੇ ਹੋ।\n"
+"\n"
+"ਗੂਗਲ ਸੇਵਾਵਾਂ ਤੇ ਪ੍ਰਕਾਸ਼ਨ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣ ਲਈ, ਸ਼ਾਟਵੈੱਲ ਤੋਂ ਬਾਹਰ ਆ ਕੇ ਇਸਨੂੰ ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ, ਫਿਰ "
+"ਦੁਬਾਰਾ ਪ੍ਰਕਾਸ਼ਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"ਤੁਸੀਂ ਹਾਲੇ YouTube ਤੇ ਲਾਗਇਨ ਨਹੀਂ ਹੋ।\n"
+"\n"
+"ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਗੂਗਲ ਅਕਾਊਟ ਤੇ ਲਾਗਇਨ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ ਇਸਨੂੰ YouTube ਨਾਲ ਵਰਤਣ ਲਈ ਸੈੱਟ ਕੀਤਾ "
+"ਹੋਵੇ। ਤੁਸੀਂ ਬਹੁਤੇ ਅਕਾਊਂਟਾਂ ਨੂੰ ਆਪਣਾ ਬਰਾਊਜ਼ਰ ਵਰਤ ਕੇ ਪਿਕਾਸਾ ਵੈੱਬ ਐਲਬਮ ਵਰਤਣ ਲਈ ਸੈੱਟ ਕਰ ਸਕਦੇ ਹੋ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"ਪਰਕਾਸ਼ਿਤ ਕਰਨ ਲਈ ਚਾਹੀਦੀ ਫਾਇਲ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਯੂਟਿਊਬ ਉੱਤੇ ਪਰਕਾਸ਼ਿਤ ਕਰਨਾ ਜਾਰੀ ਨਹੀਂ ਰਹਿ "
+"ਸਕਦਾ ਹੈ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "ਤੁਸੀਂ %s ਵਜੋਂ ਯੂਟਿਊਬ ਵਿੱਚ ਲਾਗਇਨ ਹੋ।"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "ਵੀਡੀਓ '%s' ਵਿੱਚ ਦਿਸੇਗੀ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "ਪਬਲਿਕ ਲਿਸਟਡ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "ਪਬਲਿਕ ਅਨਲਿਸਟਡ"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "ਪ੍ਰਾਈਵੇਟ"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "ਕੋਰ ਪਬਲਿਸ਼ ਸਰਵਿਸ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"ਤੁਸੀਂ ਹਾਲੇ Flickr ਤੇ ਲਾਗਇਨ ਨਹੀਂ ਹੋ।\n"
+"\n"
+"ਆਪਣੇ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਵਿੱਚ Flickr ਤੇ ਲਾਗਇਨ ਕਰਨ ਲਈ ਲਾਗਇਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਤੁਹਾਨੂੰ ਸ਼ਾਟਵੈਲ ਨੂੰ ਤੁਹਾਡੇ "
+"Flickr ਅਕਾਊਂਟ ਨਾਲ ਜੁੜਨ ਦੀ ਮਨਜੂਰੀ ਮਿਲੇਗੀ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ਤੁਸੀਂ ਇਸ ਸ਼ਾਟਵੈੱਲ ਸ਼ੈਸ਼ਨ ਦੌਰਾਨ Flickr ਤੇ ਲਾਗਇਨ ਅਤੇ ਆਊਟ ਹੋਏ ਹੋ।\n"
+"Flickr ਉਪਰ ਪਬਲਿਸ਼ਿੰਗ ਜਾਰੀ ਕਰਨ ਲਈ, ਬੰਦ ਕਰੋ ਅਤੇ ਸ਼ਾਟਵੈੱਲ ਦੁਬਾਰਾ ਚਲਾਓ, ਫਿਰ ਪਬਲਿਸ਼ ਕਰਨ ਦੀ "
+"ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "...ਲਾਗਇਨ ਲਈ ਤਿਆਰੀ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"ਪਰਕਾਸ਼ਿਤ ਕਰਨ ਲਈ ਚਾਹੀਦੀ ਫਾਇਲ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਫਲਿੱਕਰ ਉੱਤੇ ਪਰਕਾਸ਼ਿਤ ਕਰਨਾ ਜਾਰੀ ਨਹੀਂ ਰਹਿ "
+"ਸਕਦਾ ਹੈ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "...ਪਰਮਾਣਕਿਤਾ ਦੀ ਜਾਂਚ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"ਤੁਸੀਂ Flickr ਉੱਪਰ %s ਦੇ ਤੌਰ ਤੇ ਲਾਗਇਨ ਹੋ।\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"ਤੁਹਾਡਾ ਫਰੀ Flickr ਅਕਾਊਂਟ ਪ੍ਰਤੀ ਡਾਟਾ ਡਾਟਾ ਅੱਪਲੋਡ ਤੇ ਸੀਮਿਤ ਹੈ।\n"
+"ਇਸ ਮਹੀਨੇ, ਤੁਹਾਡੇ ਕੋਲ %d ਮੈਗਾਬਾਈਟ ਅੱਪਲੋਡ ਕੋਟਾ ਰਹਿ ਗਿਆ ਹੈ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "ਤੁਹਾਡਾ Flickr ਪਰੋ ਅਕਾਊਂਟ ਤੁਹਾਨੂੰ ਅਸੀਮਿਤ ਅੱਪਲੋਡ ਮਨਜੂਰ ਕਰਦਾ ਹੈ।"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ਜਿਨਾਂ ਨੂੰ ਫੋਟੋਆਂ ਦਿਸਦੀਆਂ ਹਨ(_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "ਜਿਨਾਂ ਨੂੰ ਵੀਡੀਓ ਦਿਸਦੀਆਂ ਹਨ(_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ਜਿਨਾਂ ਨੂੰ ਫੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਦਿਸਦੀਆਂ ਹਨ(_v):"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "ਹਰੇਕ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "ਦੋਸਤ ਅਤੇ ਪਰਿਵਾਰ ਹੀ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "ਕੇਵਲ ਪਰਿਵਾਰ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "ਕੇਵਲ ਦੋਸਤ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "ਕੇਵਲ ਮੈਂ ਹੀ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 ਪਿਕਸੈੱਲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 ਪਿਕਸੈੱਲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 ਪਿਕਸਲ"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 ਪਿਕਸਲ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s ਐਲਬਮ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Piwigo ਤੇ ਪ੍ਰਕਾਸ਼ਿਤ ਕਰਨ ਲੱਗਿਆਂ ਇੱਕ ਗਲਤੀ ਦਾ ਸੁਨੇਹਾ ਆਇਆ। ਕਿਰਪਾ ਕਰ ਕੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr "ਆਪਣੀ "
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"ਸ਼ਾਟਵੈੱਲ ਤੁਹਾਡੀ Piwigo ਫੋਟੋ ਲਾਇਬਰੇਰੀ ਨਾਲ ਸੰਪਰਕ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ URL ਦੀ ਜਾਂਚ "
+"ਕਰੋ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"ਯੂਜ਼ਰ-ਨਾਂ ਅਤੇ/ਜਾਂ ਗੁਪਤ-ਸ਼ਬਦ ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰ ਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "ਗਲਤ URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"ਗਲਤ ਯੂਜ਼ਰ- ਨਾਂ ਜਾਂ ਗੁਪਤ-ਸ਼ਬਦ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "ਸ਼ੂਟਵੈੱਲ ਕੁਨੈਕਟ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "ਐਡਮਿਨ,ਪਰਿਵਾਰ,ਦੋਸਤ,ਸੰਪਰਕ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "ਐਡਮਿਨ,ਪਰਿਵਾਰ,ਦੋਸਤ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "ਐਡਮਿਨ,ਪਰਿਵਾਰ"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "ਐਡਮਿਨ"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"ਤੁਸੀਂ ਹੁਣ ਪਿਕਾਸ ਵੈੱਬ ਐਲਬਮ ਤੇ ਲਾਗਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ।\n"
+"\n"
+"ਪਿਕਾਸਾ ਵੈੱਬ ਐਲਬਮ ਵਿੱਚ ਲਾਗਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਵਿੱਚ ਲਾਗਇਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਤੁਹਾਨੂੰ "
+"ਸ਼ਾਟਵੈੱਲ ਨੂੰ ਆਪਣੀ ਪਿਕਾਸਾ ਵੈੱਬ ਐਲਬਮ ਨਾਲ ਜੁੜਨ ਲਈ ਮਨਜੂਰੀ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"ਪਬਲਿਸ਼ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਫਾਇਲ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਪਿਕਾਸਾ ਤੇ ਪਬਲਿਸ਼ ਕਰਨਾ ਜਾਰੀ ਨਹੀਂ ਹੋ ਸਕਦਾ।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "...ਐਲਬਮ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "ਤੁਸੀਂ ਪਿਕਾਸਾ ਵੈੱਬ ਐਲਬਮ ਵਿੱਚ %s ਵਲੋਂ ਲਾਗਇਨ ਹੋ।"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "ਵਿਡੀਓ ਵੇਖਾਈ ਦੇਵੇਗੀ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ਫੋਟੋ ਵੇਖਾਈ ਦੇਣਗੀਆਂ ਇਸ ਵਿੱਚ:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "ਛੋਟੀ (640 x 480 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "ਮੱਧਮ (1024 x 768 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "ਸਿਫਾਰਸ਼ੀ (1600 x 1200 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"ਤੁਸੀਂ ਹਾਲੇ ਫੇਸਬੁੱਕ ਤੇ ਲਾਗਇਨ ਨਹੀਂ ਹੈ।\n"
+"\n"
+"ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਫੇਸਬੁੱਕ ਅਕਾਊਂਟ ਨਹੀਂ ਹੈ, ਤੁਸੀਂ ਲਾਗਇਨ ਦੌਰਾਨ ਬਣਾ ਸਕਦੇ ਹੋ। ਲਾਗਇਨ ਦੌਰਾਨ, ਸ਼ਾਟਵੈੱਲ ਕੁਨੈਕਟ "
+"ਤੁਹਾਨੂੰ ਪੁੱਛ ਸਕਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਫੀਡ ਵਿੱਚ ਫੋਟੋਆਂ ਅੱਪਲੋਡ ਅਤੇ ਪਬਲਿਸ਼ ਕਰਨੀਆਂ ਹਨ ਜਾਂ ਨਹੀਂ। ਇਹ ਮਨਜੂਰੀ "
+"ਸ਼ਾਟਵੈੱਲ ਕੁਨੈਕਟ ਲਈ ਲੋੜੀਂਦੀ ਹੈ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ਤੁਸੀਂ ਇਸ ਸ਼ਾਟਵੈੱਲ ਸ਼ੈਸ਼ਨ ਦੌਰਾਨ ਫੇਸਬੁੱਕ ਤੇ ਲਾਗਇਨ ਅਤੇ ਆਊਟ ਹੋਏ ਹੋ।\n"
+"ਫੇਸਬੁੱਕ ਉਪਰ ਪਬਲਿਸ਼ਿੰਗ ਜਾਰੀ ਕਰਨ ਲਈ, ਬੰਦ ਕਰੋ ਅਤੇ ਸ਼ਾਟਵੈੱਲ ਦੁਬਾਰਾ ਚਲਾਓ, ਫਿਰ ਪਬਲਿਸ਼ ਕਰਨ ਦੀ "
+"ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "ਸਟੈਂਡਰਡ (720 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "ਵੱਡੀ (2048 ਪਿਕਸਲ)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "...ਫੇਸਬੁੱਕ ਨਾਲ ਕੁਨੈਕਸ਼ਨ ਟੈਸਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"ਪਰਕਾਸ਼ਿਤ ਕਰਨ ਲਈ ਚਾਹੀਦੀ ਫਾਇਲ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਫੇਸਬੁੱਕ ਉੱਤੇ ਪਰਕਾਸ਼ਿਤ ਕਰਨਾ ਜਾਰੀ ਨਹੀਂ ਰਹਿ "
+"ਸਕਦਾ ਹੈ।"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"ਤੁਸੀਂ %s ਵਜੋਂ ਫੇਸਬੁੱਕ ਵਿੱਚ ਲਾਗਇਨ ਹੋ।\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "ਤੁਸੀਂ ਚੁਣੀਆਂ ਫੋਟੋਆਂ ਕਿੱਥੇ ਪਬਲਿਸ਼ ਕਰਨੀਆਂ ਹਨ?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "ਅੱਪਲੋਡ ਆਕਾਰ(_s):"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "ਦੋਸਤ"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "ਕਰੁੰਬਲੇ"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "ਸ਼ਤਰੰਜ"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "ਘੇਰੇ"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ਫੱਟੀਦਾਰ ਪਰਦੇ"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "ਧਾਰੀਆਂ"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "ਘੜੀ"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "ਘੇਰਾ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "ਕੋਰ ਸਲਾਈਡ-ਸ਼ੋ ਟਰਾਂਜੀਸ਼ਨ"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "ਨਕਲ ਹੱਕ 2010 Maxim Kartashev, ਨਕਲ ਹੱਕ 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "ਸਲਾਈਡ"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "ਫੇਡ"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "ਵਰਗ"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "ਕੋਰ ਡਾਟਾ ਇੰਪੋਰਟ ਸਰਵਿਸਾਂ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot ਲਾਇਬਰੇਰੀ ਇੰਪੋਰਟ ਸਰਵਿਸ ਵੱਲੋਂ ਸਵਾਗਤ ਹੈ।\n"
+"\n"
+"ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਇੱਕ ਲਾਇਬਰੇਰੀ ਚੁਣੋ ਜੀ, ਸ਼ਾਟਵੈੱਲ ਦੁਆਰਾ ਖੋਜੀਆਂ ਮੌਜੂਦਾ ਲਾਇਬਰੇਰੀਆਂ ਜਾਂ ਬਦਲਵਾਂ F-Spot "
+"ਡਾਟਾਬੇਸ ਫਾਈਲ ਚੁਣਕੇ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot ਲਾਇਬਰੇਰੀ ਇੰਪੋਰਟ ਸਰਵਿਸ ਵੱਲੋਂ ਸਵਾਗਤ ਹੈ।\n"
+"\n"
+"F-Spot ਡਾਟਾਬੇਸ ਫਾਈਲ ਚੁਣੋ ਜੀ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਇੱਕ F-Spot ਡਾਟਾਬੇਸ ਫਾਈਲ ਦਸਤੀ ਚੁਣੋ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"ਚੁਣੀ F-Spot ਡਾਟਾਬੇਸ ਫਾਇਲ ਨਹੀਂ ਖੋਲ ਸਕਿਆ: ਫਾਇਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਜਾਂ ਇੱਕ F-Spot ਡਾਟਾਬੇਸ ਨਹੀਂ ਹੈ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"ਚੁਣੀ F-Spot ਡਾਟਾਬੇਸ ਫਾਇਲ ਨਹੀਂ ਖੋਲ ਸਕਿਆ: F-Spot ਡਾਟਾਬੇਸ ਦਾ ਇਹ ਵਰਜਨ ਸ਼ਾਟਵੈੱਲ ਦੁਆਰਾ "
+"ਸਹਿਯੋਗੀ ਨਹੀਂ ਹੈ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "ਚੁਣੀ F-Spot ਡਾਟਾਬੇਸ ਫਾਇਲ ਨਹੀਂ ਪੜ੍ਹ ਸਕਿਆ: ਟੈਗ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "ਚੁਣੀ F-Spot ਡਾਟਾਬੇਸ ਫਾਇਲ ਨਹੀਂ ਪੜ੍ਹ ਸਕਿਆ: ਫੋਟੋ ਟੇਬਲ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"ਸ਼ਾਟਵੈੱਲ ਨੂੰ F-Spot ਲਾਇਬਰੇਰੀ ਵਿੱਚ %d ਫੋਟੋਆਂ ਲੱਭੀਆਂ ਹਨ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰ ਰਿਹਾ ਹੈ। ਡੁਪਲੀਕੇਟ "
+"ਆਪੇ ਹੀ ਲੱਭੀਆਂ ਤੇ ਹਟਾਈਆਂ ਜਾਣਗੀਆਂ।\n"
+"\n"
+"ਤੁਸੀਂ ਇਸ ਸਹਾਇਕ ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਸ਼ਾਟਵੈੱਲ ਵਰਤਣਾ ਚਾਲੂ ਕਰ ਸਕਦੇ ਹੋ, ਇੰਪੋਰਟ ਬੈਕਗਰਾਊਂਟ ਵਿੱਚ "
+"ਚੱਲਦਾ ਰਹੇਗਾ।"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot ਲਾਇਬਰੇਰੀ: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਤਿਆਰੀ"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "ਡੈਸਕਟਾਪ ਸਲਾਇਡ-ਸ਼ੋ ਵਜੋਂ ਸੈੱਟ ਕਰੋ"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "ਡੈਸਕਟਾਪ ਬੈਕਗਰਾਊਂਡ ਸਲਾਇਡ-ਸ਼ੋ ਤਿਆਰ ਕਰੋ"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "ਇਸ ਲਈ ਹਰੇਕ ਫੋਟੋ ਵੇਖਾਓ"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ਸਮਾਂ ਅੰਤਰਾਲ"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "ਡੈਸਕਟਾਪ ਵਿੱਚ ਫੋਟੋ ਕਿੰਨਾ ਚਿਰ ਵੇਖਾਈ ਜਾਵੇ"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "ਖੋਜ"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "ਖੋਜ ਦਾ ਨਾਂ(_N):"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "ਮਿਲਾਨ(_M)"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "ਹੇਠਲਿਆਂ ਵਿੱਚੋਂ:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>ਛਾਪਿਆ ਪ੍ਰਤੀਬਿੰਬ ਆਕਾਰ</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "ਸਟੈਂਡਰਡ ਆਕਾਰ ਵਰਤੋਂ(_s):"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "ਕਸਟਮ ਆਕਾਰ ਵਰਤੋਂ(_u):"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "ਫੋਟੋ ਅਨੁਪਾਤ ਮਿਲਾਨ ਕਰੋ(_M)"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "ਆਟੋ-ਆਕਾਰ(_A):"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>ਸਿਰਲੇਖ</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "ਚਿੱਤਰ ਟਾਈਟਲ ਪਰਿੰਟ ਕਰੋ(_t)"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>ਪਿਕਸੈੱਲ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "ਫੋਟੋ ਆਊਟਪੁੱਟ ਏਥੇ(_O):"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "ਪਿਕਸਲ ਪ੍ਰਤੀ ਇੰਚ"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "ਲੇਬਲ"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "ਸ਼ੂਟਵੈੱਲ ਪਸੰਦ"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "ਸਫੈਦ"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "ਕਾਲਾ"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "ਨਵੀਆਂ ਫਾਇਲਾਂ ਲਈ ਲਾਇਬਰੇਰੀ ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਨਿਗ੍ਹਾ ਰੱਖੋ(_W)"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "ਮੇਟਾਡਾਟਾ"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "ਟੈਗ, ਟਾਈਟਲ ਅਤੇ ਹੋਰ ਮੈਟਾਡਾਟਾ ਫੋਟੋ ਫਾਇਲਾਂ ਵਿੱਚ ਲਿਖੋ(_m)"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "ਵੇਖਾਓ"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "ਫੋਟੋ ਇੰਪੋਰਟ ਕਰੋ ਇੱਥੇ(_I):"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "ਬੈਕਗਰਾਊਂਡ(_B):"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "ਡਾਇਰੈਕਟਰੀ ਢਾਂਚਾ(_D):"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "ਪੈਟਰਨ(_P):"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ਉਦਾਹਰਨ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "ਇੰਪੋਰਟ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਦਾ ਨਾਂ ਛੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਦਿਓ"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW ਡਿਵੈਲਪਰ"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "ਡਿਫਾਲਟ(_f):"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "ਬਾਹਰੀ ਫੋਟੋ ਐਡੀਟਰ(_x):"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "ਬਾਹਰੀ ਰਾਅ ਐਡੀਟਰ(_R):"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "ਬਾਹਰੀ ਐਡੀਟਰ"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "ਪਲੱਗਇਨ"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "ਦੇਰੀ(_D):"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "ਟਰਾਂਸੈਕਸ਼ਨ ਪਰਭਾਵ(_T):"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "ਟਰਾਂਜੀਸ਼ਨ ਅੰਤਰਾਲ(_e):"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "ਟਾਈਟਲ ਵੇਖਾਓ(_i)"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "ਸਕਿੰਟ"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "ਲਾਗਇਨ(_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+"(ਪਾਠ fb ਯੂਜ਼ਰ-ਨਾਂ ਤੇ ਨਿਰਭਰ ਹੈ ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰਿਆ ਗਿਆ ਹੈ - \n"
+"ਇਸ ਖੇਤਰ ਵਿੱਚ ਰੱਖੀ ਕੋਈ ਵੀ ਚੀਜ ਪਰਦਰਸ਼ਿਤ ਨਹੀਂ ਹੋਵੇਗੀ)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "ਮੌਜੂਦਾ ਐਲਬਮ ਵਿੱਚ ਪਬਲਿਸ਼ ਕਰੋ(_x):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "ਇਸ ਨਾਂ ਦੀ ਨਵੀਂ ਐਲਬਮ ਬਣਾਓ(_n):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "ਜਿਨਾਂ ਨੂੰ ਵੀਡੀਓ ਅਤੇ ਨਵੀਆਂ ਫੋਟੋਆਂ ਦਿਸਦੀਆਂ ਹਨ(_v):"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"ਅਪਲੋਡ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਟਿਕਾਣਾ, ਕੈਮਰਾ, ਅਤੇ ਹੋਰ ਪਛਾਣ ਕਰਵਾਉਣ ਯੋਗ ਜਾਣਕਾਰੀ ਹਟਾ ਦਿਓ (_R)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "ਲਾਗਆਊਟ (_L)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "ਪ੍ਰਕਾਸ਼ਿਤ ਕਰੋ (_P)"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "ਪੁਸ਼ਟੀ ਨੰਬਰ ਦਿਓ ਜੋ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਵਿੱਚ Flickr ਤੇ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ਦਿਸਦਾ ਹੈ।"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "ਪਰਮਾਣਕਿਤਾ ਨੰਬਰ(_N):"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"ਤੁਸੀਂ Flickr ਵਿੱਚ (name) ਵਜੋਂ ਲਾਗ ਇਨ ਹੋਏ ਹੋ।\n"
+"\n"
+"(ਇਸ ਲੇਬਲ ਦੀ ਸਤਰ ਕੋਡ ਦੇ ਅੰਦਰ ਬਣਦੀ ਤੇ ਸੈੱਟ ਕੀਤੀ ਹੁੰਦੀ ਹੈ,\n"
+"ਇਸ ਲਈ ਇੱਥੇ ਕੀਤੇ ਬਦਲਾਅ ਪਰਦਰਸ਼ਿਤ ਨਹੀਂ ਹੋਣਗੇ)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "ਪਾਰਦਰਸ਼ਤਾ ਲੇਬਲ (ਕੋਡ ਵਿੱਚ ਬਣਿਆ) (_v)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "ਫੋਟੋ ਆਕਾਰ(_s):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'ਤੁਸੀਂ $name ਵਜੋਂ ਲਾਗ ਇਨ ਹੋਏ ਹੋ।'\n"
+"(ਐਪਲੀਕੇਸ਼ਨ ਕੋਡ ਦੇ ਅੰਦਰ ਬਣਿਆ)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "ਮੌਜੂਦਾ ਐਲਬਮ(_e):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "ਨਵਾਂ ਐਲਬਮ ਨਾਂ(_n):"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "ਪਬਲਿਕ ਗੈਲਰੀ ਵਿੱਚ ਐਲਬਮ ਵੇਖੋ"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype ਵਿਖਾਈ ਦੇਵੇਗਾ ਇਸ ਵਿੱਚ\n"
+"(ਕੋਡ ਵਿੱਚ ਬਣਿਆ)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "ਫੋਟੋ ਅਕਾਰ ਪਰੀਸੈੱਟ(_s):"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "ਤੁਹਾਡੀ Piwigo ਤਸਵੀਰ ਲਾਇਬ੍ਰੇਰੀ ਦਾ URL (_U)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "ਯੂਜ਼ਰ ਨਾਂ(_n)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "ਗੁਪਤ-ਸ਼ਬਦ (_P)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ(_R)"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "ਲਾਗਇਨ"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "ਇੱਕ ਮੌਜੂਦਾ ਕੈਟਾਗਰੀ(_e):"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "ਤਸਵੀਰਾਂ ਵਿਖਾਈ ਦੇਣਗੀਆਂ ਇਸ ਦੁਆਰਾ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "ਫੋਟੋ ਆਕਾਰ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "ਵਰਗ ਦੇ ਅੰਦਰ ਅੰਦਰ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "ਐਲਬਮ ਟਿੱਪਣੀ:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "ਜੇ ਸਿਰਲੇਖ ਸੈੱਟ ਹੈ ਅਤੇ ਟਿੱਪਣੀ ਸੈੱਟ ਨਹੀਂ, ਸਿਰਲੇਖ ਨੂੰ ਟਿੱਪਣੀ ਵਜੋਂ ਵਰਤੋ (_I)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "ਟੈਗ ਅੱਪਲੋਡ ਨਾ ਕਰੋ (_D)"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "ਲਾਗਆਉਟ"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "ਵਿਡੀਓ ਪਰਾਈਵੇਸੀ ਸੈਟਿੰਗ(_s):"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "ਨਕਲ-ਹੱਕ 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 ਪਿਕਸੈੱਲ"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "ਕਿਸੇ OAuth ਪ੍ਰਮਾਣਿਕਤਾ ਬੇਨਤੀ ਲਈ '%s' ਇੱਕ ਯੋਗ ਹੁੰਗਾਰਾ ਨਹੀਂ ਹੈ"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): ਸ਼ੁਰੂ ਨਹੀਂ ਕਰ ਸਕਦਾ; ਇਹ ਪ੍ਰਕਾਸ਼ਕ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਯੋਗ ਨਹੀਂ ਹੈ।"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "ਆਪਣੇ Tumblr ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਯੂਜ਼ਰ-ਨਾਂ ਅਤੇ ਗੁਪਤ-ਸ਼ਬਦ ਭਰੋ।"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "ਲੋਡ ਨਹੀਂ ਕਰ ਸਕਿਆ UI: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"ਤੁਸੀਂ Tumblr ਵਿੱਚ %s ਵਜੋਂ ਲਾਗਇਨ ਹੋ।\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "ਨਕਲ-ਹੱਕ 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki ਵੈੱਬਸਾਈਟ ਵੇਖੋ"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "ਤੁਸੀਂ ਇਸ ਸਮੇਂ Yandex.Fotki ਤੇ ਲਾਗਇਨ ਨਹੀਂ ਹੋਏ।"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "ਈ-ਪੱਤਰ ਪਤਾ (_E)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"ਤੁਸੀਂ Tumblr ਵਿੱਚ (name) ਵਜੋਂ ਲਾਗਇਨ ਹੋ।\n"
+"\n"
+"(ਇਸ ਲੇਬਲ ਦੀ ਸਤਰ ਕੋਡ ਦੇ ਅੰਦਰ ਬਣਾਈ ਤੇ ਸੈੱਟ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, \n"
+"ਇਸ ਲਈ ਇੱਥੇ ਕੀਤੇ ਬਦਲਾਅ ਪ੍ਰਦਰਸ਼ਿਤ ਨਹੀਂ ਹੋਣਗੇ)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "ਬਲੌਗ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "ਐਲਬਮਾਂ (ਜਾਂ ਨਵੀਆਂ ਲਿਖੋ) (_A):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "ਦਖਲ ਕਿਸਮ (_t):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "ਟਿੱਪਣੀਆਂ ਅਯੋਗ ਕਰੋ (_c)"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "ਅਸਲੀ ਤਸਵੀਰ ਡਾਊਨਲੋਡ ਕਰਨ ਤੋਂ ਵਰਜਿਤ ਕਰੋ (_F)"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..7a1f4b7
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,4833 @@
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+# Aviary.pl
+# Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz
+# pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas:
+# gnomepl@aviary.pl
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+# verayin <vera@yorba.org>, 2011.
+# lsbeeler <lucas@yorba.org>, 2011.
+# Piotr Drąg <piotrdrag@gmail.com>, 2011-2014.
+# Aviary.pl <gnomepl@aviary.pl>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-02-05 19:41+0100\n"
+"PO-Revision-Date: 2014-02-05 19:42+0100\n"
+"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
+"Language-Team: Polish <gnomepl@aviary.pl>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Poedit-Language: Polish\n"
+"X-Poedit-Country: Poland\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Plik tymczasowy wymagany do publikacji jest niedostępny"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Już zalogowano się i wylogowano z serwisów Google podczas tej sesji programu "
+"Shotwell.\n"
+"\n"
+"Aby kontynuować publikowanie do serwisów Google, należy zakończyć i ponownie "
+"uruchomić program Shotwell, a następnie ponownie spróbować publikacji."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Witryna Fundacji Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"verayin <vera@yorba.org>, 2011\n"
+"lsbeeler <lucas@yorba.org>, 2011\n"
+"Piotr Drąg <piotrdrag@gmail.com>, 2011-2014\n"
+"Aviary.pl <gnomepl@aviary.pl>, 2014"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2009-2014 Fundacja Yorba"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Witaj w usłudze importu kolekcji programu F-Spot.\n"
+"\n"
+"Proszę wybrać kolekcję do zaimportowania, wybierając jedną z istniejących "
+"kolekcji odnalezionych przez program Shotwell lub wybierając alternatywny "
+"plik bazy danych programu F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Witaj w usłudze importu kolekcji programu F-Spot.\n"
+"\n"
+"Proszę wybrać plik bazy danych programu F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Ręczny wybór pliku bazy danych programu F-Spot do zaimportowania:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nie można otworzyć wybranego pliku bazy danych programu F-Spot: plik nie "
+"istnieje lub nie jest bazą danych programu F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nie można otworzyć wybranego pliku bazy danych programu F-Spot: ta wersja "
+"bazy danych programu F-Spot nie jest obsługiwana przez program Shotwell"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nie można otworzyć wybranego pliku bazy danych programu F-Spot: błąd podczas "
+"odczytywania tablicy etykiet"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nie można otworzyć wybranego pliku bazy danych programu F-Spot: błąd podczas "
+"odczytywania tablicy zdjęć"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Program Shotwell odnalazł %d zdjęć w kolekcji programu F-Spot i obecnie je "
+"importuje. Duplikaty zostaną automatycznie wykryte i usunięte.\n"
+"\n"
+"Można zamknąć to okno i używać programu Shotwell, podczas gdy import jest "
+"przeprowadzany w tle."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Kolekcja programu F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Przygotowywanie importu"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Usługi importowania głównych danych"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500x375 pikseli"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024x768 pikseli"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 piksele"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"\"%s\" nie jest prawidłową odpowiedzią na żądanie uwierzytelnienia OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): nie można uruchomić; tego modułu publikującego "
+"nie można uruchamiać ponownie."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Proszę podać nazwę użytkownika i hasło powiązane z kontem serwisu Tumblr."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "Nieprawidłowa nazwa użytkownika i/lub hasło. Proszę spróbować ponownie"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Nieprawidłowa nazwa użytkownika lub hasło"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nie można wczytać interfejsu użytkownika: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Zalogowano w serwisie Tumblr jako %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Witryna serwisu Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Obecnie nie zalogowano w serwisie Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Dodatkowe usługi publikowania programu Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "etykieta"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "Adres _e-mail"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Hasło"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Zaloguj"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogi:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "_Rozmiar zdjęcia:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Wyloguj"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "Opu_blikuj"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Albumy (lub zapisanie nowego):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "_Typ dostępu:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Wyłączenie _komentarzy"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "_Zakazanie pobierania oryginalnego zdjęcia"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Publiczne"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Przyjaciele"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Prywatne"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Połączenie programu Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Nie zalogowano w serwisie Facebook.\n"
+"\n"
+"Jeśli użytkownik nie posiada jeszcze konta w serwisie Facebook, można je "
+"utworzyć podczas procesu logowania. Podczas logowania Shotwell Connect może "
+"zapytać o pozwolenie na wysyłanie zdjęć i publikowanie ich w kanale "
+"użytkownika. To pozwolenie jest wymagane, aby Shotwell Connect mogło działać."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Już zalogowano się i wylogowano z serwisu Facebook podczas tej sesji "
+"programu Shotwell.\n"
+"Aby kontynuować publikowanie do serwisu Facebook, należy zakończyć i "
+"ponownie uruchomić program Shotwell, a następnie ponownie spróbować "
+"publikacji."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standardowe (720 pikseli)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Duże (2048 pikseli)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testowanie połączenia z serwisem Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Tworzenie albumu..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Plik wymagany do publikowania jest niedostępny. Nie można kontynuować "
+"publikowania do serwisu Facebook."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Zalogowano w serwisie Facebook jako użytkownik %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Gdzie opublikować wybrane zdjęcia?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "_Rozmiar wysyłania:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Tylko dla mnie"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Wszystkich"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Nie zalogowano w serwisie Flickr.\n"
+"\n"
+"Należy nacisnąć przycisk Zaloguj, aby zalogować się w serwisie Flickr w "
+"przeglądarce WWW. Następnie należy upoważnić Shotwell Connect na dowiązanie "
+"do konta serwisu Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Już zalogowano się i wylogowano z serwisu Flickr podczas tej sesji programu "
+"Shotwell.\n"
+"Aby kontynuować publikowanie do serwisu Flickr, należy zakończyć i ponownie "
+"uruchomić program Shotwell, a następnie ponownie spróbować publikacji."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Przygotowywanie do zalogowania..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Plik wymagany do publikowania jest niedostępny. Nie można kontynuować "
+"publikowania do serwisu Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Sprawdzanie upoważnienia..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Zalogowano w serwisie Flickr jako użytkownik %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Darmowe konto w serwisie Flickr ogranicza ilość przesyłanych danych na "
+"miesiąc.\n"
+"W tym miesiącu pozostało %d megabajtów."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Konto Flickr Pro umożliwia nieograniczone wysyłanie."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Zdjęcia _widoczne dla:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Nagrania wideo _widoczne dla:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Zdjęcia i nagrania wideo _widoczne dla:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Tylko przyjaciół i rodziny"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Tylko rodzina"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Tylko przyjaciele"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048x1536 pikseli"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096x3072 piksele"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Rozmiar pierwotny"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Obecnie nie zalogowano w serwisie Picasa Web Albums.\n"
+"\n"
+"Należy kliknąć przycisk Zaloguj, aby zalogować w serwisie Picasa Web Albums "
+"w przeglądarce WWW. Należy upoważnić program Shotwell Connect do powiązania "
+"z kontem serwisu Picasa Web Albums."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Plik wymagany do publikowania jest niedostępny. Nie można kontynuować "
+"publikowania do serwisu Picasa."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Zalogowano w serwisie Picasa Web Albums jako użytkownik %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Nagrania wideo pojawią się w:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Zdjęcia pojawią się w:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Małe (640x480 pikseli)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Średnie (1024x768 pikseli)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Zalecane (1600x1200 pikseli)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pikseli)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Rozmiar pierwotny"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Tworzenie albumu %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Wystąpił komunikat błędu podczas publikowania w serwisie Piwigo. Proszę "
+"spróbować ponownie."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Proszę podać adres URL kolekcji zdjęć serwisu Piwigo oraz nazwę użytkownika "
+"i hasło powiązane z kontem w serwisie Piwigo dla tej kolekcji."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Program Shotwell nie może połączyć się z kolekcją zdjęć serwisu Piwigo. "
+"Proszę sprawdzić podany adres URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Nieprawidłowy adres URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratorzy, rodzina, przyjaciele, kontakty"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratorzy, rodzina, przyjaciele"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratorzy, rodzina"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratorzy"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Nie zalogowano w serwisie YouTube.\n"
+"\n"
+"Aby kontynuować używanie serwisu YouTube, należy się zalogować do konta "
+"Google i ustawić je do używania serwisu YouTube. Większość kont można "
+"ustawić używając przeglądarki WWW do zalogowania się do serwisu YouTube co "
+"najmniej raz."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Plik wymagany do publikowania jest niedostępny. Nie można kontynuować "
+"publikowania do serwisu YouTube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Zalogowano w serwisie YouTube jako użytkownik %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Nagrania wideo pojawią się w \"%s\""
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Wyświetlane publicznie"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Nie wyświetlane publicznie"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Opublikowanie do i_stniejącego albumu:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Utworzenie _nowego albumu o nazwie:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Nagrania wideo i nowe albumy zdjęć _widoczne dla:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Usunięcie położenia, aparatu i innych informacji identyfikacyjnych przed "
+"wysłaniem"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Proszę podać numer potwierdzenia pojawiający się po zalogowaniu do serwisu "
+"Flickr w przeglądarce WWW."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Numer upoważnienia:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Ko_ntynuuj"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Istni_ejącym albumie:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "_Nowym albumie o nazwie:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "Wyśw_ietlenie listy albumów w publicznej galerii"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Rozmiar _zdjęcia:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "Adres _URL kolekcji zdjęć Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Nazwa użytkownika"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Zapamiętanie hasła"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "_Istniejącej kategorii:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Zdjęcia będą _widoczne dla:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Rozmiar zdjęcia:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "w kategorii:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Komentarz albumu:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Jeśli tytuł jest ustawiony, a komentarz nie, to użycie tytułu jako komentarz"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Bez wysyłania etykiet"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Wyloguj"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Opublikuj"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Główne usługi publikowania"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "U_stawienia prywatności nagrań wideo:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Zasłony"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Szachy"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Kółko"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Kółka"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Zegar"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Kruszenie"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Przenikanie"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slajd"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Kwadraty"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Paski"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Główne przejścia pokazu slajdów"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Fundacja Yorba"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nie można utworzyć katalogu pamięci podręcznej %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nie można utworzyć katalogu danych %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Obrazy"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nie można utworzyć katalogu tymczasowego %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nie można utworzyć podkatalogu danych %s: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Przypnij pasek narzędziowy"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Przypina pasek narzędziowy"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Opuszcza pełny ekran"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Opuść p_ełny ekran"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "Za_kończ"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "_O programie"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Pełny ekran"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Spis treści"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Naj_częściej zadawane pytania"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Zgłoś problem..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Anuluj"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Wystąpił krytyczny błąd podczas uzyskiwania dostępu do kolekcji programu "
+"Shotwell. Program nie może kontynuować.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nie można wyświetlić pomocy: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nie można przejść do bazy danych błędów: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nie można wyświetlić dokumentu FAQ: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Powodzenie"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Błąd pliku"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nie można dekodować pliku"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Błąd bazy danych"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Użytkownik przerwał importowanie"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nie jest plikiem"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Plik już istnieje w bazie danych"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nieobsługiwany format pliku"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nie jest plikiem obrazu"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Niepowodzenie dysku"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Dysk jest pełny"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Błąd aparatu"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Błąd zapisu pliku"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Uszkodzony plik obrazu"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Zaimportowanie się nie powiodło (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "Pokaz s_lajdów"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Odtwarza pokaz slajdów"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Eksport zdjęcia/nagrania wideo"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Eksport zdjęć/nagrań wideo"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Eksport zdjęcia"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Eksport zdjęć"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Obracanie"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Cofanie obrotu"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Odwracanie poziome"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Cofanie odwrócenia poziomego"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Odwracanie pionowe"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Cofanie odwrócenia pionowego"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Przywracanie"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Cofanie przywracania"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Ulepszanie"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Cofanie ulepszania"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Zastosowywanie przekształceń kolorów"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Cofanie przekształceń kolorów"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Tworzenie nowego wydarzenia"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Usuwanie wydarzenia"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Przenoszenie zdjęć do nowego wydarzenia"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Ustawianie zdjęć do poprzedniego wydarzenia"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Łączenie"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Cofanie łączenia"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Tworzenie duplikatów zdjęć"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Usuwanie duplikatów zdjęć"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Nie można utworzyć duplikatu zdjęcia z powodu błędu pliku"
+msgstr[1] "Nie można utworzyć duplikatu %d zdjęć z powodu błędów plików"
+msgstr[2] "Nie można utworzyć duplikatu %d zdjęć z powodu błędów plików"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Przywracanie poprzedniej oceny"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Zwiększanie ocen"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Zmniejszanie ocen"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Ustawianie wywoływacza RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Przywracanie poprzedniego wywoływacza RAW"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Ustaw wywoływacz"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Nie można dostosować pierwotnego zdjęcia."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Dostosowywanie daty i czasu"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Cofanie dostosowania daty i czasu"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Nie można dostosować jednego pierwotnego zdjęcia."
+msgstr[1] "Nie można dostosować poniższych pierwotnych zdjęć."
+msgstr[2] "Nie można dostosować poniższych pierwotnych zdjęć."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Błąd dostosowania czasu"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Nie można cofnąć dostosowania czasu na poniższym pliku zdjęcia."
+msgstr[1] "Nie można cofnąć dostosowania czasu na poniższych plikach zdjęć."
+msgstr[2] "Nie można cofnąć dostosowania czasu na poniższych plikach zdjęć."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Utwórz etykietę"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Przenieś etykietę \"%s\""
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Przenieś zdjęcia do kosza"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Przywróć zdjęcia z kosza"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Przenosi zdjęcia do kosza programu Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Przywraca zdjęcia z powrotem do kolekcji programu Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Przenoszenie zdjęć do kosza"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Przywracanie zdjęć z kosza"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Dodaje flagę do wybranych zdjęć"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Usuwa flagę z wybranych zdjęć"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Oznaczanie zaznaczonych zdjęć flagą"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Cofanie oznaczeń zdjęć flagą"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Dodaj flagę"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Usuń flagę"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nie można uruchomić rozszerzenia \"Wyślij do\" programu Nautilus: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Wyślij do"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Nie można wyeksportować tła do %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nie można przygotować pokazu slajdów pulpitu: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Etykieta \"%s\" zostanie usunięta ze zdjęcia. Kontynuować?"
+msgstr[1] "Etykieta \"%s\" zostanie usunięta z %d zdjęć. Kontynuować?"
+msgstr[2] "Etykieta \"%s\" zostanie usunięta z %d zdjęć. Kontynuować?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Usuń"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Spowoduje to usunięcie zapisanego wyszukiwania \"%s\". Kontynuować?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Przełączenie wywoływacza cofnie wszystkie zmiany wprowadzone do zdjęcia w "
+"programie Shotwell"
+msgstr[1] ""
+"Przełączenie wywoływacza cofnie wszystkie zmiany wprowadzone do zdjęć w "
+"programie Shotwell"
+msgstr[2] ""
+"Przełączenie wywoływacza cofnie wszystkie zmiany wprowadzone do zdjęć w "
+"programie Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Przełącz wywoływacz"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Eksport nagrań wideo"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Program Shotwell nie może utworzyć pliku do modyfikowania tego zdjęcia, "
+"ponieważ brak uprawnień do zapisywania w %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nie można wyeksportować zdjęcia z powodu błędu pliku.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Kontynuować eksportowanie?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Niezmodyfikowane"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Bieżące"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Jakość:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Ograniczenie _skalowania:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " pi_ksele"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Wyeksportuj metadane"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Zapisz szczegóły..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Zapisz szczegóły"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(oraz %d więcej)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Zaimportuj raport o wynikach"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Spróbowano zaimportować %d plik."
+msgstr[1] "Spróbowano zaimportować %d pliki."
+msgstr[2] "Spróbowano zaimportować %d plików."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "%d plik został pomyślnie zaimportowany."
+msgstr[1] "%d pliki zostały pomyślnie zaimportowane."
+msgstr[2] "%d plik zostało pomyślnie zaimportowanych."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Niezaimportowane duplikaty zdjęć/nagrań wideo:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplikuje istniejący element multimedialny"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Niezaimportowane zdjęcia/nagrania wideo z powodu błędów aparatu:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "komunikat błędu:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Niezaimportowane pliki, ponieważ nie zostały rozpoznane jako zdjęcia lub "
+"nagrania wideo:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Niezaimportowane pliki, ponieważ nie są w formacie rozumianym przez program "
+"Shotwell:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Niezaimportowane pliki, ponieważ program Shotwell nie mógł skopiować ich do "
+"kolekcji:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"nie można skopiować %s\n"
+"\tdo %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Nie zaimportowano zdjęć/nagrań wideo, ponieważ pliki są uszkodzone:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Niezaimportowane pliki z innego powodu:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Jeden duplikat zdjęcia nie został zaimportowany:\n"
+msgstr[1] "%d duplikaty zdjęć nie zostały zaimportowane:\n"
+msgstr[2] "%d duplikatów zdjęć nie zostało zaimportowanych:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Jeden duplikat nagrania wideo nie został zaimportowany:\n"
+msgstr[1] "%d duplikaty nagrań wideo nie zostały zaimportowane:\n"
+msgstr[2] "%d duplikatów nagrań wideo nie zostało zaimportowanych:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Jeden duplikat zdjęcia/nagrania wideo nie został zaimportowany:\n"
+msgstr[1] "%d duplikaty zdjęć/nagrań wideo nie zostały zaimportowane:\n"
+msgstr[2] "%d duplikatów zdjęć/nagrań wideo nie zostało zaimportowanych:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia się nie powiodło z powodu błędu pliku lub "
+"sprzętu:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć się nie powiodło z powodu błędu pliku lub sprzętu:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć się nie powiodło z powodu błędu pliku lub sprzętu:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego nagrania wideo się nie powiodło z powodu błędu pliku "
+"lub sprzętu:\n"
+msgstr[1] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło z powodu błędu pliku lub "
+"sprzętu:\n"
+msgstr[2] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło z powodu błędu pliku lub "
+"sprzętu:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia/nagrania wideo się nie powiodło z powodu "
+"błędu pliku lub sprzętu:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło z powodu błędu pliku "
+"lub sprzętu:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło z powodu błędu pliku "
+"lub sprzętu:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego pliku się nie powiodło z powodu błędu pliku lub "
+"sprzętu:\n"
+msgstr[1] ""
+"Zaimportowanie %d plików się nie powiodło z powodu błędu pliku lub sprzętu:\n"
+msgstr[2] ""
+"Zaimportowanie %d plików się nie powiodło z powodu błędu pliku lub sprzętu:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia się nie powiodło, ponieważ katalog kolekcji "
+"zdjęć nie jest zapisywalny:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć się nie powiodło, ponieważ katalog kolekcji zdjęć "
+"nie jest zapisywalny:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć się nie powiodło, ponieważ katalog kolekcji zdjęć "
+"nie jest zapisywalny:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Zaimportowanie jednego nagrania wideo się nie powiodło, ponieważ katalog "
+"kolekcji zdjęć nie jest zapisywalny:\n"
+msgstr[1] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło, ponieważ katalog kolekcji "
+"zdjęć nie jest zapisywalny:\n"
+msgstr[2] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło, ponieważ katalog kolekcji "
+"zdjęć nie jest zapisywalny:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia/nagrania wideo się nie powiodło, ponieważ "
+"katalog kolekcji zdjęć nie jest zapisywalny:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło, ponieważ katalog "
+"kolekcji zdjęć nie jest zapisywalny:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło, ponieważ katalog "
+"kolekcji zdjęć nie jest zapisywalny:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Zaimportowanie jednego pliku się nie powiodło, ponieważ katalog kolekcji "
+"zdjęć nie jest zapisywalny:\n"
+msgstr[1] ""
+"Zaimportowanie %d plików się nie powiodło, ponieważ katalog kolekcji zdjęć "
+"nie jest zapisywalny:\n"
+msgstr[2] ""
+"Zaimportowanie %d plików się nie powiodło, ponieważ katalog kolekcji zdjęć "
+"nie jest zapisywalny:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia się nie powiodło z powodu błędu aparatu:\n"
+msgstr[1] "Zaimportowanie %d zdjęć się nie powiodło z powodu błędu aparatu:\n"
+msgstr[2] "Zaimportowanie %d zdjęć się nie powiodło z powodu błędu aparatu:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego nagrania wideo się nie powiodło z powodu błędu "
+"aparatu:\n"
+msgstr[1] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło z powodu błędu aparatu:\n"
+msgstr[2] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło z powodu błędu aparatu:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia/nagrania wideo się nie powiodło z powodu "
+"błędu aparatu:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło z powodu błędu "
+"aparatu:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło z powodu błędu "
+"aparatu:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"Zaimportowanie jednego pliku się nie powiodło z powodu błędu aparatu:\n"
+msgstr[1] "Zaimportowanie %d plików się nie powiodło z powodu błędu aparatu:\n"
+msgstr[2] "Zaimportowanie %d plików się nie powiodło z powodu błędu aparatu:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia się nie powiodło, ponieważ jest one "
+"uszkodzone:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć się nie powiodło, ponieważ są one uszkodzone:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć się nie powiodło, ponieważ są one uszkodzone:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Zaimportowanie jednego nagrania wideo się nie powiodło, ponieważ jest one "
+"uszkodzone:\n"
+msgstr[1] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło, ponieważ są one "
+"uszkodzone:\n"
+msgstr[2] ""
+"Zaimportowanie %d nagrań wideo się nie powiodło, ponieważ są one "
+"uszkodzone:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Zaimportowanie jednego zdjęcia/nagrania wideo się nie powiodło, ponieważ "
+"jest one uszkodzone:\n"
+msgstr[1] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło, ponieważ są one "
+"uszkodzone:\n"
+msgstr[2] ""
+"Zaimportowanie %d zdjęć/nagrań wideo się nie powiodło, ponieważ są one "
+"uszkodzone:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+"Zaimportowanie jednego pliku się nie powiodło, ponieważ jest on uszkodzony:\n"
+msgstr[1] ""
+"Zaimportowanie %d plików się nie powiodło, ponieważ są one uszkodzone:\n"
+msgstr[2] ""
+"Zaimportowanie %d plików się nie powiodło, ponieważ są one uszkodzone:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Pominięto jedno nieobsługiwane zdjęcie:\n"
+msgstr[1] "Pominięto %d nieobsługiwane zdjęcia:\n"
+msgstr[2] "Pominięto %d nieobsługiwanych zdjęć:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Pominięto jeden plik nie będący obrazem.\n"
+msgstr[1] "Pominięto %d pliki nie będące obrazami.\n"
+msgstr[2] "Pominięto %d plików nie będących obrazami.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Pominięto jedno zdjęcie z powodu anulowania przez użytkownika:\n"
+msgstr[1] "Pominięto %d zdjęcia z powodu anulowania przez użytkownika:\n"
+msgstr[2] "Pominięto %d zdjęć z powodu anulowania przez użytkownika:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+"Pominięto jedno nagranie wideo z powodu anulowania przez użytkownika:\n"
+msgstr[1] ""
+"Pominięto %d nagrania wideo z powodu anulowania przez użytkownika:\n"
+msgstr[2] "Pominięto %d nagrań wideo z powodu anulowania przez użytkownika:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"Pominięto jedno zdjęcie/nagranie wideo z powodu anulowania przez "
+"użytkownika:\n"
+msgstr[1] ""
+"Pominięto %d zdjęcia/nagrania wideo z powodu anulowania przez użytkownika:\n"
+msgstr[2] ""
+"Pominięto %d zdjęć/nagrań wideo z powodu anulowania przez użytkownika:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Pominięto jeden plik z powodu anulowania na żądanie użytkownika:\n"
+msgstr[1] "Pominięto %d pliki z powodu anulowania na żądanie użytkownika:\n"
+msgstr[2] "Pominięto %d plików z powodu anulowania na żądanie użytkownika:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Jedno zdjęcie zostało pomyślnie zaimportowane.\n"
+msgstr[1] "%d zdjęcia zostały pomyślnie zaimportowane.\n"
+msgstr[2] "%d zdjęć zostało pomyślnie zaimportowanych.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Jedno nagranie wideo zostało pomyślnie zaimportowane.\n"
+msgstr[1] "%d nagrania wideo zostały pomyślnie zaimportowane.\n"
+msgstr[2] "%d nagrań wideo zostało pomyślnie zaimportowanych.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Jedno zdjęcie/nagranie wideo zostało pomyślnie zaimportowane.\n"
+msgstr[1] "%d zdjęcia/nagrania wideo zostały pomyślnie zaimportowane.\n"
+msgstr[2] "%d zdjęć/nagrań wideo zostało pomyślnie zaimportowanych.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Nie zaimportowano żadnych zdjęć lub nagrań wideo.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Ukończono importowanie"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunda"
+msgstr[1] "%d sekundy"
+msgstr[2] "%d sekund"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuty"
+msgstr[2] "%d minut"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d godzina"
+msgstr[1] "%d godziny"
+msgstr[2] "%d godzin"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "dzień"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Zmień nazwę wydarzenia"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Modyfikacja tytułu"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Tytuł:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Modyfikuj komentarz wydarzenia"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Modyfikuj komentarz zdjęcia/nagrania wideo"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Komentarz:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Przenieś plik do kosza"
+msgstr[1] "_Przenieś pliki do kosza"
+msgstr[2] "_Przenieś pliki do kosza"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Tylko _usuń"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Zatrzymaj"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Odwrócić zewnętrzną modyfikację?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Odwrócić zewnętrzne modyfikacje?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Unieważni to wszystkie zmiany wprowadzone do zewnętrznego pliku. Kontynuować?"
+msgstr[1] ""
+"Unieważni to wszystkie zmiany wprowadzone do %d zewnętrznych plików. "
+"Kontynuować?"
+msgstr[2] ""
+"Unieważni to wszystkie zmiany wprowadzone do %d zewnętrznych plików. "
+"Kontynuować?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Od_wróć zewnętrzną modyfikację"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Od_wróć zewnętrzne modyfikacje"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Zdjęcie zostanie usunięte z kolekcji. Kontynuować?"
+msgstr[1] "%d zdjęcia zostaną usunięte z kolekcji. Kontynuować?"
+msgstr[2] "%d zdjęć zostaną usuniętych z kolekcji. Kontynuować?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Usuń"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Usuwanie zdjęcia z kolekcji"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Usuwanie zdjęć z kolekcji"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24-godzinny"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Prze_suń zdjęcia/nagrania wideo o tą samą wartość"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Ust_aw wszystkie zdjęcia/nagrania wideo na ten czas"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modyfikuj oryginalny plik zdjęcia"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modyfikuj oryginalny pliki zdjęć"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modyfikuj pierwotny plik"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modyfikuj pierwotne pliki"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Oryginał: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d %b %Y, %H∶%M∶%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d %b %Y, %I∶%M∶%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Czas ekspozycji zostanie przesunięty do przodu o\n"
+"%d %s, %d %s, %d %s i %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Czas ekspozycji zostanie przesunięty do tyłu o\n"
+"%d %s, %d %s, %d %s i %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dzień"
+msgstr[1] "dni"
+msgstr[2] "dni"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "godzina"
+msgstr[1] "godziny"
+msgstr[2] "godzin"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekunda"
+msgstr[1] "sekundy"
+msgstr[2] "sekund"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Oraz jedno inne."
+msgstr[1] ""
+"\n"
+"\n"
+"Oraz %d inne."
+msgstr[2] ""
+"\n"
+"\n"
+"Oraz %d innych."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etykiety (oddzielone przecinkami):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Witaj"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Witaj w programie Shotwell"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Aby rozpocząć, należy zaimportować zdjęcia na jeden z poniższych sposobów:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Wybranie <span weight=\"bold\">Plik %s Zaimportuj z katalogu</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Przeniesienie zdjęć do okna programu Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Połączenie aparatu do komputera i zaimportowanie"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Zaimportuj zdjęcia z katalogu %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Można także zaimportować zdjęcia na jeden z poniższych sposobów:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Bez wyświetlania tego komunikatu ponownie"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Import zdjęć z kolekcji programu %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Pomoc)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Rok%smiesiąc%sdzień"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Rok%smiesiąc"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Rok%smiesiąc-dzień"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Rok-miesiąc-dzień"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Własny"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Nieprawidłowy wzór"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Program Shotwell może skopiować zdjęcia do katalogu kolekcji lub może "
+"zaimportować je bez tworzenia ich kopii."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Skopiowanie zdjęć"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Zaimportowanie"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Zaimportuj do kolekcji"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Usuń z kolekcji"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Usuwanie zdjęcia z kolekcji"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Usuwanie zdjęć z kolekcji"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Zdjęcie/nagranie wideo zostanie usunięte z kolekcji programu Shotwell. "
+"Przenieść także plik do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[1] ""
+"%d zdjęcia/nagrania wideo zostaną usunięte z kolekcji programu Shotwell. "
+"Przenieść także pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[2] ""
+"%d zdjęć/nagrań wideo zostanie usunięte z kolekcji programu Shotwell. "
+"Przenieść także pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Nagranie wideo zostanie usunięte z kolekcji programu Shotwell. Przenieść "
+"także plik do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[1] ""
+"%d nagrania wideo zostaną usunięte z kolekcji programu Shotwell. Przenieść "
+"także pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[2] ""
+"%d nagrań wideo zostanie usuniętych z kolekcji programu Shotwell. Przenieść "
+"także pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Zdjęcie zostanie usunięte z kolekcji programu Shotwell. Przenieść także plik "
+"do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[1] ""
+"%d zdjęcia zostaną usunięte z kolekcji programu Shotwell. Przenieść także "
+"pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+msgstr[2] ""
+"%d zdjęcia zostaną usunięte z kolekcji programu Shotwell. Przenieść także "
+"pliki do kosza?\n"
+"\n"
+"Tej czynności nie można cofnąć."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Nie można przenieść zdjęcia lub nagrania wideo do kosza. Usunąć ten plik?"
+msgstr[1] ""
+"Nie można przenieść %d zdjęć lub nagrań wideo do kosza. Usunąć te pliki?"
+msgstr[2] ""
+"Nie można przenieść %d zdjęć lub nagrań wideo do kosza. Usunąć te pliki?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Nie można usunąć zdjęcia lub nagrania wideo."
+msgstr[1] "Nie można usunąć %d zdjęć lub nagrań wideo."
+msgstr[2] "Nie można usunąć %d zdjęć lub nagrań wideo."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Szerokość lub wysokość"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Szerokość"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Wysokość"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Nie można monitorować %s: nie jest katalogiem (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Wydarzenie %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nie można utworzyć pliku tymczasowego dla %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Eksportowanie"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Plik %s już istnieje. Zastąpić?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Pomiń"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Zastąp"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Z_astąp wszystkie"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Eksport"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nie można przetworzyć aktualizacji monitorowania: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Dopasowuje rozmiar miniatur"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Pow_iększ"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Zwiększa powiększenie miniatur"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "P_omniejsz"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Zmniejsza powiększenie miniatur"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Uporządkuj zdjęcia"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Odtwórz nagranie wideo"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Otwiera wybrane nagrania wideo w systemowym odtwarzaczu filmów"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Wywoływacz"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Aparat"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Tytuły"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Wyświetla tytuł każdego zdjęcia"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Komentarze"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Wyświetla komentarz każdego zdjęcia"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "_Etykiety"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Wyświetla etykiety każdego zdjęcia"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Według _tytułu"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Porządkuje zdjęcia według tytułu"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "We_dług daty ekspozycji"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Porządkuje zdjęcia według daty ekspozycji"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Według _oceny"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Porządkuje zdjęcia według oceny"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Rosnąco"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Porządkuje zdjęcia w porządku rosnącym"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "Mal_ejąco"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Porządkuje zdjęcia w porządku malejącym"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Program Shotwell nie może odtworzyć wybranego nagrania wideo:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Brak zdjęć/nagrań wideo"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nie odnaleziono zdjęć/nagrań wideo"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Nie można eksportować zdjęć do tego katalogu."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "zmodyfikowany"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Poprzednie zdjęcie"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Następne zdjęcie"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Brak pliku źródłowego zdjęcia: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Widok"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Narzędzia"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Poprzednie zdjęcie"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Poprzednie zdjęcie"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Następne zdjęcie"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Następne zdjęcie"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Zwiększa powiększenie zdjęcia"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Zmniejsza powiększenie zdjęcia"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Dopasowanie do _strony"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Powiększa zdjęcie, aby pasowało do ekranu"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Powiększenie _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Powiększa zdjęcie do 100%"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Powiększenie _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Powiększa zdjęcie do 200%"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nie można wyeksportować: %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Wypełnienie całej strony"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "Dwa obrazy na stronę"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "Cztery obrazy na stronę"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "Sześć obrazów na stronę"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "Osiem obrazów na stronę"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 obrazów na stronę"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 obrazy na stronę"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "cale"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Portfel (2x3 cale)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notatka (3x5 cali)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4x6 cali"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5x7 cali"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8x10 cali"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11x14 cali"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16x20 cali"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Portfel metryczny (9x13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Kartka pocztowa (10x15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13x18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18x24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20x30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24x40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30x40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Ustawienia obrazu"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Drukowanie..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nie można wydrukować zdjęcia:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Elementy:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d wydarzenie"
+msgstr[1] "%d wydarzenia"
+msgstr[2] "%d wydarzeń"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d zdjęcie"
+msgstr[1] "%d zdjęcia"
+msgstr[2] "%d zdjęć"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d nagranie wideo"
+msgstr[1] "%d nagrania wideo"
+msgstr[2] "%d nagrań wideo"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Czas:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Od:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Do:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Rozmiar:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Czas trwania:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekund"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Wywoływacz:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Ekspozycja:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Położenie:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Rozmiar pliku:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Bieżący wywoływacz:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Wymiary pierwotne:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Producent aparatu:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model aparatu:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Lampa błyskowa:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Odległość ogniskowa:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data ekspozycji:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Czas ekspozycji:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Wpływ na ekspozycję:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Szerokość geograficzna GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Długość geograficzna GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artysta:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Prawa autorskie:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Oprogramowanie:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Rozszerzone informacje"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Menedżer zdjęć"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Przeglądarka zdjęć"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Obróć w p_rawo"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Obróć"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Obróć w prawo"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Obraca zdjęcia w prawo (naciśnięcie klawisza Ctrl obraca w lewo)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Obróć w _lewo"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Obróć w lewo"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Obraca zdjęcia w lewo"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Odwróć po_ziomo"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Odwróć poziomo"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Odwróć pi_onowo"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Odwróć pionowo"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Ul_epsz"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Ulepsz"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automatycznie ulepsza wygląd zdjęcia"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "S_kopiuj dostosowania kolorów"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Skopiuj dostosowania kolorów"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Kopiuje dostosowania kolorów zastosowane na zdjęciu"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Wklej dostosowania kolorów"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Wklej dostosowania kolorów"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Wkleja sopiowane dostosowania kolorów zastosowane na zdjęciu"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "Przyt_nij"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Przytnij"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Przycina rozmiar zdjęcia"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Wyrównaj"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Wyrównaj"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Wyrównuje zdjęcie"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Czerwone oczy"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Czerwone oczy"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Zmniejsza lub usuwa wszystkie efekty czerwonych oczu na zdjęciu"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Dopasuj"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Dopasuj"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Dopasowuje kolor i tonację zdjęcia"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Przy_wróć pierwotne"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Przywróć pierwotne"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Odwróć zewnętrzne mo_dyfikacje"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Przywraca pierwotne zdjęcie"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Ustaw jako tło p_ulpitu"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Ustawia wybrany obraz jako nowe tło pulpitu"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Ustaw jako pokaz slaj_dów pulpitu..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "Cof_nij"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Cofnij"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "P_onów"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Ponów"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Zmień _nazwę wydarzenia..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Utwórz _kluczowe zdjęcie dla wydarzenia"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Tworzy kluczowe zdjęcie dla wydarzenia"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nowe wydarzenie"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Nowe wydarzenie"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Przenieś zdjęcia"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Przenosi zdjęcia do innego wydarzenia"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Połącz wydarzenia"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Połącz"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Łączy wydarzenia w jedno"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "U_staw ocenę"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Ustaw ocenę"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Zmienia ocenę zdjęcia"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "Z_większ"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Zwiększ ocenę"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Zmniejsz"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Zmniejsz ocenę"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Bez oceny"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Bez oceny"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Ustaw jako bez oceny"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Ustawianie jako bez oceny"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Usuwa wszystkie oceny"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Odrzucona"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Odrzucona"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Odrzucona ocena"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Ustawianie jako odrzucona"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Ustawia ocenę jako odrzuconą"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Tylko _odrzucone"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Tylko odrzucone"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Wyświetla tylko odrzucone zdjęcia"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Wszystko + _odrzucone"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Wyświetla wszystkie zdjęcia, w tym odrzucone"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Wszystkie zdjęcia"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Wyświetla wszystkie zdjęcia"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "O_ceny"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Wyświetla oceny każdego zdjęcia"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtruj zdjęcia"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtruj zdjęcia"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ogranicza liczbę wyświetlanych zdjęć w oparciu o filtr"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Utwórz _duplikat"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Utwórz duplikat"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Tworzy duplikat zdjęcia"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "Wy_eksportuj..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Wy_drukuj..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Opu_blikuj..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publikuje na różnych witrynach WWW"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Mo_dyfikuj tytuł..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Modyfikuj _komentarz..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Modyfikacja komentarza"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Modyfikuj _komentarz wydarzenia:"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Dostosuj d_atę i czas..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Dostosowuje datę i czas"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Dodaj e_tykiety..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Dodaj etykiety..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Dodaj etykiety"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferencje"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "_Otwórz za pomocą zewnętrznego edytora"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Otwórz za pomocą edytora plików _RAW"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Wyślij _do..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Wyślij d_o..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Znajdź..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Wyszukiwanie"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Wyszukuje obraz przez wpisanie tekstu pojawiającego się w jego nazwie lub "
+"etykietach"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "Dod_aj flagę"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Usuń flagę"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nie można uruchomić edytora: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Dodaj etykietę \"%s\""
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Dodaj etykiety \"%s\" i \"%s\""
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Usuń etykietę \"%s\""
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Usuń etykietę \"%s\""
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Usuń etykietę"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Nowa"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Zmień _nazwę etykiety \"%s\"..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Zmień nazwę etykiety \"%s\" na \"%s\""
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Zmień nazwę..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "M_odyfikuj etykiety..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modyfikuj etykiety"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Dodaje etykietę \"%s\" do zdjęcia"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Dodaje etykietę \"%s\" do zdjęć"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Dodaje etykietę \"%s\" do wybranego zdjęcia"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Dodaje etykietę \"%s\" do wybranych zdjęć"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Usuń etykietę \"%s\" ze _zdjęcia"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Usuwa etykietę \"%s\" ze _zdjęć"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Usuwa etykietę \"%s\" ze zdjęcia"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Usuwa etykietę \"%s\" ze zdjęć"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Nie można zmienić nazwy etykiety na \"%s\", ponieważ ta etykieta już "
+"istnieje."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Nie można zmienić nazwy wyszukiwania na \"%s\", ponieważ takie wyszukiwanie "
+"już istnieje."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Zapisane wyszukiwanie"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Usunięcie wyszukiwania"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Modyfikuj..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Zmień _nazwę..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Zmienia nazwę wyszukiwania z \"%s\" na \"%s\""
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Usuwa wyszukiwanie \"%s\""
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Ocena %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Ustaw ocenę na %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Ustawianie oceny na %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Wyświetlanie %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Wyświetla tylko z oceną %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s lub lepszą"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Wyświetlanie %s lub lepszych"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Wyświetla tylko zdjęcia z oceną %s lub lepszą"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Usuwa wybrane zdjęcia z kosza"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Usuwa wybrane zdjęcia z kolekcji"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "P_rzywróć"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Przenosi wybrane zdjęcia z powrotem do kolekcji"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Wyświetl w mene_dżerze plików"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Otwiera wybrany katalog zdjęć w menedżerze plików"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nie można otworzyć w menedżerze plików: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Usuń z kolekcji"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Przenieś do _kosza"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Z_aznacz wszystkie"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Zaznacza wszystkie elementy"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%H∶%M"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%H∶%M∶%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %e %b %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %e %b"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%e, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Pokaz slajdów"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Oznaczone flagą"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Zdjęcia"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Nagrania wideo"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Zdjęcia RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Zdjęcia RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Błąd podczas wczytywania pliku interfejsu użytkownika %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Typ"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Ocena"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Ustawienia"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Wstecz"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Przechodzi do poprzedniego zdjęcia"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Wstrzymaj"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Wstrzymuje pokaz slajdów"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Dalej"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Przechodzi do następnego zdjęcia"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Zmienia ustawienia pokazu slajdów"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Brak wszystkich plików źródłowych zdjęć."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Odtwórz"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Kontynuuje pokaz slajdów"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "bez nazwy"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Eksport nagrań wideo"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Aparaty"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Nie można odmontować aparatu. Proszę spróbować odmontować aparat w "
+"menedżerze plików."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ukrywa już zaimportowane zdjęcia"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Wyświetla tylko zdjęcia, które nie zostały jeszcze zaimportowane"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Rozpoczynanie importowania, proszę czekać..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Zaimportuj wybrane"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importuje wybrane zdjęcia do kolekcji"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Z_aimportuj wszystkie"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importuje wszystkie zdjęcia do kolekcji"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Program Shotwell musi odmontować aparat z systemu plików, aby uzyskać do "
+"niego dostęp. Kontynuować?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "Odmont_uj"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Proszę odmontować aparat."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Aparat jest zablokowany przez inny program. Program Shotwell może uzyskać "
+"dostęp do aparatu tylko wtedy, kiedy nie jest zablokowany. Proszę zamknąć "
+"wszystkie pozostałe programy używające aparatu i spróbować ponownie."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Proszę zamknąć inne programy używające aparatu."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nie można pobrać podglądu z aparatu:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Odmontowywanie..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Pobieranie informacji o zdjęciach"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Pobieranie podglądu dla %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Nie można zablokować aparatu: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Usunąć to zdjęcie z aparatu?"
+msgstr[1] "Usunąć te %d zdjęcia z aparatu?"
+msgstr[2] "Usunąć te %d zdjęć z aparatu?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Usunąć to nagranie wideo z aparatu?"
+msgstr[1] "Usunąć te %d nagrania wideo z aparatu?"
+msgstr[2] "Usunąć te %d nagrań wideo z aparatu?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Usunąć to zdjęcie/nagranie wideo z aparatu?"
+msgstr[1] "Usunąć te %d zdjęcia/nagrania wideo z aparatu?"
+msgstr[2] "Usunąć te %d zdjęć/nagrań wideo z aparatu?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Usunąć te pliki z aparatu?"
+msgstr[1] "Usunąć %d pliki z aparatu?"
+msgstr[2] "Usunąć %d plików z aparatu?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Usuwanie zdjęć/nagrań wideo z aparatu"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Nie można usunąć %d zdjęcia/nagrania wideo z aparatu z powodu błędów."
+msgstr[1] "Nie można usunąć %d zdjęć/nagrań wideo z aparatu z powodu błędów."
+msgstr[2] "Nie można usunąć %d zdjęć/nagrań wideo z aparatu z powodu błędów."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importowanie danych"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Baza danych %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"Importowanie z %s nie może być kontynuowane z powodu wystąpienia błędu:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Aby spróbować zaimportować z innego serwisu należy wybrać go z powyższego "
+"menu."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nie włączono żadnych wtyczek importowania danych.\n"
+"\n"
+"Aby użyć funkcji importowania z programu należy posiadać co najmniej jedną "
+"włączoną wtyczkę importowania danych. Wtyczki można włączać w oknie "
+"Preferencji."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Plik bazy danych:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "Zai_mportuj"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Import z programu"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importowanie multimediów _z:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "Zam_knij"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nie można otworzyć/utworzyć bazy danych zdjęć %s: kod błędu: %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nie można zapisać do pliku bazy danych zdjęć:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Błąd podczas uzyskiwania dostępu do pliku bazy danych:\n"
+" %s\n"
+"\n"
+"Błąd: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Plik"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "Zapi_sz"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Zapisuje zdjęcie"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Z_apisz jako..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Zapisuje zdjęcie pod inną nazwą"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Drukuje zdjęcie na drukarce podłączonej do komputera"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Edycja"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Zdjęcie"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "Pomo_c"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s nie istnieje."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nie jest plikiem."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"Program %s nie obsługuje formatu pliku\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "Zapi_sz kopię"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Utracić zmiany w %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Zamknij _bez zapisywania"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Błąd podczas zapisywania zdjęcia do %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Zapisz jako"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Powraca do bieżących wymiarów zdjęcia"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Ustawia przycięcie tego zdjęcia"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Obraca prostokąt przycięcia między orientacją poziomą a pionową"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Niewymuszony"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Kwadratowy"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Ekran"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "Plik wideo SD (4:3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "Plik wideo HD (16:9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 cali)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 cali)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Zamyka narzędzie usuwania czerwonych oczu"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Usuwa wszystkie efekty czerwonych oczu na wybranym obszarze"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "P_rzywróć"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Nasycenie:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Odcień:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Cienie:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Wyróżnienia:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Przywróć kolory"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Przywraca wszystkie dostosowania kolorów do pierwotnych"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Odcień"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Nasycenie"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Ekspozycja"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Cienie"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Wyróżnienia"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Rozszerzenie kontrastu"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Kąt:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d zdjęcie/nagranie wideo"
+msgstr[1] "%d zdjęcia/nagrania wideo"
+msgstr[2] "%d zdjęć/nagrań wideo"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Brak wydarzenia"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Wyświetlanie komentarza dla każdego wydarzenia"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Brak wydarzeń"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nie odnaleziono wydarzeń"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Wydarzenia"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Niedatowane"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Katalogi"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Kolekcja"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importowanie..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Zatrzymaj importowanie"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Zatrzymuje importowanie zdjęć"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Przygotowywanie do zaimportowania..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Zaimportowano %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Ostatni import"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Zaimportuj z katalogu..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importuje zdjęcia z dysku do kolekcji"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Zaimportuj z p_rogramu..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Uporządkuj wydarz_enia"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Opróżnij _kosz"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Usuwa wszystkie zdjęcia z kosza"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Wyświetl wydarze_nie dla zdjęcia"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Znajdź"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Wyszukuje zdjęcia i nagrania wideo według kryteriów wyszukiwania"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "No_we zapisane wyszukiwanie..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Zdjęcia"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Wy_darzenia"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Podstawowe informacje"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Wyświetla podstawowe informacje o wybranych zdjęciach"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Rozszerzone informacje"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Wyświetla rozszerzone informacje o wybranych zdjęciach"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Pasek wy_szukiwania"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Wyświetla pasek wyszukiwania"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Panel _boczny"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Wyświetla panel boczny"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importowanie z katalogu"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Opróżnij kosz"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Opróżnianie kosza..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Program Shotwell został skonfigurowany, aby importować zdjęcia do katalogu "
+"domowego.\n"
+"Zalecana jest zmiana tego ustawienia w <span weight=\"bold\">Edycja %s "
+"Preferencje</span>.\n"
+"Kontynuować importowanie zdjęć?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Położenie kolekcji"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Nie można importować zdjęć z tego katalogu."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Aktualizowanie kolekcji..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Przygotowywanie do automatycznego zaimportowania zdjęć..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Automatyczne importowanie zdjęć..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Zapisywanie metadanych do plików..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Brak plików"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Usuwanie..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Kosz"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Kosz jest pusty"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Usuń"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Usuwanie zdjęć"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Kolekcja zdjęć nie jest zgodna z tą wersją programu Shotwell. Została "
+"utworzona przez program Shotwell %s (schemat %d). Ta wersja to %s (schemat "
+"%d). Proszę używać najnowszej wersji programu Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Program Shotwell nie mógł zaktualizować kolekcji zdjęć z wersji %s (schemat "
+"%d) do %s (schemat %d). Aby dowiedzieć się więcej, proszę sprawdzić wiki "
+"programu Shotwell na %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Kolekcja zdjęć nie jest zgodna z tą wersją programu Shotwell. Została "
+"utworzona przez program Shotwell %s (schemat %d). Ta wersja to %s (schemat "
+"%d). Proszę wyczyścić kolekcję przez usunięcie %s i ponowne zaimportowanie "
+"zdjęć."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Nieznany błąd podczas próby sprawdzenia bazy danych programu Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Wczytywanie programu Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Ścieżka do prywatnych danych programu Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "KATALOG"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Bez monitorowania zmian w katalogu kolekcji podczas uruchamiania"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Bez wyświetlania paska postępu uruchamiania"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Wyświetla wersję programu"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[PLIK]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Wykonanie polecenia \"%s --help\" wyświetli pełną listę dostępnych opcji "
+"wiersza poleceń.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Niskie (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Średnie (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Wysokie (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maksymalne (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publikowanie"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Przygotowywanie do wysłania"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Wysyłanie %d z %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Nie można kontynuować publikowania w serwisie %s z powodu błędu:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Aby spróbować opublikowania do innego serwisu, należy wybrać jeden z "
+"powyższego menu."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Wybrane zdjęcia/nagrania wideo zostały pomyślnie opublikowane."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Wybrane nagrania wideo zostały pomyślnie opublikowane."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Wybrane zdjęcia zostały pomyślnie opublikowane."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Wybrane nagranie wideo zostało pomyślnie opublikowane."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Wybrane nagrania wideo zostały pomyślnie opublikowane."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Pobieranie informacji o koncie..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Logowanie..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publikacja zdjęć"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publikowanie zdjęć _do:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publikacja nagrań wideo"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publikowanie nagrań wideo _do"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publikacja zdjęć i nagrań wideo"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publikowanie zdjęć i nagrań wideo _do"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nie można opublikować"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Program Shotwell nie może opublikować wybranych elementów, ponieważ nie "
+"włączono zgodnej wtyczki publikowania. Aby to naprawić, należy wybrać "
+"<b>Modyfikacja preferencji programu %s </b> i włączyć jedną lub więcej "
+"wtyczek publikowania w karcie <b>Wtyczki</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Zapisane wyszukiwania"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "zawiera"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "wynosi dokładnie"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "rozpoczyna się od"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "kończy się na"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "nie zawiera"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nie jest ustawione"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "jest"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nie jest"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "wszystkie zdjęcia"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "surowe zdjęcie"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "nagranie wideo"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "posiada"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "nie posiada"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modyfikacje"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "wewnętrzne modyfikacje"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "zewnętrzne modyfikacje"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "oznaczone flagą"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "nieoznaczone flagą"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "i wyższe"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "tylko"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "i niższe"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "jest po"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "jest przed"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "jest między"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "oraz"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "dowolne"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "wszystko"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "brak"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Dowolny tekst"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Tytuł"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etykieta"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Komentarz"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nazwa wydarzenia"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nazwa pliku"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Typ nośnika"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Stan flagi"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Stan zdjęcia"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nowa _etykieta..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Przejścia pokazu slajdów"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Brak)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Brak"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Losowe"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etykiety"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Ustaw jako pokaz slajdów pulpitu"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Utwórz pokaz slajdów tła pulpitu"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Wyświetlanie każdego zdjęcia przez"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "okres czasu"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Jak długo każde zdjęcie jest wyświetlane jako tło pulpitu"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Wyszukiwanie"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Nazwa wyszukiwania:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "_Dopasowanie"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "następujących:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Rozmiar wydrukowanego obrazu</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Użycie _standardowego rozmiaru:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "_Użycie własnego rozmiaru:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "Utrzy_mywanie proporcji zdjęcia"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "Rozmiar _automatyczny:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Tytuły</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Drukowanie _tytułów obrazów"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Rozdzielczość w pikselach</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "Wyjście zdjęcia na:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "piksele na cal"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Preferencje programu Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "biały"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "czarny"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Obserwacja katalogu kolekcji pod kątem nowych plików"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metadane"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Zapisywanie etykiet, tytułów i innych metadanych do plików zdjęć"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Ekran"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importowanie zdjęć do:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Tło:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importowanie"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Struktura _katalogów:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Wzór:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Przykład:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "_Zmienianie nazw importowanych plików na małe litery"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Wywoływacz RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Domyślnie:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "_Zewnętrzny edytor zdjęć:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Zewnętrzny edytor plików _RAW:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Zewnętrzne edytory"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Wtyczki"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "_Opóźnienie:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "_Efekt przejścia:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Opóźnienie prz_ejścia:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Wyświetlanie tyt_ułu"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "sekundy"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "Za_loguj"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..3d7357d
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,4609 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# manuelmarque <manuelmarque@gmail.com>, 2012
+# manuelmarque <manuelmarque@gmail.com>, 2012
+# Master0010 <miguel.fontoura1@gmail.com>, 2012
+# Master0010 <miguel.fontoura1@gmail.com>, 2012
+# Sérgio Marques <smarquespt@gmail.com>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Master0010 <miguel.fontoura1@gmail.com>, 2012
+# Sérgio Marques <smarquespt@gmail.com>, 2011-2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-24 09:40+0000\n"
+"Last-Translator: Sérgio Marques <smarquespt@gmail.com>\n"
+"Language-Team: Portuguese (http://www.transifex.com/projects/p/shotwell/"
+"language/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Evento %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Câmaras"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Câmara"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Não foi possível desmontar a câmara. Tente desmontar a câmara com o gestor "
+"de ficheiros."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ocultar fotos já importadas"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Mostrar apenas as fotos que não foram importadas"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "A iniciar importação, aguarde..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Títulos"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Exibir título de cada foto"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importar _seleção"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importar fotos selecionadas para a galeria"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importar _todas"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importar todas as fotos para a galeria"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Para aceder à câmara, o Shotwell tem que a desmontar do sistema de "
+"ficheiros. Continuar?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmontar"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Por favor desmonte a câmara"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"A câmara está bloqueada por outra aplicação. O Shotwell só pode aceder à "
+"câmara se esta não estiver bloqueada. Por favor feche qualquer outra "
+"aplicação que lhe esteja a aceder e tente novamente."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"Por favor feche qualquer outra aplicação que esteja a utilizar a câmara"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Não foi possível obter visualizações da câmara:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "A desmontar..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "A obter informações da foto"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "A obter visualização para %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Não foi possível bloquear a câmara: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Eliminar esta foto da câmara?"
+msgstr[1] "Eliminar estas %d fotos da câmara?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Eliminar este vídeo da câmara?"
+msgstr[1] "Eliminar estes %d vídeos da câmara?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Eliminar esta foto/vídeo da câmara?"
+msgstr[1] "Eliminar estas %d fotos/vídeos da câmara?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Eliminar este ficheiro da câmara?"
+msgstr[1] "Eliminar estes %d ficheiros da câmara?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Manter"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "A remover fotos/vídeos na câmara"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Não foi possível eliminar %d foto/vídeo da câmara."
+msgstr[1] "Não foi possível eliminar %d fotos/vídeos da câmara."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "Aprese_ntação"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Iniciar apresentação"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportar fotos/vídeos"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportar fotos/vídeos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exportar fotos"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportar fotos"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Rotação"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "A anular rotação"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "A inverter horizontalmente"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "A anular inversão horizontal"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "A inverter verticalmente"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "A anular inversão vertical"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Qualquer texto"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Título"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Comentário"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nome do evento"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nome do ficheiro"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipo"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Estado da marcação"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Estado da foto"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Avaliação"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contém"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "exatamente"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "inicia com"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "termina com"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "não contém"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "não definida"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "é"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "não é"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "qualquer foto"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "uma foto raw"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "um vídeo"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "tem"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "não tem"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modificações"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modificações internas"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modificações externas"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "marcado"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "não marcado"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "e superior"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "apenas"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "e inferior"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "está depois"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "está antes"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "está entre"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "e"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "qualquer"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "todos"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nenhum"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Pesquisas gravadas"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "No_va pesquisa gravada..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"A sua galeria não é compatível com esta versão do Shotwell. Parece ter sido "
+"criada pelo Shotwell %s (esquema %d). Esta é a versão %s (esquema %d). Por "
+"favor utilize a última versão do Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"O Shotwell não conseguiu atualizar a sua galeria de fotos da versão %s "
+"(esquema %d) para a versão %s (esquema %d). Para mais informações, consulte "
+"o Wiki do Shotwell em %s."
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"A sua galeria de fotos não é compatível com esta versão do Shotwell. Parece "
+"ter sido criada pelo Shotwell %s (esquema %d). Esta é a versão %s (esquema "
+"%d). Por favor apague a galeria existente em %s e faça uma nova importação."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Erro desconhecido ao tentar verificar a base de dados do Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "A carregar Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Caminhos dos dados privados do Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRETÓRIO"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Não monitorizar as alterações da galeria (ao iniciar)"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Não mostrar medidor de evolução de arranque"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Mostrar versão da aplicação"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FICHEIRO]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Digite \"%s --help\" para ver a lista completa das opções de linha de "
+"comandos\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Hoje"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Título:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Itens:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d evento"
+msgstr[1] "%d eventos"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotos"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vídeo"
+msgstr[1] "%d vídeos"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "De:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Para:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Tamanho:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Duração:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segundos"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Editor:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Exposição:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Localização:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Tamanho:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Desenvolvimento:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensões originais:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Marca:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modelo:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Distância focal:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data de exposição:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Hora de exposição:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposição:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitude GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitude GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Direitos de autor:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Aplicação:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informações detalhadas"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Vai remover a etiqueta \"%s\" de uma foto. Continuar?"
+msgstr[1] "Vai remover a etiqueta \"%s\" de %d fotos. Continuar?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "Elimin_ar"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Vai remover a pesquisa \"%s\". Continuar?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Se trocar de editor, todas as alterações efetuadas nesta foto com o Shotwell "
+"serão perdidas."
+msgstr[1] ""
+"Se trocar de editor, todas as alterações efetuadas nestas fotos com o "
+"Shotwell serão perdidas."
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Trocar editor"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportar vídeo"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"O Shotwell não conseguiu criar o ficheiro para edição desta foto, porque "
+"você não tem permissão para escrever em %s"
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Não foi possível exportar a foto indicada devido a um erro\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Pretende continuar a exportação?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuar"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Não modificada"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Atual"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formato:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualidade:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Re_strição de escala:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixeis"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportar detalhes"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Gravar detalhes..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Gravar detalhes"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(e %d mais)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Relatório de importação"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Tentativa de importação de %d ficheiro."
+msgstr[1] "Tentativa de importação de %d ficheiros."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Destes, %d ficheiro foi importado com sucesso."
+msgstr[1] "Destes, %d ficheiros foram importados com sucesso."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Fotos/vídeos não importados por serem duplicados:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "ficheiros duplicados"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Fotos/vídeos não importados devido a erros da câmara:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "mensagem de erro:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Ficheiros não importados por não serem reconhecidos como fotos ou vídeos:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Ficheiros não importados por não serem formatos reconhecidos pelo Shotwell:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr "Ficheiros não importados por não ser possível copiar para a galeria:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"incapaz de copiar %s\n"
+"\tpara %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Fotos/vídeos não importados porque os ficheiros estão danificados:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotos/vídeos não importados por outras razões:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Não foi importada 1 foto duplicada:\n"
+msgstr[1] "Não foram importadas %d fotos duplicadas:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Não foi importado 1 vídeo duplicado:\n"
+msgstr[1] "Não foram importados %d vídeos duplicados:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Não foi importada(o) 1 foto/vídeo duplicada(o):\n"
+msgstr[1] "Não foram importada(o)s %d fotos/vídeos duplicada(o)s:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falha ao importar 1 foto. Ocorreu um erro no ficheiro ou no equipamento:\n"
+msgstr[1] ""
+"Falha ao importar %d fotos. Ocorreu um erro no ficheiro ou no equipamento:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falha ao importar 1 vídeo. Ocorreu um erro no ficheiro ou no equipamento:\n"
+msgstr[1] ""
+"Falha ao importar %d vídeos. Ocorreu um erro no ficheiro ou no equipamento:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falha ao importar 1 foto/vídeo. Ocorreu um erro no ficheiro ou no "
+"equipamento:\n"
+msgstr[1] ""
+"Falha ao importar %d fotos/vídeos. Ocorreu um erro no ficheiro ou no "
+"equipamento:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Falha ao importar um ficheiro em virtude de um erro de equipamento:\n"
+msgstr[1] ""
+"Falha ao importar%d ficheiros em virtude de um erro de equipamento:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ocorreu um erro ao importar 1 foto. Não possui permissões de escrita na "
+"pasta:\n"
+msgstr[1] ""
+"Ocorreu um erro ao importar %d fotos. Não possui permissões de escrita na "
+"pasta:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ocorreu um erro ao importar 1 vídeo. Não possui permissões de escrita na "
+"pasta:\n"
+msgstr[1] ""
+"Ocorreu um erro ao importar %d vídeos. Não possui permissões de escrita na "
+"pasta:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Ocorreu um erro ao importar 1 foto/vídeo. Não possui permissões de escrita "
+"na pasta:\n"
+msgstr[1] ""
+"Ocorreu um erro ao importar %d fotos/vídeos. Não possui permissões de "
+"escrita na pasta:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Falha ao importar 1 ficheiro. Não pode escrever na pasta da galeria:\n"
+msgstr[1] ""
+"Falha ao importar %d ficheiros. Não pode escrever na pasta da galeria:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Falha ao importar 1 foto. Ocorreu um erro na câmara:\n"
+msgstr[1] "Falha ao importar %d fotos. Ocorreu um erro na câmara:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Falha ao importar 1 vídeo. Ocorreu um erro na câmara:\n"
+msgstr[1] "Falha ao importar %d vídeos. Ocorreu um erro na câmara:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Falha ao importar 1 foto/vídeo. Ocorreu um erro na câmara:\n"
+msgstr[1] "Falha ao importar %d fotos/vídeos. Ocorreu um erro na câmara:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Falha ao importar 1 ficheiro em virtude dum erro da câmara:\n"
+msgstr[1] "Falha ao importar %d ficheiros em virtude dum erro da câmara:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 foto não foi importada por estar danificada:\n"
+msgstr[1] "%d fotos não foram importadas por estarem danificadas:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 vídeo não foi importado por estar danificado:\n"
+msgstr[1] "%d vídeos não foram importados por estarem danificados:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 foto/vídeo não foi importada(o) por estar danificada(o):\n"
+msgstr[1] "%d foto/vídeo não foram importada(o)s por estarem danificada(o)s:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 ficheiro não foi importado por estar danificado:\n"
+msgstr[1] "%d ficheiros não foram importados por estarem danificados:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 foto não suportada foi ignorada:\n"
+msgstr[1] "%d fotos não suportadas foram ignoradas:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Foi ignorado 1 ficheiro pois não era uma imagem\n"
+msgstr[1] "Foram ignorado %d ficheiros pois não eram imagens\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Foi ignorado 1 ficheiro em virtude do cancelamento:\n"
+msgstr[1] "Foram ignorados %d ficheiros em virtude do cancelamento:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Foi ignorado 1 vídeo em virtude do cancelamento:\n"
+msgstr[1] "Foram ignorados %d vídeos em virtude do cancelamento:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Foi ignorada(o) 1 foto/vídeo em virtude do cancelamento:\n"
+msgstr[1] "Foram ignorada(o)s %d fotos/vídeos em virtude do cancelamento:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Foi ignorado 1 ficheiro em virtude do cancelamento:\n"
+msgstr[1] "Foram ignorados %d ficheiros em virtude do cancelamento:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Foi importada com sucesso 1 foto\n"
+msgstr[1] "Foram importadas com sucesso %d fotos\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Foi importado com sucesso 1 vídeo\n"
+msgstr[1] "Foram importados com sucesso %d vídeos\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Foi importado com sucesso 1 foto/vídeo\n"
+msgstr[1] "Foram importada(o)s com sucesso %d fotos/vídeos\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Nenhum(a) vídeo ou foto importado(a)\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importação terminada"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dia"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Mudar nome do evento"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editar título"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Editar comentário"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Editar comentário de foto/vídeo"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Eliminar ficheiro"
+msgstr[1] "_Eliminar ficheiros"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Só _remoção"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Reverter edição externa?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Reverter edições externas?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Vai destruir todas as alterações feitas no ficheiro externo. Continuar?"
+msgstr[1] ""
+"Vai destruir todas as alterações feitas em %d ficheiros externos. Continuar?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_verter edições externas"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Re_verter edições externas"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Vai remover a foto da galeria. Continuar?"
+msgstr[1] "Vai remover %d fotos da galeria. Continuar?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Remover"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Remover foto da galeria"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Remover fotos da galeria"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "De_slocar fotos/vídeos na mesma proporção"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Definir fotos/videos para esta hor_a"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modificar foto original"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modificar fotos originais"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modificar ficheiro original"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modificar ficheiros originais"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y-%m-%d, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y-%m-%d, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposição será aumentado em\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposição será diminuido em\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"E mais %d."
+msgstr[1] ""
+"\n"
+"\n"
+"E mais %d."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetas (separadas por vírgulas):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bem-vindo!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Bem-vindo ao Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Para iniciar, importe as fotos de alguma destas formas:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Escolha <span weight=\"bold\">Ficheiro %s importar da pasta</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arraste e solte as fotos na janela do Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Ligue uma câmara ao computador e importe"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importar fotos na pasta %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Também pode importar fotos de alguma destas formas:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Não exibir no_vamente a mensagem"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importar fotos da galeria %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Ajuda)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Ano%sMês%sDia"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Ano%sMês"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Ano%sMês-Dia"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Ano-Mês-Dia"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalizar"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Padrão inválido"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"O Shotwell pode copiar as fotos para a galeria, mas também as consegue "
+"importar sem copiar"
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "C_opiar fotos"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importar sem copiar"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importar para a galeria"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Remover da galeria"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "A remover foto da galeria"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "A remover fotos da galeria"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover 1 foto/vídeo da sua galeria Shotwell. Gostaria também de "
+"mover o ficheiro para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada"
+msgstr[1] ""
+"Isto irá remover %d fotos/vídeos da sua galeria Shotwell. Gostaria também de "
+"mover os ficheiros para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover 1 vídeo da sua galeria Shotwell. Gostaria também de mover o "
+"ficheiro para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada"
+msgstr[1] ""
+"Isto irá remover %d vídeos da sua galeria Shotwell. Gostaria também de mover "
+"os ficheiros para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover 1 foto da sua galeria Shotwell. Gostaria também de mover o "
+"ficheiro para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada"
+msgstr[1] ""
+"Isto irá remover %d fotos da sua galeria Shotwell. Gostaria também de mover "
+"os ficheiros para o lixo?\n"
+"\n"
+"Esta ação não pode ser anulada."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"A foto/vídeo não pode ser movida(o) para o lixo. Eliminar permanentemente? "
+msgstr[1] ""
+"%d fotos/vídeos não podem ser movida(o)s para o lixo. Eliminar "
+"permanentemente?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "A foto/vídeo não pode ser eliminada(o)."
+msgstr[1] "%d fotos/vídeos não podem ser eliminada(o)s."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Pastas"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Sucesso"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Erro de ficheiro"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Não foi possível descodificar o ficheiro"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Erro na base de dados"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "O utilizador cancelou a importação"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Não é um ficheiro"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "O ficheiro já existe na base de dados"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "O formato do ficheiro não é suportado"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Não é uma imagem"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Falha de disco"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disco cheio"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Erro de câmara"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Erro ao escrever"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Ficheiro danificado"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Falha ao importar (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificado"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto anterior"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Foto seguinte"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Falta o ficheiro fonte da foto: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Ver"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Ferramentas"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Foto a_nterior"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto anterior"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Foto seg_uinte"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Foto seguinte"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "A_mpliar"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumentar tamanho da foto"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Reduzir"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Diminuir tamanho da foto"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Ajustar à _página"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Ampliar foto para ajustar ao ecrã"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Ampliação _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Ampliar foto para 100 por cento"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Ampliação _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Ampliar foto para 200 por cento"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Editor"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Não foi possível exportar %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de dados %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "A importação de %s não pode continuar porque ocorreu um erro:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Para importar de outros serviços, escolha uma opção no menu acima."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importação de dados"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Não possui qualquer \"plugin\" ativo para a importação de dados.\n"
+"\n"
+"Para poder utilizar a função Importar da aplicação tem que ter, pelo menos, "
+"um \"plugin\" de importação ativo. Estes podem ser ativados na caixa de "
+"diálogo das Preferências."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Ficheiro da base de dados:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importar"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importar da aplicação"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importar _ficheiros de:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "Fe_char"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Definições"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Apresentação"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Anterior"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ir para a foto anterior"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausar apresentação"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Seguinte"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ir para a foto seguinte"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Alterar definições da apresentação"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Faltam os ficheiros fonte de todas as fotos"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reproduzir"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continuar apresentação"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "A reverter"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "A anular reversão"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "A melhorar"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "A anular melhoramento"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Aplicar transformações de cor"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Anular transformações de cor"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "A criar novo evento"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "A remover evento"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "A mover fotos para novo evento"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "A atribuir fotos ao evento anterior"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "A juntar"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "A separar"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "A duplicar fotos"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "A remover fotos duplicadas"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Não foi possível duplicar 1 foto devido a um erro"
+msgstr[1] "Não foi possível duplicar %d fotos devido a um erro"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "A restaurar avaliação anterior"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "A aumentar avaliações"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "A diminuir avaliações"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "A definir o editor RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "A restaurar o editor RAW"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Definir editor"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "A foto original não foi ajustada"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "A ajustar data e hora"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "A anular o ajuste de data e hora"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Uma foto original não foi ajustada"
+msgstr[1] "As seguintes fotos originais não foram ajustadas"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Erro de ajuste de hora"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Os ajustes de hora não foram anulados nesta foto"
+msgstr[1] "Os ajustes de hora não foram anulados nestas fotos"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Criar etiqueta"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mover a etiqueta \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mover fotos para o lixo"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurar fotos no lixo"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mover fotos para o lixo do Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurar fotos selecionadas para a galeria"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "A mover fotos para o lixo"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "A restaurar fotos do lixo"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marcar fotos selecionadas"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Desmarcar fotos selecionadas"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marcando fotos selecionadas"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Desmarcando fotos selecionadas"
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcar"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Desmarcar"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baixa (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Média (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alta (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Máxima (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Sem fotos/vídeos"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nenhum(a) vídeo/foto encontrada"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "As fotos não podem ser exportadas para este diretório"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Não foi possível monitorizar as atualizações: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Preencher a página"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imagens por página"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imagens por página"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imagens por página"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imagens por página"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 imagens por página"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imagens por página"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "pol"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Carteira (2 x 3 pol.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Cartão de visita (3 x 5 pol.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 pol."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 pol."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 pol."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 pol."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 pol."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Carteira métrica (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Postal (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Definições da imagem"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "A imprimir..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Não foi possível imprimir a foto: \n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Não foi possível abrir/criar a base de dados %s. Erro %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Não foi possível escrever na base de dados:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Erro ao aceder à base de dados:\n"
+" %s\n"
+"\n"
+"Detalhe do erro: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exportar vídeos"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Não foi possível iniciar Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Enviar para"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Não foi possível exportar o fundo para %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Não foi possível preparar a apresentação: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Marcada"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Lixo"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "O lixo está vazio"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "A eliminar fotos"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Ficheiros em falta"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "A eliminar..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Última importação"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importar da pasta..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importar fotos do disco para a galeria"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importar da _aplicação..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Organizar _eventos"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Esvazia_r lixo"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Eliminar todas as fotos no lixo"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "_Ver evento da foto"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Procurar"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Procurar fotos e vídeos por critérios de pesquisa"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Ficheiro"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Editar"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "F_oto"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "F_otos"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_tos"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Eti_quetas"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Ajuda"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informações _básicas"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Exibir informações básicas para a seleção"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informações detal_hadas"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Exibir informações detalhadas para a seleção"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Barra de pe_squisa"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Mostrar barra de pesquisa"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Barra lateral"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Mostrar barra lateral"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "A_scendente"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Organizar fotos por ordem ascendente"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escendente"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Organizar fotos por ordem descendente"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importar da pasta"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Esvaziar lixo"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "A esvaziar lixo..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"O Shotwell está configurado para importar fotos para a sua pasta pessoal\n"
+"\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Localização da galeria"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "As fotos neste diretório não podem ser importadas"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "A atualizar galeria..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "A preparar importação de fotos..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "A importar fotos..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "A escrever dados nos ficheiros..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Galeria"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "A importar..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Pa_rar importação"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Parar importação de fotos"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "A preparar importação..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importado %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Gravar"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Gravar foto"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Gravar _como..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Gravar foto com um nome diferente"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprimir foto numa impressora ligada ao computador"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s não existe"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s não é um ficheiro"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s não possui suporte ao formato de\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Gravar uma cópia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Ignorar alterações em %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Fechar s_em gravar"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Erro ao gravar em %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Gravar como"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Não foi possível monitorizar %s: não é um diretório (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Gestor de fotos"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visualizador de fotos"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Direitos de autor 2009-2013 Fundação Yorba"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rodar à _direita"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rodar"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rodar à direita"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Rodar as fotos à direita (prima Ctrl para rodar à esquerda)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rodar à _esquerda"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rodar à esquerda"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rodar as fotos à esquerda"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Inverter hori_zontalmente"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Inverter horizontalmente"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Inverter verti_calmente"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Inverter verticalmente"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Mel_horar"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Melhorar"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Melhorar automaticamente o aspeto da foto"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copiar ajustes de cor"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Copiar ajustes de cor"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Copiar ajustes de cor efetuados na foto"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Co_lar ajustes de cor"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Colar ajustes de cor"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Aplicar ajustes de cor copiados nas fotos selecionadas"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Cortar"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Cortar"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Cortar tamanho da foto"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "E_ndireitar"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Endireitar"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Endireitar foto"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Olhos vermelhos"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Olhos vermelhos"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reduz ou elimina qualquer efeito de olhos vermelhos"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ajustar"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ajustar"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ajustar cor e tom das fotos"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Reverter para o original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Reverter para o original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Reverter e_dição externa"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Reverter para a foto principal"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "_Definir como imagem do ambiente de trabalho"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Definir a imagem selecionada como fundo do ambiente de trabalho"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "_Definir como apresentação do ambiente de trabalho"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "An_ular"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Anular"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refazer"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Refazer"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Mudar _nome do evento..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Criar foto-_chave para evento"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Criar foto-chave para evento"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Novo evento"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Novo evento"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mover fotos"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mover fotos para um evento"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Juntar eventos"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Juntar"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combinar vários eventos num único"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "A_valiar"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Avaliar"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Alterar avaliação da foto"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Aumentar"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Aumentar avaliação"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Diminuir"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Diminuir avaliação"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Sem avaliação"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sem avaliação"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Remover avaliação"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Definir como não avaliada"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Remover avaliação"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rejeitada"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rejeitada"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Avaliação rejeitada"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Definir como rejeitada"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Definir como rejeitada"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Ape_nas rejeitadas"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Apenas rejeitadas"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Mostrar apenas as fotos rejeitadas"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Tudo + _rejeitadas"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Mostrar todas as fotos, inclusive as rejeitadas"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Todas as _fotos"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Mostrar todas as fotos"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Avaliações"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Exibir avaliações de cada foto"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrar fotos"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrar fotos"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limitar número de fotos mostradas com base num filtro"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicar"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Duplicar foto"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportar..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Im_primir..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicar..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicar"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicar para vários sítios web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Editar _título..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Editar _comentário"
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Editar _comentário"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Editar _comentário do evento..."
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Ajustar data e hora..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ajustar data e hora"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Adicionar etiquetas..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Adicionar etiquetas..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Adicionar etiquetas"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferências"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Abrir com editor e_xterno"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Abrir com editor RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Enviar para..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "En_viar para..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "Pr_ocurar..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Procurar"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Procurar imagem com base no texto do nome ou etiqueta"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "Mar_car"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "De_smarcar"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Não foi possível iniciar o editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Adicionar etiqueta \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Adicionar etiquetas \"%s\" e \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Elimin_ar etiqueta \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Eliminar etiqueta \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Eliminar etiqueta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Novo..."
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Mudar _nome da etiqueta \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Mudar nome da etiqueta \"%s\" para \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Muda_r nome..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Modificar etiquetas..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificar etiquetas"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Identificar foto como \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Identificar foto como \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Identificar foto selecionada como \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Identificar fotos selecionadas como \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Remover da foto a etiq_ueta \"%s\""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Remover das fotos a etiq_ueta \"%s\""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Remover da foto a etiqueta \"%s\""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Remover das fotos a etiqueta \"%s\""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Não pode mudar o nome para \"%s\" pois esse nome já existe"
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Não pode mudar o nome para \"%s\" pois esse nome já existe"
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Pesquisa gravada"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Eliminar pesquisa"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editar..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Mudar _nome..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Mudar nome da pesquisa \"%s\" para \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Eliminar pesquisa \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Avaliar %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Avaliar em %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Avaliando em %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Mostrar %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Mostrar apenas as fotos com avaliação de %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ou mais"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Mostrar %s ou mais"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Mostra apenas as fotos com avaliação de %s ou mais"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Remover do lixo as fotos selecionadas"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Remover da galeria as fotos selecionadas"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurar"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mover para a galeria as fotos selecionadas"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Mostrar _no gestor de ficheiros"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Abrir o diretório da foto selecionada no gestor de ficheiros"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Não foi possível abrir no gestor de ficheiros: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "R_emover da galeria"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Mover para o _lixo"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "_Selecionar tudo"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Selecionar todos os itens"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%A, %d de %B de %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%A, %b. %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Ângulo:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Repor"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Restaurar dimensões atuais da foto"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Definir corte para esta foto"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Corte de retângulo dinâmico entre as orientações de retrato e paisagem"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Sem restrições"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Quadrado"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Ecrã"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Tamanho original"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Vídeo (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Vídeo (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Carta (8.5 x 11 pol.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloide (11 x 17 pol.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Fechar ferramenta de olhos vermelhos"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Remove qualquer efeito de olhos vermelhos na região selecionada"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Saturação:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Tom:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Sombras:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Destaques:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Repor cores"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Repor todas as cores originais"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Tom"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Saturação"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Exposição"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Sombras"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Destaques"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Expansão de contraste"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fixar barra de ferramentas"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fixar barra de ferramentas aberta"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Sair de ecrã completo"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Sair de _ecrã completo"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Sair"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Sobre"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Ecrã _completo"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Conteúdo"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Perguntas _frequentes"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Reportar um erro..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ocorreu um erro fatal ao aceder à galeria do Shotwell. O Shotwell não pode "
+"continuar.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Visite o sítio web da Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Djavan Fagundes <djavan@comum.org>\n"
+"Helder Ribeiro <helder@gmail.com>\n"
+"Seth Schoen <schoen@loyalty.org>\n"
+"Slackhideo <burajirugaijin@yahoo.co.jp>\n"
+"Sérgio Marques <smarquespt@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Não foi possível exibir a ajuda: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Não foi possível explorar a base de dados: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Não foi possível mostrar as FAQ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "sem título"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Tamanho original"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Largura ou altura"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Largura"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altura"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Ajustar tamanho das miniaturas"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Aumentar tamanho das miniaturas"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Diminuir tamanho das miniaturas"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Organizar fotos"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Reprodu_zir vídeos"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Abrir o vídeo selecionado no reprodutor de vídeos do sistema"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comentários"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Mostrar comentário de todas as fotos"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Exibir etiquetas de cada foto"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Por _título"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Organizar fotos por título"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Por _data de exposição"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Organizar fotos por data de exposição"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Por _avaliação"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Organizar fotos por avaliação"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"O Shotwell não conseguiu reproduzir o vídeo selecionado:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d foto/vídeo"
+msgstr[1] "%d fotos/vídeos"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Mostrar comentário de todas as fotos"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Sem eventos"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nenhum evento encontrado"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Eventos"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Sem data"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Sem evento"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Não foi possível criar o diretório de cache %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Não foi possível criar o diretório de dados %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Imagens"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Não foi possível criar o diretório temporário %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Não foi possível criar o subdiretório de dados %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nada)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nada"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Aleatório"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transições da apresentação"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Não foi possível criar o ficheiro temporário para %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "A exportar"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s já existe. Substituir?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Ignorar"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Substituir"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Substituir _tudo"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportar"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotos"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vídeos"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotos RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotos RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Erro ao abrir o ficheiro %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipo"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicar"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "A(O)s fotos/vídeos escolhida(o)s foram publicada(o)s com sucesso."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Os vídeos escolhidos foram publicadas com sucesso."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "As fotos escolhidas foram publicadas com sucesso."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "O vídeo escolhido foi publicado com sucesso.."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "A foto escolhida foi publicado com sucesso."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "A obter informações da conta..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "A autenticar..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicar fotos"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicar fotos _no:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicar vídeos"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicar vídeos _no"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicar fotos e vídeos"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicar fotos e vídeos _no"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Não foi possível publicar"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"O Shotwell não consegue publicar os itens selecionados porque os \"plugins\" "
+"de publicação não estão ativos. Para os ativar, escolha <b>Editar "
+"preferências de %s</b> e ative um ou mais plugins no separador \"<b>Plugins</"
+"b>\"."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "A preparar envio..."
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "A enviar %d de %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "A publicação para %s não pode continuar pois ocorreu um erro:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Para tentar publicar noutro serviço, selecione-o no menu acima."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nova e_tiqueta..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"O ficheiro temporário necessário para a publicação não está disponível"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Você já acedeu e saiu do serviço Google durante esta sessão do Shotwell.\n"
+"\n"
+"Para publicar elementos nos serviços Google, deve reiniciar o Shotwell ou "
+"tentar novamente a publicação."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Atualmente, não está autenticado no Youtube.\n"
+"\n"
+"Para continuar, deve ter uma conta Google configurada para usar o Youtube. "
+"Você pode configurar a maioria das contas, se utilizar o seu navegador e "
+"iniciar sessão no Youtube, pelo menos uma vez."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"O ficheiro necessário para a publicação não está disponível. A publicação no "
+"Youtube não é possível."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Você está autenticado no YouTube como %s"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Os vídeos irão aparecer em \"%s\""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Público listado"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Público não listado"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privado"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Serviços principais de publicação"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Você não está autenticado no Flickr.\n"
+"\n"
+"Clique em Iniciar sessão para se autenticar na conta Flickr através do seu "
+"navegador web. Vai ter de permitir a ligação do Shotwell Connect à sua conta "
+"Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Você já se autenticou e saiu do Flickr durante esta sessão do Shotwell.\n"
+"Para continuar a publicar no Flickr, encerre e abra novamente o Shotwell e "
+"tente publicar."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "A preparar início de sessão..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"O ficheiro necessário para a publicação não está disponível. A publicação no "
+"Filckr não é possível."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "A verificar autorização..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Você está autenticado no Flickr como %s\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"A sua conta gratuita do Flickr limita a quantidade de dados a enviar por "
+"mês.\n"
+"Este mês ainda possui %d na sua cota de envio."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "A sua conta Pro do Flickr oferece-lhe envios ilimitados."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotos disponí_veis para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "_Vídeos disponíveis para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "_Vídeos e fotos disponíveis para:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Todos"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Só amigos e famílias"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Só família "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Só amigos"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Para mim"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixeis"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixeis"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixeis"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixeis"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "A criar o álbum %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Ocorreu um erro ao publicar no Piwigo. Tente novamente."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Indique o URL da galeria de fotos Piwigo, o nome de utilizador e a sua senha "
+"de acesso à galeria Piwigo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"O Shotwell não conseguiu comunicar com a galeria Piwigo. Por favor verifique "
+"se o URL está correto."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Nome de utilizador ou senha não válidos. Por favor tente novamente."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "URL inválido"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"Nome de utilizador ou palavra-passe inválida"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administradores, família, amigos e contactos"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administradores, família e amigos"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administradores e família"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administradores"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Atualmente, não está autenticado nos ábuns wev Picasa.\n"
+"\n"
+"Clique em Iniciar sessão para entrar nos álbuns web do Picasa através do "
+"navegador web. Tem que autorizar o acesso do Shotwell Connect à sua conta."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"O ficheiro necessário para a publicação não está disponível. A publicação no "
+"Picasa não é possível."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "A criar álbum..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Está autenticado nos álbuns web Picasa como %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Os vídeos irão aparecer em:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "As fotos irão aparecer em:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pequeno (640 x 480 pixeis)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Médio (1024 x 768 pixeis)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomendado (1600 x 1200 pixeis)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixeis)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Atualmente, não está autenticado no Facebook.\n"
+"\n"
+"Se ainda não possui uma conta Facebook, crie uma durante o processo de "
+"autenticação. Durante o processo, o Shotwell pode solicitar-lhe a permissão "
+"para enviar e publicar as fotos. Estas permissões são obrigatórias para que "
+"o Shotwell Connect funcione."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Você já se autenticou e saiu do Facebook durante esta sessão do Shotwell.\n"
+"Para continuar a publicar no Facebook, encerre e abra novamente o Shotwell e "
+"tente publicar."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Padrão (720 pixeis)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Grande (2048 pixeis)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "A testar ligação ao Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"O ficheiro necessário para a publicação não está disponível. A publicação no "
+"Facebook não é possível."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Você está autenticado no Facebook como %s\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Onde é que pretende publicar a foto selecionada?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Tamanho do en_vio:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amigos"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Desintegrar"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Xadrez"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Círculos"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Persianas"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Riscas"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Relógio"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Círculo"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transições principais"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"Direitos de autor 2010 Maxim Kartashev, Copyright 2011-2013 Fundação Yorba"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapositivo"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Desvanecer"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Quadrados"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Serviços de importação de dados"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Bem-vindo ao serviço de importação das galerias do F-Spot.\n"
+"\n"
+"Escolha a galeria a importar, selecionando uma das galerias descobertas "
+"pelos Shotwell ou selecionando uma base de dados do F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Bem-vindo ao serviço de importação das galerias do F-Spot.\n"
+"\n"
+"Por favor escolha a base de dados do F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Escolher manualmente a base de dados do F-Spot a importar:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Não foi possível abrir a base de dados do F-Spot. O ficheiro não existe ou "
+"então não é uma base de dados válida."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Não foi possível abrir a base de dados do F-Spot. A versão da base de dados "
+"não é suportada pelo Shotwell."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Não foi possível ler a base de dados do F-Spot. Ocorreu um erro ao ler a "
+"tabela de etiquetas."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Não foi possível ler a base de dados do F-Spot. Ocorreu um erro ao ler a "
+"tabela de fotos."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"O Shotwell encontrou %d fotos na galeria do F-Spot e está a importá-las. As "
+"fotos duplicadas serão removidas.\n"
+"\n"
+"Pode fechar este diálogo e começar a utilizar o Shotwell durante a "
+"importação."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Galeria F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "A preparar importação"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Definir como apresentação de ambiente de trabalho"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Gerar apresentação do ambiente de trabalho"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Mostrar cada foto durante"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "intervalo de tempo"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"O tempo durante o qual a foto será exibida como imagem do ambiente de "
+"trabalho"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Pesquisa"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Nome da pesquisa:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Coincide"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "com:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Tamanho da imagem impressa</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Usar um taman_ho padrão:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Usar um tamanho personali_zado:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Coincidente com a proporção da foto"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Ajuste automático:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Títulos</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Imprimir _título da imagem"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Resolução de pixel</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Saída da foto em:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixeis por polegada"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiqueta"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Preferências Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "branco"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "preto"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Vigiar alterações no diretório da galeria"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Detalhes"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Escrever etiquetas, títulos e outros dados nos fic_heiros"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Exibição"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importar fotos para:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "Imagem de f_undo:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "A importar"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Estrutura _do diretório:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Padrão:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Exemplo:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Mudar nom_e dos ficheiros importados para minúsculas"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Editor RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Pré-de_finido:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Editor e_xterno de fotos:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Editor _RAW externo:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Editores externos"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "\"Plugins\""
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "Atr_aso:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Efeito de _transição:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Atra_so da transição:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Mostrar títu_lo"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "segundos"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Iniciar sessão"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+"(o texto depende do nome de utilizador e é modificado na aplicação -\n"
+"os elementos colocados nestes campo não serão exibidos)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publicar num álbum e_xistente:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Criar um _novo álbum chamado:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "_Vídeos e novos álbuns disponíveis para:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Remover localização, câmara e quaisquer outras informações antes de enviar"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "T_erminar sessão"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publicar"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Introduza o número de confirmação que aparece depois de iniciar sessão no "
+"Flickr através do navegador Web."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Número de autorização:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Você está ligado no Flickr como (name).\n"
+"\n"
+"(a etiqueta desta palavra é preenchida e colocada dentro do código e\n"
+"as alterações feitas aqui não iram ser mostradas)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "_visibilidade da etiqueta (prenchido pelo código da aplicação)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Tamanho da _foto:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'sessão inicada como $name'\n"
+"(prenchido pelo código da aplicação)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Um álbum _existente:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Um _novo álbum com o nome:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "L_istar os álbuns na galeria pública"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype aparecerá em\n"
+"(prenchido pelo código)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Tama_nho pré-definido da foto:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL da galeria de fotos Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Nome de utilizador"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Palavra-passe"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Lembra_r palavra-passe"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Iniciar sessão"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Uma categoria _existente:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "As fotos vão estar _visíveis por:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Tamanho da foto:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "na categoria:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Comentário do álbum:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"Se o título est_iver definido e o comentário não, utilizar título como "
+"comentário"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "Não enviar _detalhes"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Terminar sessão"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Definições_s de privacidade do vídeo:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Direitos de autor 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixeis"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "\"%s\" não é uma resposta válida a um pedido de autenticação OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): não consegue iniciar. Este editor não pode ser "
+"reiniciado"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Insira o nome de utilizador e palavra-passe associados à sua conta Tumblr"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Não foi possível carregar a interface: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Sessão iniciada no Tumblr como %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Direitos de autor 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visite o sitío web Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Você não está autenticado no Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Endereço eletrónico"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Sessão iniciada no Tumblr como (name)\n"
+"\n"
+"(A etiqueta desta palavra é preenchida e colocada dentro do código e\n"
+"as alterações feitas aqui não serão mostradas)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogues:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "Ál_bums (ou um novo):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tipo de acesso:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Desativar _comentários"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Proibir transferência de _fotos"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..5321e02
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,4720 @@
+# Brazilian Portuguese translation of shotwell.
+# Copyright (C) 2009-2014 Yorba Foundation
+# This file is distributed under the same license as the shotwell package.
+#
+# Translators from Transifex (until 2014):
+# Djavan Fagundes <djavan@comum.org>, 2011-2012
+# dnoway <dnoway@gmail.com>, 2011
+# Glaucia Freitas <gcintra@redhat.com>, 2013
+# Xapolin <gut_tri@hotmail.com>, 2013
+# Bruno Bacelar <mail2buy8@gmail.com>, 2012
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#
+# Translators from GNOME Translation Project (2014 forward):
+# Rafael Ferreira <rafael.f.f1@gmail.com>, 2014
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=Internationalization\n"
+"POT-Creation-Date: 2014-03-14 11:31+0000\n"
+"PO-Revision-Date: 2014-03-14 11:37-0300\n"
+"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 1.6.4\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Um arquivo temporário necessário para a publicação não está disponível"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Você já se conectou e desconectou de um serviço Google durante esta sessão "
+"do Shotwell.\n"
+"\n"
+"Para continuar a publicação para serviços do Google, saia e reinicie o "
+"Shotwell e, então, tente publicar novamente."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:688
+msgid "Visit the Yorba web site"
+msgstr "Visite o site da Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:691
+msgid "translator-credits"
+msgstr ""
+"Djavan Fagundes <djavan@comum.org>\n"
+"Helder Ribeiro <helder@gmail.com>\n"
+"Seth Schoen <schoen@loyalty.org>\n"
+"Slackhideo <burajirugaijin@yahoo.co.jp>\n"
+"Allisson Azevedo <allisson@gmail.com>\n"
+"Samuel Raffo <samuelrafo@gmail.com>\n"
+"Glaucia Cintra <gcintra@redhat.com>\n"
+"Rafael Ferreira <rafael.f.f1@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2014 Yorba Foundation"
+msgstr "Copyright 2009-2014 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Bem-vindo ao serviço de importação de biblioteca F-Spot .\n"
+"\n"
+"Por favor, selecione uma biblioteca para importação, selecionando uma das "
+"bibliotecas existentes encontrados pelo Shotwell ou selecionando um arquivo "
+"de banco de dados alternativo F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Bem vindo ao serviço de importação de biblioteca do F-Spot.\n"
+"\n"
+"Por favor selecione um banco de dados do F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Selecionar manualmente um banco de dados do F-Spot para importar:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Não é possível abrir o arquivo de banco de dados F-Spot selecionado: o "
+"arquivo não existe ou não é um banco de dados F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Não é possível abrir o arquivo de banco de dados F-Spot selecionado: esta "
+"versão do banco de dados F-Spot não é suportado pelo Shotwell"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Não é possível ler o arquivo de banco de dados F-Spot selecionado: Erro ao "
+"ler tabela etiquetas"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Não é possível ler o arquivo de banco de dados F-Spot selecionado: Erro ao "
+"ler tabela de fotos"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell encontrou %d fotos na biblioteca F-Spot e está atualmente a importá-"
+"los. Duplicatas serão automaticamente detectadas e removidas.\n"
+"\n"
+"Você pode fechar este diálogo e começar a usar o Shotwell enquanto a "
+"importação é feita em segundo plano."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Biblioteca F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Preparando para importar"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Núcleo Serviços de Importação de Dados"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' não é uma resposta válida para o pedido de autenticação OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): não pode iniciar, o editor não é reiniciável."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Digite o nome de usuário e senha associados à sua conta Tumblr."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "Nome de usuário e/ou senha inválida. Por favor, tente novamente"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Usuário ou senha inválida"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Não foi possível carregar a interface gráfica: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Você está logado no Tumblr como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Visite o site do Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Você não está atualmente logado em Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Serviços extras de publicação do Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "rótulo"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_Endereço de e-mail"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Senha"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Iniciar sessão"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid "Blogs:"
+msgstr "Blogs:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid "Photo _size:"
+msgstr "Tamanho da _foto:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:3
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "_Sair"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Publicar"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Álbuns (ou gravar novo):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "_Tipo de acesso:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Desabilitar _comentários"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "Proibir o _download da foto original"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "Público"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Amigos"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privado"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Conexão do Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Você atualmente não está conectado ao Facebook.\n"
+"\n"
+"Se você ainda não possui uma conta no Facebook, você pode criar uma durante "
+"o processo de autenticação. Durante o processo, o Shotwell pode perguntar "
+"você sobre permissão de envio de fotos e publicação para seus feeds. Estas "
+"permissões são necessárias para o a conexão do Shotwell funcionar."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Você já se autenticou e saiu do Facebook durante esta sessão do Shotwell.\n"
+"Para continuar publicando no Facebook, encerre e abra novamente o Shotwell, "
+"e então tente publicar novamente."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Padrão (720 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Largo (2048 pixels)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testando conexão com o Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Criando álbum..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"O arquivo necessário para a publicação não está disponível. A publicação "
+"para o Facebook não pode continuar."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Você está logado no Facebook como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Onde você gostaria de publicar as fotos selecionadas?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Upload _size:"
+msgstr "Tama_nho de upload:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Somente para mim"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Todos"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Você não está conectado no Flickr.\n"
+"\n"
+"Clique em Login para entrar no Flickr no seu navegador de internet. Você "
+"terá que autorizar o Shotwell para conectar a sua conta do Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Você já entrou e saiu do Flickr durante esta sessão do Shotwell.\n"
+"Para continuar publicando no Flickr, reinicie o Shotwell, e então tente "
+"publicar novamente."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Preparando para iniciar sessão..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"O arquivo necessário para a publicação não está disponível. A publicação "
+"para o Flickr não pode continuar."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verificando autorização..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Você está autenticado no Flickr como %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Sua conta gratuita do Flickr limita quantos dados você pode enviar por mês.\n"
+"Este mês, você possui %d megabytes restantes na sua cota de envio."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Sua conta Pro do Flickr oferece a você uploads ilimitados."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotos _visíveis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Vídeos _visíveis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotos e vídeos _visíveis para:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Somente amigos e família"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Somente família"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Somente amigos"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixels"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixels"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Tamanho original"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Você não está logado no Picasa Web Albums.\n"
+"\n"
+"Clique em Login para entrar no Picasa Web Albums em seu navegador. Você terá "
+"que autorizar a conexão do Shotwell à sua conta Picasa Web Albums."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"O arquivo necessário para a publicação não está disponível. A publicação "
+"para o Picasa não pode continuar."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Você está autenticado nos Álbuns da Web do Picasa como %s."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Os vídeos irão aparecer em:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "As fotos irão aparecer em:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Pequeno (640 x 480 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Médio (1024 x 768 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomendado (1600 x 1200 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Tamanho original"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Criando álbum %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Ocorreu uma mensagem de erro ao publicar o Piwigo. Por favor tente novamente."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Digite a URL de sua biblioteca de fotos Piwigo, bem como o nome de usuário e "
+"senha associados à sua conta Piwigo para essa biblioteca."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell não pode acessar sua biblioteca de fotos Piwigo. Por favor, "
+"verifique a URL digitada"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "URL inválida"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administradores, Família, Amigos, Contatos"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administradores, Família, Amigos"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administradores, Família"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administradores"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Você atualmente não está autenticado nos Youtube.\n"
+"\n"
+"Você precisa ter uma conta do Google configurada para usar o Youtube antes "
+"de continuar. Você pode configurar sua conta usando seu navegador para "
+"entrar no site do Youtube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"O arquivo necessário para a publicação não está disponível. A publicação "
+"para o Youtube não pode continuar."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Você está autenticado no Youtube como %s."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Os vídeos irão aparecer em \"%s\""
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Público listado"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Público não listado"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid "Publish to an e_xisting album:"
+msgstr "Publicar em um álbum e_xistente:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:2
+msgid "Create a _new album named:"
+msgstr "Criar um _novo álbum chamado:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Videos and new photo albums _visible to:"
+msgstr "Vídeos e álbuns de fotos novos _visível para:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Remover localização, câmera e outras informações identificadoras antes de "
+"enviar"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Insira o número de confirmação que apareceu depois que você efetuou login no "
+"Flickr no navegador de internet."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Número de autorização:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuar"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid "An _existing album:"
+msgstr "Um álbum _existente:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:2
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "Um _novo álbum chamado:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "L_ist album in public gallery"
+msgstr "L_istar os álbuns na galeria pública"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+msgid "Photo _size preset:"
+msgstr "Tama_nho pré-definido da foto:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL da sua galeria de fotos Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Nome do usuário"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "Lemb_rar senha"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "Uma categoria _existente:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "As fotos estarão _visíveis por:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Tamanho da foto:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "com categoria:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Comentário do álbum:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Se um título for definido e comentário não for, use título como comentário"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Não enviar etiquetas"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Encerrar sessão"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicar"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Principais serviços de publicação"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "De_finições de privacidade de vídeo:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Escuro"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Xadrez"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Círculos"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Círculos"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Relógio"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Desmoronar"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Esmaecer"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slide"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Quadrado"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Listras"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Transições principais de exibição de slides"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2014 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Não foi possível criar diretório de cache %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Não foi possível criar diretório de dados %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Fotos"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Não foi possível criar diretório temporário %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Não foi possível criar subdiretório de dados %s: %s"
+
+#. restore pin state
+#: ../src/AppWindow.vala:52
+msgid "Pin Toolbar"
+msgstr "Fixar a barra de ferramentas"
+
+#: ../src/AppWindow.vala:53
+msgid "Pin the toolbar open"
+msgstr "Fixar a barra de ferramentas aberta"
+
+#: ../src/AppWindow.vala:57 ../src/AppWindow.vala:135
+msgid "Leave fullscreen"
+msgstr "Sai da tela cheia"
+
+#: ../src/AppWindow.vala:134
+msgid "Leave _Fullscreen"
+msgstr "Sair da _tela cheia"
+
+#: ../src/AppWindow.vala:496
+msgid "_Quit"
+msgstr "_Sair"
+
+#: ../src/AppWindow.vala:501
+msgid "_About"
+msgstr "S_obre"
+
+#: ../src/AppWindow.vala:506
+msgid "Fulls_creen"
+msgstr "Tela _cheia"
+
+#: ../src/AppWindow.vala:511
+msgid "_Contents"
+msgstr "_Conteúdo"
+
+#: ../src/AppWindow.vala:516
+msgid "_Frequently Asked Questions"
+msgstr "Perguntas _frequentes (FAQ)"
+
+#: ../src/AppWindow.vala:521
+msgid "_Report a Problem..."
+msgstr "_Reporte um Problema..."
+
+#: ../src/AppWindow.vala:620 ../src/AppWindow.vala:641
+#: ../src/AppWindow.vala:658 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: ../src/AppWindow.vala:668
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Um erro fatal ocorreu ao acessar a galeria do Shotwell. O Shotwell não pode "
+"continuar.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:700
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Não foi possível exibir a ajuda: %s"
+
+#: ../src/AppWindow.vala:708
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Não foi possível navegar no banco de dados de bugs: %s"
+
+#: ../src/AppWindow.vala:716
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Não foi possível exibir FAQ: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Sucesso"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Erro de arquivo"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Não foi possível decodificar arquivo"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Erro na base de dados"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Usuário abortou a importação"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Não é um arquivo"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "O arquivo já existe na base de dados"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Formato de arquivo não-suportado"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Não é um arquivo de imagem"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Falha de disco"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disco cheio"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Erro da câmera"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Erro de gravação de arquivo"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Arquivo de imagem corrompido"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "A importação falhou (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "Exibição de s_lides"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Exibir apresentação de slides"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportar foto/vídeo"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportar fotos/vídeos"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Exportar fotos"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportar fotos"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Girando"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Desfazendo rotação"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Invertendo horizontalmente"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Desfazendo inversão horizontal"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Invertendo verticalmente"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Desfazendo inversão vertical"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Revertendo"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Desfazendo reversão"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Melhorando"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Desfazendo melhoramento"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Aplicando transformações de cor"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Desfazendo transformações de cor"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Criando novo evento"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Removendo evento"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Movendo fotos para novo evento"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Atribuindo fotos ao evento anterior"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Mesclando"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Separando"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Duplicando fotos"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Removendo fotos duplicadas"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Não foi possível duplicar uma foto, término com erro de arquivo"
+msgstr[1] "Não foi possível duplicar %d fotos, término com erros de arquivo"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Restaurar avaliação anterior"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Aumentar avaliação"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Diminuir avaliação"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Definindo desenvolvedor RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Restaurando desenvolvedor RAW anterior"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Definir desenvolvedor"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "A foto original não pôde ser ajustada."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Ajustando data e hora"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Desfazendo ajuste de data e hora"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Uma foto original não pôde ser ajustada."
+msgstr[1] "As seguintes fotos originais não puderam ser ajustadas."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Erro de ajuste de hora"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Os ajustes de hora não puderam ser desfeitos no seguinte arquivo de foto."
+msgstr[1] ""
+"Os ajustes de hora não puderam ser desfeitos nos seguintes arquivos de fotos."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Criar etiqueta"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mover etiqueta \"%s\""
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mover fotos para a lixeira"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurar fotos da lixeira"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mover as fotos para a lixeira do Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurar as fotos selecionadas para a galeria"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Movendo fotos para a lixeira"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Restaurando fotos da lixeira"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marcar fotos selecionadas"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Desmarcar fotos selecionadas"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marcando fotos selecionadas"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Desmarcando fotos selecionadas"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcar"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Desmarcar"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Não é possível iniciar o Nautilus Enviar-Para: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Enviar para"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Não foi possível exportar em segundo plano %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Não foi possível preparar a exibição de slides da área de trabalho: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Isto irá remover a etiqueta \"%s\" de uma foto. Continuar?"
+msgstr[1] "Isto irá remover a etiqueta \"%s\" de %d fotos. Continuar?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Apagar"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Isto irá remover a pesquisa salva \"%s\". Continuar?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Mudar os desenvolvedores irá desfazer todas as alterações feitas para esta "
+"foto no Shotwell"
+msgstr[1] ""
+"Mudar os desenvolvedores irá desfazer todas as alterações feitas para estas "
+"fotos no Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Mudar Desenvolvedor"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportar vídeo"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"O Shotwell não pôde criar um arquivo para edição desta foto pelo fato de "
+"você não possuir permissão de gravação em %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Não foi possível exportar a seguinte foto, término com erro de arquivo.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Você deseja continuar exportando?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Não modificado"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Atual"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formato:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Qualidade:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Re_strição de dimensionamento:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixels"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportar metadados"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Salvar Detalhes..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Salvar Detalhes"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(e %d outras)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importar Formulários de Resultados"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Tentada a importação de %d arquivo."
+msgstr[1] "Tentada a importação de %d arquivos."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Dessa tentativa, %d arquivo foi importado com sucesso."
+msgstr[1] "Dessa tentativa, %d arquivos foram importados com sucesso."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Duplicar Fotos/Vídeos Não importados:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplica itens de mídia existentes"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "As Fotos/Vídeos não forma Importadas devido à erros com a Câmera:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "mensagem de erro:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Arquivos não foram importados porque não foram reconhecidos como Fotos ou "
+"Vídeos:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"As Fotos/Vídeos Não foram Importados pois não estavam em um formato que o "
+"Shotwell entendesse:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"As Fotos/Vídeos não foram importadas pois o Shotwell não pôde copiá-las para "
+"sua Biblioteca:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"não foi possível copiar %s\n"
+"\tpara %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Fotos/Vídeos não importados porque os arquivos estão corrompidos:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "As Fotos/Vídeos não foram importadas por outras razões:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 foto duplicada não foi importada:\n"
+msgstr[1] "%d fotos duplicadas não foram importadas:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 vídeo duplicado não foi importado:\n"
+msgstr[1] "%d vídeos duplicados não foram importados:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 foto/vídeo duplicado não foi importado:\n"
+msgstr[1] "%d fotos/vídeos duplicados não foram importados:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 foto falhou ao ser importada, ocorreu um erro de arquivo ou de hardware:\n"
+msgstr[1] ""
+"%d fotos falharam ao serem importadas, ocorreu um erro de arquivo ou de "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 vídeo falhou ao ser importado devido a um erro de arquivo ou hardware:\n"
+msgstr[1] ""
+"%d vídeos falharam ao serem importados devido a um erro de arquivo ou "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 foto/vídeo falhou ao ser importado devido a um erro de arquivo ou "
+"hardware:\n"
+msgstr[1] ""
+"%d fotos/vídeos falharam ao serem importados devido a um erro de arquivo ou "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 arquivo falhou ao ser importado devido a um erro de arquivo ou hardware:\n"
+msgstr[1] ""
+"%d arquivos falharam ao serem importados devido a um erro de arquivo ou "
+"hardware:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto falhou ao ser importada pelo fato da pasta de biblioteca de fotos não "
+"ser gravável:\n"
+msgstr[1] ""
+"%d fotos falharam ao serem importadas pelo fato da pasta de biblioteca de "
+"fotos não ser gravável:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 vídeo falhou ao ser importada pelo fato da pasta de biblioteca de fotos "
+"não ser gravável:\n"
+msgstr[1] ""
+"%d vídeos falharam ao serem importados pelo fato da pasta de biblioteca de "
+"fotos não ser gravável:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 foto/vídeo falhou ao ser importada pelo fato da pasta de biblioteca de "
+"fotos não ser gravável:\n"
+msgstr[1] ""
+"%d fotos/vídeos falharam ao serem importados pelo fato da pasta de "
+"biblioteca de fotos não ser gravável:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 arquivo falhou ao ser importado pelo fato da pasta de biblioteca de fotos "
+"não ser gravável:\n"
+msgstr[1] ""
+"%d arquivos falharam ao serem importados pelo fato da pasta de biblioteca de "
+"fotos não ser gravável:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "1 foto falhou ao ser importada, ocorreu um erro de câmera:\n"
+msgstr[1] "%d fotos falharam ao serem importadas, ocorreu um erro de câmera:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 vídeo falhou ao ser importado devido a um erro da câmera:\n"
+msgstr[1] ""
+"%d vídeos falharam ao serem importados devido a um erro da câmera:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 foto/vídeo falhou ao ser importado devido a um erro da câmera:\n"
+msgstr[1] ""
+"%d fotos/vídeos falharam ao serem importados devido a um erro da câmera:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 arquivo falhou ao ser importado devido a um erro da câmera:\n"
+msgstr[1] ""
+"%d arquivos falharam ao serem importados devido a um erro da câmera:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 foto falhou na importação porque estava corrompida:\n"
+msgstr[1] "%d fotos falharam na importação porque estavam corrompidas:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 vídeo falhou na importação porque estava corrompido:\n"
+msgstr[1] "%d vídeos falharam na importação porque estavam corrompidos:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "1 foto/vídeo falhou na importação porque estava corrompido(a):\n"
+msgstr[1] ""
+"%d vídeos/fotos falharam na importação porque estavam corrompidos:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 arquivo falhou na importação porque estava corrompido:\n"
+msgstr[1] "%d arquivos falharam na importação porque estavam corrompidos:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 foto sem suporte foi pulada:\n"
+msgstr[1] "%d fotos sem suporte foram puladas:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Pulando um arquivo não-imagem.\n"
+msgstr[1] "Pulando %d arquivos não-imagem.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "1 foto pulada pelo cancelamento do usuário:\n"
+msgstr[1] "%d fotos puladas pelo cancelamento do usuário:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 vídeo ignorado por cancelamento do usuário:\n"
+msgstr[1] "%d vídeos ignorados por cancelamento do usuário:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 foto/vídeo ignorado por cancelamento do usuário:\n"
+msgstr[1] "%d fotos/vídeos ignorados por cancelamento do usuário:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 arquivo ignorado por cancelamento do usuário:\n"
+msgstr[1] "%d arquivos ignorados por cancelamento do usuário:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 foto foi importada com sucesso.\n"
+msgstr[1] "%d fotos foram importadas com sucesso.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 vídeo importado com sucesso.\n"
+msgstr[1] "%d vídeos importados com sucesso.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 foto/vídeo importado com sucesso.\n"
+msgstr[1] "%d fotos/vídeos importados com sucesso.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Sem fotos ou vídeos importados.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importação concluída"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutes"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dia"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Renomear evento"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editar título"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Título:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Editar comentário de evento"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Editar comentário de foto/vídeo"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Apagar arquivo"
+msgstr[1] "_Apagar arquivos"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_Remover somente"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Manter"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Reverter edição externa?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Reverter edições externas?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Isto irá destruir todas as alterações feitas para o arquivo externo. "
+"Continuar?"
+msgstr[1] ""
+"Isto irá destruir todas as alterações feitas para %d arquivos externos. "
+"Continuar?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Re_verter edição externa"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Re_verter edições externas"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Isto irá remover a foto da galeria. Continuar?"
+msgstr[1] "Isto irá remover %d fotos da galeria. Continuar?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Remover"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Remover fotos da galeria"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Remover fotos da galeria"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "De_slocar fotos/vídeos pelo mesmo montante"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Definir tod_as fotos/vídeos para a mesma hora"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modificar arquivo original da foto"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modificar arquivos originais da foto"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modificar originais"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modificar arquivos originais"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposição irá ser mudado para frente, por\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"O tempo de exposição irá ser mudado para trás, por\n"
+"%d %s, %d %s, %d %s, e %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"e %d outra."
+msgstr[1] ""
+"\n"
+"\n"
+"e %d outras."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiquetas (separadas por vírgulas):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bem-vindo!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Bem-vindo ao Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "Para iniciar, importe fotos de alguma destas formas:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Escolha <span weight=\"bold\">Arquivo %s Importar de uma pasta</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Arraste e solte fotos para dentro da janela do Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Conectar uma câmera no seu computador e importe"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importar fotos de seu diretório %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Você também pode importar fotos de alguma destas formas:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Não exibir mais es_ta mensagem"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importar fotos de sua biblioteca %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Ajuda)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Ano%sMês%sDia"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Ano%sMês"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Ano%sMês-Dia"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Ano-Mês-Dia"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Customizar"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Padrão inválido"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell pode copiar as fotos na sua pasta de biblioteca ou pode importá-los "
+"sem copiar."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_par fotos"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importar no local"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importar para a biblioteca"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Remover da biblioteca"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Removendo fotos da biblioteca"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Removendo fotos da biblioteca"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover a foto/vídeo da sua biblioteca Shotwell. Você também "
+"gostaria de mover este arquivo para lixeira?\n"
+"\n"
+"Essa ação não poderá ser desfeita."
+msgstr[1] ""
+"Isto irá remover %d fotos/vídeos da sua biblioteca Shotwell. Você também "
+"gostaria de mover estes arquivos para lixeira?\n"
+"\n"
+"Essa ação não poderá ser desfeita."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover o vídeo da sua biblioteca Shotwell. Você também gostaria de "
+"mover este arquivo para lixeira?\n"
+"\n"
+"Essa ação não poderá ser desfeita."
+msgstr[1] ""
+"Isto irá remover %d vídeos da sua biblioteca Shotwell. Você também gostaria "
+"de mover estes arquivos para lixeira?\n"
+"\n"
+"Essa ação não poderá ser desfeita."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Isto irá remover a foto da sua galeria do Shotwell. Você gostaria também de "
+"mover o arquivo para a lixeira?\n"
+"\n"
+"Esta ação não poderá ser desfeita."
+msgstr[1] ""
+"Isto irá remover %d fotos da sua galeria do Shotwell. Você gostaria também "
+"mover os arquivos para a lixeira?\n"
+"\n"
+"Esta ação não poderá ser desfeita."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"A foto ou vídeo não pode ser movido para lixeira. Excluir esse arquivo?"
+msgstr[1] ""
+"%d fotos/vídeos não podem ser movidos para lixeira. Excluir esses arquivos?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "A foto ou vídeo não pode ser excluído."
+msgstr[1] "%d fotos/vídeos não podem ser excluídos."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Largura ou altura"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Largura"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Altura"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Não foi possível monitorar %s: Não é um diretório (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:753
+#, c-format
+msgid "Event %s"
+msgstr "Evento %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Não foi possível gerar um arquivo temporário para %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportando"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s já existe. Sobrescrever?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Ignorar"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Substituir"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Sobrescrever _todas"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportar"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Não foi possível processar as atualizações monitoradas: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Ajustar o tamanho das miniaturas"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "Ampl_iar"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Aumentar a ampliação das miniaturas"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "Redu_zir"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Diminuir a ampliação das miniaturas"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Ordenar _fotos"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Reproduzir vídeo"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Abra os vídeos selecionados no reprodutor de vídeo do sistema"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "_Desenvolvedor"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Câmera"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Títulos"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Exibe o título de cada foto"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comentários"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Exibe o comentário de cada foto"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "Eti_quetas"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Exibe as etiquetas de cada foto"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Por _título"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Ordena as fotos pelo título"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Por _data de exposição"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ordena as fotos pela data de exposição"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Por _avaliação"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Ordena as fotos por avaliação"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "_Ascendente"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Ordena as fotos em ordem ascendente"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "D_escendente"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Ordena as fotos em ordem descendente"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell foi incapaz de reproduzir o vídeo selecionado:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Sem fotos/vídeos"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Sem fotos/vídeos encontrados"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotos não podem ser exportadas para este diretório."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "modificado"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Foto anterior"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Próxima foto"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Faltando arquivo fonte da foto: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "_Ver"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "F_erramentas"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Foto a_nterior"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Foto anterior"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Próxi_ma foto"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Próxima foto"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Aumentar a ampliação da foto"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Diminuir a ampliação da foto"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Adaptar à _Página"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Ampliar a foto para se adaptar à tela"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Ampliação _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Ampliar a foto em 100%"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Ampliação _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Ampliar a foto em 200%"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Não foi possível exportar %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Enviar a página toda"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imagens por página"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imagens por página"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imagens por página"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imagens por página"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 imagens por página"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imagens por página"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "pol."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Carteira (2 x 3 pol.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Cartão de notas (3 x 5 pol.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 pol."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 pol."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 pol."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 pol."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 pol."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Carteira Métrica (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Cartão postal (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Configurações da imagem"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Imprimindo..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Não foi possível imprimir foto: \n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Hoje"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Itens:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d evento"
+msgstr[1] "%d eventos"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d foto"
+msgstr[1] "%d fotos"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d vídeo"
+msgstr[1] "%d vídeos"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Hora:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "De:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "Para:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Tamanho:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Duração:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f segundos"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Desenvolvedor:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Exposição:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Localização:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Tamanho do arquivo:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Desenvolvimento atual:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensões originais:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Câmera:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Modelo da câmera:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flash:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Comprimento focal:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data de exposição:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Horário da exposição:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exposição bias:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitude do GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitude do GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Artista:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informações estendidas"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Organizador de fotos"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Visualizador de fotos"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Girar à _direita"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Girar"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Girar à direita"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Gira as fotos para direita (pressione Ctrl para girar para esquerda)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Girar à _esquerda"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Girar à esquerda"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Gira a foto para a esquerda"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Inverter hori_zontalmente"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Inverter horizontalmente"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Inverter verti_calmente"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Inverter verticalmente"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Melhorar"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Melhorar"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Melhora automaticamente a aparência da foto"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copiar ajustes de cor"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Copiar ajustes de cor"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Copiar os ajustes de cor aplicados na foto"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "C_olar ajustes de cor"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Colar ajustes de cor"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Aplicar ajustes de cor copiados nas fotos selecionadas"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Cortar"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Cortar"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Corta o tamanho da foto"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "En_direitar"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Endireitar"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Endireita foto"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Olhos ve_rmelhos"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Olhos vermelhos"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reduz ou elimina qualquer efeito de olhos vermelhos na foto"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ajustar"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ajustar"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Ajusta a cor e os tons das fotos"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Re_verter para o original"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Reverter para o original"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Reverter e_dição externa"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Reverter para a foto mestre"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Definir como _plano de fundo da área de trabalho"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+"Definir a imagem selecionada como um novo plano de fundo da área de trabalho"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Definir como exibição de sli_des da área de trabalho..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "Des_fazer"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Desfazer"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refazer"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Refazer"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Re_nomear evento..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Designar f_oto como chave para evento"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Designa a foto como chave para evento"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Novo evento"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Novo evento"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mover fotos"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mover as fotos selecionadas para um evento"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Unir eventos"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Unir"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combinar eventos em um único evento"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "A_valiar"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Avaliar"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Alterar a avaliação da foto"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Aumentar"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Aumentar avaliação"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Diminuir"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Diminuir avaliação"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Sem avaliação"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Sem avaliação"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Apagar avaliação"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Definir como não avaliado"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Remove avaliação"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Rejeita"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Rejeitada"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Avaliar como rejeitado"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Definir como rejeitado"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Avaliar como rejeitado"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Rejeitado _apenas"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Rejeitados Apenas"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Exibir apenas fotos rejeitadas"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Tudo + _rejeitado"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Mostrar todas as fotos, inclusive as rejeitadas"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Todas as _fotos"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Exibe todas fotos"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Avaliações"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Exibe as avaliações de cada foto"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrar fotos"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrar fotos"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limita o número de fotos mostradas com base num filtro"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicar"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Duplicar a foto"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportar..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Imprimi_r..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicar..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicar para vários sites"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Editar _título..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Editar _comentário..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Editar comentário"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Editar _comentário de evento..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Ajustar data e hora..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Ajustar a data e hora"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Adicionar e_tiquetas..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Adicionar etiquetas..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Adicionar etiquetas"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferências"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Abrir com o editor e_xterno"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Abrir com editor de RA_W"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Enviar _para..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Enviar p_ara..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Localizar..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Localização"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Encontre uma imagem digitando o texto que aparece em seu nome ou etiquetas"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Marcar"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Des_marcar"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Não foi possível iniciar o editor: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Adicionar etiqueta \"%s\""
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Adicionar etiquetas \"%s\" e \"%s\""
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "A_pagar etiqueta \"%s\""
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Apagar etiqueta \"%s\""
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Apagar etiqueta"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "_Nova"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Re_nomear etiqueta \"%s\"..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Renomear a etiqueta \"%s\" para \"%s\""
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Renomear..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Modificar etiquetas..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modificar etiquetas"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etiquetar fotos como \"%s\""
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etiquetar foto como \"%s\""
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etiquetar as fotos selecionadas como \"%s\""
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etiquetar as fotos selecionadas como \"%s\""
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Remover etiqueta \"%s\" da _foto"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Remover etiqueta \"%s\" das _fotos"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Remove a etiqueta \"%s\" da foto"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Remove a etiqueta \"%s\" das fotos"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Não foi possível renomear a etiqueta para \"%s\" pelo fato da etiqueta já "
+"existir."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Não foi possível renomear a pesquisa para \"%s\" pelo fato da pesquisa já "
+"existir."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Pesquisa salva"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Apagar pesquisa"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editar..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Re_nomear..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Renomeia a pesquisa \"%s\" para \"%s\""
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Apagar pesquisa \"%s\""
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Avaliar %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Avaliar como %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Avaliando como %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Mostra %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Mostra somente as fotos com avaliação de %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ou melhor"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Mostrar %s ou melhor"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Mostra somente as fotos com avaliação de %s ou melhor"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Remover as fotos selecionadas para a lixeira"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Remover as fotos selecionadas da biblioteca"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurar"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Remover as fotos selecionadas para a galeria"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Abrir com o gerenciador de a_rquivos"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Abre o diretório da foto selecionada no gerenciador de arquivos"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Não foi possível abrir no gerenciador de arquivos: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "R_emover da biblioteca"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mover para a lixeira"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Selecionar _todas"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Selecionar todos os itens"
+
+# Translated with 24-hour time - default in Brazil. i.e.: 20:31 -- Rafael
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-H:%M"
+
+# Translated with 24-hour time - default in Brazil. i.e.: 20:31:42 -- Rafael
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-H:%M:%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a, %d de %b de %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a, %d de %b"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Exibição de slides"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Sinalizadas"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Vídeos"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotos RAW"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotos RAW"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Erro ao carregar arquivo de UI %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tipo"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Avaliação"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Configurações"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Voltar"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Ir para a foto anterior"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausar"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausar apresentação de slides"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Próxima"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Ir para a próxima foto"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Alterar configuração da exibição de slides"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Faltam arquivos fonte de todas as fotos."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Reproduzir"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Continuar a exibição de slides"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "Sem título"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:486
+msgid "Export Videos"
+msgstr "Exportar vídeos"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Câmeras"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Não foi possível desmontar a câmera. Tente desmontando a câmera no "
+"gerenciador de arquivos."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ocultar fotos que já foram importadas"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Somente exibir fotos que não foram importadas"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Iniciando importação, por favor, aguarde..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importar _selecionadas"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Remover as fotos selecionadas para a sua galeria"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importar _todas"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importar todas as fotos para sua biblioteca"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell precisa desmontar a câmera do sistema de arquivos para acessá-la. "
+"Continuar?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Desmontar"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Por favor, desmonte a câmera."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"A câmera está travada por outro aplicativo. O Shotwell somente pode acessar "
+"a câmera quando ela está destravada. Por favor, feche qualquer outro "
+"aplicativo que estiver usando a câmera e tente novamente."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"Por favor, encerre qualquer outro aplicativo que esteja usando a câmera."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Não foi possível obter pré-visualizações da câmera:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Desmontando..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Obtendo informação da foto"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Obtendo visualização para %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Não foi possível travar a câmera: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Apagar essa foto da câmera?"
+msgstr[1] "Apagar essas %d fotos da câmera?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Apagar esse vídeo da câmera?"
+msgstr[1] "Apagar esses %d vídeos da câmera?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Excluir essa foto/vídeo da câmera?"
+msgstr[1] "Excluir essas %d fotos/vídeos da câmera?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Apagar esse arquivo da câmera?"
+msgstr[1] "Apagar esses %d arquivos da câmera?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Excluindo fotos/vídeos da câmera"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Não foi possível excluir %d foto/vídeo da câmera devido a erros."
+msgstr[1] "Não foi possível excluir %d fotos/vídeos da câmera devido a erros."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importação de dados"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Base de dados %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "A importação de %s não pode continuar porque ocorreu um erro:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Para tentar importar de outro serviço, selecione um no menu acima."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Você no possui nenhum plug-ins de importação de dados ativados.\n"
+"\n"
+"Para utilizar a funcionalidade de importação do aplicativo, você precisará "
+"ter pelo menos um plug-in de importações de dados habilitado. Plug-ins pode "
+"ser ativado na caixa de diálogo Preferências."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Arquivo de banco de dados:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "Parar _importação"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importação de aplicativo"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Impo_rtação de mídia de:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "Fe_char"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Não foi possível abrir/criar banco de dados de foto %s: código de erro %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Não foi possível gravar no arquivo de banco de dados de fotos:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Erro acessando o arquivo de banco de dados:\n"
+" %s\n"
+"\n"
+"O erro foi: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Arquivo"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "_Salvar"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Salvar foto"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Salvar _como..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Salva a foto com um nome diferente"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Imprime a foto em uma impressora conectada em seu computador"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "_Editar"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Foto"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "A_juda"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s não existe."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s não é um arquivo."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s não oferece suporte ao formato do arquivo de\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Salvar uma cópia"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Descartar alterações para %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "Fechar s_em salvar"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Erro ao salvar para %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Salvar como"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Retornar a foto para as dimensões atuais"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Definir o corte para esta foto"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Corte de retângulo dinâmico entre o retrato e a orientação da paisagem"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Sem restrições"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Quadrado"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Tela"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Carta (8.5 x 11 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloide (11 x 17 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Fechar ferramenta de olhos vermelhos"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Remove qualquer efeito de olhos vermelhos na região selecionada"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "_Reiniciar"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Saturação:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Colorir:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Sombras:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Destaques:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Reiniciar cores"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Reiniciar todos os ajustes de cores para o original"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Colorir"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Saturação"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Exposição"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Sombras"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Destaques"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Expansão de contraste"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Ângulo:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotos/vídeos"
+msgstr[1] "%d foto/vídeo"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Nenhum Evento"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Exibir o comentário de cada evento"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Sem eventos"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Sem eventos encontrados"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Eventos"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Sem data"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Pastas"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Biblioteca"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importando..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "Pa_rar importação"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Parar importação de fotos"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Preparando para importar..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importado %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Última importação"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importar da pasta..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importar fotos do disco para a galeria"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importação de _aplicativo..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Ordenar _eventos"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Esvaziar l_ixeira"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Apaga todas as fotos na lixeira"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Ver eve_nto para foto"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Localizar"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Localiza fotos e vídeos através de pesquisa"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Nova busca salva..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotos"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Even_tos"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informações _básicas"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Exibe informações básicas para a seleção"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informações _estendidas"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Exibe informações básicas para a seleção"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Barra de pe_squisa"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Exibe a barra de pesquisa"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Ba_rra lateral"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Exibe a barra lateral"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importa da pasta"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Esvaziar lixeira"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Esvaziando lixeira..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell está configurado para importar fotos para sua pasta pessoal.\n"
+"Nós recomendamos que altere isso nas <span weight=\"bold\">Preferências do "
+"%s</span>.\n"
+"Você deseja continuar a importação de fotos?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Localização da biblioteca"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotos não podem ser importadas deste diretório."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Atualizando biblioteca..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Preparando para auto-importação de fotos..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Auto-importação de fotos..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Escrevendo metadados para arquivos..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Arquivos faltantes"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Apagando..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Lixeira"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "A lixeira está vazia"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Apagar"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Apagando fotos"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Sua biblioteca de fotos não é compatível com essa versão do Shotwell. "
+"Parece que ele foi criado pelo Shotwell %s (schema %d). Essa versão é %s "
+"(schema %d). Por favor use a última versão do Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"O Shotwell não foi capaz de atualizar sua biblioteca de fotos da versão %s "
+"(schema %d) para %s (schema %d). Para maiores informações consulte o Wiki "
+"do Shotwell Wiki em %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Sua biblioteca de fotos não é compatível com essa versão do Shotwell. "
+"Parece que ele foi criado pelo Shotwell %s (schema %d). Essa versão é %s "
+"(schema %d). Por favor limpe sua biblioteca excluindo %s e importe "
+"novamente suas fotos."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Erro desconhecido ao tentar verificar o banco de dados do Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Carregando Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Caminho para os dados privados do Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRETÓRIO"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Não monitora o diretório da biblioteca durante o tempo de execução para "
+"mudanças"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Não exibe a medida do progresso de inicialização"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Exibe a versão do aplicativo"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[ARQUIVO]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Digite \"%s --help\" para ver a lista completa das opções de linha de "
+"comando.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Baixo (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Médio (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Alto (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Máximo (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicando"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Preparando fotos envio"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Enviando %d de %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "A publicação para %s não pôde continuar, ocorreu um erro:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Para tentar publicar em outro serviço, selecione-o no menu acima."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "As fotos/vídeos selecionados foram publicadas com sucesso."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Os vídeos selecionados foram publicados com sucesso."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "As fotos selecionadas foram publicadas com sucesso."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "O vídeo selecionado foi publicado com sucesso."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "A foto selecionada foi publicada com sucesso."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Obtendo informação da conta..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Autenticando..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicar fotos"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicar fotos pa_ra:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicar vídeos"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicar vídeos pa_ra"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicar fotos e vídeos"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicar fotos e vídeos pa_ra"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Não é possível publicar"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell não pode publicar os itens selecionados porque você não tem um plug-"
+"in compatível publicação habilitado. Para corrigir isso, edite nas "
+"<b>Preferências do %s</b> e habilite um ou mais plug-ins de publicação na "
+"aba <b>Plug-ins</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Pesquisas salvas"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "contém"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "é exatamente"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "inicia com"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "termina com"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "não contém"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "não está definido"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "é"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "não é"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "qualquer foto"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "uma foto raw"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "um vídeo"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "tem"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "não tem"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modificações"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modificações internas"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modificações externas"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "sinalizada"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "não sinalizada"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "e maior"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "somente"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "e baixo"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "é depois"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "é antes"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "é entre"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "e"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "qualquer"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "todos"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nenhum"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Qualquer texto"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Título"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Comentário"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nome do evento"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nome do arquivo"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tipo de mídia"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Sinalizar estado"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Estado da foto"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Data"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nova etique_ta..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Transição de exibição de slides"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nenhum)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nenhum"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Aleatório"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Definir apresentação de slides da área de trabalho"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Gerar exibição de slides no plano de fundo da área de trabalho"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Exibe cada foto para"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "período de tempo"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"O tempo que cada foto é exibida como plano de fundo da área de trabalho"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Pesquisa"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Nome da pesquisa:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "Co_mbinação"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "do seguinte:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Tamanho da imagem impressa</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Usar um taman_ho padrão:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Usar um tamanho _personalizado:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "_Correspondência de proporção de aspecto da foto"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "Tamanho _automático:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Títulos</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Imprimir _título da imagem"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Resolução em pixel</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Saída da foto em:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "pixels por polegada"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Preferências do Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "branco"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "preto"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Monitorar diretório de galeria por novos arquivos"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Metadados"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Gravar etiquetas, títulos e outros _metadados para arquivos de fotos"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Exibição"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Importar fotos para:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Plano de fundo:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Importando"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Estrutura de _diretório:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Padrão:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Exemplo:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "R_enomear arquivos importados para letra minúscula"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Desenvolvedor RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "Pa_drão:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "Editor de foto e_xterno:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Editor _RAW externo:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Editores externos"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Plug-ins"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "A_traso:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Efeito de _transição:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "A_traso de transição:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Mostrar títul_o"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "segundos"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "A_utenticar"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr ""
+#~ "Shotwell está configurado para importar fotos para seu diretório home.\n"
+
+#~ msgid ""
+#~ "You are logged into Tumblr as (name).\n"
+#~ "\n"
+#~ "(this label's string is populated and set inside the code, \n"
+#~ "so changes made here will not display)"
+#~ msgstr ""
+#~ "Você está logado no Tumblr como (nome).\n"
+#~ "\n"
+#~ "(este rótulo é preenchido e definido dentro do código, \n"
+#~ "portanto as alterações feitas aqui não serão exibidas)"
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..16bf975
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,4758 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Pwnisher <ciprian420@gmail.com>, 2013
+# chodella <corneliu.dascalu@gmail.com>, 2013
+# Vasile Marian <marianvasile@upcmail.ro>, 2011
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-23 16:40+0000\n"
+"Last-Translator: chodella <corneliu.dascalu@gmail.com>\n"
+"Language-Team: Romanian (http://www.transifex.com/projects/p/shotwell/"
+"language/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
+"2:1));\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Eveniment %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Aparate foto"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Aparat foto"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Aparatul foto nu poate fi demontat. Încercați să demontați dispozitivul din "
+"administratorul de fișiere."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ascunde fotografiile importate deja"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Afișează doar fotografiile care nu au fost importate"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Se pornește importarea, așteptați..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Nume"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Afișează numele fiecărei fotografii"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importă _selecția"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importați fotografiile selectate în colecția dumneavoastră"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importă _tot"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importați toate fotografiile în colecția dumneavoastră"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell trebuie să demonteze aparatul foto din sistemul de fișiere pentru a-"
+"l accesa. Continuați?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Demontează"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Demontați aparatul foto."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Aparatul foto este blocat de o altă aplicație. Shotwell poate accesa "
+"aparatul foto numai dacă acesta nu este blocat. Închideți orice altă "
+"aplicație care folosește aparatul foto și încercați din nou."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Închideți orice aplicație care folosește aparatul foto."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nu se poate realiza previzualizarea fotografiilor din aparatul foto:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Se demontează..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Se aduc informațiile despre fotografii"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Previzualizare pentru %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Aparatul foto nu poate fi blocat: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Ștergeți această fotografie din aparatul foto?"
+msgstr[1] "Ștergeți aceste %d fotografii din aparatul foto?"
+msgstr[2] "Ștergeți aceste %d de fotografii din aparatul foto?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Ștergeți acest clip din aparatul foto?"
+msgstr[1] "Ștergeți aceste %d clipuri din aparatul foto?"
+msgstr[2] "Ștergeți aceste %d de clipuri din aparatul foto?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Ștergeți această fotografie/acest clip din aparatul foto?"
+msgstr[1] "Ștergeți aceste %d fotografii/clipuri din aparatul foto?"
+msgstr[2] "Ștergeți aceste %d de fotografii/clipuri din aparatul foto?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Ștergeți acest fișier din aparatul foto?"
+msgstr[1] "Ștergeți aceste %d fișiere din aparatul foto?"
+msgstr[2] "Ștergeți aceste %d de fișiere din aparatul foto?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Păstrează"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Se șterg fotografiile/clipurile din aparatul foto"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"O fotografie/un clip nu poate fi ștearsă/șters din aparatul foto din cauza "
+"unor erori."
+msgstr[1] ""
+"%d fotografii/clipuri nu pot fi șterse din aparatul foto din cauza unor "
+"erori."
+msgstr[2] ""
+"%d de fotografii/clipuri nu pot fi șterse din aparatul foto din cauza unor "
+"erori."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "Pre_zentare diapozitive"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Redă o prezentare de diapozitive"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportă fotografiile/clipurile"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportă fotografii/clipuri video"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exportă fotografiile"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportă fotografii"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Se rotește"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Se anulează rotirea"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Se inversează pe orizontală"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Se anulează inversarea pe orizontală"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Se inversează pe verticală"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Se anulează inversarea pe verticală"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Orice text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titlu"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etichetă"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Comentariu"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Nume eveniment"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Nume fișier"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Tip media"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Stare marcaj"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Stare fotografie"
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Cotare"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dată"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "conține"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "este exact"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "începe cu"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "se termină cu"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "nu conține"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nu este stabilit"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "este"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nu este"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "orice fotografie"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "o fotografie raw"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "un clip video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "are"
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "nu are"
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "modificări"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "modificări interne"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "modificări externe"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "marcate"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "fără marcaje"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "și mai mult"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "doar"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "și mai mic"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "este după"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "este înainte"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "este între"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "și"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "orice"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "tot"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "nimic"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Căutări salvate"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Căutare salvată nouă"
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Colecția dumneavoastră de fotografii nu este compatibilă cu această versiune "
+"de Shotwell. Se pare că a fost creată cu Shotwell %s (schema %d). Versiunea "
+"curentă este %s (schema %d). Vă rugăm să utilizați ultima veriune de "
+"Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell nu poate actualiza colecția de fotografii, de la versiunea %s "
+"(schema %d) la %s (schema %d). Pentru mai multe informații, vă rugăm să "
+"consultați Shotwell Wiki la %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Colecția de fotografii nu este compatibilă cu această versiune Shotwell. Se "
+"pare că a fost creată cu Shotwell %s (schema %d). Versiunea curentă este %s "
+"(schema %d). Actualizați colecția prin ștergerea %s și reluați importul "
+"fotografiilor."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Eroare necunoscută la verificarea bazei de date Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Se încarcă Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Calea către informațiile private Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTOR"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"Nu monitoriza directorul librăriei la inițializare pentru a detecta "
+"modificările"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Nu afișa indicatorul de progres pentru inițializare"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Arată versiunea aplicației"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FIȘIER]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "Rulați '%s --help' pentru a consulta lista completă a comenzilor.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Azi"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Ieri"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Nume:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Elemente:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d eveniment"
+msgstr[1] "%d evenimente"
+msgstr[2] "%d de evenimente"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotografie"
+msgstr[1] "%d fotografii"
+msgstr[2] "%d de fotografii"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d clip"
+msgstr[1] "%d clipuri"
+msgstr[2] "%d de clipuri"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Data:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Oră:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "De la:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "În:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Dimensiune:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Durată:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f secunde"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Programator:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Expunere:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Loc:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Dimensiune fișier:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Dezvoltare curentă:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Dimensiune originală:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Marcă aparat foto:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model aparat foto:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Bliț:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Distanța focală:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Data expunerii:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Timp de expunere:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Expunere:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Latitudine GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Longitudine GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Autor:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Software:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Comentariu:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Informații extinse"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Această acțiune va șterge eticheta \"%s\" din fotografie. Continuați?"
+msgstr[1] ""
+"Această acțiune va șterge eticheta \"%s\" din %d fotografii. Continuați?"
+msgstr[2] ""
+"Această acțiune va șterge eticheta \"%s\" din %d de fotografii. Continuați?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "Anulează"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "Ș_terge"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Căutarea salvată \"%s\" va fi ștearsă. Continuați?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Schimbarea developerilor va anula toate modificările pe care le-ai făcut "
+"acestei fotografii în Shotwell"
+msgstr[1] ""
+"Schimbarea developerilor va anula toate modificările pe care le-ai făcut "
+"acestor fotografii în Shotwell"
+msgstr[2] ""
+"Schimbarea programatorilor va anula toate modificările pe care le-ai făcut "
+"acestor fotografii în Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Schimbă programatorul"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportă clipul"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell nu poate crea un fișier pentru editarea acestei fotografii deoarece "
+"nu aveți drepturi de scriere pe %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Fotografia următoare nu poate fi exportată din cauza unei erori în fișier.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Doriți continuarea exportării?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Con_tinuă"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nemodificate"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Actual"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Calitate:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Limită _scalare:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_pixeli"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Export metadate"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Salvează detaliile..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Salvează detaliile"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(și %d în plus)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importează raportul cu rezultate"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "S-a încercat importul a %d fișier."
+msgstr[1] "S-a încercat importul a %d fișiere."
+msgstr[2] "S-a încercat importul a %d fișiere."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Din acestea, %d fișier a fost importat cu succes."
+msgstr[1] "Din acestea, %d fișiere au fost importate cu succes."
+msgstr[2] "Din acestea, %d fișiere au fost importate cu succes."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Fotografii/Clipuri duplicate care nu au fost importate:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "duplică item media existent"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"Forografii/Clipuri care nu au fost importate datorită erorilor ale camerei:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "mesaj de eroare:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Fișiere care nu au fost importate deoarece nu au fost recunoscute ca "
+"fotografii sau clipuri video:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotografii/Clipuri care nu au fost importate din cauză ca erau într-un "
+"format pe care Shotwell nu îl recunoaște:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotografii/Clipuri care nu au fost importate pentru că Shotwell nu le-a "
+"putut copia în librăria sa:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"nu s-a putut copia %s\n"
+"\tîn %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+"Fotografii/Clipuri care nu au fost importate deoarece fișierele sunt corupte:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Fotografiile/Videoclipurile nu au fost importate din alte motive:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "O fotografie duplicat nu a fost importată:\n"
+msgstr[1] "%d fotografii duplicat nu au fost importate:\n"
+msgstr[2] "%d de fotografii duplicat nu au fost importate:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Un clip duplicat nu a fost importat:\n"
+msgstr[1] "%d clipuri duplicate nu au fost importate:\n"
+msgstr[2] "%d de clipuri duplicate nu au fost importate:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "O fotografie/un clip duplicat nu a fost importat(ă):\n"
+msgstr[1] "%d fotografii/clipuri duplicate nu au fost importate:\n"
+msgstr[2] "%d de fotografii/clipuri duplicate nu au fost importate:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"O fotografie nu a fost importată din cauza unei erori în fișier sau de "
+"natură hardware:\n"
+msgstr[1] ""
+"%d fotografii nu au fost importate din cauza unei erori în fișier sau de "
+"natură hardware:\n"
+msgstr[2] ""
+"%d de fotografii nu au fost importate din cauza unei erori în fișier sau de "
+"natură hardware:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Un clip nu a fost importat din cauza unei erori în fișier sau de natură "
+"hardware:\n"
+msgstr[1] ""
+"%d clipuri nu au fost importate din cauza unei erori în fișier sau de natură "
+"hardware:\n"
+msgstr[2] ""
+"%d de clipuri nu au fost importate din cauza unei erori în fișier sau de "
+"natură hardware:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"O fotografie/un clip nu a fost importat(ă) din cauza unei erori în fișier "
+"sau de natură hardware:\n"
+msgstr[1] ""
+"%d fotografii/clipuri nu au fost importate din cauza unei erori în fișier "
+"sau de natură hardware:\n"
+msgstr[2] ""
+"%d de fotografii/clipuri nu au fost importate din cauza unei erori în fișier "
+"sau de natură hardware:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 fișier nu a fost importat din cauza unei erori în fișier sau de natură "
+"hardware:\n"
+msgstr[1] ""
+"%d fișiere nu au fost importate din cauza unei erori în fișier sau de natură "
+"hardware:\n"
+msgstr[2] "%d de :\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotografie nu a fost importată deoarece dosarul colecției foto nu poate "
+"fi scris:\n"
+msgstr[1] ""
+"%d fotografii nu au fost importate deoarece dosarul colecției foto nu poate "
+"fi scris:\n"
+msgstr[2] ""
+"%d de fotografii nu au fost importate deoarece dosarul colecției foto nu "
+"poate fi scris:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d clip video nu a fost importat deoarece deoarece dosarul colecției foto nu "
+"poate fi scris:\n"
+msgstr[1] ""
+"%d clipuri video nu au fost importate deoarece dosarul colecției foto nu "
+"poate fi scris:\n"
+msgstr[2] ""
+"%d de clipuri video nu au fost importate deoarece dosarul colecției foto nu "
+"poate fi scris:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotografie/clip video nu a fost importat(ă) deoarece dosarul colecției "
+"foto nu poate fi scris:\n"
+msgstr[1] ""
+"%d fotografii/clipuri nu au fost importate deoarece dosarul colecției foto "
+"nu poate fi scris:\n"
+msgstr[2] ""
+"%d de fotografii/clipuri nu au fost importate deoarece dosarul colecției "
+"foto nu poate fi scris:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"1 fișier nu a fost importat deoarece dosarul colecției foto nu permite "
+"scrierea:\n"
+msgstr[1] ""
+"%d fișiere nu au fost importate deoarece dosarul colecției foto nu permite "
+"scrierea:\n"
+msgstr[2] "%d de :\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"O fotografie nu a fost importată din cauza unei erori a aparatului foto.\n"
+msgstr[1] ""
+"%d fotografii nu au fost importate din cauza unei erori a aparatului foto:\n"
+msgstr[2] ""
+"%d de fotografii nu au fost importate din cauza unei erori a aparatului "
+"foto:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Un clip nu a fost importat din cauza unei erori a aparatului foto:\n"
+msgstr[1] ""
+"%d clipuri nu au fost importate din cauza unei erori a aparatului foto:\n"
+msgstr[2] ""
+"%d de clipuri nu au fost importate din cauza unei erori a aparatului foto:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"O fotografie/un clip nu a fost importat(ă) din cauza unei erori a aparatului "
+"foto:\n"
+msgstr[1] ""
+"%d fotografii/clipuri nu au fost importate din cauza unei erori a aparatului "
+"foto:\n"
+msgstr[2] ""
+"%d de fotografii/clipuri nu au fost importate din cauza unei erori a "
+"aparatului foto:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"1 fișier nu a fost importat din cauza unei erori a aparatului foto:\n"
+msgstr[1] ""
+"%d fișiere nu au fost importate din cauza unei erori a aparatului foto:\n"
+msgstr[2] "%d de :\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 fotografie nu a putut fi importată deoarece este coruptă:\n"
+msgstr[1] "%d fotografii nu au putut fi importate deoarece sunt corupte:\n"
+msgstr[2] "%d fotografii nu au putut fi importate deoarece sunt corupte:\n"
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 clip video nu a putut fi importat deoarece este corupt:\n"
+msgstr[1] "%d clipuri video nu au putut fi importate deoarece sunt corupte:\n"
+msgstr[2] "%d clipuri video nu au putut fi importate deoarece sunt corupte:\n"
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"1 fotografie/clip video nu a putut fi importat(ă) deoarece este corupt(ă):\n"
+msgstr[1] ""
+"%d fotografii/clipuri video nu au putut fi importate deoarece sunt corupte:\n"
+msgstr[2] ""
+"%d fotografii/clipuri video nu au putut fi importate deoarece sunt corupte:\n"
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 fișier nu a putut fi importat deoarece este corupt:\n"
+msgstr[1] "%d fișiere nu au putut fi importate deoarece erau corupte:\n"
+msgstr[2] "%d fișiere nu au putut fi importate deoarece erau corupte:\n"
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "O fotografie nerecunoscută a fost omisă:\n"
+msgstr[1] "%d fotografii nerecunoscute au fost omise:\n"
+msgstr[2] "%d de fotografii nerecunoscute au fost omise:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Un fișier non-imagine a fost omis.\n"
+msgstr[1] "%d fișiere non-imagine au fost omise.\n"
+msgstr[2] "%d de fișiere non-imagine au fost omise.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] ""
+"A fost omisă o fotografie din cauza anulării operației de către utilizator:\n"
+msgstr[1] ""
+"Au fost omise %d fotografii din cauza anulării operației de către "
+"utilizator:\n"
+msgstr[2] ""
+"Au fost omise %d de fotografii din cauza anulării operației de către "
+"utilizator:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+"A fost omis un clip din cauza anulării operației de către utilizator:\n"
+msgstr[1] ""
+"Au fost omise %d clipuri din cauza anulării operației de către utilizator:\n"
+msgstr[2] ""
+"Au fost omise %d de clipuri din cauza anulării operației de către "
+"utilizator:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"A fost omis(ă) o fotografie/un clip din cauza anulării operației de către "
+"utilizator:\n"
+msgstr[1] ""
+"Au fost omise %d fotografii/clipuri din cauza anulării operației de către "
+"utilizator:\n"
+msgstr[2] ""
+"Au fost omise %d de fotografii/clipuri din cauza anulării operației de către "
+"utilizator:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 fișier a fost omis, deoarece utilizatorul a anulat acțiunea:\n"
+msgstr[1] ""
+"%d fișiere au fost omise, deoarece utilizatorul a anulat acțiunea:\n"
+msgstr[2] ""
+"%d de fișiere au fost omise, deoarece utilizatorul a anulat acțiunea:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Fotografia a fost importată cu succes.\n"
+msgstr[1] "%d fotografii au fost importate cu succes.\n"
+msgstr[2] "%d de fotografii au fost importate cu succes.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Un clip a fost importat cu succes.\n"
+msgstr[1] "%d clipuri au fost importate cu succes.\n"
+msgstr[2] "%d de clipuri au fost importate cu succes.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "O fotografie/un clip a fost importat(ă) cu succes.\n"
+msgstr[1] "%d fotografii/clipuri au fost importate cu succes.\n"
+msgstr[2] "%d de fotografii/clipuri au fost importate cu succes.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Nicio fotografie și niciun clip nu au fost importate.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Operația de importare a fost încheiată"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "o secundă"
+msgstr[1] "%d secunde"
+msgstr[2] "%d de secunde"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "un minut"
+msgstr[1] "%d minute"
+msgstr[2] "%d de minute"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "o oră"
+msgstr[1] "%d ore"
+msgstr[2] "%d de ore"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 zi"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Redenumește eveniment"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Nume:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Editare nume"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Editează comentariu despre eveniment"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Editează comentariu despre fotografie/clip"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Trimite fișierul la coșul de gunoi"
+msgstr[1] "_Trimite fișierele la coșul de gunoi"
+msgstr[2] "_Trimite fișierele la coșul de gunoi"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Doar ște_rge"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Anulați editările externe?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Anulați editările externe?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Veți pierde toate modificările aplicate fișierului extern. Continuați?"
+msgstr[1] ""
+"Veți pierde toate modificările aplicate celor %d fișiere externe. Continuați?"
+msgstr[2] ""
+"Veți pierde toate modificările aplicate celor %d de fișiere externe. "
+"Continuați?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Anulează e_ditările externe"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Anulează editările e_xterne"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Această acțiune va șterge fotografia din colecție. Continuați?"
+msgstr[1] "Această acțiune va șterge %d fotografii din colecție. Continuați?"
+msgstr[2] ""
+"Această acțiune va șterge %d de fotografii din colecție. Continuați?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "Ște_rge"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Șterge fotografiile din colecție"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Șterge fotografiile din colecție"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 de ore"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Modifică fotografiile/clipurile video în aceeași măsură"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Marchează to_ate fotografiile/clipurile video cu această oră și dată"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifică fișierul fotografiei originale"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifică fișierele fotografiilor originale"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Modifică fișierele originale"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Modifică fișierul original"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Data expunerii va fi modificată în avans cu\n"
+"%d %s, %d %s, %d %s, și %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Data expunerii va fi modificată în devans cu\n"
+"%d %s, %d %s, %d %s, și %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "zi"
+msgstr[1] "zile"
+msgstr[2] "de zile"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "oră"
+msgstr[1] "ore"
+msgstr[2] "de ore"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minute"
+msgstr[2] "de minute"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "secundă"
+msgstr[1] "secunde"
+msgstr[2] "de secunde"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Și %d în plus."
+msgstr[1] ""
+"\n"
+"\n"
+"Și %d în plus."
+msgstr[2] ""
+"\n"
+"\n"
+"Și %d în plus."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etichete (separate prin virgulă):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Bine ați venit!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Bine ați venit în Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Pentru a începe, importați fotografii prin una din metodele următoare:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Alegeți <span weight=\"bold\">Fișier %s Importă din dosar</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Trageți și plasați fotografii în fereastra Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Conectați un aparat foto la calculator și importați fotografiile"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importă fotografiile din dosarul %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Mai puteți importa fotografii într-unul din următoarele moduri:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Nu arăta _din nou acest mesaj"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importare fotografii din biblioteca %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Ajutor)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Zi%sLună%sAn"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Zi%sLună"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Zi%sLună-An"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Zi-Lună-An"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Personalizat"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Model nevalid"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell poate copia fotografiile în dosarul colecție sau le poate importa "
+"fără a le copia. "
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Co_piază fotografiile"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importă în locul"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importă în colecție"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Șterge din colecție"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Se șterg fotografiile din colecție"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Se șterg fotografiile din colecție"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Această acțiune va șterge fotografia/clipul din colecția Shotwell. Doriți, "
+"de asemenea, trimiterea fișierului la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[1] ""
+"Această acțiune va șterge %d fotografii/clipuri din colecția Shotwell. "
+"Doriți, de asemenea, trimiterea fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[2] ""
+"Această acțiune va șterge %d de fotografii/clipuri din colecția Shotwell. "
+"Doriți, de asemenea, trimiterea fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Această acțiune va șterge clipul din colecția Shotwell. Doriți, de asemena, "
+"să trimiteți fișierul la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[1] ""
+"Această acțiune va șterge %d clipuri din colecția Shotwell. Doriți, de "
+"asemena, să trimiteți fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[2] ""
+"Această acțiune va șterge %d de clipuri din colecția Shotwell. Doriți, de "
+"asemenea, să trimiteți fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Această acțiune va șterge fotografia din colecția Shotwell. Doriți, de "
+"asemenea, să trimiteți fișierul la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[1] ""
+"Această acțiune va șterge %d fotografii din colecția Shotwell. Doriți, de "
+"asemenea, să trimiteți fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+msgstr[2] ""
+"Această acțiune va șterge %d de fotografii din colecția Shotwell. Doriți, de "
+"asemenea, să trimiteți fișierele la coșul de gunoi al sistemului?\n"
+"\n"
+"Nu veți putea reveni asupra acestei acțiuni."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Fotografia sau clipul nu poate fi trimis(ă) la coșul de gunoi al sistemului. "
+"Ștergeți definitiv fișierul?"
+msgstr[1] ""
+"%d fotografii/clipuri nu pot fi trimise la coșul de gunoi al sistemului. "
+"Ștergeți definitiv fișierele?"
+msgstr[2] ""
+"%d de fotografii/clipuri nu pot fi trimise la coșul de gunoi al sistemului. "
+"Ștergeți definitiv fișierele?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Fotografia sau clipul nu poate fi ștearsă/șters. "
+msgstr[1] "%d fotografii/clipuri nu pot fi șterse."
+msgstr[2] "%d de fotografii/clipuri nu pot fi șterse."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Dosare"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etichete"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Succes"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Eroare fișier"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Fișierul nu poate fi decodat"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Eroare bază de date"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Utilizatorul a abandonat importul"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nu este fișier"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Fișierul există deja în baza de date"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Format fișier nerecunoscut"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nu este un fișier imagine"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Defecțiune disc"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disc plin"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Eroare aparat foto"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Eroare la scrierea fișierului"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Fișier imagine corupt"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importul a eșuat (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "modificat"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Fotogafia anterioară"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Fotografia următoare"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Fișierul sursă al fotografiei lipsește: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Vizualizare"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Unelte"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "Fotografia ant_erioară"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Fotografia anterioară"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Fotografia u_rmătoare"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Fotografia următoare"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Mărește"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Mărește mai mult fotografia"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "Mi_cșorează"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Micșorează fotografia mărită"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Scalează la _pagină"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Potrivește dimensiunea fotografiei la mărimea ecranului"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Zoom _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Afișează fotografia la dimensiune normală"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Zoom _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Afișează fotografia la dimensiune dublă"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Programator"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nu se poate realiza exportul %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Baza de date %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importarea din %s nu poate continua din cauza unei erori:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Pentru a încerca importarea din alt serviciu, alegeți unul din meniul de mai "
+"jos."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importare date"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nu ați activat niciun modul pentru importarea datelor.\n"
+"\n"
+"Pentru a utiliza funcția de importare din aplicație, trebuie să activați cel "
+"puțin un modul pentru importarea datelor. Modulele pot fi activate din "
+"dialogul Preferințe. "
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Fișierul bazei de date:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importă"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importare din aplicație"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Im_portare media din:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "În_chide"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Opţiuni"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Prezentare diapozitive"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Înapoi"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Mergi la fotografia anterioară"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pauză"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pune prezentarea de diapozitive în așteptare"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Următoarea"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Mergi la fotografia următoare"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Modificați configurările prezentării de diapozitive"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Toate fișierele sursă ale fotografiilor lipsesc."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Redă"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Reia prezentarea de diapozitive"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Se revine"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Se anulează revenirea"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Se îmbunătățește"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Se anulează îmbunătățirea"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Se aplică transformările de culoare"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Se anulează transformările de culoare"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Se creează eveniment nou"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Se șterge eveniment"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Se mută fotografii către eveniment nou"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Se asociază fotografii cu evenimentul anterior"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Se unește"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Se desparte"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Se duplică fotografii"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Se șterg fotografii duplicate"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Nu se poate duplica o fotografie din cauza unei erori în fișier"
+msgstr[1] "Nu se pot duplica %d fotografii din cauza unor erori în fișier"
+msgstr[2] "Nu se pot duplica %d de fotografii din cauza unor erori în fișier"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Se restaurează aprecierea anterioară"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Se mărește aprecierea"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Se micșorează aprecierea"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Configurare programator RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Restaurare programator anterior RAW"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Programator set"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Fotografia originală nu poate fi modificată"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Se modifică ora și data"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Se anulează modificarea orei și a datei"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "O fotografie originală nu poate fi modificată."
+msgstr[1] "Următoarele fotografii originale nu pot fi modificate."
+msgstr[2] "Următoarele fotografii originale nu pot fi modificate."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Eroare la modificarea orei"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Nu se poate modifica ora pentru următorul fișier imagine."
+msgstr[1] "Nu se poate modifica ora pentru următoarele fișiere imagine."
+msgstr[2] "Nu se poate modifica ora pentru următoarele fișiere imagine."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Creează etichetă"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Mută eticheta \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Mută fotografiile în coșul de gunoi"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Restaurează fotografiile din coșul de gunoi"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Mută fotografiile în coșul de gunoi Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Restaurează fotografiile în colecția Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Se mută fotografiile la coșul de gunoi"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Se restaurează fotografiile din coșul de gunoi"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Marchează fotografiile selectate"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Demarchează fotografiile selectate "
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Marchează fotografiile selectate"
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Demarchează fotografiile selectate "
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Marcare"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Demarcare"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Mică (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Medie (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Mare (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximă (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Nicio fotografie/niciun clip video"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Nicio fotografie/niciun clip video nu a fost găsit"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotografiile nu pot fi exportate în acest director"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nu se pot procesa actualizările monitorizate: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Pe toată pagina"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 imagini pe pagină"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 imagini pe pagină"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 imagini pe pagină"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 imagini pe pagină"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 "
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 imagini pe pagină"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Portofel (2 × 3 in.)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Carnet notițe (3 × 5 in.)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 × 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 × 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 × 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 × 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Portofel metric (9 × 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Carte poștală (10 × 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Configurări imagine"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Se tipărește..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Fotografia nu poate fi tipărită:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nu se poate deschide/crea baza de date %s cu fotografii: cod eroare %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nu se poate scrie în baza de date a fotografiilor:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Eroare la accesarea fișierului bazei de date:\n"
+" %s\n"
+"\n"
+"Eroarea a fost: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exportă clipurile"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nu se poate lansa Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Trimite la"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Fundalul desktopului nu poate fi exportat către %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nu se poate pregăti prezentarea de diapozitive: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Marcate"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Coș de gunoi"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Coșul de gunoi este gol"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Şterge"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Se șterg fotografiile"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Fișiere lipsă"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Se șterge..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Ultimul import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importă din dosar..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importă fotografiile de pe disc în colecție"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importare din _aplicație..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sortează _evenimente"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "_Golește coșul de gunoi"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Șterge toate fotografiile din coșul de gunoi"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Vizualizare eve_niment pentru fotografie"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Caută"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Căutați fotografii și clipuri video după criterii de căutare"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fișier"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Editare"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "F_otografie"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografii"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Evenimen_te"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Etichete"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Ajutor"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Informații de _bază"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Afișează informații de bază pentru selecție"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Informații e_xtinse"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Afișează informații extinse despre selecție"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Bară căutare"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Afișează bara de căutare"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Bară laterală"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Afișează bara laterală"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Crescător"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sortează fotografiile în ordine crescătoare"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "D_escrescător"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sortează fotografiile în ordine descrescătoare"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importă din dosar"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Golește coșul de gunoi"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Se golește coșul de gunoi..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell este configurat să importe fotografiile în directorul personal.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Amplasare colecție"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotografiile din acest director nu pot fi importate."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Se actualizează colecția..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Se pregătește importul automat al fotografiilor..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Se importă automat fotografiile..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Se scriu metadatele fișierelor..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Colecție"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Se importă..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Oprește importul"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Oprește importul fotografiilor"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Se pregătește importul..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importate %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Salvează"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Salvează fotografia"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Salvează c_a..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Salvează fotografia sub un alt nume"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Tipărește fotografia utilizând o imprimantă conectată la calculator"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s nu există."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nu este un fișier."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s nu recunoaște formatul fișierului\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Salvează o copie"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Pierdeți modificările pentru %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Înc_hide fără salvare"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Eroare la salvarea în %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Salvează ca"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s nu poate fi monitorizat: nu este un dosar (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Administrator fotografii"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Vizualizator fotografii"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotește la _dreapta"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotire"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotește la dreapta"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"Rotește fotografiile către dreapta (apăsați Ctrl pentru a roti către stânga)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotește la _stânga"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotește la stânga"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotește fotografia la stânga"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Inversează pe ori_zontală"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Inversează pe orizontală"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Inversează pe _verticală"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Inversează pe verticală"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Î_mbunătățește"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Îmbunătățire"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Îmbunătățește automat aspectul fotografiei"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Copiază ajustările de culoare"
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "_Copiază ajustările de culoare"
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "_Copiază ajustările de culoare aplicate fotografiei"
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "Lipește ajustările de culoare"
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Lipește ajustările de culoare"
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Aplică ajustările de culoare copiate fotografiilor selectate"
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "De_cupare"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Trunchiere"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Decupează dimensiunea fotografiei"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "Î_mbunătățire"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Îmbunătățire"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Îmbunătățire fotografie"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Ochi _roșii"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Ochi roșii"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Reduce sau elimină efectul de ochi roșii din fotografie"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Modifică"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Modifică"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Modifică culorile și nuanțele fotografiei"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Re_vino la original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Revenire la original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Anulează e_ditările externe"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Revenire la fotografia de bază"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Configurează ca fundal des_ktop"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Configurează imaginea aleasă ca fundal nou pentru spațiul de lucru"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Configurează prezentare diapozitive ca fundal des_ktop..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "An_ulează"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Anulează"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Refă"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Refacere"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Rede_numește eveniment..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "S_tabilește miniatură pentru eveniment"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Stabilește miniatură pentru eveniment"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Eveniment _nou"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Eveniment nou"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Mută fotografiile"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Mută fotografiile către un eveniment"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Unește eveni_mentele"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Unește"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Combină evenimentele într-un singur eveniment"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Stabilește apreciere"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Stabilește apreciere"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Schimbă aprecierea pentru fotografie"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Mărește"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Mărește aprecierea"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "M_icșorează"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Micșorează aprecierea"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Fără apreciere"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Necotate"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Apreciează fotografia ca necotată"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Configurează ca necotată"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Șterge toate aprecierile"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Respinsă"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Respins"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Apreciază ca respinsă"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Configurare ca respinsă"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Configurează aprecierea ca respinsă"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "D_oar cele respinse"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Numai fotografiile respinse"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Arată doar fotografiile respinse"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Toate + _Respinse"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Arată toate fotografiile, inclusiv cele respinse"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "To_ate fotografiile"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Arată toate fotografiile"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "Ap_recieri"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Afișează aprecierea fiecărei fotografii"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrează fotografiile"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrează fotografiile"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Limitează numărul fotografiilor afișate pe baza unui filtru"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicare"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicare"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Creează un duplicat al fotografiei"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportă..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Ti_părește ..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blică..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publică"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publică pe diferite site-uri web"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Edi_tare nume..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Modifică_Comentariu..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Modifică comentariu"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Editează _comentariu despre eveniment"
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "Regle_ază ora și data.."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Reglează ora și data"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Adaugă e_tichete..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Adaugă etichete"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Adaugă etichete"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Preferințe"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Deschide cu editor e_xtern"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Deschide cu un editor RA_W"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Trimite la..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_Trimite la..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Caută..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Căutare"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Căutați o imagine după textul care apare în denumire sau în etichete"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "Ma_rcare"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Dema_rcare"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nu se poate lansa editorul: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Adaugă eticheta \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Adaugă etichetele \"%s\" și \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Șter_ge eticheta \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Șterge eticheta \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Șterge eticheta"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nou"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Rede_numește eticheta \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Redenumește eticheta \"%s\" în \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Redenumește..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Mod_ifică etichetele..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Modifică etichetele"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Etichetează fotografiile ca \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Etichetează fotografia ca \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Etichetează fotografiile selectate ca \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Etichetează fotografiile salvate ca \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Șterge eticheta \"%s\" din _fotografii"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Șterge eticheta \"%s\" din fo_tografii"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Șterge eticheta \"%s\" din fotografii"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr " Șterge eticheta \"%s\" din fotografii"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Nu se poate redenumi eticheta în \"%s\" deoarece există deja."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Nu se poate redenumi căutarea în \"%s\" deoarece căutarea există deja."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Căutare salvată"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Șterge căutarea"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Editare..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Rede_numește..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Redenumește căutarea \"%s\" în \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Șterge căutarea \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Apreciere %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Configurează aprecierea la %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Configurare apreciere la %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Afișează %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Afișează numai fotografiile cu aprecierea %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s sau mai mare"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Afișează %s sau mai mare"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Afișează numai fotografiile cu aprecierea %s sau mai mare"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Șterge fotografiile selectate din coșul de gunoi"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Șterge fotografiile selectate din colecție"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Restaurează"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Mută fotografiile selectate înapoi în colecție"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Arată în a_dministratorul de fișiere"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Deschide dosarul fotografiei selectate în administratorul de fișiere"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nu se poate deschide în administratorul de fișiere: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Șt_erge din colecție"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Mută la coșul de gunoi"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Selecte_ază tot"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Selectează toate articolele"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Unghi:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Restabilește"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Restabilește dimensiunile originale ale fotografiei"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Stabilește aria de selecție pentru această fotografie"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Rotește aria de selecție între orientările portret și peisaj"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Fără limitări"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Pătrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Ecran"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Dimensiune originală"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Video SD (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Video HD (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Scrisoare (215.9 mm × 279.4 mm)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tablou (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Închide utilitarul pentru ochi roșii"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Șterge toate efectele de ochi roșii din selecție"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Culoare:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Nuanță:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatură:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Umbre:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr "Evidențieri:"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Restabilește culorile"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Restabilește toate modificările culorilor la original"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatură"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Nuanță"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Culoare"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Expunere"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Umbre"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr "Evidențieri"
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Expansiune contrast"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fixează bară de unelte"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fixează bara de unelte deschisă"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Ieșire din modul pe tot ecranul"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Fereastră normală"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "Ieșire"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "Despre"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Pe tot e_cranul"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Cuprins"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Întrebări _frecvente"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Raportează o Problemă..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"În timpul accesării colecției Shotwell a apărut o eroare majoră. Shotwell nu "
+"poate continua.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Vizitați site-ul web Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+" Marian Vasile <marianvasile@upcmail.ro>, Corneliu Dascălu <corneliu."
+"dascalu@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nu se poate afișa pagina de ajutor: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nu se poate naviga la baza de date cu bug-uri: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nu se pot afișa întrebările frecvente FAQ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "fără nume"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Dimensiune originală"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Lățime sau înălțime"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Lățime"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Înalțime"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Modificați dimensiunea miniaturilor"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Mărește dimensiunile miniaturilor"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Micșorează dimensiunile miniaturilor"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Sortează _fotografiile"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Redă cli_pul"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Deschide clipurile selectate cu playerul video implicit al sistemului"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Comentarii"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Afișează comentariul fiecărei fotografii"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Afișează eticheta fiecărei fotografii"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "După _nume"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Sortează fotografiile după nume"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "După _dată"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Sortează fotografiile după data expunerii"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "După ap_reciere"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Sortează fotografiile după apreciere"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell nu poate reda clipul selectat:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotografii/clipuri"
+msgstr[1] "%d de fotografii/de clipuri"
+msgstr[2] "%d fotografie/clip"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Afișează comentariul fiecărui eveniment"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Niciun eveniment"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Nu a fost găsit niciun eveniment"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Evenimente"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Fără dată"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Fără eveniment"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nu se poate crea directorul cache %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nu se poate crea dosarul de date %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Fotografii"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nu se poate crea directorul temporar %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nu se poate crea subdosarul de date %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Nimic)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Nimic"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Aleator"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Tranziție prezentare diapozitive"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nu se poate genera fișierul temporar pentru %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Se exportă"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Fișierul %s există deja. Înlocuiți?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Omite"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "Î_nlocuiește"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Înlocuiește _tot"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportă"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografii"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Clipuri"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotografii RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotografii RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Eroare la încărcarea fișierului UI %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Tip"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Se publică"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Fotografiile/clipurile selectate au fost publicate cu succes."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Clipurile selectate au fost publicate cu succes."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Fotografiile selectate au fost publicate cu succes."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Clipul video selectat a fost publicat cu succes."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Fotografia selectată a fost publicată cu succes."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Se aduc informațiile contului..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Autentificare..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publică fotografiile"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publică fo_tografiile pe:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publică clipurile"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "_Publică clipurile pe"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicare fotografii și clipuri"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publică fo_tografiile și clipurile pe"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nu se poate publica"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell nu poate publica obiectele selectate deoarece nu ai nici un plugin "
+"de publicare compatibil activat. Pentru a corecta acest lucru, alege "
+"<b>Editare %s Preferințe</b> și activează unul sau mai multe din plugin-"
+"urile de publicare din tab-ul <b>Plugins</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Pregătire pentru încărcare"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Se încarcă %d din %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Publicarea pe %s nu poate continua din cauza unei erori:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Pentru a încerca publicarea pe alt serviciu, alegeți unul din meniu."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "E_tichetă nouă..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Un fișier temporar necesar pentru publicare nu este disponibil"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"V-ați autentificat și ați ieșit deja dintr-un serviciu Google pe parcursul "
+"acestei sesiuni\n"
+"\n"
+"Pentru a continua publicarea pe serviciile Google, ieșiți din Shotwell și "
+"reporniți programul, apoi încercați din nou să publicați."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Nu sunteți autentificat pe YouTube.\n"
+"\n"
+"Trebuie să aveți un cont Google configurat deja pentru a fi utilizat cu "
+"YouTube pentru a continua. Puteți configura conturile utilizând navigatorul "
+"de Internet, autentificându-vă apoi pe YouTube."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Un fișier necesar pentru publicare este indisponibil. Publicare către "
+"Youtube nu poate continua."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Sunteți autentificat pe YouTube ca %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr " '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Listare publică"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Delistare publică"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Servicii de bază pentru publicare"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Acum nu sunteți autentificat pe Flickr.\n"
+"\n"
+"Efectuați clic pe Flickr pentru a vă autentifica în navigatorul de Internet. "
+"Va trebui să autorizați Shotwell pentru a se conecta la contul dumneavoastră "
+"Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"V-ați autentificat și ați ieșit din Flickr deja pe parcursul acestei "
+"sesiuni\n"
+"Pentru a continua publicarea pe Flickr, ieșiți din Shotwell și reporniți "
+"programul, apoi încercați din nou să publicați."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Pregătire pentru autentificare..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Un fișier necesar pentru publicare este indisponibil. Publicare către Flickr "
+"nu poate continua."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Se verifică autorizarea..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Sunteți autentificat pe Flickr ca %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Contul gratuit Flickr limitează cantitatea de date pe care o puteți "
+"încărca.\n"
+"Pentru această lună mai aveți la dispoziție %d MO."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"Contul Flickr Pro vă permite încărcarea a cât de multe fotografii doriți."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotografii _vizibile pentru:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Clipuri _vizibile pentru:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotografiile și clipurile _vizibile pentru:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Toți"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Numai pentru familie și prieteni"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Doar familia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Doar prietenii"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Numai pentru mine"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixeli"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 pixeli"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixeli"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixeli"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Se creează albumul %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"A fost întâmpinată o problemă încercând publicarea către Piwigo. Vă rugăm să "
+"încercați din nou."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Introdu URL-ul librăriei foto Piwigo, precum si username-ul și parola "
+"asociate cu contul Piwigo pentru această librărie."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell nu poate contacta librăria ta foto Piwigo. Te rog verifică URL-ul "
+"pe care l-ai introdus"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Username și/sau parolă invalide. Te rog încearcă din nou"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "URL invalid"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Utilizator sau parolă invalide"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Admini, Familie, Prieteni, Contacte"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Admini, Familie, Prieteni"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Admini, Familie"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Admini"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Momentan nu ești autentificat în Picasa Web Albums.\n"
+"\n"
+"Apasă Login pentru a te autentifica în Picasa Web Albums în browserul web. "
+"Va trebui să autorizezi Shotwell Connect pentru a se conecta la contul tău "
+"Picasa Web Albums."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Un fișier necesar pentru publicare este indisponibil. Publicare către Picasa "
+"nu poate continua."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Se creează album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Sunteți autentificat pe Picasa Web Album ca %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Clipurile video vor apărea în:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotografiile vor apărea în:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Mică (640 x 480 pixeli)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Medie (1024 x 768 pixeli)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Recomandată (1600 x 1200 pixeli)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Acum nu sunteți autentificat pe Facebook.\n"
+"\n"
+"Dacă nu aveți un cont Facebook, puteți crea unul în timpul procesului de "
+"autentificare. La conectare, Shotwell Connect poate cere permisiunea de a "
+"publica fotografiile. Permisiunea este necesară pentru funcționarea Shotwell "
+"Connect."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"V-ați autentificat și ați ieșit din Facebook deja pe parcursul acestei "
+"sesiuni Shotwell.\n"
+"Pentru a continua publicarea pe Facebook, ieșiți din Shotwell și reporniți "
+"programul, apoi încercați din nou să publicați."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 pixeli)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Mare (2048 pixeli)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Se testează conexiunea la Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Un fișier necesar pentru publicare este indisponibil. Publicare către "
+"Facebook nu poate continua."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Sunteți autentificat pe Flickr ca %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Unde doriți să publicați fotografiile selectate?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Dimen_siune încărcare:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Prieteni"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Fărâmițare"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Șah"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Cercuri"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Jaluzele"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Dungi"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Ceas"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Cerc"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Tranziție principală pentru prezentare diapozitive "
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Diapozitiv"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Atenuare"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Pătrate"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Servicii de import de date centrale"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Bine ai venit la serviciul de import din libraria F-Spot\n"
+"\n"
+"Te rog selectează o librărie pentru import, fie selectând una din librăriile "
+"deja existente găsite de Shotwell sau selectând o bază de date F-Spot "
+"alternativă"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Bine ai venit la serviciul de import din libraria F-Spot\n"
+"\n"
+"Te rog selectează o bază de date F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Selectează manual o bază de date F-Spot pentru import:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nu poate fi deschisă baza de date F-Spot selectată: fișierul nu există sau "
+"nu este o bază de date F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nu poate fi deschisă baza de date F-Spot selectată: această versiune a bazei "
+"de date F-Spot nu este suportată de Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nu poate fi citită baza de date F-Spot: eroare în timpul citirii tabelul cu "
+"etichete"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nu poate fi citită baza de date F-Spot selectată: eroare în timpul citirii "
+"tabelului cu fotografii"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell a găsit %d fotografii în librăria F-Spot și le importează. "
+"Duplicatele vor fi detectate automat și șterse.\n"
+"\n"
+"Poți închide acest dialog și începe să folosești Shotwell cât timp import-ul "
+"are loc în fundal."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Librăria F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Se pregătește importul"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Configurează prezentarea de diapozitive ca fundal desktop"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Generare prezentare diapozitive ca fundal pentru desktop"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Arată fiecare fotografie pentru"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "perioadă de timp"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Cât de mult va fi arătată fotografia pe fundalul desktopului"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Caută"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Nume căutare:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "Potr_ivire"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "din următoarele:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Dimensiune imagine tipărită</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Utilizează dimensiune _standard"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "_Utilizează dimensiune personalizată:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "Pă_strează proporțiile fotografiei"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "Potrivire _automată:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titluri</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "_Tipărește denumirea imaginii"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Rezoluție pixeli</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "Adu f_otografia la:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixeli pe inch"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etichetă"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Preferințe Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "alb"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "negru"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "Ca_ută în colecția de fotografii după fișiere noi"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadate"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Scriere etichete, nume și alte _metadate în fișierele foto"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Afișare"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importă fotografiile în:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Fundal:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Se importă"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Structură _dosare:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Model:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Exemplu:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "R_edenumește fișierele importate folosind litere mici"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Programator RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Implicit:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Editor foto e_xtern:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Editor _RAW extern:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Editoare externe"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Module"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Decalaj:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Efecte _tranziție:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "D_ecalaj tranziție:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Afișează t_itlu"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "secunde"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Autentificare"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (textul depinde de username-ul fb și este modificat în aplicație - \n"
+"orice puneți în acest câmp nu va fi afișat)"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publică într-un album e_xistent:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Creează un album _nou numit:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Albumele noi cu fotografii și clipuri _vizibile pentru: "
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"Elimină locația, tipul camerei sau alte informații care pot fi folosite "
+"pentru identificare, înainte de upload"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "Înc_hidere sesiune"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publică"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Introduceți numărul de confirmare care apare imediat după autentificarea pe "
+"Flicker în navigatorul de Internet."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Număr autorizare:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ești conectat în Flickr ca (nume).\n"
+"\n"
+"(această etichetă este populată în interiorul codului, \n"
+"așa că modficările făcute aici nu vor fi afișate)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr "etichetă _vizibilitate (populată în cod)"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Dimensiune fotografie:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'ești conectat ca $nume'\n"
+"(populat în codul aplicației)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Un album _existent:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Un album _nou denumit:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "L_istează albumele în galeria publică"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype va apărea în\n"
+"(populat în cod)"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Dimen_siune prestabilită:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL-ul colecției dumneavoastră Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Nume utilizator"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Parolă"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Reține parola"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Autentificare"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "O categorie _existentă:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotografiilr vor fi _vizibile pentru:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Dimensiune fotografie:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr "în interiorul categoriei:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Comentariu album:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"Dacă un titlu este setat și comentariul nu, folosește titlul drept comentariu"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "Nu uploada etichete"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Deconectare"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Configurări acce_s pentru clipuri:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixeli"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' nu este un răspuns valid pentru un request de autentificare OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): nu se poate porni; acest publisher nu poate fi "
+"repornit"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Introdu username-ul și parola asociate cu contul tău Tumblr"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nu a putut fi încărcat UI-ul: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Ești conectat pe Tumblr ca %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Vizitați site-ul web Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Nu sunteți autentificat pe Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "Adresă _email"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ești conectat la Tumblr ca (nume).\n"
+"\n"
+"(această etichetă este populată în interiorul codului,\n"
+"deci modificările făcute aici nu vor fi afișate)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Bloguri:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albume (sau scrieți nou):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Tip acces:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Dezactivează _comentarii"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Interzice descărcarea _fotografiilor originale"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..abf0d07
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,4715 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Aleksandr P <davian818@gmail.com>, 2011
+# prokoudine <alexandre.prokoudine@gmail.com>, 2011
+# prokoudine <alexandre.prokoudine@gmail.com>, 2011
+# georgev <george.vardo@gmail.com>, 2012
+# georgev <george.vardo@gmail.com>, 2012
+# triplepointfive <iya777@yandex.ru>, 2012
+# triplepointfive <iya777@yandex.ru>, 2012
+# Julia <juliette.tux@gmail.com>, 2013
+# Misha Shnurapet <shnurapet@fedoraproject.org>, 2011
+# oleg koptev <koptev.oleg@gmail.com>, 2011
+# oleg koptev <koptev.oleg@gmail.com>, 2012
+# Pavel Ralovets <irbinix@gmail.com>, 2012
+# verayin <vera@yorba.org>, 2011
+# Алексей Мусихин <malexlv@apollo.lv>, 2012
+# Марк Коренберг <socketpair@gmail.com>, 2011
+# georgev <george.vardo@gmail.com>, 2012
+# georgev <george.vardo@gmail.com>, 2012
+# triplepointfive <iya777@yandex.ru>, 2012
+# triplepointfive <iya777@yandex.ru>, 2012
+# lsbeeler <lucas@yorba.org>, 2011
+# oleg koptev <koptev.oleg@gmail.com>, 2011
+# oleg koptev <koptev.oleg@gmail.com>, 2012
+# Алексей Мусихин <malexlv@apollo.lv>, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-21 07:40+0000\n"
+"Last-Translator: Julia <juliette.tux@gmail.com>\n"
+"Language-Team: Russian (http://www.transifex.com/projects/p/shotwell/"
+"language/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Событие %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Камеры"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Камера"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Невозможно отключить камеру. Попробуйте отмонтировать её из файлового "
+"менеджера."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Скрыть уже импортированные фото"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Показать только не импортированные фото"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Начинаю импортирование…"
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Названия"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Показать название каждого фото"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Импортировать выбранные"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Импортирование выбранных фотографий в библиотеку"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Импортировать _все"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Импортировать все фотографии в библиотеку"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Для доступа к камере, Shotwell должен отмонтировать её от файловой системы. "
+"Продолжить?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Размонтировать"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Отмонтируйте камеру."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Камера заблокирована другим приложением. Shotwell не может работать с "
+"заблокированной камерой. Закройте все приложения, работающие с камерой и "
+"повторите попытку."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Закройте все приложения, работающие с камерой."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Невозможно получить предпросмотр с камеры:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Отмонтирование…"
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Получение информации о снимке"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Получение предпросмотра %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Невозможно заблокировать камеру: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Удалить %d фотографию из камеры?"
+msgstr[1] "Удалить %d фотографии из камеры?"
+msgstr[2] "Удалить %d фотографий из камеры?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Удалить %d видеофайл из камеры?"
+msgstr[1] "Удалить %d видеофайла из камеры?"
+msgstr[2] "Удалить %d видеофайлов из камеры?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Удалить %d фотографию/видеофайл из камеры?"
+msgstr[1] "Удалить %d фотографии/видеофайла из камеры?"
+msgstr[2] "Удалить %d фотографий/видеофайлов из камеры?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Удалить %d файл из камеры?"
+msgstr[1] "Удалить эти %d файла из камеры? "
+msgstr[2] "Удалить эти %d файлов из камеры?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Оставить"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Удаление фотографий и видеоклипов из камеры"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Невозможно удалить %d фотографию/видео из камеры из-за ошибок."
+msgstr[1] "Невозможно удалить %d фотографии/видео из камеры из-за ошибок."
+msgstr[2] "Невозможно удалить %d фотографий/видео из камеры из-за ошибок."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Слайдшоу"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "_Запустить слайдшоу"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Экспорт фотографий/видео"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Экспорт фотографий/видео"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Экспорт фотографий"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Экспортировать фотографии"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Поворот"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Отменить поворот"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Перевернуть горизонтально"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Отменить горизонтальный переворот"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Перевернуть вертикально"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Отменить вертикальный переворот"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Любой текст"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Метка"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Комментарий"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Название события"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Имя файла"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Тип носителя"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Состояние обозначения"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Рейтинг"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Дата"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "содержит"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "точно"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "начинается с"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "оканчивается на"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "не содержит"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "не задано"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "не"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "любое фото"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "цифровой негатив"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "видео"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "модификации"
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "внутренние модификации"
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "внешние модификации"
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "отмеченные"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "не отмеченные"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "и выше"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "только"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "и ниже"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "после"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "перед"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "между"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "и"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "любой"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "все"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ни один"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Сохранённые поисковые запросы"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Новый Сохранить Поиск..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Ваша библиотека фотографий не совместима с этой версией Shotwell. Судя по "
+"всему, она создана версией Shotwell %s (сборка %d). Текущая версия программы "
+"%s (сборка %d). Установите последнюю версию Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell не удалось обновить вашу библиотеку фото с версии %s (сборка %d) на "
+"%s (сборка %d). Для получения дополнительной информации, ознакомьтесь с wiki "
+"Shotwell, находящуюся по адресу %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Ваша библиотека фотографий не совместима с этой версией Shotwell. Судя по "
+"всему, она создана версией %s (сборка %d). Текущая версия %s (сборка %d). "
+"Очистите библиотеку, удалив %s и повторно импортируйте свои фото."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Неизвестная ошибка при попытке проверки базы данных Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Загрузка Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Путь до конфиденциальной информации Shotwell"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "КАТАЛОГ"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Не отслеживать изменения в каталоге библиотеки во время работы"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Не показывать анимированный индикатор прогресса при старте программы"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Показывать версию приложения"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Выполните '%s --help' для просмотра полного списка параметров командной "
+"строки.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Сегодня"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Название:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Элементы:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d событие"
+msgstr[1] "%d события"
+msgstr[2] "%d событий"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d фотография"
+msgstr[1] "%d фотографии"
+msgstr[2] "%d фотографий"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d видео"
+msgstr[1] "%d видео"
+msgstr[2] "%d видео"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Дата:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Время:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "От:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "До:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Размер:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Продолжительность:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f секунд"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Обработчик:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Выдержка:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Местоположение:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Размер файла:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Текущая разработка:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Размеры оригинала:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Модель камеры:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Модель камеры:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Вспышка:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Фокусное расстояние:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Данные экспонирования:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Время экспонирования:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Компенсация экспозиции:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Широта GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Долгота GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Фотограф:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Права:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Программа:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Расширенная информация"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Это действие удалит метку «%s» с %d фотографии. Продолжить?"
+msgstr[1] "Это действие удалит метку «%s» с %d фотографий. Продолжить?"
+msgstr[2] "Это действие удалит метку «%s» с %d фотографий. Продолжить?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "От_менить"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Удалить"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Это удалит сохранённый поиск «%s». Продолжить?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Переключение между обработчиками отменит все изменения, внесенные в эту "
+"фотографию с помощью Shotwell"
+msgstr[1] ""
+"Переключение между обработчиками отменит все изменения, внесенные в эту "
+"фотографию с помощью Shotwell"
+msgstr[2] ""
+"Переключение между обработчиками отменит все изменения, внесенные в эту "
+"фотографию с помощью Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Переключить обработчик"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Экспортировать видео"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell не удалось создать файл для редактирования фотографии, потому что у "
+"вас нет разрешения на запись в %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Невозможно экспортировать следующее фото из-за ошибки файла.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Хотите продолжить экспортирование?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Продолжить"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Неизменённый"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Текущий"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Качество:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Ограничение масштабирования:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _пикселей"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Экспортировать метаданные"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Сохранить подробности..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Сохранить подробности"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(и ещё %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Импортировать отчёт о результатах"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Попытка импорта %d файла."
+msgstr[1] "Попытка импорта %d файлов."
+msgstr[2] "Попытка импорта %d файлов."
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Из них, был успешно импортирован %d файл."
+msgstr[1] "Из них, было успешно импортировано %d файла."
+msgstr[2] "Из них, было успешно импортировано %d файлов."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Дублировать не импортированные фото/видео:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "делает копию существующего экземпляра медиа"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "В результате ошибок камеры не были импортированы следующие фото/видео:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "сообщение об ошибке:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Не были импортированы следующие фото/видео, нераспознанные как фото или "
+"видео:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Не были импортированы следующие фото/видео, поскольку их формат не был "
+"распознан программой Shotwell:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"В результате сбоя копирования в библиотеку Shotwell не были импортированы "
+"следующие фото/видео:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"не удалось скопировать %s\n"
+"\tв %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Не импортированные фото/видео в результате испорченных файлов:"
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Фото/видео, которые не были импортированы по другим причинам:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d дубликат фото не был импортирован.\n"
+msgstr[1] "%d дубликата фото не были импортированы.\n"
+msgstr[2] "%d дубликатов фото не были импортированы.\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d дубликат видео не был импортирован.\n"
+msgstr[1] "%d дубликата видео не были импортированы.\n"
+msgstr[2] "%d дубликатов видео не были импортированы.\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d дубликат фото/видео не был импортировано:\n"
+msgstr[1] "%d дубликата фото/видео не было импортировано:\n"
+msgstr[2] "%d дубликатов фото/видео не было импортировано:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d фотографию не удалось импортировать из-за ошибки файла или аппаратной "
+"ошибки:\n"
+msgstr[1] ""
+"%d фотографии не удалось импортировать из-за ошибки файла или аппаратной "
+"ошибки:\n"
+msgstr[2] ""
+"%d фотографий не удалось импортировать из-за ошибки файла или аппаратной "
+"ошибки:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d видео не удалось импортировать из-за ошибки файла или аппаратной ошибки:\n"
+msgstr[1] ""
+"%d видео не удалось импортировать из-за ошибки файла или аппаратной ошибки:\n"
+msgstr[2] ""
+"%d видео не удалось импортировать из-за ошибки файла или аппаратной ошибки:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Ошибка импорта %d фотографии/видео из-за файловой ошибки или аппаратной "
+"проблемы:\n"
+msgstr[1] ""
+"Ошибка импорта %d фотографий/видео из-за файловой ошибки или аппаратной "
+"проблемы:\n"
+msgstr[2] ""
+"Ошибка импорта %d фотографий/видео из-за файловой ошибки или аппаратной "
+"проблемы:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d файл не удалось импортировать из-за ошибки файла или аппаратной ошибки:\n"
+msgstr[1] ""
+"%d файла не удалось импортировать из-за ошибки файла или аппаратной ошибки:\n"
+msgstr[2] ""
+"%d файлов не удалось импортировать из-за ошибки файла или аппаратной "
+"ошибки:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не удалось импортировать %d фотографию, поскольку каталог библиотеки был "
+"недоступен для записи:\n"
+msgstr[1] ""
+"Не удалось импортировать %d фотографии, поскольку каталог библиотеки был "
+"недоступен для записи:\n"
+msgstr[2] ""
+"Не удалось импортировать %d фотографий, поскольку каталог библиотеки был "
+"недоступен для записи:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[1] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[2] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не удалось импортировать %d фото/видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[1] ""
+"Не удалось импортировать %d фото/видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[2] ""
+"Не удалось импортировать %d фото/видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[1] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+msgstr[2] ""
+"Не удалось импортировать %d видео, поскольку каталог библиотеки был не "
+"доступен для записи:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Не удалось импортировать %d фотографию из-за ошибки камеры:\n"
+msgstr[1] "Не удалось импортировать %d фотографии из-за ошибки камеры:\n"
+msgstr[2] "Не удалось импортировать %d фотографий из-за ошибки камеры:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Не удалось импортировать %d видео из-за ошибки камеры:\n"
+msgstr[1] "Не удалось импортировать %d видео из-за ошибки камеры:\n"
+msgstr[2] "Не удалось импортировать %d видео из-за ошибки камеры:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "Не удалось импортировать %d фото/видео из-за ошибки камеры:\n"
+msgstr[1] "Не удалось импортировать %d фото/видео из-за ошибки камеры:\n"
+msgstr[2] "Не удалось импортировать %d фото/видео из-за ошибки камеры:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Не удалось импортировать %d файл из-за ошибки камеры:\n"
+msgstr[1] "Не удалось импортировать %d файла из-за ошибки камеры:\n"
+msgstr[2] "Не удалось импортировать %d файлов из-за ошибки камеры:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Пропущена %d неподдерживаемая фотография:\n"
+msgstr[1] "Пропущено %d неподдерживаемые фотографии:\n"
+msgstr[2] "Пропущено %d неподдерживаемых фотографий:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Пропущен %d файл, не являющийся изображением.\n"
+msgstr[1] "Пропущено %d файла, не являющихся изображениями.\n"
+msgstr[2] "Пропущено %d файлов, не являющихся изображениями.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d фотография пропущена пользователем:\n"
+msgstr[1] "%d фотографии пропущены пользователем:\n"
+msgstr[2] "%d фотографий пропущены пользователем:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d видео пропущено пользователем:\n"
+msgstr[1] "%d видео пропущено пользователем:\n"
+msgstr[2] "%d видео пропущено пользователем:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d фото/видео пропущены пользователем:\n"
+msgstr[1] "%d фото/видео пропущены пользователем:\n"
+msgstr[2] "%d фото/видео пропущены пользователем:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d файл пропущен пользователем:\n"
+msgstr[1] "%d файла пропущено пользователем:\n"
+msgstr[2] "%d файлов пропущено пользователем:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Успешно импортировано %d фото.\n"
+msgstr[1] "Успешно импортировано %d фото.\n"
+msgstr[2] "Успешно импортировано %d фото.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Успешно импортировано %d видео.\n"
+msgstr[1] "Успешно импортировано %d видео.\n"
+msgstr[2] "Успешно импортировано %d видео.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d фото/видео успешно импортировано.\n"
+msgstr[1] "%d фото/видео успешно импортировано.\n"
+msgstr[2] "%d фото/видео успешно импортировано.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Не был импортирован ни один фото/видеофайл.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Импортирование завершено"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунда"
+msgstr[1] "%d секунды"
+msgstr[2] "%d секунды"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минута"
+msgstr[1] "%d минуты"
+msgstr[2] "%d минуты"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d час"
+msgstr[1] "%d часа"
+msgstr[2] "%d часов"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 день"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Переименовать событие"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Имя:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Редактировать название"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Изменить комментарий к событию"
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Изменить комментарий к фото/видео"
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Удалить файлы в корзину"
+msgstr[1] "_Удалить файлы в корзину"
+msgstr[2] "_Удалить файлы в корзину"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Только _удалить"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Вернуть внешнее изменение?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Вернуть внешние изменения?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Это действие уничтожит все изменения, сделанные в %d внешнем файле. "
+"Продолжить?"
+msgstr[1] ""
+"Это действие уничтожит все изменения, сделанные в %d внешних файлах. "
+"Продолжить?"
+msgstr[2] ""
+"Это действие уничтожит все изменения, сделанные в %d внешних файлах. "
+"Продолжить?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "От_менить внешние изменения"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Вернуть _внешние изменения?"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Это действие удалит %d фотографию из библиотеки. Продолжить?"
+msgstr[1] "Это действие удалит %d фотографии из библиотеки. Продолжить?"
+msgstr[2] "Это действие удалит %d фотографий из библиотеки. Продолжить?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Удалить"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Удалить фотографии из библиотеки"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Удалить фотографии из библиотеки"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 часа"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "С_двинуть фотографии или видео на одинаковый промежуток времени"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Установить _текущее время для всех фото/видео"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Изменить оригинал фото"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Изменить оригиналы фото"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Изменить оригиналы"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Изменить оригиналы"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Оригинал: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d %m %Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Выдержка будет смещаться вперёд на\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Выдержка будет смещаться назад на\n"
+"%d %s, %d %s, %d %s, и %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дня"
+msgstr[2] "дней"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+msgstr[2] "часов"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минуты"
+msgstr[2] "минут"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунда"
+msgstr[1] "секунды"
+msgstr[2] "секунд"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"И %d другую."
+msgstr[1] ""
+"\n"
+"\n"
+"И %d другие."
+msgstr[2] ""
+"\n"
+"\n"
+"И %d других."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Метки (разделитель запятая):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Добро пожаловать!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Добро пожаловать в Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Для начала работы, импортируйте фото одним из следующих способов:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Выберите <span weight=\"bold\">Файл %s Импортировать из папки</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Перетащите фото в окно Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Присоедините камеру к компьютеру и импортируйте фотографии"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Импортирование фотографий из папки %s "
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Кроме того, вы можете импортировать фото одним из cледующих способов:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Больше не показывать это сообщение"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Импортировать фотографии из библиотеки %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Помощь)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Год%sМесяц%sДень"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Год%sМесяц"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Год%sМесяц-День"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Год-Месяц-День"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Пользовательский"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Неправильный шаблон"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell может скопировать фотографии в папку библиотеки, либо импортировать "
+"их без копирования."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ко_пировать фотографии"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Импорт в"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Импортировать в библиотеку"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Удалить из библиотеки"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Удалить фотографии из библиотеки"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Удаление фотографий из библиотеки"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Это действие удалит %d фотографию/видео из библиотеки Shotwell. Хотите также "
+"поместить эти файлы в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[1] ""
+"Это действие удалит %d фотографии/видео из библиотеки Shotwell. Хотите также "
+"поместить эти файлы в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[2] ""
+"Это действие удалит %d фотографий/видео из библиотеки Shotwell. Хотите также "
+"поместить эти файлы в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Это действие удалит %d видео из библиотеки Shotwell. Хотите также поместить "
+"эти видео в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[1] ""
+"Это действие удалит %d видео из библиотеки Shotwell. Хотите также поместить "
+"эти видео в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[2] ""
+"Это действие удалит %d видео из библиотеки Shotwell. Хотите также поместить "
+"эти видео в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Это действие удалит %d фотографию из библиотеки Shotwell. Хотите также "
+"поместить эти фотографии в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[1] ""
+"Это действие удалит %d фотографии из библиотеки Shotwell. Хотите также "
+"поместить эти фотографии в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+msgstr[2] ""
+"Это действие удалит %d фотографий из библиотеки Shotwell. Хотите также "
+"поместить эти фотографии в корзину?\n"
+"\n"
+"Это действие не может быть отменено."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d фотография/видеозапись не могут быть помещены в корзину. Удалить эти "
+"файлы?"
+msgstr[1] ""
+"%d фотографии/видеозаписи не могут быть помещены в корзину. Удалить эти "
+"файлы?"
+msgstr[2] ""
+"%d фотографий/видеозаписей не могут быть помещены в корзину. Удалить эти "
+"файлы?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d фотография/видео не могут быть удалены."
+msgstr[1] "%d фотографии/видео не могут быть удалены."
+msgstr[2] "%d фотографий/видео не могут быть удалены."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Папки"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Метки"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Успешно"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Ошибка файла"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Не могу декодировать файл"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Ошибка базы данных"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Импортирование прервано пользователем"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Не является файлом"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Файл уже существует в базе данных"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Неподдерживаемый формат"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Не является изображением"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Ошибка диска"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Диск переполнен"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Ошибка камеры"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Ошибка записи файла"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Повреждённый файл снимка"
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Ошибка импортирования (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "изменено"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Предыдущее фото"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Следующее фото"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Исходный файл не найден: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Вид"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Инструменты"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Предыдущее фото"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Предыдущее фото"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Следующее фото"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Следующее фото"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Увеличить"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Увеличить масштаб фотографии"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "У_меньшить"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Уменьшить масштаб фотографии"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "На всю _страницу"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Изменение размера фото по размеру экрана"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_Реальный размер"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Установить реальный размер фотоснимка"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Увеличить на _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Увеличить фото в два раза"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Обработчик"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Невозможно экспортировать %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "База данных %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Импортирование из %s не может быть продолжено из-за ошибки:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Чтобы попробовать импорт из другой службы, выберите её из меню сверху."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Импорт данных"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Не активированы модули импорта.\n"
+"\n"
+"Для того, чтобы использовать функцию импортирования из приложения, требуется "
+"активировать по крайней мере один модуль импорта. Модули могут быть "
+"активированы в диалоговом окне «Настройки»."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Файл базы данных:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Импортирование"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Импортировать из приложения"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Импортировать данные _из:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Закрыть"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Настройки"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Слайдшоу"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Назад"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Перейти к предыдущему фото"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Пауза"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Приостановить слайдшоу"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Следующее"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Перейти к следующему фото"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Изменить настройки слайдшоу"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Не найдено ни одного исходного файла"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Просмотр"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Продолжить слайдшоу"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Возврат"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Отменить возврат"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Улучшение"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Отменить улучшение"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Применяются цветовые изменения"
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Отменяются цветовые изменения"
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Создать новое событие"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Отменить событие"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Переместить снимки в новое событие"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Назначить снимкам предыдущее событие"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Объединение"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Отменить объединение"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Дублирование фотографий"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Отменить дублирование фотографий"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Невозможно сделать копии %d фотографии из-за ошибки файла."
+msgstr[1] "Невозможно сделать копии %d фотографий из-за ошибки файла."
+msgstr[2] "Невозможно сделать копии %d фотографий из-за ошибки файла."
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Восстановить предыдущую оценку"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "По возрастанию оценок"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "По убыванию оценок"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Установка обработчика RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Восстановление предыдущего обработчика RAW"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Задать обработчик"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Оригинал не может быть изменён."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Изменить время и дату"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Отменить изменение даты и времени"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Следующие оригиналы фотографий не могут быть изменены."
+msgstr[1] "Следующие оригиналы фотографий не могут быть изменены."
+msgstr[2] "Следующие оригиналы фотографий не могут быть изменены."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Ошибка изменения времени"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Для этих фотографий операция изменения времени не может быть отменена."
+msgstr[1] ""
+"Для этих фотографий операция изменения времени не может быть отменена."
+msgstr[2] ""
+"Для этих фотографий операция изменения времени не может быть отменена."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Создать метку"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Переместить метку «%s»"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Переместить фотографии в корзину"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Восстановить фотографии из корзины"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Переместить фотографии в корзину Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Восстановить фотографии в библиотеку Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Переместить фотографии в корзину"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Восстановить фотографии из корзины"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Отметить выбранные фотографии"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Снять отметку с выбранных фотографий"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Отметить"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Снять отметку"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Низкое (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Среднее (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Высокое (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Максимум (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Нет фото/видео"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Не найдены фото/видео"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Фотографии не могут быть экспортированы в этот каталог."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Не удалось обработать рузультаты наблюдения: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Заполнить страницу целиком"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 изображения на странице"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 изображения на странице"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 изображений на странице"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 изображений на странице"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 изображений на странице"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 изображений на странице"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "дюймы"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "см"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Бумажник (2 х 3 дюйма)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Notecard (3 х 5 дюймов)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 дюймов."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 дюймов."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 дюймов."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 дюймов."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 дюймов."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metric Wallet (9 х 13 см)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Почтовая карточка (10 x 15 см)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 см"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 см"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 см"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 см"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 см"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Настройки изображения"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Печать..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Невозможно напечатать фото:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Невозможно открыть/создать базу данных фото %s: код ошибки %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Не удаётся записать в файл базы данных фото:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Ошибка при доступе к файлу базы данных:\n"
+" %s\n"
+"ошибка: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Экспортирование видео"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Невозможно отправить через Nautilus: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Отправить"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Невозможно экспортировать фон в %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Не удалось подготовить слайдшоу для рабочего стола: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Отмеченные"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Корзина"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Корзина пуста"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "_Удалить"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Удаление фотографий"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Отсутствующие файлы"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Удаление…"
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Последнее импортирование"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Импортировать из папки…"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Импортировать фотографии в библиотеку с диска "
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Импортировать из _приложения…"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Сортировать _события"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Очистить _корзину"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Удалить все снимки в корзину"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Показать _событие для фото"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Поиск"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Поиск фото и видео"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Файл"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Правка"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Фото"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Фотографии"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Со_бытия"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Метки"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Справка"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Основная информация"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Показать основную информацию о выделенных"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Расширенная информация"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Показать расширенную информацию о выделенных"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "П_анель поиска"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Показывать панель поиска"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Б_ковая панель"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Показывать боковую панель"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "По _возрастанию"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Сортировать фото по возрастанию"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "По _убыванию"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Сортировать фото по убыванию"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Импортировать из папки"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Очистить корзину"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Очистка корзины…"
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell настроен на импортирование фотографий в ваш домашний каталог.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Расположение библиотеки:"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Фотографии не могут быть импортированы из этого каталога."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Обновление библиотеки…"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Подготовка к авто-импортированию…"
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Автоматическое импортирование фотографий…"
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Запись метаданных в файлы…"
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Библиотека"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Импортирование…"
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Остановить импортирование"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Остановить импортирование снимков"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Подготовка к импортированию…"
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Импортировано %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Сохранить"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Сохранить снимок"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Сохранить _как…"
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Сохранить снимок с другим именем"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Распечатать фото на принтере"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s не существует."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s не является файлом."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s не поддерживает формат файла\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Сохранить _копию"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Отменить изменения %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Закрыть _без сохранения"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Ошибка при сохранении в %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Не возможно следить за %s: не является каталогом (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Менеджер фотографий"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Просмотрщик фотоснимков"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "©Yorba Foundation, 2009-2013"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Повернуть в_право"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Повернуть"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Повернуть вправо"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Поворот фотографии вправо (нажмите Ctrl, чтобы повернуть влево)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Повернуть в_лево"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Повернуть влево"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Поворот фото влево"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Перевернуть _горизонтально"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Перевернуть горизонтально"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Перевернуть _вертикально"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Перевернуть вертикально"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Улучшить"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Улучшить"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Автоматически улучшить внешний вид фото"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Обрезать"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Обрезать"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Обрезать фотографию"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Выпрямить"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Выпрямить"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Выпрямить фотографию"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Удаление «красных глаз»"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Удаление «красных глаз»"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Уменьшает или полностью устраняет эффект «красных глаз»"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Коррекция"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Коррекция"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Настроить цвет и оттенок фото"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Вернуться к _оригиналу"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Вернуться к оригиналу"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Вернуться к _оригиналу"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Вернуться к исходной фотографии"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Сделать _фоном рабочего стола"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Сделать выбранное изображение фоном рабочего стола"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Сделать набором слайдов _рабочего стола"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Отменить"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Отменить"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Вернуть: "
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Вернуть: "
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Переименовать событие…"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Сделать _ключевым фото для события"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Сделать ключевым фото для события"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Новое событие"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Новое событие"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Переместить фото"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Переместить фото в событие"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Объединение событий"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Объединить"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Собрать события в одно"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Оценить"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Поставить оценку фотографии"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Изменить оценку фотоснимка"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "По_высить"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Повысить оценку"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "По_низить"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Понизить оценку"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Без оценки"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Без оценки"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Поставить оценку неоценённым"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Снять оценку"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Удалить все оценки"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Отклонённые"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Отклонённые"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Оценить отклонённые"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Пометить как отклонённое"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Поставить оценки отклонённым"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Только _отклонённые"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Только отклонённые"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Показать только отклонённые фото"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Все + _Отклонённые"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Показать все фото, включая отклонённые"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Все фотографии"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Показать все фото"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Оценки"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Показывать оценку каждой фотографии"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Фильтровать фото"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Фильтровать фотографии"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ограничить с помощью фильтра число показываемых фотографий"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Дублировать"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Дублировать"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Сделать дубликат снимка"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Экспортировать…"
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Печать…"
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "О_публиковать…"
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Опубликовать"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Опубликовать на различных сайтах"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Редактировать _название…"
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Изменить _комментарий..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Изменить комментарий"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Изменить дату и время…"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Изменить дату и время"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Добавить _метки…"
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Добавить метки…"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Добавить метки"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Параметры"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Открыть с помощью внешнего _редактора"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Открыть с помощью редактора _RAW"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Отправить…"
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_Отправить…"
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Поиск..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Поиск"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Найти изображения по указанной строке из названий или меток изображений"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Отметить"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Снять отметку"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Невозможно запустить редактор: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Добавить метку «%s»"
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Добавить метки «%s» и «%s»"
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Снять метку «%s»"
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Снять метку «%s»"
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Удалить метку"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Создать"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "П_ереименовать метку «%s»…"
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Переименовать метку «%s» на «%s»"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Переименовать"
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Изменить метки…"
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Изменить метки"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Добавить метку «%s» к фотографиям"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Добавить метку «%s» к фотографиям"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Добавить метку «%s» к выбранной фотографии"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Добавить метку «%s» к выбранным фотографиям"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Снять метку «%s» с _фотографии"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Снять метку «%s» с _фотографий"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Снять метку «%s» с фотографии"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Снять метку «%s» с фотографий"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Невозможно переименовать метку в «%s», такая метка уже существует."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Невозможно переименовать поиск в «%s», такой поисковый запрос уже существует."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Сохраненный поиск"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Удалить поиск"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Изменить"
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Переименовать"
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Переименовать поисковый запрос «%s» в «%s»"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Удалить поиск «%s»"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Оценить %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Оценить на %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Оценить на %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Показать %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Показывать только фото с оценкой %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s или лучше"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Показывать с оценкой %s или лучшей"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Показывать только фото с оценкой %s или лучшей"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Удалить выбранные фотографии из корзины"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Удалить выбранные фотографии из библиотеки"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Восстановить"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Вернуть выбранные фотографии в библиотеку"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Открыть в файловом _менеджере"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr ""
+"Открыть каталог, в котором находится выбранная фотография, в файловом "
+"менеджере"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Невозможно открыть в файловом менеджере: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Удалить из библиотеки"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Переместить в корзину"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Выбрать _всё"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Выбрать всё"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Угол:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Сброс"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Вернуться к текущим размерам фото"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Установить рамку обрезки для фото"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Вращать прямоугольник обрезки при изменении ориентации."
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Незакреплённый"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Квадрат"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Экран"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Фактический размер"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "Видео SD (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "Видео HD (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 дюймов)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 дюймов)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 мм)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 мм)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Закрыть «Удаление «красных глаз»"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Удаление эффекта «красных глаз» на выбранной области"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Насыщенность:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Оттенок:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Цветовая температура:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Тени:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Сбросить цвета"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Возврат к оригиналу"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Цветовая температура"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Оттенок"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Насыщенность"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Выдержка"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Тени"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Расширение контрастности"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Прикрепить панель инструментов"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Прикрепить панель инструментов"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Выйти из полноэкранного режима"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Выйти из _полноэкранного режима"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "В_ыход"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_О программе"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_На весь экран"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Содержание"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Часто задаваемые вопросы"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Сообщить о проблеме…"
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"При доступе к библиотеке Shotwell произошла критическая ошибка. Дальнейшая "
+"работа программы невозможна.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Посетить сайт Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Oleg Koptev <koptev.oleg AT gmail.com>\n"
+"Yulia Poyarko <ypoyarko AT redhat.com>\n"
+"Misha Shnurapet <shnurapet AT fedoraproject.org>\n"
+"Марк Коренберг <socketpair AT gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Не удалось отобразить справку: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Не удается перейти к ошибке базы данных: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Не удалось отобразить ЧаВо: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "безымянный"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Фактический размер"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ширина или высота"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ширина"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Высота"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Задать размер миниатюр"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Увеличить размер миниатюр"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Уменьшить размер миниатюр"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Сортировать фотографии"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Воспроизвести видео"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Открыть выбранное видео в системном видеопроигрывателе"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Комментарии"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Показывать комментарий для каждого фото"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Показывать все метки фотографии"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "По _названию"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Сортировать по названию"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "По дате _съёмки"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Сортировать по дате съёмки"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "По _рейтингу"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Сортировать по рейтингу"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell не может воспроизвести выбранное видео:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d фото/видео"
+msgstr[1] "%d фото/видео"
+msgstr[2] "%d фото/видео"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Показывать комментарий по каждому событию"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Нет событий"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "События не найдены"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "События"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Недатированный"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Вне событий"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Невозможно создать каталог кэша %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Невозможно создать каталог %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Изображения"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Невозможно создать временный каталог %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Невозможно создать подкаталог %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ничего)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ничего"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Случайно"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Эффекты перехода"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Не удается создать временный файл для %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Экспортирование"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Файл %s уже существует. Заменить?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Пропустить"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Заменить"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Заменить вс_ё"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Экспортирование"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Фотографии"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Видео"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Изображения RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Изображения RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Не удалось загрузить файл интерфейса %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Тип"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Публикация"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Выбранные фото/видео были успешно опубликованы."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Выбранные видеоклипы были успешно опубликованы."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Выбранные фотографии были успешно опубликованы."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Выбранные видеофайлы были успешно опубликованы."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Выбранные изображения были успешно опубликованы."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Получение информации об учётной записи…"
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Вход…"
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Публикация фотографий"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Опубликовать фотографии _на:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Публикация видео"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Опубликовать видео _на"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Публикация фотографий и видео"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Опубликовать видео и фотографии _на"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Невозможно опубликовать"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell не может опубликовать выделенные элементы поскольку у Вас нет "
+"активированных подходящих модулей публикации. Для того чтобы это исправить, "
+"выберите <b>Правка %s Параметры</b> и активируйте один или несколько модулей "
+"публикации на вкладке <b>Модули</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Подготовка к загрузке"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Загрузка файла %d из %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Не удалось опубликовать на %s из-за ошибки:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Для публикации на другом сервисе, выберите его ниже."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Новая _метка…"
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Временный файл, необходимый для публикации недоступен"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Вы не вошли на YouTube.\n"
+"\n"
+"Чтобы продолжить, вам необходима учётная запись Google, имеющая привязку к "
+"YouTube. Можно связать учётные записи после первого входа на сайт YouTube в "
+"браузере."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Файл, необходимый для публикации недоступен. Публикация на Youtube "
+"невозможна."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Вы зашли на YouTube как %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Видео появятся в «%s»"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Общедоступное"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Не общедоступное"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Личное"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Основные сервисы публикации"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Вы не авторизовались на Flickr.\n"
+"\n"
+"Нажмите кнопку «Войти» для входа на Flickr с помощью веб-браузера. Вам будет "
+"нужно разрешить подключение Shotwell для связи с вашей учетной записи Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Вы уже выходили из Flickr во время этой сессии Shotwell.\n"
+"Для продолжения публикации на Flickr, перезапустите Shotwell и попробуйте "
+"снова."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Подготовка к входу…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Файл, необходимый для публикации недоступен. Публикация в Flickr невозможна."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Проверка прав доступа…"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Вы зашли на Flickr как %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Бесплатная учётная запись Flickr имеет ограничение по количеству загрузок\n"
+"в месяц. На этот месяц у вас имеется квота в %d мегабайт."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"Ваша подписка Flickr Pro позволяет вам делать неограниченное количество "
+"загрузок."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Снимки _видимы для:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Видео _видимы для:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Фото и видео _видимы для:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Всем"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Только друзьям и семье"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Только семье"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Только друзьям"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Только мне"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 пикселей"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 пикселей"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 пикселей"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 пикселей"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Создаётся альбом %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Ошибка публикации в Piwigo. Попробуйте ещё раз."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Введите URL-адрес вашей фотобиблиотеки Piwigo, а также имя пользователя и "
+"пароль, связанные с вашей учётной записью на Piwigo."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell не удается связаться с Piwigo. Проверьте правильность введенного "
+"URL-адреса."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Имя пользователя и/или пароль неверны. Пожалуйства, попытайтесь снова"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Недопустимый URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Недопустимое имя пользователя или пароль"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Менеджер подключений Shotwell"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Администраторы, семья, друзья, контакты"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Администраторы, семья, друзья"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Администраторы, семья"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Администраторы"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Вы не авторизовались в Picasa Web Albums.\n"
+"\n"
+"Нажмите кнопку «Войти» для входа в Picasa с помощью веб-браузера. Вам будет "
+"нужно разрешить подключение Shotwell для связи с вашей учетной записи Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Файл, необходимый для публикации недоступен. Публикация в Picasa невозможна."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Создание альбома..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Вы вошли в альбомы Picasa как %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Видео появятся в:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Фото будут расположены в:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Маленький (640х480 пикселей)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Средний (1024х768 пикселей)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Рекомендуемый (1600х1200 пикселей)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 пикселей)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Вы не авторизовались в Facebook.\n"
+"\n"
+"Если у вас ещё нет учётной записи Facebook, вы сможете создать её в процессе "
+"авторизации. Во время авторизации менеджер подключений может запросить "
+"разрешение на выгрузку фото и публикацию их в вашей галерее. Это необходимо "
+"для работы менеджера."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Вы уже входили в Facebook в течение этой сессии.\n"
+"Для продолжения публикации на Facebook, перезапустите Shotwell и повторите "
+"попытку."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Стандарт (720 пикселов)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Большой (2048 пикселов)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Проверка подключения к Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Файл, необходимый для публикации недоступен. Публикация в Facebook "
+"невозможна."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Вы зашли на Facebook как %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Где бы вы хотели опубликовать выбранные фотографии?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Размеры выгруженного:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Друзья"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Распад"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Шахматы"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Круги"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Жалюзи"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Полоски"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Часы"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Круг"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Основные эффекты переходов"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "© Максим Карташев (Maxim Kartashev), 2010; ©Yorba Foundation,2011-2013"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Слайд"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Угасание"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Квадраты"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Ядро Данные Импорт Службы"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Добро пожаловать в сервис импорта библиотек F-Spot\n"
+"\n"
+"Пожалуйста, выберите библиотеку для импорта, либо выбором одной из "
+"библиотек, обнаруженной Shotwell, либо выбором альтернативного F-Spot файла "
+"базы данных."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Добро Пожаловать в сервис по импорту файлов из библиотеки F-Spot.\n"
+"\n"
+"Пожалуйста, выберите файл из базы данных F-Spot."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Вручную выберите файл из базы данных F-Spot для импорта"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Не удалось открыть выбранный файл из базы данных F-Spot: файл не существует, "
+"или не располагается в базе данных F-Spot"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Не получается открыть выбранный файл из базы данных F-Spot: данная версия "
+"базы данных F-Spot не поддерживается Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Не удалось прочитать выбранный файл из базы данных F-Spot: ошибка во время "
+"чтения тегов"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Не удалось прочитать файл из базы данных F-Spot: ошибка во время чтения "
+"изображений"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell нашёл %d изображения в библиотеке F-Spot и в данный момент "
+"импортирует их. Дубликаты будут автоматически распознаны и удалены.\n"
+"\n"
+"Вы можете закрыть это окно и начать использовать Shotwell, в то время как "
+"импорт будет продолжаться на заднем плане."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Библиотека F-Spot: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Подготовка к импортированию"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Сделать слайдшоу для рабочего стола"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Создать слайдшоу для рабочего стола"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Показывать каждое фото в течение"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "период времени"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Как долго будет отображаться каждая фотография на фоне рабочего стола"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Поиск"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Название поиска:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Совпадение"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "из следующих:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Размер изображения на печати</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Использовать _стандартный размер:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Использовать свой _размер:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Соответствие соотношению сторон фото"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Автоматический размер:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Заголовки</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Печатать _названия изображений"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Разрешающая способность</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Сохранить фото в:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "пикселей на дюйм"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"ярлык"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Параметры Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "белый"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "чёрный"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Следить за появлением новых файлов в папке библиотеки"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Метаданные"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Записывать метки, заголовки и другие _метаданные в файлы фотографий"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Экран"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Импортировать фото в:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Фон:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Импорт"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Структура каталога:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Шаблон:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Пример:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "П_еревести названия импортированных файлов в нижний регистр"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Обработка RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "По умолчанию:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Внешний _фоторедактор:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "_Внешний редактор RAW:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Внешние редакторы"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Модули"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Задержка:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Эффект перехода:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Задержка _перехода:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Показать _заголовок"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "секунд"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Войти"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Опубликовать в _альбоме:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Создать _новый альбом:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Видео и новые фотоальбомы _видимы для:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"_Удалите местоположение, информацию о камере и другую идентифицирующую "
+"информацию перед публикацией"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Выйти"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Опубликовать"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Введите номер подтверждения, который появится после того, как вы зайдёте в "
+"Flickr в веб-браузере."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Номер подтверждения:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Размер снимка:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Существующем альбоме:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Новый _альбом:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Список альбомов в общедоступной галерее"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Предустановки размера снимка:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL вашей коллекции фото на Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "_Имя пользователя"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Пароль"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Напомнить пароль"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Войти"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Существующая категория:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Фото будут _видимы для:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Размер фотографии:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr "Комментарий к альбому:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr "_Не публиковать теги"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Выйти"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "_Установки конфиденциальности видео:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Авторские права 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 пикселей"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"«%s» не является корректным ответом на запрос проверки подлинности OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): запуск невозможен; этот публикатор не имеет "
+"возможности перезапуска."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Введите имя пользователя и пароль, связанный с вашей учётной записью Tumblr."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Не могу загрузить интерфейс: %s "
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr "Вы вошли в Tumblr как %s.\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Авторские права 2010+ Евгений Поляков <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Посетить сайт "
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Вы не вошли в Яндекс.Фотки."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "Адрес _электронной почты:"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Блоги:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Альбомы (или создать новый):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Способ _доступа:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Отключить _комментарии"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Запретить загрузку оригинала"
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..1033606
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,4714 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Dušan Kazik <prescott66@gmail.com>, 2012
+# Laco Gubík <lacogubik@googlemail.com>, 2010
+# mt <toman.mir@gmail.com>, 2013
+# Ondrej Mosnáček <omosnacek@gmail.com>, 2011
+# pavolzetor9c9a9991f1dc44b8 <pavolzetor@gmail.com>, 2012
+# Tomáš Vadina <tomasvadina+transifex@myopera.com>, 2011
+# verayin <vera@yorba.org>, 2011
+# Peter Mráz <etkinator@gmail.com>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
+"Language-Team: Slovak (http://www.transifex.com/projects/p/shotwell/language/"
+"sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Udalosť %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fotoaparáty"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Fotoaparát"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Nepodarilo sa odpojiť fotoaparát. Skúste odpojiť fotoaparát pomocou správcu "
+"súborov."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skryť fotografie, ktoré sú už importované"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Zobraziť iba fotografie, ktoré neboli importované"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Začína sa import, prosím, čakajte..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Názvy"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Zobraziť názov každej fotografie"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importovať vy_brané"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importovať vybrané fotografie do vašej knižnice"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importovať _všetky"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importovať všetky fotografie do vašej knižnice"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell potrebuje odpojiť váš fotoaparát od súborového systému, aby k nemu "
+"mohol pristupovať. Chcete pokračovať?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Odpojiť"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Prosím, odpojte fotoaparát."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Fotoaparát je uzamknutý inou aplikáciou. Shotwell môže pristupovať k "
+"fotoaparátu iba ak nie je uzamknutý. Zatvorte, prosím, ostatné aplikácie, "
+"ktoré používajú fotoaparát, a skúste to znova."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Zatvorte, prosím, ostatné aplikácie, ktoré používajú fotoaparát."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Nepodarilo sa získať náhľady z fotoaparátu:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Odpája sa..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Získavajú sa informácie o fotografiách"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Získava sa náhľad pre %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Nepodarilo sa uzamknúť fotoaparát: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Odstrániť týchto %d fotografií z fotoaparátu?"
+msgstr[1] "Odstrániť túto fotografiu z fotoaparátu?"
+msgstr[2] "Odstrániť tieto %d fotografie z fotoaparátu?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Odstrániť týchto %d videí z fotoaparátu?"
+msgstr[1] "Odstrániť toto %d video z fotoaparátu?"
+msgstr[2] "Odstrániť tieto %d videá z fotoaparátu?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Odstrániť týchto %d fotografií/videí z fotoaparátu?"
+msgstr[1] "Odstrániť túto %d fotografiu/video z fotoaparátu?"
+msgstr[2] "Odstrániť ieto %d fotografie/videá z fotoaparátu?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Odstrániť týchto %d súborov z fotoaparátu?"
+msgstr[1] "Odstrániť tento %d súbor z fotoaparátu?"
+msgstr[2] "Odstrániť tieto %d súbory z fotoaparátu?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Ponechať"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Odstraňujú sa fotografie/videá z fotoaparátu"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Nepodarilo sa odstrániť %d fotografií/videí z fotoaparátu kvôli chybám."
+msgstr[1] ""
+"Nepodarilo sa odstrániť %d fotografiu/video z fotoaparátu kvôli chybám."
+msgstr[2] ""
+"Nepodarilo sa odstrániť %d fotografie/videá z fotoaparátu kvôli chybám."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "P_rezentácia"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Spustiť prezentáciu"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportovať fotografiu/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportovať fotografie/videá"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exportovať fotografiu"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportovať fotografie"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Otáča sa"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Vracia sa spať otáčanie"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Prevracia sa horizontálne"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Vracia sa prevrátenie horizontálne"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Prevracia sa vertikálne"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Vracia sa prevrátenie vertikálne"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Ľubovoľný text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Názov"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Značka"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Názov udalosti"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Názov súboru"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Typ"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Stav označenia"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Hodnotenie"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Dátum"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "obsahuje"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "je presne"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "začína s"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "končí s"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "neobsahuje"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "nie je nastavené"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "je"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "nie je"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "akákoľvek fotografia"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW fotografia"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "označená"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "neoznačená"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "a vyššie"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "iba"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "a nižšie"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "je po"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "je pred"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "je medzi"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "a"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "aspoň jedno"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "všetky"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "žiadne"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Uložené vyhľadávania"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "No_vé uložené vyhľadávanie..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Vaša knižnica fotografií nie je kompatibilná s touto verziou programu "
+"Shotwell. Zdá sa, že bola vytvorená programom Shotwell %s (schéma %d). Táto "
+"verzia je %s (schéma %d). Prosím, použite najnovšiu verziu programu "
+"Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell nebol schopný zmeniť verziu vašej knižnice fotografií z %s (schéma "
+"%d) na %s (schéma %d). Pre viac informácií si, prosím, pozrite wiki stránku "
+"programu Shotwell na %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Vaša knižnica fotografií nie je kompatibilná s touto verziou programu "
+"Shotwell. Zdá sa, že bola vytvorená programom Shotwell %s (schéma %d). "
+"Táto verzia je %s (schéma %d). Prosím, vyčistite vašu knižnicu odstránením "
+"%s a znovu importujte vaše fotografie."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Neznáma chyba pri pokuse o overenie databázy programu Shotwell: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Načítavam Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[SÚBOR]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Spustením '%s --help' zobrazíte úplný zoznam dostupných volieb príkazového "
+"riadku.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Dnes"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Včera"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Názov:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Položky:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d udalostí"
+msgstr[1] "%d udalosť"
+msgstr[2] "%d udalosti"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotografií"
+msgstr[1] "%d fotografia"
+msgstr[2] "%d fotografie"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d videí"
+msgstr[1] "%d video"
+msgstr[2] "%d videá"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Dátum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Čas:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Od:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Do:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Veľkosť:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Trvanie:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekundy"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Vývojka:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Expozícia:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Umiestnenie:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Veľkosť súboru:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Pôvodné rozmery:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Výrobca fotoaparátu:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model fotoaparátu:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blesk:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Ohnisková vzdialenosť:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Expozícia:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS zemepisná šírka:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS zemepisná dĺžka:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Umelec:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Autorské právo:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Softvér:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Komentár:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Rozšírené informácie"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Táto operácia odstráni značku \"%s\" z %d fotografií. Chcete pokračovať?"
+msgstr[1] ""
+"Táto operácia odstráni značku \"%s\" z jednej fotografie. Chcete pokračovať?"
+msgstr[2] ""
+"Táto operácia odstráni značku \"%s\" z %d fotografií. Chcete pokračovať?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Zrušiť"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "O_dstrániť"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Táto operácia odstráni uložené vyhľadávanie „%s“. Chcete pokračovať?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Prepnutie vývojára zruší všetky zmeny, ktoré ste uskutočnili na tejto fotke "
+"v programe Shotwell"
+msgstr[1] ""
+"Prepnutie vývojára zruší všetky zmeny, ktoré ste uskutočnili na týchto "
+"fotkách v programe Shotwell"
+msgstr[2] ""
+"Prepnutie vývojára zruší všetky zmeny, ktoré ste uskutočnili na týchto "
+"fotkách v programe Shotwell"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Prepnúť vývojára"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportovať video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell nemohol vytvoriť súbor na úpravu tejto fotografie, pretože nemáte "
+"právo zápisu do %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Nie je možné exportovať následujúcu fotografiu kvôli súborovej chybe.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Chcete pokračovať v exporte?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Pokračovať"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nezmenený"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Aktuálny"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Formát:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalita:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Zachovať pomer podľa:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixelov"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportovať meta údaje"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(a %d naviac)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "Správa o chybe:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d duplikátnych fotografií nebolo importovaných:\n"
+msgstr[1] "1 duplikátna fotografia nebola importovaná:\n"
+msgstr[2] "%d duplikátne fotografie neboli importované:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d duplicitných videí nebolo importovaných:\n"
+msgstr[1] "1 duplicitné video nebolo importované:\n"
+msgstr[2] "%d duplicitné videá neboli importované:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d duplicitných fotografií/videí nebolo importovaných:\n"
+msgstr[1] "1 duplicitná fotografia/video nebola importovaná:\n"
+msgstr[2] "%d duplicitné fotografie/videá neboli importované:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotografií sa nepodarilo importovať kvôli súborovej alebo hardvérovej "
+"chybe:\n"
+msgstr[1] ""
+"1 fotografiu sa nepodarilo importovať kvôli súborovej alebo hardvérovej "
+"chybe:\n"
+msgstr[2] ""
+"%d fotografie sa nepodarilo importovať kvôli súborovej alebo hardvérovej "
+"chybe:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d videí sa nepodarilo importovať kvôli súborovej alebo hardvérovej chybe:\n"
+msgstr[1] ""
+"1 video sa nepodarilo importovať kvôli súborovej alebo hardvérovej chybe:\n"
+msgstr[2] ""
+"%d videá sa nepodarilo importovať kvôli súborovej alebo hardvérovej chybe:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotografií/videí sa nepodarilo importovať kvôli súborovej alebo "
+"hardvérovej chybe:\n"
+msgstr[1] ""
+"1 fotografiu/video sa nepodarilo importovať kvôli súborovej alebo "
+"hardvérovej chybe:\n"
+msgstr[2] ""
+"%d fotografie/videá sa nepodarilo importovať kvôli súborovej alebo "
+"hardvérovej chybe:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d súborov sa nepodarilo importovať kvôli súborovej alebo hardvérovej "
+"chybe:\n"
+msgstr[1] ""
+"1 súbor sa nepodarilo importovať kvôli súborovej alebo hardvérovej chybe:\n"
+msgstr[2] ""
+"%d súbory sa nepodarilo importovať kvôli súborovej alebo hardvérovej chybe:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotografií sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[1] ""
+"1 fotografiu sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[2] ""
+"%d fotografie sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d videí sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[1] ""
+"1 video sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[2] ""
+"%d videá sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotografií/videí sa nepodarilo importovať, pretože do priečinka s "
+"knižnicou fotografií sa nedá zapisovať:\n"
+msgstr[1] ""
+"1 fotografiu/video sa nepodarilo importovať, pretože do priečinka s "
+"knižnicou fotografií sa nedá zapisovať:\n"
+msgstr[2] ""
+"%d fotografie/videá sa nepodarilo importovať, pretože do priečinka s "
+"knižnicou fotografií sa nedá zapisovať:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d súborov sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[1] ""
+"1 súbor sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+msgstr[2] ""
+"%d súbory sa nepodarilo importovať, pretože do priečinka s knižnicou "
+"fotografií sa nedá zapisovať:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d fotografií sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[1] "1 fotografiu sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[2] "%d fotografie sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d videí sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[1] "1 video sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[2] "%d videá sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d fotografií/videí sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[1] ""
+"1 fotografiu/video sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[2] ""
+"%d fotografie/videá sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d súborov sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[1] "1 súbor sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+msgstr[2] "%d súbory sa nepodarilo importovať kvôli chybe fotoaparátu:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d nepodporovaných fotografií bola preskočená:\n"
+msgstr[1] "1 nepodporovaná fotografia bola preskočená:\n"
+msgstr[2] "%d nepodporované fotografie boli preskočené:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d súborov, ktoré nie sú obrázkami, bolo preskočených.\n"
+msgstr[1] "1 súbor, ktorý nie je obrázok, bol preskočený.\n"
+msgstr[2] "%d súbory, ktorý nie sú obrázkami, boli preskočené.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d fotografií bolo preskočených kvôli prerušeniu používateľom:\n"
+msgstr[1] "1 fotografia bola preskočená kvôli prerušeniu používateľom:\n"
+msgstr[2] "%d fotografie boli preskočené kvôli prerušeniu používateľom:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d videí bolo preskočených kvôli prerušeniu používateľom:\n"
+msgstr[1] "%d video bolo preskočené kvôli prerušeniu používateľom:\n"
+msgstr[2] "%d videá bolí preskočené kvôli prerušeniu používateľom:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"%d fotografií/videí bolo preskočených kvôli prerušeniu používateľom:\n"
+msgstr[1] "1 fotografia/video bolo preskočené kvôli prerušeniu používateľom:\n"
+msgstr[2] ""
+"%d fotografií/videí bolo preskočených kvôli prerušeniu používateľom:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d súborov bolo preskočených kvôli prerušeniu používateľom:\n"
+msgstr[1] "1 súbor bol preskočený kvôli prerušeniu používateľom:\n"
+msgstr[2] "%d súbory boli preskočené kvôli prerušeniu používateľom:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d fotografií bolo úspešne importovaných.\n"
+msgstr[1] "1 fotografia bola úspešne importovaná.\n"
+msgstr[2] "%d fotografie boli úspešne importované.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d videí bolo úspešne importovaných.\n"
+msgstr[1] "1 video bolo úspešne importované.\n"
+msgstr[2] "%d videá bolo úspešne importované.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d fotografií/videí bolo úspešne importovaných.\n"
+msgstr[1] "1 fotografia/video bolo úspešne importované.\n"
+msgstr[2] "%d fotografie/videá boli úspešne importované.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Žiadne fotografie ani videá neboli importované.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Import dokončený"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekúnd"
+msgstr[1] "%d sekunda"
+msgstr[2] "%d sekundy"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minút"
+msgstr[1] "%d minúta"
+msgstr[2] "%d minúty"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hodín"
+msgstr[1] "%d hodina"
+msgstr[2] "%d hodiny"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 deň"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Premenovať udalosť"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Názov:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Upraviť názov"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Vyhodiť súbory do koša"
+msgstr[1] "_Vyhodiť súbor do koša"
+msgstr[2] "_Vyhodiť súbory do koša"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Len _odstrániť"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Vrátiť externú úpravu?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Vrátiť externé úpravy?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Táto operácia zničí všetky zmeny vykonané na %d externých súboroch. "
+"Pokračovať?"
+msgstr[1] ""
+"Táto operácia zničí všetky zmeny vykonané na externom súbore. Pokračovať?"
+msgstr[2] ""
+"Táto operácia zničí všetky zmeny vykonané na %d externých súboroch. "
+"Pokračovať?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "V_rátiť externé úpravy"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "V_rátiť externé úpravy"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Táto operácia odstráni %d fotografií z knižnice. Chcete pokračovať?"
+msgstr[1] "Táto operácia odstráni fotografiu z knižnice. Chcete pokračovať?"
+msgstr[2] "Táto operácia odstráni %d fotografie z knižnice. Chcete pokračovať?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "O_dstrániť"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Odstrániť fotografie z knižnice"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Odstrániť fotografie z knižnice"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24-hodinový"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Posunúť fotografie/videá o rovnakú hodnotu"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Nastaviť _všetky fotografie/videá na tento čas"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Zmeniť pôvodný súbor fotky"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Zmeniť pôvodné súbory fotiek"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Upraviť pôvodné súbory"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Zmeniť pôvodné súbory"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Originál: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%H:%M:%S %p, %d. %b %Y"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%I:%M:%S %p, %d. %b %Y"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Doba expozície sa posunie vpred o\n"
+"%d %s, %d %s, %d %s, a %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Doba expozície sa posunie dozadu o\n"
+"%d %s, %d %s, %d %s, a %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dní"
+msgstr[1] "deň"
+msgstr[2] "dni"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodín"
+msgstr[1] "hodina"
+msgstr[2] "hodiny"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minút"
+msgstr[1] "minúta"
+msgstr[2] "minúty"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekúnd"
+msgstr[1] "sekunda"
+msgstr[2] "sekundy"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"A %d ďalších."
+msgstr[1] ""
+"\n"
+"\n"
+"A %d ďalšia."
+msgstr[2] ""
+"\n"
+"\n"
+"A %d ďalšie."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Značky (oddelené čiarkou):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Vitajte!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Vitajte v Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Aby ste začali, importujte fotografie jedným z následujúcich spôsobov:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Zvoľte <span weight=\"bold\">Importovať súbor %s z priečinka</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Pretiahnite fotografie do Shotwell okna"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Pripojte fotoaparát k vášmu počítaču a importujte"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importovať fotografie z vášho priečinka %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Takisto môžete importovať fotografie jedným z následujúcich spôsobov:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Nezobrazovať znova túto správu"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Importovať fotografie z vašej knižnice %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Pomocník)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Rok%sMesiac%sDeň"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Rok%sMesiac"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Rok%sMesiac-Deň"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Rok-Mesiac-Deň"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Vlastný"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Chybný vzorec"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell môže skopírovať fotografie do vášho priečinka s knižnicou alebo ich "
+"importovať bez kopírovania."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_pírovať fotografie"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importovať na mieste"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importovať do knižnice"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Odstrániť z knižnice"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Odstraňuje sa fotografia z knižnice"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Odstraňujú sa fotografie z knižnice"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Táto operácia odstráni %d fotografií/videí z vašej knižnice programu "
+"Shotwell. Chcete tieto súbory tiež presunúť do koša na vašej pracovnej "
+"ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+msgstr[1] ""
+"Táto operácia odstráni fotografiu/video z vašej knižnice programu Shotwell. "
+"Chcete tento súbor tiež presunúť do koša na vašej pracovnej ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+msgstr[2] ""
+"Táto operácia odstráni %d fotografie/videá z vašej knižnice programu "
+"Shotwell. Chcete tieto súbory tiež presunúť do koša na vašej pracovnej "
+"ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Táto operácia odstráni %d videí z vašej knižnice programu Shotwell. Chcete "
+"tieto súbory tiež presunúť do koša na vašej pracovnej ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+msgstr[1] ""
+"Táto operácia odstráni video z vašej knižnice programu Shotwell. Chcete "
+"tento súbor tiež presunúť do koša na vašej pracovnej ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+msgstr[2] ""
+"Táto operácia odstráni %d videá z vašej knižnice programu Shotwell. Chcete "
+"tieto súbory tiež presunúť do koša na vašej pracovnej ploche?\n"
+"\n"
+"Táto operácia sa nedá vrátiť späť."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Táto operácia odstráni %d fotografií z vašej Shotwell knižnice. Chcete tiež "
+"presunúť súbory do vášho koša na pracovnej ploche?\n"
+"\n"
+"Táto akcie nemôže byť vrátená späť."
+msgstr[1] ""
+"Táto operácia odstráni fotografiu z vašej Shotwell knižnice. Chcete tiež "
+"presunúť súbor do vášho koša na pracovnej ploche?\n"
+"\n"
+"Táto akcie nemôže byť vrátená späť."
+msgstr[2] ""
+"Táto operácia odstráni %d fotografie z vašej Shotwell knižnice. Chcete tiež "
+"presunúť súbory do vášho koša na pracovnej ploche?\n"
+"\n"
+"Táto akcie nemôže byť vrátená späť."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d fotografií/videí sa nedá presunúť do koša na vašej pracovnej ploche. "
+"Chcete tieto súbory odstrániť?"
+msgstr[1] ""
+"Fotografia/video sa nedá presunúť do koša na vašej pracovnej ploche. Chcete "
+"tento súbor odstrániť?"
+msgstr[2] ""
+"%d fotografie/videá sa nedajú presunúť do koša na vašej pracovnej ploche. "
+"Chcete tieto súbory odstrániť?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d fotografií/videí sa nedá odstrániť."
+msgstr[1] "Fotografia/video sa nedá odstrániť."
+msgstr[2] "%d fotografie/videá sa nedajú odstrániť."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Priečinky"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Značky"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "V poriadku"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Chyba súboru"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Nepodarilo sa dekódovať súbor"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Chyba databázy"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Používateľ prerušil importovanie"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Nie je to súbor"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Súbor už existuje v databáze"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nepodporovaný formát súboru"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Nie je to obrázkový súbor"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Zlyhanie disku"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk je plný"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Chyba fotoaparátu"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Chyba pri zápise do súboru"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importovanie zlyhalo (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "upravené"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Predchádzajúca fotografia"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Ďalšia fotografia"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Chýba zdrojový súbor fotografie: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Zobraziť"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "Nás_troje"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Predchádzajúca fotografia"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Predchádzajúca fotografia"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "Ďa_lšia fotografia"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Ďalšia fotografia"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Priblížiť"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Zvýšiť zväčšenie fotografie"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Vzdialiť"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Zmenšiť zväčšenie fotografie"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Prispôsobiť _strane"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zväčšiť fotografiu na veľkosť obrazovky"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Mierka _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Priblížiť fotografiu na 100% zväčšenie"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Mierka _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Priblížiť fotografiu na 200% zväčšenie"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Vývojár"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Nepodarilo sa exportovať %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s databáza"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importovanie z %s nemôže pokračovať, pretože sa vyskytla chyba:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Pre pokus o import z inej služby, vyberte jeden z nasledovnej ponuky."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Importy údajov"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Nemáte povolené žiadne zásuvné moduly na import údajov.\n"
+"\n"
+"Na používanie funkcie importu, musíte mať povolený aspoň jeden zásuvný modul "
+"pre importovanie. Zásuvné moduly môžu byť povolené v Predvoľbách."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Súbor databázy:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importovať"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importovať z aplikácie"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importovať multimédiá _z:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "Za_vrieť"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Nastavenia"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Prezentácia"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Späť"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Prejsť na predchádzajúcu fotografiu"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pozastaviť"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pozastaviť prezentáciu"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Ďalšia"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Prejsť na nasledujúcu fotografiu"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Zmeniť nastavenia prezentácie"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Chýbajú všetky zdrojové súbory fotografií."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Spustiť"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Pokračovať v prezentácii"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Vracia sa spať"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Opakuje sa vrátenie"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Vylepšuje sa"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Vracia sa spať vylepšenie"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Vytvára sa nová udalosť"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Odstraňuje sa udalosť"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Fotografie sa presúvajú do novej udalosti"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Fotografie sa nastavujú na predošlú udalosť"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Zlučovanie"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Vracia sa spať zlučovanie"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Fotografie sa duplikujú"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Odstraňujú sa duplikátne fotografie"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Nie je možné duplikovať %d fotografií kvôli súborovej chybe"
+msgstr[1] "Nie je možné duplikovať jednu fotografiu kvôli súborovej chybe"
+msgstr[2] "Nie je možné duplikovať %d fotografie kvôli súborovej chybe"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Obnovuje sa predchádzajúce hodnotenie"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Zvyšujú sa hodnotenia"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Znižujú sa hodnotenia"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Nastavuje sa RAW vývojka"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Obnovuje sa predchádzajúca RAW vývojka"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Nastaviť vývojára"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Pôvodná fotografia nemôže byť upravená."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Nastavuje sa čas a dátum"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Vracia sa späť úprava času a dátumu"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Následujúce pôvodné fotografie nemôžu byť upravené."
+msgstr[1] "Jedna pôvodná fotografia nemôže byť upravená."
+msgstr[2] "Následujúce pôvodné fotografie nemôžu byť upravené."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Chyba úpravy času"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Nie je možné vrátiť spať úpravy času v následujúcich súboroch fotografií."
+msgstr[1] ""
+"Nie je možné vrátiť spať úpravu času v následujúcom súbore fotografie."
+msgstr[2] ""
+"Nie je možné vrátiť spať úpravy času v následujúcich súboroch fotografií."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Vytvoriť značku"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Presunúť značku „%s“"
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Presunúť fotografie do koša"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Obnoviť fotografie z koša"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Presunúť fotografie do Shotwell koša"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Obnoviť tieto fotografie naspať do Shotwell knižnice"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Fotografie sa presúvajú do koša"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Obnovujú sa fotografie z koša"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Označiť vybrané fotografie"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Odznačiť vybrané fotografie"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Označiť"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Odznačiť"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Nízka (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Stredná (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Vysoká (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximálna (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Žiadne fotografie/videá"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Neboli nájdené žiadne fotografie/videá"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotografie nemôžu byť exportované do tohoto adresára."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Nepodarilo sa spracovať aktualizácie sledovania: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Vyplniť celú stranu"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 obrázky na stranu"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 obrázky na stranu"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 obrázkov na stranu"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 obrázkov na stranu"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 obrázkov na stranu"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 obrázkov na stranu"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "palcov"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Peňaženka (2 x 3 palce)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Zápisník (3 x 5 palcov)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 palcov"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 palcov"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 palcov"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 palcov"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 palcov"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrická peňaženka (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Pohľadnica (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Nastavenia obrázka"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Tlačí sa..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Nepodarilo sa vytlačiť fotografiu:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Nepodarilo sa otvoriť/vytvoriť databázu fotografií %s: kód chyby %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Nepodarilo sa zapisovať do databázového súboru fotografií: \n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Chyba pri prístupe k databázovému súboru:\n"
+" %s\n"
+"Popis chyby: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exportovať videá"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nepodarilo sa spustiť Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Odoslať do"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Nepodarilo sa exportovať pozadie do %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Nepodarilo sa pripraviť prezentáciu pre pracovnú plochu: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Označené"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Kôš"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Kôš je prázdny"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Odstrániť"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Odstraňujú sa fotografie"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Chýbajúce súbory"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Odstraňuje sa..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Posledné importovanie"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importovať z priečinka..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importovať fotografie z disku do knižnice"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importovať z _aplikácie..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Zora_diť udalosti"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "_Vyprázdniť kôš"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Odstrániť všetky fotografie v koši"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Zobraziť u_dalosť fotografie"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Nájsť"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Nájsť fotografie a videá podľa kritérií hľadania"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Súbor"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Upraviť"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotografia"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografie"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "U_dalosti"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Značky"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Pomocník"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Základné informácie"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Zobraziť základné informácie pre výber"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Rozšírené informácie"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Zobraziť rozšírené informácie pre výber"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Vyhľadávacia lišta"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Zobraziť vyhľadávaciu lištu"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "Bočný panel"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Zobraz bočný panel"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "Vz_ostupne"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Usporiadať fotografie vo vzostupnom poradí"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "Zo_stupne"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Usporiadať fotografie v zostupnom poradí"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importovať z priečinka"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Vyprázdniť kôš"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Vyprázdňuje sa kôš..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell je nastavený na importovanie fotografií do vášho domovského "
+"priečinka.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Umiestnenie knižnice"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotografie sa nedajú importovať z tohto adresára."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Aktualizuje sa knižnica..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Pripravuje sa automatické importovanie fotografií..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Prebieha automatické importovanie fotografií..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Zapisujú sa meta údaje do súborov..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Knižnica"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importuje sa..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Zastaviť importovanie"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Zastaviť importovanie fotografií"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Pripravuje sa importovanie..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importovaný súbor „%s“"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Uložiť"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Uložiť fotografiu"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Uložiť _ako..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Uložiť fotografiu pod novým názvom"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Vytlačiť fotografiu na tlačiarni pripojenej k vášmu počítaču"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s neexistuje."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s nie je súbor."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s nepodporuje súborový formát\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Uložiť kópiu"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Zahodiť zmeny vo %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Zavrieť _bez uloženia"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Chyba počas ukladania do %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Uložiť ako"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Nepodarilo sa sledovať %s: Nie je to adresár (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Správca fotografií"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Prehliadač fotografií"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Otočiť do_prava"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Otočiť"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Otočiť doprava"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Otočiť fotografie doprava (stlačte Ctrl na otočenie doľava)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Otočiť doľa_va"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Otočiť doľava"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Otočiť fotografie doľava"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Prevrátiť vodo_rovne"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Prevrátiť horizontálne"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Prevrátiť _zvislo"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Prevrátiť vertikálne"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Vy_lepšiť"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Vylepšiť"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Automaticky vylepšiť vzhľad fotografie"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "O_rezať"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Orezať"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Orezať veľkosť fotografie"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Vyrovnať"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Vyrovnať"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Vyrovnať fotografiu"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "Červené _oči"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Červené oči"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Zmierniť alebo odstrániť efekt červených očí vo fotografii"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Upraviť"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Upraviť"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Upraviť farbu a tón fotografie"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Vrátiť do _pôvodného stavu"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Vrátiť do pôvodného stavu"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Vrátiť _externé úpravy"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Vrátiť sa k pôvodnej fotografii"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Nastaviť ako _pozadie pracovnej plochy"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Nastaviť vybraný obrázok ako pozadie pracovnej plochy"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Nastaviť ako _prezentáciu pre pracovnú plochu..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "Vrátiť _späť"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Vrátiť späť"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Opakovať vrátené"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Opakovať vrátené"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Pre_menovať udalosť..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Označiť ako _hlavnú fotografiu udalosti"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Označiť ako hlavnú fotografiu udalosti"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nová udalosť"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Nová udalosť"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Presunúť fotografie"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Presunúť fotografie do udalosti"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Zlúčiť udalosti"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Zlúčiť"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Zlúčiť udalosti do jednej udalosti"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "O_hodnotiť"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Ohodnotiť"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Zmeniť hodnotenie vašej fotografie"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "Z_výšiť"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Zvýšiť hodnotenie"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Znížiť"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Znížiť hodnotenie"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Neohodnotená"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Neohodnotená"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Hodnotiť neohodnotené"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Nastavuje sa ako neohodnotená"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Odstrániť všetky hodnotenia"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Odmietnutá"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Odmietnutá"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Hodnotiť odmietnuté"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Nastavuje sa ako odmietnutá"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Nastaviť hodnotenie ako odmietnuté"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Len _odmietnuté"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Len odmietnuté"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Zobraziť len odmietnuté fotografie"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Všetky + o_dmietnuté"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Zobraziť všetky fotografie vrátane odmietnutých"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Všetky fotografie"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Zobraziť všetky fotografie"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Hodnotenia"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Zobraziť hodnotenie každej fotografie"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrovať fotografie"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrovať fotografie"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Obmedziť počet zobrazených fotografií na základe filtra"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Du_plikovať"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplikovať"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Vytvoriť duplikát fotografie"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportovať..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Tlačiť..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Uverejniť..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Uverejniť"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Uverejniť na rôznych webových stránkach"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Upraviť _názov..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Zmeniť komentár"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Upraviť dátum a čas..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Upraviť dátum a čas"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Pridať _značky..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Pridať značky..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Pridať značky"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Predvoľby"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Otvoriť pomocou e_xterného editora"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Otvoriť pomocou RA_W editora"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Odoslať _do..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Odoslať d_o..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Nájsť..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Nájsť"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Nájdite obrázok napísaním textu ktorý sa nachádza v jeho názve alebo značke"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Označiť"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Odz_načiť"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Nie je možné spustiť editor: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Pridať značku \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Pridať značky \"%s\" a \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "O_dstrániť značku \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Odstrániť značku \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Odstrániť značku"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nová"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Pre_menovať značku \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Premenovať značku \"%s\" na \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Premenovať..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Upraviť značky..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Upraviť značky"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Označiť fotografie ako \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Označiť fotografie ako „%s“"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Označiť vybrané fotografie ako \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Označiť vybrané fotografie ako „%s“"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Odstrániť značku \"%s\" z _fotografií"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Odstrániť značku „%s“ z _fotografií"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Odstrániť značku \"%s\" z fotografií"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Odstrániť značku „%s“ z fotografií"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Nie je možné premenovať značku na \"%s\", lebo táto značka už existuje."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Nepodarilo sa premenovať vyhľadávanie na „%s“, lebo takéto vyhľadávanie už "
+"existuje."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Uložené vyhľadávanie"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Odstrániť vyhľadávanie"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Upraviť..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "_Premenovať..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Premenovať vyhľadávanie „%s“ na „%s“"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "O_dstrániť vyhľadávanie „%s“"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Hodnotiť %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Nastaviť hodnotenie na %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Nastavuje sa hodnotenie na %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Zobraziť %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Zobraziť len fotografie s hodnotením %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s alebo lepšie"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Zobraziť %s alebo lepšie"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Zobraziť iba fotografie s hodnotením %s alebo lepšie"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Odstrániť vybrané fotografie z koša"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Odstrániť vybrané fotografie z knižnice"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Obnoviť"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Presunúť vybrané fotografie naspäť do knižnice"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Zobraziť v správcovi sú_borov"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Otvoriť priečinok zvolených fotografií v správcovi súborov"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Nie je možné otvoriť v správcovi súborov: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_Odstrániť z knižnice"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "Presunúť do _Koša"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Ozn_ačiť všetko"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Vybrať všetky položky"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d. %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d. %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d. %b, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Uhol:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Obnoviť"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Vrátiť sa k súčasným rozmerom fotografie"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Nastaviť orezanie pre túto fotografiu"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Prepnúť výrezový obdĺžnik medzi vertikálnou a horizontálnou orientáciou"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Neobmedzený"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Štvorec"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Širokoúhly"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Pôvodná veľkosť"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Dopis (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Zavrieť nástroj na odstraňovanie červených očí"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Odstrániť efekt červených očí vo vybranej oblasti"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Sýtosť:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Sfarbenie:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Teplota:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Tiene:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Obnoviť farby"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Obnoviť všetky úpravy farby na pôvodné hodnoty"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Teplota"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Sfarbenie"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Sýtosť"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Expozícia"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Tiene"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Rozšíriť kontrast"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Pripnúť panel"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Pripnúť panel nástrojov otvorený"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Opustiť režim celej obrazovky"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Opustiť režim _celej obrazovky"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "U_končiť"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_O programe"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Na _celú obrazovku"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "Ob_sah"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Často _kladené otázky"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Nahlásiť problém..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Vyskytla sa fatálna chyba pri prístupe ku knižnici programu Shotwell. "
+"Shotwell nemôže pokračovať.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Navštívte webovú stránku nadácie Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Laco Gubík <lacogubik@googlemail.com>\n"
+"Ondrej Mosnáček <omosnacek@gmail.com>\n"
+"Tomáš Vadina <kyberdev@gmail.com>\n"
+"Dušan Kazik <prescott66@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Nepodarilo sa zobraziť pomocníka: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Nepodarilo sa prejsť do databázy chýb: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Nepodarilo sa zobraziť FAQ: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "bez názvu"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Pôvodnej veľkosti"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Šírky alebo výšky"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Šírky"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Výšky"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Upraviť veľkosť náhľadov"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Zvýšiť zväčšenie nadhľadov"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Zmenšiť zväčšenie nadhľadov"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Usporiadať _fotografie"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Prehrať video"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Otvoriť vybrané videá v systémovom prehrávači videa"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "Komentár"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Zobraziť značky každej fotografie"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Podľa _názvu"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Usporiadať fotografie podľa názvu"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Podľa _dátumu vytvorenie"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Usporiadať fotografie podľa dátumu vytvorenie"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Podľa _hodnotenia"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Usporiadať fotografie podľa hodnotenia"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell nebol schopný prehrať vybrané video: \n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Fotografií/Videí"
+msgstr[1] "%d Fotografia/Video"
+msgstr[2] "%d Fotografie/Videá"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Žiadne udalosti"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Neboli nájdené žiadne udalosti"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Udalosti"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Bez dátumu"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Žiadna udalosť"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Nepodarilo sa vytvoriť adresár vyrovnávacej pamäte %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Nepodarilo sa vytvoriť dátový adresár %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Obrázky"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Nepodarilo sa vytvoriť dočasný adresár %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Nepodarilo sa vytvoriť dátový podadresár %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Žiadny)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Žiadny"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Náhodná"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Prechody prezentácie"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Nepodarilo sa vytvoriť dočasný súbor pre %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exportuje sa"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Súbor %s už existuje. Chcete ho nahradiť?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Preskočiť"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Nahradiť"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Nahradiť _všetko"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Export"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografie"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videá"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW fotografie"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW fotografie"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Chyba pri nahrávaní súboru používateľského rozhrania %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Typ"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Uverejňovanie"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Vybrané fotografie/videá boli úspešne uverejnené."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Vybrané videá boli úspešne uverejnené."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Zvolené fotografie boli úspešne uverejnené."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Vybrané video bolo úspešne uverejnené."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Vybraná fotografia bola úspešne uverejnená."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Získavajú sa informácie o účte..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Prihlasuje sa..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Uverejniť fotografie"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Uverejniť fotografie _na:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Uverejniť videá"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Uverejniť videá _na"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Uverejniť fotografie a videá"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Uverejniť fotografie a videá _na"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Nepodarilo sa uverejniť"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell nemôže uverejniť zvolené položky, pretože nemáte kompatibilný "
+"uverejňovací zásuvný modul. Na opravenie tohoto problému, zvoľte <b>Upraviť "
+"%s predvoľby</b> a povoľte jeden alebo viacero uverejňovacích zásuvných "
+"modulov v záložke <b>Zásuvné moduly</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Pripravuje sa nahrávanie"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Nahráva sa %d z %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Uverejňovanie na %s nemôže pokračovať, pretože sa vyskytla chyba:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Aby ste mohli uverejniť vaše fotografie na inej službe, zvoľte si ju z "
+"ponuky hore."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nová _značka"
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Dočasný súbor potrebný na uverejnenie nie je dostupný"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Momentálne nie ste prihlásení do služby YouTube.\n"
+"\n"
+"Aby ste mohli pokračovať, musíte si vytvoriť účet Google a nastaviť ho na "
+"používanie služby YouTube. Väčšinu účtov takto môžete nastaviť prihlásením "
+"sa aspoň raz cez prehliadač na stránku služby YouTube (http://www.youtube."
+"com/)."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Súbor potrebný na uverejňovanie nie je dostupný. Uverejňovanie v službe "
+"Youtube nemôže pokračovať."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Ste prihlásení na YouTube ako %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videá sa zobrazia v „%s“"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Verejné zahrnuté"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Verejné nezahrnuté"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Súkromné"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Hlavné uverejňovacie služby"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Momentálne nie ste prihlásený na Flickr.\n"
+"\n"
+"Kliknite na Prihlásiť pre prihlásenie na Flickr vo Vašom webovom "
+"prehliadači. Budete musieť autorizovať Shotwell Connect odkaz na Váš účet "
+"Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Počas tohoto spustenia programu Shotwell ste sa už prihlásili a odhlásili k "
+"službe Flickr.\n"
+"Aby ste mohli naďalej uverejňovať fotografie pomocou služby Flickr, ukončite "
+"a znova spustite Shotwell, a potom to skúste znova."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Pripravuje sa na prihlásenie..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Súbor potrebný na uverejňovanie nie je dostupný. Uverejňovanie v službe "
+"Flickr nemôže pokračovať."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Overuje sa autorizácia..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Ste prihlásený k službe Flickr ako %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Váš Flickr účet, ktorý je zdarma, obmedzuje koľko dát môžete odoslať za "
+"mesiac.\n"
+"Tento mesiac vám ešte ostáva %d megabajtov z vašej kvóty."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"Váš Flickr Pro účet vám umožňuje neobmedzené nahrávanie vašich fotografií."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotografie _viditeľné pre:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videá budú v_iditeľné:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotografie a videá budú v_iditeľné:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Všetkých"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Len pre priateľov a rodinu"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Iba rodina"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Iba priatelia"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Len pre mňa"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 bodov"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 bodov"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixelov"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixelov"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Vytvára sa album %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Zadajte adresu URL vašej knižnice fotografií v službe Piwigo a taktiež "
+"patričné používateľské meno a heslo k účtu služby Piwigo pre danú knižnicu."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Program Shotwell nedokáže kontaktovať vašu knižnicu v službe Piwigo. Prosím, "
+"overte vami zadanú adresu URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Neplatné užívateľské meno a/alebo heslo. Prosím, skúste to znovu."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Neplatná adresa URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"Neplatné meno používateľa alebo heslo"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administrátori, rodina, priatelia, kontakty"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administrátori, rodina, priatelia"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administrátori, rodina"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administrátori"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Momentálne nie ste prihlásený do služby webových albumov Picasa.\n"
+"\n"
+"Kliknite na Prihlásiť na prihlásenie do služby webových albumov Picasa vo "
+"vašom webovom prehliadači. Budete musieť schváliť požiadavku na spojenie "
+"programu Shotwell Connect s vaším účtom webových albumov Picasa."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Súbor potrebný na uverejňovanie nie je dostupný. Uverejňovanie v službe "
+"Picasa nemôže pokračovať."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Vytvára sa nový album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Ste prihlásený do Picasa Web Albums ako %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videá sa zobrazia v:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotografie sa zobrazia v:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Malá (640 x 480 pixelov)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Stredná (1024 x 768 pixelov)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Odporúčaná (1600 x 1200 pixelov)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 bodov)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Momentálne nie ste prihlásený do siete Facebook.\n"
+"\n"
+"Ak ešte nemáte vytvorený Facebook účet, môžete si jeden vytvoriť počas "
+"prihlasovacieho procesu. Počas prihlásenia si Shotwell Connect môže vyžiadať "
+"povolenie na nahratie fotografií a ich uverejnenie vo vašom kanáli. Toto "
+"povolenie je potrebné na to, aby Shotwell Connect mohol správne fungovať."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Počas tohoto spustenia programu Shotwell ste sa už prihlásili a odhlásili zo "
+"siete Facebook.\n"
+"Aby ste mohli naďalej uverejňovať fotografie na sieti Facebook, ukončite a "
+"znova spustite Shotwell, a potom to skúste znova."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Štandardná (720 pixelov)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Veľká (2048 pixelov)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testuje sa pripojenie k sieti Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Súbor potrebný na uverejňovanie nie je dostupný. Uverejňovanie v službe "
+"Facebook nemôže pokračovať."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Ste prihlásení na Facebook ako %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kde si želáte uverejniť vybrané fotografie?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Veľkosť nahrávania:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Rozbitie"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Hodiny"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Kruh"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Hlavné prechody prezentácie"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Posunutie"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Zblednutie"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Služby importu údajov jadra"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Vitajte v importovacej službe F-Spot knižnice.\n"
+"\n"
+"Prosím, zvoľte knižnicu na importovanie vybratím jednej z existujúcich "
+"knižníc nájdených aplikáciou Shotwell alebo vybratím alternatívneho súboru F-"
+"Spot databázy."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Vitajte v importovacej službe F-Spot knižnice.\n"
+"\n"
+"Prosím, vyberte súbor F-Spot databázy."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Ručne vyberte súbor F-Spot databázy na importovanie:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Nedá sa ovoriť vybraný súbor F-Spot databázy: súbor neexistuje alebo nie je "
+"F-Spot databázou"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Nedá sa ovoriť vybraný súbor F-Spot databázy: táto verzia F-Spot databázy "
+"nie je podporovaná aplikáciou Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Nedá sa načítať vybraný súbor F-Spot databázy: chyba počas načítavania "
+"tabuľky značiek"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Nedá sa načítať vybraný súbor F-Spot databázy: chyba počas načítavania "
+"tabuľky fotiek"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell našiel %d fotiek v F-Spot knižnici a momentálne ich importuje. "
+"Duplikáty budú automaticky zistené a odstránené.\n"
+"\n"
+"Môžete zavrieť toto okno a začať používanie aplikácie Shotwell, zatiaľ čo "
+"import bude prebiehať na pozadí."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot knižnica: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Pripravuje sa importovanie"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Nastaviť ako prezentáciu pre pracovnú plochu"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Vygenerovať prezentáciu pre pracovnú plochu"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Ukázať každú fotografiu na"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "určitý čas"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Ako dlho bude každá fotografia zobrazená na pozadí pracovnej plochy"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Hľadať"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Názov vyhľadávania:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Zhoda"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "z nasledujúcich:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Použiť š_tandardnú veľkosť:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Použiť _vlastnú veľkosť:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Zachovať pomer strán fotografie"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automatická veľkosť:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Vytlačiť _názov obrázku"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Vytvoriť fotografiu v:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixeloch na palec"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"štítok"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell predvoľby"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "biela"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "čierna"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Sledovať adresáre knižnice kvôli novým súborom"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Meta údaje"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "_Zapísať značky, názvy a ďalšie meta údaje do súborov fotografií"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Obrazovka"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importovať fotografie do:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Pozadie:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Importuje sa..."
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Š_truktúra priečinkov:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Vzorec:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Príklad:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Zmeniť názov importovaných súborov na _malé písmená"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW vývojka"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Pred_volená:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "_Externý editor fotografií:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Externý _RAW editor:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Externé editory"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Zásuvné moduly"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Oneskorenie:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Efekt prechodu:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Oneskorenie _prechodu:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Zobraziť ná_zov"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekúnd"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Prihlásiť sa"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Uverejniť v _existujúcom albume:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Vytvoriť _nový album s názvom:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videá a nové albumy budú v_iditeľné:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Odhlásiť"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+#, fuzzy
+msgid "_Publish"
+msgstr ""
+"Z_verejniť"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Zadajte potvrdzovacie číslo, ktoré bolo zobrazené po prihlásení na Flickr vo "
+"Vašom webovom prehliadači."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Autorizačné čí_slo:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Veľkosť _fotky:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Existujúcom albume:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Photos will be _visible by:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Zobraziť album vo verejnej galérii"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Prednastavená _veľkosť fotografie:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "User _name"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Používateľské _meno"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Heslo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "Za_pamätať heslo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Prihlásiť sa"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Existujúcej kategórii:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotografie budú viditeľné:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Veľkosť fotky:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Odhlásiť sa"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "_Nastavenie súkromia videa:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Autorské práva 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 bodov"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' nie je platnou odpoveďou na autorizačnú požiadavku OAuth"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Zadajte meno používateľa a heslo pre váš príslušný účet Tumblr."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Nepodarilo sa načítať rozhranie: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Ste prihlásený do služby Tumblr ako %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Autorské práva 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Navštíviť webové stránky Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Momentálne nie ste prihlásení do služby Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Emailová adresa"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogy:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumy (alebo zadajte nový):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Typ prístupu:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Zakázať _komentáre"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "Zakázať stiahnutie _pôvodnej fotografie"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..6c03bc1
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,4813 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# anthonmanix <anthon.manix@gmail.com>, 2013
+# Andrej Znidarsic <andrej.znidarsic@gmail.com>, 2012
+# anthonmanix <anthon.manix@gmail.com>, 2012
+# ikriznar <ikriznar@gmail.com>, 2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-23 19:50+0000\n"
+"Last-Translator: ikriznar <ikriznar@gmail.com>\n"
+"Language-Team: Slovenian (http://www.transifex.com/projects/p/shotwell/"
+"language/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Dogodek %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Fotoaparati"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Fotoaparat"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Fotoaparata ni mogoče odklopiti. Poskusite odklopiti fotoaparat v "
+"upravljalniku datotek."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Skrij že uvožene fotografije"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Pokaži le fotografije, ki niso bile uvožene"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Začenjanje uvoza, prosimo počakajte ..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Naslovi"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Prikaže naslov vsake fotografije"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Uvozi _izbrane"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Uvozi izbrane fotografije iz vaše knjižnice"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Uvozi _vse"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Uvozi vse fotografije v vašo knjižnico "
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Za dostop do fotoaparata je treba napravo najprej odklopiti iz datotečnega "
+"sistema. Ali želite nadaljevati?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Odklopi"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Odklopite fotoaparat."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Fotoaparat je zaklenil drug program. Shotwell lahko do fotoaparata dostopa "
+"le, ko je odklenjen. Zaprite druge programe, ki uporabljajo fotoaparat in "
+"poskusite ponovno."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Zaprite druge programe, ki uporabljajo fotoaparat."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Iz fotoaparata ni mogoče pridobiti slik za predogled:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Odklapljanje ..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Pridobivanje podatkov o fotografiji"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Pridobivanje predogleda za %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Fotoaparata ni mogoče zakleniti: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Ali naj se izbriše %d slik iz fotoaparata?"
+msgstr[1] "Ali naj se izbriše %d slika iz fotoaparata?"
+msgstr[2] "Ali naj se izbriše %d sliki iz fotoaparata?"
+msgstr[3] "Ali naj se izbriše %d slike iz fotoaparata?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Ali želite izbrisati %d videoposnetkov iz fotoaparata?"
+msgstr[1] "Ali želite izbrisati %d videoposnetek iz fotoaparata?"
+msgstr[2] "Ali želite izbrisati %d videoposnetka iz fotoaparata?"
+msgstr[3] "Ali želite izbrisati %d videoposnetke iz fotoaparata?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Ali želite izbrisati %d fotografij/videoposnetkov iz fotoaparata?"
+msgstr[1] "Ali želite izbrisati %d fotografijo/videoposnetek iz fotoaparata?"
+msgstr[2] "Ali želite izbrisati %d fotografiji/videoposnetka iz fotoaparata?"
+msgstr[3] "Ali želite izbrisati %d fotografije/videoposnetke iz fotoaparata?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Ali želite teh %d datotek izbrisati iz fotoaparata?"
+msgstr[1] "Ali želite izbrisati %d datoteko iz fotoaparata?"
+msgstr[2] "Ali želite te %d datoteki izbrisati iz fotoaparata?"
+msgstr[3] "Ali želite te %d datoteke izbrisati iz fotoaparata?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Obdrži"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Odstranjevanje fotografij/videoposnetkov iz fotoaparata"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Zaradi napak iz fotoaparata ni mogoče izbrisati %d fotografij/videoposnetkov."
+msgstr[1] ""
+"Zaradi napak iz fotoaparata ni mogoče izbrisati %d fotografije/videoposnetka."
+msgstr[2] ""
+"Zaradi napak iz fotoaparata ni mogoče izbrisati %d fotografij/videoposnetkov."
+msgstr[3] ""
+"Zaradi napak iz fotoaparata ni mogoče izbrisati %d fotografij/videoposnetkov."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "P_redstavitev"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Predvaja diapredstavitev"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Izvozi fotografijo ali videoposnetek"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Izvozi fotografije/videoposnetke"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Izvozi fotografijo"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Izvozi fotografije"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Vrtenje"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Razveljavljanje vrtenja"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Zrcaljenje vodoravno"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Razveljavljanje vodoravnega zrcaljenja"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Zrcaljenje navpično"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Razveljavljanje navpičnega zrcaljenja"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Katerokoli besedilo"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Naslov"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Oznaka"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Komentar"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Ime dogodka"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Ime datoteke"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Vrsta medija"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Zastavica stanja"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Ocena"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datum"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "vsebuje"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "je natanko"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "se začne z"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "se konča z"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "ne vsebuje"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ni določeno"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "je"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "ni"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "katerakoli fotografija"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "surova fotografija"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "videoposnetek"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "označeno"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "ni označeno"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "in višja"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "samo"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "in nižja"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "je za"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "je pred"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "je med"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "in"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "katerikoli"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "vse"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ničesar"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Shranjena iskanja"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Novo shranjeno iskanje..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Vaša knjižnica fotografij ni združljiva s to različico programa Shotwell. "
+"Videti je, da je bila ustvarjena z različico %s (shema %d), uporabljate pa "
+"različico %s (shema %d). Uporabite zadnjo različico Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"S programom Shotwell ni bilo mogoče nadgraditi vaše knjižnice fotografij iz "
+"različice %s (shema %d) na %s (shema %d). Za več podrobnosti preverite wiki "
+"Shotwell na %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Vaša knjižnica fotografij ni združljiva s to različico programa Shotwell. "
+"Videti je, da je bila ustvarjena z različico %s (shema %d), uporabljate pa "
+"različico %s (shema %d). Počistite svojo knjižnico z izbrisom %s in ponovnim "
+"uvozom svojih fotografij."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Med poskusom preverjanja podatkovne zbirke Shotwell je prišlo do neznane "
+"napake: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Nalaganje programa"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Pot do Shotwell-ovih zasebnih podatkov"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Prikaži različico aplikacije"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[DATOTEKA]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "Za popoln seznam možnosti ukazne vrstice zaženite '%s --help'.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Danes"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Včeraj"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Naslov:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Predmeti:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d dogodkov"
+msgstr[1] "%d dogodek"
+msgstr[2] "%d dogodka"
+msgstr[3] "%d dogodki"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d fotografij"
+msgstr[1] "%d fotografija"
+msgstr[2] "%d fotografiji"
+msgstr[3] "%d fotografije"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d videoposnetkov"
+msgstr[1] "%d videoposnetek"
+msgstr[2] "%d videoposnetka"
+msgstr[3] "%d videoposnetki"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Čas:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Od:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Za:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Velikost:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Trajanje:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekund"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Razvijalec:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Osvetljenost:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Mesto:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Velikost datoteke:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Izvirne mere:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Znamka fotoaparata:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Model fotoaparata:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Bliskavica:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Goriščna razdalja:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Datum zajema:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Čas zajema:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Pristranost osvetlitve:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Geografska širina GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Geografska dolžina GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Umetnik:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Avtorske pravice:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Program:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Razširjeni podatki"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Odstranjena bo oznaka \"%s\" iz %d fotografij. Ali želite nadaljevati?"
+msgstr[1] ""
+"Odstranjena bo oznaka \"%s\" iz %d fotografije. Ali želite nadaljevati?"
+msgstr[2] ""
+"Odstranjena bo oznaka \"%s\" iz %d fotografij. Ali želite nadaljevati?"
+msgstr[3] ""
+"Odstranjena bo oznaka \"%s\" iz %d fotografij. Ali želite nadaljevati?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Prekliči"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Izbriši"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "To bo odstranilo shranjeno iskanje \"%s\". Ali želite nadaljevati?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Zamenjava razvijalca bo razveljavila vse spremebe, ki ste jih na tej sliki "
+"naredili v Shotwellu"
+msgstr[1] ""
+"Zamenjava razvijalca bo razveljavila vse spremebe, ki ste jih na teh slikah "
+"naredili v Shotwellu"
+msgstr[2] ""
+"Zamenjava razvijalca bo razveljavila vse spremebe, ki ste jih na teh slikah "
+"naredili v Shotwellu"
+msgstr[3] ""
+"Zamenjava razvijalca bo razveljavila vse spremebe, ki ste jih na teh slikah "
+"naredili v Shotwellu"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Zamenjaj razvijalca"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Izvozi videoposnetek"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell ne more ustvariti datoteke za urejanje te fotografije, ker nimate "
+"dovoljenj za pisanje v %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Naslednje fotografije ni mogoče izvoziti zaradi napake datoteke.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Ali želite nadaljevati z izvažanjem?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Na_daljuj"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Nespremenjeno"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Trenutno"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Vrsta zapisa:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kakovost:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Omejitev _spremembe velikosti:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_točk"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Izvozi metapodatke"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Shrani podrobnosti..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Shrani podrobnosti"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(in %d več)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Uvozi poročilo o rezultatih"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Podvojene slike/videoposnetki niso uvoženi:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "Uvoz fotografij/videoposnetkov je spodletel zaradi napak fotoaparata:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "sporočilo napake:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Datoteke niso bile uvožene, ker niso bile prepoznane kot fotografije ali "
+"videoposnetki:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Fotografije/videoposnetki niso bili uvoženi, ker niso bili v zapisu, ki ga "
+"Shotwell razume:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Fotografije/videoposnetki niso bili uvoženi, ker jih Shotwell ni mogel "
+"kopirati v svojo knjižnico:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d podvojenih fotografij ni bilo uvoženih:\n"
+msgstr[1] "%d podvojena fotografija ni bila uvožena:\n"
+msgstr[2] "%d podvojeni fotografiji nista bili uvoženi:\n"
+msgstr[3] "%d podvojene fotografije niso bile uvožene:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d podvojenih videoposnetkov ni bilo uvoženih:\n"
+msgstr[1] "%d podvojen videoposnetek ni bil uvožen:\n"
+msgstr[2] "%d podvojena videoposnetka nista bila uvožena:\n"
+msgstr[3] "%d podvojeni videoposnetki niso bili uvoženi:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d podvojenih fotografij/videoposnetkov ni bilo uvoženih:\n"
+msgstr[1] "%d podvojena fotografija/videoposnetek ni bil uvožen:\n"
+msgstr[2] "%d podvojeni fotografiji/videoposnetka nista bila uvožena:\n"
+msgstr[3] "%d podvojene fotografije/videoposnetki niso bili uvoženi:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Uvoz %d fotografij je spodletel zaradi napake datoteke ali strojne opreme\n"
+msgstr[1] ""
+"Uvoz %d fotografije je spodletel zaradi napake datoteke ali strojne opreme:\n"
+msgstr[2] ""
+"Uvoz %d fotografij je spodletel zaradi napake datoteke ali strojne opreme:\n"
+msgstr[3] ""
+"Uvoz %d fotografij je spodletel zaradi napake datoteke ali strojne opreme:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Uvoz %d videoposnetkov je spodletel zaradi napake datoteke ali strojne "
+"opreme\n"
+msgstr[1] ""
+"Uvoz %d videoposnetka je spodletel zaradi napake datoteke ali strojne "
+"opreme:\n"
+msgstr[2] ""
+"Uvoz %d videoposnetkov je spodletel zaradi napake datoteke ali strojne "
+"opreme:\n"
+msgstr[3] ""
+"Uvoz %d videoposnetkov je spodletel zaradi napake datoteke ali strojne "
+"opreme:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake datoteke ali "
+"strojne opreme\n"
+msgstr[1] ""
+"Uvoz %d fotografije/videoposnetka je spodletel zaradi napake datoteke ali "
+"strojne opreme:\n"
+msgstr[2] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake datoteke ali "
+"strojne opreme:\n"
+msgstr[3] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake datoteke ali "
+"strojne opreme:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Uvoz %d datotek je spodletel zaradi napake datoteke ali strojne opreme\n"
+msgstr[1] ""
+"Uvoz %d datoteke je spodletel zaradi napake datoteke ali strojne opreme:\n"
+msgstr[2] ""
+"Uvoz %d datotek je spodletel zaradi napake datoteke ali strojne opreme:\n"
+msgstr[3] ""
+"Uvoz %d datotek je spodletel zaradi napake datoteke ali strojne opreme:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Uvoz %d fotografij je spodletel, ker v mapo knjižnice fotografij ni mogoče "
+"pisati:\n"
+msgstr[1] ""
+"Uvoz %d fotografije je spodletel, ker v mapo knjižnice fotografij ni mogoče "
+"pisati:\n"
+msgstr[2] ""
+"Uvoz %d fotografij je spodletel, ker v mapo knjižnice fotografij ni mogoče "
+"pisati:\n"
+msgstr[3] ""
+"Uvoz %d fotografij je spodletel, ker v mapo knjižnice fotografij ni mogoče "
+"pisati:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Uvoz %d videoposnetkov je spodletel, ker v mapo knjižnice fotografij ni bilo "
+"mogoče pisati:\n"
+msgstr[1] ""
+"Uvoz %d videoposnetka je spodletel, ker v mapo knjižnice fotografij ni bilo "
+"mogoče pisati:\n"
+msgstr[2] ""
+"Uvoz %d videoposnetkov je spodletel, ker v mapo knjižnice fotografij ni bilo "
+"mogoče pisati:\n"
+msgstr[3] ""
+"Uvoz %d videoposnetkov je spodletel, ker v mapo knjižnice fotografij ni bilo "
+"mogoče pisati:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel, ker v mapo knjižnice "
+"fotografij ni bilo mogoče pisati:\n"
+msgstr[1] ""
+"Uvoz %d fotografije/videoposnetka je spodletel, ker v mapo knjižnice "
+"fotografij ni bilo mogoče pisati:\n"
+msgstr[2] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel, ker v mapo knjižnice "
+"fotografij ni bilo mogoče pisati:\n"
+msgstr[3] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel, ker v mapo knjižnice "
+"fotografij ni bilo mogoče pisati:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Uvoz %d datotek je spodletel, ker v mapo knjižnice fotografij ni bilo mogoče "
+"pisati:\n"
+msgstr[1] ""
+"Uvoz %d datoteke je spodletel, ker v mapo knjižnice fotografij ni bilo "
+"mogoče pisati:\n"
+msgstr[2] ""
+"Uvoz %d datotek je spodletel, ker v mapo knjižnice fotografij ni bilo mogoče "
+"pisati:\n"
+msgstr[3] ""
+"Uvoz %d datotek je spodletel, ker v mapo knjižnice fotografij ni bilo mogoče "
+"pisati:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Uvoz %d fotografij je spodletel zaradi napake fotoaparata:\n"
+msgstr[1] "Uvoz %d fotografije je spodletel zaradi napake fotoaparata:\n"
+msgstr[2] "Uvoz %d fotografij je spodletel zaradi napake fotoaparata:\n"
+msgstr[3] "Uvoz %d fotografij je spodletel zaradi napake fotoaparata:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Uvoz %d videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+msgstr[1] "Uvoz %d videoposnetka je spodletel zaradi napake fotoaparata:\n"
+msgstr[2] "Uvoz %d videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+msgstr[3] "Uvoz %d videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+msgstr[1] ""
+"Uvoz %d fotografije/videoposnetka je spodletel zaradi napake fotoaparata:\n"
+msgstr[2] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+msgstr[3] ""
+"Uvoz %d fotografij/videoposnetkov je spodletel zaradi napake fotoaparata:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "Uvoz %d datotej je spodletel zaradi napake fotoaparata:\n"
+msgstr[1] "Uvoz %d datoteke je spodletel zaradi napake fotoaparata:\n"
+msgstr[2] "Uvoz %d datotek je spodletel zaradi napake fotoaparata:\n"
+msgstr[3] "Uvoz %d datotek je spodletel zaradi napake fotoaparata:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d nepodprtih fotografij je bilo izpuščenih:\n"
+msgstr[1] "%d nepodprta fotografija je izpuščena:\n"
+msgstr[2] "%d nepodprti fotografiji sta izpuščeni:\n"
+msgstr[3] "%d nepodprte fotografije so izpuščene:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d ne slikovnih datotek je izpuščenih.\n"
+msgstr[1] "%d ne slikovna datoteka je izpuščena.\n"
+msgstr[2] "%d ne slikovni datoteki sta izpuščeni.\n"
+msgstr[3] "%d ne slikovne datoteke so izpuščene.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d fotografij je izpuščenih zaradi preklica uporabnika:\n"
+msgstr[1] "%d fotografija je izpuščena zaradi preklica uporabnika:\n"
+msgstr[2] "%d fotografiji sta izpuščeni zaradi preklica uporabnika:\n"
+msgstr[3] "%d fotografije so izpuščene zaradi preklica uporabnika:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d videoposnetkov je bilo izpuščenih zaradi preklica uporabnika:\n"
+msgstr[1] "%d videoposnetek je bil izpuščen zaradi preklica uporabnika:\n"
+msgstr[2] "%d videoposnetka sta bila izpuščena zaradi preklica uporabnika:\n"
+msgstr[3] "%d videoposnetki so bili izpuščeni zaradi preklica uporabnika:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] ""
+"%d fotografij/videoposnetkov je bilo izpuščenih zaradi preklica uporabnika:\n"
+msgstr[1] ""
+"%d fotografija/videoposnetek je bil izpuščen zaradi preklica uporabnika:\n"
+msgstr[2] ""
+"%d fotografiji/videoposnetka sta bila izpuščena zaradi preklica uporabnika:\n"
+msgstr[3] ""
+"%d fotografije/videoposnetki so bili izpuščeni zaradi preklica uporabnika:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d datotek je bilo izpuščenih zaradi preklica uporabnika:\n"
+msgstr[1] "%d datoteka je bila izpuščena zaradi preklica uporabnika:\n"
+msgstr[2] "%d datoteki sta bili izpuščeni zaradi preklica uporabnika:\n"
+msgstr[3] "%d datoteke so bili preskočene zaradi preklica uporabnika:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d fotografij je uspešno uvoženih.\n"
+msgstr[1] "%d fotografija je uspešno uvožena.\n"
+msgstr[2] "%d fotografiji sta uspešno uvoženi.\n"
+msgstr[3] "%d fotografije so uspešno uvožene.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d videoposnetkov je bilo uspešno uvoženih.\n"
+msgstr[1] "%d videoposnetek je bil uspešno uvožen.\n"
+msgstr[2] "%d videoposnetka sta bila uspešno uvožena.\n"
+msgstr[3] "%d videoposnetkov so bili uspešno uvoženi.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d fotografij/videoposnetkov je bilo uspešno uvoženih.\n"
+msgstr[1] "%d fotografija/videoposnetek je bil uspešno uvožen.\n"
+msgstr[2] "%d fotografiji/videoposnetka sta uspešno uvožena.\n"
+msgstr[3] "%d fotografije/videoposnetki so bili uspešno uvoženi.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Fotografije ali videoposnetki niso bili uvoženi.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Uvoz je končan"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunda"
+msgstr[2] "%d sekundi"
+msgstr[3] "%d sekunde"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minuta"
+msgstr[2] "%d minuti"
+msgstr[3] "%d minute"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ur"
+msgstr[1] "%d ura"
+msgstr[2] "%d uri"
+msgstr[3] "%d ure"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 dan"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Preimenuj dogodek"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Ime:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Uredi naslov"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Premakni več datotek v smeti"
+msgstr[1] "_Premakni datoteko v smeti"
+msgstr[2] "_Premakni datoteki v smeti"
+msgstr[3] "_Premakni datoteke v smeti"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Le _odstrani"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Ali želite povrniti zunanje urejanje?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Ali želite povrniti zunanja urejanja?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"To bo uničilo vse spremembe narejene na %d zunanjih datotekah. Ali želite "
+"nadaljevati?"
+msgstr[1] ""
+"To bo uničilo vse spremembe narejene na %d zunanji datoteki. Ali želite "
+"nadaljevati?"
+msgstr[2] ""
+"To bo uničilo vse spremembe narejene na %d zunanjih datotekah. Ali želite "
+"nadaljevati?"
+msgstr[3] ""
+"To bo uničilo vse spremembe narejene na %d zunanjih datotekah. Ali želite "
+"nadaljevati?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Po_vrni zunanje urejanje"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Po_vrni več zunanjih urejanj"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+"To bo odstranilo %d fotografij iz knjižnice. Ali naj program nadaljuje?"
+msgstr[1] ""
+"To bo odstranilo %d fotografijo iz knjižnice. Ali naj program nadaljuje?"
+msgstr[2] ""
+"To bo odstranilo %d fotografiji iz knjižnice. Ali naj program nadaljuje?"
+msgstr[3] ""
+"To bo odstranilo %d fotografije iz knjižnice. Ali naj program nadaljuje?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Odstrani"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Odstrani fotografijo iz knjižnice"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Odstrani fotografije iz knjižnice"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "DOP"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "POP"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 urna"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Zamakni fotografije/videoposnetke za enako količino"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Nastavi _vse fotografije/videoposnetke na ta čas"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Spremeni originalno datoteko slike"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Spremeni originalne datoteke slik"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Spremeni izvirno datoteko"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Spremeni izvirne datoteke"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Izvirno:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y, %H.%M.%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y, %H.%M.%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Čas osvetlitve bo premaknjen naprej za\n"
+"%d %s, %d %s, %d %s in %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Čas osvetlitve bo premaknjen nazaj za\n"
+"%d %s, %d %s, %d %s in %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dni"
+msgstr[1] "dan"
+msgstr[2] "dni"
+msgstr[3] "dni"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ur"
+msgstr[1] "ura"
+msgstr[2] "uri"
+msgstr[3] "ure"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuta"
+msgstr[2] "minuti"
+msgstr[3] "minute"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekund"
+msgstr[1] "sekunda"
+msgstr[2] "sekundi"
+msgstr[3] "sekunde"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"In %d drugih."
+msgstr[1] ""
+"\n"
+"\n"
+"In %d druga."
+msgstr[2] ""
+"\n"
+"\n"
+"In %d drugi."
+msgstr[3] ""
+"\n"
+"\n"
+"In %d druge."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Oznake (ločene z vejicami):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Dobrodošli!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Dobrodošli v Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Za začetek uvozite fotografije na enega od naslednjih načinov:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Izberite <span weight=\"bold\">Datoteka %s Uvozi iz mape</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Povlecite in spustite fotografije na okno Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Povežite fotoaparat s svojim računalnikom in uvozite fotografije"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Uvozi fotografije iz mape %s"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Fotografije lahko uvozite tudi na enega od naslednjih načinov:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Sporočila ne pokaži več"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Uvozi fotografije iz vaše knjižnice %s"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Pomoč)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Leto%sMesec%sDan"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Leto%sMesec"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Leto%sMesec-Dan"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Leto-Mesec-Dan"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Po meri"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Neveljaven vzorec"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell lahko kopira ali premakne fotografije v mapo vaše knjižnice, ali pa "
+"jih uvozi brez kopiranja."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Kopiraj fotografije"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Uvozi na mesto"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Uvozi v knjižnico"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Odstrani iz knjižnice"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Odstranjevanje fotografije iz knjižnice"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Odstranjevanje fotografij iz knjižnice"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Odstranjenih bo %d fotografij/videoposnetkov iz vaše knjižnice Shotwell. Ali "
+"želite datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[1] ""
+"Odstranjena bo %d fotografija/videoposnetek iz vaše knjižnice Shotwell. Ali "
+"želite datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[2] ""
+"Odstranjeni bosta %d fotografiji/videoposnetka iz vaše knjižnice Shotwell. "
+"Ali želite datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[3] ""
+"Odstranjene bodo %d fotografije/videoposnetki iz vaše knjižnice Shotwell. "
+"Ali želite datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Odstranjenih bo %d videoposnetkov iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[1] ""
+"Odstranjena bo %d videoposnetkov iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[2] ""
+"Odstranjeni bosta %d videoposnetka iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[3] ""
+"Odstranjeni bodo %d videoposnetki iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Odstranjenih bo %d fotografij iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[1] ""
+"Odstranjena bo %d fotografija iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[2] ""
+"Odstranjeni bosta %d fotografiji iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+msgstr[3] ""
+"Odstranjene bodo %d fotografije iz vaše knjižnice Shotwell. Ali želite "
+"datoteke tudi premakniti v smeti svojega namizja?\n"
+"\n"
+"Tega dejanja ni mogoče razveljaviti."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d fotografij/videoposnetkov ni mogoče premakniti v smeti namizja. Ali "
+"želite te datoteke izbrisati?"
+msgstr[1] ""
+"%d fotografije/videoposnetka ni mogoče premakniti v smeti namizja. Ali "
+"želite to datoteko izbrisati?"
+msgstr[2] ""
+"%d fotografij/videoposnetkov ni mogoče premakniti v smeti namizja. Ali "
+"želite ti datoteki izbrisati?"
+msgstr[3] ""
+"%d fotografij/videoposnetkov ni mogoče premakniti v smeti namizja. Ali "
+"želite te datoteke izbrisati?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d fotografij/videoposnetkov ni mogoče izbrisati."
+msgstr[1] "%d fotografije/videoposnetka ni mogoče izbrisati."
+msgstr[2] "%d fotografij/videoposnetkov ni mogoče izbrisati."
+msgstr[3] "%d fotografij/videoposnetkov ni mogoče izbrisati."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Mape"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Oznake"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Uspešno"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Napaka datoteke"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Datoteke ni mogoče dekodirati"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Napaka podatkovne zbirke"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Uporabnik je preklical uvoz"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Ni datoteka"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Datoteka že obstaja v podatkovni zbirki"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Nepodprta vrsta datoteke"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Ni slikovna datoteka"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Okvara diska"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk je poln"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Napaka fotoaparata"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Napaka zapisovanja datoteke"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Uvoz je spodletel (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "spremenjeno"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Predhodna fotografija"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Naslednja fotografija"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Izvirna datoteka fotografije manjka: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Pogled"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "O_rodja"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Predhodna fotografija"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Predhodna fotografija"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Naslednja fotografija"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Naslednja fotografija"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Približaj"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Poveča povečavo fotografije"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "O_ddalji"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Zmanjša povečavo fotografije"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Prilagodi _strani"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Približa fotografijo do prileganja zaslonu"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Povečava _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Približa fotografijo na 100% povečavo"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Povečava _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Približa fotografijo na 200% povečavo"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Razvijalec"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s ni mogoče izvoziti: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Podatkovna zbirka %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Uvažanje iz %s se ne more nadaljevati, ker je prišlo do napake:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Za poskus uvoza iz druge storitve jo izberite iz zgornjega menija."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Uvozi podatkov"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Vstavki za uvoz podatkov niso omogočeni.\n"
+"\n"
+"Za uporabo zmožnosti Uvoz iz programa morate imeti omogočen vsaj en vstavek "
+"uvoza podatkov. Vstavke lahko omogočite v pogovornem oknu Možnosti."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Datoteka podatkovne zbirke:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Uvozi"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Uvozi iz programa"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Uvozi predstavnost _iz:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Zapri"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Nastavitve"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Diapredstavitev"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Nazaj"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Skoči na predhodno fotografijo"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Premor"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Naredi premor diapredstavitve"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Naslednja"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Skoči na naslednjo fotografijo"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Spremeni nastavitve diapredstavitve"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Manjkajo vse izvorne datoteke fotografije."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Predvajaj"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Nadaljuj z diapredstavitvijo"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Povrnitev"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Razveljavljanje povrnitve"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Izboljševanje"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Razveljavljanje izboljšanja"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Ustvarjanje novega dogodka"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Odstranjevanje dogodka"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Premikanje fotografij na nov dogodek"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Nastavljanje fotografij na predhodni dogodek"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Združevanje"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Odstrani združitev"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Podvajanje fotografij"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Odstranjevanje podvojenih fotografij"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "%d fotografij ni mogoče podvojiti zaradi napak datotek"
+msgstr[1] "%d fotografije ni mogoče podvojiti zaradi napake datoteke"
+msgstr[2] "%d fotografij ni mogoče podvojiti zaradi napak datotek"
+msgstr[3] "%d fotografij ni mogoče podvojiti zaradi napak datotek"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Obnavljanje predhodnih ocen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Povečanje ocen"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Zmanjšanje ocen"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Nastavljanje razvijalca RAW"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Obnavljanje predhodnega razvijalca RAW"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Nastavi razvijalec"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Izvirne fotografije ni mogoče prilagoditi."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Prilagajanje datuma in časa"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Razveljavljanje prilagoditve datuma in časa"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Naslednjih izvirnih fotografij ni mogoče prilagoditi."
+msgstr[1] "Ene izvirne fotografije ni mogoče prilagoditi."
+msgstr[2] "Dveh izvirnih fotografij ni mogoče prilagoditi."
+msgstr[3] "Treh izvirnih fotografij ni mogoče prilagoditi."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Napaka prilagoditve časa"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Prilagoditev časa ni mogoče uveljaviti na naslednjih slikovnih datotekah."
+msgstr[1] ""
+"Prilagoditev časa ni mogoče uveljaviti na naslednji slikovni datoteki."
+msgstr[2] ""
+"Prilagoditev časa ni mogoče uveljaviti na naslednjih slikovnih datotekah."
+msgstr[3] ""
+"Prilagoditev časa ni mogoče uveljaviti na naslednjih slikovnih datotekah."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Ustvari oznako"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Premakni oznako \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Premakni fotografije v smeti"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Obnovi fotografije iz smeti"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Premakni fotografije v smeti Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Obnovi fotografije nazaj v knjižnico Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Premikanje fotografij v smeti"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Obnavljanje fotografij iz smeti"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Označi izbrane fotografije z zastavicami"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Odstrani zastavice izbranih fotografij"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Označi z zastavico"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Odstrani zastavico"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Nizka (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Srednja (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Visoka (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Največja (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Ni fotografij/videov"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Ni najdenih fotografij/videov"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotografij ni mogoče izvoziti v to mapo."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Ni mogoče obdelati posodobitev nadziranja: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Zapolni celotno stran"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 sliki na stran"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 slike na stran"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 slik na stran"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "6 slik na stran"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 slik na stran"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 slik na stran"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "palcev"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Denarnica (2 x 3 palce)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Beležka (3 x 5 palcev)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 palcev"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 palcev"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 palcev"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 palcev"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 palcev"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrična denarnica (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Razglednica (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Nastavitve slike"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Tiskanje ..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Fotografije ni mogoče natisniti:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Ni mogoče odpreti/ustvariti podatkovne zbirke fotografij %s: koda napake %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Datoteke podatkovne zbirke fotografij ni mogoče zapisati:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Napaka med dostopom do datoteke podatkovne zbirke:\n"
+" %s\n"
+"\n"
+"Napaka je bila: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Izvozi videoposnetke"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Ni mogoče zagnati Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Pošlji na"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Ozadja ni mogoče izvoziti v %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Ni mogoče pripraviti diapredstavitve namizja: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Z zastavico"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Smeti"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Smeti so prazne"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Izbriši"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Brisanje fotografij"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Manjkajoče datoteke"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Brisanje ..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Zadnji uvoz"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Uvozi iz mape ..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Uvozi fotografije iz diska v knjižnico"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Uvozi iz _programa ..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Razvrsti _dogodke"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "_Izprazni smeti"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Izbriše vse fotografije v smeteh"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Oglej si dogo_dek za fotografijo"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Poišči"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Najdi fotografije in videoposnetke po iskalnih kriterijih"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Datoteka"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Uredi"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotografija"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotografije"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Dogod_ki"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "Ozna_ke"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "Pomo_č"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Osnovni podatki"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Pokaže osnovne podatke za izbiro"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "R_azširjeni podatki"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Pokaže razširjene podatke za izbiro"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Iskalna vrstica"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Pokaži iskalno vrstico"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "N_araščajoče"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Razvrsti fotografije v naraščajočem vrstnem redu"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Padajoče"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Razvrsti fotografije v padajočem vrstnem redu"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Uvozi iz mape"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Izprazni smeti"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Praznjenje smeti ..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell je nastavljen, da uvozi vaše fotografije v vašo domačo mapo.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Mesto knjižnice"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Iz te mape ni mogoče uvoziti fotografij."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Posodabljanje knjižnice ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Pripravljanje na samodejen uvoz fotografij ..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Samodejno uvažanje fotografij ..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Zapisovanje metapodatkov v datoteke ..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Knjižnica"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Uvažanje ..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Zaustavi uvoz"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Zaustavi uvažanje fotografij"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Pripravljanje na uvoz ..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Uvoženo %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Shrani"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Shrani fotografijo"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Shrani _kot ..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Shrani fotografijo pod drugim imenom"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Natisne fotografijo s tiskalnikom povezanim z vašim računalnikom"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ne obstaja."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ni datoteka."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ne podpira vrste datoteke\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Shrani kopijo"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Zavrzi spremembe %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Zapri _brez shranjevanja"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Napaka med shranjevanjem v: %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Shrani kot"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Ni mogoče opazovati %s: Ni mapa (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Upravljalnik fotografij"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Pregledovalnik fotografij"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Avtorske pravice 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Zavrti _desno"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Zavrti"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Zavrti desno"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Zavrti fotografije desno (pritisnite Ctrl za vrtenje levo)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Zavrti _levo"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Zavrti levo"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Zavrti fotografije levo"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Zrcali vo_doravno"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Zrcali vodoravno"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Zrcali _navpično"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Zrcali navpično"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Izboljšaj"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Izboljšaj"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Samodejno izboljša videz fotografije"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Obreži"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Obreži"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Obreži velikost fotografije"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Poravnaj"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Poravnava"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Poravnaj fotografijo"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Rdeče oči"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Popravek rdečih oči"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Zmanjša ali odstrani učinek rdečih oči na fotografiji"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Prilagodi"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Prilagodi"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Prilagodi barvo in ton fotografije"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Po_vrni na izvirnik"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Povrni na izvirnik"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Povrni zunanja urej_anja"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Povrni na glavno fotografijo"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Slika kot _ozadje namizja"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Nastavi izbrano sliko za novo ozadje namizja"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Nastavi kot _diapredstavitev namizja ..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Razveljavi"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Razveljavi"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Uveljavi"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Uveljavi"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Pr_eimenuj dogodek ..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Uporabi fotografijo za _naslovnico dogodka"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Uporabi fotografijo za naslovnico dogodka"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Nov dogodek"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Nov dogodek"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Premakni fotografije"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Premakni fotografije na dogodek"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Združi dogodke"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Združi"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Združi dogodke v en dogodek"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "Nastavi _oceno"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Nastavi oceno"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Spremeni oceno vaše fotografije"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Povečaj"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Povečaj oceno"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Zmanjšaj"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Zmanjšaj oceno"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Neocenjeno"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Neocenjeno"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Oceni kot neocenjeno"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Nastavljanje kot neocenjeno"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Odstrani vse ocene"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Zavrnjeno"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Zavrnjeno"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Oceni kot zavrnjeno"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Nastavljanje kot zavrnjeno"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Nastavi oceno kot zavrnjeno"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Le zavrnjene"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Le zavrnjene"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Pokaži le zavrnjene fotografije"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Vse in _zavrnjene"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Pokaži vse fotografije vključno z zavrnjenimi"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Vse fotografije"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Prikaže vse fotografije"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Ocene"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Prikaže ocene vsake fotografije"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtriraj fotografije"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrira fotografije"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Omeji število prikazanih fotografij na osnovi filtra"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "Po_dvoji"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Podvoji"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Ustvari dvojnik fotografije"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Izvozi ..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Na_tisni ..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "O_bjavi ..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Objavi"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Objavi na različnih spletnih straneh"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Uradi _naslov ..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Uredi _komentar..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Uredi komentar"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Prilagodi datum in čas ..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Prilagodi datum in čas"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Dodaj _oznake ..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Dodaj oznake"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Dodajanje oznak"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Možnosti"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Odpri z _zunanjim urejevalnikom"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Odpri z urejevalnikom R_AW"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Pošlji _na ..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "_Pošlji..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Najdi ..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Najdi"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Najdite sliko z vnosom besedila, ki se pojavi v njenem imenu ali oznakah"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "Označi z_zastavico"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Odstrani _zastavico"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Ni mogoče zagnati urejevalnika: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Dodaj oznako \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Dodaj oznaki \"%s\" in \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Izbriši oznako \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Izbriše oznako \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Izbriše oznako"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Novo"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Preime_nuj oznako \"%s\" ..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Preimenuj oznako \"%s\" v \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "P_reimenuj ..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Sp_remeni oznake ..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Spremeni oznake"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Označi fotografijo kot \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Označi fotografije kot \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Označi izbrano fotografijo kot \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Označi izbrane fotografije kot \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Odstrani oznako \"%s\" iz _fotografije"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Odstrani oznako \"%s\" iz _fotografij"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Odstrani oznako \"%s\" iz fotografije"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Odstrani oznako \"%s\" iz fotografij"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Oznake ni mogoče preimenovati v \"%s\", ker oznaka že obstaja."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "Iskanja ni mogoče preimenovati v \"%s\", ker iskanje že obstaja."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Shranjeno iskanje"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Izbriši iskanje"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Uredi ..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Preime_nuj ..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Preimenuje iskanje \"%s\" v \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Izbriši iskanje \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Ocena %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Nastavi oceno na %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Nastavljanje ocene na %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Prikaži %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Pokaži le fotografije z oceno %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s ali boljše"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Prikaže %s ali boljše"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Pokaži le fotografije z oceno %s ali boljšo"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Odstrani izbrane fotografije iz smeti"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Odstrani izbrane fotografije iz knjižnice"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Obnovi"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Premakne izbrane fotografije nazaj v knjižnico"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Pokaži v upravljalniku da_totek"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Odpre mapo izbrane fotografije v upravljalniku datotek"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Ni mogoče odpreti v upravljalniku datotek: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "O_dstrani iz knjižnice"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Premakni v smeti"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Izberi _vse"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Izberi vse predmete"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a, %d.%m.%Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%d.%m."
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d.%m. %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Kot:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Ponastavi"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Vrni se na trenutne mere fotografije"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Nastavi obrez za to fotografijo"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Pripni okvir za obrezovanje na sliko med pokončno in ležečo postavitvijo "
+"strani"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Brez omejitev"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Kvadrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Zaslon"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Izvirna velikost"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Pismo (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Zapri orodje rdečih oči"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Odstrani morebitne učinke rdečih oči v izbranemu področju"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Nasičenost:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Črnilo:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Temperatura:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Sence:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Ponastavi barve"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Ponastavi vse prilagoditve barve na izvirno"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Temperatura"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Črnilo"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Nasičenost"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Osvetljenost"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Sence"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Razširitev kontrasta"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Pripni orodno vrstico"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Pripni odprto orodno vrstico"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Zapusti celozaslonski način"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Zapusti celozaslonski način"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Končaj"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_O programu"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Celozaslonski način"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Vsebina"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Pogosto zastavljena vprašanja"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Prijavi težavo..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Med dostopanjem do knjižnice Shotwell je prišlo do napake. Shotwell ne more "
+"nadaljevati.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Obišči spletišče Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Andrej Žnidaršič <andrej.znidarsic@ubuntu.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Ni mogoče prikazati pomoči: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Navigacija do podatkovne baze hroščev ni mogoča: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Ni mogoče prikazati pogosto zastavljenih vprašanj: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "neimenovano"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Izvirna velikost"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Višina ali širina"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Širina"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Višina"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Prilagodi velikost sličic"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Poveča povečavo sličic"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Zmanjša povečavo sličic"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Razvrsti _fotografije"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Predvajaj videoposnetek"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Odpre izbrane videoposnetke v sistemskemu predvajalniku videoposnetkov"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Komentarji"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Prikaži komentar vsake fotografije"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Prikaže oznake vsake fotografije"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Po _naslovu"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Razvrsti fotografije po naslovu"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Po _datumu zajema"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Razvrsti fotografije po datumu zajema"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Po _oceni"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Razvrsti fotografije po oceni"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell ni mogel predvajati izbranega videoposnetka:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d fotografij/videoposnetkov"
+msgstr[1] "%d fotografija/videoposnetk"
+msgstr[2] "%d fotografiji/videoposnetka"
+msgstr[3] "%d fotografije/videoposnetki"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Ni dogodkov"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Ni najdenih dogodkov"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Dogodki"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Brez datuma"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Brez dogodka"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Predpomnilniške mape %s ni mogoče kreirati: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Ni mogoče ustvariti mape podatkov %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Slike"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Ni mogoče ustvariti začasne mape %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Ni mogoče ustvariti podmape podatkov %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Brez)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Brez"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Naključno"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Prehodi predstavitve"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Ni mogoče ustvariti začasne datoteke za %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Izvažanje"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Datoteka %s že obstaja. Ali naj se zamenja?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Pre_skoči"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Zamenjaj"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Zamenjaj _vse"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Izvozi"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotografije"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videoposnetki"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Fotografije RAW"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Fotografije RAW"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Napaka med nalaganjem uporabniškega vmesnika datoteke %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Vrsta"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Objavljanje"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Izbrane fotografije/videoposnetki so bili uspešno objavljeni."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Izbrani videoposnetki so bili uspešno objavljeni."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Izbrane fotografije so bile uspešno objavljene."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Izbrani video je bil uspešno objavljen."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Izbrana fotografija je bila uspešno objavljena."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Pridobivanje podrobnosti računa ..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Prijavljanje ..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Objavi fotografije"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Objavi fotografije _na:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Objavi videoposnetke"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Objavi videoposnetke _na"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Objavi fotografije in videoposnetke"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Objavi fotografije in videoposnetke _na"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Ni mogoče objaviti"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell ne more objaviti izbranih elementov, ker nima vključenega "
+"združljivega vtičnika za objavljanje. To popravite tako, da izberete "
+"<b>Uredi %s nastavitve</b> in vključite enega ali več vičnikov za "
+"objavljanje v zavihku <b>Vtičniki</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Pripravljanje na pošiljanje"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Pošiljanje %d od %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Objavljanja na %s ni mogoče nadaljevati, ker je prišlo do napake:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Poskusite objaviti na drugo storitev, ki jo izberete iz zgornjega menija."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Nova _oznaka ..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Začasne datoteke za potrebne za objavo ni na voljo"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Trenutno niste prijavljeni v YouTube.\n"
+"\n"
+"Za nadaljevanje morate imeti račun Google nastavljen za uporabo z YouTube. "
+"Večino računov lahko nastavite z vsaj eno prijavo na YouTube s spletnim "
+"brskalnikom."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Datoteka potrebna za objavo ni na voljo. Objave na Youtube ni mogoče "
+"nadaljevati."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "V YouTube ste prijavljeni kot %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videi se bodo pojavili v '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Javno na seznamu"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Javno a ne na seznamu"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Zasebno"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Jedrne storitve objavljanja"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Trenutno niste prijavljeni v Flickr.\n"
+"\n"
+"Kliknite prijava za prijavo v Flickr s spletnim brskalnikom. Shotwell "
+"Connect boste morali overiti za povezavo z računom Flickr."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Med to sejo Shotwell ste se že prijavili in odjavili iz Flickr.\n"
+"Za nadaljevanje objavljanja na FIickr končajte in ponovno zaženite Shotwell "
+"in z objavo poskusite ponovno."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Pripravljanje na prijavo ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Datoteka potrebna za objavo ni na voljo. Objave na Flickr ni mogoče "
+"nadaljevati."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Potrjevanje overitve ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"V Flickr ste prijavljeni kot %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Vaš brezplačni račun Flickr omejuje količino podatkov, ki jo lahko pošljete "
+"na mesec.\n"
+"Ta mesec vam do porabe omejitve ostaja še %d megabajtov."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Vaš račun Flickr Pro vam dovoljuje neomejeno pošiljanje."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotografije so _vidne:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videoposnetki so _vidni:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotografije in videoposnetki so _vidni:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Vsem"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Le prijateljem in moji družini"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Samo družina"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Samo prijatelji"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Samo meni"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 pixlov"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 pixlov"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 točk"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 točk"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Ustvarjanje albuma %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Vpišite URL vaše Piwigo slikovne knjižnice skupaj z uporabniškim imenom in "
+"geslom povezanim za vašim Piwigo računom za to knjižnico."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell ne more kontaktirati vaše Piwigo slikovne knjižnice. Prosimo "
+"preverite URL, ki ste ga vnesli."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Uporabniško ime in/ali geslo sta napačna. Prosimo poskusite ponovno."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Napačen URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Napačno uporabniško ime ali geslo"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Povezava Shotwell"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratorji, družina, prijatelji, kontakti"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratorji, družina, prijatelji"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratorji, družina"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratorji"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Trenutno niste prijavljeni v Picasa Web Albums.\n"
+"\n"
+"Kliknite Prijava za prijavo v Picasa Web Albums v vašem spletnem brskalniku. "
+"Morali boste dovoliti Shotwell Connect za povezavo z vašim Picasa Web Albums "
+"računom."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Datoteka potrebna za objavo ni na voljo. Objave na Picasa ni mogoče "
+"nadaljevati."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Ustvarjanje albuma ..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Prijavljeni ste v spletne albume Picasa kot %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video se bo pojavil v:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotografije se bodo pojavile v:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Majhna (640 x 480 točk)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Srednja (1024 x 768 točk)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Priporočena ( 1600 x 1200 točk)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Trenutno niste prijavljeni v Facebook.\n"
+"\n"
+"V primeru da nimate računa Facebook ga lahko ustvarite med opravilom "
+"prijave. Med prijavo vas lahko Povezava Shotwell vpraša za dovoljenje za "
+"pošiljanje fotografij in objavo na vaš vir. Povezava Shotwell ta dovoljenja "
+"potrebuje za delovanje."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Med to sejo Shotwell ste se že prijavili in odjavili iz Facebook.\n"
+"Za nadaljevanje objavljanja na Facebook končajte in ponovno zaženite "
+"Shotwell in ponovno poskusite z objavo."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standardna (720 točk)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Velika (2048 točk)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Preizkušanje povezave s Facebook ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Datoteka potrebna za objavo ni na voljo. Objave na Facebook ni mogoče "
+"nadaljevati."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"V Facebook ste prijavljeni kot %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Kje želite objaviti izbrane fotografije?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Velikost pošiljanja: "
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Prijatelji"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Zdrobi"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Šah"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Krogi"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Roleta"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Črte"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Ura"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Krog"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Jedri prehodi predstavite v"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"Avtorske pravice 2010 Maxim Karatshev, Avtorske pravice 2011-2013 Yorba "
+"Foudnation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Drsenje"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Pojemanje"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Kvadrati"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Glaven servis za uvoz podatkov"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Dobrodošli v servis za uvoz F-Spot knjižnice.\n"
+"\n"
+"Prosimo izberite knjižnjico za uvoz tako, da izberete eno od obstoječih "
+"knjižnjic, ki jih je našel Shotwell ali tako, da izberete alternativno "
+"datoteko F-Spot podatkovne baze."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Dobrodošli v servis za uvoz F-Spot knjižnice.\n"
+"\n"
+"Prosimo izberite datoteko F-Spot podatkovne baze."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Ročno izberite datoteko F-Spot podatkovne baze za uvoz:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Izbrane datoteke F-Spot podatkovne baze ni mogoče odpreti: datoteka ne "
+"obstaja ali pa ni F-Spot podatkovna baza"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Izbrane datoteke F-Spot podatkovne baze ni mogoče odpreti: Shotwell ne "
+"podpira te različice F-Spot podatkovne baze "
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Izbrane datoteke F-Spot podatkovne baze ni mogoče prebrati: napaka pri "
+"branju tabele oznak"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Izbrane datoteke F-Spot podatkovne baze ni mogoče prebrati: napaka pri "
+"branju tabele slik"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell je našel %d slik v F-Spot knjižnici in jih trenutno uvaža. Dvojniki "
+"bodo avtomatično zaznani ter odstranjeni.\n"
+"\n"
+"To pogovorno okno lahko zaprete in začnete uporabljati Shotwell medtem pa se "
+"bo uvažanje odvijalo v ozadju."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot knjižnica: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Pripravljanje na uvoz"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Nastavi kot diapredstavitev namizja"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Ustvari diapredstavitev ozadja namizje"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Pokaži vsako fotografijo za"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "časovno obdobje"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Kako dolgo je vsaka fotografija prikazana v ozadju namizja"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Iskanje"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Ime iskanja:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Ujemanje"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "od naslednjih:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Natisnjena velikost slike</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Uporabi _običajno velikost pisave:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Uporabi velikost pisave po _meri:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Ujemanje razmerja stranic fotografije"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Samodejna velikost"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Naslovi</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Natisni _naslov slike"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Ločljivost v pikslih</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Izvozi fotografijo na:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "točk na palec"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "oznaka"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Možnosti Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "bela"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "črna"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Opazuj mapo knjižnice za nove datoteke"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metapodatki"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Zapiši oznake, naslov in druge _metapodatke v datoteke fotografij"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Zaslon"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Uvozi fotografije v:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Ozadje:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Uvažanje"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Struktura map:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Vzorec:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Primer:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "P_reimenuj uvožene datoteke v male črke"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "Razvijalec RAW"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Privzeto:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Z_unanji urejevalnik fotografij:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Zunanji urejevalnik _RAW:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Zunanji urejevalniki"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Vstavki"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Zamik:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "Učinek _prehoda:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Za_mik prehoda:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Pokaži _naslov"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekund"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Prijava"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Objavi v o_bstoječi album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Ustvari _nov album z imenom:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videoposnetki in novi albumi fotografij so _vidni:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Odjava"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "O_bjavi"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Vnesite potrditveno število, ki se pojavi po prijavi v Flickr s spletnem "
+"brskalnikom. "
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "Overitveno _število:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_Velikost slike:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Obstoječemu albumu:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Novemu albumu z imenom:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Pokaži album v javni galeriji"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Predložena _velikost slike:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL vaše knjižnice fotografij Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Uporabniško _ime"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Geslo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Zapomni si geslo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Prijava"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Obstoječi kategoriji:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Fotografije bodo lahko _videli:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Velikost fotografije:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Odjava"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Nastavitve _zasebnosti videoposnetkov: "
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Avtorske pravice 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixels"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' ni veljaven odziv na OAuth zahtevo za avtentikacijo"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): ni mogoče zagnati; tega objavljalnika ni mogoče "
+"ponovno zagnati."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Vpišite uporabniško ime in geslo povezano z vašim Tumblr računom."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI ni mogoče naložiti: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"V Tumblr ste prijavljeni kot %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Avtorske pravice 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Obiščite speltišeč Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Trenutno niste prijavljeni v Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Epoštni naslov"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"V Tumblr ste prijavljeni kot (ime).\n"
+"\n"
+"(besedilo te oznake polni in nastavlja znotraj kode, \n"
+"zato spremembe narejene tukaj ne bodo vidne)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Blogi:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albumi (ali napišite nove):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Vrsta dostopa:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Onemogoči _komentarje"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Prepovej prejem izvirne fotografije"
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..234c97d
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,4678 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Mitko Krstev <m.krstev@hotmail.com>, 2011
+# Nikola Radovanović <nrad@eunet.rs>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Nikola Radovanović <nrad@eunet.rs>, 2011-2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Nikola Radovanović <nrad@eunet.rs>\n"
+"Language-Team: Serbian (http://www.transifex.com/projects/p/shotwell/"
+"language/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Догађај %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Фотоапарати"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Фотоапарат"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Неуспешно демонтирање фотоапарата. Пробајте да је демонтирате преко "
+"разгледача датотека."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Сакри слике које су већ увежене"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Прикажи само слике које нису увежене"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Започињем увоз, молим сачекајте ..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Наслови"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Прикажи називе слика"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Увези _изабрано"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Смешта изабране слике вашу збирку слика"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Увези _све"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Увози све слике вашу збирку слика"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Фото-бунар мора да демонтира фотоапарат са система како би му приступио. Да "
+"ли желите да наставите?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Демонтирај"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Молим Вас демонтирајте фотоапарат."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Фотоапарат користи неки други програм. Морате затворити тај програм како би "
+"омогућили Фото-бунару да му приступи."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Молим вас затворите све друге програме који користе фотоапарат."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Неуспешно преузимање прегледа слика са фотоапарата:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Демонтирам..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Преузимам податке о слици"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Преузимам изглед слике %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Не могу да закључам фотоапарат: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Избриши %d слику са фотоапарата?"
+msgstr[1] "Избриши %d слике са фотоапарата?"
+msgstr[2] "Избриши %d слика са фотоапарата?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Избриши %d видео снимак са фотоапарата?"
+msgstr[1] "Избриши %d видео снимка са фотоапарата?"
+msgstr[2] "Избриши %d видео снимака са фотоапарата?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Избриши %d фотографију/видео снимак са фотоапарата?"
+msgstr[1] "Избриши %d фотографије/видео снимка са фотоапарата?"
+msgstr[2] "Избриши %d фотографија/видео снимака са фотоапарата?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Избриши %d датотеку са фотоапарата?"
+msgstr[1] "Избриши %d датотеке са фотоапарата?"
+msgstr[2] "Избриши %d датотека са фотоапарата?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Задржи"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Уклањам фотографије/видео снимке са фотоапарата"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Нисам успео да избришем %d фотографију/видео снимак са фотоапарата, услед "
+"грешке."
+msgstr[1] ""
+"Нисам успео да избришем %d фотографије/видео снимка са фотоапарата, услед "
+"грешке."
+msgstr[2] ""
+"Нисам успео да избришем %d фотографија/видео снимака са фотоапарата, услед "
+"грешке."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Покретни приказ"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Започиње покретни приказ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Извоз фотографија/видеа снимака"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Извези фотографије/видео"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Извоз фотографија"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Извези слике"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Окрећем"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Ротирам назад"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Изврћем по вертикали"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Поништавам извртање по вертикали"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Изврћем по вертикали"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Поништавам извртање по вертикали"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Било који текст"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Наслов"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Ознака"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Назив догађаја"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Назив датотеке"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Тип медија"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Врста ознаке"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Оцена"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Датум"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "садржи"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "је тачно"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "почиње са"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "завршава се са"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "не садржи"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "није подешен"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "јесте"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "није"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "фотографија"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "raw фотографија"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "видео"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "означена"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "неозначена"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "и више"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "само"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "и ниже"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "после"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "пре"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "између"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "и"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "било која"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "све"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ништа"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Сачуване претраге"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Но_ва сачувана претрага..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Ваша збирка слика није компатибилна са овом верзијом Фото-бунара. Формирана "
+"је од Фото-бунара %s (издање %d). Тренутна верзија је %s (издање %d). "
+"Молим да увек користите најновију верзију Фото-бунара."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Фото-бунар није успео да унапреди вашу збирку слика са верзије %s (издање "
+"%d) на %s (издање %d). За више података посетите Фото-бунар Вики на %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Ваша збирка слика није компатибилна са овом верзијом Фото-бунара. Формирана "
+"је од Фото-бунара %s (издање %d). Тренутна верзија је %s (издање %d). "
+"Молим избришите вашу збирку слика, брисањем датотеке %s, а затим поново "
+"увезите слике."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"Појавила се непозната грешка приликом покушаја провере Фото-бунар базе: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Учитавам Фото-бунар"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Прикажи верзију програма"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[ДАТОТЕКА]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Покрените '%s --help' како би видели комплетан списак доступних параметара.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Данас"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Јуче"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Наслов:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Ставки:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d догађај"
+msgstr[1] "%d догађаја"
+msgstr[2] "%d догађаја"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d фотографија"
+msgstr[1] "%d фотографије"
+msgstr[2] "%d фотографија"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d видео снимак"
+msgstr[1] "%d видео снимка"
+msgstr[2] "%d видео снимака"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Датум:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Време"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Од:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "До:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Величина:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Трајање:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f секунди"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Развијач:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Експозиција:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Место:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Величина датотеке:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Изворне димензије:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Марка фотоапарата:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Модел фотоапарата:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Блиц:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Жижна даљина:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Датум експозиције:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Време експозиције:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Компензација експозиције:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Географска ширина:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Географска дужина:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Фотограф:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Ауторско право:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Верзија програма:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Додатни подаци"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Уклањам ознаку \"%s\" из %d слике. Да ли сте сигурни?"
+msgstr[1] "Уклањам ознаку \"%s\" из %d слике. Да ли сте сигурни?"
+msgstr[2] "Уклањам ознаку \"%s\" из %d слика. Да ли сте сигурни?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Одустани"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Избриши"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Да ли сте сигурни да желите да избришете сачувану претрагу \"%s\"?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Промена развијача ће поништити све измене које сте направили на овој "
+"фотографији"
+msgstr[1] ""
+"Промена развијача ће поништити све измене које сте направили на изабраним "
+"фотографијама"
+msgstr[2] ""
+"Промена развијача ће поништити све измене које сте направили на изабраним "
+"фотографијама"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Промени развијач"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Извези видео снимак"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Фото-бунар не може да уређује ову фотографију јер немате неопходне дозволе "
+"за упис у %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Извоз слике није успео због грешке у датотеци.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Да ли желите да наставите извоз?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Наставак"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Неизмењено"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Текуће"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Квалитет:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Однос промене величине:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_тачака"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Извоз метаподатака"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Сачувај детаље..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Сачувај детаље"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(и још %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"нисам могао да ископирам %s\n"
+"\tна %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d дупла фотографија није увежена:\n"
+msgstr[1] "%d дупле фотографије нису увежене:\n"
+msgstr[2] "%d дуплих фотографија није увежено:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d дупли видео снимак није увежен:\n"
+msgstr[1] "%d дупла видео снимка нису увежена:\n"
+msgstr[2] "%d дуплих видео снимака није увежено:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d дупла фотографија/видео снимак није увежен:\n"
+msgstr[1] "%d дупле фотографије/видео снимка нису увежена:\n"
+msgstr[2] "%d дуплих фотографија/видео снимака није увежено:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Увоз %d фотографија није успео због грешке у датотеци или уређају:\n"
+msgstr[1] ""
+"Увоз %d фотографије није успео због грешке у датотекама или уређају:\n"
+msgstr[2] ""
+"Увоз %d фотографија није успео због грешке у датотекама или уређају:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Увоз %d видео снимка није успео због грешке у датотеци или уређају:\n"
+msgstr[1] ""
+"Увоз %d видео снимка није успео због грешке у датотекама или уређају:\n"
+msgstr[2] ""
+"Увоз %d видео снимака није успео због грешке у датотекама или уређају:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Увоз %d фотографија/видео снимка није успео због грешке у датотеци или "
+"уређају:\n"
+msgstr[1] ""
+"Увоз %d фотографије/видео снимка није успео због грешке у датотекама или "
+"уређају:\n"
+msgstr[2] ""
+"Увоз %d фотографија/видео снимака није успео због грешке у датотекама или "
+"уређају:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d датотека није увежена због хардверске грешке или грешке у датотеци:\n"
+msgstr[1] ""
+"%d датотеке нису увежене због хардверске грешке или грешке у датотекама:\n"
+msgstr[2] ""
+"%d датотека није увежено због хардверске грешке или грешке у датотекама:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d фотографија није увежена, јер није дозвољено писање у директоријум збирке "
+"слика:\n"
+msgstr[1] ""
+"%d фотографије нису увежене, јер није дозвољено писање у директоријум збирке "
+"слика:\n"
+msgstr[2] ""
+"%d фотографија није увежено, јер није дозвољено писање у директоријум збирке "
+"слика:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Увоз %d видео снимака није успео, јер није дозвољено писање у директоријум "
+"збирке фотографија:\n"
+msgstr[1] ""
+"Увоз %d видео снимка није успео, јер није дозвољено писање у директоријум "
+"збирке фотографија:\n"
+msgstr[2] ""
+"Увоз %d видео снимака није успео, јер није дозвољено писање у директоријум "
+"збирке фотографија:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Увоз %d фотографије/видео снимака није успео, јер није дозвољено писање у "
+"директоријум збирке фотографија:\n"
+msgstr[1] ""
+"Увоз %d фотографије/видео снимака није успео, јер није дозвољено писање у "
+"директоријум збирке фотографија:\n"
+msgstr[2] ""
+"Увоз %d фотографије/видео снимака није успео, јер није дозвољено писање у "
+"директоријум збирке фотографија:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d датотека није увежена због немогућности уписа у директоријум збирке "
+"слика:\n"
+msgstr[1] ""
+"%d датотеке нису увежене због немогућности уписа у директоријум збирке "
+"слика:\n"
+msgstr[2] ""
+"%d датотека није увежено због немогућности уписа у директоријум збирке "
+"слика:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Увоз %d фотографија није успео због грешке на фотоапарату:\n"
+msgstr[1] "Увоз %d фотографије није успео због грешке на фотоапарату:\n"
+msgstr[2] "Увоз %d фотографија није успео због грешке на фотоапарату:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "Увоз %d видео снимка није успео због грешке на фотоапарату:\n"
+msgstr[1] "Увоз %d видео снимка није успео због грешке на фотоапарату:\n"
+msgstr[2] "Увоз %d видео снимка није успео због грешке на фотоапарату:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Увоз %d фотографија/видео снимка није успео због грешке на фотоапарату:\n"
+msgstr[1] ""
+"Увоз %d фотографије/видео снимка није успео због грешке на фотоапарату:\n"
+msgstr[2] ""
+"Увоз %d фотографија/видео снимка није успео због грешке на фотоапарату:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d датотека није увежена због грешке на фотоапарату:\n"
+msgstr[1] "%d датотеке нису увежене због грешке на фотоапарату:\n"
+msgstr[2] "%d датотека није увежено због грешке на фотоапарату:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Прескочена је %d фотографија која је у формату који није подржан:\n"
+msgstr[1] "Прескочене су %d фотографијекоје су у формату који није подржан:\n"
+msgstr[2] "Прескочено је %d фотографија које су у формату који није подржан:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Прескочена је %d датотека која није фотографија.\n"
+msgstr[1] "Прескочене су %d датотеке која нису фотографије.\n"
+msgstr[2] "Прескочено је %d датотека која нису фотографије.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d фотографија је прескочена при увозу:\n"
+msgstr[1] "%d фотографије су прескочене при увозу:\n"
+msgstr[2] "%d фотографија је прескочено при увозу:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d видео снимак је прескочен при увозу:\n"
+msgstr[1] "%d видео снимка су прескочена при увозу:\n"
+msgstr[2] "%d видео снимака је прескочено при увозу:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d фотографија/видео снимак је прескочен при увозу:\n"
+msgstr[1] "%d фотографије/видео снимка су прескочена при увозу:\n"
+msgstr[2] "%d фотографија/видео снимака је прескочено при увозу:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d датотека је прескочена јер сте прекинули пренос:\n"
+msgstr[1] "%d датотеке су прескочене јер сте прекинули пренос:\n"
+msgstr[2] "%d датотека је прескочено јер сте прекинули пренос:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d фотографија је успешно увежена.\n"
+msgstr[1] "%d фотографије су успешно увежене.\n"
+msgstr[2] "%d фотографија је успешно увежено.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d видео снимак је успешно увежен.\n"
+msgstr[1] "%d видео снимка су успешно увежени.\n"
+msgstr[2] "%d видео снимака су успешно увежени.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d фотографија/видео снимак је успешно увежен.\n"
+msgstr[1] "%d фотографије/видео снимка су успешно увежени.\n"
+msgstr[2] "%d фотографија/видео снимака су успешно увежени.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Ниједна фотографија ни видео снимак нису увежени.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Увоз је завршен"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунду"
+msgstr[1] "%d секунде"
+msgstr[2] "%d секунди"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d минут"
+msgstr[1] "%d минуте"
+msgstr[2] "%d минута"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d сат"
+msgstr[1] "%d сата"
+msgstr[2] "%d сати"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "%d дан"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Преименуј догађај"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Назив:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Уреди наслов"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Обриши слику"
+msgstr[1] "_Обриши слике"
+msgstr[2] "_Обриши слике"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Само _уклони"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Да ли да прихватим спошање измене?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Да ли да вратим спољне измене?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Ова акција ће поништити све измене на %d датотеци. Да ли желите да "
+"наставите?"
+msgstr[1] ""
+"Ова акција ће поништити све измене на %d датотеке. Да ли желите да "
+"наставите?"
+msgstr[2] ""
+"Ова акција ће поништити све измене на %d датотека. Да ли желите да "
+"наставите?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_Одбаци све измене"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "_Врати спољне измене"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Да ли сте сигурни да желите да уклоните %d фотографију из збирке?"
+msgstr[1] "Да ли сте сигурни да желите да уклоните %d фотографије из збирке?"
+msgstr[2] "Да ли сте сигурни да желите да уклоните %d фотографија из збирке?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Уклони"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Уклони фотографије из збирке"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Уклони фотографије из збирке"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 сата"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Помери слику за одређену вредност"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Постави следећи датум на све фотографије/видео"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Измени изворну фотографију"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Измени изворне фотографије"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Измени изворне датотеке"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Измени изворне датотеке"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Изворно: "
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d.%m.%Y. %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d.%m.%Y. %H:%M:%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Датум сликања ће бити померен унапред за\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Датум сликања ће бити померен уназад за\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "дан"
+msgstr[1] "дана"
+msgstr[2] "дана"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "сат"
+msgstr[1] "сата"
+msgstr[2] "сати"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минут"
+msgstr[1] "минута"
+msgstr[2] "минута"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунда"
+msgstr[1] "секунде"
+msgstr[2] "секунди"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"И %d друга."
+msgstr[1] ""
+"\n"
+"\n"
+"И %d друге."
+msgstr[2] ""
+"\n"
+"\n"
+"И %d других."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Ознаке (раздвојене запетом)"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Добро дошли!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Добро дошли у Фото-бунар"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Како би почели морате увести слике на неки од следећих начина:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Изаберите <span weight=\"bold\">Датотека %s Увези из фасцикле</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Превуците слику из разгледача датотека у Фото-бунаров прозор"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Повежите фотоапарат са рачунаром и увезите слике"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Увези слике из %s директоријума"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Можете увести слике на неки од следећих начина:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Не приказуј више ову поруку"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Увези фотографије из ваше %s збирке"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Помоћ)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Година%sмесец%sдан"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Година%sмесец"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Година%sмесец-дан"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Година-месец-дан"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Прилагођено"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Неисправан образац"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Фото-бунар може да ископира слике у вашу збирку или направи везу ка вашим "
+"сликама без копирања"
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ис_копирај слике"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "Увези _на месту"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Увези у збирку слика"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Уклони из збирке слика"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Уклањам фотографије из збирке."
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Уклањам фотографије из збирке"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Уклањам %d фотографију/видео снимак из Фото-бунарове збирке. Да ли желите и "
+"трајно да је обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[1] ""
+"Уклањам %d фотографије/видео снимка из Фото-бунарове збирке. Да ли желите и "
+"трајно да их обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[2] ""
+"Уклањам %d фотографија/видео снимака из Фото-бунарове збирке. Да ли желите "
+"и трајно да их обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Уклањам %d видео снимак из Фото-бунарове збирке. Да ли желите и трајно да "
+"га обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[1] ""
+"Уклањам %d видео снимка из Фото-бунарове збирке. Да ли желите и трајно да "
+"их обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[2] ""
+"Уклањам %d видео снимака из Фото-бунарове збирке. Да ли желите и трајно да "
+"их обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Уклањам %d фотографију из Фото-бунарове збирке. Да ли желите и трајно да је "
+"обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[1] ""
+"Уклањам %d фотографије из Фото-бунарове збирке. Да ли желите и трајно да их "
+"обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+msgstr[2] ""
+"Уклањам %d фотографија из Фото-бунарове збирке. Да ли желите и трајно да их "
+"обришете и са диска?\n"
+"\n"
+"Ова акција је неповратна."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d фотографија/видео снимак не могу преместити у смеће. Да ли желите да га "
+"уклоним трајно са диска?"
+msgstr[1] ""
+"%d фотографије/видео снимка не могу преместити у смеће. Да ли желите да их "
+"уклоним трајно са диска?"
+msgstr[2] ""
+"%d фотографија/видео снимака не могу преместити у смеће. Да ли желите да их "
+"уклоним трајно са диска?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Не могу да обришем %d фотографију/видео снимак."
+msgstr[1] "Не могу да обришем %d фотографије/видео снимка."
+msgstr[2] "Не могу да обришем %d фотографија/видео снимака."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Фасцикле"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Ознаке"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Успешно"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Грешка у датотеци"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Не могу да дешифрујем датотеку"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Грешка у бази података"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Ви сте прекинули увоз"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Датотека није исправана"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Фатотека већ постоји у бази"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Формат датотеке није подржан"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Датотека није слика"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Грешка на диску"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Диск је пун"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Грешка у фотоапарату"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Грешка приликом уписа у датотеку"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Увоз није успео (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "измењено"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Претходна слика"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Наредна слика"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Изворна датотека слике %s више не постоји."
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Приказ"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Алатке"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Претходна слика"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Претходна слика"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Следећа слика"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Следећа слика"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "У_већај"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Увећај приказ слике"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "У_мањи"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Умањи приказ сличике"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Сабиј на _страну"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Приказује слику тако да се цела види на екрану"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Увећај на _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Приказује слику у пуној резолуцији"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Увећај на _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Приказује слику увећану за дупло"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Развиј помоћу"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Нисам успео да извезем %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s база"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Не могу да наставим увоз из %s јер се појавила следећа грешка:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "Изаберите неки од сервиса из горњег менија за уваоз фотографија."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Увоз података"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Нисте укључили ни један додатак за увоз података.\n"
+"\n"
+"Како би користили могућност увоза из програма, морате укључити бар један "
+"додатак. Додатке можете укључити у дијалогу поставки."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Датотека збирке:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Увези"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Увоз из програма"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Увоз података _из:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Затвори"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Подешавања"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Покретни приказ"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Назад"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Иди на претходну слику"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Пауза"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Паузирај покретни приказ"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Следећа"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Иде на следећу слику"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Мења поставке покретног приказа"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Не постоји ни једна датотека са сликом."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Пусти"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Настави покретни приказ"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Поништавам"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Поврати претходно"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Побољшавам"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Поништи побољшање"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Прављење новог догађаја"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Уклањам догађај"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Премести слике у нови догађај"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Додели слику у претходном догађају"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Спајам"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Раздвајам"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Умножавам слике"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Уклањам дуплиране слике"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Нисам успео да дуплирам %d фотографију због грешке у датотеци"
+msgstr[1] "Нисам успео да дуплирам %d фотографије због грешке у датотекама"
+msgstr[2] "Нисам успео да дуплирам %d фотографија због грешка у датотекама"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Враћам на претходну оцену"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Повећавам оцену"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Смањујем оцену"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Поставке RAW развијача"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Поврати претходно RAW развијање"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Постави програмера"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Не могу да коригујем изворну слику."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Коригујем датум и време"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Поништавам промену датума и времена"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Није могућа измена оригиналне фотографије."
+msgstr[1] "Није могућа измена оригиналних фотографија."
+msgstr[2] "Није могућа измена оригиналних фотографија."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Грешка при кориговању датума и времена"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Промену времена није могуће поништити на изабраној фотографији."
+msgstr[1] "Промене времена није могуће поништити на изабраним фотографијама."
+msgstr[2] "Промене времена није могуће поништити на изабраним фотографијама."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Направи ознаку"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Премести ознаку \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Премести слике у канту"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Поврати слике из канте"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Премешта слике у Фото-бунарову канту за смеће"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Враћа слике назад у Фото-бунарову збирку слика"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Премештам слике у канту"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Враћам слике из канте"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Обележи изабране слике"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Скини обележје са изабраних слика"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Обележи"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Скини обележје"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Фото-бунар"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Низак (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Средњи (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Висок (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Највећи (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Нема фотографија/видеа"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Нема пронађених фотографија/видеа"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Слике не могу бити извезене у ову фасциклу"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Није успела обрада праћења унапређења: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Рашири на целу страну"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 слике по страни"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 слике по страни"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 слика по страни"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 слика по страни"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 слика по страни"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 слике по страни"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "инч"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Новчаник (2 x 3 инча)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Забелешка (3 x 5 инча)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 инча"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 инча"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 инча"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 инча"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 инча"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Метрички новчаник (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Честитка (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Подешавање слике"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Штампам..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Нисам успео да одштампам слике:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Нисам успео да отворим/направим базу слика %s: код грешке %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Није могуће писати у збирку фотографија:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Грешка приликом приступа збирци фотографија:\n"
+"%s\n"
+"Грешка је:\n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Извоз видео снимака"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Нисам успео да покренем Наутилус пошаљи у: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Пошаљи у"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Нисам успео да извезем позадину у %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Нисам успео да припремим смењивање позадине радне површине: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Обележено"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Канта"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Канта је празна"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Избриши"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Бришем слике"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Недостајуће датотеке"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Бришем ..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Последњи увоз"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Увези из фасцикле"
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Увози слике са диска у збирку"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Увези из _програма ..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Поређај _догађаје"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Испразни _канту"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Брише све слике из канте"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Преглед до_гађаја са слике"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Пронађи"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Претражује збирку по изабраном критеријуму"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Датотека"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Уређивање"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Слика"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Слике"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Догађаји"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Ознаке"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "По_моћ"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Основни подаци"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Приказује основне податке о изабраној слици"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Додатни подаци"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Приказује додатне податке о изабраној слици"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Линија претраге"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Прикажи линију претраге"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Бочна површ"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Прикажи бочну површ"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Растући"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Ређа слике по растућем реду"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Опадајући"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Ређа слике по опадајућем реду"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Увези из фасцикле"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Испразни канту"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Празним канту ..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Фото-бунар је подешен да увози слике у вашу личну фасциклу.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Локација збирке слика"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Слике не могу бити увежене из изабране фасцикле"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Освежавам збирку слика ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Спремам слике за самостални-увоз..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Самостално-увозим слике..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Уписујем метаподатаке у датотеке ..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Збирка"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Увозим ..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Заустави увоз"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Прекини увоз слика"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Спремам слике за увоз..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Увезена је слика %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Сачувај"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Сачувај слику"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Сачувај _као..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Чува слику под другим називом"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Штампа на штампачу који је повезан на овај рачунар"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s не постоји."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s није датотека."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s не подржава формат датотеке\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Сачувај копију"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Заборави измене на %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "Затвори _без чувања"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Грешка при уписивању у %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Сачувај као..."
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Не могу да пратим %s: непостојећи директоријум (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Организовање слика"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Преглед слика"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Сва права задржана © 2009-2013 Yorba фондација"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Окрени на _десно"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Окрени"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Окреће слику на десно"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Окреће слике на десно (притисни Ctrl за окретање на лево)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Окрени на _лево"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Окреће слику на лево"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Окреће слике на лево"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Изврни по хори_зонтали"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Изврни по хоризонтали"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Изврни по верти_кали"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Изврни по вертикали"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_Побољшај"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Побољшај"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Самостално унапређује изглед слике"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Исеци"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Исеци"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Исецање слике"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Исправи"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Исправити"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Исправи фотографију"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Црвене очи"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Уклони црвене очи"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Смањује и уклања ефекат црвених очију са слике"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Дотерај"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Подеси"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Подеси боје и тон слике"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "В_рати на оригинал"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Врати на оригинал"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Врати на _измењену слику"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Поврати изворну слику"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Постави као _позадину"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Поставља изабрану слику као позадину ваше радне површине"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Постави као смењиву _позадинску слику..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Опозови"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Опозови"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Понови"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Понови"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "_Преименуј догађај..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Поставите као _кључну слику за овај догађај"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Поставите као кључну слику за овај догађај"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Нови догађај"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Нови догађај"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Премести слике"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Премешта слике у догађај"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Споји догађаје"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Споји"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Спајање два догађаја у један"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Оцени"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Оцени"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Промени оцену слике"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Увећај"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Увећај оцену"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Умањи"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Умањи оцену"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Без оцене"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Неоцењене"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Поништи оцену"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Означава да слика није оцењена"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Скини било какве оцене"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Лоша"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Одбијене"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Оцени као лошу"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Оцењујем као лошу"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Оцењује слику као лошу"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Само _одбиј"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Само одбиј"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Прикажи само одбијене слике"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Све + _Лоша"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Прикажи све слике укључујући и лоше"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Све слике"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Прикажи све слике"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Оцене"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Прикажи оцене свих слика"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Филтриране слике"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Филтриране слике"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Ограничи број слика које се приказују на основу филтера"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Умножи"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Умножено"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Направи умножак слике"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Извези..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Штампај..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "_Објави..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Објави"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Објављује изабране слике на различитим сајтовима"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Измени _наслов ..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Измени _коментар..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Измени коментар"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Подеси датум и време"
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Подеси датум и време"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Додај _ознаке ..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Додај ознаке..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Додај ознаке"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Поставке"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "_Отвори у спољном уређивачу слика"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Отвори у уређивачу RA_W слика"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Пошаљи _у..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Пошаљи _у..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Пронађи..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Пронађи"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Проналази слике на основу имена или ознаке"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Обележи"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "_Скини обележје"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Нисам успео да покренем уређивач слика: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Додај ознаку \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Додај ознаке \"%s\" и \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Избриши ознаку \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Избриши ознаку \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Избриши ознаку"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Ново"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "_Преименуј ознаку \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Преименуј ознаку \"%s\" у \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Преименуј..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Измени _ознаке ..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Измена ознака"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Означи фотографије као \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Означи фотографије као \"%s\""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Означи изабране фотографије као \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Означи изабране фотографије као \"%s\""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Уклони ознаку \"%s\" са _фотографија"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Уклони ознаку \"%s\" са _фотографија"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Уклони ознаку \"%s\" са фотографија"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Уклони ознаку \"%s\" са фотографија"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Нисам успео да променим ознаку \"%s\" јер већ постоји ознака са тим називом."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Не могу да преименујем претрагу \"%s\", јер већ постоји претрага са датим "
+"називом."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Сачуване претраге"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Избриши претрагу"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Измена..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Пре_именуј..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Преименуј претрагу \"%s\" у \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Избриши претрагу \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Оцени %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Оцени %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Оцењујем %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Прикажи %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Приказује само слике са оценом %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s или више"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Прикажи %s или више"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Приказује само слике са оценом %s или више"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Уклања изабране слике из канте"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Уклања изабране слике из збирке"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Поврати"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Премешта изабране слике назад у збирке"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Прикажи у _разгледачу датотека"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Отвори фасциклу изабраних слика у разгледачу датотека"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Нисам успео да отворим разгледач датотека: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "У_клони из збирке"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Премести у канту"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Изабери св_е"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Изабери све ставке"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Угао:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Поново постави"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Врати на постојећу величину слике"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Исеци слику"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Мења оријентацију правоугаоника за исецање између водоравног и усправног"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Невезано"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Квадратни"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Екрански"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Изворне димензије"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD видео (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD видео (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Писмо (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Таблоид (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Затвори алат за уклањање црвених очију"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Уклања ефекат црвених очију у изабраном делу слике"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Засићење:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Боја:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Температура:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Сенке:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Поврати боје"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Поништи све промене боја"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Температура"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Боја"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Засићеност"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Експозиција"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Сенке"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Повећање контраста"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Прикачи алатницу"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Откачи алатницу"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Напусти приказ преко читавог екрана"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Напусти приказ преко _читавог екрана"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "И_зађи"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_О програму"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Преко _целог екрана"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Садржај"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Често постаљана питања"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Пријави проблем..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Појавила се фатална грешка приликом приступа Фото-бунаровој збирци слика. "
+"Фото-бунар не може да настви рад.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Посети Yorba веб страну"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Никола Радовановић <nrad@eunet.rs>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Није могуће приказати помоћ: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Не могу да приступим бази података о грешкама: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Нисам успео да прикажем ЧПП: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "безимени"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Изворна димензије"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ширина и висина"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ширина"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Висина"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Мења димезије умањеног приказа"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Увећај приказ умањених сличица"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Умањи приказ умањених сличица"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Поређај _слике"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "_Пусти видео снимак"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Отвори изабрани видео снимак у програму за њихово пуштање"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Коментари"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Прикажи коментаре за сваку слику"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Прикажи ознаке слика"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "По _називу"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Поређај слике по називу"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "По _датуму сликања"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Ређа слике по датуму сликања"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "По _оцени"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Поређај слике по оцени"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Фото-бунар није успео да пусти изабрани видео снимак:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d фотографија/видео снимак"
+msgstr[1] "%d фотографије/видео снимка"
+msgstr[2] "%d фотографија/видео снимака"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Прикажи коментар уз сваки догађај"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Без догађаја"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Није пронађен тражени догађај"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Догађаји"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Без датума"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Без догађаја"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Нисам успео да направим директоријум привремене оставе %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Нисам успео да направим фасциклу за податке %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Слике"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Нисам успео да направим привремену фасциклу %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Нисам успео да направим подфасциклу за податке %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ниједна)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ниједан"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Насумично"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Прелази у покретном приказу"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Нисам успео да направим привремену фасциклу за %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Извозим"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Датотека %s већ постоји. Да ли да је заменим?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Прескочи"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Замени"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Замени св_е"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Извези"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Слике"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Видео снимци"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW слике"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW слике"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Грешка приликом учитавања UI датотеке %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Тип"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Објављивање"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Изабране фотографије/видео снимци су успешно објављени."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Изабрани видео снимак је успешно објављен."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Изабране слике су успешно објављене."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Изабрани видео снимак је успешно објављен."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Изабрана фотографија је успешно објављена."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Прибављам податаке о налогу ..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Пријављујем се..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Објави слике"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Објави слике _на:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Објави видео снимак"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Објави видео снимке _на"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Објави фотографије и видео снимке"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Објави фотографије и видео снимке _на"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Објављивање није успело"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Фото-бунар не може да објави изабране ставке јер немате додатак за то није "
+"укључен. Да би ово исправили идите на <b>Уређивање %s Поставке</b> и "
+"укључите један или више додатака за објављивање под језичком <b>Додаци</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Припремам за слање"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Постављам %d од %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Не могу да наставим објављивање на %s јер се појавила следећа грешка:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "Изаберите други сервис за објављивање слика."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Нова _ознака ..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"Привремена да тотека. неопходна за објављивање, није доступна"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Тренутно нисте пријављени на YouTube.\n"
+"\n"
+"Да би наставили морате да поседујете Google налог који је подешен да користи "
+"YouTube. Налог можете подесити и пријавити се на YouTube-у користећи ваш "
+"омиљени претраживач интернета."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "Не могу да наставим објављивање на Youtube јер није доступна датотека."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Ушли сте на YouTube као %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Видео снимци ће се појавити у '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Јавно је доступно"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Није јавно доступно"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Приватно"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Основни сервис за објављивање"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Тренутно нисте повезани са вашим Flickr налогом.\n"
+"\n"
+"Пријавите се на Flickr у вашем претраживачу интернета. Како би се повезали "
+"са вашим Flickr налогом морате ауторизовати везу."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Већ сте се пријављивали и одјављивали са Flickr-а током ове Фото-бунар "
+"сесије.\n"
+"Да би наставили слање слика на Flickr морате поново покренути Фото-бунар и "
+"покушати поново."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Спремам се за пријављивање ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "Не могу да наставим објављивање на Flickr јер није доступна датотека."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Потврђујем ауторизацију ..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Ушли сте на Flickr као %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ваш бесплатни Flickr налог има ограничење колико слика можете послати у току "
+"месеца.\n"
+"Преостало Вам је још %d мегабајта да попуните овомесечну квоту."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Ваш Flickr Pro налог омогућава Вам неограничено слање слика."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Слике су _видљиве за:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Видео снимак је _видљив:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Фотографије и видео снимци су _видљиви:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Свима"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Само пријатељима и породици"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Само породица"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Само пријатељи"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Само мени"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 тачака"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 тачака"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 тачака"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 тачака"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Правим албум %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Појавила се грешка приликом објављивања на Piwigo. Молим покушајте поново."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Унесите интернет адресу ваше Piwigo збирке слика као и корисничко име и "
+"лозинку за приступ Piwigo налогу те збирке слика."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Фото-бунар није успео да приступи Piwigo збирци слика. Молим, проверите "
+"унету интернет адресу."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Корисничко име и/или лозинка нису исправни. Молим, покушајте поново."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Интернет адреса није исправна"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, fuzzy, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+"Није исправно корисничко име или лозинка"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Фото-бунар повезивање"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Администратори, Породица, Пријатељи, Контакти"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Администратори, Породица, Пријатељи"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Администратори, Породица"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Администратори"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Тренутно нисте пријављени на Picasa интернет албуме.\n"
+"\n"
+"Кликните \"Пријави се\" за приступ Picasa интернет албумима у вашем "
+"прегледачу интернета. Потребно је да ауторизујете Shotwell повезивач како би "
+"се повезали са вашим Picasa налогом."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr "Не могу да наставим објављивање на Picasa јер није доступна датотека."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Прављење новог албума ..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Пријављени сте у Picasa Web Albums као %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Видео снимци ће се појавити у:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Слике ће се појавити у:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Мала (640 x 480 тачака)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Средња (1024 x 768 тачака)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Препоручено (1600 x 1200 тачака)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 тачака)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Тренутно нисте пријављени на Facebook.\n"
+"\n"
+"Ако не поседујете Facebook налог, моћи ћете да га отворите током овог "
+"процеса. Такође је неопходно да дозволите Фото-бунару приступ вашем налогу. "
+"То је неопходно за функционисање овог сервиса."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Током ове Фото-бунар сесије већ сте се једном пријављивали и одјављивали са "
+"Facebook-а.\n"
+"Како би наставили објављивање слика на Facebook, изађите и поново покрените "
+"Фото-бунар, па покушајте поново."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Стандардно (720 пиксела)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Велико (2048 пиксела)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Испробавам везу са Facebook-ом ..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Не могу да наставим објављивање на Facebook јер није доступна датотека."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Ушли сте на Facebook као %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Где желите да објавите изабране слике?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Величина слања:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Пријатељи"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Распадање"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Шах"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Кругови"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Штрафте"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Сат"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Круг"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Основни прелаз покретног приказа"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"Ауторска права 2010 Максим Карташев, Ауторска права 2011-2013 Yorba Фондација"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Померање"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Нестајање"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Квадрати"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Основни сервис за увоз"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Добро дошли у сервис за увоз F-Spot збирке слика.\n"
+"\n"
+"Молим изаберите збирку за увоз, избором постојеће збирке коју је Фото-бунар "
+"пронашао или избором неке друге датотеке F-Spot збирке."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Добро дошли у сервис за увоз F-Spot збирке слика.\n"
+"\n"
+"Молим изаберите датотеку F-Spot збирке."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Ручни избор датотеке F-Spot збирке за увоз:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Није успело отварање датотеке F-Spot збирке: датотека не постоји или није F-"
+"Spot збирка"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Није успело отварање датотеке F-Spot збирке: Фото-бунар не подржава ову "
+"верзија F-Spot збирке."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Није успело отварање датотеке F-Spot збирке: грешка приликом читања табеле "
+"са ознакама"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Није успело отварање датотеке F-Spot збирке: грешка приликом читања табеле "
+"са сликама"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Фото-бунар је пронашао %d слика у F-Spot збирци и тренутно их увози. "
+"Дупликати ће аутоматски бити пронађени и обрисани.\n"
+"\n"
+"Можете затворити овај дијалог и започети коришћење Фото-бунара, увоз слика "
+"ће се наставити у позадини."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot збирка: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Припремам за увоз"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Постави као смењиву позадину радне површине"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Направи смењиву позадину радне површине"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Прикажи сваку слику за"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "период времена"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Колико дуго ће изабрана слика да буде позадина ваше радне површине"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Претрага"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Назив претраге:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Резултат"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "од следећег:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Величина одштампане слике</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Уо_бичајене величине:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "По_деси величину"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Сразмерно"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Аутоматска величина:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Наслови</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Штампај _називе слика"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Резолуција у пикселима</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Штампај слике у:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "тачака по инчу"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+#, fuzzy
+msgid "label"
+msgstr ""
+"ознака"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Поставке Фото-бунара"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "бела"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "црно"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Прати појављивање нових датотека у фасцикли збирке"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Метаподатци"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Уписуј ознаке, наслове и остале _метаподатке у датотеке слика"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Приказ"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Увези слике у:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Позадина:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Увозим"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "Структура _директоријума:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Мустра:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Пример:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "_Преименуј увежене датотеке на мала слова"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW развијач"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "По_дразумевано:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "_Спољни уређивач фотографија:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Спољни уређивач _RAW слика:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Спољни уређивачи"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Додаци"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Задршка:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Ефекти прелаза:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "_Задршка између прелаза:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Прикажи _наслов"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "секунди"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Пријава"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Објави у _постојећи албум:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Направите _нови албум:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Нови албуми видео снимака и фотографија су _видљиви:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Одјави се"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Објави"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Унесите број за потврду који се појављује након што приступите вашем Flickr "
+"налогу у претраживачу интернета."
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr "_Број за ауторизацију:"
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Величина _слике:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Постојећи албум:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Нови албум је назван:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "_Списак албума у јавној галерији"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_Величине слика:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL ваше Piwigo збирке фотографија"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Корисничко _име"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Лозинка"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Запамти лозинку"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Пријави се"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "_Постојећа категорија:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Ко може да _види фотографије:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Величина фотографије:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Одјави се"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Подешавање _приватности видео снимка:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Права копирања 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 тачака"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' није исправан одговор на OAuth упит за ауторизацију"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): се не може поново покренути јер објављивач то не "
+"дозвољава"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Унесите корисничко име и лозинку за приступ вашем Tumblr налогу"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Не могу да учитам кориснички интерфејс: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Пријављени сте на Tumblr као %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Сва права задржана 2010+ Јевгениј Палиаков <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Посетите Yandex.Fotki интернет страну"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Тренутно сте пријављени на Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "Адреса _ел. поште"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Пријављени сте на Tumblr као (име).\n"
+"\n"
+"(не мењајте овај текст јер се он попуњава програмски)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Блогови:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "Изабери _албум (или направи нови):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Врста приступа:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Онемогући _коментаре"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Онемогући преузимање оригиналне фотографије"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..7f4dd49
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,4605 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# alexanderstyre <lessneurope@yandex.com>, 2013
+# Daniel Nylander <po@danielnylander.se>, 2011
+# joachimj <joachim.j@gmail.com>, 2013
+# olof_ <olof_nord_@hotmail.com>, 2012
+# Konstigt <thomas@xyz.pp.se>, 2013
+# verayin <vera@yorba.org>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-24 19:00+0000\n"
+"Last-Translator: Konstigt <thomas@xyz.pp.se>\n"
+"Language-Team: Swedish (http://www.transifex.com/projects/p/shotwell/"
+"language/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Händelse %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameror"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Kunde inte avmontera kameran. Försök att avmontera kameran från "
+"filhanteraren."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Dölj bilder som redan importerats"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Visa enbart bilder som inte har importerats"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Påbörjar importen, var god vänta..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Titlar"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Visa titeln för varje bild"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Importera _markerade"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Importera de valda bildera till ditt bibliotek"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Importera _alla"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Importera alla bilder till ditt bibliotek"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell behöver avmontera kameran från filsystemet för att kunna komma åt "
+"den. Vill du fortsätta?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "A_vmontera"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Avmontera kameran."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kameran är låst av ett annat program. Shotwell kan endast komma åt kameran "
+"när den är olåst. Stäng alla andra program som använder kameran och försök "
+"igen."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Stäng alla andra program som använder kameran."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kunde inte hämta förhandsvisningar från kameran:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Avmonterar..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Hämtar bildinformation"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Hämtar förhandsvisning av %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kunde inte låsa kameran: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Radera denna bild från kameran?"
+msgstr[1] "Radera dessa %d bilder från kameran?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Radera denna film från kameran?"
+msgstr[1] "Radera dessa %d filmer från kameran?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Radera denna bild och film från kameran?"
+msgstr[1] "Radera dessa %d bilder och filmer från kameran?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Radera denna fil från kameran?"
+msgstr[1] "Radera dessa %d filer från kameran?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Behåll"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Tar bort bilder och filmer från kameran"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Kunde inte radera %d bild och film från kameran på grund av ett fel."
+msgstr[1] ""
+"Kunde inte radera %d bilder och filmer från kameran på grund av ett fel."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "_Bildspel"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Spela upp ett bildspel"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Exportera bilder/filmer"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Exportera bilder/filmer"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Exportera bilder"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Exportera bilder"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Roteraren"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Återställ roteringen"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Vänder horisontellt"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Återställer horisontell vändning"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Vänder vertikalt"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Återställer vertikal vändning"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Valfri text"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Titel"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etikett"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Kommentar"
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Händelsenamn"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Filnamn"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Mediatyp"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Flaggtillstånd"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Betyg"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Datum"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "innehåller"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "är exakt"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "börjar med"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "slutar med"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "innehåller inte"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "är inte inställd"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "är"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "är inte"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "valfri bild"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "en råfil"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "en film"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "flaggad"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "oflaggad"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "och högre"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "endast"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "och lägre"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "är efter"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "är före"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "är mellan"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "och"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "någon"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "alla"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ingen"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Sparade sökningar"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "_Ny sparad sökning..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Ditt bildbibliotek är inte kompatibelt med denna version av Shotwell. Det "
+"verkar som det skapades med Shotwell %s (schema %d). Denna version är %s "
+"(schema %d). Använd den senaste versionen av Shotwell."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell kunde inte uppgradera din bildbibliotek från version %s (schema %d) "
+"till %s (schema %d). För ytterligare information, läs Shotwells wiki-sida "
+"på %s"
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Ditt bildbibliotek är inte kompatibelt med denna version av Shotwell. Det "
+"verkar som om det skapades med Shotwell %s (schema %d). Denna version är %s "
+"(schema %d). Töm ditt bibliotek genom att ta bort %s och importera dina "
+"bilder igen."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Okänt fel vid försök att verifiera Shotwells databas: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Läser in Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Sökväg till Shotwells privata data"
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Sök inte efter ändringar i biblioteket medan programmet används"
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Visa inte hur uppstarten framskrider"
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr "Visa programversion"
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Kör \"%s --help\" för en komplett lista över tillgängliga "
+"kommandoradsalternativ.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Idag"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Igår"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Titel:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Objekt:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d händelse"
+msgstr[1] "%d händelser"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d bild"
+msgstr[1] "%d bilder"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d film"
+msgstr[1] "%d filemr"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Datum:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Tid:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Från:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Till:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Storlek:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Speltid:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f sekunder"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Framkallare:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Exponering:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Plats:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Filstorlek:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Nuvarande framkallare:"
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Ursprungsstorlek:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kameratillverkare:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kameramodell:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Blixt:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Brännvidd:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Exponeringsögonblick:"
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Exponeringstid:"
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Exponeringskompensation:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS-latitud:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS-longitud:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Kostnär:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Upphovsrätt:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Programvara:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Utökad information"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Det här kommer att ta bort etiketten \"%s\" från bilden. Vill du fortsätta?"
+msgstr[1] ""
+"Det här kommer att ta bort etiketten \"%s\" från %d bilder. Vill du "
+"fortsätta?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Avbryt"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Radera"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+"Det här kommer att ta bort sparade sökningen \"%s\". Vill du fortsätta?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Om du ändrar råbildsframkallare kommer alla ändringar du gjort på bilden i "
+"Shotwell att återställas."
+msgstr[1] ""
+"Om du ändrar råbildsframkallare kommer alla ändringar du gjort på bilderna i "
+"Shotwell att återställas."
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Byt råbildsframkallare"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Exportera film"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell kunde inte skapa en fil för redigering av denna bild därför att du "
+"inte har behörighet att skriva till %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Kunde inte exportera följande bild på grund av ett filfel.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Vill du fortsätta att exportera?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_Fortsätt"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Oförändrad"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Aktuell"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Format:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kvalitet:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Skalningsbegränsning:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _pixlar"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Exportera metadata"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Spara detaljer..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Spara detaljer"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(och ytterligare %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Importera resultatrapport"
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Försökte importera %d fil"
+msgstr[1] "Försökte importera %d filer"
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "Av dessa importerades %d fil framgångsrikt."
+msgstr[1] "Av dessa importerades %d filer framgångsrikt."
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Dubbletter av bilder/filmer som inte importerades:"
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "dubblett av befintligt media"
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "På grund av ett kamerafel importerades inga bilder eller filmer:"
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "felmeddelande:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Filerna importerades inte på grund av att de inte kändes igen som bild- "
+"eller filmfiler:"
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Bilderna eller filmerna importerades inte på grund av att de var i ett "
+"format som Shotwell inte stöder:"
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Bilderna eller filmerna importerades inte på grund av att det inte gick att "
+"kopiera dem till biblioteket:"
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"det gick inte att kopiera %s\n"
+"\ttill %s"
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Bilder eller filmer importerades inte på grund av andra anledningar:"
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 bilddubblett importades inte:\n"
+msgstr[1] "%d bilddubbletter importerades inte:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 videodubblett importerades inte:\n"
+msgstr[1] "%d filmdubbletter importerades inte:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 video-/bilddublett importerades inte:\n"
+msgstr[1] "%d bild- och filmdubletter importerades inte:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Import av ett bild misslyckades på grund av ett fil- eller hårdvarufel:\n"
+msgstr[1] ""
+"Import av %d bilder misslyckades på grund av ett fil- eller hårdvarufel:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 video gick inte att importera på grund av ett fil- eller hårdvarufel:\n"
+msgstr[1] ""
+"%d filmer gick inte att importera på grund av ett fil- eller hårdvarufel:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"1 bild/video gick inte att importera på grund av ett fil- eller "
+"hårdvarufel:\n"
+msgstr[1] ""
+"%d bilder och filmer gick inte att importera på grund av ett fil- eller "
+"hårdvarufel:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"En fil gick inte att importera på grund av ett fil- eller maskinvarufel:\n"
+msgstr[1] ""
+"%d filer gick inte att importera på grund av ett fil- eller maskinvarufel:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"En bild gick inte att importera därför att bildbiblioteksmappen inte var "
+"skrivbar:\n"
+msgstr[1] ""
+"%d bilder gick inte att importera därför att bildbiblioteksmappen inte var "
+"skrivbar:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"En film gick inte att importera därför att bildbiblioteksmappen inte var "
+"skrivbar:\n"
+msgstr[1] ""
+"%d filmer gick inte att importera därför att bildbiblioteksmappen inte var "
+"skrivbar:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"En bild eller film gick inte att importera därför att bildbiblioteksmappen "
+"inte var skrivbar:\n"
+msgstr[1] ""
+"%d bilder och filmer gick inte att importera därför att bildbiblioteksmappen "
+"inte var skrivbar:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"En fil gick inte att importera på grund av att bildbibliotekets mapp inte "
+"var skrivbar:\n"
+msgstr[1] ""
+"%d filer gick inte att importera på grund av att bildbibliotekets mapp inte "
+"var skrivbar:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "Import av ett bild misslyckades på grund av ett kamerafel:\n"
+msgstr[1] "%d bilder gick inte att importera på grund av ett kamerafel:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "1 video gick inte att importera på grund av ett kamerafel:\n"
+msgstr[1] "%d filmer gick inte att importera på grund av ett kamerafel:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "1 bild/video gick inte att importera på grund av ett kamerafel:\n"
+msgstr[1] ""
+"%d bilder och filmer gick inte att importera på grund av ett kamerafel:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "En fil gick inte att importera på grund av ett kamerafel:\n"
+msgstr[1] "%d filer gick inte att importera på grund av ett kamerafel:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "En bild som inte stöds hoppades över:\n"
+msgstr[1] "%d bilder som inte stöds hoppades över:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "En icke-bildfil hoppades över.\n"
+msgstr[1] "%d icke-bildfiler hoppades över.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "En bild hoppades över därför att användaren avbröt:\n"
+msgstr[1] "%d bilder hoppades över därför att användaren avbröt:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "1 video hoppades över därför att användaren avbröt:\n"
+msgstr[1] "%d filmer hoppades över därför att användaren avbröt:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "1 bild/video hoppades över därför att användaren avbröt:\n"
+msgstr[1] "%d bilder och filmer hoppades över därför att användaren avbröt:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "En fil hoppades över därför att användaren avbröt:\n"
+msgstr[1] "%d filer hoppades över därför att användaren avbröt:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "En bild importerades.\n"
+msgstr[1] "%d bilder importerades.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "En film importerades.\n"
+msgstr[1] "%d filmer importerades.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "En bild och film importerades.\n"
+msgstr[1] "%d bilder och filmer importerades.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Inga bilder eller filmer importerades.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Importen är färdig"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minuter"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d timme"
+msgstr[1] "%d timmar"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "Ett dygn"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Byt namn på händelse"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Namn:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Redigera titel"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Ta bort filen"
+msgstr[1] "_Ta bort filerna"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Ta _endast bort"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Återställ externa redigeringar?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Återställ externa redigeringar?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Det här kommer att förstöra alla ändringar som gjorts i den externa filen. "
+"Vill du fortsätta?"
+msgstr[1] ""
+"Det här kommer att förstöra alla ändringar som gjorts i de %d externa "
+"filerna. Vill du fortsätta?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Återställ externa redigeringar"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Åt_erställ externa redigeringar"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+"Det här kommer att radera bilden från biblioteket. Vill du fortsätta?"
+msgstr[1] ""
+"Det här kommer att radera %d bilder från biblioteket. Vill du fortsätta?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Ta bort"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Ta bort bilder från biblioteket"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Ta bort bilder från bibliotek"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 timmar"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Förskjut bilder/filmer med samma värde"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Ställ in _alla bilder/filmer till denna tid"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Modifiera originalbilden"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Modifiera originalbilderna"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "Än_dra originalfiler"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "Än_dra originalfiler"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Original:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y-%m-%d, %H.%M.%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y-%m-%d, %H.%M.%S"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Exponeringsögonblicket kommer att flyttas framåt med\n"
+"%d %s, %d %s, %d %s och %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Exponeringsögonblicket kommer att flyttas bakåt med\n"
+"%d %s, %d %s, %d %s och %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagar"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "timme"
+msgstr[1] "timmar"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuter"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "sekund"
+msgstr[1] "sekunder"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"och %d annat."
+msgstr[1] ""
+"\n"
+"\n"
+"och %d andra."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiketter (separerade med kommatecken):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Välkommen!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Välkommen till Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Importera bilder på något av dessa sätt för att komma igång:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Välj <span weight=\"bold\">Arkiv %s Importera från mapp</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Dra och släpp bilder till Shotwell-fönstret"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Anslut en kamera till din dator och importera"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Importera bilder från din %s-mapp"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Du kan även importera bilder på något av dessa sätt:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "Visa _inte detta meddelande igen"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Imortera bilder från ditt %s-bibliotek"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Hjälp)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "År%sMånad%sDag"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "År%sMånad"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "År%sMånad-Dag"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "År-Månad-Dag"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Anpassad"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Ogiltigt mönster"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell kan kopiera bildera till din biblioteksmapp eller importera dem "
+"utan att kopiera dem."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Ko_piera bilder"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Importera på plats"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Importera till biblioteket"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Ta bort från biblioteket"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Tar bort bilder från bibliotek"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Tar bort bilder från bibliotek"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Det här kommer att ta bort bilden eller filmen från ditt Shotwell-"
+"bibliotek. Vill du även flytta filen till papperskorgen?\n"
+"\n"
+"Den här åtgärden kan inte ångras."
+msgstr[1] ""
+"Det här kommer att ta bort %d bilder eller filmer från ditt Shotwell-"
+"bibliotek. Vill du även flytta filerna till papperskorgen?\n"
+"\n"
+"Den här åtgärden kan inte ångras."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Det här kommer att ta bort filmen från ditt Shotwell-bibliotek. Vill du "
+"även flytta filmen till papperskorgen?\n"
+"\n"
+"Den här åtgärden kan inte ångras."
+msgstr[1] ""
+"Det här kommer att ta bort %d filmer från ditt Shotwell-bibliotek. Vill du "
+"även flytta filmerna till papperskorgen?\n"
+"\n"
+"Den här åtgärd kan inte ångras."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Det här kommer att ta bort bilden från ditt Shotwell-bibliotek. Vill du "
+"även flytta bilden till papperskorgen?\n"
+"\n"
+"Den här åtgärden kan inte ångras."
+msgstr[1] ""
+"Det här kommer att ta bort %d bilder från ditt Shotwell-bibliotek. Vill du "
+"även flytta bilderna till papperskorgen?\n"
+"\n"
+"Den här åtgärden kan inte ångras."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"Bilden eller filmen kan inte flyttas till papperskorgen. Vill du radera "
+"dessa filer direkt?"
+msgstr[1] ""
+"%d bilder eller filmer kan inte flyttas till papperskorgen. Vill du radera "
+"dessa filer direkt?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Bilden eller filmen kan inte raderas."
+msgstr[1] "%d bilder eller filmer kan inte raderas."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Mappar"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiketter"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Lyckades"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Filfel"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Kunde inte avkoda filen"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Databasfel"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Användaren avbröt importen"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Inte en fil"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Filen finns redan i databasen"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Filformatet stöds inte"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Inte en bildfil"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Diskfel"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disken är full"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamerafel"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Fel vid filskrivning"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Importen misslyckades (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "ändrad"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Föregående bild"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Nästa bild"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Källfilen för bilden saknas: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Visa"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Verktyg"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Föregående bild"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Föregående bild"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Nästa bild"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Nästa bild"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Förstora"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Öka förstoringen av bilden"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Förminska"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Minska förstoringen av bilden"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "_Anpassa till sidan"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Zooma bilden för att passa på skärmen"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "_Visa 100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Zooma bilden till 100% förstoring"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "_Visa 200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Zooma bilden till 200% förstoring"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Utvecklare"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Kunde inte exportera %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s-databas"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Importen från %s kan inte fortsätta då ett fel uppstod:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"För att försöka att importera från en annan tjänst, välj en från ovanstående "
+"meny."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Dataimporter"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Du har inte aktiverat några dataimport-pluginer.\n"
+"\n"
+"För att använda kommandot Importera från program, måste du åtminstone ha en "
+"plugin aktiverad. Pluginer kan aktiveras i programmets inställiningar."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Databasfil:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Importera"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Importera från program"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Importera mediafiler från:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "S_täng"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Inställningar"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Bildspel"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Bakåt"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Gå till föregående bild"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Pausa bildspelet"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Nästa"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Gå till nästa bild"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Ändra inställningar för bildspel"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Alla källbildfiler saknas."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Spela upp"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Fortsätt bildspelet"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Återställer"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Ångrar återställning"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Förbättrar"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Ångrar förbättring"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Skapar ny händelse"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Tar bort händelse"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Flyttar bilder till ny händelse"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Ställer in bilder till föregående händelse"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Slår ihop"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Delar upp"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Skapar kopior av bilderna"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Raderar kopior på bilderna"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Kunde inte kopiera en bild på grund av en felaktig fil"
+msgstr[1] "Det gick inte kopiera %d bilderna på grund av felaktiga filer"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Återställer tidigare betyg"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Ökar betyg"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Sänker betyg"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Ställer in RAW-framkallare"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Återställer tidigare RAW-framkallare"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Bestäm utvecklare"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Den ursprungliga bilden kunde inte justeras."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Justerar datum och tid"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Återställer justering för datum och tid"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Den ursprungliga bilden kunde inte anpassas."
+msgstr[1] "Följande ursprungliga bilder kunde inte anpassas."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Anpassning av tidsfel"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "Tidsanpassningen kunde inte återställas för den här bilden."
+msgstr[1] "Tidsanpassningen kunde inte återställas för följande bilder."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Skapa etikett"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Flytta etiketten \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Flytta bilder till papperskorgen"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Återställ bilder från papperskorgen"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Flytta bilderna till Shotwells papperskorg"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Återställ bilder tillbaka till Shotwell-biblioteket"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Flyttar bilder till papperskorgen"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Återställer bilderna från papperskorgen"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Märk markerade bilder"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Återställ märkningen för markerade bilder"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Märk"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Återställ märkningen"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Låg (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Mellan (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Hög (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Maximal (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Inga bilder eller filmer"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Inga bilder eller filmer hittades"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Bilderna kan inte exporteras till denna mapp."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Kunde inte behandla övervakningsuppdateringar: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Fyll hela sidan"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "Två bilder per sida"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "Fyra bilder per sida"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "Sex bilder per sida"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "Åtta bilder per sida"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 bilder per sida"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 bilder per sida"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "tum"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Plånbokstorlek (2 x 3 tum)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Anteckningskort (3 x 5 tum)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 tum"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 tum"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 tum"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 tum"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 tum"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Plånboksstorlek i centimeter (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Vykortsstorlek (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Bildinställningar"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Skriver ut..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Kunde inte skriva ut bilden:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Kunde inte öppna eller skapa bilddatabasen %s: error code %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Kunde inte skriva till bilddatabasfilen:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Fel vid åtkomst till databasfilen:\n"
+" %s\n"
+"\n"
+"Felet var: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Exportera filmer"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Kunde inte starta Nautilus Send-To: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Skicka till"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Kunde inte exportera bakgrund till %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Kunde inte förbereda skrivbordsbildspel: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Flaggad"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Papperskorg"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Papperskorgen är tom"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Radera"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Raderar bilder"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Saknade filer"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Raderar..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Senaste import"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Importera från mapp..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Importera bilder från hårddisken till biblioteket"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Importera från _program..."
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Sortera händelser"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "_Töm papperskorgen"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Radera alla bilder från papperskorgen"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "_Visa bildhändelse"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Sök"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Sök efter bilder och filmer med sökordet"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Fil"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Redigera"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Bild"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Bilder"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_Händelser"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "_Etiketter"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Hjälp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Grundläggande information"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Visa grundläggande information för markeringen"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Utökad Information"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Visa utökad information för markeringen"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Sökfält"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Visa sökfältet"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "S_idofält"
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Visa sidofältet"
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Stigande"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sortera bilder i stigande ordning"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Fallande"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sortera bilder i fallande ordning"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Importera från mapp"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Töm papperskorgen"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Tömmer papperskorgen..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell har ställts in till att importera bilder till din hemmapp.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Biblioteksplats"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Bilder kan inte importeras från denna mapp."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Uppdaterar biblioteket..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Förbereder automatisk importer av bilder..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Importerar bilder automatiskt..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Skriver metadata till filer..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Bibliotek"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Importerar..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Avbryt importen"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Stoppa bildimporten"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Förbereder import..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Importerade %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Spara"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Spara bild"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "_Spara som..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Spara bilden med ett annat namn"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Skriv ut bilden till en skrivare ansluten till din dator"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s finns inte."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s är inte en fil."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s saknar stöd för filformatet för\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_Spara en kopia"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Förkasta ändringarna i %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "_Stäng utan att spara"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Fel vid sparande till %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Spara som"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Kunde inte övervaka %s: Det är inte en mapp (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Bildhanterare"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Bildvisare"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "Copyright 2009-2013 Yorba Foundation"
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Rotera åt _höger"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Rotera"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Rotera åt höger"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Rotera bilderna åt höger (tryck Ctrl för att rotera åt vänster)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Rotera åt _vänster"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Rotera åt vänster"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Rotera bilderna åt vänster"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Vänd hor_isontellt"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Vänd horisontellt"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Vänd verti_kalt"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Vänd vertikalt"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "Förbä_ttra"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "Förbättra"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Förbättra visningen av bilden automatiskt"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Beskär"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Beskär"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Beskär bildstorlek"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Räta upp"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Räta upp"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Räta upp bilden"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Röda ögon"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Röda ögon"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Minska eller ta bort röda ögon i bilden"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Justera"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Justera"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Justera bildfärg och -ton"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_Återställ till original"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Återställ till original"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Återställ externa r_edigeringar"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Återställ till huvudbild"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Ange som skrivbords_bakgrund"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Ställ in bilden som ny skrivbordsbakgrund"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "_Ställ in som skrivbordsbildspel"
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Ångra"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Ångra"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Gör om"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Gör om"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "B_yt namn på händelse..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Gör till _huvudbild för händelsen"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Gör till huvudbild för händelsen"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Ny händelse"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Ny händelse"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Flytta bilder"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Flytta bilder till en händelse"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Sa_mmanfoga händelser"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Sammanfoga"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Lägg samman händelser till en enskild händelse"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Sätt betyg"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Sätt betyg"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Ändra betyget för din bild"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Höj"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Höj betyg"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Sänk"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Sänk betyg"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Ej betygsatt"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Ej betygsatt"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Ej betygsatt"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Ställer in som ej betygsatt"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Ta bort eventuella betyg"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Förkastad"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Avfärdad"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Ange som förkastad"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Ställer in som förkastad"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Ange som förkastad"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Enbart förkastade"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Enbart nekade"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Visa enbart förkastade bilder"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Alla + _förkastade"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Visa alla bilder, inklusive förkastade"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Alla bilder"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Visa alla bilder"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Betyg"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Visa betyg för varje bild"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtrera bilder"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtrera bilder"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Begränsa antalet bilder som visas baserat på ett filter"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Duplicera"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Duplicera"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Gör en kopia av bilden"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Exportera..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "Skriv _ut..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Pu_blicera..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Publicera"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Publicera till olika webbplatser"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Redigera _titel..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Redigera _kommentar..."
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Redigera kommentar"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Justera datum och tid..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Justera datum och tid"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Lägg till _etiketter..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Lägg till etiketter"
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Lägg till etiketter"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Inställningar"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Öppna med e_xtern redigerare"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Öppna i RA_W-redigerare"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Skicka _till..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Skicka _till..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Sök..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Sök"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"Sök efter en bild genom att skriva något som finns i dess namn eller etikett"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Flagga"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Avf_lagga"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Kunde inte starta redigerare: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Lägg till etiketten \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Lägg till etiketterna \"%s\" och \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_Ta bort etikett \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Ta bort etiketten \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Ta bort etikett"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Nytt"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "B_yt namn på etiketten \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Byt namn på etiketten \"%s\" till \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Byt namn..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Än_dra etiketter..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Ändra etiketter"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Lägg till etiketten \"%s\" till bilderna"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Lägg till etiketten \"%s\" till bilderna"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Lägg till etiketten \"%s\" på de markerade bilderna"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Lägg till etiketten \"%s\" på de markerade bilderna"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Ta bort etiketten \"%s\" från bilderna"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Ta bort etiketten \"%s\" från bilderna"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Ta bort etiketten \"%s\" från bilderna"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Ta bort etiketten \"%s\" från bilderna"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Kunde inte byta namn på etiketten till \"%s\". Etiketten finns redan."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Kunde inte byta namn på sökningen till \"%s\" eftersom sökningen redan finns."
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Sparad sökning"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Ta bort sökning"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "R_edigera..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Byt _namn..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Byt namn på sökningen \"%s\" till \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Ta bort sökningen \"%s\""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Betyg %s"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Sätt betyget %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Sätt betyget till %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Visa %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Visa endast bilder med betyget %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s eller högre"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Visa %s eller högre"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Visa endast bilder med betyget %s eller högre"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Ta bort markerade bilder från papperskorgen"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Ta bort markerade bilder från biblioteket"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "Åt_erställ"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Flytta tillbaka markerade bilder till biblioteket"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Öppna med filhanteraren"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Öppna mappen för den markerade bilden i filhanteraren"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Kunde inte öppna i filhanterare: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Ta _bort från biblioteket"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Flytta till papperskorgen"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "Markera _alla"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Markera alla objekt"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %d %b"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Vinkel:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "Åt_erställ"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Återgå till befintliga bilddimensioner"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Ställ in beskärningen för den här bilden"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Växla mellan porträtt- och landskapsläge"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Obegränsad"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Kvadrat"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Skärm"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Ursprungsstorlek"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD-video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD-video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 tum)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 tum)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Stäng röda ögon-verktyget"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Ta bort eventuella röda ögon i det markerade området"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Mättnad:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Färgton:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Färgtemperatur:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Skuggor:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Återställ färger"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Återställ alla färgjusteringar till de ursprungliga värdena"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Färgtemperatur"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Färgton"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Mättnad"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Exponering"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Skuggor"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Kontrastökning"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Fäst verktygsrad"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Fäst verktygsraden i öppet läge"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Avsluta helskärmsläge"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Avsluta _helskärmsläge"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Avsluta"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Om"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "_Helskärm"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Innehåll"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "Återkommande frågor"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Rapportera ett problem..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Ett allvarligt fel inträffade vid åtkomsten till Shotwells bibliotek. "
+"Shotwell kan inte fortsätta.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Besök Yorbas webbplats"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Daniel Nylander <po@danielnylander.se>\n"
+"Olof Nord <olof_nord_@hotmail.com>\n"
+"Alexander Styre <lessneurope@yandex.com>\n"
+"Joachim Johansson <joachim.j@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Kunde inte visa hjälp: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Det går inte att komma åt bugg-databasen: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Kunde inte visa återkommande frågor: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "namnlös"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Ursprungsstorlek"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Bredd eller höjd"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Bredd"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Höjd"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Justera storleken på miniatyrbilderna"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Öka förstoringen på miniatyrbilderna"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Minska förstoringen på miniatyrbilderna"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Sortera _bilder"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Spela _upp film"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Öppna markerade filmer i systemets filmspelare"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Kommentarer"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Visa kommentarer för varje bild"
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Visa etiketter för varje bild"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "Efter _titel"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Sortera bilder efter titel"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Efter exponerings_ögonblick"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Sortera bilder efter exponeringsögonblick"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Efter _betyg"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Sortera bilder efter betyg"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell kunde inte spela upp den markerade filmen:\n"
+"%s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d bild/video"
+msgstr[1] "%d bilder/filmer"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Visa kommentaren för varje händelse"
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Inga händelser"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Inga händelser hittades"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Händelser"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Odaterad"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Ingen händelse"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Det går inte att skapa cache-mappen %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Kunde inte skapa datakatalogen %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Bilder"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Kunde inte skapa den temporära katalogen %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Kunde inte skapa den underliggande datakatalogen %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Ingen)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Ingen"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Slumpmässigt"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Bildspelsövergångar"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Kunde inte skapa en temporärfil för %s: %s"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Exporterar"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Filen %s finns redan. Vill du ersätta den?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Hoppa över"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Ersätt"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Ersätt _alla"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Exportera"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Bilder"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Filmer"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW-bilder"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW-bilder"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Fel vid inläsning av användargränssnittsfilen %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Typ"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Publicering"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "De valda bilderna eller filmerna publicerades."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "De valda filmerna publicerades."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "De valda bilderna publicerades."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Den markerade filmen publicerades."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Den markerade bilden publicerades."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Hämtar kontoinformation..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Loggar in..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Publicera bilder"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Publicera bilder _till:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Publicera filmer"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Publicera filmer _till"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Publicera bilder och filmer"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Publicera bilder och filmer _till"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Kunde inte publicera"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell kan inte publicera de markerade objekten därför att du inte har "
+"aktiverat en kompatibel insticksmodul för publicering. Välj <b>Redigera %s "
+"Inställningar</b> och aktivera en eller flera av de insticksmoduler för "
+"publicering som finns under fliken <b>Insticksmoduler</b>."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Förbereder uppladdning"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Laddar upp %d av %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+"Publiceringen till %s kan inte fortsätta på grund av att ett fel inträffade:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"För att försöka att publicera till en annan tjänst, välj en från ovanstående "
+"meny."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "_Ny etikett..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+#, fuzzy
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+"En temporärfil som krävs för publicering finns inte tillgänglig"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Du har redan loggat in och ut från Google under denna Shotwell-session.\n"
+"För att fortsätta att publicera till Google så måste du starta om Shotwell "
+"och försök att publicera igen."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Du är för närvarande inte inloggad på YouTube.\n"
+"\n"
+"Du måste redan ha registrerat ett Google-konto och konfigurerat det för "
+"användning med YouTube för att fortsätta. Du kan konfigurera de flesta "
+"konton genom att logga in på YouTube med din webbläsare."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"En fil som krävs för publiceringen saknas. Därför kan publiceringen till "
+"YouTube inte fortsätta."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Du är inloggad på YouTube som %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Filmer kommer att visas i \"%s\""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Publikt listad"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Publikt olistad"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Privat"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Standardtjänster för publicering"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Du är för närvarande inte inloggad på Flickr.\n"
+"\n"
+"Klicka på Logga in för att logga in på Flickr med din webbläsare. Du måste "
+"specifikt godkänna att Shotwell Connect kan länka till ditt Flickr-konto."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har redan loggat in och ut från Flickr under denna Shotwell-session.\n"
+"För att fortsätta att publicera till Flickr, starta om Shotwell och försök "
+"att publicera igen."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Förbereder inloggning..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"En fil som krävs för publiceringen saknas. Därför kan publiceringen till "
+"Flickr inte fortsätta."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Verifierar behörighet..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Du är inloggad på Flickr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ditt gratiskonto på Flickr begränsar hur mycket data som du kan skicka\n"
+"upp per månad. Denna månad har du %d megabyte kvar att ladda upp."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Ditt Flickr Pro-konto låter dig ladda upp obegränsat med data."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Bilderna _visas för:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Filmerna _visas för:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Bilder och filmer _visas för:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Alla"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Endast vänner och familj"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "endast familj"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "endast vänner"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Bara jag"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 pixlar"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 pixlar"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 pixlar"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 pixlar"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Skapar album %s..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "Ett felmeddelande visades vid publiceringen till Piwigo. Försök igen."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Skriv in länken till ditt Piwigo-bildbibliotek, samt ditt Piwigo-"
+"användarnamn och -lösenord."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell kan inte nå ditt Piwigo-bildbibliotek. Kontrollera länkadressen "
+"igen."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Användarnamn och/eller lösenord ogiltigt. Var god försök igen"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Ogiltig länkadress"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Ogiltigt användarnamn eller lösenord"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Administratörer, familj, vänner, kontakter"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Administratörer, familj, vänner"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Administratörer, familj"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Administratörer"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Du är för närvarande inte inloggad på Picasa Web Albums.\n"
+"\n"
+"Klicka på Logga in för att logga in på Picasa Web Albums med din webbläsare. "
+"Du måste specifikt godkänna att Shotwell Connect kan länka till ditt Picasa-"
+"konto."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"En fil som krävs för publiceringen saknas. Därför kan publiceringen till "
+"Picasa inte fortsätta."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Skapar album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Du är inloggad på Picasa webbalbum som %s."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Filmer kommer att visas i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Bilder kommer att visas i:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Liten (640 x 480 bildpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Medel (1024 x 768 bildpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Rekommenderad (1600 x 1200 bildpunkter)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixlar)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Du är för närvarande inte inloggad på Facebook.\n"
+"\n"
+"Om du ännu inte har ett Facebook-konto så kan du skapa ett under "
+"inloggningsprocessen. Under inloggningen kan Shotwell fråga dig om "
+"behörighet att skicka upp bilder och publicera till din logg. Dessa "
+"behörigheter krävs för att Shotwell Connect ska fungera."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Du har redan loggat in och ut från Facebook under denna Shotwell-session.\n"
+"För att fortsätta att publicera på Facebook, starta om Shotwell och försök "
+"att publicera igen."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standard (720 pixlar)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Stor (2048 pixlar)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Testar anslutningen till Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"En fil som krävs för publiceringen saknas. Därför kan publiceringen till "
+"Facebook inte fortsätta."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Du är inloggad på Facebook som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Var vill du publicera de markerade bildera?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "_Storlek att ladda upp:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Vänner"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Smula sönder"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Schackrutig"
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Cirklar"
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Persienner"
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Randig"
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Klocka"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Cirkel"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Standardövergångar för bildspel"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Glid"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Tona ut"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Rutor"
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Core Data-importtjänster"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Välkommen till tjänsten för import av F-Spot-bilbliotek.\n"
+"\n"
+"Välj ett bibliotek att importera, antingen det som Shotwell automatiskt "
+"hittar, eller ett du väljer manuellt."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Välkommen till tjänsten för import av F-Spot-bilbliotek.\n"
+"\n"
+"Välj en F-Spot-databasfil."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Välj manuellt den F-Spot-databasfil du vill importera:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Det går inte att öppna den F-Spot-databasfil som du har valt: antingen "
+"saknas filen, eller så är det inte en F-Spot-databas."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Det går inte att öppna den valda F-Spot-databasfilen: den här versionen av F-"
+"Spot-databasen stöds inte av Shotwell"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Det går inte att läsa den valda F-Spot-databasfilen: ett fel uppstod när "
+"etikettabellen skulle läsas."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Det går inte att läsa den valda F-Spot-databasfilen: ett fel uppstod när "
+"bildtabellen skulle läsas."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell har hittat %d bilder i F-Spot-biblioteket och importerar dem nu. "
+"Dubbletter kommer att hittas och tas bort automatiskt.\n"
+"\n"
+"Du kan stänga den här dialogrutan. Importen kommer att fortsätta bakgrunden."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot-bibliotek: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Förbereder import"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Ange som skrivbordsbildspel"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Skapa bildspel för skrivbordsbakgrunden"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Visa varje bild i"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "tidsperiod"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Hur länge varje bild ska visas på skrivbordsbakgrunden"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Sök"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Namn på sökningen:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Matcha"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "följande:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Storlek på utskriften</b>"
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "Använd en _standardstorlek:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Använd en _anpassad storlek:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_Matcha sidförhållande"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Automatisk storlek:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr "<b>Titlar</b>"
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Skriv ut bild _titel"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Upplösning</b>"
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "_Skriv ut bild till:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "pixlar per tum"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etikett"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Inställningar för Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "vit"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "svart"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Bevaka biblioteksmappen efter nya filer"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Skriv etiketter, titlar och annan _metadata till bildfilerna"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Visning"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Importera bilder till:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Bakgrund:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Import"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Mappstruktur:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Mönster:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Exempel:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "B_yt namn på importerade filer till enbart gemener"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW-redigerare"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "_Standard:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "E_xtern bildredigerare:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Extern _RAW-redigerare:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Externa redigerare"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Insticksmoduler"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Fördröjning:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Övergångseffekt:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "_Övergångsfördröjning:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "_Visa rubrik"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "sekunder"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Logga in"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "Publicera till ett _befintligt album:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Skapa ett _nytt album med namnet:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr "Videor och nya fotoalbum är _synliga för:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Logga ut"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Publicera"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Bild_storlek:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "Ett _befintligt album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Ett _nytt album med namnet:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "L_ista album i publikt galleri"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Förval för foto_storlek:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "_URL till ditt Piwigo-fotobibliotek"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Användar_namn"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Lösenord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Kom ihåg lösenord"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Logga in"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "En _befintlig kategori:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Foton kommer att kunna _ses av:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr "Foto_storlek:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Logga ut"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr "Integritetsinställningar för video:"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Copyright 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 pixlar"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' är inte ett giltigt svar på autentiseringsförsöket med OAuth."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): går inte att starta. Detta publiceringsverktyg "
+"går inte att starta om."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "Fyll i användarnamn och lösenord för ditt Tumblr-konto."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Kunde inte ladda användargränssnittet: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Du är inloggad på Tumblr som %s.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Besök webbplatsen för Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Du är för närvarande inte inloggad på Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_E-postadress"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Du är nu inloggad på Tumblr som (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Bloggar:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Album (eller skriv nytt):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Åtkomst_typ:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Inaktivera _kommentarer"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Förbjud nedladdning av ursprunglig bild"
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 0000000..df26457
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,4877 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# shkumar <shkumar@redhat.com>, 2012-2013.
+# shkumar <shkumar@redhat.com>, 2012, 2014.
+# verayin <vera@yorba.org>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-16 09:35+0000\n"
+"PO-Revision-Date: 2014-02-03 13:05+0630\n"
+"Last-Translator: Shantha kumar <shkumar@redhat.com>\n"
+"Language-Team: American English <kde-i18n-doc@kde.org>\n"
+"ta/)\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "வெளியிடுவதற்குத் தேவையான ஒரு தற்காலிகக் கோப்பு இல்லை"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"இந்த Shotwell அமர்வின் போது நீங்கள் ஏற்கனவே ஒரு Google சேவையிலிருந்து "
+"வெளியேறிவிட்டீர்கள்.\n"
+"\n"
+"Google சேவைகளுக்கு வெளியிடுதலைத் தொடர, Shotwell இலிருந்து வெளியேறிவிட்டு "
+"மீண்டும் "
+"தொடங்கி, பிறகு மீண்டும் வெளியிட முயற்சிக்கவும்."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "யோர்பா தளத்திற்கு செல்"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr "மொழி பெயர்ப்பு பங்கு "
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "பதிப்புரிமை 2009-2013 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-ஸ்பாட் தரவக இறக்குமதி சேவைக்கு வரவேற்கிறோம்.\n"
+"\n"
+"முன்பே உள்ளதாக ஷாட்வெல் கண்டறிந்துள்ள தரவகங்களிலிருந்து ஒன்றைத் "
+"தேர்ந்தொடுத்தோ அல்லது ஒரு "
+"மாற்றும் F-ஸ்பாட் தரவுத்தளக் கோப்பைத் தேர்ந்தெடுத்தோ, இறக்குமதி செய்ய ஒரு "
+"தரவகத்தைத் "
+"தேர்ந்தெடுக்கவும்."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-ஸ்பாட் தரவக இறக்குமதி சேவைக்கு வரவேற்கிறோம்.\n"
+"\n"
+"ஒரு F-ஸ்பாட் தரவுத்தளக் கோப்பைத் தேர்ந்தெடுக்கவும்."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+"இறக்குமதி செய்ய நீங்களே ஒரு F-ஸ்பாட் தரவுத்தளக் கோப்பைத் தேர்ந்தெடுக்கவும்:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"தேர்ந்தெடுத்த F-ஸ்பாட் தரவுத்தளக் கோப்பைத் திறக்க முடியாது: அந்தக் கோப்பு "
+"இல்லை அல்லது அது "
+"ஒரு F-ஸ்பாட் தரவுத்தளம் இல்லை"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"தேர்ந்தெடுத்த F-ஸ்பாட் தரவுத்தளக் கோப்பைத் திறக்க முடியாது: F-ஸ்பாட்டின் "
+"இந்தப் பதிப்பை "
+"ஷாட்வெல் ஆதரிக்காது"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"தேர்ந்தெடுத்த F-ஸ்பாட் தரவுத்தளக் கோப்பைப் படிக்க முடியாது: குறிச்சொற்கள் "
+"அட்டவணையைப் "
+"படிக்கும் போது பிழை ஏற்பட்டது"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"தேர்ந்தெடுத்த F-ஸ்பாட் தரவுத்தளக் கோப்பைப் படிக்க முடியாது: புகைப்படங்கள் "
+"அட்டவணையைப் "
+"படிக்கும் போது பிழை ஏற்பட்டது"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"F-ஸ்பாட் தரவகத்தில் %d புகைப்படங்களைக் கண்டறிந்துள்ளது, அவற்றை இப்போது "
+"இறக்குமதி "
+"செய்கிறது. நகல் பிரதிகள் இருந்தால் கண்டறியப்பட்டு தானாக நீக்கப்படும்.\n"
+"\n"
+"நீங்கள் இந்த உரையாடல் பெட்டியை மூடிவிட்டு, ஷாட்வெல்லை தொடர்ந்து "
+"பயன்படுத்தலாம், ஷாட்வெல் "
+"இறக்குமதி செயலை பின்புலத்தில் தொடரும்."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-ஸ்பாட் தரவகம்: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "இறக்குமதி செய்ய தயார் செய்கிறது"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "பிரதான தரவு இறக்குமதி சேவைகள்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "பதிப்புரிமை 2012 BJA எலக்ட்ரானிக்ஸ்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 பிக்சல்கள்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 பிக்சல்கள்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 பிக்சல்கள்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"'%s' என்பது ஒரு OAuth அங்கீகரிப்புக் கோரிக்கைக்கான சரியான ஒரு பதிலளிப்பல்ல"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): தொடங்க முடியவில்லை; இந்த பப்ளிஷர் மறுதொடக்கம் "
+"செய்யத்தக்கதல்ல."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"உங்கள் Tumblr கணக்குக்குரிய பயனர் பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "பயனர்பெயர் மற்றும்/அல்லது கடவுச்சொல் தவறு. மீண்டும் முயற்சிக்கவும்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "தவறான பயனர் பெயர் அல்லது கடவுச்சொல்"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI ஏற்ற முடியவில்லை: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"நீங்கள் Tumblr இல் %s ஆக புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "பதிப்புரிமை 2010+ எவ்ஜெனி பொலியாக்கோவ் <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki வலைத்தளத்தைப் பார்க்கவும்"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "நீங்கள் தற்போது Yandex.Fotki இல் புகுபதிவு செய்துள்ளீர்கள்."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+#| msgid "Core Publishing Services"
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell Extra வெளியீடு சேவைகள்"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "லேபிள்"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "மின்னஞ்சல் முகவரி (_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "கடவுச்சொல் (_P)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "புகுபதிவு"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"நீங்கள் Tumblr இல் (name) ஆக புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+"(இந்த லேபிளின் சரம் குறியீட்டுக்குள் அமைக்கப்பட்டுள்ளது, \n"
+"ஆகவே இங்கு செய்யப்படும் மாற்றங்கள் காண்பிக்கப்படாது)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "வலைப்பதிவுகள்:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "புகைப்படத்தின் அளவு: (_s)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "வெளியேறு (_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "வெளியிடு (_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "ஆல்பங்கள் (அல்லது புதிதாக ஒன்றை எழுது) (_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "அணுகல் வகை (_t):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "கருத்துகளை முடக்கு (_c)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "அசல் புகைப்படத்தைப் பதிவிறக்குவதைத் தடை செய் (_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+#| msgid "Publish"
+msgid "Public"
+msgstr "பொது"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "நண்பர்கள்"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "தனிப்பட்டவை"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "ஷாட்வெல் கனெக்ட்"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"நீங்கள் தற்போது Facebook இல் புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+"உங்களிடம் Facebook கணக்கு இல்லாவிட்டால், புகுபதிவு செயலின் போது ஒரு கணக்கை "
+"உருவாக்கிக்கொள்ளலாம். புகுபதிவின் போது ஷாட்வெல் கனெக்ட் புகைப்படங்களைப் "
+"பதிவேற்றவும் உங்கள் "
+"ஊட்டத்தில் வெளியிடவும் உங்களிடம் அனுமதி கேட்கும். ஷாட்வெல் கனெக்ட் செயல்பட "
+"இந்த அனுமதிகள் "
+"தேவை."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"நீங்கள் இந்த ஷாட்வெல் அமர்வின் போது Facebook இல் ஏற்கனவே புகுபதிவு செய்து "
+"வெளியேறிவிட்டீர்கள்.\n"
+"Facebook இல் வெளியிடும் செயலைத் தொடர, ஷாட்வெல்லிலிருந்து வெளியேறி அதை "
+"மீண்டும் தொடங்கி "
+"மீண்டும் வெளியிட முயற்சிக்கவும்."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "வழக்கமானது (720 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "பெரியது (2048 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook க்கான இணைப்பை சோதிக்கிறது..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "ஆல்பத்தை உருவாக்குகிறது..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"வெளியிடுதலுக்குத் தேவையான ஒரு கோப்பு கிடைக்கவில்லை. Facebook இல் வெளியிடும் "
+"செயலைத் "
+"தொடர முடியாது."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"நீங்கள் Facebook இல் %s என்ற பெயரில் புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை எங்கு வெளியிட வேண்டும்?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "பதிவேற்ற அளவு (_s):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "எனக்கு மட்டும்"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "எல்லோருக்கும்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"நீங்கள் தற்போது Flickr இல் புகுபதிவு செய்தில்லை.\n"
+"\n"
+"Flickr இல் புகுபதிவு செய்ய உங்கள் உலாவியில் புகுபதிவு என்பதைக் கிளிக் "
+"செய்யவும். உங்கள் "
+"Flickr கணக்கை இணைக்க Shotwell க்கு அங்கீகாரம் அளிக்க வேண்டும்."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"நீங்கள் இந்த ஷாட்வெல் அமர்வின் போது Flickr இல் ஏற்கனவே புகுபதிவு செய்து "
+"வெளியேறிவிட்டீர்கள்.\n"
+"Flickr இல் வெளியிடும் செயலைத் தொடர, ஷாட்வெல்லிலிருந்து வெளியேறி அதை மீண்டும் "
+"தொடங்கி "
+"மீண்டும் வெளியிட முயற்சிக்கவும்."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "புகுபதிவுக்கு தயார் செய்கிறது..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"வெளியிடுதலுக்குத் தேவையான ஒரு கோப்பு கிடைக்கவில்லை. Flickr இல் வெளியிடும் "
+"செயலைத் "
+"தொடர முடியாது."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "அங்கீகாரத்தை சரிபார்க்கிறது..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"நீங்கள் Flickr இல் %s என்ற பெயரில் புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"உங்கள் இலவச Flickr கணக்கில் ஒரு மாதத்தில் நீங்கள் எவ்வளவு தரவைப் பதிவேற்ற "
+"முடியும் "
+"என்பதற்குக் கட்டுப்பாடு உள்ளது.\n"
+"இந்த மாதத்திற்கான உங்கள் பதிவேற்ற ஒதுக்கீட்டில் உங்களுக்கு %d மெகாபைட் "
+"மீதமுள்ளது."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"உங்களிடம் Flickr Pro கணக்கு இருந்தால், நீங்கள் வரம்பில்லாமல் பதிவேற்றலாம்."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "புகைப்படங்கள் இவர்களுக்குத் தெரியும் (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "வீடியோக்கள் இவர்களுக்குத் தெரியும் (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "புகைப்படங்களும் வீடியோக்களும் இவர்களுக்குத் தெரியும் (_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "நண்பர்களுக்கும் குடும்பத்தினருக்கும் மட்டும்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "குடும்பத்தினருக்கு மட்டும்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "நண்பர்களுக்கு மட்டும்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 பிக்சல்கள்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 பிக்சல்கள்"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "அசல் அளவு"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"நீங்கள் தற்போது Picasa Web Albums இல் புகுபதிவு செய்திருக்கவில்லை.\n"
+"\n"
+"உங்கள் உலாவியில் Picasa Web Albums இல் புகுபதிவு செய்ய உள்நுழை என்பதைக் "
+"கிளிக் "
+"செய்யவும். Shotwell Connect உங்கள் Picasa Web Albums கணக்குக்கு இணைப்பை "
+"ஏற்படுத்த "
+"நீங்கள் அதனை அங்கீகரித்திருக்க வேண்டும்."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"வெளியிடுதலுக்குத் தேவையான ஒரு கோப்பு கிடைக்கவில்லை. Picasa இல் வெளியிடும் "
+"செயலைத் "
+"தொடர முடியாது."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+"நீங்கள் Picasa வலை ஆல்பங்களில் %s என்ற பெயரில் புகுபதிவு செய்துள்ளீர்கள்."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "வீடியோக்கள் இங்கு தோன்றும்:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "புகைப்படங்கள் இங்கு தோன்றும்:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "சிறியது (640 x 480 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "நடுத்தரம் (1024 x 768 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "பரிந்துரைப்பது (1600 x 1200 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 பிக்சல்கள்)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "அசல் அளவு"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s எனும் ஆல்பத்தை உருவாக்குகிறது..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Piwigo இல் வெளியிடும்போதுஒரு பிழை செய்தி ஏற்பட்டது. மீண்டும் முயற்சிக்கவும்."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"உங்கள் Piwigo புகைப்பட லைப்ரரியின் URL மற்றும் அந்த லைப்ரரிக்கான Piwigo "
+"கணக்கின் பயனர் "
+"பெயர் மற்றும் கடவுச்சொல்லையும் உள்ளிடவும்."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"ஷாட்வெல்லால் உங்கள் Piwigo புகைப்பட லைப்ரரியைத் தொடர்புகொள்ள முடியவில்லை. "
+"நீங்கள் கொடுத்த "
+"URL சரியா எனப் பார்க்கவும்"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "தவறான URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "நிர்வாகிகள், குடும்பத்தினர், நண்பர்கள், தொடர்புகள்"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "நிர்வாகிகள், குடும்பத்தினர், நண்பர்கள்"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "நிர்வாகிகள், குடும்பத்தினர்"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "நிர்வாகிகள்"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"நீங்கள் தற்போது YouTube இல் புகுபதிவு செய்திருக்கவில்லை.\n"
+"\n"
+"நீங்கள் தொடர, ஏற்கனவே ஒரு Google கணக்குக்கு பதிவு பெற்று அதை YouTube க்குப் "
+"பயன்படுத்த "
+"அமைத்திருக்க வேண்டும். நீங்கள் பெரும்பாலான கணக்குகளை YouTube தளத்தில் "
+"புகுபதிவு செய்ய "
+"ஒரு முறையேனும் உங்கள் உலாவியைப் பயன்படுத்துவதன் இப்படி அமைக்க முடியும்."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"வெளியிடுதலுக்குத் தேவையான ஒரு கோப்பு கிடைக்கவில்லை. Youtube இல் வெளியிடும் "
+"செயலைத் "
+"தொடர முடியாது."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "நீங்கள் YouTube இல் %s என்ற பெயரில் புகுபதிவு செய்துள்ளீர்கள்."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "வீடியோக்கள் இங்கு தோன்றும் '%s'"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "பொதுவாக பட்டியலிடப்பட்டவை"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "பொதுவாக பட்டியலிடாதவை"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (உரையானது fb பயனர்பெயரைப் பொறுத்தது, மேலும் அது பயன்பாட்டில் மாற்றம் "
+"செய்யப்பட்டிருக்கும் - \n"
+"இந்தப் புலத்தில் இடும் எதுவும் காண்பிக்கப்படாது)"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "முன்பே உள்ள ஒரு ஆல்பத்தில் வெளியிடு (_x):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "இந்த பெயரில் ஒரு புதிய ஆல்பத்தை உருவாக்கு (_n):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "வீடியோக்களும் புதிய புகைப்பட ஆல்பங்களும் இவர்களுக்குத் தெரியும் (_v):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"பதிவேற்றும் முன்பு, இருப்பிடம், கேமரா மற்றும் பிற அடையாளம் காணக்கூடிய தகவலை "
+"நீக்கவும் "
+"(_R)"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"உங்கள் உலாவியில் Flickr இல் நீங்கள் புகுபதிவு செய்ததும் காண்பிக்கப்படும் "
+"உறுதிப்படுத்தல் "
+"எண்ணை உள்ளிடவும்."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "அங்கீகரிப்பு எண் (_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "தொடரு (_t)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"நீங்கள் Flickr இல் (name) ஆக புகுபதிவு செய்துள்ளீர்கள்.\n"
+"\n"
+"(இந்த லேபிளின் சரம் குறியீட்டுக்குள் நிரப்பப்பட்டு அமைக்கப்பட்டுள்ளது, \n"
+"ஆகவே இங்கு செய்யப்படும் மாற்றங்கள் காண்பிக்கப்படாது)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr "புலப்படுதன்மை லேபிள் (குறியிட்டில் நிரப்பட்டுள்ளது) (_v)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'நீங்கள் $name' ஆக புகுபதிவு செய்துள்ளீர்கள்\n"
+"(பயன்பாட்டுக் குறியீட்டில் நிரப்பப்பட்டுள்ளது)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "முன்பே உள்ள ஆல்பம் (_e):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "இந்தப் பெயரில் ஒரு புதிய ஆல்பம் (_n):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "பொது கேலரியில் உள்ள ஆல்பத்தைப் பட்டியலிடு (_i)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype இதில் தோன்றும்\n"
+"(குறியீட்டில் நிரப்பப்பட்டுள்ளது)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "புகைப்பட அளவு முன்னமைப்பு (_s):"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "உங்கள் Piwigo புகைப்பட லைப்ரரியின் URL (_U)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "பயனர் பெயர் (_n)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "கடவுச்சொல்லை நினைவில் கொள் (_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "முன்பே உள்ள வகை (_e):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "புகைப்படங்கள் இவர்களுக்குத் தெரியும் (_v):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "புகைப்படத்தின் அளவு:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "பகுப்புக்குள்:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "ஆல்பம் கருத்து:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"ஒரு தலைப்பு அமைக்கப்பட்டு, கருத்து அமைக்கப்படாவிட்டால், தலைப்பையே கருத்தாகப் "
+"பயன்படுத்து "
+"(_I)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "குறிச்சொற்களைப் பதிவேற்ற வேண்டாம் (_D)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "வெளியேறு"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "வெளியிடு"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "பிரதான வெளியீடு சேவைகள்"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "வீடியோ தனியுரிமை அமைப்புகள் (_s):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "ப்ளைன்ட்ஸ்"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "சதுரங்கம்"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "வட்டம்"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "வட்டங்கள்"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "கடிகாரம்"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "உடைந்து விழுதல்"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "மங்குதல்"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "ஸ்லைடு"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "சதுரங்கள்"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "பட்டைகள்"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "பிரதான ஸ்லைடு காட்சி மாற்றங்கள்"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"பதிப்புரிமை 2010 Maxim Kartashev, பதிப்புரிமை 2011-2013 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "%s என்ற தேக்கக கோப்பகத்தை உருவாக்க முடியவில்லை: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "%s தரவு கோப்பகத்தை உருவாக்க முடியவில்லை: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "புகைப்படங்கள்"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "%s தற்காலிக கோப்பகத்தை உருவாக்க முடியவில்லை: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "%s தரவு துணைக்கோப்பகத்தை உருவாக்க முடியவில்லை: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "கருவிப் பட்டையை ஒட்டு"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "கருவிப் பட்டையை திறந்தபடியே ஒட்டு "
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "முழு திரை நிலையை விலகு"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_முழு திரை நிலையை விலகு"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_விலகு"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "_பற்றி"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "முழு _திரை"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_உள்ளடக்கம்"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "அதிகம் கேட்கப்படும் கேள்விகள் (_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "ஒரு சிக்கல் குறித்து புகாரளி (_R)..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_விடு"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"ஷாட்வெல் சேகரிப்பு அணுகலில் பிழை. \n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "உதவி பகுதியை காண்பிக்க இயலவில்லை: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "வழு தரவுத்தளத்திற்கு வழிச்செலுத்த முடியவில்லை: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQ ஐக் காண்பிக்க முடியவில்லை: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "வெற்றி"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "கோப்புப் பிழை"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "கோப்பை குறிநீக்கம் செய்ய முடியவில்லை"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "தரவுத்தளப் பிழை"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "பயனர் இறக்குமதியைக் கைவிட்டார்"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "கோப்பல்ல"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "தரவுத்தளத்தில் கோப்பு ஏற்கனவே உள்ளது"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "கோப்பு வடிவம் ஆதரிக்கப்படாதது"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "படக் கோப்பல்ல"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "வட்டு தோல்வி"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "வட்டு நிரம்பிவிட்டது"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "கேமரா பிழை"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "கோப்பு எழுதுதல் பிழை"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "சிதைந்த படக் கோப்பு"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "இறக்குமதி தோல்வி (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "ஸ்லைடுக் காட்சி (_l)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "புகைப்பட சறுக்கை ஓட்டு"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "புகைப்படங்களை/ஒளிதோற்றங்களை ஏற்றுமதி செய்"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "புகைப்படங்களை/வீடியோக்களை ஏற்றுமதி செய்"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "புகைப்படங்களை ஏற்றுமதி செய்"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "புகைப்படங்களை ஏற்றுமதி செய்"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "சுழற்றல் செய்கை"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "செய்த சுழற்றை தவிர்"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "கிடை சுழற்றல் செய்கை"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "செய்த கிடை சுழற்றை தவிர்"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "செங்குத்து சுழற்றல் செய்கை"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "செய்த செங்குத்து சுழற்றை தவிர்"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "பின்செல்"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "பின் சென்றதை தவிர்"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "செம்மைபாடு செய்கை"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "செய்த செம்மைபாட்டை தவிர்"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "நிற மாற்றங்களைப் பயன்படுத்துகிறது"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "நிற மாற்றங்களை செயல்தவிர்க்கிறது"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "புதிய நிகழ்வாக்கம்"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "நிகழ்வு நீக்கல்"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "புகைப்படங்களை புதிய நிகழ்வில் அடக்கு"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "புகைப்படங்களை முன் நிகழ்வில் அடக்கு"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "ஒன்றிணைப்பு"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "ஒன்றிணைப்பை பிரி"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "புகைப்படங்களை நகல்படுத்தல்"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "நகல் புகைப்படங்களை நீக்கு"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "கோப்புப் பிழையினால் புகைப்படத்தை நகல் செய்ய முடியவில்லை"
+msgstr[1] "கோப்புப் பிழையினால் %d புகைப்படங்களை நகல் செய்ய முடியவில்லை "
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "தரங்களை முன்னிலைப்படுத்து"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "தரங்களை கூட்டு"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "தரங்களை குறை"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW டெவலப்பரை அமைக்கிறது"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "முந்தைய RAW டெவலப்பரை மீட்டமைக்கிறது"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "டெவலப்பரை அமை"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "அசல் புகைப்படத்தை திருத்த முடியவில்லை."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "நாள் மற்றும் நேரத்தை திருத்து"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "திருத்திய நாள்/நேரத்தை தவிர்"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ஒரு அசல் புகைப்படத்தை சரி செய்ய முடியவில்லை."
+msgstr[1] "பின்வரும் அசல் புகைப்படங்களை சரி செய்ய முடியவில்லை."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "நேரம் சரி செய்தல் பிழை"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"பின்வரும் புகைப்படக் கோப்பில் செய்த சரிசெய்தல் செயல்களை செயல்தவிர்க்க "
+"முடியவில்லை."
+msgstr[1] ""
+"பின்வரும் புகைப்படக் கோப்புகளில் செய்த சரிசெய்தல் செயல்களை செயல்தவிர்க்க "
+"முடியவில்லை."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "குறியை உருவாக்கு"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" குறியை நகர்த்து"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "புகைப்படங்களை குப்பையில் போடு"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "புகைப்படங்களை குப்பையிலிருந்து மீட்டெடு"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "புகைப்படங்களை ஷாட்வெல் குப்பையில் போடு"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "புகைப்படங்களை மீண்டும் ஷாட்வெல் தரவகத்திற்கு மீட்டெடு"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "புகைப்படங்களை குப்பையில் போடுகிறது"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "புகைப்படங்களை குப்பையில் இருந்து மீட்டெடுக்கிறது"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களைக் கொடியிடு"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களிலிருந்து கொடியை நீக்கு"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களைக் கொடியிடுகிறது"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களைக் கொடியகற்றுகிறது"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "கொடியிடு"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "கொடியை நீக்கு"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "நாட்டலஸ் சென்ட்-டு வைத் தொடக்க முடியவில்லை: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "சென்ட் டு"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "பின்புலத்தை %s க்க்கு ஏற்றுமதி செய்ய முடியவில்லை: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "டெஸ்க்டாப் ஸ்லைடு காட்சியைத் தயார்செய்ய முடியவில்லை: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"இதனால் ஒரு புகைப்படத்திலிருந்து \"%s\" குறி நீக்கப்படும். தொடர வேண்டுமா?"
+msgstr[1] ""
+"இதனால் %2$d புகைப்படங்களிலிருந்து \"%1$s\" குறி நீக்கப்படும். தொடர வேண்டுமா?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "நீக்கு (_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "இதனால் சேமிக்கப்பட்ட தேடல் \"%s\" நீக்கப்படும். தொடர வேண்டுமா?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"டெவலப்பர்களை மாற்றினால் Shotwell இல் நீங்கள் இந்தப் புகைப்படத்தில் செய்த "
+"மாற்றங்கள் அனைத்தும் "
+"செயல்தவிர்க்கப்படும்"
+msgstr[1] ""
+"டெவலப்பர்களை மாற்றினால் Shotwell இல் நீங்கள் இந்தப் புகைப்படங்களில் செய்த "
+"மாற்றங்கள் அனைத்தும் "
+"செயல்தவிர்க்கப்படும்"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "டெவலப்பரை மாற்று (_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "வீடியோவை ஏற்றுமதி செய்"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"உங்களுக்கு %s இல் எழுதும் அனுமதி இல்லாததால் ஷாட்வெல்லால் இந்தப் "
+"புகைப்படத்தைத் திருத்த ஒரு "
+"கோப்பை உருவாக்க முடியவில்லை."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"கோப்புப் பிழை காரணமாக இந்தப் புகைப்படத்தை ஏற்றுமதி செய்ய முடியவில்லை.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"ஏற்றுமதியைத் தொடர விரும்புகிறீர்களா?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "மாற்றம் செய்யப்படாதது"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "நடப்பு"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "வடிவம் (_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "தரம் (_Q):"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "அளவுமாற்றுதல் கட்டுப்பாடு (_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "பிக்சல்கள் (_p)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "மீத்தரவை ஏற்றுமதி செய்"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "விவரங்களைச் சேமி..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "விவரங்களைச் சேமி"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(இன்னும் %d)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "முடிவுகள் அறிக்கையை இறக்குமதி செய்"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d கோப்பை இறக்குமதி செய்ய முயற்சித்தது."
+msgstr[1] "%d கோப்புகளை இறக்குமதி செய்ய முயற்சித்தது."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "இவற்றில், %d கோப்பை வெற்றிகரமாக இறக்குமதி செய்தது."
+msgstr[1] "இவற்றில், %d கோப்புகளை வெற்றிகரமாக இறக்குமதி செய்தது."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+"நகல் பிரதியாக இருந்த புகைப்படங்கள்/வீடியோக்கள் இறக்குமதி செய்யப்படவில்லை:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "முன்பே உள்ள மீடியா உருப்படியை நகல் பிரதியெடுக்கும்"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"கேமரா பிழைகளின் காரணமாக இறக்குமதி செய்யப்படாத புகைப்படங்கள்/வீடியோக்கள்:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "பிழை செய்தி:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"புகைப்படங்கள் அல்லது வீடியோக்களாக அடையாளம் காணப்படாததால் இறக்குமதி "
+"செய்யப்படாத கோப்புகள்:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Shotwell க்குப் புரிகின்ற வடிவமைப்பில் இல்லாததால் இறக்குமதி செய்யப்படாத "
+"புகைப்படங்கள்/"
+"வீடியோக்கள்:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Shotwell இன் தரவகத்திற்கு நகலெடுக்க முடியாததால் இறக்குமதி செய்யப்படாத "
+"புகைப்படங்கள்/"
+"வீடியோக்கள்:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s ஐ \n"
+"\t%s க்கு நகலெடுக்க முடியவில்லை"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+"கோப்புகள் சிதைந்துள்ளதால் புகைப்படங்கள்/வீடியோக்கள் இறக்குமதி செய்யப்படவில்லை:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "மற்ற காரணங்களுக்காக இறக்குமதி செய்யப்படாத புகைப்படங்கள்/வீடியோக்கள்:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 நகல் பிரதி புகைப்படம் இறக்குமதி செய்யப்படவில்லை:\n"
+msgstr[1] "%d நகல் பிரதி புகைப்படங்கள் இறக்குமதி செய்யப்படவில்லை:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 நகல் பிரதி வீடியோ இறக்குமதி செய்யப்படவில்லை:\n"
+msgstr[1] "%d நகல் பிரதி வீடியோக்கள் இறக்குமதி செய்யப்படவில்லை:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 நகல் பிரதி புகைப்படம்/வீடியோ இறக்குமதி செய்யப்படவில்லை:\n"
+msgstr[1] ""
+"%d நகல் பிரதி புகைப்படங்கள்/வீடியோக்கள் இறக்குமதி செய்யப்படவில்லை:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக 1 புகைப்படத்தின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக %d புகைப்படங்களின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக 1 வீடியோவின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக %d வீடியோக்களின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக 1 புகைப்படத்தின்/வீடியோவின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக %d புகைப்படங்கள்/வீடியோக்களின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக 1 கோப்பின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"கோப்பு அல்லது வன்பொருள் பிழை காரணமாக %d கோப்புகளின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக 1 புகைப்படத்தின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக %d புகைப்படங்களின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக 1 வீடியோவின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக %d வீடியோக்களின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக 1 "
+"புகைப்படம்/வீடியோவின் "
+"இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக %d "
+"புகைப்படங்கள்/வீடியோக்களின் "
+"இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக 1 கோப்பின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"புகைப்படத் தரவகக் கோப்புறையில் எழுத முடியாத நிலை காரணமாக %d கோப்புகளின் "
+"இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "கேமரா பிழை காரணமாக 1 புகைப்படத்தின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] "கேமரா பிழை காரணமாக %d புகைப்படங்களின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "கேமரா பிழை காரணமாக 1 வீடியோவின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] "கேமரா பிழை காரணமாக %d வீடியோக்களின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"கேமரா பிழை காரணமாக 1 புகைப்படம்/வீடியோவின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"கேமரா பிழை காரணமாக %d புகைப்படங்கள்/வீடியோக்களின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "கேமரா பிழை காரணமாக 1 கோப்பின் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] "கேமரா பிழை காரணமாக %d கோப்புகளின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "1 புகைப்படம் சிதைந்திருந்ததால், அதன் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"%d புகைப்படங்கள் சிதைந்திருந்ததால், அவற்றின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "1 வீடியோ சிதைந்திருந்ததால், அதன் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"%d வீடியோக்கள் சிதைந்திருந்ததால், அவற்றின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"1 புகைப்படம்/வீடியோ சிதைந்திருந்ததால், அதன் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"%d புகைப்படங்கள்/வீடியோக்கள் சிதைந்திருந்ததால், அவற்றின் இறக்குமதி "
+"தோல்வியடைந்தது:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "1 கோப்பு சிதைந்திருந்ததால், அதன் இறக்குமதி தோல்வியடைந்தது:\n"
+msgstr[1] ""
+"%d கோப்புகள் சிதைந்திருந்ததால், அவற்றின் இறக்குமதி தோல்வியடைந்தது:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "ஆதரிக்கப்படாத 1 புகைப்படம் தவிர்க்கப்பட்டது:\n"
+msgstr[1] "ஆதரிக்கப்படாத %d புகைப்படங்கள் தவிர்க்கப்பட்டது:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "படமல்லாத 1 கோப்பு தவிர்க்கப்பட்டது.\n"
+msgstr[1] "படமல்லாத %d கோப்புகள் தவிர்க்கப்பட்டன.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "பயனர் ரத்து செய்ததால் 1 புகைப்படம் தவிர்க்கப்பட்டது:\n"
+msgstr[1] "பயனர் ரத்து செய்ததால் %d புகைப்படங்கள் தவிர்க்கப்பட்டன:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "பயனர் ரத்துசெய்ததால் 1 வீடியோ தவிர்க்கப்பட்டது:\n"
+msgstr[1] "பயனர் ரத்துசெய்ததால் %d வீடியோக்கள் தவிர்க்கப்பட்டன:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "பயனர் ரத்து செய்ததால் 1 புகைப்படம்/வீடியோ தவிர்க்கப்பட்டது:\n"
+msgstr[1] ""
+"பயனர் ரத்து செய்ததால் %d புகைப்படங்கள்/வீடியோக்கள் தவிர்க்கப்பட்டன:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "பயனர் ரத்து செய்ததால் 1 கோப்பு தவிர்க்கப்பட்டது:\n"
+msgstr[1] "பயனர் ரத்து செய்ததால் %d கோப்பு தவிர்க்கப்பட்டது:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 புகைப்படம் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டது.\n"
+msgstr[1] "%d புகைப்படங்கள் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டன.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 வீடியோ வெற்றிகரமாக இறக்குமதி செய்யப்பட்டது.\n"
+msgstr[1] "%d வீடியோக்கள் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டன.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 புகைப்படம்/வீடியோ வெற்றிகரமாக இறக்குமதி செய்யப்பட்டது.\n"
+msgstr[1] "%d புகைப்படங்கள்/வீடியோக்கள் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டன.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "புகைப்படங்கள் அல்லது வீடியோக்கள் இறக்குமதி செய்யப்படவில்லை.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "இறக்குமதி முடிந்தது"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d வினாடி"
+msgstr[1] "%d வினாடிகள்"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d நிமிடம்"
+msgstr[1] "%d நிமிடங்கள்"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d மணி"
+msgstr[1] "%d மணி"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 நாள்"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "நிகழ்வுக்கு மறுபெயரிடு"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "பெயர்:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "தலைப்பை மாற்று"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "தலைப்பு:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "நிகழ்வுக் கருத்தைத் திருத்து"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "புகைப்பட/வீடியோ கருத்தைத் திருத்து"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "கருத்து:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "குப்பை கோப்பு (_T)"
+msgstr[1] "குப்பை கோப்புகள் (_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "நீக்க மட்டும் (_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "வைத்திரு (_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "வெளியே செய்த மாற்றங்களை ரத்து செய்து மீட்டமைக்கவா?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "வெளியே செய்த மாற்றங்களை ரத்து செய்து மீட்டமைக்கவா?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"இதனால் வெளியே உள்ள கோப்பில் செய்த மாற்றங்கள் அனைத்தும் கைவிடப்படும். தொடர "
+"வேண்டுமா?"
+msgstr[1] ""
+"இதனால் வெளியே உள்ள %d கோப்ப்புகளில் செய்த மாற்றங்கள் அனைத்தும் கைவிடப்படும். "
+"தொடர வேண்டுமா?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "வெளியே செய்த மாற்றங்களை ரத்து செய்து மீட்டமை (_v)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "வெளியே செய்த மாற்றங்களை ரத்து செய்து மீட்டமைக்கவா (_v)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "இதனால் புகைப்படம் தரவகத்திலிருந்து நீக்கப்படும். தொடர வேண்டுமா?"
+msgstr[1] ""
+"இதனால் %d புகைப்படங்கள் தரவகத்திலிருந்து நீக்கப்படும். தொடர வேண்டுமா?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "நீக்கு (_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "புகைப்படத்தை தரவகத்திலிருந்து நீக்கு"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "புகைப்படங்களை தரவகத்திலிருந்து நீக்கு"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 மணி"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "புகைப்படங்களை/வீடியோக்களை அதே அளவுக்கு மாற்று (_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "எல்லா புகைப்படங்களையும்/வீடியோக்களையும் இந்த நேரத்திற்கு அமை"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "அசல் புகைப்படக் கோப்பில் மாற்றம் செய் (_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "அசல் புகைப்படக் கோப்புகளில் மாற்றம் செய் (_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "அசல் கோப்பில் மாற்றம் செய் (_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "அசல் கோப்புகளில் மாற்றம் செய் (_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "அசல்: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"எக்ஸ்போசர் நேரம் இந்த அளவுக்கு முன் நகர்த்தப்படும்\n"
+"%d %s, %d %s, %d %s மற்றும் %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"எக்ஸ்போசர் நேரம் இந்த அளவுக்கு பின் நகர்த்தப்படும்\n"
+"%d %s, %d %s, %d %s மற்றும் %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "நாள்"
+msgstr[1] "நாட்கள்"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "மணி"
+msgstr[1] "மணி"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "நிமிடம்"
+msgstr[1] "நிமிடங்கள்"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "வினாடி"
+msgstr[1] "வினாடிகள்"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"மற்றும் %d."
+msgstr[1] ""
+"\n"
+"\n"
+"மற்றும் %d."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "குறிகள் (காற்புள்ளிகளால் பிரித்தபடி):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "நல்வரவு!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "ஷாட்வெல்லுக்கு உங்களை வரவேற்கிறோம்!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"தொடங்குவதற்கு, இந்த வழிகளில் நீங்கள் விரும்பும் ஒரு வழியில் புகைப்படங்களை "
+"இறக்குமதி "
+"செய்யவும்:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"<span weight=\"bold\">%s கோப்பைத் தேர்வு செய்யவும் கோப்புறையிலிருந்து "
+"இறக்குமதி "
+"செய்யவும்</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "புகைப்படங்களை ஷாட்வெல் சாளரத்தில் இழுத்து வந்து இடவும்"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "கணினியில் கேமராவை இணைத்து இறக்குமதி செய்யவும்"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "உங்கள் %s கோப்புறையிலிருந்து புகைப்படங்களை இறக்குமதி செய்யவும் (_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"இந்த வழிகளில் எந்த ஒரு ஒரு வழியைப் பயன்படுத்தியும் நீங்கள் புகைப்படங்களை "
+"இறக்குமதி "
+"செய்யலாம்:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "இந்த செய்தியை மீண்டும் காட்டாதே (_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "உங்கள் %s தரவகத்திலிருந்து புகைப்படங்களை இறக்குமதி செய்யவும்"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(உதவி)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "ஆண்டு%sமாதம்%sநாள்"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "ஆண்டு%sமாதம்"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "ஆண்டு%sமாதம்-நாள்"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "ஆண்டு-மாதம்-நாள்"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "தனிப்பயன்"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "தவறான வடிவம்"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"ஷாட்வெல் புகைப்படங்களை உங்கள் தரவகத்திற்கு நகலெடுக்க முடியும் அல்லது "
+"நகலெடுக்காமலும் "
+"இறக்குமதி செய்ய முடியும்."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "புகைப்படங்களை நகலெடு (_p)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "இங்கு இறக்குமதி செய் (_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "தரவகத்திற்கு இறக்குமதி செய்"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "தரவகத்திலிருந்து நீக்கு"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "தரவகத்திலிருந்து புகைப்படத்தை நீக்குகிறது"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "தரவகத்திலிருந்து புகைப்படங்களை நீக்குகிறது"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து புகைப்படம்/வீடியோ நீக்கப்படும். "
+"உங்கள் டெஸ்க்டாப் "
+"குப்பைத் தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+msgstr[1] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து %d புகைப்படங்கள்/வீடியோக்கள் "
+"நீக்கப்படும். உங்கள் "
+"டெஸ்க்டாப் குப்பைத் தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து வீடியோ நீக்கப்படும். உங்கள் "
+"டெஸ்க்டாப் குப்பைத் "
+"தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+msgstr[1] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து %d வீடியோக்கள் நீக்கப்படும். உங்கள் "
+"டெஸ்க்டாப் குப்பைத் "
+"தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து புகைப்படம் நீக்கப்படும். உங்கள் "
+"டெஸ்க்டாப் குப்பைத் "
+"தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+msgstr[1] ""
+"இதனால் உங்கள் ஷாட்வெல் தரவகத்திலிருந்து %d புகைப்படங்கள் நீக்கப்படும். உங்கள் "
+"டெஸ்க்டாப் குப்பைத் "
+"தொட்டிக்கும் கோப்பை நகர்த்த விரும்புகிறீர்களா?\n"
+"\n"
+"இந்த செயலை செயல் தவிர்க்க முடியாது."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"புகைப்படம் அல்லது வீடியோவை டெஸ்க்டாப் குப்பைத் தொட்டிக்கு நகர்த்த "
+"முடியவில்லை. கோப்பை நீக்கவா?"
+msgstr[1] ""
+"%d புகைப்படங்கள் அல்லது வீடியோக்களை டெஸ்க்டாப் குப்பைத் தொட்டிக்கு நகர்த்த "
+"முடியவில்லை. "
+"கோப்பை நீக்கவா?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "புகைப்படம் அல்லது வீடியோவை நீக்க முடியாது."
+msgstr[1] "%d புகைப்படங்கள் அல்லது வீடியோக்களை நீக்க முடியாது."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "அகலம் அல்லது உயரம்"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "அகலம்"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "உயரம்"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s ஐக் கண்காணிக்க முடியவில்லை: அது ஒரு கோப்பகமல்ல (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "நிகழ்வு %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s க்கு தற்காலிகக் கோப்பை உருவாக்க முடியவில்லை: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "ஏற்றுமதிசெய்கிறது"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s என ஏற்கனவே ஒரு கோப்பு உள்ளது. இடமாற்றவா?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "தவிர் (_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "இடமாற்று (_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "அனைத்தையும் இடமாற் (_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "ஏற்றுமதிசெய்"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "கண்காணிப்பு புதுப்பிப்புகளைச் செயலாக்க முடியவில்லை: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "சிறுபடங்களின் அளவை சரிசெய்"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "பெரிதாக்கு (_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "சிறுபடங்களின் உருப்பெருக்கத்தை அதிகரி"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "சிறிதாக்கு (_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "சிறுபடங்களின் உருப்பெருக்கத்தைக் குறை"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "புகைப்படங்களை வரிசைப்படுத்து (_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "வீடியோவை இயக்கு (_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "தேர்ந்தெடுத்த வீடியோக்களை கணினியின் வீடியோ இயக்கியில் திற"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "உருவக்குநர் (_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "ஷாட்வெல்"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "கேமரா"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "தலைப்புகள் (_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "ஒவ்வொரு புகைப்படத்திற்கும் தலைப்பைக் காட்டு"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "கருத்துகள் (_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ஒவ்வொரு புகைப்படத்திற்கும் கருத்தைக் காட்டு"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "_மேற்கோள்கள்"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ஒவ்வொரு புகைப்பட மேற்கோள்களை காட்டு"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "தலைப்பின்படி(_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "புகைப்படங்களை தலைப்பின்படி வரிசைப்படுத்து"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "எக்ஸ்போசர் தேதியின் படி (_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "புகைப்படங்களை எக்ஸ்போசர் தேதியின்படி வரிசைப்படுத்து"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "தரத்தின் படி (_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "புகைப்படங்களை தரத்தின் படி வரிசைப்படுத்து"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "ஏறுவரிசையில் (_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "புகைப்படங்களை ஏறுவரிசையில் வரிசைப்படுத்து"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "இறங்குவரிசை (_e)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "புகைப்படங்களை இறங்கு வரிசையில் வரிசைப்படுத்து"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"ஷாட்வெல்லால் தேர்ந்தெடுத்த வீடியோக்களை இயக்க முடியவில்லை:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "புகைப்படங்கள்/வீடியோக்கள் இல்லை"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "புகைப்படங்கள்/வீடியோக்கள் இல்லை"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "இந்தக் கோப்பகத்திற்கு புகைப்படங்களை ஏற்றுமதி செய்ய முடியாது."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "மாற்றம் செய்யப்பட்டது"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "முந்தைய புகைப்படம்"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "அடுத்த புகைப்படம்"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "புகைப்படத்தின் மூலக் கோப்பு இல்லை: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "காண்பி (_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "கருவிகள் (_o)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "முந்தைய புகைப்படம் (_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "முந்தைய புகைப்படம்"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "அடுத்த புகைப்படம் (_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "அடுத்த புகைப்படம்"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "புகைப்படத்தின் உருப்பெருக்கத்தை அதிகரி"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "புகைப்படத்தின் உருப்பெருக்கத்தைக் குறை"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "பக்கத்திற்குப் பொருத்து (_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "திரையில் பொருந்தும்படி புகைப்படத்தைப் பெரிதாக்கு"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "100% பெரிதாக்கு (_1)"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "புகைப்படத்தை 100 சதவீத உருப்பெருக்கத்திற்குப் பெரிதாக்கு"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "200% க்குப் பெரிதாக்கு (_2)"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "புகைப்படத்தை 200 சதவீத உருப்பெருக்கத்திற்குப் பெரிதாக்கு"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s ஐ ஏற்றுமதி செய்ய முடியவில்லை: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "முழு பக்கத்திலும் நிரப்பு"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "ஒரு பக்கத்திற்கு 2 படங்கள்"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "ஒரு பக்கத்திற்கு 4 படங்கள்"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "ஒரு பக்கத்திற்கு 6 படங்கள்"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "ஒரு பக்கத்திற்கு 8 படங்கள்"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "ஒரு பக்கத்திற்கு 16 படங்கள்"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "ஒரு பக்கத்திற்கு 32 படங்கள்"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "அங்."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "செமீ"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "வாலட் (2 x 3 அங்.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "நோட்கார்டு (3 x 5 அங்.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 அங்."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 அங்."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 அங்."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 அங்."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 அங்."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "மெட்ரிக் வாலட் (9 x 13 செமீ)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "அஞ்சலட்டை (10 x 15 செமீ)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 செமீ"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 செமீ"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 செமீ"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 செமீ"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 செமீ"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "பட அமைப்புகள்"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "அச்சிடுகிறது..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"புகைப்படத்தை அச்சிட முடியவில்லை:\n"
+"\n"
+" %s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "இன்று"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "நேற்று"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "உருப்படிகள்:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d நிகழ்வு"
+msgstr[1] "%d நிகழ்வுகள்"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d புகைப்படம்"
+msgstr[1] "%d புகைப்படங்கள்"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d வீடியோ"
+msgstr[1] "%d வீடியோக்கள்"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "தேதி:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "நேரம்:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "அனுப்புநர்:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "பெறுநர்:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "அளவு:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "காலம்:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f விநாடிகள்"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "டெவலப்பர்:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "எக்ஸ்போசர்:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "இடம்:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "கோப்பு அளவு:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "நடப்பு உருவாக்கம்:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "முதலில் இருந்த அளவுகள்:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "கேமரா தயாரிப்பு:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "கேமரா மாடல்:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "ஃபிளாஷ்:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "குவியத்தூரம்:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "எக்ஸ்போசர் தேதி:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "எக்ஸ்போசர் நேரம்:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "எக்ஸ்போசர் பயாஸ்:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS அட்சரேகை:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS தீர்க்க ரேகை:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "ஆர்ட்டிஸ்ட்:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "பதிப்புரிமை:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "மென்பொருள்:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "விரிவான தகவல்"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "புகைப்பட அடுக்கு"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "புகைப்பட நோக்கி"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "வலப்புறம் சுழற்று (_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "சுழற்று"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "வலப்புறம் சுழற்று"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+"புகைப்படங்களை வலப்புறம் சுழற்று (இடப்புறம் சுழற்ற Ctrl விசையை அழுத்தவும்)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "இடப்புறம் சுழற்று (_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "இடப்புறம் சுழற்று"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "புகைப்படங்களை இடப்புறம் சுழற்று"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "கிடைமட்டமாக திருப்பிப் போடு (_z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "கிடைமட்டமாக திருப்பிப் போடு"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "செங்குத்தாகத் திருப்பிப் போடு (_c)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "செங்குத்தாகத் திருப்பிப் போடு"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "செம்மைப்படுத்து (_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "செம்மைப்படுத்து"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "புகைப்படத்தின் தோற்றத்தை தானாகவே மேம்படுத்து"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "நிற சரிசெய்தல்களை நகலெடு (_C)"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "நிற சரிசெய்தல்களை நகலெடு"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "புகைப்படத்திற்குப் பயன்படுத்தப்பட்ட நிற சரிசெய்தல்களை நகலெடு"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "நிற சரிசெய்தல்களை ஒட்டு (_P)"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "நிற சரிசெய்தல்களை ஒட்டு"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களுக்கு நிற சரிசெய்தல்களைப் பயன்படுத்து"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "செதுக்கு (_C)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "செதுக்கு"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "புகைப்படத்தின் அளவைச் செதுக்கு"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "நேராக்கு (_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "நேராக்கு"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "புகைப்படத்தை நேராக்கு"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "சிவப்புக் கண் (_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "சிவப்புக் கண்"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "புகைப்படத்தில் உள்ள சிவப்புக்கண் குறைபாடுகளைக் குறைக்க அல்லது நீக்க"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "சரிசெய் (_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "சரிசெய்"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "புகைப்படத்தின் நிறம் மற்றும் சாயலைச் சரிசெய்"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "முதலில் இருந்தபடி மீட்டமை (_v)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "முதலில் இருந்தபடி மீட்டமை"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "வெளியே செய்த மாற்றங்களை ரத்து செய்து மீட்டமை (_d)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "பிரதான புகைப்படமாக மீட்டமை"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "டெஸ்க்டாப் பின்புலக்காட்சியாக அமை (_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "தேர்ந்தெடுத்த படத்தை புதிய டெஸ்க்டாப் பின்புலக் காட்சியாக அமை"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "டெஸ்க்டாப் ஸ்லைடு காட்சியாக அமை (_D)..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "செயல்தவிர் (_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "செயல்தவிர்"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "மீண்டும் செய் (_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "மீண்டும் செய்"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "நிகழ்வுக்கு மறுபெயரிடு (_n)..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "நிகழ்வுக்கு ஒரு முக்கிய புகைப்படத்தை உருவாக்கு (_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "நிகழ்வுக்கு ஒரு முக்கிய புகைப்படத்தை உருவாக்கு"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "புதிய நிகழ்வு (_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "புதிய நிகழ்வு"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "புகைப்படங்காளை நகர்த்து"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "புகைப்படங்களை ஒரு நிகழ்வுக்கு நர்த்து"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "நிகழ்வுகளை ஒன்றாக்கு (_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "ஒன்றாக்கு"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "நிகழ்வுகளை ஒரே நிகழ்வாக ஒன்றாக்கு"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "தரம் அமை (_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "தரம் அமை"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "உங்கள் புகைப்படத்தின் தரத்தை மாற்றவும்"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "அதிகரி (_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "தரத்தை அதிகரி"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "குறை (_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "தரத்தைக் குறை"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "தரமிடாதது (_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "தரமிடாதது"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "தரமிடாததை தரமிடு"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "தரமிடாததாக அமைக்கிறது"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "தரமிட்டிருந்தால் அகற்று"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "நிராகரித்தது (_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "நிராகரித்தது"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "நிராகரித்ததைத் தரமிடு"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "நிராகரித்ததாக அமைக்கிறது"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "தரத்தை நிராகரித்ததாக அமை"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "நிராகரித்தது மட்டும் (_O)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "நிராகரித்தது மட்டும்"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "நிராகரித்த புகைப்படங்களை மட்டும் காண்பி"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "அனைத்தும் + நிராகரித்தவை (_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "நிராகரித்தவை உட்பட அனைத்து புகைப்படங்களையும் காண்பி"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "அனைத்துப் புகைப்படங்களும் (_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "அனைத்து புகைப்படங்களையும் காண்பி"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "தரங்கள் (_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "ஒவ்வொரு புகைப்படத்தின் தரத்தையும் காண்பி"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "புகைப்படங்களை வடிகட்டு (_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "புகைப்படங்களை வடிகட்டு"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+"காண்பிக்கப்படும் புகைப்படங்களின் எண்ணிக்கையை ஒரு வடிகட்டியின் அடிப்படையில் "
+"கட்டுப்படுத்து"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "நகல் பிரதியெடு (_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "நகல்பிரதியெடு"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "புகைப்படத்தின் ஒரு நகல் பிரதியை உருவாக்கு"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "ஏற்றுமதி செய் (_E)..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "அச்சிடு (_P)..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "வெளியிடு (_b)..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "பல்வேறு வலைத்தளங்களில் வெளியிடு"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "தலைப்பை மாற்று (_T)..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "கருத்தைத் திருத்து (_C)..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "கருத்தைத் திருத்து"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "நிகழ்வுக் கருத்தைத் திருத்து... (_C)"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "தேதி மற்றும் நேரத்தை சரி செய் (_A)..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "தேதி மற்றும் நேரத்தை சரி செய்"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "குறிச்சொற்களைச் சேர் (_T)..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "குறிச்சொற்களைச் சேர் (_A)..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "குறிச்சொற்களைச் சேர்"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "விருப்பத்தேர்வுகள் (_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "வெளி திருத்தி நிரலில் திற (_x)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW திருத்தி நிரலில் திற (_W)"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "இங்கு அனுப்பு (_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "இங்கு அனுப்பு (_o)..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "கண்டுபிடி (_F)..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "கண்டுபிடி"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+"ஒரு படத்தின் பெயர் அல்லது அதன் மேலுள்ள குறிச்சொற்களைத் தட்டச்சு செய்து அந்தப் "
+"படத்தைக் "
+"கண்டறியவும்"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "கொடியிடு (_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "கொடியை நீக்கு (_f)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "திருத்தியைத் தொடக்க முடியவில்லை: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "\"%s\"குறிச்சொல்லைச் சேர்"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" மற்றும் \"%s\" குறிச்சொற்களைச் சேர்"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "\"%s\" குறிச்சொல்லை நீக்கு (_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "\"%s\" குறிச்சொல்லை நீக்கு"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "குறிச்சொல்லை நீக்கு"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "புதிய (_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" குறிச்சொல்லை மறுபெயரிடு (_n)..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" குறிச்சொல்லுக்கு \"%s\" என மறூபெயரிடு"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "மறுபெயரிடு (_R)..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "குறிச்சொற்களை மாற்றியமை (_y)..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "குறிச்சொற்களை மாற்றியமை"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "புகைப்படத்தை \"%s\" எனக் குறி"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "புகைப்படத்தை \"%s\" எனக் குறி"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "தேர்ந்தெடுத்த புகைப்படத்தை \"%s\" எனக் குறி"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை \"%s\" எனக் குறி"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "புகைப்படத்திலிருந்து \"%s\" குறிச்சொல்லை நீக்கு (_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "புகைப்படங்களிலிருந்து \"%s\" குறிச்சொல்லை நீக்கு (_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "புகைப்படத்திலிருந்து \"%s\" குறிச்சொல்லை நீக்கு"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "புகைப்படத்திலிருந்து \"%s\" குறிச்சொல்லை நீக்கு"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"குறிச்சொல்லுக்கு \"%s\" என மறுபெயரிட முடியாது, ஏனெனில் ஏற்கனவே அப்படி ஒரு "
+"குறிச்சொல் "
+"உள்ளது."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"தேடலுக்கு \"%s\" என மறுபெயரிட முடியாது, ஏனெனில் ஏற்கனவே அப்படி ஒரு தேடல் "
+"உள்ளது."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "சேமிக்கப்பட்ட தேடல்"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "தேடலை நீக்கு"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "திருத்து (_E)..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "மறுபெயரிடு (_n)..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" தேடலுக்கு \"%s\" என மறுபெயரிடு"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" தேடலை நீக்கு"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s ஐ தரமிடு"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "%s என தரம் அமை"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "%s என தரம் அமை"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s ஐக் காண்பி"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s என தரம் அமைக்கப்பட்ட புகைப்படங்களை மட்டும் காண்பி"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s அல்லது இன்னும் சிறந்தது"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s அல்லது இன்னும் சிறந்ததைக் காண்பி"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s அல்லது இன்னும் சிறந்த புகைப்படங்களை மட்டும் காண்பி"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை குப்பைத் தொட்டியிலிருந்து நீக்கு"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை தரவகத்திலிருந்து நீக்கு"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "மீட்டமை (_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை மீண்டும் தரவகத்திற்கு நகர்த்து"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "கோப்பு நிர்வாகியில் காண்பி (_g)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "தேர்ந்தெடுத்த புகைப்படத்தின் கோப்பகத்தை கோப்பு நிர்வாகியில் திறக்கவும்"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "கோப்பு நிர்வாகியைத் திறக்க முடியவில்லை: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "தரவகத்திலிருந்து நீக்கு (_e)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "குப்பைக்கு நகர்த்து (_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "அனைத்தையும் தேர்ந்தெடு (_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "அனைத்து உருப்படிகளையும் தேர்ந்தெடு"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "ஸ்லைடு காட்சி"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "கொடியிடப்பட்டது"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "புகைப்படங்கள்"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "வீடியோக்கள்"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW புகைப்படங்கள்"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW புகைப்படங்கள்"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI கோப்பு %s ஐ ஏற்றுவதில் பிழை: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "வகை"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "தரம்"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "அமைப்புகள்"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "திரும்பு"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "முந்தைய புகைப்படத்திற்குச் செல்"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "இடைநிறுத்து"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "ஸ்லைடு காட்சியை இடை நிறுத்து"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "அடுத்து"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "அடுத்த புகைப்படத்திற்குச் செல்"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "ஸ்லைடு காட்சி அமைப்புகளை மாற்று"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "அனைத்து புகைப்பட மூலக் கோப்புகளும் இல்லை."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "இயக்கு"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "ஸ்லைடு காட்சியைத் தொடரு"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "தலைப்பில்லாதது"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "வீடியோக்களை ஏற்றுமதி செய்"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "கேமராக்கள்"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"கேமராவை அன்மவுன்ட் செய்ய முடியவில்லை. கோப்பு நிர்வாகியைக் கொண்டு கேமராவை "
+"அன்மவுன்ட் "
+"செய்ய முயற்சிக்கவும்."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ஏற்கனவே இறக்குமதி செய்ய புகைப்படங்களை மறை"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "இறக்குமதி செய்யப்படாத புகைப்படங்களை மட்டும் காண்பி"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "இறக்குமதி செய்யத் தொடங்குகிறது, காத்திருக்கவும்..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "தேர்ந்தெடுத்ததை இறக்குமதி செய் (_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "தேர்ந்தெடுத்த புகைப்படங்களை உங்கள் தரவகத்திற்கு இறக்குமதி செய்யவும்"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "அனைத்தையும் இறக்குமதி செய் (_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "எல்லா புகைப்படங்களையும் உங்கள் தரவகத்திற்கு இறக்குமதி செய்யவும்"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"ஷாட்வெல் கேமராவை அணுக அதை கோப்பு முறைமையில் இருந்து அன்மவுன்ட் செய்ய "
+"வேண்டியுள்ளது. "
+"தொடர வேண்டுமா?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "அன்மவுன்ட் (_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "கேமராவை அன்மவுன்ட் செய்."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"மற்றொரு பயன்பாடு கேமராவைப் பூட்டியுள்ளது. கேமரா பூட்டப்படாத நிலையில் மட்டுமே "
+"ஷாட்வெல்லால் கேமராவை அணுக முடியும். வேறு ஏதேனும் பயன்பாடு கேமராவைப் "
+"பயன்படுத்திக் "
+"கொண்டிருந்தால் அதை மூடிவிட்டு மீண்டும் முயற்சிக்கவும்."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"வேறு ஏதேனும் பயன்பாடு கேமராவைப் பயன்படுத்திக் கொண்டிருந்தால் அதை மூடவும்."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"கேமராவிலிருந்து மாதிரிக்காட்சிகளைப் பெற முடியவில்லை:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "அன்மவுன்ட் செய்கிறது..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "புகைப்படத் தகவலைப் பெறுகிறது"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s க்கான மாதிரிக்காட்சியைப் பெறுகிறது"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "கேமராவைப் பூட்ட முடியவில்லை: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "இந்தப் புகைப்படத்தை கேமராவிலிருந்து நீக்கவா?"
+msgstr[1] "இந்த %d புகைப்படங்களை கேமராவிலிருந்து நீக்கவா?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "இந்த வீடியோவை கேமராவிலிருந்து நீக்கவா?"
+msgstr[1] "இந்த %d வீடியோக்களை கேமராவிலிருந்து நீக்கவா?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "இந்த புகைப்படத்தை/வீடியோவை கேமராவிலிருந்து நீக்கவா?"
+msgstr[1] "இந்த %d புகைப்படங்களை/வீடியோக்களை கேமராவிலிருந்து நீக்கவா?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "இந்தக் கோப்புகளை கேமராவிலிருந்து நீக்கவா?"
+msgstr[1] "இந்த %d கோப்புகளை கேமராவிலிருந்து நீக்கவா?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "புகைப்படங்களை/வீடியோக்களை கேமராவிலிருந்து நீக்குகிறது"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"பிழைகளின் காரணமாக கேமராவிலிருந்து %d புகைப்படத்தை/வீடியோவை நீக்க முடியவில்லை."
+msgstr[1] ""
+"பிழைகளின் காரணமாக கேமராவிலிருந்து %d புகைப்படங்களை/வீடியோக்களை நீக்க "
+"முடியவில்லை."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "தரவு இறக்குமதிகள்"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s தரவுத் தளம்"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+"ஒரு பிழை ஏற்பட்டதால் %s இல் இருந்து இறக்குமதி செய்யும் செயலைத் தொடர முடியாது:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"வேறொரு சேவையிலிருந்து இறக்குமதி செய்ய முயற்சிக்க, மேலே உள்ள மெனுவிலிருந்து "
+"ஒரு "
+"சேவையைத் தேர்ந்தெடுக்கவும்."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"உங்களிடம் தரவு இறக்குமதி செருகுநிரல் எதுவும் செயல்படுத்தப்பட்டில்லை.\n"
+"\n"
+"பயன்பாட்டிலிருந்து இறக்குமதி செய்யும் அம்சத்தைப் பயன்படுத்த, உங்களிடம் ஒரு "
+"தரவு இறக்குமதி "
+"செருகுநிரலேனும் செயல்படுத்தப்பட்டிருக்க வேண்டும். விருப்பத்தேர்வுகள் உரையாடல் "
+"பெட்டியில் "
+"செருகுநிரல்களை செயல்படுத்தலாம்."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "தரவுத்தளக் கோப்பு:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "இறக்குமதி (_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "பயன்பாட்டிலிருந்து இறக்குமதி செய்"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "இங்கிருந்து ஊடகத்தை இறக்குமதி செய் (_f):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "மூடு (_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"புகைப்பட தரவுத்தளம் %s ஐத் திறக்க/உருவாக்க முடியவில்லை: பிழைக் குறியீடு %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"புகைப்படத் தரவுத்தளக் கோப்பில் எழுத முடியவில்லை:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"தரவுத்தளக் கோப்பை அணுகும் போது பிழை ஏற்பட்டது:\n"
+" %s\n"
+"\n"
+"அந்தப் பிழை: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "கோப்பு (_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "சேமி (_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "புகைப்படத்தைச் சேமி"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "இப்படி சேமி (_A)..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "புகைப்படத்தை வேறு பெயரில் சேமி"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+"உங்கள் கணினியில் இணைக்கப்பட்டுள்ள அச்சுப் பொறியைக் கொண்டு புகைப்படத்தை "
+"அச்சிடவும்"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "திருத்து (_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "புகைப்படம் (_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "உதவி (_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s இல்லை."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ஓரு கோப்பல்ல."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s \n"
+"%s இன் கோப்பு வடிவத்தை ஆதரிக்காது."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "ஒரு நகலைச் சேமி (_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s இல் செய்த மாற்றங்களை கைவிடவா?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "சேமிக்காமல் மூடு (_w)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s இல் சேமிக்கும் போது ஒரு பிழை: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "இப்படி சேமி"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "தற்போதைய புகைப்பட அளவுகளுக்குத் திரும்பு"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "இந்தப் புகைப்படத்திற்கான செதுக்கலை அமை"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"நீள்வாக்கு மற்றும் அகலவாக்கு நிலையமைப்புகளிடையே செதுக்கல் செவ்வகத்தை அச்சாக "
+"அமை"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "கட்டுப்படுத்தாதது"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "சதுரம்"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "திரை"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD வீடியோ (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD வீடியோ (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "லெட்டர் (8.5 x 11 அங்.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "டேப்லாயிட் (11 x 17 அங்.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 மிமீ)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 மிமீ)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "சிவப்புக் கண் கருவியை மூடு"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+"தேர்ந்தெடுத்த பகுதியில் ஏதேனும் சிவப்புக் கண் விளைவு இருந்தால் அதை சரி "
+"செய்யவும்"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "மீட்டமை (_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "பூரிதம்:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "இளநிறம்:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "வெப்பநிலை:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "நிழல்கள்:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "முன்னிலைப்படுத்தல்கள்:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "நிறங்களை மீட்டமை"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "எல்லா நிற சரிசெய்தல்களையும் முதலில் இருந்தபடி மீட்டமை"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "வெப்பநிலை"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "இளநிறம்"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "பூரிதம்"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "எக்ஸ்போசர்"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "நிழல்கள்"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "முன்னிலைப்படுத்தல்கள்"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "நிறவேறுபாடு விரிவாக்கம்"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "கோணம்:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d புகைப்படம்/வீடியோ"
+msgstr[1] "%d புகைப்படங்கள்/வீடியோக்கள்"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "நிகழ்வு இல்லை"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ஒவ்வொரு நிகழ்வுக்கும் கருத்தைக் காட்டு"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "நிகழ்வுகள் இல்லை"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "நிகழ்வுகள் இல்லை"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "நிகழ்வுகள்"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "புதுப்பிக்கப்பட்டது"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "கோப்புறைகள்"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "தரவகம்"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "இறக்குமதி செய்கிறது..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "இறக்குமதியை நிறுத்து (_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "புகைப்படங்களை இறக்குமதி செய்வதை நிறுத்து"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "இறக்குமதி செய்ய தயார் செய்கிறது..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s ஐ இறக்குமதி செய்தது"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "கடைசி இறக்குமதி"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "கோப்புறையிலிருந்து இறக்குமதி செய் (_I)..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "வட்டு அல்லது தரவகத்திலிருந்து புகைப்படங்களை இறக்குமதி செய்"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "பயன்பாட்டிலிருந்து இறக்குமதி செய் (_A)"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "நிகழ்வுகளை வரிசைப்படுத்து (_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "குப்பைத் தொட்டியை காலி செய் (_r)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "குப்பைத்தொட்டியில் உள்ள அனைத்து புகைப்படங்களையும் நீக்கு"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "புகைப்படத்திற்கான நிகழ்வைக் காண்பி (_n)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "கண்டுபிடி (_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+"தேடல் அளவைகளைக் கொண்டு புகைப்படங்கள் மற்றும் வீடியோக்களைக் கண்டுபிடிக்கவும்"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "புதிய சேமிக்கப்பட்ட தேடல் (_w)..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "புகைப்படங்கள் (_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "_நிகழ்வுகள்"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "அடிப்படைத் தகவல் (_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "தேர்ந்தெடுத்ததைப் பற்றிய அடிப்படைத் தகவலைக் காண்பி"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "விரிவான தகவல் (_x)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "தேர்ந்தெடுத்ததைப் பற்றிய விரிவான தகவலைக் காண்பி"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "தேடல் பட்டி (_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "தேடல் பட்டியைக் காண்பி"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "பக்கப்பட்டி (_i)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "பக்கப்பட்டியைக் காண்பி"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "கோப்புறையிலிருந்து இறக்குமதி செய்"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "குப்பைத்தொட்டியைக் காலி செய்"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "குப்பைத்தொட்டியை காலி செய்கிறது..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"புகைப்படங்களை உங்கள் இல்லக் கோப்பகத்திற்கு இறக்குமதி செய்யும் படி Shotwell "
+"அமைவாக்கம் செய்யப்பட்டுள்ளது.\n"
+"இதை <span weight=\"bold\">Edit %s Preferences</"
+"span> க்குச் சென்று மாற்றுமாறு பரிந்துரைக்கிறோம்.\n"
+"புகைப்படங்களை இறக்குமதி செய்தலைத் தொடர வேண்டுமா?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "தரவகத்தின் இருப்பிடம்"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "புகைப்படங்களை இந்த கோப்பகத்திற்கு இறக்குமதி செய்ய முடியாது."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "தரவகத்தைப் புதுப்பிக்கிறது..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "புகைப்படங்களை தானாக இறக்குமதி செய்ய தயார் செய்கிறது..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "புகைப்படங்களை தானாக இறக்குமதி செய்கிறது..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "கோப்புகளில் மீத்தரவை எழுதுகிறது..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "இல்லாத கோப்புகள்"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "நீக்குகிறது..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "குப்பைத் தொட்டி"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "குப்பைத்தொட்டி காலியாக உள்ளது"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "நீக்கு"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "புகைப்படங்களை நீக்குகிறது"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"உங்கள் புகைப்படத் தரவகம் ஷாட்வெல்லின் இந்தப் பதிப்புக்கு இணக்கமானதாக இல்லை. "
+"அது ஷாட்வெல் %s "
+"(திட்ட வடிவம் %d) ஐக் கொண்டு உருவாக்கப்பட்டதாகத் தெரிகிறது. இந்தப் பதிப்பு %"
+"s (திட்ட "
+"வடிவம் %d) ஆகும். ஷாட்வெல்லின் சமீபத்திய பதிப்பைப் பயன்படுத்தவும்."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"ஷாட்வெல்லால் உங்கள் புகைப்பட தரவகத்தை பதிப்பு %s (திட்ட வடிவம்%d) இல் இருந்து "
+"பதிப்பு %s "
+"(திட்ட வடிவம் %d) க்கு பதிப்பேற்ற முடியவில்லை. மேலும் தகவலுக்கு %s இல் உள்ள "
+"ஷாட்வெல் "
+"விக்கியைக் காணவும்"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"உங்கள் புகைப்படத் தரவகமானது ஷாட்வெல்லின் இந்தப் பதிப்புக்கு இணக்கமானதாக "
+"இல்லை. அது "
+"ஷாட்வெல் பதிப்பு %s (திட்ட வடிவம் %d) ஆல் உருவாக்கப்பட்டதாகத் தெரிகிறது. "
+"இந்தப் பதிப்பு "
+"%s (திட்ட வடிவம் %d) ஆகும். %s ஐ நீக்கி உங்கள் தரவகத்தை காலி செய்து உங்கள் "
+"புகைப்படங்களை "
+"மீண்டும் இறக்குமதி செய்யவும்."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+"ஷாட்வெல்லின் தரவுத்தளத்தைச் சரிபார்க்க முயற்சிக்கும் போது தெரியாத ஒரு பிழை "
+"ஏற்பட்டது: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "ஷாட்வெல்லை ஏற்றுகிறது"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell இன் தனிப்பட்ட தரவுக்கான பாதை"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "DIRECTORY"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+"இயக்க நேரத்தில் மாற்றங்கள் உள்ளதா என தரவக கோப்பகத்தைக் கண்காணிக்க வேண்டாம்"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "தொடக்க முன்னேற்ற மானியைக் காண்பிக்க வேண்டாம்"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "இப்பயன்பாட்டின் பதிப்பைக் காட்டு"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"இருக்கின்ற கட்டளை வரி விருப்பங்களின் முழு பட்டியலைக் காண '%s --help' கட்டளையை "
+"இயக்கவும்.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "குறைவாக (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "நடுத்தரமாக (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "அதிகமாக (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "அதிகபட்சமாக (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "வெளியிடுகிறது"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "பதிவேற்றத் தயாராகிறது"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d இல் %d ஐ பதிவேற்றுகிறது"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "ஒரு பிழை ஏற்பட்டதால், %s இல் வெளியிடும் செயலைத் தொடர முடியாது:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"வேறு சேவையில் வெளியிட முயற்சிக்க, மேலே உள்ள மெனுவிலிருந்து ஒரு சேவையைத் "
+"தேர்ந்தெடுக்கவும்."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "தேர்ந்தெடுத்த புகைப்படங்கள்/வீடியோக்கள் வெற்றிகரமாக வெளியிடப்பட்டன."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "தேர்ந்தெடுத்த வீடியோக்கள் வெற்றிகரமாக வெளியிடப்பட்டன."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "தேர்ந்தெடுத்த புகைப்படங்கள் வெற்றிகரமாக வெளியிடப்பட்டன."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "தேர்ந்தெடுத்த வீடியோ வெற்றிகரமாக வெளியிடப்பட்டது."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "தேர்ந்தெடுத்த புகைப்படம் வெற்றிகரமாக வெளியிடப்பட்டது."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "கணக்குத் தகவலைப் பெறுகிறது..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "உள்நுழைகிறது..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "புகைப்படங்களை வெளியிடு"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "புகைப்படங்களை இங்கு வெளியிடு (_t):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "வீடியோக்களை வெளியிடு"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "வீடியோக்களை இங்கு வெளியிடு (_t)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "புகைப்படங்களையும் வீடியோக்களையும் வெளியிடு"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "புகைப்படங்களையும் வீடியோக்களையும் இங்கு வெளியிடு (_t)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "வெளியிட முடியவில்லை"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"உங்களிடம் இணக்கமான வெளியீட்டு செருகு நிரல் செயல்படுத்தப்படாததால் ஷாட்வெல்லால் "
+"தேர்ந்தெடுத்தவற்றை வெளியிட முடியவில்லை. இதைச் சரிசெய்ய, <b>%s "
+"விருப்பத்தேர்வுகளைத் "
+"திருத்து</b> என்பதைத் தேர்வு செய்து <b>செருகுநிரல்</b> தாவலில் உள்ள ஒன்று "
+"அல்லது "
+"மேற்பட்ட வெளியீட்டு செருகுநிரல்களை செயல்படுத்தவும்."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "சேமித்த தேடல்கள்"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "கொண்டுள்ளது"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "சரியாக"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "இப்படித் தொடங்குவது"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "இப்படி முடிவது"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "இதைக் கொண்டில்லாதது"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "அமைக்கப்படாதது"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "இது"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "இது அல்ல"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "ஏதேனும் புகைப்படம்"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ஒரு அசல் புகைப்படம்"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ஒரு வீடியோ"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "இதைக் கொண்டுள்ள"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "இதைக் கொண்டிருக்காத"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "மாற்றங்கள்"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "உள்ளமை மாற்றங்கள்"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "வெளி மாற்றங்கள்"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "கொடியிடப்பட்டது"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "கொடியடாதது"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "மற்றும் அதிகமானது"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "இது மட்டும்"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "மற்றும் குறைவானது"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "இதன் பிறகானது"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "இதற்கு முன்னானது"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "இவற்றுக்கிடைப்பட்டது"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "மற்றும்"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ஏதேனும்"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "அனைத்தும்"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "எதுவுமில்லை"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "ஏதேனும் உரை"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "தலைப்பு"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "குறிச்சொல்"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "கருத்து"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "நிகழ்வின் பெயர்"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "கோப்பின் பெயர்"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "ஊடக வகை"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "கொடியின் நிலை"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "புகைப்பட நிலை"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "தேதி"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "புதிய குறிச்சொல் (_T)..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "ஸ்லைடு காட்சி மாற்றங்கள்"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(எதுவுமில்லை)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "எதுவுமில்லை"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "எழுந்தமானமான"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "குறிச்சொற்கள்"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "டெஸ்க்டாப் ஸ்லைடு காட்சியாக அமை"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "டெஸ்க்டாப் பின்புல ஸ்லைடு காட்சியை உருவாக்கு"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "இதற்கான ஒவ்வொரு புகைப்படத்தையும் காண்பி"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "காலம்"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+"டெஸ்க்டாப் பின்புலத்தில் ஒவ்வொரு புகைப்படமும் எவ்வளவு நேரம் காண்பிக்கப்பட "
+"வேண்டும்"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "தேடு"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "தேடலின் பெயர் (_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "பொருத்தம் (_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "பின்வருபவற்றில்:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>அச்சிடப்பட்ட படத்தின் அளவு</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "ஒரு தரநிலையான அளவைப் பயன்படுத்தவும் (_s):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "ஒரு தனிப்பயன் அளவைப் பயன்படுத்தவும் (_u):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "புகைப்பட காட்சிப் பாங்கு விகிதத்தைப் பொருந்தச்செய் (_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "தானாக அமைக்கப்படும் அளவு (_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>தலைப்புகள்</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "படத்தின் தலைப்பை அச்சிடு (_t)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>பிக்சல் தெளிவுத்திறன்</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "வெளியீட்டுப் புகைப்பட இடம் (_O):"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "ஒரு அங்குலத்திற்கான பிக்சல்கள்"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "ஷாட்வெல் விருப்பத்தேர்வுகள்"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "வெள்ளை"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "கருப்பு"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "புதிய கோப்புகள் உள்ளதா என தரவகத்தைக் கவனி (_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "மீத்தரவு"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+"புகைப்படக் கோப்புகளில் குறிச்சொற்கள், தலைப்புகள் மற்றும் பிற மீத்தரவுகளை "
+"எழுது (_m)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "காட்சி"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "புகைப்படங்களை இங்கு இறக்குமதி செய் (_I):"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "பின்புலம் (_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "இறக்குமதி செய்கிறது"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "கோப்பக கட்டமைப்பு (_D):"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "வகை (_P):"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "எடுத்துக்காட்டு:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr ""
+"இறக்குமதி செய்த கோப்புகளின் பெயர்களை சிறிய எழுத்தாக மாற்றி மறுபெயரிடு (_e)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW டெவலப்பர்"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "முன்னிருப்பு (_f):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "வெளிப்புற புகைப்படத் திருத்தி (_x):"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "வெளிப்புற _RAW திருத்தி (_R):"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "வெளிப்புறத் திருத்திகள்"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "செருகு நிரல்கள்"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "தாமதித்தல் (_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "மாற்ற விளைவுகள் (_T):"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "மாற்ற தாமதம் (_e):"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "தலைப்பைக் காண்பி (_i)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "வினாடிகள்"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "உள்நுழை (_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr ""
+#~ "புகைப்படங்களை உங்கள் முகப்புக் கோப்பகத்திற்கு இறக்குமதி செய்யும் வகையில் ஷாட்வெல் "
+#~ "அமைவாக்கம் செய்யப்பட்டுள்ளது.\n"
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 0000000..d8e4128
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,4718 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Krishnababu Krothapalli <kkrothap@redhat.com>, 2012-2013, 2014.
+# verayin <vera@yorba.org>, 2011.
+# ప్రవీణ్ ఇళ్ళ <mail2ipn@gmail.com>, 2011-2012.
+# ప్రవీణ్ ఇళ్ళ <mail2ipn@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-16 09:35+0000\n"
+"PO-Revision-Date: 2014-01-30 13:43+0630\n"
+"Last-Translator: Krishnababu Krothapalli <kkrothap@redhat.com>\n"
+"Language-Team: American English <kde-i18n-doc@kde.org>\n"
+"te/)\n"
+"Language: te\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "ప్రచురణకు అవసరమైన తాత్కాలిక ఫైలు అందుబాటులో లేదు"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "యోర్బ వెబ్‌సైటును సందర్శించండి"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Praveen Illa <mail2ipn@gmail.com>, 2010-12. Krishnababu K <kkrothap@redhat."
+"com>, 2012."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "కాపీరైట్ 2009-2013 యోర్బా ఫౌండేషన్"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot లైబ్రరీ దిగుమతి సేవనకు స్వాగతం.\n"
+"\n"
+"షాట్‌వెల్ నందు కనుగొనబడిన లైబ్రరీలలో వొకదానిని గాని లేదా ప్రత్యామ్నాయ F-Spot "
+"డాటాబేస్ ఫైలును గాని యెంపికచేయుట "
+"ద్వారా, దయచేసి లైబ్రరీ దిగుమతికై యెంపికచేయి."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-స్పాట్ లైబ్రరీ దిగుమతి సేవకు స్వాగతం.\n"
+"\n"
+"దయచేసి F-స్పాట్ డేటాబేసు ఫైలును ఎంచుకోండి."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "దిగుమతించుటకు F-స్పాట్ డేటాబేసుని మానవీయంగా ఎంచుకోండి:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"ఎంపికచేసిన F-Spot డాటాబేస్ ఫైలును తెరువలేము: ఫైలు లేదు లేదా అది F-Spot "
+"డాటాబేస్ కాదు"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"ఎంపికచేసిన F-Spot డాటాబేస్ ఫైలును తెరువలేము: F-Spot యొక్క యీ వర్షన్ షాట్‌వెల్ "
+"చే తోడ్పాటునీయబడుట లేదు"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"ఎంపికచేసిన F-స్పాట్ డేటాబేసు ఫైలును చదువుట వీలుకాదు: కొసల పట్టికను "
+"చదువుతున్నపుడు దోషం"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"ఎంపికచేసిన F-స్పాట్ డేటాబేసు దస్త్రము చదువలేకపోతుంది: ఫొటోల పట్టికను "
+"చదువుతున్నపుడు దోషం"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"షాట్‌వెల్ F-Spot లైబ్రరీనందు %d ఫొటోలను కనుగొన్నది మరియు వాటిని ప్రస్తుతం "
+"దిగుమతిచేస్తోంది. నకిలీలు "
+"స్వయంచాలకంగా గుర్తించబడి తొలగించబడును.\n"
+"\n"
+"బ్యాక్‌గ్రౌండ్ నందు దిగుమతి జరుగుచున్నప్పుడు మీరు యీ డైలాగ్‌ను మూసివేసి "
+"షాట్‌వెల్‌ను వుపయోగించవచ్చు."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-స్పాట్ లైబ్రరీ: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "దిగుమతి సిద్దమౌతోంది"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "అంతర్భాగ డేటా దిగుమతి సేవలు"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "కాపీరైట్ 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 పిక్సెళ్ళు"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 పిక్సెళ్ళు"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 పిగ్జెల్స్"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "OAuth ధృవీకరణ అభ్యర్ధనకు '%s' చెల్లునటువంటి స్పందనకాదు"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): ప్రారంభించలేదు; ఈ ప్రచురణకర్త పునఃప్రారంభించదగ్గది "
+"కాదు."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "మీరు Tumblr ఖాతాకు చెందిన వాడుకరిపేరు మరియు సంకేతపదం ప్రవేశపెట్టుము."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#, fuzzy
+msgid "Username and/or password invalid. Please try again"
+msgstr "వాడుకరిపేరు మరియు/లేదా సంకేతపదం తప్పు. దయచేసి మరలా ప్రయత్నించండి"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "చెల్లని వాడుకరి పేరు లేదా సంకేతపదం"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "UI లోడు చేయలేదు: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"మీరు Tumblr కు %s వలే లాగినై వున్నారు.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "కాపీరైట్ 2010+ ఎవ్గెనియ్ పొల్యాకోవ్ <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki వెబ్‌సైటుని సందర్శించండి"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "మీరు ప్రస్తుతం Yandex.Fotki లోనికి ప్రవేశించిలేరు."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+#, fuzzy
+#| msgid "Core Publishing Services"
+msgid "Shotwell Extra Publishing Services"
+msgstr "మూల ముద్రణ సేవలు"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "లేబుల్"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "ఈమెయిల్ చిరునామా (_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "సంకేతపదం (_P)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "ప్రవేశించు"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"మీరు Tumblr కు (name) వలే లాగినై వున్నారు.\n"
+"\n"
+"(ఈ లేబుల్ యొక్క స్ట్రింగ్ కొడ్ లోపల అమర్చబడివుంది, \n"
+"కనుక యిక్కడ చేసిన మార్పులు ప్రదర్శించబడవు)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "బ్లాగ్స్:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "ఫోటో పరిమాణం (_s):"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "నిష్క్రమించు (_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "ప్రచురించు (_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "ఆల్బమ్‌లు (లేదా కొత్తది వ్రాయి) (_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "అనుమతి రకము (_t):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "వ్యాఖ్యలను అచేతనపరుచు (_c)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "అసలు ఫొటో డౌన్‌లోడును నిషేదించు (_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+#, fuzzy
+#| msgid "Publish"
+msgid "Public"
+msgstr "ప్రచురించు"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "స్నేహితులు"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "అంతరంగికం"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "షాట్‌వెల్ అనుసంధానించు"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"మీరు ప్రస్తుతం ఫేస్‌బుక్‌లోకి ప్రస్తుతం ప్రవేశించిలేరు.\n"
+"\n"
+"మీకు ఫేస్‌బుక్ ఖాతా లేకపోతే, లాగ్ ఇన్ అయ్యేటప్పుడు ఒకటి సృష్టించుకోవచ్చు. "
+"లాగిన్ అయ్యేటప్పుడు, షాట్‌వెల్ "
+"కనెక్ట్ ఫోటోలను అప్లోడ్ చేసి మీ ఫీడ్ లో ముద్రణ చేయటకు అనుమతి అడుగుతుంది. "
+"షాట్‌వెల్ కనెక్ట్ పనిచేయుటకు ఈ "
+"అనుమతులు అవసరం."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ఈ షాట్‌వెల్ పనిలో ఫేస్‌బుక్‌లో లాగిన్ అయి మరల లాగ్అవుట్ అయ్యారు.\n"
+"ఫేస్‌బుక్‌కు ప్రచురించడానికి, షాట్‌వెల్ నుండి నిష్క్రమించి మరలా ప్రారంభించి "
+"ప్రయత్నించండి."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "ప్రామాణికం (720 పిక్సెళ్ళు)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "అతిపెద్ద (2048 పిక్సెళ్ళు)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "ఫేస్‌బుక్‌కు అనుసంధానాన్ని పరీక్షిస్తుంది..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "ఆల్బమ్‌ను సృష్టిస్తోంది..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"ప్రచురణ కొరకు అవసరమైన ఫైలు అందుబాటులోలేదు. ఫేస్‌బుక్‌కు ప్రచురించుట "
+"కొనసాగించలేదు."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"మీరు ఫేస్‌బుక్ లోనికి %s వలె ప్రవేశించారు.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "ఎంచుకున్న ఫొటోలను ఎక్కడ ప్రచురించడానికి ఇష్టపడుతున్నారు?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "అప్‌లోడ్ పరిమాణం(_s):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "నా వరకే"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "ప్రతీఒక్కరు"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"మీరు ప్రస్తుతం Flickr కు లాగినైలేరు.\n"
+"\n"
+"Flickr కు లాగిన్ అగుటకు మీ వెబ్ బ్రౌజర్ నందు లాగిన్ నొక్కండి. మీ Flickr ఖాతా "
+"లంకెకు "
+"అనుసంధానమగుటకు మీరు షాట్‌వెల్‌కు అధికారం యీయవలెను."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"ఈ షాట్‌వెల్ పనిలో ఫ్లికర్‌లో లాగిన్ అయి మరల లాగ్అవుట్ అయ్యారు.\n"
+"ఫ్లికర్‌కు ప్రచురించడానికి, షాట్‌వెల్ నుండి నిష్క్రమించి మరల ప్రారంభించి "
+"ప్రయత్నించండి."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "ప్రవేశించుటకు సిద్ధంచేస్తున్నది..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"ప్రచురణ కొరకు అవసరమైన ఫైలు అందుబాటులోలేదు. ఫ్లికర్‌కు ప్రచురించుట "
+"కొనసాగించలేదు."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "ధృవీకరణను సరిచూస్తున్నది..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"మీరు %s వలె Flickr లోనికి ప్రవేశించారు.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"ఉచిత ఫ్లికర్ ఖాతా మీ నెలసరి అప్‌లోడు పై పరిమితి వుంది.\n"
+"ఈ నెలలో, మీ అప్‌లోడు కోటాలో %d మెగాబైట్లు మిగిలి వుంది."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "మీ ప్లికర్ ప్రో ఖాతా అపరిమిత అప్‌లోడులను అనుమతిస్తుంది."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "ఫొటోలు వీరికి కనిపించాలి(_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "వీడియోలు వీరికి కనిపించాలి(_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "ఫొటోలు మరియు వీడియోలు వీరికి కనిపించాలి(_v):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "స్నేహితులకు & కుటుంబసభ్యులకు మాత్రమే"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "కుటుంబం మాత్రమే"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "స్నేహితులు మాత్రమే"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 పిక్సెళ్ళు"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 పిక్సెళ్ళు"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "అసలు పరిమాణం"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"మీరు ప్రస్తుతం పికాసా వెబ్ ఆల్బమ్సుకు లాగినై లేరు.\n"
+"\n"
+"పికాసా వెబ్ ఆల్బమ్సుకు లాగిన్ అగుటకు మీ వెబ్ బ్రౌజర్ నందు లాగిన్ నొక్కండి. "
+"షాట్‌వెల్ మీ పికాసా వెబ్ ఆల్బమ్సు "
+"ఖాతాకు లింకు అవుటకు మీరు ధృవీకరించాలి."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"ప్రచురణ కొరకు అవసరమైన ఫైలు అందుబాటులోలేదు. పికాసాకు ప్రచురించుట కొనసాగించలేదు."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "మీరు పికాసా వెబ్ ఆల్బమ్‌లోనికి %s వలె ప్రవేశించారు."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "వీడియోలు కనబడే స్థానం:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "ఫొటోలు ఇందులో కనిపిస్తాయి:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "చిన్నది (640 x 480 పిక్సెళ్ళు)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "మధ్యస్థం (1024 x 768 పిక్సెళ్ళు)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "సిఫారసుచేయబడింది (1600 x 1200 పిక్సెళ్ళు)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 pixels)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "అసలు పరిమాణం"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "ఆల్బమ్ సృష్టిస్తోంది %s..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"పివిగో కు ప్రచురించునప్పుడు వొక దోష సందేశం యెదురైను. దయచేసి మరలా "
+"ప్రయత్నించండి."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"మీ Piwigo పోటో లైబ్రరీ యొక్క URL అదేవిందగా మీ Piwigo ఖాతా వాడుకరిపేరు మరియు "
+"సంకేతపదంను లైబ్రరీ "
+"కొరకు ప్రవేశపెట్టు."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"షాట్‌వెల్ మీ Piwigo ఫోటో లైబ్రరీను సంప్రదించలేకపోయింది. మీరు ప్రవేశపెట్టిన "
+"URL నిర్థారించుము"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "చెల్లని URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "నిర్వాహకులు, కుటుంబం, స్నేహితులు, పరిచయస్తులు"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "నిర్వాహకులు, కుటుంబం, స్నేహితులు"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "నిర్వాహకులు, కుటుంబం"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "నిర్వాహకులు"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"మీరు ప్రస్తుతం యు ట్యూబ్‌లోకి లాగిన్ అయిలేరు.\n"
+"\n"
+"మీరు ఇదివరకే గూగుల్ ఖాతాను కలిగిఉంటే దానిని ఉపయోగించి యూ ట్యూబ్ వాడటానికి "
+"ముందుకు కొనసాగండి. మీ విహారినిని "
+"ఉపయోగించి యూట్యూబ్ సైటులోకి కనీసం ఒక్కసారి ప్రవేశించి చాలా ఖాతాలను "
+"అమర్చుకోవచ్చును."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"ప్రచురణ కొరకు అవసరమైన ఫైలు అందుబాటులోలేదు. యూట్యూబ్‌కు ప్రచురించుట "
+"కొనసాగించలేదు."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "మీరు యుట్యూబ్ లోనికి %s.వలె ప్రవేశించారు."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "వీడియోలు %s లలో కనపడతాయి"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "బహిరంగముగా పెట్టినవి"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "బహిరంగంగా పెట్టనివి"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "ఒక ఉనికిఉన్నటువంటి ఆల్బమ్‌కు ప్రచురించు(_x):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "ఒక కొత్త ఆల్బమ్‌ను ఈ పేరుతో సృష్టించు:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "వీడియోలు మరియు కొత్త ఆల్బమ్‌లు వీరికి కనపడేటట్లుచేయి(_v):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Flickr కు లాగిన్‌ అయిన తరువాత మీ వెబ్ బ్రౌజర్ నందు కనిపించే నిర్ధారణ సంఖ్యను "
+"ప్రవేశపెట్టు."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "ధృవీకరణ సంఖ్య (_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "కొనసాగించు (_t)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "ఒక ఉనికిలోనున్న ఆల్బమ్:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "ఒక కొత్త ఆల్బమ్ పేరు (_n):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "బహిరంగ గ్యాలరీలో ఆల్బమ్‌ను పెట్టు(_i)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "ఫొటో పరిమాణం ముందువిలువ:(_s)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "మీ పివిగో ఫోటో లైబ్రరీ URL (_U)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "వాడుకరి పేరు (_n)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "సంకేతపదం గుర్తుంచుకొను (_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "ఒక ఉనికిలో ఉన్నటువంటి వర్గం (_e):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "ఫోటోలు దీనితో చూపించబడతాయి (_v):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "ఫొటో పరిమాణం:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr ""
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "నిష్క్రమించు"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "ప్రచురించు"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "మూల ముద్రణ సేవలు"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "వీడియో గోప్యత అమరికలు(_s):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "బ్లైండ్స్"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "చెస్"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "వృత్తము"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "వృత్తములు"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "గడియారం"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "ముక్కలవు"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "ఫేడ్"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "స్లైడ్"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "చతురస్రములు"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "పట్టీలు"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "స్లైడ్ ప్రదర్శన మారు మూల విధములు"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "క్యాచీ డైరెక్టరీ సృష్టించలేక పోయింది %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "డేటా డైరెక్టరీ %s సృష్టించలేకపోతుంది: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "చిత్రాలు"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "తాత్కాలిక డైరెక్టరీ %s సృష్టించలేకపోతుంది: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "డేటా సబ్‌డైరెక్టరీ %s ని సృష్టించలేకపోతోంది: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "సాధనపట్టీని తగిలించు"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "తెరిచిన సాధనపట్టీని గ్రుచ్చు"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "పూర్తి తెరను వదిలిపెట్టు"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "పూర్తి తెరను వదిలిపెట్టు (_F)"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "నిష్క్రమించు (_Q)"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "గురించి (_A)"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "పూర్తితెర (_c)"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "విషయసూచిక (_C)"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "ఇటీవలి అడిగిన ప్రశ్నలు(_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "సమస్యను నివేదించు... (_R)"
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "రద్దుచేయి (_C)"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"షాట్‌వెల్ లైబ్రరీని వాడటానికి ప్రయత్నిస్తున్నపుడు ఒక ఫేటల్ దోషం సంభవించింది. "
+"షాట్‌వెల్ ఇక కొనసాగించలేదు.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "సహాయాన్ని చూపలేకపోతుంది: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "బగ్ డాటాబేస్ గుండా నేవిగేట్ కాలేకపోతోంది: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "FAQలను చూపలేకపోతుంది: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "విజయవంతం"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "ఫైల్ దోషం"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ఫైలుని డీకోడ్ చేయలేకపోయింది"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "డేటాబేసు దోషం"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "దిగుమతిని వాడుకరి మధ్యలోరద్దుచేసారు"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ఫైల్ కాదు"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "ఫైల్ ఇదివరకే డేటాబేసులో ఉంది"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "మద్ధతులేని ఫైల్ ఫార్మేట్"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "బొమ్మ ఫైల్ కాదు"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "డిస్కు వైఫల్యత"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "డిస్కు నిండినది"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "కెమెరా దోషం"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "ఫైలుకి వ్రాయు దోషం"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "దిగుమతి విఫలమైంది (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "స్లైడ్‌షో (_l)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "పలకప్రదర్శనను ఆడించు"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ఫొటోలు/వీడియోలు ఎగుమతిచేయి"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "ఫొటోలు/వీడియోలను ఎగుమతిచేయి"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "ఫొటో ఎగుమతిచేయి"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ఫొటోలను ఎగుమతిచేయి"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "తిప్పబడుతోంది"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "తిప్పినదానిని రద్దుచేస్తోంది"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "అడ్డముగా తిప్పబడుతోంది"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "అడ్డంగా తిప్పినదానిని రద్దుచేయి"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "నిలువుగా తిప్పబడుతోంది"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "నిలువుగా తిప్పినదానిని రద్దుచేయి"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "మార్పులురద్దుచేయబడుతున్నాయి"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "రద్దుని రద్దు చేయు"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "మెరుగుపరుస్తోంది"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "మెరుగుపరినవాటిని రద్దుచేస్తోంది"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "కొత్త కార్యక్రమం సృష్టించబడుతోంది"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "కార్యక్రమాన్ని తొలగిస్తోంది"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ఫొటోలను కొత్త కార్యక్రమానికి తరలిస్తోంది"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ఫొటోలను మునుపటి కార్యక్రమానికి అమరుస్తుంది"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "కలిపివేస్తోంది"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "కలిపివేసినవాటినిరద్దుచేస్తోంది"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ఫొటోలను నకిలీ చేస్తోంది"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "నకిలీచేయబడిన ఫొటోలను తొలగిస్తోంది"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ఫైల్ దోషం కారణంగా ఒక ఫొటోను నకిలీచేయడం కుదరటంలేదు"
+msgstr[1] "ఫైల్ దోషం కారణంగా %d ఫొటోలను నకిలీచేయడం కుదరటంలేదు"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "మునుపటి రేటింగు పునరుద్ధరిస్తోంది"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "రేటింగులను పెంచుతున్నారు"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "రేటింగులను తగ్గిస్తున్నారు"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW అభివృద్ధికారుని అమరుస్తోంది"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "మునుపటి RAW అభివృద్ధికారుని తిరిగివుంచుతోంది"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "అభివృద్ధికారిని అమర్చు"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "అసలు ఫోటో సరిచేయుటకు సాధ్యపడదు."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "తేదీ మరియు సమయాన్ని సరిచేస్తోంది"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "తేదీ మరియు సమయం మార్పులు రద్దుచేస్తోంది"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ఒక మూల ఫోటో సవరింపు వీలుకాలేదు."
+msgstr[1] "ఈక్రింది మూల ఫోటోల సవరింపు వీలుకాలేదు."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "సమయం సరిచేయుటలో దోషం"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "కింద తెలిపిన ఫొటో ఫైలుకు సమయం సవరణలు చేయుటకు సాధ్యపడలేదు."
+msgstr[1] "కింద తెలిపిన ఫొటో ఫైళ్ళకు సమయం సవరణలు చేయుటకు సాధ్యపడటంలేదు."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "ట్యాగ్ సృష్టించు"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "\"%s\" కొసని తరలించు"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ఫొటోలను చెత్తబుట్టలోకి తరలించు"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "చెత్తబుట్టలో నుంచి ఫొటోలను పూర్వస్థానంలో ఉంచు"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ఫొటోలను షాట్‌వెల్ చెత్తబుట్టలోకి తరలించు"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "ఫొటోలను షాట్‌వెల్ లైబ్రరీలోకి తిరిగి పునరుద్ధరించు"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "ఫొటోలు చెత్తబుట్టలోకి తరలించబడుతున్నాయి"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "చెత్తబుట్టలోనున్న ఫొటోలు పునరుద్ధరించడుతున్నాయి"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "ఎంచుకున్న ఫొటోలకు గుర్తుపెట్టు"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "ఎంచుకున్న ఫొటోలకు గుర్తుతీసివేయి"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "గుర్తుపెట్టు"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "గుర్తునుతీసివేయి"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "నాటిలస్ ఇచటకు పంపు ప్రారంభించుట విఫలం%s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "ఇచటకు పంపు"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "%s కు నేపథ్యముగా ఎగుమతిచేయలేకపోతోంది: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "డెస్క్‍టాప్ స్లైడ్‌షో సిద్ధంచేయలేకపోతోంది: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "ఇది \"%s\" ట్యాగును ఒక ఫొటో నుండి తొలగిస్తుంది. కొనసాగమంటారా?"
+msgstr[1] "ఇది \"%s\" ట్యాగును %d ఫొటోల నుండి తొలగిస్తుంది. కొనసాగమంటారా?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "తీసివేయి(_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+"ఇది భద్రపరచబడిన వెతుకులాట \"%s\"ను తీసివేస్తుంది. కొనసాగాలనుకుంటున్నారా?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"అభివృద్దికారులను మార్చుట అనునది మీరు యీ ఫోటోకు షాట్‌వెల్ నందు చేసిన అన్ని "
+"మార్పులను తిరిగివుంచును"
+msgstr[1] ""
+"అభివృద్దికారులను మార్చుట అనునది మీరు యీ ఫోటోలకు షాట్‌వెల్ నందు చేసిన అన్ని "
+"మార్పులను తిరిగివుంచును"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "అభివృద్దికారి మార్చు (_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "వీడియో ఎగుమతిచేయి"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"%s కు రాయు హక్కులు లేకపోవుటవలన షాట్వెల్ ఫొటోని సవరించుటకు ఫైల్ "
+"సృష్టించలేకపోయింది."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ఫైల్ దోషం వలన క్రిందఇవ్వబడిన ఫొటో ఎగుమతి వీలుకాలేదు.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"మీరు ఇంకా ఎగుమతిని కొనసాగించాలనుకుంటున్నారా?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "మార్చబడనిది"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "ప్రస్థుత"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "ఫార్మాట్ (_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "నాణ్యత(_Q)"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "స్కేలింగ్ కన్‌స్ట్రెయింట్(_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " పిక్సెళ్ళు ( _p)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "మెటాడేటాను ఎగుమతిచేయి"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "వివరాలను దాయి..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "వివరాలను దాయి"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(మరియు %d మరిన్ని)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "ఫలితాల నివేదిక దిగుమతిచేయి"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "%d ఫైలును దిగుమతిచేయుటకు ప్రయత్నించెను"
+msgstr[1] "%d ఫైళ్ళను దిగుమతిచేయుటకు ప్రయత్నించెను"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "వీటిలో, %d ఫైలు విజయవంతంగా దిగుమతైను."
+msgstr[1] "వీటిలో, %d ఫైళ్ళు విజయవంతంగా దిగుమతైను."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "నకిలీ ఛాయాచిత్రాలు/వీడియోలు దిగుమతి కాలేదు:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "ఉన్న మాధ్యమ అంశాన్ని నకిలీచేయును"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "ఛాయాచిత్రాలు/వీడియోలు కేమెరా దోషముల కారణంగా దిగుమతి కాలేదు:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "దోష సందేశం:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"ఫైళ్ళు ఛాయాచిత్రములుగా కాని వీడియోలుగా కాని గుర్తించబడని కారణంగా దిగుమతి "
+"కాలేదు:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"ఛాయాచిత్రాలు/వీడియోలు షాట్‌వెల్ అర్ధము చేసుకోగల రూపంలో లేని కారణంగా దిగుమతి "
+"కాలేదు:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"షాట్‌వెల్ ఛాయాచిత్రాలను/వీడియోలను దాని లైబ్రరీకు నకలు తీయలేకపోయిన కారణంగా "
+"దిగుమతి కాలేదు:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"%s నకలు తీయలేక పోయెను\n"
+"\t %s కు"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "ఛాయాచిత్రాలు/వీడియోలు వేరే కారణాల వల్ల దిగుమతికాలేదు:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "1 నకిలీ ఫొటో దిగుమతి చేయలేదు:\n"
+msgstr[1] "%d నకిలీ ఫొటోలు దిగుమతి చేయలేదు:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "1 నకిలీ వీడియో దిగుమతి చేయలేదు:\n"
+msgstr[1] "%d నకిలీ వీడియోలు దిగుమతి చేయలేదు:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "1 నకిలీ ఫొటో/వీడియో దిగుమతి చేయలేదు:\n"
+msgstr[1] "%d నకిలీ ఫొటోలు/వీడియోలు దిగుమతి చేయలేదు:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ఫైల్ లేదా హార్డ్‍వేర్‌లో దోషం కారణంగా 1 ఫొటోను దిగుమతిచేయుటలో విఫలమైంది:\n"
+msgstr[1] ""
+"ఫైల్ లేదా హార్డ్‍వేర్‌లో దోషం కారణంగా %d ఫొటోలను దిగుమతిచేయుటలో విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ఒక ఫైల్ లేదా హార్డ్‍వేర్ దోషం వలన 1 వీడియోను దిగుమతిచేయుటలో విఫలమైంది:\n"
+msgstr[1] ""
+"ఒక ఫైల్ లేదా హార్డ్‍వేర్ దోషం వలన %d వీడియోలను దిగుమతిచేయుటలో విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"ఒక ఫైల్ లేదా హార్డ్‍వేర్ దోషం వలన 1 ఫొటో/వీడియోను దిగుమతిచేయుటలో విఫలమైంది:\n"
+msgstr[1] ""
+"ఒక ఫైల్ లేదా హార్డ్‍వేర్ దోషం వలన %d ఫొటోలు/వీడియోలను దిగుమతిచేయుటలో "
+"విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "ఫైలు లేదా హార్డువేర్ దోషము కారణంగా 1 ఫైలు దిగుమతి విఫలమైంది:\n"
+msgstr[1] "ఫైలు లేదా హార్డువేర్ దోషము కారణంగా %d ఫైళ్ళ దిగుమతి విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన 1 ఫొటో దిగుమతి విఫలం :\n"
+msgstr[1] "లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన %d ఫొటోల దిగుమతి విఫలం:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన 1 వీడియో దిగుమతి విఫలం\n"
+msgstr[1] ""
+"లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన %d వీడియోల దిగుమతి విఫలం\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన 1 ఫొటో/ వీడియో దిగుమతి విఫలం\n"
+msgstr[1] ""
+"లైబ్రరీ లో రాయుటకు హక్కులులేని కారణం వలన %d ఫొటోలు/ వీడియోలు దిగుమతి విఫలం\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"ఫొటో లైబ్రరీ సంచయం వ్రాయదగునదిగా లేని కారణంగా 1 ఫైలు దిగుమతి విఫలమైంది:\n"
+msgstr[1] ""
+"ఫొటో లైబ్రరీ సంచయం వ్రాయదగునదిగా లేని కారణంగా %d ఫైళ్ళ దిగుమతి విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "కెమెరా దోషం వలన 1 ఫొటోను దిగుమతిచేయుటలో విఫలమయింది:\n"
+msgstr[1] "కెమెరా దోషం వలన %d ఫొటోలను దిగుమతిచేయుటలో విఫలమయింది:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "కెమెరా దోషం వలన 1 వీడియోను దిగుమతిచేయుటలో విఫలమయింది:\n"
+msgstr[1] "కెమెరా దోషం వలన %d వీడియోలను దిగుమతిచేయుటలో విఫలమయింది:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "కెమెరా దోషం వలన 1 ఫొటో/వీడియోను దిగుమతిచేయుటలో విఫలమైంది:\n"
+msgstr[1] "కెమెరా దోషం వలన %d ఫొటోలు/వీడియోలను దిగుమతిచేయుటలో విఫలమైంది:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "1 ఫైలు కేమేరా దోషం వలన దిగుమతించుటలో విఫలమైంది:\n"
+msgstr[1] "%d ఫైళ్లు కేమేరా దోషం వలన దిగుమతించుటలో విఫలమైనాయి:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "1 మద్ధతులేని ఫొటో దాటవేయబడింది:\n"
+msgstr[1] "%d మద్ధతులేని ఫొటోలు దాటవేయబడినవి:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "1 బొమ్మకాని ఫైలు దాటవేయబడింది.\n"
+msgstr[1] "%d బొమ్మకాని ఫైళ్ళు దాటవేయబడినవి.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "వాడుకరి రద్దుచేయడం వలన 1 ఫొటో దాటవేయబడింది:\n"
+msgstr[1] "వాడుకరి రద్దుచేయడం వలన %d ఫొటోలు దాటవేయబడినవి:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "వాడుకరి రద్దుచేయడం వలన 1 వీడియో దాటవేయబడింది:\n"
+msgstr[1] "వాడుకరి రద్దుచేయడం వలన %d వీడియోలు దాటవేయబడినవి:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "వాడుకరి రద్దుచేయడం వలన 1 ఫొటో/వీడియో దాటవేయబడింది:\n"
+msgstr[1] "వాడుకరి రద్దుచేయడం వలన %d ఫొటోలు/వీడియోలు దాటవేయబడినవి:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "1 ఫైలు వాడుకరి రద్దుచేయడం వలన దాటవేయబడింది:\n"
+msgstr[1] "%d ఫైళ్లు వాడుకరి రద్దుచేయడం వలన దాటవేయబడ్డాయి:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "1 ఫొటో విజయవంతంగా దిగుమతిచేయబడింది.\n"
+msgstr[1] "%d ఫొటోలు విజయవంతంగా దిగుమతిచేయబడినవి.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "1 వీడియో విజయవంతంగా దిగుమతి అయింది.\n"
+msgstr[1] "%d వీడియోలు విజయవంతంగా దిగుమతి అయ్యాయి.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "1 ఫొటో/వీడియో విజయవంతంగా దిగుమతిచేయబడింది.\n"
+msgstr[1] "%d ఫొటోలు/వీడియోలు విజయవంతంగా దిగుమతిచేయబడినవి.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "ఏ ఫొటోలు లేదా వీడియోలు దిగుమతికాలేదు.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "దిగుమతి పూర్తయినది"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d సెకను"
+msgstr[1] "%d సెకనులు"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d నిమిషం"
+msgstr[1] "%d నిమిషాలు"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d గంట"
+msgstr[1] "%d గంటలు"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 రోజు"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "కార్యక్రమం పేరుమార్చు"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "పేరు:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "శీర్షికను సవరించు"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "శీర్షిక:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "వ్యాఖ్య:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "ఫైలును చెత్తబుట్టలోవేయి(_T)"
+msgstr[1] "ఫైళ్ళను చెత్తబుట్టలోవేయి(_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "కేవలం తొలగించు(_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "ఉంచు(_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "బాహ్య కూర్పును సవరించాలా?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "బాహ్య కూర్పులను రద్దుచేయాలా?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "ఇది బహిరంగ ఫైలుకు చేసిన అన్ని మార్పులను రద్దుచేస్తుంది. కొనసాగాలా?"
+msgstr[1] ""
+"ఇది %d బహిరంగ ఫైళ్ళకు చేసిన అన్ని మార్పులను రద్దుచేస్తుంది. కొనసాగాలా?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "బయటి కూర్పుల మార్పులను రద్దుచేయి(_v)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "బాహ్య కూర్పులను రద్దుచేయుము (_v)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "ఇది ఫొటోను లైబ్రరీ నుంచి తొలగిస్తుంది. కొనసాగాలా?"
+msgstr[1] "ఇది %d ఫొటోలను లైబ్రరీ నుంచి తొలగిస్తుంది. కొనసాగాలా?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "తొలగించు(_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ఫొటోలను లైబ్రరీ నుండి తొలగించు"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "లైబ్రరీ నుండి ఫొటోలను తొలగించు"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Hr"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "ఒకే మౌంట్ ద్వారా ఫొటోలు/వీడియోలు షిఫ్ట్ చేయి (_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "అన్ని ఫొటోలు/వీడియోలను ఈ సమయానికి అమర్చు (_a)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "యధార్థ ఫోటో ఫైలను సవరించు (_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "యధార్థ ఫోటో ఫైళ్ళను సవరించు (_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "అసలు ఫైళ్ళను సవరించు(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "అసలు ఫైళ్ళను సవరించు (_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "అసలు: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ఎక్సపోజర్ సమయం ముందుకు మార్చబడుతుంది\n"
+"%d %s, %d %s, %d %s, మరియు %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"ఎక్సపోజర్ సమయం వెనుకకు మార్చబడుతుంది\n"
+"%d %s, %d %s, %d %s, మరియు %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "రోజు"
+msgstr[1] "రోజులు"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "గంట"
+msgstr[1] "గంటలు"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "నిముషం"
+msgstr[1] "నిముషాలు"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "సెకను"
+msgstr[1] "సెకనులు"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"మరియు %d ఇతర."
+msgstr[1] ""
+"\n"
+"\n"
+"మరియు %d ఇతరాలు."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "ట్యాగులు (కామాలతో వేరుచేయబడినవి):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "స్వాగతం!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "షాట్‌వెల్‌కు స్వాగతం!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "ఇపుడు ప్రారంభించుటకు, కింద తెలిపిన మార్గాల ద్వారా దిగుమతిచేసుకోవచ్చు:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"ఎన్నుకోండి <span weight=\\\"bold\\\">ఫైల్ %s సంచయం నుండి దిగుమతిచేయి</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "షాట్‌వెల్ విండో మీదకి ఫొటోలను లాగుము మరియు వదిలివేయుము"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "ఒక కెమెరాను కంప్యూటర్‌కు అనుసంధానించి దిగుమతిచేయండి"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "మీ %s సంచయం నుండి ఫొటోలను దిగుమతిచేయి(_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "కిందతెలిపిన ఏదైనా ఒక మార్గం ద్వారా మీరు ఫొటోలను దిగుమతిచేసుకోవచ్చు:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ఈ సందేశాన్ని మళ్ళీ చూపించవద్దు(_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "మీ %s నుండి ఫొటోలను దిగుమతించండి"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(సహాయము)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "సంవత్సరం%sనెల%sరోజు"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "సంవత్సరం%sనెల"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "సంవత్సరం%sనెల-రోజు"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "సంవత్సరం-నెల-రోజు"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "అనురూపిత"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "సరిలేని మాదిరి"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"షాట్‌వెల్ ఫొటోలను లైబ్రరీ సంచయంలోనికి నకలుతీయగలదు లేదా వాటిని నకలుతీయకుండానే "
+"దిగుమతిచేసుకోగలదు."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "ఫోటోలను నకలుతీయి(_p)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "అదే స్థానంలో దిగుమతి (_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "లైబ్రరీకి దిగుమతిచేయి"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "లైబ్రరీ నుండి తొలగించు"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "లైబ్రరీ నుండి ఫొటోలను తొలగిస్తోంది"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "లైబ్రరీ నుండి ఫొటోలను తొలగిస్తున్నది"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి ఫొటో/వీడియోను తొలగిస్తుంది. డెస్క్‍టాప్ "
+"చెత్తబుట్టకు కూడా ఫైలుని తరలించడానికి "
+"ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+msgstr[1] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి %d ఫొటోలు/వీడియోలను తొలగిస్తుంది. డెస్క్‍టాప్ "
+"చెత్తబుట్టకు కూడా ఫైలుని "
+"తరలించడానికి ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి వీడియోను తొలగిస్తుంది. డెస్క్‍టాప్ "
+"చెత్తబుట్టకు కూడా ఫైలుని తరలించడానికి "
+"ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+msgstr[1] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి %d వీడియోలను తొలగిస్తుంది. డెస్క్‍టాప్ "
+"చెత్తబుట్టకు కూడా ఫైలుని తరలించడానికి "
+"ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి ఫొటోను తొలగిస్తుంది. డెస్క్‍టాప్ చెత్తబుట్టకు "
+"కూడా ఫైలుని తరలించడానికి "
+"ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+msgstr[1] ""
+"ఇది మీ షాట్‌వెల్ లైబ్రరీ నుండి %d ఫొటోలను తొలగిస్తుంది. డెస్క్‍టాప్ "
+"చెత్తబుట్టకు కూడా పైళ్ళని తరలించడానికి "
+"ఇష్టపడుతున్నారా?\n"
+"\n"
+"ఈ చర్యను వెనక్కి తీసుకొవడం సాధ్యపడదు."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"ఈ ఫొటో లేదా వీడియోను డెస్క్‍టాప్ చెత్తబుట్టకి తరలించడం వీలుకావడంలేదు. ఈ "
+"ఫైలుని తీసివేయాలా?"
+msgstr[1] ""
+"ఈ %d ఫొటోలు లేదా వీడియోలను డెస్క్‍టాప్ చెత్తబుట్టకి తరలించడం వీలుకావడంలేదు. "
+"ఈ ఫైళ్ళని తీసివేయాలా?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "ఫోటో లేదా వీడియో తీసివేయుట వీలుపడదు."
+msgstr[1] "%d ఫోటోలు/వీడియోలు తీసివేయుట వీలుపడదు."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "వెడల్పు లేదా ఎత్తు"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "వెడల్పు"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "ఎత్తు"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "%s గమనించుట వీలుకాలేదు: (%s) సంచయం కాదు."
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "కార్యక్రమం %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s: %s కొరకు తాత్కాలిక ఫైల్ సృష్టించుట విఫలం"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "ఎగుమతిచేస్తోంది"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "ఫైల్ %s ఇదివరకే ఉంది. పునఃస్థాపించాలా?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "దాటవేయి (_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "పునఃస్థాపించు (_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "అన్నిటిని పునఃస్థాపించు(_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "ఎగుమతిచేయి"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "పర్యవేక్షక నవీకరణలను జరుపలేక పోతోంది: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "థంబ్‌నెయిళ్ళ యొక్క పరిమాణాన్ని సరిచేయు"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "పెద్దగాచేయి (_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "థంబ్ నెయిల్ పరిమాణం పెంచుము"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "చిన్నగాచేయి (_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "థంబ్ నెయిల్ పరిమాణం తగ్గించుము"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "ఫోటోలను పేర్చు(_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "వీడియోను ఆడించు(_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "ఎంచుకున్న వీడియోలను వ్యవస్థ వీడియో ప్లేయర్‌లో తెరవండి"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "అభివృద్ధికారుడు (_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "షాట్‌వెల్"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "కెమెరా"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "శీర్షికలు (_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "ప్రతీఒక్క ఫోటో శీర్షికను చూపించు"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "వ్యాఖ్యానాలు (_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "ప్రతి ఛాయాచిత్రము యొక్క వ్యాఖ్యానము ప్రదర్శించుము"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "కొసలు (_g)"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "ప్రతీఒక్క ఫొటో ట్యాగులను చూపించు"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "శీర్షికను బట్టి(_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "శీర్షికను బట్టి ఫోటోలను పేర్చు"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "తీసిన తేదీని బట్టి(_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "తీసిన తేదీని బట్టి ఫొటోలను క్రమబద్ధీకరించు"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "రేటింగును బట్టి(_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "రేటింగును బట్టి ఫోటోలను పేర్చు"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "ఆరోహణ(_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "ఫొటోలను అరోహణ క్రమంలో చూపుము"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "అవరోహణ(_e)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "ఫొటోలను అవరోహణ క్రమంలో పేర్చు"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"షాట్‌వెల్ కొన్ని కారణాల వల్ల ఎంచుకున్న వీడియోను ప్లే చేయలేకపోతుంది:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "ఫొటోలు/వీడియోలు లేవు"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "ఫొటోలు/వీడియోలు కనబడలేదు"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ఈ డైరెక్టరీకి ఫొటోలను ఎగుమతి చేయడం వీలుకాదు."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "సవరించబడినది"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "ముందు ఫోటో"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "తరువాత ఫోటో"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ఫొటో ఆధార ఫైలు తప్పిపోయినది: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "వీక్షణం (_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "పనిముట్లు (_o)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "మునుపటి ఫోటో(_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "మునుపటి ఫోటో"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "తరువాత ఫొటో(_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "తరువాత ఫొటో"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "ఫొటో యొక్క వృద్ధికరణ పెంచండి"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ఫొటో యొక్క వృద్ధికరణ తగ్గించండి"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "పేజీకి కుదుర్చు(_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "తెరకు సరిపోయేలా అమర్చుటకు ఫొటోను జూమ్‌చేయండి"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "100% జూమ్ (_1)"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, fuzzy, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ఫొటోను 100% వృద్ధికరణ వరకూ జూమ్ చేయండి"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "200% జూమ్ (_2)"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, fuzzy, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ఫొటోను 200% వృద్ధికరణ వరకూ జూమ్ చేయండి"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "%s ఎగుమతిచేయలేకపోతోంది: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "పేజీ మొత్తం నింపు(_F)"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "పేజీకి 2 బొమ్మలు"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "పేజీకి 4 బొమ్మలు"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "పేజీకి 6 బొమ్మలు"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "పేజీకి 8 బొమ్మలు"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "పేజీకి 16 బొమ్మలు"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "పేజీకి 32 బొమ్మలు"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "వాలెట్ (2 x 3 in.)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "నోట్‌కార్డు (3 x 5 in.)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "మెట్రిక్ వాలెట్ (9 x 13 cm)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "పోస్టుకార్డు (10 x 15 cm)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "బొమ్మ అమరికలు"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "ముద్రిస్తోంది..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ఫొటోను ముద్రించలేకపోతుంది:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "ఈరోజు"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "నిన్న"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "అంశాలు:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d కార్యక్రమం"
+msgstr[1] "%d కార్యక్రమాలు"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ఫొటో"
+msgstr[1] "%d ఫొటోలు"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d వీడియో"
+msgstr[1] "%d వీడియోలు"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "తేది:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "సమయం:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "నుండి:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "వరకు:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "పరిమాణం:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "నిడివి:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f సెకనులు"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "అభివృద్ధికారుడు:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "ఎక్స్‍పోజర్:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "స్థానము:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "ఫైలు పరిమాణం:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "ప్రస్తుత అభివృద్ది:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "అసలు కొలతలు:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "కెమెరా తయారీదారు:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "కెమెరా మోడల్:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "ఫ్లాష్:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "నాభ్యంతరం:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "ఎక్సుపోజర్ తేది:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "ఎక్స్‍పోజర్‌ కాలం:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "ఎక్స్‍పోసర్ బయాస్:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS అక్షాంశం:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS రేఖాంశం:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "కళాకారుడు:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "నకలుహక్కు:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "సాఫ్ట్‍వేర్:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "పొడిగించిన సమాచారం"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ఫోటో నిర్వాహకం"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "ఫొటో వీక్షకం"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "కుడివైపు తిప్పు(_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "తిప్పు"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "కుడివైపు తిప్పు"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "ఫొటోలను కుడివైపుకు తిప్పండి (ఎడుమవైపు తిప్పుటకు Ctrl నొక్కండి)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "ఎడమవైపు తిప్పు (_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "ఎడమవైపు తిప్పు"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "ఫొటోలను ఎడమవైపుకి తిప్పు"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "అడ్డంగా తారుమారుచేయి(_z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "అడ్డంగా తారుమారుచేయి"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "నిలువుగా తారుమారుచేయి (_c)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "నిలువుగా తారుమారుచేయి"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "మెరుగుపరుచు(_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "మెరుగుపరుచు"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "స్వయంచాలకంగా ఫొటో కనపడువిధాన్ని మెరుగుపరుచు"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "కత్తిరించు(_c)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "కత్తిరించు"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ఫొటో పరిమాణాన్ని కత్తిరించు"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "సరిచేయి (_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "సరిచేయి"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "ఫొటోని సరిచేయి"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "రెడ్-ఐ(_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "రెడ్-ఐ"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ఫొటోలో ఉన్న ఏ రెడ్-ఐ ప్రాభావాన్నైనా తగ్గించు లేదా తొలగించు"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "సరిచేయి(_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "సరిచేయి"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ఫొటో రంగును మరియు వర్ణస్థాయిని సవరించు"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "అసలుకి చేసిన మర్పులనురద్దుచేయి(_v)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "అసలుకి చేసిన మర్పులనురద్దుచేయి"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "బయటి కూర్పుల మార్పులను రద్దుచేయి(_d)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "ఉత్తమ ఫొటోకి చేసిన మార్పులను రద్దుచేయి"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "డెస్క్‍టాప్ నేపథ్యం వలె అమర్చు(_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "ఎంచుకున్న బొమ్మను కొత్త డెస్క్‍టాప్ నేపథ్యముగా అమర్చు"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "డెస్క్‍టాప్ స్లైడ్‌షోలాగ అమర్చు...(_D)"
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "చేసినదానిని రద్దుచేయి(_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "చేసినదానిని రద్దుచేయి"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "మళ్ళీచేయి (_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "మళ్ళీచేయి"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "కార్యక్రమం పేరుమార్చు...(_n)"
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "కార్యక్రమానికి ముఖచిత్రంగా చేయండి(_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "కార్యక్రమానికి ముఖచిత్రంగా చేయండి"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "కొత్త కార్యక్రమం(_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "కొత్త కార్యక్రమం"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "కార్యక్రమంలో చేర్చు"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ఫొటోలను కార్యక్రమంలో చేర్చు"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "కార్యక్రమాలను ఒకటిగాకలిపివేయి(_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "ఒకటిగాకలిపివేయి"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "కార్యక్రమాలన్నిటినీ ఒకే కార్యక్రమముగా కలిపివేయి"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "రేటింగు అమర్చు(_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "రేటింగు అమర్చు(_S)"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "మీ ఫొటో యొక్క రేటింగు మార్చు"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "పెంచండి(_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "రేటింగు పెంచండి"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "తగ్గించండి(_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "రేటింగు తగ్గించండి"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "రేటుచేయనివి(_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "రేటింగుచేయనివి"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "రేటుచేయనివాటిని రేట్‌చేయి"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "రేట్‌చేయనివాటిగా అమరుస్తోంది"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "ఏ రేటింగునైనా తొలగించండి"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "తిరస్కరించబడినవి(_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "తిరస్కరించబడినవి"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "తిరస్కరించబడినవాటిని రేట్ చేయి"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "తిరస్కరించిన వాటిగా అమరుస్తోంది"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "తిరస్కరించబడినవాటిగా రేటింగు అమర్చు"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "తిరస్కరించబడినవి మాత్రమే(_O)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "తిరస్కరించబడినవి మాత్రమే"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "తిరస్కరించబడిన ఫొటోలను మాత్రమే చూపించు"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "అన్నీ + తిరస్కరించబడినవి(_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "అన్ని ఫొటోలను చూపించు, తిరస్కరించబడినవాటిని కూడా"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "అన్ని ఫొటోలు(_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "అన్ని ఫొటోలను చూపించు"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "రేటింగులు(_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "ప్రతీ ఫొటో యొక్క రేటింగు చూపుము"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "ఫొటోలను వడపోయి(_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "ఫొటోలను వడపోయి"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "వడపోత ఆధారంగా కనబడే ఫోటోల సంఖ్యను పరిమితం చేయి"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "నకిలీచేయి(_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "నకిలీచేయి"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ఫోటో యొక్క నకిలీ తయారుచేయి"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "ఎగుమతిచేయి...(_E)"
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "ముద్రించు...(_P)"
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "ప్రచురించు(_b)"
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "వివిధ వెబ్‌సైటులకు ప్రచురించు"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "శీర్షికను సవరించు...(_T)"
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "వ్యాఖ్యానము సరిచేయి... (_C)"
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "వ్యాఖ్య సరికూర్చు"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "తేదీ మరియు సమయాన్ని సరిచేయి...(_A)"
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "తేది మరియు సమయాన్ని సరిచేయి"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "ట్యాగులను జతచేయి...(_T)"
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "టాగ్‌లను జతచేయి... (_A)"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "ట్యాగులను జతచేయి"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "ప్రాధాన్యతలు(_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "బయటి కూర్పకముతో తెరువు(_x)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RAW కూర్పరితో తెరువు(_R)"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "దీనికి పంపుము(_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "దీనికి పంపు... (_o)"
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "కనుగొను...(_F)"
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "కనుగొను"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "పేరులో కాని టాగ్స్ లో కాని వున్న పాఠంతో బొమ్మను వెతుకుట"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "గుర్తుపెట్టు(_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "గుర్తుతీసివేయి(_f)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "కూర్పరిని ప్రారంభించలేకపోతోంది: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "\"%s\" ట్యాగు జతచేయి"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "\"%s\" మరియు \"%s\" ట్యాగులను జతచేయి"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "\"%s\" ట్యాగుని తీసివేయి(_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "\"%s\" ట్యాగుని తీసివేయి"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ట్యాగును తీసివేయి"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "కొత్తది (_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" ట్యాగు పేరుమార్చు...(_n)"
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "ట్యాగుపేరుని \"%s\" నుండి \"%s\" కి మార్చండి"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "పేరుమార్చు...(_R)"
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "ట్యాగులను సవరించు...(_y)"
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "ట్యాగులను సవరించు"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ఫొటోలను \"%s\" వలె ట్యాగ్‌చేయి"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "ఫొటోలను ఇలా \"%s\" ట్యాగ్ చేయి"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "ఎంచుకున్న ఫొటోలను \"%s\" వలె ట్యాగ్ చేయి"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "ఎంచుకున్న ఫొటోలను ఇలా \"%s\" ట్యాగ్ చేయి"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "\"%s\" ట్యాగును ఫొటోల నుండి తొలగించు(_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "ఫొటోల నుండి \"%s\" ట్యాగును తొలగించు (_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "\"%s\" ట్యాగును ఫొటోల నుండి తొలగించు"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "ఫొటోల నుండి \"%s\" ట్యాగును తొలగించు"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "\"%s\" గా పేరు మార్చుట కుదరదు, ఎందుకంటే అది ఇప్పటికే వున్నది."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"\"%s\" కి వెతుకులాట పేరుని మార్చలేకపోతుంది, ఎందుకంటే అటువంటి వెతుకలాట "
+"ఇంతకుముందే ఉన్నది."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "దాచబడిన శోధన"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "శోధనను తొలగించు"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "సవరించు...(_E)"
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "పేరుమార్చు...(_n)"
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "శోధన పేరును \"%s\" నుండి \"%s\" కు మార్చు"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" శోధనను తొలగించు"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "రేట్ %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "రేటింగుని %s కి అమర్చు"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "రేటింగుని %s కి అమరుస్తోంది"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s ప్రదర్శించు"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "%s రేటింగుతో ఉన్న ఫొటోలను మాత్రమే చూపించు"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s లేదా ఇంకామెరుగైనవి"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s ప్రదర్శించు లేదా ఇంకా మెరుగైనవి"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "%s రేటింగు లేదా అంతకంటే మెరుగైన రేటింగు ఉన్న ఫొటోలను మాత్రమే చూపించు"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "ఎంచుకున్న ఫొటోలను చెత్తబుట్ట నుండి తొలగించు"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "ఎంచుకున్న ఫొటోలను లైబ్రరీ నుండి తొలగించు"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "తిరిగిఉంచు(_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "ఎంచుకున్న ఫొటోలను తిరిగి లైబ్రరీలోనికి తరలించు"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "ఫైల్ నిర్వాహకిలో చూపించు(_g)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "ఎంచుకున్న ఫొటో'ల డైరెక్టరీని ఫైల్ నిర్వాహకంలో తెరువు"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ఫైల్ నిర్వాహకంలో తెరుచుటకు సాధ్యపడటంలేదు: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "లైబ్రరీ నుండి తొలగించు(_e)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "చెత్తబుట్టకి తరలించు(_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "అన్నింటినీ ఎంచుకో(_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "అన్ని అంశాలను ఎంచుకోండి"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "స్లైడ్‌షో"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "గుర్తుపెట్టబడినవి"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ఫొటోలు"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "వీడియోలు"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW ఫొటోలు"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW ఫొటోలు"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "UI ఫైల్ ఎక్కించుటలో దోషం %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "రకం"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "రేటింగు"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "అమరికలు"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "వెనుకకు"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "మునుపటి ఫోటోకు వెళ్ళు"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "నిలిపివేయి(_P)"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "స్లైడ్‌షోను నిలిపివేయి"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "తరువాత"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "తరువాతి ఫోటోకు వెళ్ళు"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "స్లైడ్‌షో అమరికలను మార్చు"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ఫోటో ఆధార ఫైళ్ళు అన్నీ తప్పిపోయినవి."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "ప్లేచేయి"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "స్లైడ్‌షోను కొనసాగించు"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "శీర్షికలేనిది"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "వీడియోలను ఎగుమతిచేయి"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "కెమెరాలు"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"కెమెరాను అన్‌మౌంట్ చేయలేకపోతోంది. కెమెరాను ఫైల్ నిర్వాహకం నుంచి అన్‌మౌంట్ "
+"చేయడానికి ప్రయత్నించండి."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ఇదివరకే దిగుమతిచేయబడిన ఫోటోలను దాయి"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "దిగుమతిచేయబడని ఫోటోలను మాత్రమే ప్రదర్శించు"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "దిగుమతి ప్రారంభమైంది, దయచేసి వేచివుండండి..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "ఎంచుకున్న వాటిని దిగుమతిచేయి(_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "ఎంచుకున్న ఫొటోలను మీ లైబ్రరీలోనికి దిగుమతిచేయి"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "అన్నిటినీ దిగుమతిచేయి(_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "ఫొటోలన్నింటినీ మీ లైబ్రరీలోనికి దిగుమతిచేసుకోండి"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"షాట్‌వెల్ కెమెరాను వాడకోగలగాలంటే ఫైల్ వ్యవస్థ నుండి దానిని అన్‌మౌంట్ "
+"చేయాల్సిఉంది. కొనసాగమంటారా?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "అన్‌మౌంట్(_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "దయచేసి కెమెరాను అన్‌మౌంట్ చేయండి."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"కెమెరా మరొక అనువర్తనముచే లాక్ చేయబడింది. దానిని అన్‌లాక్ చేసినపుడు మాత్రమే "
+"షాట్‌వెల్ కెమెరాను వాడుకునే సౌలభ్యం "
+"ఉంటుంది. దయచేసి కెమెరాను వాడుతున్న ఇతర అనువర్తనాన్ని మూసివేసి మరలా "
+"ప్రయత్నించండి."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "దయచేసి కెమెరాను వాడుతున్న ఇతర అనువర్తనాన్ని మూసివేయండి."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"కెమెరా నుండి మునుజూపును తెచ్చుట వీలుకాలేదు:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "అన్‌మౌంట్‌చేస్తోంది..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "ఫోటో సమాచారాన్ని తెస్తోంది"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s కొరకు మునుజూపును తెస్తోంది"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "కెమెరాను లాక్ చేయలేకపోతోంది: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ఈ ఫొటోను కెమెరా నుండి తీసివేయమంటారా?"
+msgstr[1] "ఈ %d ఫొటోలను కెమెరా నుండి తీసివేయమంటారా?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ఈ వీడియోను కెమెరా నుండి తీసివేయమంటారా?"
+msgstr[1] "ఈ %d వీడియోలను కెమెరా నుండి తీసివేయమంటారా?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ఈ ఫొటో/వీడియోను కెమెరా నుండి తీసివేయమంటారా?"
+msgstr[1] "ఈ %d ఫొటోలు/వీడియోలను కెమెరా నుండి తీసివేయమంటారా?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "ఈ ఫైళ్ళను కెమెరా నుండి తీసివేయాలా?"
+msgstr[1] "ఈ %d ఫైళ్ళను కెమెరా నుండి తీసివేయాలా?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "ఫొటోలు/వీడియోలు కెమెరా నుంచి తొలగించబడుతున్నాయి"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "దోషముల కారణంగా %d ఫొటో/వీడియో కెమెరా నుండి తీసివేయలేకపోతోంది."
+msgstr[1] "దోషముల కారణంగా %d ఫొటోలు/వీడియోలను కెమెరా నుండి తీసివేయలేకపోతోంది."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "డేటా దిగుమతులు"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s డేటాబేసు"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "దోషం యెదురైన కారణంగా దిగుమతి %s నుండి కొనసాగించలేము:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"వేరొక సేవనుండి దిగుమతిని ప్రయత్నించుటకు, పై మెనూనుండి వొకటి యెంచుకొనుము."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"మీరు యెటువంటి దత్తాంశ చొప్పింతలను చేతనంగా కలిగిలేరు.\n"
+"\n"
+"అనువర్తనం ప్రమేయతనుండి దిగుమతిని వుపయోగించుటకు, మీరు కనీసం వొక దత్తాంశ "
+"చొప్పింతను చేతనంగా "
+"కలిగివుండాలి. చొప్పింతలు ఆభీష్టాల డైలాగ్‌నుండి చేతనం చేయగలం."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "డేటాబేసు ఫైల్:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "దిగుమతిచేయి(_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "అనువర్తనం నుండి దిగుమతిచేయి"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "ఇచట నుండి మాధ్యమాన్ని దిగుమతిచేయండి (_f):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "మూసివేయి (_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ఫొటో డేటాబేసు %s తెరుచుట/సృష్టించుట కుదరటంలేదు: దోషము కోడ్ %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"ఫొటో డేటాబేసు ఫైలుకి వ్రాయలేకపోతున్నది:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"డేటాబేసు ఫైలును అనుమతిలో దోషము:\n"
+"%s\n"
+"\n"
+"దోషము ఏమిటంటే:\n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "ఫైల్ (_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "దాచు (_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "ఫోటో భద్రపరుచు"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "ఇలా దాచు...(_A)"
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "ఫొటోను వేరొక పేరుతో దాచండి"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "మీ కంప్యూటర్‌కి ఒక ముద్రకం అనుసంధానించి ఫొటోను ముద్రించు"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "సవరణ (_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "ఫోటో (_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "సహాయం (_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s ఏమాత్రం లేదు."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ఫైలు కాదు."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s తోడ్పాటు లేదు : ఫైల్ ఫార్మాట్\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "ఒక నకలు దాచు(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s మార్పులు వదలివేయాలా?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "దాచకుండానే మూసివేయి(_w)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s కి భద్రపరుస్తుండగా దోషం: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "ఇలా దాచు"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "ప్రస్తుత ఫొటో కొలతలకి తిరిగిరండి"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "ఈ ఫొటోకి కత్తెరింపును అమర్చు"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"చిత్రపటం మరియు ప్రకృతి దృశ్యం తీరుల మధ్య అంచులు సవరించవలసిన దీర్ఘచతురస్రం "
+"స్థిరంగావుంచుము."
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "నిరోధించబడనివి"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "చతురస్రం"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "తెర"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD వీడియో (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD వీడియో (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "లెటర్ (8.5 x 11 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "టేబ్లోయిడ్ (11 x 17 in.)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "రెడ్-ఐ సాధనాన్ని మూసివేయి"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "ఎంపికచేసిన ప్రాంతంలో ఉన్న ఏ రెడ్-ఐ ప్రభావాన్నైనా తొలగించు"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "తిరిగిఅమర్చు(_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "సాచురేషన్:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "లేతరంగు:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "ఉష్ణోగ్రత:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "ప్రతిబింబాలు:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr ""
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "రంగులను తిరిగిఅమర్చు"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "అన్ని రంగు సవరణలని అసలుకి తిరిగిఅమర్చు"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "ఉష్ణోగ్రత"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "లేతరంగు"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "సాచురేషన్"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "ఎక్స్‍పోజర్"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "ప్రతిబింబాలు"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr ""
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "వ్యత్యాస విస్తరణ"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "కోణం:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ఫోటో/వీడియో"
+msgstr[1] "%d ఫొటోలు/వీడియోలు"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "సమావేశం లేదు"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "ప్రతి ఘటన యొక్క వ్యాఖ్యను ప్రదర్శించు"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ఏ కార్యక్రమాలు లేవు"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ఏ కార్యక్రమాలు కనిపించలేదు"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "కార్యక్రమాలు"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "నవీకరించబడింది"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "సంచయాలు"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "లైబ్రరీ"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "దిగుమతిచేస్తోంది..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "దిగుమతిని ఆపు(_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "ఫొటోల దిగుమతిని ఆపు"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "దిగుమతిచేయుటకు సిద్ధంచేస్తోంది..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "%s దిగుమతిచేయబడినవి"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "ఆఖరి దిగుమతి"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "సంచయం నుండి దిగుమతిచేయి...(_I)"
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "డిస్కు నుంచి లైబ్రరీకి ఫొటోలను దిగుమతిచేయి"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "అనువర్తనం నుండి దిగుమతిచేయండి (_A)"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "కార్యక్రమాలను క్రమబద్దీకరించు(_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "చెత్తబుట్టని ఖాళీచేయి(_r)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "చెత్తబుట్టలో ఉన్న అన్ని ఫొటోలను తీసివేయి"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "ఫొటో కోసం కార్యక్రమాలను చూడు(_n)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "కనుగొను (_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "అన్వేషణ వివరాల ప్రకారం ఫొటోలు, వీడియోలు వెతుకు"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "కొత్తగా భద్రపరచబడిన శోధన...(_w)"
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "ఫోటోలు(_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "కార్యక్రమాలు (_t)"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "ప్రాథమిక సమాచారం (_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "ఎంపిక యొక్క ప్రాథమిక సమాచారాన్ని చూపించు"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "అధిక సమాచారం(_x)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "ఎంపిక యొక్క అధిక సమాచారాన్ని చూపించు"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "అన్వేషణ పట్టీ(_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "అన్వేషణ పట్టీ చూపు"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "పక్క పట్టీ (_i)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "పక్కపట్టీ ప్రదర్శించుము"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "సంచయం నుండి దిగుమతిచేయి"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "చెత్తబుట్టని ఖాళీచేయి"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "చెత్తబుట్టను ఖాళీచేస్తోంది..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "లైబ్రరీ స్థానము"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ఈ డైరెక్టరీ నుంచి ఫొటోలను దిగుమతిచేయుట సాధ్యపడదు."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "లైబ్రరీని నవీకరిస్తోంది..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "ఫొటోల స్వయం-దిగుమతికి సిద్ధంచేస్తోంది..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "ఫొటోలను స్వయం-దిగుమతిచేస్తోంది..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "మెటాడేటాను ఫైళ్ళకి వ్రాస్తుంది..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "తప్పిపోయిన ఫైళ్ళు"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "తీసివేస్తోంది..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "చెత్తబుట్ట"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "చెత్తబుట్ట ఖాళీగాఉంది"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "తీసివేయి"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "ఫొటోలను తీసివేస్తున్నది"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"మీ ఫొటో లైబ్రరీ ఈ షాట్వెల్ రూపాంతరముతో సరిపోదు. అది షాట్వెల్%s (స్కీమా %d) "
+"సృష్టంచినట్లుంది. "
+"ఇప్పటిరూపాంతరము %s (స్కీమా %d). ఇటీవలి రూపాంతరము మాత్రమే వాడుము"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"షాట్వెల్%s (స్కీమా %d) నుండి %s (స్కీమా %d) కొరకు మీ ఫొటో లైబ్రరీ నవీకరించుట "
+"వీలుకాలేదు. మరిన్ని "
+"వివరాలకు %s దగ్గర షాట్వెల్ వికీ చూడుము"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"మీ ఫొటో లైబ్రరీ ఈ షాట్వెల్ రూపాంతరముతో సరిపోదు. అది షాట్వెల్%s (స్కీమా %d) "
+"సృష్టంచినట్లుంది. "
+"ఇప్పటిరూపాంతరము %s (స్కీమా %d). మీ లైబ్రరీనుండి %s తొలగించి మరియు మరల మీ "
+"ఫొటోలు దిగుమతి "
+"చేయడంద్వారా లైబ్రరీ శుభ్రం చేయుము."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "తెలియని దోషం షాట్‌వెల్ యొక్క డేటాబేసుని సరిచూచుటకు ప్రయత్నిస్తోంది: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "షాట్‌వెల్ లోడవుతోంది"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "షాట్‌వెల్ వ్యక్తిగత దత్తాంశముకు పాత్"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "సంచయం"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "రన్‌టైమ్ నందు లైబ్రరీ సంచయమును మార్పుల కొరకు పర్యవేక్షించవద్దు"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "ప్రారంభపు పురోగమన మీటర్‌ను ప్రదర్శించవద్దు"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "అనువర్తనము వర్షన్ చూపుము"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[FILE]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"అందుబాటులో ఉన్న కమాండ్ లైన్ ఐచ్ఛికాల పూర్తి జాబితాను చూచుటకు '%s --help' "
+"నడుపుము.\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "అత్యల్ప (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "మధ్యస్థ (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "అధిక (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "అత్యధిక (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "ప్రచురిస్తోంది"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "అప్‌లోడ్ చేయుటకు సిద్ధంచేస్తోంది"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d / %d ఎక్కింపు"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s కు ముద్రణ కొనసాగ వీలుకాదు ఎందుకంటే ఒక దోషం ఎదురైంది:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "వేరొక ముద్రణ సేవికకకు, మెనూ నుండి ఒకటి ఎంచుకొనుము"
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "ఎంచుకున్న ఫొటోలు/వీడియోలు విజయవంతంగా ప్రచురించబడినవి."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "ఎంచుకున్న వీడియోలు విజయవంతంగా ప్రచురించబడినవి."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "ఎంచుకున్న ఫొటోలు విజయవంతంగా ప్రచురించబడినవి."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "ఎంచుకున్న వీడియో విజయవంతంగా ప్రచురించబడింది."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "ఎంచుకున్న ఫొటో విజయవంతంగా ప్రచురించబడింది."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ఖాతా సమాచారాన్ని సాధించుతున్నది..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "లోనికి ప్రవేశిస్తున్నారు..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "ఫొటోలను ప్రచురించు"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "ఫొటోలను దీనికి ప్రచురించు(_t):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "వీడియోలను ప్రచురించు"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "వీడియోలను దీనికి ప్రచురించు(_t)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "ఫొటోలను మరియు వీడియోలను ప్రచురించు"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "ఫొటోలను మరియు వీడియోలను దీనికి ప్రచురించు(_t)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "ప్రచురించలేకపోతోంది"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"మీరు సారూప్యతగల ప్రచురణ చొప్పింతను చేతనంగా కలిగిలేని కారణంగా యెంపికచేసిన "
+"అంశాలను షాట్‌వెల్ "
+"ప్రచురించలేదు. దీనిని సరిదిద్దుటకు, <b>%s అభీష్టాలను సరిచేయు</b> యెంచుకొని "
+"అప్పుడు <b>చొప్పింతలు</"
+"b> టాబ్ పైన వొకటి లేదా అంతకన్నా యెక్కువ ప్రచురణ చొప్పింతలను చేతనంచేయి."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "దాచబడిన శోధనలు"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "కలిగివుంటుంది"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "ఖచ్చితముగా ఇదే"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "దీనితో ప్రారంభమవుతుంది"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "దీనితో అంతమవుతుంది"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "వీటిని కలిగివుండదు"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "అమర్చబడలేదు"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "అనేది"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "అనేది కాదు"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "ఏదైనా ఫొటో"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "ఒక raw ఫొటో"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "ఒక వీడియో"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "పతాకించబడింది"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "పతాకించబడలేదు"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "మరియు ఎక్కువ"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "మాత్రమే"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "మరియు తక్కువ"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "అనేది ఆ తరువాత"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "అనేది ఇంతకుముందు"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "అనేది మధ్యన"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "మరియు"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "ఏదైనా"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "అన్నీ"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "ఏదీకాదు"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "ఏదైనా పాఠ్యం"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "శీర్షిక"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "ట్యాగు"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "వ్యాఖ్య"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "కార్యక్రమం పేరు"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "ఫైల్ పేరు"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "మీడియా రకము"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "ఫ్లాగు స్థితి"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "తేదీ"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "కొత్త ట్యాగు...(_T)"
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "స్లైడ్ ప్రదర్శన మారుతీరులు"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(ఏదీకాదు)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "ఏదీకాదు"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "యాదృశ్చిక"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "ట్యాగులు"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "డెస్క్‍టాప్ స్లైడ్‌షోలాగా అమర్చు"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "డెస్క్‍టాప్ నేపథ్య స్లైడ్‌షోను ఉత్పత్తిచేయి"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "ప్రతీ ఫొటోను ఇంతసేపు చూపించు"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "కాలవ్యవధి"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "ప్రతీ ఫొటోను డెస్క్‍టాప్ నేపథ్యం మీద ఎంతసేపు చూపించాలి"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "వెతుకు"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "శోధన యొక్క పేరు (_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "సరిపోల్చు (_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "కింద పేర్కొన్నవి:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>ముద్రిత ప్రతిరూప పరిమాణం</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "ఒక ప్రామాణిక పరిమాణాన్ని వాడు(_s):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "అనురూపిత పరిమాణాన్ని వాడు(_u):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "ఫొటో పొడవువెడల్పుల నిష్పత్తితో సరిపోల్చుము(_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "స్వయంపరిమాణం(_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>శీర్షికలు</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "బొమ్మ శీర్శికను ముద్రించు(_t)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>పిగ్జెల్ రిజొల్యూషన్</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "ఫొటో పంపించవలసిన స్థానం:(_O)"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "పిక్సెల్ పర్ ఇంచ్"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "షాట్‌వెల్ ప్రాధాన్యతలు"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "తెలుపు"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "నలుపు"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "కొత్త ఫైళ్ళ కోసం లైబ్రరీ డైరెక్టరీని చూడండి (_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "మెటాడేటా"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "కొనలను,శీర్షికలను, మరియు ఇతర మెటాడేటాను ఫొటో ఫైళ్ళకు వ్రాయి (_m)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "ప్రదర్శించు"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "ఫొటోలను దీనికి దిగుమతిచేయి(_I):"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "నేపథ్యం(_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "దిగుమతిచేస్తోంది"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "సంచయ రూపు:(_D)"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "మాదిరి:(_P)"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "ఉదాహరణ:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "దిగుమతి అయిన ఫైళ్లని క్రిందిబడిఅక్షరాలతో పేరుమార్చు(_e)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW అభివృద్ధికారుడు"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "అప్రమేయం (_f):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "బాహ్య ఫొటో కూర్పరి (_x)"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "బయటి RAW కూర్పరి(_R):"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "బయటి కూర్పరులు"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "ప్లగిన్లు"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "సమయం(_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "మారు ప్రభావం: (_T)"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "మారు సమయం:(_e)"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "శీర్షిక చూపు (_i)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "సెకనులు"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "లాగిన్ (_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr "ఫొటోలను మీ నివాస డైరెక్టరీలోకి దిగుమతిచేయడానికి షాట్‌వెల్ స్వరూపించబడింది.\n"
diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..5af6a64
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,4354 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# bojang <neo.bojang@gmail.com>, 2011
+# bojang <neo.bojang@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Thai (http://www.transifex.com/projects/p/shotwell/language/"
+"th/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "เหตุการณ์ %s เรื่อง"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "กล้อง"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "กล้อง"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"ไม่สามารถยกเลิกการเชื่อมต่อกับกล้องได้ ลองยกเลิกการเชื่อมต่อกล้องโดยใช้โปรแกรมจัดการแฟ้ม"
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "ซ่อนภาพถ่ายที่นำเข้าแล้ว"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "แสดงเฉพาะภาพถ่ายที่ยังไม่นำเข้า"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_ชื่อ"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "แสดงชื่อของแต่ละภาพ"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "นำเข้าที่เ_ลือก"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "นำเข้าภาพถ่ายที่เลือกเข้าสู่ไลบรารีของคุณ"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "นำเข้า_ทั้งหมด"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "นำเข้ารูปภาพทั้งหมดลงในไลบรารี่ของคุณ"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "Shotwell ต้องการเลิกเมานท์กล้องจากระบบแฟ้มก่อนเพื่อใช้กล้อง ต้องการทำต่อหรือไม่?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "เ_ลิกเมานท์"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "โปรดเ_ลิกเมานท์กล้อง"
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"กล้องถูกล็อกโดยโปรแกรมอื่น Shotwell จะสามารถเข้าใช้ได้เมื่อกล้องไม่ถูกล็อกเท่านั้น "
+"โปรดปิดโปรแกรมอื่นที่กำลังใช้งานกล้องอยู่และลองใหม่"
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "โปรดปิดโปรแกรมอื่นที่กำลังใช้กล้องอยู่"
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"ไม่สามารถดึงภาพตัวอย่างจากกล้อง:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "กำลังเลิกเมานท์..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "กำลังดึงข้อมูลของภาพถ่าย"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "กำลังดึงภาพตัวอย่างสำหรับ %s"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "ไม่สามารถล็อคกล้อง: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "ต้องการลบภายถ่าย %d นี้ออกจากกล้องหรือไม่?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "ลบ %d วิดีโอจากกล้อง ?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "ลบ %d รูปภาพ/วิดีโอ จากกล้องหรือไม่ ?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] ""
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "เ_ก็บไว้"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "กำลังลบ รูปภาพ/วิดีโอ ออกจากกล้อง ?"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "แสดงการนำเสนอภาพนิ่ง"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "ส่งออก ภาพถ่าย/วิดีโอ"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr ""
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "ภาพถ่ายการส่งออก"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "ส่งออกภาพถ่าย"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "หมุนภาพ"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "เรียกคืนการหมุนภาพ"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "กลับด้านแนวนอน"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "เรียกคืนการพลิกกลับภาพแนวนอน"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "กลับด้านแนวตั้ง"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "เรียกคืนการพลิกกลับภาพแนวตั้ง"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "การให้คะแนน"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "กำลังโหลด Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[แฟ้ม]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "พิมพ์ '%s --help' เพื่อแสดงตัวเลือกบรรทัดคำสั่งทั้งหมด\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "วันนี้"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "เมื่อวาน"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "ชื่อ:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "รายการ:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "เหตุการณ์ %d"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d ภาพถ่าย"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "วันที่:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "เวลา:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "จาก:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "ถึง:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "ขนาด:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "ระยะเวลา :"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr ""
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "เปิดรับแสง:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "สถานที่:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "ขนาดแฟ้ม:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "ขนาดดั้งเดิม:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "ผู้ผลิตกล้อง:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "กล้องรุ่น:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "แฟลช:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "ความยาวโฟกัส:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "การชดเชยแสง:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "ละติจูด GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "ลองจิจูด GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "ศิลปิน:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "ลิขสิทธิ์:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "ซอฟต์แวร์:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "ข้อมูลเพิ่มเติม"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "นี่จะเป็นการลบแท็ก \"%s\" จากภาพ %d ต้องการทำต่อไปหรือไม่?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_ยกเลิก"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_ลบ"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "ส่งออกวิดีโอ"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"ไม่สามารถส่งออกภาพที่เลือกเนื่องจากแฟ้มเกิดความผิดภาพ\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"ต้องการส่งออกต่อหรือไม่?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "_ต่อไป"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr ""
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "ปัจจุบัน"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "รู_ปแบบ:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "คุ_ณภาพ:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "ข้อจำกัดมาตร_ส่วน:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _พิกเซล"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr ""
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(และอีก %d)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "มี %d ภาพซ้ำที่ไม่ถูกนำเข้า:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "มี %d วิดีโอซ้ำที่ไม่ถูกนำเข้า: \n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "มี %d ภาพ/วิดีโอ ซ้ำที่ไม่ถูกนำเข้า: \n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d ภาพถ่ายที่ไม่สามารถนำเข้าได้เนื่องจากแฟ้มหรือฮาร์ดแวร์ผิดพลาด:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "มี %d วิดีโอ นำเข้าล้มเหลวเนื่องจากความผิดพลาดของไฟล์หรือฮาร์ดแวร์ : \n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "มี %d ภาพ/วิดีโอ นำเข้าล้มเหลวเนื่องจากความผิดพลาดของไฟล์หรือฮาร์ดแวร์ : \n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"การนำเข้าภาพถ่าย %d ภาพ ล้มเหลว เนื่องจากไม่สามารถเขียนข้อมูลลงไลบรารี่ภาพถ่ายได้\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"การนำเข้าวีดีโอ %d ไฟล์ ล้มเหลว เนื่องจากไม่สามารถเขียนข้อมูลลงไลบรารี่ภาพถ่ายได้\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"การนำเข้าภาพถ่าย/วีดีโอ %d ไฟล์ ล้มเหลว เนื่องจากไม่สามารถเขียนข้อมูลลงไลบรารี่ภาพถ่ายได้\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "มี %d ภาพถ่ายที่ไม่สามารถนำเข้าได้เนื่องจากการผิดพลาดของกล้อง:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "มี %d วิดีโอที่ไม่สามารถนำเข้าได้เนื่องจากการผิดพลาดของกล้อง:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "มี %d ภาพถ่าย/วิดีโอ ที่ไม่สามารถนำเข้าได้เนื่องจากการผิดพลาดของกล้อง:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d ภาพที่ไม่รองรับ ข้ามแล้ว:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d แฟ้มที่ไม่ใช่ภาพ ข้ามแล้ว\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "ข้ามภาพถ่าย %d ภาพ เนื่องจากผู้ใช้ยกเลิก:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "ข้ามภาพถ่ายหรือวิดีโอ %d ภาพ เนื่องจากผู้ใช้ยกเลิก: \n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d ภาพถ่ายถูกนำเข้าเรียบร้อย\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d วีดีโอถูกนำเข้าเรียบร้อย\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d ภาพถ่าย/วีดีโอ ถูกนำเข้าเรียบร้อย\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "ไม่มีรูปภาพหรือวิดีโอที่ถูกนำเข้า\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "นำเข้าสมบูรณ์"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d วินาที"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d นาที"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d ชั่วโมง"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 วัน"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "เปลี่ยนชื่อเหตุการณ์"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "ชื่อ:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "แก้ไขชื่อ"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "แฟ้มใน_ถังขยะ"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "_ลบออกเท่านั้น"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "การกระทำนี้จะยกเลิกการเปลี่ยนแปลงทั้งหมดของ %d แฟ้มภายนอก ต้องการทำต่อหรือไม่?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "_กลับไปใช้โปรแกรมแก้ไขภายนอก"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_ลบ"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "ลบภาพถ่ายจากไลบรารี"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "AM"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "PM"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 ชั่วโมง"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "แ_ก้ไขแฟ้มดั้งเดิม"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "ดั้งเดิม:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%m/%d/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%m/%d/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"เวลาถ่ายจะถูกเลื่อนไปข้างหน้าโดย\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"เวลาถ่ายจะถูกเลื่อนกลับหลังโดย\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "วัน"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ชั่วโมง"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "นาที"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "วินาที"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"และ %d อื่นๆ"
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "แท็ก (คั่นด้วยเครื่องหมายจุลภาค):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "ยินดีต้อนรับ!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "ยินดีต้อนรับสู่ Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "สำหรับการเริ่มต้น คุณสามารถนำเข้าภาพถ่ายได้ด้วยวิธีการดังนี้:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "เลือก <span weight=\"bold\">แฟ้ม %s นำเข้าจากโฟลเดอร์</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "ลากและปล่อยภาพถ่ายลงในหน้าต่างของ Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "เชื่อมต่อกล้องกับเครื่องคอมพิวเตอร์ของคุณและนำเข้า"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_นำเข้าภาพถ่ายจาก %s โฟลเดอร์ของคุณ"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "ไ_ม่ต้องแสดงข้อความนี้อีก"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(ช่วยเหลือ)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "ปี%sเดือน%sวัน"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "ปี%sเดือน"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "ปี%sเดือน-วัน"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "ปี-เดือน-วัน"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "เลือกเอง"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "รูปแบบไม่ถูกต้อง"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "คัดล_อกภาพถ่าย"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_นำเข้าสถานที่"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "นำเข้าไปยังไลบรารี"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "ลบออกจากไลบรารี"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "ลบภาพถ่ายจากไลบรารี"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"นี่จะเป็นการลบภาพถ่าย %d จากไลบรารีของ Shotwell คุณต้องการลบแฟ้มเหล่านี้ลงถังขยะหรือไม่?\n"
+"\n"
+"การกระทำนี้ไม่สามารถเรียกคืนได้"
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] ""
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "แท็ก"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "สำเร็จ"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "เกิดข้อผิดพลาดที่แฟ้ม"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "ไม่สามารถถอดรหัสแฟ้มได้"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "เกิดข้อผิดพลาดที่ฐานข้อมูล"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "ผู้ใช้ยกเลิกการนำเข้า"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "ไม่ใช่แฟ้ม"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "มีแฟ้มนี้ในฐานข้อมูลแล้ว"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "ไม่สนับสนุนแฟ้มรูปแบบนี้"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "ไม่ใช่แฟ้มรูปภาพ"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "ดิสก์ล้มเหลว"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "ดิสก์เต็ม"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "กล้องผิดพลาด"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr ""
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "(%d) นำเข้าล้มเหลว"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "ปรับเปลี่ยน"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "รูปที่แล้ว"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "รูปถัดไป"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "ไม่พบตำแหน่งของแฟ้มภาพถ่าย: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "มุ_มมอง"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "ภาพถ่ายที่แ_ล้ว"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "ภาพถ่ายที่แล้ว"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "ภาพถ่าย_ถัดไป"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "ภาพถ่ายถัดไป"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "แสดง_ขยาย"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "เพิ่มขนาดแว่นขยายของภาพถ่าย"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "แสดง_ย่อ"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "ลดขนาดแว่นขยายของภาพถ่าย"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "พอดีกับ_กระดาษ"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "ปรับมุมมองภาพพอดีหน้าจอ"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "ขยาย _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "ปรับมุมมองภาพถ่ายเป็น 100%"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "ขยาย _200%"
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "ปรับมุมมองภาพถ่ายเป็น 200%"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "ไม่สามารถส่งออก %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s ฐานข้อมูล"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_นำเข้า"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_ปิด"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "ตั้งค่า"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "การนำเสนอภาพนิ่ง"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "กลับ"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "ไปยังภาพถ่ายที่ผ่านมา"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "หยุด"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "หยุดการนำเสนอภาพนิ่ง"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "ถัดไป"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "ไปยังภาพถ่ายถัดไป"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "เปลี่ยนแปลงการตั้งค่าการนำเสนอภาพนิ่ง"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "ไม่พบตำแหน่งของแฟ้มภาพถ่ายทั้งหมด"
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "เล่น"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "นำเสนอภาพนิ่งต่อ"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "คืนค่าเดิม"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "เรียกคืนการคืนค่าเดิม"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "การปรับปรุง"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "เรียกคืนการปรับปรุง"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "สร้างเหตุการณ์ใหม่"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "ลบเหตุการณ์"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "ย้ายภาพถ่ายไปยังเหตุการณ์ใหม่"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "ตั้งค่าภาพถ่ายลงในเหตุการณ์ก่อนหน้า"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "รวมภาพ"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "เรียกคืนการรวมภาพ"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "ทำสำเนาภาพถ่าย"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "ลบภาพถ่ายที่ซ้ำ"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "ไม่สามารถสำเนาภาพถ่าย %d เนื่องจากแฟ้มเกิดความผิดพลาด"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "เรียกคืนคะแนนก่อนหน้านี้"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "เพิ่มการจัดอันดับ"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "ลดการจัดอันดับ"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "ไม่สามารถปรับแต่งภาพดั้งเดิมได้"
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "ปรับแก้วันที่และเวลา"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "เลิกการปรับแก้วันที่และเวลา"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "ภาพดั้งเดิมนี้ไม่สามารถปรับแต่งได้"
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "การปรับแก้เวลาผิดพลาด"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "ไม่สามารถบันทึกการตั้งค่าเวลากับภาพนี้"
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr ""
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "ทิ้งภาพถ่ายลงถังขยะ"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "กู้คืนภาพถ่ายจากถังขยะ"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "ทิ้งภาพถ่ายลงถังขยะของ Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "กู้คืนภาพถ่ายกลับไปยังไลบราลีของ Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "กำลังทิ้งภาพถ่ายลงถังขยะ"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "กำลังกู้คืนภาพถ่ายจากถังขยะ"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "ติดป้ายรูปภาพที่เลือก"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "เลิกติดป้ายภาพถ่ายที่เลือก"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "ติดป้าย"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "เลิกติดป้าย"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr ""
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr ""
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "ต่ำ (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "กลาง (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "สูง (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "สูงที่สุด (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "รูปแบบ TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "ไม่มีรูปภาพ / วิดีโอ"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "ไม่พบรูปภาพ / วิดีโอ"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "ไม่สามารถส่งออกภาพไปยังไดเรกทอรีนี้"
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr ""
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 ภาพต่อหนึ่งหน้า"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "นิ้ว"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "ซม."
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "กระเป๋าธนบัตร (2 x 3 นิ้ว)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "กระดาษโน้ต (3 x 5 นิ้ว)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 นิ้ว"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 นิ้ว"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 นิ้ว"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 นิ้ว"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 นิ้ว"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "กระเป๋าธนบัตรใหญ่ (9 x 13 ซม.)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "ไปรษณียบัตร (10 x 15 ซม.)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 ซม."
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 ซม."
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 ซม."
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 ซม."
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 ซม."
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "ตั้งค่าภาพ"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "กำลังพิมพ์ ..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"ไม่สามารถพิมพ์ภาพถ่าย:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "ไม่สามารถเปิดหรือสร้างฐานข้อมูลภาพถ่าย %s ได้ :รหัสความผิดพลาด %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "ส่งออกวีดีโอ"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "ส่งไป"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "ไม่สามารถส่งออกพื้นหลังเป็น %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "ถูกติดป้าย"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "ถังขยะ"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "ถังขยะว่างเปล่า"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "ลบ"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr ""
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "ไม่พบแฟ้ม"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "กำลังลบ..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "นำเข้าล่าสุด"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_นำเข้าจากโฟลเดอร์..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "นำเข้าภาพถ่ายจากดิสก์ไปยังไลบรารี"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "เรียงลำดับเ_หตุการณ์"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "ลบข้อมูลใน_ถังขยะ"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "ลบทุกภาพถ่ายในถังขยะ"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_ค้นหา"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "แ_ฟ้ม"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "แ_ก้ไข"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_ภาพถ่าย"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_ภาพถ่าย"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "เ_หตุการณ์"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "แ_ท็ก"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_วิธีใช้"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "ข้อมูล_พื้นฐาน"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "แสดงข้อมูลพื้นฐานของภาพที่เลือก"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "ข้อมูลเ_พิ่มเติม"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "แสดงข้อมูลเพิ่มเติมของแฟ้มที่เลือก"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "จาก_น้อยไปหามาก"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "เรียงภาพถ่ายจากน้อยไปหามาก"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "จาก_มากไปหาน้อย "
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "เรียงภาพถ่ายจากมากไปหาน้อย"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "นำเข้าจากโฟลเดอร์"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "ลบข้อมูลในถังขยะ"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "กำลังลบข้อมูลในถังขยะ..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell ถูกตั้งค่าให้นำเข้าถาพถ่ายลงในไดเรกทอรีบ้านของคุณ\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "ที่ตั้งของไลบรารี"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "ไม่สามารถนำเข้าภาพถ่ายจากไดเรกทอรีนี้ได้"
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "กำลังปรับปรุงไลบรารี่ ..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "กำลังเตรียมการนำเข้าภาพถ่ายอัตโนมัติ..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "กำลังนำเข้าภาพถ่ายอัตโนมัติ."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr ""
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "ห้ิองสมุด"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "กำลังนำเข้า..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_หยุดการนำเข้า"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "หยุดการนำเข้าภาพถ่าย"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "กำลังเตรียมการนำเข้า..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "นำเข้า %s แล้ว"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_บันทึก"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "บันทึกภาพถ่าย"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "บันทึกเ_ป็น..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "บันทึกภาพถ่ายเป็นชื่ออื่น"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "พิมพ์ภาพถ่ายกับคอมพิวเตอร์ที่เชื่อต่อกับเครื่องนี้"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "ไม่พบ %s"
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s ไม่ใช่แฟ้ม"
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s ไม่สนับสนุนรูปแบบแฟ้มของ\n"
+"%s"
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "_บันทึกเป็นสำเนา"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "ล้มเหลวในการเปลี่ยนเป็น %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "ปิดโดยไ_ม่บันทึก"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "เกิดข้อผิดพลาดขณะบันทึกลง %s: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "บันทึกเป็น"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "ตัวจัดการภาพถ่าย"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "โปรแกรมแสดงภาพถ่าย"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "หมุนไปทาง_ขวา"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "หมุน"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "หมุนไปทางขวา"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "หมุนไป_ทางซ้าย"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "หมุนไปทางซ้าย"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "หมุนภาพถ่ายไปทางซ้าย"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "กลับข้างแนว_นอน"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "กลับข้างแนวนอน"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "กลับข้างแนว_ตั้ง"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "กลับข้างแนวตั้ง"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_ปรับปรุง"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "ปรับปรุง"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "ตกแต่งภาพอัตโนมัติ"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_ครอบตัด"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "ครอบตัด"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "ครอบตัดขนาดภาพถ่าย"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_ตาแดง"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "ตาแดง"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "ลดหรือลบลักษณะตาแดงในภาพถ่าย"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_ปรับแก้"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "ปรับแก้"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "ปรับแก้สีและการไล่ระดับของภาพถ่าย"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "_คืนกลับค่าดั้งเดิม"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "คืนกลับค่าดั้งเดิม"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "กลับไปใช้โปรแกรมแ_ก้ไขภายนอก"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "คืนกลับเป็นภาพต้นแบบ"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "ตั้งเป็นภาพพื้นหลังของ_พื้นโต๊ะ"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "ตั้งรูปภาพที่เลือกเป็นภาพพื้นหลังของพื้นโต๊ะ"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "เ_รียกคืน"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "เรียกคืน"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_ทำซ้ำ"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "ทำซ้ำ"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "เ_ปลี่ยนชื่อเหตุการณ์"
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "สร้างกุญแ_จภาพถ่ายของเหตุการณ์"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "สร้างกุญแจภาพถ่ายของเหตุการณ์"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "เหตุการณ์ใ_หม่"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "เหตุการณ์ใหม่"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "ย้ายภาพถ่าย"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "ย้ายภาพถ่ายไปยังเหตุการณ์"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_รวมเหตุการณ์"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "รวมภาพ"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_ตั้งค่าคะแนน"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "ตั้งค่าคะแนน"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "เปลี่ยนการให้คะแนนภาพถ่ายของคุณ"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_เพิ่มขึ้น"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "ให้คะแนน"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_ลดลง"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "ลดคะแนน"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "เ_ลิกให้คะแนน"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "เลิกให้คะแนน"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "ตั้งเป็นยังไม่ได้ให้คะแนน"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "ลบการให้คะแนนทั้งหมด"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "ถูก_ปฏิเสธ"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "ตั้งค่าเป็นถูกปฏิเสธ"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "ทั้งหมด + _ที่ถูกปฏิเสธ"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "แสดงภาพถ่ายทั้งหมด รวมถึงที่ถูกปฏิเสธ"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_ภาพถ่ายทั้งหมด"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "แสดงภาพถ่ายทั้งหมด"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "ให้_คะแนน"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "แสดงคะแนนของแต่ละภาพถ่าย"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_กรองภาพถ่าย"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "กรองภาพถ่าย"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "ทำ_สำเนา"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "ทำสำเนา"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "ทำสำเนาของภาพถ่าย"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_ส่งออก..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_พิมพ์..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "เ_ผยแพร่..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "เผยแพร่"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "เผยแพร่ลงเว็บไซต์ต่างๆ"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_ตั้งค่าวันที่และเวลา..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "ตั่งค่าวันที่และเวลา"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "เพิ่มแ_ท็ก..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "เพิ่มแท็ก"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_ปรับแต่ง"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "เปิดด้วยโปรแกรมแก้ไขภาพดิบ"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "ส่งไ_ป ..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_ค้นหา..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "ค้นหา"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "ติด_ป้าย"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "เลิกติด_ป้าย"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "ไม่สามารถเปิดโปรแกรมภายนอก: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "เพิ่มแท็ก \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "เพิ่มแท็ก \"%s\" และ \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "_ลบแท็ก \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "ลบแท็ก \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "ลบแท็ก"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "เ_ปลี่ยนขื่อแท็ก \"%s\"..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "เปลี่ยนชื่อแท็กจาก \"%s\" เป็น \"%s\""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "แก้ไ_ขแท็ก..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "แก้ไขแท็ก"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "ใส่แท็กภาพถ่ายเป็น \"%s\""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "ใส่แท็กภาพถ่ายที่เลือกเป็น \"%s\""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "ลบแท็ก \"%s\" จาก_ภาพถ่าย"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "ลบแท็ก \"%s\" จากภาพถ่าย"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "ไม่สามารถเปลี่ยนชื่อแท็กเป็น \"%s\" เนื่องจากมีแท็กนี้แล้ว"
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr ""
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr ""
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr ""
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s คะแนน"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "ตั้งคะแนนเป็น %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "ตั้งค่าคะแนนเป็น %s"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "แสดง %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr ""
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s หรือดีกว่า"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "แสดง %s หรือดีกว่า"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr ""
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "ลบรูปภาพที่เลือกไปที่ถังขยะ"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "ลบภาพถ่ายที่เลือกออกจากไลบรารี"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "กู้_คืน"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "ย้ายภาพถ่ายที่เลือกกลับไปยังไลบรารี"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "แสดงในโปรแกรม_จัดการแฟ้ม"
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "เปิดไดเรกทอรี่ของภาพถ่ายที่เลทอกในโปรแกรมจัดการแฟ้ม"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "ไม่สามารถเปิดในโปรแกรมจัดการแฟ้ม: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "_ลบออกจากไลบรารี"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "ทิ้งลงถังขยะ"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "เ_ลือกทั้งหมด"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "เลือกทั้งหมด"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_ตั้งค่าใหม่"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "กลับไปใช้ขนาดภาพถ่ายปัจจุบัน"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "ตั้งการครอบตัดภาพถ่ายนี้"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "หมุนภาพที่ครอบตัดไปแนวตั้งหรือแนวนอน"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "โดยไม่มีข้อจำกัด"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "จตุรัส"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "หน้าจอ"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "ขนาดดั้งเดิม"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "วีดีโอทั่วไป(4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "วีดีโอความละเอียดสูง (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "ปิดเครื่องมือแก้ไขตาแดง"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "ลบลักษณะตาแดงในส่วนที่เลือก"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "ความเข้มสี:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "การย้อมสี:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "อุณหภูมิ:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "เงา:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "ตั้งค่าสีใหม่"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "คืนค่าสีที่ถูกปรับแต่งสู่ค่าดั้งเดิม"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "อุณหภูมิ"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "การย้อมสี"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "ความอิ่มตัว"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "การเปิดรับแสง"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "เงา"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "การขยายความเข้มภาพ"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr ""
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr ""
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "เลิกแสดงแบบเต็มหน้าจอ"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "เลิกแสดงแบบเ_ต็มหน้าจอ"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_ออก"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "เ_กี่ยวกับ"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "เ_ต็มหน้าจอ"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "เ_นื้อหา"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr ""
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"เกิดข้อผิดพลาดอย่างร้ายแรงเมื่อเข้าใช้ไลบรารีของ Shotwell ทำให้ Shotwell "
+"ไม่สามารถดำเนินการต่อได้\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "เยี่ยมชมเว็บไซต์ Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Piyachat Chinsaeng <neo.bojang@gmail.com>\n"
+"Sira Nokyoongtong <gumaraa@gmail.com>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "ไม่สามารถแสดงวิธีใช้: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr ""
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "ขนาดดั้งเดิม"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "ความกว้างหรือความสูง"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "ความก้าง"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "ความสูง"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "เปลี่ยนขนาดของรูปย่อ"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "เพิ่มขนาดของรูปย่อ"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "ลดขนาดของรูปย่อ"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "เ_รียงภาพถ่าย"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "แสดงแต่ละแท็กของภาพ"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_ตามชื่อ"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "เรียงภาพถ่ายตามชื่อ"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "ตามวันที่ถ่าย"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "เรียงตามวันที่ถ่าย"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "เรียงตามคะแนน"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "เรียงภาพถ่ายตามคะแนน"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d ภาพถ่าย/วีดีโอ"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "ไม่มีเหตุการณ์"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "ไม่พบเหตุการณ์"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "เหตการณ์"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "เลิกตั้งวันที่"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "ไม่มีเหตุการณ์"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "ไม่สามารถสร้างไดเรกทอรีข้อมูล %s : %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "ภาพถ่าย"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "ไม่สามารถสร้างไดเรกทอรีชั่วคราว %s :%s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "ไม่สามารถสร้างไดเรกทอรีข้อมูลย่อย %s : %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr ""
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "การส่งออก"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "แฟ้ม %s มีอยู่แล้ว ต้องการแทนที่หรือไม่?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_ข้าม"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "แ_ทนที่"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "แทนที่ทั้ง_หมด"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "ส่งออก"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "ภาพถ่าย"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "วิดีโอ"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "ภาพถ่ายดิบ"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "ภาพถ่ายดิบ"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "ประเภท"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "ภาพถ่ายที่เลือกเผยแพร่เสร็จเรียบร้อย"
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "ดึงข้อมูลบัญชีผู้ใช้..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "กำลังเข้าระบบ..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "เผยแพร่ภาพถ่าย"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "เผยแพร่ภาพถ่ายไ_ปยัง:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "เผยแพร่วิดีโอ"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "เผยแพร่วิดีโอไ_ปที่"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "เผยแพร่ภาพถ่ายและวีดีโอ"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "เผยแพร่ภาพถ่ายและวีดีโอไ_ปที่"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "กำลังเตรียมการอัพโหลด"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "กำลังอัพโหลด %d จาก %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "เพื่อทดลองเผยแพร่โดยใช้บริการอื่น ให้เลือกจากเมนูด้านบน"
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "ส่วนตัว"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"คุณเคยเข้าใช้ Flickr โดยผ่านวาระ Shotwell แล้ว\n"
+"ปิดแล้วเปิด Shotwell ใหม่ แล้วลองเผยแพร่ลง Flickr อีกครั้ง "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"คุณเข้าระบบของ Flickr เป็น %s\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"บัญชีผู้ใช้ Flickr แบบฟรีของคุณจำกัดการอัปโหลดข้อมูลต่อเดือน\n"
+"ในเดือนนี้ คุณเหลือโควต้าในการอัปโหลด %d เมกะไบต์ "
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "บัญชีผู้ใช้ Flikr Pro ของคุณสามารถอัปโหลดได้ไม่จำกัด"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "แสดงภาพ (_v) เป็น:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "ทุกคน"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "เฉพาะเพื่อนและครอบครัว"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "ฉันเท่านั้น"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 พิกเซล"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 พิกเซล"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 พิกเซล"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 พิกเซล"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Connect"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "กำลังสร้างอัลบั้ม..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "คุณเข้าใช้ Picasa Web Albums เป็น %s"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "ภาพถ่ายจะปรากฎใน:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "เล็ก (640 x 480 พิกเซล)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "กลาง (1024 x 768 พิกเซล)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "แนะนำ (1600 x 1200 พิกเซล)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"คุณยังไม่ได้เข้าระบบของ Facebook\n"
+"\n"
+"ถ้ายังไม่มีบัญชีผู้ใช้ของ Facebook คุณสามารถสร้างบัญชีผู้ใช้ได้ในขั้นตอนเข้าระบบ เมื่อเข้าระบบแล้ว "
+"Shotwell จะขออนุญาตอัปโหลดภาพและเผยแพร่ลงกระดานข้อความของคุณ "
+"โดยต้องการการอนุญาตเพื่อใช้งาน Shotwell Connect"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"คุณเคยเข้าและออกระบบของ Facebook โดยใช้วาระของ Shotwell\n"
+"เพื่อเผยแพร่ภาพถ่ายลง Facebook ให้ปิดและเปิด Shotwell ใหม่แล้วลองเผยแพร่ภาพถ่ายอีกครั้ง"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "ขนาดมาตรฐาน (720 พิกเซล)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "ขนาดใหญ่ (2048 พิกเซล)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "กำลังทดสอบการเชื่อมต่อกับ Facebook..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr "คุณเข้าสู่ Facebook เป็น %s \n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "คุณต้องการเผยแพร่รูปภาพที่เลือกไว้หรือไม่?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "ร่วน"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "ภาพนิ่ง"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "จางลง"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "ระยะเวลา"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr ""
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "ใช้ขนาด_มาตรฐาน:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "เ_ลือกขนาดเอง:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "_สัดส่วนภาพที่ตรงกัน"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "ขนาด_อัตโนมัติ"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "พิมพ์_ชื่อภาพถ่าย"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "ส่งผล_ลัพธ์ไปที่:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "พิกเซลต่อนิ้ว"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr ""
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr ""
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "สีขาว"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "สีดำ"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr ""
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr ""
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "แสดง"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_นำเข้าภาพถ่ายไปที่: "
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_พื้นหลัง :"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "กำลังนำเข้า"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr ""
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_รูปแบบ :"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "ตัวอย่าง :"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "เ_ปลี่ยนชื่อ ไฟล์ที่นำเข้าไปเป็นตัวพิมพ์เล็ก"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr ""
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "โปรแกรมแก้ไขภาพถ่าย_ดิบภายนอก"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "โปรแกรมแก้ไขภายนอก"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "โปรแกรมเสริม"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_หน่วงเวลา:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "วินาที"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "เ_ข้าระบบ"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "เผยแพร่ไปที่อัลบั้ม_ที่มีแล้ว:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "สร้างอัลบั้มใ_หม่ชื่อ:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_ออกจากระบบ"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "เ_ผยแพร่"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "_ขนาดภาพถ่าย:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "อัลบั้มที่มีแล้ว:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "ชื่อใ_หม่ของอัลบั้ม:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "แ_สดงรายการอัลบั้มในแกลเลอรีสาธารณะ"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "_ขนาดภาพถ่ายที่ตั้งไว้:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..33f2b96
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,4594 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Ferhat Tunctan <ferhattnctn66@gmail.com>, 2012
+# Huseyin Demirtaş <hsyn.demirtas@gmail.com>, 2011
+# Tayyip <m.tayyib.yel@gmail.com>, 2013
+# Muhammet Kara <muhammet.k@gmail.com>, 2011
+# Muhammet Yüksel <bulutyg@gmail.com>, 2011
+# verayin <vera@yorba.org>, 2011
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: Ferhat Tunctan <ferhattnctn66@gmail.com>\n"
+"Language-Team: Turkish (http://www.transifex.com/projects/p/shotwell/"
+"language/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Olay %s"
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Kameralar"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "Kamera ayrılamadı. Kamerayı, dosya yöneticisinden ayırmayı deneyin."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "İçe aktarılmış fotoğrafları gizle"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Yalnızca içe aktarılmamış fotoğrafları görüntüle"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "İçe aktarım başlıyor, lütfen bekleyin..."
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr "_Başlıklar"
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Tüm fotoğrafların başlığını görüntüle"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "_Seçili Öğeleri İçe Aktar"
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Şeçili fotoğrafları kütüphaneye aktar"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "_Tümünü İçe Aktar"
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Tüm fotoğrafları kütüphaneye aktar"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell, erişim sağlamak için kameranın dosya sisteminden ayrılmasına "
+"ihtiyaç duyuyor. Devam edilsin mi?"
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Ayır"
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Lütfen kamerayı ayırın."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Kamera, başka bir uygulama tarafından kullanılıyor. Shotwell, kameraya "
+"yalnızca boştayken erişebilir. Lütfen kamerayı kullanan diğer uygulamayı "
+"kapatın ve yeniden deneyin."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "Lütfen kamerayı kullanırken diğer programları kapatın."
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Kameradan önizlemeler alınamadı:\n"
+"%s"
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Ayrılıyor..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Fotoğraf bilgisi alınıyor"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "%s için önizleme alınıyor"
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Kamera kilitlenemedi: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Bu %d fotoğraf kameradan silinsin mi?"
+msgstr[1] "Bu %d fotoğraf kameradan silinsin mi?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Bu %d video kameradan silinsin mi?"
+msgstr[1] "Bu %d video kameradan silinsin mi?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Bu %d fotoğraf/video kameradan silinsin mi?"
+msgstr[1] "Bu %d fotoğraf/video kameradan silinsin mi?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Bu %d dosya kameradan silinsin mi?"
+msgstr[1] "Bu %d dosya kameradan silinsin mi?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr "_Koru"
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Fotoğraflar/Videolar kameradan kaldırılıyor"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "%d fotoğraf/video hatalar sebebiyle kameradan silinemiyor."
+msgstr[1] "%d fotoğraf/video hatalar sebebiyle kameradan silinemiyor."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr "S_layt Gösterisi"
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Bir slayt gösterisi oynat"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Resimleri/Videoları Dışa Aktar"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Fotoğrafları/Videoları Dışa Aktar"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Fotoğrafları Dışa Aktar"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Fotoğrafları Dışa Aktar"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Döndürülüyor"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Döndürme İşlemi Geri Alınıyor"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Yatay Olarak Çevriliyor"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Yatay Olarak Çevirme Geri Alınıyor"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Dikey Olarak Çevriliyor"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Dikey Olarak Çevirme Geri Alınıyor"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Herhangibir metin"
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Başlık"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Etiket"
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Etkinlik adı"
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Dosya adı"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Ortam türü"
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "İşaret durumu"
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr "Değerleme"
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Tarih"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "içerir"
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "tam olarak"
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "ile başlar"
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "ile biter"
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "içermez"
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "ayarlı değil"
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "dir"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "değildir"
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "herhangi bir fotoğraf"
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "işenmemiş (raw) bir fotoğraf"
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "bir video"
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "işaretli"
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "işaretsiz"
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "ve daha yüksek"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "sadece"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "ve daha alçak"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "sonrakidir"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "öncekidir"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "arasındadır"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "ve"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "herhangi"
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "hepsi"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "hiçbiri"
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Kaydedilmiş Aramalar"
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "Ye_ni Kaydedilmiş Arama..."
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Fotoğraf kütüphaneniz Shotwell'in bu sürümüyle uyumlu değil. Shotwell %s "
+"(schema %d) ile oluşturulduğu görünüyor. Bu sürüm ise %s (schema %d). Lütfen "
+"Shotwell'in son sürümünü kullanın."
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell fotoğraf kütüphanenizi sürüm %s (schema %d) den %s (schema %d) 'e "
+"güncellemeyi başaramadı. Daha fazla bilgi için lütfen Shotwelll Wiki'yi "
+"buradan %s kontrol edin."
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Fotoğraf kütüphaneniz Shotwell'in bu sürümüyle uyumlu değil. Shotwell %s "
+"(schema %d) ile oluşturulduğu görünüyor. Bu sürüm ise %s (schema %d). Lütfen "
+"kütüphanenizi %s i silerek temizleyin ve resimlerini tekrar içe aktarın."
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Shotwell veritabanı doğrulamayı deneyen bilinmeyen hata: %s"
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Shotwell Yükleniyor"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr "[DOSYA]"
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Kullanılabilir komut satırı seçeneklerinin tam bir listesini görmek için '%s "
+"--help' komutunu çalıştırın.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Bugün"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Dün"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Başlık:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr "Öğeler:"
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d Olaylar"
+msgstr[1] "%d Olaylar"
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d Fotoğraf"
+msgstr[1] "%d Fotoğraf"
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d videolar"
+msgstr[1] "%d videolar"
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Tarih:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Zaman:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "İlk Tarih"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Son Tarih:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Boyut:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr "Süre:"
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f saniye"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr "Geliştirici:"
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr "Pozlandırma:"
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr "Konum:"
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Dosya boyutu:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Özgün boyutlar:"
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Kamera yapımı:"
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Kamera modeli:"
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr "Flaş:"
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Odak uzaklığı:"
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Pozlandırma sapması:"
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS enlemi:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS boylamı:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Sanatçı:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Telif hakkı:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Yazılım:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Ayrıntılı Bilgi"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] ""
+"Bu işlem \"%s\" etiketini %d fotoğraf(lar)dan kaldıracak. Devam edilsin "
+"mi? "
+msgstr[1] ""
+"Bu işlem \"%s\" etiketini %d fotoğraf(lar)dan kaldıracak. Devam edilsin "
+"mi? "
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "İ_ptal"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr "_Sil"
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Bu işlem kayıtlı \"%s\" aramasını kaldıracak. Devam edilsin mi?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Geliştiricileri değiştirmek Shotwell'de bu fotoğraf(lar)a yapmış olduğunuz "
+"tüm değişiklikleri geri alacak"
+msgstr[1] ""
+"Geliştiricileri değiştirmek Shotwell'de bu fotoğraf(lar)a yapmış olduğunuz "
+"tüm değişiklikleri geri alacak"
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "_Geliştirici Değiştir"
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Video Ihracatı"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell bu fotoğrafı düzenlemek için bir dosya oluşturamıyor çünkü %s ye "
+"yazmaya izniniz yok."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"İzleyen fotoğraf bir dosya hatası nedeniyle dışa aktarılamadı.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Dışa aktarmaya devam etmek istiyor musunuz?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "Devam _Et"
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Değiştirilmemiş"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Mevcut"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Biçim:"
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Kalite:"
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "_Baskı ölçeklendiriliyor:"
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "_benek"
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Metadata'yı dışa aktar"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Detayları Kaydet..."
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Detayları Kaydet"
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(ve %d tane daha)\n"
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr "hata mesajı:"
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d fotoğraf kopyası içe aktarılmadı:\n"
+msgstr[1] "%d fotoğraf kopyası içe aktarılmadı:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d video kopyası içe aktarılmadı:\n"
+msgstr[1] "%d video kopyası içe aktarılmadı:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d fotoğraf/video kopyası içe aktarılmadı:\n"
+msgstr[1] "%d fotoğraf/video kopyası içe aktarılmadı:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotoğrafın dosya veya donanım hatası dolayısıyla içe aktarımı başarısız:\n"
+msgstr[1] ""
+"%d fotoğrafın dosya veya donanım hatası dolayısıyla içe aktarımı başarısız:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d videonun dosya veya donanım hatası dolayısıyla içe aktarımı başarısız:\n"
+msgstr[1] ""
+"%d videonun dosya veya donanım hatası dolayısıyla içe aktarımı başarısız:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d fotoğrafın/videonun dosya veya donanım hatası dolayısıyla içe aktarımı "
+"başarısız:\n"
+msgstr[1] ""
+"%d fotoğrafın/videonun dosya veya donanım hatası dolayısıyla içe aktarımı "
+"başarısız:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"%d dosyanın içe aktarımı dosya veya donanım hatası dolayısıyla başarısız:\n"
+msgstr[1] ""
+"%d dosyanın içe aktarımı dosya veya donanım hatası dolayısıyla başarısız:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotoğrafın içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+msgstr[1] ""
+"%d fotoğrafın içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d videonun içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+msgstr[1] ""
+"%d videonun içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d fotoğrafın/videonun içe aktarımı başarısız çünkü fotoğraf kütüphanesi "
+"klasörü yazılabilir değildi:\n"
+msgstr[1] ""
+"%d fotoğrafın/videonun içe aktarımı başarısız çünkü fotoğraf kütüphanesi "
+"klasörü yazılabilir değildi:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d dosyanın içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+msgstr[1] ""
+"%d dosyanın içe aktarımı başarısız çünkü fotoğraf kütüphanesi klasörü "
+"yazılabilir değildi:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d fotoğrafın içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+msgstr[1] "%d fotoğrafın içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d videonun içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+msgstr[1] "%d videonun içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"%d fotoğrafın/videonun içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+msgstr[1] ""
+"%d fotoğrafın/videonun içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d dosyanın içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+msgstr[1] "%d dosyanın içe aktarımı kamera hatası dolayısıyla başarısız:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d desteklenmeyen fotoğraf atlandı:\n"
+msgstr[1] "%d desteklenmeyen fotoğraf atlandı:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d resim olmayan dosya atlandı:\n"
+msgstr[1] "%d resim olmayan dosya atlandı:\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d fotoğraf kulanıcının iptali dolayısıyla atlandı:\n"
+msgstr[1] "%d fotoğraf kulanıcının iptali dolayısıyla atlandı:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d video kulanıcının iptali dolayısıyla atlandı:\n"
+msgstr[1] "%d video kulanıcının iptali dolayısıyla atlandı:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d fotoğraf/video kulanıcının iptali dolayısıyla atlandı:\n"
+msgstr[1] "%d fotoğraf/video kulanıcının iptali dolayısıyla atlandı:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d dosya kulanıcının iptali dolayısıyla atlandı:\n"
+msgstr[1] "%d dosya kulanıcının iptali dolayısıyla atlandı:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d fotoğraf başarıyla içe aktarıldı.\n"
+msgstr[1] "%d fotoğraf başarıyla içe aktarıldı.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d video başarıyla içe aktarıldı.\n"
+msgstr[1] "%d video başarıyla içe aktarıldı.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d fotoğraf/video başarıyla içe aktarıldı.\n"
+msgstr[1] "%d fotoğraf/video başarıyla içe aktarıldı.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Alınan resim ve videolar yok.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "İçe Aktarma Tamamlandı"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d saniye"
+msgstr[1] "%d saniye"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d dakika"
+msgstr[1] "%d dakika"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d saat"
+msgstr[1] "%d saat"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 gün"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Olayı Yeniden Adlandır"
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Ad:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Başlık Düzenle"
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "_Çöp Dosyalar"
+msgstr[1] "_Çöp Dosyalar"
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Yalnızca _Kaldır"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Harici Düzenlemeye Dönsün mü?"
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Harici Düzenlemelere Dönsün mü?"
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Bu işlem %d harici dosyaya yapılan tüm değişiklikleri yok edecek. Devam "
+"edilsin mi?"
+msgstr[1] ""
+"Bu işlem %d harici dosyaya yapılan tüm değişiklikleri yok edecek. Devam "
+"edilsin mi?"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "Harici Düzenlemeye D_ön"
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "Harici Düzenlemelere D_ön"
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Bu işlem kütüphaneden %d fotoğrafı kaldıracak. Devam edilsin mi? "
+msgstr[1] "Bu işlem kütüphaneden %d fotoğrafı kaldıracak. Devam edilsin mi? "
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "_Kaldır"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Kütüphaneden Fotoğraf Kaldır"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Kütüphaneden Fotoğraflar Kaldır"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "ÖÖ"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "ÖS"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 Saat"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "_Aynı değerde olan fotoğrafları/videoları değiştir"
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Tüm fotoğrafları/videoları bu zamana _ayarla"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "_Özgün fotoğraf dosyasını değiştir"
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "_Özgün fotoğraf dosyalarını değiştir"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "_Özgün dosyayı değiştir"
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "_Özgün dosyaları değiştir"
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Özgün:"
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Çekim tarihi ileri ötelenecek\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Çekim tarihi ötelenecek\n"
+"%d %s, %d %s, %d %s, and %d %s."
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "gün"
+msgstr[1] "gün"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "saat"
+msgstr[1] "saat"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "dakika"
+msgstr[1] "dakika"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "saniye"
+msgstr[1] "saniye"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"Ve %d diğer(ler)i."
+msgstr[1] ""
+"\n"
+"\n"
+"Ve %d diğer(ler)i."
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Etiketler (virgülle ayrılmış):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Hoşgeldiniz!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Shotwell'e Hoşgeldiniz!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Başlangıç olarak, fotoğraflarınızı şu yöntemlerden birini kullanarak içe "
+"aktarabilirsiniz:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Seç <span weight=\"bold\">Dosya %s Dizinden İçeri Aktar</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Fotoğrafları sürükleyip Shotwell penceresine bırakın"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Bilgisayarınıza bir kamera bağlayın ve içe aktarın"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_%s klasörünüzden fotoğrafları içe aktarın"
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+"Ayrıca fotoğrafları bu yollardan herhangi biriyle içe aktarabilirsiniz:"
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Bu iletiyi tekrar gösterme"
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "%s kütüphanenizden fotoğraflar içe aktarın"
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Yardım)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Yıl%sAy%sGün"
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Yıl%sAy"
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Yıl%sAy-Gün"
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Yıl-Ay-Gün"
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Özel"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Geçersiz şablon"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell fotoğrafları kütüphane klasörünün içine kopyalayabilir ya da "
+"kopyalama olmadan içe aktarabilir."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "Fotoğrafları K_opyala"
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "_Yerin içine aktar"
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Kitaplığa Aktar"
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Kitaplıktan Kaldır"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Kütüphaneden Fotoğraf Kaldırılıyor"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Kütüphaneden Fotoğraflar Kaldırılıyor"
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Bu işlem %d fotoğrafı/videoyu Shotwell kütüphanenizden kaldıracak. Ayrıca "
+"dosyaları masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+msgstr[1] ""
+"Bu işlem %d fotoğrafı/videoyu Shotwell kütüphanenizden kaldıracak. Ayrıca "
+"dosyaları masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Bu işlem %d videoyu Shotwell kütüphanenizden kaldıracak. Ayrıca dosyaları "
+"masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+msgstr[1] ""
+"Bu işlem %d videoyu Shotwell kütüphanenizden kaldıracak. Ayrıca dosyaları "
+"masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Bu işlem %d fotoğrafı Shotwell kütüphanenizden kaldıracak. Ayrıca dosyaları "
+"masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+msgstr[1] ""
+"Bu işlem %d fotoğrafı Shotwell kütüphanenizden kaldıracak. Ayrıca dosyaları "
+"masaüstünüzdeki çöp kutusuna taşımak ister misiniz?\n"
+"\n"
+"Bu eylem geri alınamaz."
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d fotoğraf/video masaüstünüzdeki çöp kutusuna taşınamıyor. Bu dosyalar "
+"silinsin mi?"
+msgstr[1] ""
+"%d fotoğraf/video masaüstünüzdeki çöp kutusuna taşınamıyor. Bu dosyalar "
+"silinsin mi?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d fotoğraf/video silinemiyor."
+msgstr[1] "%d fotoğraf/video silinemiyor."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Klasörler"
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Etiketler"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Başarılı"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Dosya hatası"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Dosya şifresi çözülemedi"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Veritabanı hatası"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Kullanıcı içe aktarma işlemini iptal etti"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Bir dosya değil"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Dosya zaten veritabanında mevcut"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Desteklenmeyen dosya biçimi"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Bir görüntü dosyası değil"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Disk hatası"
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Disk dolu"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Kamera hatası"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Dosya yazma hatası"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "İçe aktarılamadı (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr "değiştirilmiş"
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Önceki fotoğraf"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Sonraki fotoğraf"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Fotoğraf kaynağı bulunamadı: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "_Görünüm"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "A_raçlar"
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Önceki Fotoğraf"
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Önceki Fotoğraf"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Sonraki Fotoğraf"
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Sonraki Fotoğraf"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr "_Yakınlaştır"
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Fotoğrafı büyüt"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr "_Uzaklaştır"
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Fotoğrafı küçült"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Sayfaya sığdır"
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Fotoğrafı ekrana sığacak şekilde büyült"
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr "Yakınlaştır _100%"
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, fuzzy, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Fotoğrafı 100% büyütmeyle yakınlaştır"
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr "Yakınlaştır _200% "
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, fuzzy, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Fotoğrafı 200% büyütmeyle yakınlaştır"
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr "_Geliştirici"
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Dışa aktarılamadı %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s Veritabanı"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "%s den içe aktarım devam edemez çünkü bir hata oluştu:"
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Başka bir hizmetten içe aktarmayı denemek için, yukarıdaki menüden birini "
+"seçin."
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Veri İçe Aktarımları"
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Herhangi bir etkinleştirilmiş veri içe aktarma eklentiniz yok.\n"
+"\n"
+"Uygulamadan İçe Aktar işlevselliğini kullanmak için, en azından bir veri içe "
+"aktarma eklentiniz etkin olmalı. Eklentiler Tercihler bölümünden "
+"etkinleştirilebilinir."
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Veritabanı dosyası:"
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_İçe Aktar"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Uygulamadan İçe Aktar"
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Ortamı _şuradan içe aktar:"
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "_Kapat"
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Slayt gösterisi"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Geri"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Önceki fotoğrafa git"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Durdur"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Slayt gösterisini durdur"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Sonraki"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Sonraki fotoğrafa git"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Slayt gösterisi ayarlarını değiştir"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Fotoğraf kaynak dosyaları bulunamıyor."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Oynat"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Slayt gösterisine devam et"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Ters Çevriliyor"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Ters Çevirme İşlemi Geri Alınıyor"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "İyileştiriliyor"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "İyileştirme İşlemi Geri Alınıyor"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Yeni Olay Oluşturuluyor"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Olay Kaldırılıyor"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Fotoğraflar Yeni Olaya Taşınıyor"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Fotoğraflar Önceki Olayla İlişkilendiriliyor"
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr "Birleştiriliyor"
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Ayrılıyor"
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Fotoğraflar çoğaltılıyor"
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Yinelenen fotoğraflar kaldırılıyor"
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "%d fotoğraf, dosya hatası nedeniyle çoğaltılamadı"
+msgstr[1] "%d fotoğraf, dosya hatası nedeniyle çoğaltılamadı"
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Önceki puanlamaya geri dön"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Puanlandırmalar artırılıyor"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Puanlandırmalar düşürülüyor"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "RAW geliştiricisi ayarlanıyor"
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Önceki RAW geliştirici onarılıyor"
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Geliştirici Ayarla"
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Özgün fotoğraf ayarlanamadı."
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Tarih ve Saat Ayarlanıyor"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Tarih ve Saat Ayarlama İşlemi Geri Alınıyor"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Özgün fotoğraf(lar) ayarlanamadı."
+msgstr[1] "Özgün fotoğraf(lar) ayarlanamadı."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Saat Ayarlama Hatası"
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Zaman ayarlamaları sonraki fotoğraf dosyası(ları) üzerine geri alınamaz."
+msgstr[1] ""
+"Zaman ayarlamaları sonraki fotoğraf dosyası(ları) üzerine geri alınamaz."
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Etiket Oluştur"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Etiketi Taşı \"%s\""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Fotoğrafları Çöpe Taşı"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Çöpteki Fotoğrafları Geri Getir"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Fotoğrafları Shotwell çöp kutusuna taşı"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Shotwell kitaplığındaki fotoğrafları geri getir"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Fotoğraflar Çöp Kutusuna Taşınıyor"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Fotoğraflar Çöp Kutusundan Geri Getiriliyor"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Şeçili uygunsuz olarak fotoğrafları bildir"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Seçili fotoğrafları uygunsuz olarak bildirme"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Bildir"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Bildirme"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Düşük (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Orta (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Yüksek (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "En Yüksek (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Resim/Video Yok"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Hiç Resim/Video bulunamadı"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Fotoğraflar, bu dizinden dışa aktarılamadı."
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "İzleme güncellemeleri işlenemedi: %s"
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Sayfanın tamamını doldur"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "Sayfa başına 2 resim"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "Sayfa başına 4 resim"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "Sayfa başına 6 resim"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "Sayfa başına 8 resim"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "Sayfa başına 16 resim"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "Sayfa başına 32 resim"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "inç"
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr "Cüzdan (2 x 3 inç)"
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr "Not kartı (3 x 5 inç)"
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 inç"
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 inç"
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 inç"
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 inç"
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 inç"
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Metrik Cüzdan (9 x 13 cm)"
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr "Kartpostal (10 x 15 cm)"
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Görüntü Ayarları"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Yazdırılıyor..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Fotoğraf yazdırılamıyor:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Fotoğraf veri tabanı açılmadı/oluşturulamadı %s: hata kodu %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Fotoğraf veritabanı dosyasına yazılamıyor:\n"
+" %s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Veritabanı dosyasına erişirken hata:\n"
+" %s\n"
+"\n"
+"Hata şuydu: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Videoları Dışa Aktar"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Nautilus Send-To başlatılamadı: %s"
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Gönder"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Artalan dışa aktarılamadı %s: %s"
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Masaüstü slayt gösterisi hazırlanamadı: %s"
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "İşaretli"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Çöp"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Çöp boş"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Sil"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Fotoğraflar Siliniyor"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Eksik Dosyalar"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Siliniyor..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Son İçe Aktarılanlar"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "Dizinden İçe _Aktar..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Fotoğrafları diskten kitaplığa aktar"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "_Uygulamadan İçe Aktar"
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "_Olayları Sırala"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Çö_p Kutusunu Boşalt"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Çöp kutusundaki tüm fotoğrafları sil"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Resmin Etkinliğine Bak"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "_Bul"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Arama kriterlerine göre fotoğraf ve videoları bulun"
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Dosya"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Düzenle"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "_Fotoğraf"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Fotoğraflar"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Ola_ylar"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "E_tiketler"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "_Yardım"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Temel Bilgiler"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Seçili öğe için temel bilgileri görüntüle"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "A_yrıntılı Bilgiler"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Seçili öğe için ayrıntılı bilgileri görüntüle"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "_Arama Çubuğu"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Arama çubuğunu göster"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Artan"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Fotoğrafları artan düzene göre sırala"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "A_zalan"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Fotoğrafarı azalan düzene göre sırala"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Dizinden İçe Aktar"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Çöp Kutusunu Boşalt"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Çöp Kutusu Boşaltılıyor..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr ""
+"Shotwell, fotoğrafları içe aktarmak için ev dizinini kullanacak şekilde "
+"yapılandırıldı .\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Kitaplık Konumu"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Fotoğraflar, bu dizinden içe aktarılamadı."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Kütüphane güncelleniyor..."
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Fotoğraflar otomatik olarak içe aktarmaya hazırlanıyor..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Fotoğraflar otomatik olarak içe aktarılıyor..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Meta dosyaları yazılıyor..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Kütüphane"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "İçe aktarılıyor..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "İçe Aktarmayı _Durdur"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Fotoğrafları içe aktarmayı durdur"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "İçe Aktarmaya Hazırlanıyor..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "İçe Aktarıldı %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr "_Kaydet"
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Fotoğrafı kaydet"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Farklı _Kaydet..."
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Fotoğrafı farklı bir adla kaydet"
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Bigisayarınıza bağlı bir yazıcı ile fotoğrafı bastırın"
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s bulunamadı."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s bir dosya değil."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s şu dosya biçimini desteklemiyor:\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr "Bir Kopya _Kaydet"
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "%s dosyasındaki değişiklikler kaybedilsin mi?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr "_Kaydetmeden Kapat"
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "%s dosyasına kaydedilirken hata: %s"
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Farklı Kaydet"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "İzlenemiyor %s: Bir dizin değil (%s)"
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Fotoğraf Yöneticisi"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Fotoğraf Görüntüleyici"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "_Sağa Çevir"
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Çevir"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Sağa Çevir"
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Fotoğrafları sağa döndür (Sola döndürmek için Ctrl'ye basın)"
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "S_ola Çevir"
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Sola Çevir"
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Fotoğrafları sola çevir"
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Ya_tay Çevir"
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Yatay Çevir"
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Di_key Çevir"
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Dikey Çevir"
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr "_İyileştir"
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr "İyileştir"
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Fotoğraf görünüşünü otomatik olarak iyileştir"
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Kırp"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Kırp"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Fotoğrafın boyutunu kırp"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Düzleştir"
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr "Düzleştir"
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Fotoğrafı düzleştir"
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Kırmızı-göz"
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Kırmızı-göz"
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "Fotoğraftaki kırmızı-göz etkilerini azalt veya kaldır"
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr "_Ayarla"
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr "Ayarla"
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Fotoğrafın rengini ve tonunu ayarla"
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Özgün Haline Dö_ndür"
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Özgün Haline Döndür"
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Harici Değ_işiklikleri Geri Al"
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Esas fotoğrafa döndür"
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "_Masaüstü Arkapılan olarak ayarla"
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Seçili görüntüyü yeni masaüstü artalanı olarak ayarla"
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "_Masaüstü Slayt gösterisi olarak ayarla..."
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Geri Al"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Geri Al"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr "_Yinele"
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr "Yinele"
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Olayı Yeniden _Adlandır..."
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Olay İçin _Anahtar Fotoğraf Oluştur"
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Olay İçin Anahtar Fotoğraf Oluştur"
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "_Yeni Olay"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Yeni Olay"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Fotoğrafları Taşı"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Fotoğrafları bir olaya taşı"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "Olayları _Birleştir"
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr "Birleştir"
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Olayları tek bir olay içinde birleştir"
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Derecelendirmeyi Ayarla"
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Derecelendirmeyi Ayarla"
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Fotoğrafınızın derecelendirmesini değiştirin"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr "_Derecelendirmeyi arttır"
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Derecelendirmeyi Arttır"
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr "_Derecelendirmeyi Azalt"
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Derecelendirmeyi Azalt"
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Derecesiz"
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr "Değerlenmemiş"
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Derecesiz Oran"
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Derecelendirilmemiş olarak ayarla"
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Derecelendirilmeyi kaldır"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr "_Reddedilmiş"
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr "Reddedilmiş"
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Reddedilmiş Oran"
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Reddedilen olarak ayarla"
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Reddedilmiş derecelendirmeyi ayarla"
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "_Sadece Reddedilmiş"
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Sadece Reddedilmiş"
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Sadece reddedilen fotoğraf"
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Tüm + _Reddedilen"
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Reddedilen dahil olmak üzere, tüm fotoğrafları göster"
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr "_Tüm Fotoğraflar"
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Tüm fotoğrafları göster"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Değerlemeler"
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Ekran ve fotoğrafı derecelendir"
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Filtreli Fotoğraflar"
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Filtreli Fotoğraflar"
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Fotoğrafları sınırlı sayıda filtreye dayalı görüntüle"
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Kopya Oluştur"
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Kopya Oluştur"
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Fotoğrafın bir kopyasını oluştur"
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Dışa Aktar..."
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr "_Baskı..."
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "Ya_yımla..."
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Yayımla"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Çeşitli web sitelerinde yayımla"
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Başlığı _Düzenle..."
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Yorumu Düzenle"
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "_Tarih ve Zamanı Ayarla..."
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Tarih ve Zamanı Ayarla"
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "_Etiket Ekle..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Etiketler Ekle..."
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Etiket Ekle"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Tercihler"
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Harici Düzenleyici ile Aç"
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "RA_W Düzenleyicisi İle Aç"
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr "Gön _der..."
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "e_ Gönder..."
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr "_Bul..."
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Bul"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Metin yazarak adında veya etiketlerinde görünen bi resmi bul"
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Bayrak"
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr "İşareti _Kaldır"
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Düzenleyici çalıştırılamadı: %s"
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Etiket Ekle \"%s\""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Etiketler Ekle \"%s\" ve \"%s\""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Etiketi _Sil \"%s\""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Etiketi Sil \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Etiketi Sil"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr "_Yeni"
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "\"%s\" Etiketini Yeniden _Adlandır..."
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "\"%s\" Etiketini \"%s\" Olarak Yeniden Adlandır"
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr "_Yeniden Adlandır..."
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "Etiketleri Düzenl_e..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Etiketleri Düzenle"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Fotoğrafı \"%s\" olarak etiketle"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Fotoğrafları \"%s\" olarak etiketle"
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Seçili fotoğrafı \"%s\" olarak etiketle"
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Seçili fotoğrafları \"%s\" olarak etiketle"
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "\"%s\" Etiketini _Fotoğraftan Kaldır"
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "\"%s\" Etiketini _Fotoğraflardan Kaldır"
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "\"%s\" Etiketini Fotoğraftan Kaldır"
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "\"%s\" Etiketini Fotoğraflardan Kaldır"
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "Etiket \"%s\" olarak adlandırılamadı, çünkü etiket zaten mevcut."
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Aramayı \"% s \" olarak yeniden adlandırma başarısız çünkü bu isimle bir "
+"arama zaten var, "
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Kayıtlı Arama"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Aramayı Sil"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "_Düzenle..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Ye_niden Adlandır..."
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "\"%s\" i \"%s\" Olarak Yeniden Adlandır"
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "\"%s\" Aramasını Sil"
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "%s i Değerle"
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Değerlemeyi %s e ayarla"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Değerleme %s e ayarlanıyor"
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "%s i Göster"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Değerlemesi yalnızca %s olan fotoğrafları göster"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s veya Daha İyisi "
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "%s veya Daha İyisini Göster"
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Değerlemesi yalnızca %s veya daha iyisi olan fotoğrafları göster"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Seçili fotoğrafları çöp kutusundan geri getir"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Seçili fotoğrafları kitaplıktan çıkar"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr "_Geri Getir"
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Seçili fotoğrafları kitaplığa geri taşı"
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Dosya Yö_neticisinde Göster "
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Seçili fotoğrafın ait olduğu dizini dosya yöneticisinde aç"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Dosya yöneticisinde açılamıyor: %s"
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Kitaplıktan K_aldır"
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "_Çöpe Taşı"
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr "_Tümünü Seç"
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Tüm öğeleri seç"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %d %b, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Açı:"
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr "_Sıfırla"
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr "Geçerli fotoğraf boyutlarına dön"
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Bu fotoğraf için kırpmayı ayarla"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "Kırpma dikdörtgenini yatay ve düşey eksenler etrafında döndür"
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Sınırlandırılmamış"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Kare"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Ekran"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Özgün Boyut"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Letter (8.5 x 11 in.)"
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Tabloid (11 x 17 in.)"
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 mm)"
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr "Kırmızı-göz aracını kapat"
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Seçili bölgedeki kırmızı-göz etkilerini kaldır"
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr "Renk doygunluğu:"
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr "Renk tonu:"
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr "Sıcaklık:"
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr "Gölgeler:"
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr "Renkleri Sıfırla"
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr "Tüm renk ayarlamalarını özgün haline getir"
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr "Sıcaklık"
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr "Renk tonu"
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr "Renk doygunluğu"
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Pozlandırma"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr "Gölgeler"
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr "Karşıtlık Genişlemesi"
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Araç Çubuğunu Sabitle"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Araç çubuğunu açık olarak sabitle"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Tam ekrandan çık"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "_Tam Ekrandan Çık"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Çık"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Hakkında"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Tam e_kran"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_İçindekiler"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Sıkça Sorulan Sorular"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Bir Sorun Bildirin..."
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Shotwell kütüphanesine erişim sırasında kritik bir hata meydana geldi. "
+"Shotwell işlemi sürdüremiyor.\n"
+"\n"
+"%s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Yorba web sitesini ziyaret edin"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr ""
+"Yiğit Ateş <yigitates52@gmail.com>\n"
+"Hüseyin Demirtaş <h.demirtas.l10n@gmail.com>\n"
+"Ferhat Tunçtan <ferhattnctn19@yahoo.com.tr>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Yardım görüntülenemiyor: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Hata veritabanına yönlendirme başarısız: %s"
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "SSS gösterilemiyor: %s"
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "başlıksız"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Özgün boyut"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Genişlik veya yükseklik"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Genişlik"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Yükseklik"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Önizleme boyutunu ayarla"
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Önizleme oranını artır"
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Önizleme oranını azalt"
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "_Fotoğrafları Sırala"
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Videoyu Oynat"
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Seçili videolrı varsayılan video oynatıcıda aç"
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Yorumlar"
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Tüm fotoğrafların etiketlerini görüntüle "
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "_Başlığa Göre"
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Fotoğrafları başlıklarına göre sırala"
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "Çekim _Tarihine Göre"
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Fotoğrafları çekim tarihine göre sırala"
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "Puanlamaya göre"
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Fotoğrafları puanlmaya göre sırala"
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr "Shotwell seçili videoyu oynatamadı: %s"
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d Photoğraf/Video"
+msgstr[1] "%d Photoğraf/Video"
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Olaylar yok"
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Hiçbir olay bulunamadı"
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Olaylar"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Tarih Belirlenmemiş"
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Olay yok"
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Önbellek dizini oluşturulamıyor %s: %s"
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Veri klasörü oluşturulamadı %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Resimler"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Geçici klasör oluşturulamadı %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Altklasör oluşturulamadı %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Hiçbiri)"
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Hiçbiri"
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Rastgele"
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Slayt Gösterisi Geçişleri"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "%s: %s için geçici bir dosya oluşturulamıyor"
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Dışa Aktarılıyor"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "%s dosyası zaten mevcut. Yer değiştirilsin mi?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr "_Atla"
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Değiştir"
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "_Tümünü Değiştir"
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Dışa Aktar"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Fotoğraflar"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Videolar"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW Fotoğraflar"
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Raw fotoğraflar"
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Kullanıcı arayüz dosyası yükleme hatası %s: %s"
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Cins"
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Yayımlanıyor"
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Seçili fotoğraflar/videolar başarıyla yayımlandı."
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Seçili videolar başarıyla yayımlandı."
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Seçili fotoğraflar başarıyla yayımlandı."
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Seçili video başarıyla yayımlandı."
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Seçili fotoğraf başarıyla yayımlandı."
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Hesap bilgileri alınıyor..."
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Oturum açılıyor..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Fotoğrafları Yayımla"
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Fotoğrafları ş_urada yayımla:"
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Videoları Yayımla"
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Videoları _şuraya yayımla"
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Resimler ve Videoları Yayımla"
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Resimleri ve videoları _şuraya yayımla"
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Yayımlanamıyor"
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell seçili öğeleri yayımlayamaz çünkü uyumlu bir yayımlama eklentiniz "
+"etkinleştirilmemiş. Bunu düzeltmek için, <b> Düzenle %s Tercihler </b> yi "
+"seçin ve <b> Eklentiler</b> sekmesinden bir veya daha fazla yayımlama "
+"eklentisini etkinleştirin."
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Yükleme için hazırlanıyor"
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "%d in %d si yükleniyor"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "%s e yayımlamaya devam edilemiyor çünkü bir hata oluştu:"
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Başka bir serviste yayımlamayı denemek için yukarıdaki menüden bir tane "
+"seçin."
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Yeni _Etiket..."
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Yayımlama için gerekli geçici bir dosya kullanılamıyor"
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Şu anda YouTube'da oturum açmış bulunmuyorsunuz.\n"
+"\n"
+"Devam etmek için YouTube'la birlikte kullanabilecek şekilde ayarlanmış bir "
+"Google hesabınız olmalı. Tarayıcınızı kullanıp en az bir kez YouTube "
+"sitesinde oturum açarak pek çok hesap kurabilirsiniz. "
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Yayımlama için gerekli bir dosya kullanılamıyor. YouTube'da yayımlama devam "
+"edemiyor."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "YouTube'a %s olarak oturum açtınız."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Videolar '%s' içinde görülecek"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Genel listelenmiş"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Genel listelenmemiş"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Özel"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Çekirdek Yayımlama Hizmetleri"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Şu anda Flickr'da oturum açmış bulunmuyorsunuz.\n"
+"\n"
+"Flickr'a giriş yapmak için web tarayıcınızda Oturum Aç'a tıklayın. Flickr "
+"hesabınıza Shotwell Connect'i bağlamak için yetki vermeniz gerekiyor."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Bu Shotwell oturumu süresince zaten Flickr'da oturum açıp kapattınız.\n"
+"Flickr'da yayımlamaya devam etmek için, Shotwell'i kapatın ve yeniden "
+"başlatın, daha sonra tekrar yayımlamayı deneyin."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Giriş için hazırlanıyor..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Yayımlama için gerekli bir dosya kullanılamıyor. Flickr'da yayımlama devam "
+"edemiyor."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Yetkilendirme doğrulanıyor..."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Flickr'da %s olarak oturum açtınız.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"Ücretsiz Flickr hesabınızla aylık olarak karşıya yükleyebileceğiniz veri "
+"miktarı sınırlıdır.\n"
+"Bu ay, %d megabyte karşıya yükleme kotanız kaldı."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "Flickr Pro hesabınız, sınırsız karşıya yükleme yapmanıza olanak tanır."
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Fotoğrafları _görebilecekler:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Videolar şunlara _görülebilir:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Fotoğraflar ve videolar _şunlara görülebilir:"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Herkes"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Yalnızca aile & arkadaşlar"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Aileye özel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Arkadaşlara özel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Yalnızca ben"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+#, fuzzy
+msgid "500 x 375 pixels"
+msgstr ""
+"500 x 375 piksel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+#, fuzzy
+msgid "1024 x 768 pixels"
+msgstr ""
+"1024 x 768 piksel"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 benek"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 benek"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "%s albümü oluşturuluyor..."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Piwigo fotoğraf kitaplığınızın URL'sinin yanı sıra bu kütüphane için Piwigo "
+"hesabınızla ilişkili kullanıcı adınızı ve şifrenizi giriniz."
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell Piwigo fotoğraf kütüphanenizle bağlantı kuramıyor. Lüften "
+"girdiğiniz URL'yi kontrol edin"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr "Kullanıcı adı ve/veya şifre geçersiz. Lütfen tekrar deneyin"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr "Geçersiz URL"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr "Geçersiz Kullanıcı Adı veya Şifre"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr "Shotwell Bağlantısı"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Yöneticiler, Aile, Arkadaşlar, Bağlantılar"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Yöneticiler, Aile, Arkadaşlar"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Yöneticiler, Aile"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Yöneticiler"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Şu anda Picasa Web Albümlerinde oturum açmış bulunmuyorsunuz.\n"
+"\n"
+"Picasa Web Albümleri'ne giriş yapmak için web tarayıcınızda Oturum Aç'a "
+"tıklayın. Picasa Web Albümlerinize Shotwell Connect'i bağlamak için yetki "
+"vermeniz gerekiyor."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Yayımlama için gerekli bir dosya kullanılamıyor. Picasa'ya yayımlama devam "
+"edemiyor."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Albüm oluşturuluyor..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Picasa Web Albümleri'nde %s olarak oturum açtınız."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Videolar şurada görünecektir:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Fotoğrafların görüneceği yer:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Küçük (640 x 480 benek)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Orta (1024 x 768 benek)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Önerilen (1600 x 1200 benek)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 piksel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Facebook'ta oturum açmadınız.\n"
+"\n"
+"Henüz bir Facebook hesabınız yoksa, oturum açma sürecinde bir tane "
+"oluşturabilirsiniz. Oturum açma sırasında, Shotwell Bağlantısı "
+"fotoğraflarınızı karşıya yüklemek ve beslemelerinizde yayımlamak için izin "
+"isteyebilir. Shotwell Bağlantısı'nın işlevini yerine getirmesi için bu "
+"izinler gereklidir."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Bu Shotwell oturumu süresince zaten Facebook'ta oturum açıp kapattınız.\n"
+"Facebook'ta yayımlamaya devam etmek için, Shotwell'i kapatın ve yeniden "
+"başlatın, daha sonra tekrar yayımlamayı deneyin."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Standart (720 piksel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Geniş (2048 piksel)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Facebook bağlantısı sınanıyor..."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Yayımlama için gerekli bir dosya kullanılamıyor. Facebook'ta yayımlama devam "
+"edemiyor."
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Facebook'a %s olarak giriş yaptınız.\n"
+"\n"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Seçilen fotoğrafları nerede yayımlamak istersiniz?"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr "Yükleme _boyutu:"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Arkadaşlar"
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Ufala"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Saat"
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Çekirdek Slayt Gösterisi Geçişleri"
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Kaydır"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Soldur"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Çekirdek Veri İçe Aktarma Hizmetleri"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"F-Spot kütüphanesi içe aktarma hizmetine hoşgeldiniz.\n"
+"\n"
+"Lüften içe aktarım için ya Shotwell'in bulduğu mevcut kütüphanelerden birini "
+"veya alternatif bir F-Spot veritabanı dosyasını seçin."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"F-Spot kütüphanesi içe aktarma hizmetine hoşgeldiniz.\n"
+"\n"
+"Lütfen bir F-Spot veritabanı dosyası seçin."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "İçe aktarma için el ile bir F-Spot veritabanı dosyası seçin:"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Seçilen F-Spot veritabanı dosyası açılamıyor: dosya yok ya da bir F-Spot "
+"veritabanı değil"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Seçilen F-Spot veritabanı dosyası açılamıyor: F-Spot veritabanının bu sürümü "
+"Shotwell tarafından desteklenmiyor"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Seçilen F-Spot veritabanı dosyası okunamıyor: etiket tablosu okurken hata"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Seçilen F-Spot veritabanı dosyası okunamıyor: fotoğraf tablosu okunurken hata"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell F-Spot kitaplığında %d fotoğraf buldu ve şu anda bunları içe "
+"aktarmakta. Yinelemeler otomatik olarak algılanır ve kaldırılır.\n"
+"\n"
+"Bu iletişim kutusunu kapatıp içe aktarma arka planda sürerken Shotwell "
+"kullanmaya başlayabilirsiniz."
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot kütüphanesi: %s"
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "İçe aktarım için hazırlanıyor"
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr "Masaüstü Slayt Gösterisi olarak ayarla"
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr "Masaüstü arka planı slayt gösterisi oluştur"
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr "Her bir fotoğrafı şunun için göster"
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr "zaman dilimi"
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr "Her fotoğrafın masaüstü arka plan üzerinde ne kadar süre gösterildiği"
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Ara"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr "_Arama adı:"
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr "_Eşleşen"
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr "aşağıdakilerden:"
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr "_Standart bir boyut kullan:"
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr "Ö_zel bir boyut kullan:"
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr "Fotoğraf en-boy oranını _eşleştir"
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr "_Otomatik Ölçütlendirme:"
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr "Resim _başlığını yazdır"
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr "Dosya çıktısı _konumu:"
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr "inç başına benek miktarı"
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "etiket"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Shotwell Tercihleri"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "beyaz"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "siyah"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Yeni dosyalar için kütüphane dizinini izle"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Fotoğraf dosyalara etiketler, başlıklar ve diğer _metadata yı yazın"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Göster"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "_Fotoğrafları şunun içine aktar:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "_Arka plan"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "İçe Aktarılıyor"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Dizin yapısı:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Şablon:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Örnek:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "İçe aktarılan dosyaları küçük harfe yeniden adlandırın."
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr "RAW Geliştirici"
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr "Var_sayılan:"
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "H_arici fotoğraf düzenleyici:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Harici _RAW düzenleyici:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Harici Düzenleyiciler"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Eklentiler"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr "_Gecikme:"
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr "_Geçiş etkisi:"
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr "Geçiş G_ecikmesi:"
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr "Başlığı g_öster"
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "saniye"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr "_Oturum Aç"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr "_Varolan bir albümde yayımla:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr "Şu ada sahip _yeni bir albüm oluştur:"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "_Çıkış"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Yayımla"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr "Fotoğraf _boyutu:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr "_Varolan bir albüm:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "_Yeni bir albüm adlandırıldı"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr "Albümü herkese açık galeride l_istele"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr "Fotoğraf _boyutu varsayılanı:"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Şifre"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Giriş"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr ""
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr "Telif Hakkı 2012 BJA Electronics"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 piksel"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+"'% s' bir OAuth kimlik doğrulama isteği için geçerli bir yanıt değildir"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): başlatılamıyor; bu yayımcı yeniden başlatılabilir "
+"değildir."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Lütfen Tumblr hesabınızla ilişkili kullanıcı adınızı ve şifrenizi giriniz."
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Kullanıcı arayüzü yüklenemedi: %s"
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"%s olarak Tumblr'a giriş yaptınız.\n"
+"\n"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Telif Hakkı 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Yandex.Fotki web sitesini ziyaret edin"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Şu anda Yandex.Fotki için oturum açmış değilsiniz."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr "_Eposta adresi"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"(isim) olarak Tumblr'a giriş yaptınız.\n"
+"\n"
+"(bu etiketin bağı yerleşiktir ve kodun içine ayarlıdır, \n"
+"yani burada yapılan değişiklikler gösterilmeyecek)"
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr "Bloglar:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Albümler (ya da yeni bir tane yaz):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "Erişim _türü:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Yorumları devre _dışı bırak"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Özgün fotoğrafı indirmeyi yasakla"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..9cae3a9
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,4912 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# verayin <vera@yorba.org>, 2011.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011-2013.
+# Yuri Chornoivan <yurchor@ukr.net>, 2013, 2014.
+# lsbeeler <lucas@yorba.org>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-16 09:35+0000\n"
+"PO-Revision-Date: 2014-02-02 10:48+0200\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
+"language/uk/)\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "Тимчасовий файл, потрібний для оприлюднення, недоступний"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"Ви вже входили і виходили зі служб Google протягом цього сеансу роботи у "
+"Shotwell.\n"
+"\n"
+"Щоб продовжити оприлюднення фотографій на службах Google, завершіть роботу "
+"Shotwell і запустіть програму знову, а потім повторіть спробу оприлюднення."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "Відвідати веб-сайт Yorba"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr "Юрій Чорноіван <yurchor@ukr.net>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "© Yorba Foundation, 2009–2013"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"Ласкаво просимо до служби імпортування бібліотеки F-Spot.\n"
+"\n"
+"Будь ласка, виберіть бібліотеку для імпортування. Можна скористатися однією "
+"з вже створених бібліотек, виявлених Shotwell, або вибрати інший файл бази "
+"даних F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"Ласкаво просимо до служби імпортування бібліотеки F-Spot.\n"
+"\n"
+"Будь ласка, виберіть файл бази даних F-Spot."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "Виберіть файл бази даних F-Spot для імпортування вручну:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+"Не вдалося виконати читання вибраного файла бази даних F-Spot: файла не "
+"існує або вказаний файл не є файлом бази даних F-Spot"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"Не вдалося виконати читання вибраного файла бази даних F-Spot: підтримки "
+"цієї версії бази даних F-Spot у Shotwell не передбачено"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+"Не вдалося виконати читання вибраного файла бази даних F-Spot: помилка під "
+"час читання таблиці міток"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+"Не вдалося виконати читання вибраного файла бази даних F-Spot: помилка під "
+"час читання таблиці фотографій"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"У бібліотеці F-Spot було виявлено %d фотографій. Зараз виконується "
+"імпортування цих фотографій. Під час імпортування буде автоматично виявлено "
+"і вилучено дублікати.\n"
+"\n"
+"Ви можете закрити це діалогове вікно і продовжити користування Shotwell. "
+"Імпортування відбуватиметься у фоновому режимі."
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "Бібліотека F-Spot: %s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "Готуємося до імпортування"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "Служби імпортування основних даних"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "© BJA Electronics, 2012"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 ⨯ 375 пікселів"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 ⨯ 768 пікселів"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 ⨯ 853 пікселів"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "«%s» не є коректною відповіддю на запит щодо розпізнавання OAuth"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+"TumblrPublisher: start( ): помилка запуску; засіб оприлюднення не можна "
+"запускати повторно."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+"Вкажіть ім’я користувача і пароль, пов’язані з вашим обліковим записом "
+"Tumblr."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+"Некоректні значення імені користувача і/або пароля. Будь ласка, повторіть "
+"спробу."
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "Некоректне ім’я користувача або пароль"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "Не вдалося завантажити інтерфейс: %s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"Ви увійшли до системи Tumblr від імені %s.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "© Evgeniy Polyakov <zbr@ioremap.net>, 2010+"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Відвідати сайт Yandex.Fotki"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Ви ще не увійшли до системи Yandex.Fotki."
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+#| msgid "Core Publishing Services"
+msgid "Shotwell Extra Publishing Services"
+msgstr "Додаткові служби оприлюднення Shotwell"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "мітка"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "_Адреса ел. пошти"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "_Пароль"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "Увійти"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ви увійшли до системи Tumblr від імені (name).\n"
+"\n"
+"(цей рядок мітки заповнюватиметься і встановлюватиметься у коді, \n"
+"отже внесені тут зміни показано не буде)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "Блоги:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "_Розмір фотографії:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "Ви_йти з системи"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "_Оприлюднити"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "_Альбоми (або створити новий):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "_Тип доступу:"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "Вимкнути _коментування"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "За_боронити звантаження початкових версій фотографій"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+#| msgid "Publish"
+msgid "Public"
+msgstr "Відкритий доступ"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "Друзі"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Конфіденційне"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "З’єднувач Shotwell"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"Ви ще не увійшли до системи Facebook.\n"
+"\n"
+"Якщо у вас ще немає облікового запису Facebook, ви можете створити таких "
+"запис під час виконання процедури з входу до системи. Під час входу до "
+"системи Shotwell може попросити у вас дозволу на вивантаження фотографій та "
+"їх оприлюднення за допомогою подачі. Ці дозволи потрібні для нормальної "
+"роботи Shotwell."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ви вже входили і виходили з системи Facebook протягом цього сеансу роботи у "
+"Shotwell.\n"
+"Щоб продовжити оприлюднення фотографій на Facebook, завершіть роботу "
+"Shotwell і запустіть програму знову, а потім повторіть спробу оприлюднення."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Стандартний (720 пікселів)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Велика (2048 пікселів)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "Перевірка з’єднання з Facebook…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "Створення альбому…"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+"Не виявлено потрібного для оприлюднення файла. Продовження дій з "
+"оприлюднення на Facebook неможливе."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"Ви увійшли до облікового запису %s на Facebook.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "Де ви бажаєте оприлюднити позначені фотографії?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "_Розміри вивантаженого:"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "Лише я"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "Будь-хто"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"Ви не увійшли до служби Flickr.\n"
+"\n"
+"Натисніть кнопку входу (Login) у вашій програмі для перегляду інтернету, щоб "
+"увійти до служби Flickr. Вам слід уповноважити інструмент Shotwell Connect, "
+"щоб встановити зв’язок програми з вашим обліковим записом Flickr."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"Ви вже входили і виходили з системи Flickr протягом цього сеансу роботи у "
+"Shotwell.\n"
+"Щоб продовжити оприлюднення фотографій на Flickr, завершіть роботу Shotwell "
+"і запустіть програму знову, а потім повторіть спробу оприлюднення."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "Приготування до входу…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+"Не виявлено потрібного для оприлюднення файла. Продовження дій з "
+"оприлюднення на Flickr неможливе."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "Розпізнавання…"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"Ви увійшли до облікового запису %s на Flickr.\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"У вашому безкоштовному обліковому записі Flickr передбачено обмеження на "
+"об’єм даних, які ви можете вивантажувати протягом місяця.\n"
+"Цього місяця від вашої квоти залишилося %d мегабайтів."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+"За допомогою вашого облікового запису Flickr Pro ви зможете вивантажувати "
+"довільний об’єм даних."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "Фотографії зможе _бачити:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "Відео зможуть _бачити:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "Фотографії і відео зможуть _бачити:"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "Лише друзі і родичі"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "Лише родичі"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "Лише друзі"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 пікселів"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 пікселів"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "Початковий розмір"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"Ви не увійшли до служби вебальбомів Picasa\n"
+"\n"
+"Натисніть кнопку входу (Login) у вашій програмі для перегляду інтернету, щоб "
+"увійти до служби вебальбомів Picasa. Вам слід уповноважити інструмент "
+"Shotwell Connect, щоб встановити зв’язок програми з вашим обліковим записом "
+"вебальбомів Picasa."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+"Не виявлено потрібного для оприлюднення файла. Продовження дій з "
+"оприлюднення на Picasa неможливе."
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "Ви увійшли до облікового запису %s веб-альбомів Picasa."
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Відео з’являться у:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "Фотографії з’являться у:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Малі (640 ⨯ 480 пікселів)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Середні (1024 ⨯ 768 пікселів)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Рекомендовані (1600 ⨯ 1200 пікселів)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048⨯1536 пікселів)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "Початковий розмір"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "Створюємо альбом %s…"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+"Під час спроби оприлюднення даних на Piwigo сталася помилка. Будь ласка, "
+"повторіть спробу."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"Вкажіть адресу вашої бібліотеки фотографій Piwigo, а також ім’я користувача "
+"і пароль, пов’язані з вашим обліковим записом Piwigo, до якого прив’язано "
+"бібліотеку."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+"Shotwell не вдалося встановити зв’язок з вашою бібліотекою фотографій "
+"Piwigo. Будь ласка, перевірте, чи правильно вказано адресу."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "Некоректна адреса"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "Адміністратори, родичі, друзі, контакти"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "Адміністратори, родичі, друзі"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "Адміністратори, родичі"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "Адміністратори"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Ви ще не увійшли до системи веб-альбомів YouTube.\n"
+"\n"
+"Щоб продовжити процес вивантаження вам слід мати зареєстрований і "
+"налаштований на використання YouTube обліковий запис Google. Для "
+"налаштування більшості облікових записів достатньо скористатися ними "
+"принаймні один раз для входу до системи YouTube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+"Не виявлено потрібного для оприлюднення файла. Продовження дій з "
+"оприлюднення на Youtube неможливе."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Ви увійшли до облікового запису %s на YouTube."
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Відео з’являться у «%s»"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "Відкрите у списку"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "Відкрите без показу у списку"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (текст залежить від імені користувача fb username і змінюється у програмі "
+"— \n"
+"все, введене у цьому полі, не буде показано)"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "Оприлюднити у іс_нуючому альбомі:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "Створити _альбом з назвою:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "Відео і нові фотоальбоми зможуть _бачити:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+"Ви_лучити дані щодо місця, фотоапарата та інші ідентифікаційні дані перед "
+"вивантаженням"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+"Введіть число підтвердження, яке було показано після входу до служби Flickr "
+"за допомогою вашої програми для перегляду інтернету."
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "_Число розпізнавання:"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "П_родовжити"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"Ви увійшли до системи Flickr від імені (name).\n"
+"\n"
+"(цей рядок мітки заповнюватиметься і встановлюватиметься у коді, \n"
+"отже внесені тут зміни показано не буде)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr "мітка _видимості (заповнено у коді)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"«ви увійшли як $name»\n"
+"(заповнено у коді програми)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "_Існуючому альбомі:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "_Новому альбомі з назвою:"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "По_казувати альбом у відкритій галереї"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype буде показано у\n"
+"(заповнюється у коді)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "Шаблон _розміру фотографій:"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "_Адреса вашої бібліотеки фотографій Piwigo"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "_Користувач"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "_Запам’ятати пароль"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "_Вже створеній категорії:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "Фотографії зможуть _бачити:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "Розмір фотографії:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "у категорії:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "Коментар до альбому:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+"_Якщо вказано заголовок і не вказано коментаря, використовувати заголовок як "
+"коментар"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "_Не вивантажувати мітки"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "Вийти"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "Оприлюднити"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "Основні служби оприлюднення"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "_Конфіденційність відео:"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "Жалюзі"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "Шахи"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "Коло"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "Кола"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "Годинник"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Розпад"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Згасання"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Слайд"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "Квадрати"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "Смуги"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "Основні переходи під час показу слайдів"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "© Maxim Kartashev, 2010, © Yorba Foundation, 2011–2013"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "Не вдалося створити каталог кешування %s: %s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Не вдалося створити каталог даних %s: %s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Фотографії"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Не вдалося створити тимчасовий каталог %s: %s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Не вдалося створити підкаталог даних %s: %s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Зафіксувати панель"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Зафіксувати панель відкритою"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Вийти з повноекранного режиму"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Вийти з _повноекранного режиму"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "Ви_йти"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Про програму"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "На весь _екран"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Вміст"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "По_ширені питання"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "_Повідомити про проблему…"
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Скасувати"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Під час спроби отримання доступу до бібліотеки Shotwell сталася помилка. "
+"Продовження роботи Shotwell є неможливою.\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Не вдалося показати довідку: %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "Не вдалося перейти до сторінки бази даних вад: %s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "Не вдалося показати сторінку поширених питань: %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "Успіх"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "Помилка роботи з файлами"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Не вдалося декодувати файл"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Помилка бази даних"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Імпортування перервано користувачем"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Не є файлом"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Запис файла вже існує у базі даних"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Формат файла не підтримується"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Не є файлом зображення"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "Помилка роботи з диском"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Диск переповнено"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Помилка роботи з фотоапаратом"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Помилка запису до файла"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "Пошкоджений файл зображення"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Спроба імпортування зазнала невдачі (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "По_каз слайдів"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "Почати показ слайдів"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Експортувати фотографію/відео"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Експортувати фотографії/відео"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "Експортувати фотографію"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Експорт фотографій"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Обертання"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Скасування обертання"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Віддзеркалення горизонтально"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Скасування горизонтального віддзеркалення"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Віддзеркалити вертикально"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Скасування вертикального віддзеркалення"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "Скасування внесених змін"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Скасування скасування внесених змін"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Покращення"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Скасування покращення"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "Застосовуємо перетворення кольорів"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "Скасовуємо перетворення кольорів"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Створення запису події"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Вилучення запису події"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Пересування фотографій до нової події"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "Прив’язка фотографій до попередньої події"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "Об’єднання"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "Скасування об’єднання"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "Дублювання фотографій"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "Вилучення дублікатів фотографій"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "Не вдалося створити дублікати %d фотографії через помилки у файлах"
+msgstr[1] "Не вдалося створити дублікати %d фотографій через помилки у файлах"
+msgstr[2] "Не вдалося створити дублікат %d фотографії через помилку у файлі"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "Відновлення попередньої оцінки"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Збільшення оцінок"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Зменшення оцінок"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "Встановлення обробника RAW"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "Відновлення попереднього значення обробника RAW"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "Вказати проявника"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "Не вдалося скоригувати початкову фотографію."
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Коригування дати і часу"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Скасування коригування дати і часу"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Фотографії з наведеними нижче назвами не вдалося скоригувати."
+msgstr[1] "Фотографії з наведеними нижче назвами не вдалося скоригувати."
+msgstr[2] "Не вдалося скоригувати одну фотографію."
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "Помилка коригування часу"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+"Для файлів фотографій з наведеного нижче списку не вдалося скасувати "
+"коригування часу."
+msgstr[1] ""
+"Для файлів фотографій з наведеного нижче списку не вдалося скасувати "
+"коригування часу."
+msgstr[2] ""
+"Для файла фотографії з наведеною нижче назвою не вдалося скасувати "
+"коригування часу."
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Створити мітку"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "Пересунути мітку «%s»"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Пересунути фотографії до смітника"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Відновити фотографії зі смітника"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Пересунути фотографії до смітника Shotwell"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Відновити фотографії у бібліотеці Shotwell"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Пересування фотографій до смітника"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Відновлення фотографій зі смітника"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Позначити вибрані фотографії"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Зняти позначення з вибраних фотографій"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "Позначаємо фотографії прапорцем"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "Скасовуємо позначення фотографій прапорцем"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "Позначити"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Зняти позначення"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "Не вдалося запустити інструмент надсилання Nautilus: %s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Надіслати"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "Не вдалося експортувати тло до %s: %s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "Не вдалося створити показ слайдів на стільниці: %s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Буде вилучено мітку «%s» з %d фотографії. Продовжувати?"
+msgstr[1] "Буде вилучено мітку «%s» з %d фотографій. Продовжувати?"
+msgstr[2] "Буде вилучено мітку «%s» з %d фотографії. Продовжувати?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "В_илучити"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr ""
+"У результаті виконання дії буде вилучено збережений пошук «%s». Продовжити?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+"Перемикання обробника призведе до скасування всіх змін, які було внесено у "
+"цю фотографію за допомогою Shotwell"
+msgstr[1] ""
+"Перемикання обробника призведе до скасування всіх змін, які було внесено у "
+"ці фотографії за допомогою Shotwell"
+msgstr[2] ""
+"Перемикання обробника призведе до скасування всіх змін, які було внесено у "
+"ці фотографії за допомогою Shotwell"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "П_еремкнути обробник"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Експортування відео"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell не вдалося створити файл для редагування цієї фотографії, оскільки "
+"у вас немає прав доступу на запис до %s."
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Не вдалося експортувати фотографію з наведеною нижче назвою через помилку у "
+"файлі.\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Бажаєте продовжити експортування?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Без змін"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "Поточна"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "_Формат:"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "_Якість:"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "Обмеження _масштабування:"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " _пікселів"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Експорт метаданих"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "Зберегти параметри…"
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "Збереження параметрів"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(і ще %d)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "Імпортувати звіт з результатами"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "Виконано спробу імпортування %d файла."
+msgstr[1] "Виконано спробу імпортування %d файлів."
+msgstr[2] "Виконано спробу імпортування %d файлів."
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "З них успішно імпортовано %d файл."
+msgstr[1] "З них успішно імпортовано %d файли."
+msgstr[2] "З них успішно імпортовано %d файлів."
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "Дублікати фотографій та відео, які не було імпортовано:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "мультимедійні дані з наявним дублікатом"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+"Фотографії та відео, які не було імпортовано через помилки на фотоапараті:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "повідомлення про помилку:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+"Файли, які не було імпортовано через те, що ці файли не файлами фотографій "
+"або відео:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+"Фотографії та відео, які не було імпортовано через те, що дані зберігалися у "
+"форматі, який Shotwell не може обробляти:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+"Фотографії і відео, які не було імпортовано через те, що Shotwell не вдалося "
+"скопіювати їх до бібліотеки програми:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"не вдалося скопіювати %s\n"
+"\tдо %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "Фотографії та відео, які не було імпортовано через пошкодження файлів:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "Фотографії або відео, які не було імпортовано з інших причин:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "Не імпортовано %d дублікат фотографій:\n"
+msgstr[1] "Не імпортовано %d дублікати фотографій:\n"
+msgstr[2] "Не імпортовано %d дублікат фотографії:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "Не імпортовано %d дублікат відео:\n"
+msgstr[1] "Не імпортовано %d дублікати відео:\n"
+msgstr[2] "Не імпортовано %d дублікат відео:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "Не імпортовано %d дублікат фотографій або відео:\n"
+msgstr[1] "Не імпортовано %d дублікати фотографій або відео:\n"
+msgstr[2] "Не імпортовано %d дублікат фотографії або відео:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію через помилки у файлах або апаратні "
+"помилки:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії через помилки у файлах або апаратні "
+"помилки:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію через помилку у файлі або апаратну "
+"помилку:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d відео через помилки у файлах або апаратні "
+"помилки:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d відео через помилки у файлах або апаратні "
+"помилки:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d відео через помилку у файлі або апаратну помилку:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію або відео через помилки у файлах або "
+"апаратні помилки:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії або відео через помилки у файлах або "
+"апаратні помилки:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію або відео через помилку у файлі або "
+"апаратну помилку:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d файл через помилки у файлах або апаратні помилки:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d файли через помилки у файлах або апаратні "
+"помилки:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d файлів через помилки у файлах або апаратні "
+"помилки:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d відео, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d відео, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d відео, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію або відео, оскільки теку бібліотеки "
+"фотографій захищено від запису:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії або відео, оскільки теку бібліотеки "
+"фотографій захищено від запису:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію або відео, оскільки теку бібліотеки "
+"фотографій захищено від запису:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d файл, оскільки теку бібліотеки фотографій захищено "
+"від запису:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d файли, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d файлів, оскільки теку бібліотеки фотографій "
+"захищено від запису:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію через помилки у роботі з фотоапаратом:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії через помилки у роботі з фотоапаратом:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію через помилки у роботі з фотоапаратом:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d відео через помилки у роботі з фотоапаратом:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d відео через помилки у роботі з фотоапаратом:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d відео через помилки у роботі з фотоапаратом:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію або відео через помилки у роботі з "
+"фотоапаратом:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії або відео через помилки у роботі з "
+"фотоапаратом:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографію або відео через помилки у роботі з "
+"фотоапаратом:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d файл через помилки у роботі з фотоапаратом:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d файл через помилки у роботі з фотоапаратом:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d файлів через помилки у роботі з фотоапаратом:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "Не вдалося імпортувати %d фотографію, оскільки її пошкоджено:\n"
+msgstr[1] "Не вдалося імпортувати %d фотографії, оскільки їх пошкоджено:\n"
+msgstr[2] "Не вдалося імпортувати %d фотографій, оскільки їх пошкоджено:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "Не вдалося імпортувати %d відео, оскільки його пошкоджено:\n"
+msgstr[1] "Не вдалося імпортувати %d відео, оскільки їх пошкоджено:\n"
+msgstr[2] "Не вдалося імпортувати %d відео, оскільки їх пошкоджено:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+"Не вдалося імпортувати %d фотографію/відео, оскільки їх пошкоджено:\n"
+msgstr[1] ""
+"Не вдалося імпортувати %d фотографії/відео, оскільки їх пошкоджено:\n"
+msgstr[2] ""
+"Не вдалося імпортувати %d фотографій/відео, оскільки їх пошкоджено:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "Не вдалося імпортувати %d файл, оскільки його пошкоджено:\n"
+msgstr[1] "Не вдалося імпортувати %d файли, оскільки їх пошкоджено:\n"
+msgstr[2] "Не вдалося імпортувати %d файлів, оскільки їх пошкоджено:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "Пропущено %d фотографію у форматі, який не підтримується:\n"
+msgstr[1] "Пропущено %d фотографії у форматі, який не підтримується:\n"
+msgstr[2] "Пропущено %d фотографію у форматі, який не підтримується:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "Пропущено %d звичайний файл (не є файлами зображень).\n"
+msgstr[1] "Пропущено %d звичайних файла (не є файлами зображень).\n"
+msgstr[2] "Пропущено %d звичайний файл.\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "Обробку %d фотографії скасовано користувачем:\n"
+msgstr[1] "Обробку %d фотографій скасовано користувачем:\n"
+msgstr[2] "Обробку %d фотографії скасовано користувачем:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "Обробку %d відео скасовано користувачем:\n"
+msgstr[1] "Обробку %d відео скасовано користувачем:\n"
+msgstr[2] "Обробку %d відео скасовано користувачем:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "Обробку %d фотографії або відео скасовано користувачем:\n"
+msgstr[1] "Обробку %d фотографій або відео скасовано користувачем:\n"
+msgstr[2] "Обробку %d фотографії або відео скасовано користувачем:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "Обробку %d файла скасовано користувачем:\n"
+msgstr[1] "Обробку %d файлів скасовано користувачем:\n"
+msgstr[2] "Обробку %d файлів скасовано користувачем:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "Успішно імпортовано %d фотографію.\n"
+msgstr[1] "Успішно імпортовано %d фотографії.\n"
+msgstr[2] "Успішно імпортовано %d фотографію.\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "Успішно імпортовано %d відео.\n"
+msgstr[1] "Успішно імпортовано %d відео.\n"
+msgstr[2] "Успішно імпортовано %d відео.\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "Успішно імпортовано %d фотографію або відео.\n"
+msgstr[1] "Успішно імпортовано %d фотографії або відео.\n"
+msgstr[2] "Успішно імпортовано %d фотографію або відео.\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Не імпортовано жодної фотографії або відео.\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Імпортування завершено"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d секунда"
+msgstr[1] "%d секунди"
+msgstr[2] "%d секунда"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d хвилина"
+msgstr[1] "%d хвилини"
+msgstr[2] "%d хвилина"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d година"
+msgstr[1] "%d години"
+msgstr[2] "%d година"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 день"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "Перейменувати подію"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Назва:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "Змінити заголовок"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "Заголовок:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "Змінити коментар до події"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "Змінити коментар до фотографії або відео"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "Пересунути до с_мітника"
+msgstr[1] "Пересунути до с_мітника"
+msgstr[2] "Пересунути до с_мітника"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "Лише ви_лучити"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "_Не вилучати"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "Скасувати зовнішні зміни?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "Скасувати зовнішні зміни?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+"Виконання цієї дії приведе до знищення всіх змін, внесених у %d зовнішній "
+"файл. Продовжити?"
+msgstr[1] ""
+"Виконання цієї дії призведе до знищення всіх змін, внесених у %d зовнішніх "
+"файли. Продовжити?"
+msgstr[2] ""
+"Виконання цієї дії призведе до знищення всіх змін, внесених у %d зовнішній "
+"файл. Продовжити?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "С_касувати зовнішню зміну"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "С_касувати зовнішні зміни"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "З бібліотеки буде вилучено %d фотографію. Продовжувати?"
+msgstr[1] "З бібліотеки буде вилучено %d фотографії. Продовжувати?"
+msgstr[2] "З бібліотеки буде вилучено %d фотографію. Продовжувати?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "В_илучити"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Вилучення фотографії з бібліотеки"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Вилучення фотографій з бібліотеки"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "ДО"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "ПО"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 год."
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "Зс_унути фотографії або відео на однаковий проміжок часу"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "Встановити цей час для всі_х фотографій або відео"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "З_мінити початковий файл фотографії"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "З_мінити початкові файли фотографій"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "З_мінити початковий файл"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "З_мінити початкові файли"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "Початкове: "
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d %m %Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d %m %Y, %H:%M:%S"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Час зйомки буде зсунуто вперед на\n"
+"%d %s, %d %s, %d %s і %d %s."
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"Час зйомки буде зсунуто назад на\n"
+"%d %s, %d %s, %d %s і %d %s."
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дні"
+msgstr[2] "день"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "година"
+msgstr[1] "години"
+msgstr[2] "година"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "хвилина"
+msgstr[1] "хвилини"
+msgstr[2] "хвилина"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "секунда"
+msgstr[1] "секунди"
+msgstr[2] "секунда"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"І ще %d."
+msgstr[1] ""
+"\n"
+"\n"
+"І ще %d."
+msgstr[2] ""
+"\n"
+"\n"
+"І ще %d."
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Мітки, відокремлені комами:"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Вітаємо!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "Вітаємо у Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr ""
+"Щоб розпочати користування програмою, імпортуйте фотографії у один з таких "
+"способів:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr ""
+"Скористайтеся пунктом меню <span weight=\"bold\">Файл %s Імпортувати з теки</"
+"span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Перетягніть і скиньте позначки фотографій до вікна Shotwell"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr ""
+"З’єднайте цифровий фотоапарат з вашим комп’ютером і імпортуйте фотографії"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "_Імпортувати фотографії з вашої теки %s"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "Крім того, ви можете імпортувати фотографії у один з таких способів:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "_Не показувати більше це повідомлення"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "Імпортувати фотографії з вашої бібліотеки %s"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Довідка)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "Рік%sМісяць%sДень"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "Рік%sМісяць"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "Рік%sМісяць-День"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "Рік-Місяць-День"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "Нетиповий"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Некоректний шаблон"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell може копіювати файли фотографій до вашої теки бібліотеки або може "
+"просто імпортувати їх без безпосереднього копіювання."
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "_Копіювати фотографії"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "І_мпортувати сюди"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "Імпорт до бібліотеки"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "Вилучити з бібліотеки"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "Вилучення фотографії з бібліотеки"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "Вилучення фотографій з бібліотеки"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографію або відео. Бажаєте, щоб програма пересунула файл вилучених "
+"фотографій до теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[1] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографії або відео. Бажаєте, щоб програма пересунула файли вилучених "
+"фотографій до теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[2] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографію або відео. Бажаєте, щоб програма пересунула файл вилученої "
+"фотографії до теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"відео. Бажаєте, щоб програма пересунула файл вилучених фотографій до теки "
+"смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[1] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"відео. Бажаєте, щоб програма пересунула файли вилучених фотографій до теки "
+"смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[2] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"відео. Бажаєте, щоб програма пересунула файл вилученої фотографії до теки "
+"смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографію. Бажаєте, щоб програма пересунула файл вилучених фотографій до "
+"теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[1] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографії. Бажаєте, щоб програма пересунула файли вилучених фотографій до "
+"теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+msgstr[2] ""
+"Внаслідок виконання цієї дії з вашої бібліотеки Shotwell буде вилучено %d "
+"фотографію. Бажаєте, щоб програма пересунула файл вилученої фотографії до "
+"теки смітника?\n"
+"\n"
+"Результати виконання дії не можна буде скасувати."
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] ""
+"%d файл фотографій або відеофайл не вдалося пересунути до теки смітника "
+"стільниці. Вилучити ці файли?"
+msgstr[1] ""
+"%d файли фотографій або відеофайли не вдалося пересунути до теки смітника "
+"стільниці. Вилучити ці файли?"
+msgstr[2] ""
+"%d файл фотографії або відеофайл не вдалося пересунути до теки смітника "
+"стільниці. Вилучити цей файл?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Не вдалося вилучити %d файл фотографій або відеофайл."
+msgstr[1] "Не вдалося вилучити %d файли фотографій або відеофайли."
+msgstr[2] "Не вдалося вилучити %d файл фотографії або відеофайл."
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Ширина або висота"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "Ширина"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "Висота"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "Неможливо стежити за %s: це не каталог (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "Подія %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "Не вдалося створити файл тимчасових даних для %s: %s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Експортування"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Файл з назвою %s вже існує. Замінити його?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "Пр_опустити"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "_Замінити"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "Замінити вс_і"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "Експорт"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "Не вдалося обробити поточні оновлення: %s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "Скоригувати розміри мініатюр"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "З_більшити"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "Збільшити розміри мініатюр"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "З_меншити"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "Зменшити розміри мініатюр"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "Впорядкувати _фотографії"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "Від_творити відео"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "Відкрити позначені відео у відеопрогравачі системи"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "П_роявник"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "Фотоапарат"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "_Заголовки"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "Показувати заголовки всіх фотографій"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "_Коментарі"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "Показувати коментар до кожної фотографії"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "_Мітки"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Показувати мітки всіх фотографій"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "За _заголовком"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "Впорядкувати фотографії за заголовком"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "За _датою знімання"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "Впорядкувати фотографії за датою знімання"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "За _оцінкою"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "Впорядкувати фотографії за оцінкою"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "За з_ростанням"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "Впорядкувати фотографії за зростанням значення критерію"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "За с_паданням"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "Впорядкувати фотографії за спаданням значення критерію"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell не вдалося відтворити позначені відео:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Немає фотографій або відео"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Не виявлено фотографій або відео"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "Експорт фотографій до цього каталогу неможливий."
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "змінено"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Попередня фотографія"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Наступна фотографія"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Не виявлено файла джерела фотографії: %s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "П_ерегляд"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "_Інструменти"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "_Попередня фотографія"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Попередня фотографія"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "_Наступна фотографія"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Наступна фотографія"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Збільшити масштаб показу фотографії"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Зменшити масштаб показу фотографії"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "Влаштувати в с_торінку"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "Змінити масштаб фотографії на максимальний відповідний вікну"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "Масштаб _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "Змінити масштаб фотографії до початкового"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "Масштаб _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "Змінити масштаб фотографії до подвійного"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Не вдалося експортувати %s: %s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Заповнити всю площу сторінки"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 зображення на сторінку"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 зображення на сторінку"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 зображень на сторінку"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 зображень на сторінку"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 зображень на сторінку"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 зображення на сторінку"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "дюйми"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "см"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "Записник (2 ⨯ 3 дюйми)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "Картка (3 ⨯ 5 дюймів)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 ⨯ 6 дюймів"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 ⨯ 7 дюймів"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 ⨯ 10 дюймів"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 ⨯ 14 дюймів"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 ⨯ 20 дюймів"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "Записник (9 ⨯ 13 см)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "Листівка (10 ⨯ 15 см)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 ⨯ 18 см"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 ⨯ 24 см"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 ⨯ 30 см"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 ⨯ 40 см"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 ⨯ 40 см"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Параметри зображення"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "Друк…"
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Не вдалося надрукувати фотографію:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "Сьогодні"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Вчора"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "Об’єкти"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d подія"
+msgstr[1] "%d події"
+msgstr[2] "%d подія"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d фотографія"
+msgstr[1] "%d фотографії"
+msgstr[2] "%d фотографія"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d відео"
+msgstr[1] "%d відео"
+msgstr[2] "%d відео"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "Дата:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "Час:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "Від:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "До:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "Розмір:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "Тривалість:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f секунд"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "Обробник:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "Експозиція:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "Адреса:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "Розмір файла:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "Поточний проявник:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "Початкові розміри:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "Виробник фотоапарата:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "Модель фотоапарата:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "Спалах:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "Фокусна відстань:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "Дата експонування:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "Час експонування:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "Ухил експозиції:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "Широта за GPS:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Довгота за GPS:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "Фотограф:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Авторські права:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "Програми:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Додаткові відомості"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Впорядник фотографій"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Переглядач фотографій"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "Обернути п_раворуч"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "Обертати"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "Обернути праворуч"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "Обернути фотографії праворуч (натисніть Ctrl для обертання ліворуч)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "Обернути _ліворуч"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "Обернути ліворуч"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "Обернути фотографії ліворуч"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "Віддзеркалити _горизонтально"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "Віддзеркалити горизонтально"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "Віддзеркалити _вертикально"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "Віддзеркалити вертикально"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "По_кращити"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "Підвищити якість"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "Автоматично покращити вигляд фотографій"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "_Копіювати коригування кольорів"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "Копіювати коригування кольорів"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "Копіювати коригування кольорів, застосоване до фотографії"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "_Вставити коригування кольорів"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "Вставити коригування кольорів"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "Застосувати скопійоване коригування кольорів до позначених фотографій"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Обрізати"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "Обрізати"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Обрізати фотографію"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "_Розтягнути"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "Розтягнути"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "Виправити фотографію"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "_Усування червоних очей"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "Червоні очі"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+"Зменшити або усунути будь-які наслідки ефекту «червоних очей» на фотографії"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "С_коригувати"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "Скоригувати"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "Скоригувати колір і тон фотографії"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "Пове_рнутися до початкової"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "Повернутися до початкової"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "Скасувати зовнішні з_міни"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "Повернутися до початкової фотографії"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "Зробити _тлом стільниці"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "Зробити позначене зображення новим зображенням тла стільниці"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "Зробити _показом слайдів стільниці…"
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "В_ернути"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "Вернути"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "Повт_орити"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "Повторити"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "Пере_йменувати подію…"
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "Зробити _ключовою фотографією події"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "Зробити ключовою фотографією події"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "С_творити запис події"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "Створити запис події"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Пересунути фотографії"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Пересунути фотографії до події"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "_Об’єднати події"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "Об’єднати"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "Поєднати події у спільну групу подій"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "_Оцінити"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "Оцінити"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Змінити оцінку вашої фотографії"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "З_більшити"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "Збільшити оцінку"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "З_меншити"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "Зменшити оцінку"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "_Без оцінки"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "Без оцінки"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "Оцінити фотографії без оцінки"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "Зняти оцінки"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Вилучити всі оцінки"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "Від_кинуті"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "Відкинуто"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "Оцінку відкинуто"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "Позначити як відкинуту"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "Позначити оцінку як відкинуту"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "Лише від_кинуті"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "Лише відкинуті"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "Показати лише відкинуті фотографії"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "Всі + в_ідкинуті"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "Показати всі фотографії, зокрема відкинуті"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "Вс_і фотографії"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Показати всі фотографії"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "_Оцінки"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "Показувати оцінки всіх фотографій"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "_Фільтрувати фотографії"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "Фільтрувати фотографії"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "Обмежити кількість показаних фотографій за допомогою фільтра"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "_Дублювати"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "Дублювати"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "Створити дублікат фотографії"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "_Експортувати…"
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "Над_рукувати…"
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "О_прилюднити…"
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "Оприлюднити на одному з веб-сайтів"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "Змінити _назву…"
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "Змінити _коментар…"
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "Зміна коментаря"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "Змінити _коментар до події…"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "С_коригувати дату і час…"
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "Скоригувати дату і час"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Додати _мітки…"
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "_Додати мітки…"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Додати мітки"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "_Налаштування"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "Відкрити за допомогою з_овнішнього редактора"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "Відкрити за допомогою р_едактора цифрових негативів"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "_Надіслати…"
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "Над_іслати…"
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "З_найти…"
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "Знайти"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "Знайти зображення за вказаним рядком з назви або міток зображення"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "_Позначити"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "Зн_яти позначення"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "Не вдалося запустити редактор: %s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "Додати мітку «%s»"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "Додати мітки «%s» і «%s»"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "Ви_лучити мітку «%s»"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Вилучити мітку «%s»"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Вилучити мітку"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "С_творити"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "Пере_йменувати мітку «%s»…"
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "Перейменувати мітку «%s» на «%s»"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "Перей_менувати…"
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "З_мінити мітки…"
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Змінити мітки"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "Додати до фотографії мітку «%s»"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "Додати до фотографій мітку «%s»"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "Додати до позначеної фотографії мітку «%s»"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "Додати до позначених фотографій мітку «%s»"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "Вилучити мітку «%s» з _фотографії"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "Вилучити мітку «%s» з _фотографій"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "Вилучення мітки «%s» з фотографії"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "Вилучення мітки «%s» з фотографій"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+"Не вдалося перейменувати мітку на «%s», оскільки мітка з такою назвою вже "
+"існує."
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+"Не вдалося перейменувати пошук на «%s», оскільки пошук з такою назвою вже "
+"існує."
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Збережений пошук"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Вилучити пошук"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "З_мінити…"
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "Пере_йменувати…"
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Перейменувати пошук «%s» на «%s»"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "Вилучити пошук «%s»"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "Оцінка %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Встановити оцінку %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "Встановлення оцінки %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Показати %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Показати лише фотографії з оцінкою %s"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s або краща"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "Показати %s або кращі"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Показати лише фотографії з оцінкою %s або кращою"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Вилучити позначені фотографії до смітника"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Вилучити позначені фотографії з бібліотеки"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "Від_новити"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "Пересунути позначені фотографії назад до бібліотеки"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "Показати у _менеджері файлів"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Відкрити вказаний каталог фотографій у програмі для керування файлами"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "Не вдалося відкрити у програмі для керування файлами: %s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "Ви_лучити з бібліотеки"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "П_ересунути до смітника"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "Позначити _всі"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "Позначити всі пункти"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%H:%M"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%H:%M:%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d %Y"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "Перегляд слайдів"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "Позначені"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Фотографії"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Відео"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "Цифрові негативи"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "Цифрові негативи"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "Помилка під час спроби завантаження файла опису інтерфейсу %s: %s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "Тип"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "Оцінка"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Параметри"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Назад"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Перейти до попередньої фотографії"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Пауза"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Призупинити показ слайдів"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Далі"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Перейти до наступної фотографії"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Змінити параметри показу слайдів"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Не виявлено всіх файлів джерел даних фотографій."
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Пуск"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Продовжити показ слайдів"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "без назви"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "Експорт відео"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Фотоапарати"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Не вдалося демонтувати пристрій фотоапарата. Спробуйте демонтувати "
+"фотоапарат за допомогою менеджера файлів."
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ховати фотографії, які вже імпортовано"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Показувати лише фотографії, які ще не було імпортовано"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "Розпочинаємо імпортування, зачекайте…"
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "Імпортувати _позначені"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Пересунути позначені фотографії до вашої бібліотеки"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "Імпортувати _всі"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Імпортувати всі фотографії до вашої бібліотеки"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+"Shotwell потрібно демонтувати пристрій фотоапарата з файлової системи, щоб "
+"отримати до нього доступ. Продовжити?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "_Демонтувати"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Будь ласка, демонтуйте пристрій фотоапарата."
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Пристрій фотоапарата заблоковано сторонньою програмою. Shotwell зможе "
+"отримати доступ до фотоапарата лише після його розблокування. Будь ласка, "
+"завершіть роботу будь-яких інших програм, які працюють з фотоапаратом, і "
+"повторіть спробу."
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+"Будь ласка, завершіть роботу будь-яких сторонніх програми, які працюють з "
+"фотоапаратом."
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"Не вдалося отримати дані мініатюр з фотоапарата:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Демонтування…"
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Отримання даних щодо фотографій"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "Отримання мініатюри %s"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Не вдалося заблокувати пристрій фотоапарата: %s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Вилучити %d фотографію з фотоапарата?"
+msgstr[1] "Вилучити %d фотографії з фотоапарата?"
+msgstr[2] "Вилучити %d фотографію з фотоапарата?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Вилучити %d відео з фотоапарата?"
+msgstr[1] "Вилучити %d відео з фотоапарата?"
+msgstr[2] "Вилучити %d відео з фотоапарата?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Вилучити %d фотографію або відео з фотоапарата?"
+msgstr[1] "Вилучити %d фотографії або відео з фотоапарата?"
+msgstr[2] "Вилучити %d фотографію або відео з фотоапарата?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Вилучити ці %d файл з фотоапарата?"
+msgstr[1] "Вилучити ці %d файли з фотоапарата?"
+msgstr[2] "Вилучити ці %d файлів з фотоапарата?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Вилучення фотографій або відео з фотоапарата"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] ""
+"Не вдалося вилучити з фотоапарата %d фотографію або відео через помилки."
+msgstr[1] ""
+"Не вдалося вилучити з фотоапарата %d фотографії або відео через помилки."
+msgstr[2] ""
+"Не вдалося вилучити з фотоапарата %d фотографію або відео через помилки."
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "Імпортування даних"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "База даних %s"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "Неможливо продовжувати імпортування з %s, оскільки сталася помилка:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+"Щоб спробувати імпортувати дані з іншої служби, виберіть службу з "
+"розташованого вище меню."
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"Не увімкнено жодного додатка імпортування.\n"
+"\n"
+"З метою користування імпортуванням з інших програм вам слід увімкнути хоча б "
+"один додаток імпортування даних. Додатки можна увімкнути за допомогою "
+"діалогового вікна параметрів програми."
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "Файл бази даних:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Імпортувати"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "Імпортування з програми"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "Імпортувати дані _з:"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "За_крити"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr ""
+"Не вдалося відкрити або створити базу даних фотографій %s: код помилки %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Не вдалося записати дані до файла бази даних фотографій:\n"
+" %s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Помилка під час спроби доступу до файла бази даних:\n"
+" %s\n"
+"\n"
+"Помилка: \n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "_Файл"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "З_берегти"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Зберегти фотографію"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "Зберегти _як…"
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "Зберегти фотографію зі зміною назви"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "Надрукувати фотографію на принтері, з’єднаному з вашим комп’ютером"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "З_міни"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "_Фотографія"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "_Довідка"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s не існує."
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s не є файлом."
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"У %s не передбачено підтримки файлів у форматі\n"
+"%s."
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "_Зберегти копію"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Відкинути зміни до %s?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "_Не зберігати"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "Помилка під час спроби збереження до %s: %s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "Зберегти як"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "Повернутися до поточних розмірів фотографії"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "Встановити параметри обрізання цієї фотографії"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+"Перемикач прямокутника обрізання між книжковою та альбомною орієнтацією"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "Без обмеження"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "Квадрат"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "Екран"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "Стандартне відео (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "Відео високої роздільності (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "Лист (8,5⨯11 дюймів)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "Таблоїд (11⨯17 дюймів)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210⨯297 мм)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297⨯420 мм)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "Закрити вікно інструменту усування ефекту «червоних очей»"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "Вилучити будь-які наслідки ефекту «червоних очей» у позначеній області"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "Від_новити"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "Насиченість:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "Відтінок:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "Температура:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "Тіні:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "Підсвічування:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "Відновити кольори"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "Скасувати будь-які зміни кольорів і повернутися до початкових значень"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "Температура"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "Затінення"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "Насиченість"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "Експозиція"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "Тіні"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "Підсвічування"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "Розширення контрастності"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "Кут:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d фотографія/відео"
+msgstr[1] "%d фотографії/відео"
+msgstr[2] "%d фотографій/відео"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "Без події"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "Показувати коментар до кожного запису події"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "Немає подій"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "Подій не виявлено"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Події"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "Оновлено"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "Теки"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "Бібліотека"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Імпортування…"
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "П_рипинити імпортування"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Припинити імпортування фотографій"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Приготування до імпортування…"
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Імпортовано %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Попереднє імпортування"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Імпортувати з теки…"
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Імпортувати фотографії з диска до бібліотеки"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "Імпортувати з _програми…"
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Впорядкувати п_одії"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Споро_жнити смітник"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Вилучити всі фотографії до смітника"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Переглянути п_одію, пов’язану з фотографією"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "З_найти"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Знайти фотографії та відео за критеріями пошуку"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "С_творити збережений пошук…"
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "_Фотографії"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Поді_ї"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "_Основні відомості"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Показати основні відомості щодо позначених об’єктів"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "_Додаткові відомості"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Показати додаткові відомості щодо позначених об’єктів"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Панель по_шуку"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Показати панель пошуку"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "_Бічна панель"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "Показати бічну панель"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Імпортувати з теки"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Спорожнити смітник"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Спорожнення смітника…"
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell налаштовано на імпортування фотографій до вашого домашнього "
+"каталогу.\n"
+"Рекомендуємо змінити ці налаштування за допомогою пункту меню <span "
+"weight=\"bold\">Зміни %s Налаштування</span>.\n"
+"Хочете продовжити імпортування фотографій?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "Розташування бібліотеки"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Імпорт фотографій з цього каталогу неможливий."
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Оновлення бібліотеки…"
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Приготування до автоматичного імпортування фотографій…"
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Автоматичне імпортування фотографій…"
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Запис метаданих до файлів…"
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Немає файлів"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Вилучення…"
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Смітник"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Смітник порожній"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Вилучити"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Вилучення фотографій"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"Ваша бібліотека фотографій несумісна з цією версією Shotwell. Ймовірно, її "
+"було створено за допомогою Shotwell %s (схема %d). Ви працюєте з версією "
+"програми %s (схема %d). Будь ласка, користуйтеся свіжими версіями Shotwell."
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell не вдалося оновити вашу бібліотеку фотографій з версії %s (схема "
+"%d) до версії %s (схема %d). Докладніше про процедуру оновлення можна "
+"дізнатися з вікі Shotwell за адресою %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"Ваша бібліотека фотографій несумісна з цією версією Shotwell. Бібліотеку "
+"було створено за допомогою версії програми Shotwell %s (схема %d). Ви "
+"користуєтеся версією %s (схема %d). Будь ласка, спорожніть вашу бібліотеку "
+"(для цього слід вилучити %s) і повторно імпортуйте ваші фотографії."
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "Невідома помилка під час спроби перевірки бази даних Shotwell: %s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Завантаження Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Шлях до конфіденційних даних Shotwell"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "КАТАЛОГ"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "Не стежити за змінами у каталозі бібліотеки під час роботи програми"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "Не показувати панель поступу під час завантаження"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "Показати дані щодо версії програми"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[ФАЙЛ]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr ""
+"Щоб переглянути повний список можливих параметрів командного рядка, віддайте "
+"команду «%s --help».\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Низька (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Середня (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Висока (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Максимальна (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "Оприлюднення"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "Приготування до вивантаження"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Вивантаження %d з %d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "Неможливо продовжувати оприлюднення на %s, оскільки сталася помилка:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+"Щоб спробувати оприлюднити фотографії за допомогою іншої служби, виберіть "
+"відповідний пункт з меню, розташованого вище."
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "Позначені фотографії або відео було успішно оприлюднено."
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "Позначені відео було успішно оприлюднено."
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "Позначені фотографії було успішно оприлюднено."
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "Позначені відео було успішно оприлюднено."
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "Позначені фотографії було успішно оприлюднено."
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "Отримання відомостей щодо облікового запису…"
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Вхід до системи…"
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "Оприлюднення фотографій"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "Оприлюднити фотографії _на:"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "Оприлюднення відео"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "Оприлюднити відео _на"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "Оприлюднення фотографій і відео"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "Оприлюднити фотографії і відео _на:"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "Не вдалося оприлюднити"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell не вдалося оприлюднити вказані дані, оскільки у вашій системі не "
+"увімкнено сумісного з програмою додатка оприлюднення. Щоб виправити це, "
+"скористайтеся пунктом меню <b>Зміни %s Налаштування</b> і увімкніть один або "
+"декілька додатків на вкладці <b>Додатки</b>."
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "Збережені пошуки"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "містить"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "дорівнює"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "починається на"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "закінчується на"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "не містить"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "не встановлено"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "збігається"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "не збігається з"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "будь-яка фотографія"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "необроблена фотографія"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "відео"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "має"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "не має"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "зміни"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "внутрішні зміни"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "зовнішні зміни"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "позначені"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "не позначено"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "і вище"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "лише"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "і нижче"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "після"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "перед"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "між"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "і"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "будь-яка"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "всі"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "жодна"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "Будь-який текст"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Заголовок"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "Мітка"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "Коментар"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "Назва події"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Назва файла"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "Тип носія"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "Стан позначення"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "Стан фотографії"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Дата"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "Створити _мітку…"
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Переходи показу слайдів"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(Немає)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "Немає"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "Випадковий"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Мітки"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "Зробити показом слайдів стільниці"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "Створити показ слайдів у тлі стільниці"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "Показувати кожну фотографію"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "період часу"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "Тривалість показу кожної з фотографій на тлі стільниці"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "Пошук"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "_Назва пошуку:"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "Ві_дповідність"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "за такими ознаками:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>Розміри друкованих зображень</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "Використовувати с_тандартні:"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "Використовувати н_етипові:"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "З_берігати пропорції фотографій"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "_Авторозмір:"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>Заголовки</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "Друкувати за_головок зображення"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>Роздільність у пікселях</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "_Вивести з роздільністю:"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "пікселів на дюйм"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Н_алаштування Shotwell"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "білий"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "чорний"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "_Шукати нові файли у каталозі бібліотеки"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "Метадані"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "Записувати мітки, заголовки та інші _метадані до файлів фотографій"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "Показ"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "_Імпортувати фотографії до:"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "_Тло:"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "Імпортування"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "Стр_уктура каталогів:"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "_Шаблон:"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "Приклад:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "За_мінити літери у назвах імпортованих файлів на малі"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "Обробник RAW"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "_Типовий:"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "З_овнішній фоторедактор:"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "Зовнішній редактор н_егативів:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "Зовнішні редактори"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "Додатки"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "За_тримка:"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "Е_фект переходу:"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "Затри_мка переходу:"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "Показати за_головок"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "секунд"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "_Увійти"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr ""
+#~ "Shotwell налаштовано на імпортування фотографій до вашого домашнього "
+#~ "каталогу.\n"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..662d47e
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,4344 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Lê Trường An <truongan@linuxmail.org>, 2011
+# Vu Hung Nguyen <vuhung16plus@gmail.com>, 2011
+# truong <truongungminh@gmail.com>, 2012
+# Lê Trường An <truongan@linuxmail.org>, 2011, 2012
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: shotwell@yorba.org\n"
+"POT-Creation-Date: 2013-09-20 11:55-0700\n"
+"PO-Revision-Date: 2013-09-20 19:30+0000\n"
+"Last-Translator: yorbajim <jim@yorba.org>\n"
+"Language-Team: Vietnamese (http://www.transifex.com/projects/p/shotwell/"
+"language/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr ""
+
+#: src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "Máy ảnh"
+
+#: src/camera/Branch.vala:101 src/camera/ImportPage.vala:711
+#: src/camera/ImportPage.vala:727 src/photos/RawSupport.vala:300
+#: src/MediaPage.vala:425
+msgid "Camera"
+msgstr "Camera"
+
+#: src/camera/ImportPage.vala:312 src/Properties.vala:227
+#, c-format
+msgid "RAW+JPEG"
+msgstr ""
+
+#: src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr ""
+"Không thể tháo gắn kết máy ảnh. Thử tháo gắn kết từ trình quản lí tập tin."
+
+#: src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "Ẩn các ảnh đã nhập"
+
+#: src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "Chỉ hiện các ảnh chưa nhập"
+
+#: src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr ""
+
+#: src/camera/ImportPage.vala:872 src/MediaPage.vala:436
+msgid "_Titles"
+msgstr ""
+
+#: src/camera/ImportPage.vala:873 src/MediaPage.vala:437
+msgid "Display the title of each photo"
+msgstr "Hiện tựa đề của mỗi ảnh"
+
+#: src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr ""
+
+#: src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "Nhập những ảnh đã chọn vào thư viện"
+
+#: src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr ""
+
+#: src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "Nhập tất cả ảnh vào thư viện"
+
+#: src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "Vui lòng tháo gắn kết máy ảnh."
+
+#: src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"Máy ảnh này bị khoá bởi ứng dụng khác. Shotwell chỉ có thể truy cập vào máy "
+"ảnh khi nó được mở khoá. Vui lòng đóng ứng dụng khác nếu nó dùng máy ảnh và "
+"thử lại."
+
+#: src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr ""
+
+#: src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "Đang tháo gắn kết..."
+
+#: src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "Đang nạp thông tin ảnh"
+
+#: src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "Không thể khoá máy ảnh: %s"
+
+#: src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "Xoá %d ảnh này khỏi máy ảnh?"
+
+#: src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "Xoá %d đoạn video khỏi máy ảnh?"
+
+#: src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "Xoá %d ảnh/video khỏi máy ảnh?"
+
+#: src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "Xoá %d tập tin này khỏi máy ảnh?"
+
+#: src/camera/ImportPage.vala:1739 src/Dialogs.vala:1328
+msgid "_Keep"
+msgstr ""
+
+#: src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "Đang loại bỏ ảnh/video khỏi máy ảnh"
+
+#: src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "Không thể xoá %d ảnh/video khỏi máy ảnh do lỗi."
+
+#: src/CollectionPage.vala:230 src/PhotoPage.vala:2623
+msgid "S_lideshow"
+msgstr ""
+
+#: src/CollectionPage.vala:231 src/PhotoPage.vala:2624
+msgid "Play a slideshow"
+msgstr "Phát trình chiếu"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "Xuất ảnh/video"
+
+#: src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "Xuất ảnh/video"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:58 src/PhotoPage.vala:3196
+msgid "Export Photo"
+msgstr "Xuất ảnh"
+
+#: src/CollectionPage.vala:458 src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "Xuất ảnh"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "Xoay ảnh"
+
+#: src/CollectionPage.vala:545 src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "Hủy thao tác xoay"
+
+#: src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "Rộng hơn theo chiều ngang"
+
+#: src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "Hủy thao tác làm rộng hơn theo chiều ngang"
+
+#: src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "Làm rộng hơn theo chiều dọc"
+
+#: src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "Hủy thao tác làm rộng hơn theo chiều dọc"
+
+#: src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "Tựa đề"
+
+#: src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "Tên tập tin"
+
+#: src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:184 src/SearchFilter.vala:1003
+msgid "Rating"
+msgstr ""
+
+#: src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "Ngày"
+
+#: src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:170
+#: src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:174
+#: src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:245
+#: src/searches/SavedSearchDialog.vala:376
+#: src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "-"
+
+#: src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "và cao hơn"
+
+#: src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "chỉ"
+
+#: src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "và thấp hơn"
+
+#: src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "sau"
+
+#: src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "trước"
+
+#: src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "giữa"
+
+#: src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "và"
+
+#: src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr ""
+
+#: src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "tất cả"
+
+#: src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr ""
+
+#: src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr ""
+
+#: src/searches/Branch.vala:77 src/library/LibraryWindow.vala:346
+#: src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr ""
+
+#: src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+
+#: src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+
+#: src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+
+#: src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr ""
+
+#: src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "Đang nạp Shotwell"
+
+#: src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr ""
+
+#: src/main.vala:294
+msgid "DIRECTORY"
+msgstr ""
+
+#: src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr ""
+
+#: src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr ""
+
+#: src/main.vala:306
+msgid "Show the application's version"
+msgstr ""
+
+#: src/main.vala:338
+msgid "[FILE]"
+msgstr ""
+
+#: src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "Chạy '%s --help' để xem danh sách đầy đủ các tùy chỉnh dòng lệnh.\n"
+
+#: src/Properties.vala:84
+msgid "Today"
+msgstr "Hôm nay"
+
+#: src/Properties.vala:86
+msgid "Yesterday"
+msgstr "Hôm qua"
+
+#: src/Properties.vala:340 src/Dialogs.vala:1273
+msgid "Title:"
+msgstr "Tựa đề:"
+
+#: src/Properties.vala:343
+msgid "Items:"
+msgstr ""
+
+#: src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] ""
+
+#: src/Properties.vala:353 src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] ""
+
+#: src/Properties.vala:355 src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] ""
+
+#: src/Properties.vala:377
+msgid "Date:"
+msgstr "Ngày:"
+
+#: src/Properties.vala:381
+msgid "Time:"
+msgstr "Thời gian:"
+
+#: src/Properties.vala:384 src/Properties.vala:389
+msgid "From:"
+msgstr "Từ:"
+
+#: src/Properties.vala:385 src/Properties.vala:390
+msgid "To:"
+msgstr "Đến:"
+
+#: src/Properties.vala:395 src/editing_tools/EditingTools.vala:1850
+msgid "Size:"
+msgstr "Kích thước:"
+
+#: src/Properties.vala:404
+msgid "Duration:"
+msgstr ""
+
+#: src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f giây"
+
+#: src/Properties.vala:408
+msgid "Developer:"
+msgstr ""
+
+#: src/Properties.vala:436 src/Properties.vala:440 src/Properties.vala:447
+#: src/editing_tools/EditingTools.vala:2218
+msgid "Exposure:"
+msgstr ""
+
+#: src/Properties.vala:585
+msgid "Location:"
+msgstr ""
+
+#: src/Properties.vala:588
+msgid "File size:"
+msgstr "Dung lượng tập tin:"
+
+#: src/Properties.vala:592
+msgid "Current Development:"
+msgstr ""
+
+#: src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr ""
+
+#: src/Properties.vala:597
+msgid "Camera make:"
+msgstr ""
+
+#: src/Properties.vala:600
+msgid "Camera model:"
+msgstr ""
+
+#: src/Properties.vala:603
+msgid "Flash:"
+msgstr ""
+
+#: src/Properties.vala:605
+msgid "Focal length:"
+msgstr ""
+
+#: src/Properties.vala:608
+msgid "Exposure date:"
+msgstr ""
+
+#: src/Properties.vala:611
+msgid "Exposure time:"
+msgstr ""
+
+#: src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr ""
+
+#: src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "VĨ độ GPS:"
+
+#: src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "Kinh độ GPS:"
+
+#: src/Properties.vala:622
+msgid "Artist:"
+msgstr "Nghệ sĩ:"
+
+#: src/Properties.vala:624
+msgid "Copyright:"
+msgstr "Bản quyền:"
+
+#: src/Properties.vala:626
+msgid "Software:"
+msgstr "Phần mềm:"
+
+#: src/Properties.vala:630 src/Dialogs.vala:1288
+msgid "Comment:"
+msgstr ""
+
+#: src/Properties.vala:639
+msgid "Extended Information"
+msgstr "Thông tin mở rộng"
+
+#: src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "Loại bỏ thẻ \"%s\" khỏi %d ảnh. Tiếp tục?"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1361
+#: src/Dialogs.vala:1384 src/data_imports/DataImportsUI.vala:399
+#: src/AppWindow.vala:615 src/AppWindow.vala:636 src/AppWindow.vala:653
+#: src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "_Hủy"
+
+#: src/Dialogs.vala:20 src/Dialogs.vala:28 src/Dialogs.vala:1329
+#: src/Resources.vala:330 src/Resources.vala:378 src/Resources.vala:643
+msgid "_Delete"
+msgstr ""
+
+#: src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "Loại bỏ tìm kiếm đã lưu \"%s\". Tiếp tục?"
+
+#: src/Dialogs.vala:35
+#, c-format
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] ""
+
+#: src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr ""
+
+#: src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "Xuất video"
+
+#: src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr ""
+"Shotwell không thể tạo tập tin để chỉnh sửa ảnh này vì bạn không có đủ quyền "
+"để ghi vào %s."
+
+#: src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"Không thể xuất ảnh sau do lỗi tập tin.\n"
+"\n"
+
+#: src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"Bạn có muốn tiếp tục xuất?"
+
+#: src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr ""
+
+#: src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "Chưa chỉnh sửa"
+
+#: src/Dialogs.vala:148
+msgid "Current"
+msgstr "Hiện tại"
+
+#: src/Dialogs.vala:212
+msgid "_Format:"
+msgstr ""
+
+#: src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr ""
+
+#: src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr ""
+
+#: src/Dialogs.vala:221
+msgid " _pixels"
+msgstr ""
+
+#: src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "Xuất thông tin"
+
+#: src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr ""
+
+#: src/Dialogs.vala:466
+msgid "Save Details"
+msgstr ""
+
+#: src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr ""
+
+#: src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr ""
+
+#: src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] ""
+
+#: src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] ""
+
+#: src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr ""
+
+#: src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr ""
+
+#: src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr ""
+
+#: src/Dialogs.vala:571 src/Dialogs.vala:586 src/Dialogs.vala:601
+#: src/Dialogs.vala:617 src/Dialogs.vala:632 src/Dialogs.vala:646
+msgid "error message:"
+msgstr ""
+
+#: src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr ""
+
+#: src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr ""
+
+#: src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr ""
+
+#: src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+
+#: src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr ""
+
+#: src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr ""
+
+#: src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d ảnh giống nhau không được nhập:\n"
+
+#: src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d video giống nhau không được nhập:\n"
+
+#: src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d ảnh/video giống nhau không được nhập:\n"
+
+#: src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d ảnh không được nhập do lỗi tập tin hay phần cứng:\n"
+
+#: src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d video không được nhập do lỗi tập tin hay phần cứng:\n"
+
+#: src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d ảnh/video không được nhập do lỗi tập tin hay phần cứng:\n"
+
+#: src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d tập tin không được nhập do lỗi tập tin hay phần cứng:\n"
+
+#: src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d ảnh không được nhập vì không có quyền ghi vào thư mục thư viện:\n"
+
+#: src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d video không được nhập vì không có quyền ghi vào thư mục thư viện:\n"
+
+#: src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d ảnh/video không được nhập vì không có quyền ghi vào thư mục thư viện:\n"
+
+#: src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] ""
+"%d tập tin không được nhập vì không có quyền ghi vào thư mục thư viện:\n"
+
+#: src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d ảnh không được nhập do lỗi máy ảnh:\n"
+
+#: src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d video không được nhập do lỗi máy ảnh:\n"
+
+#: src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d ảnh/video không được nhập do lỗi máy ảnh:\n"
+
+#: src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d tập tin không được nhập do lỗi máy ảnh:\n"
+
+#: src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] ""
+
+#: src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "%d ảnh không được hỗ trợ bị bỏ qua:\n"
+
+#: src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "%d tập tin không phải ảnh bị bỏ qua.\n"
+
+#: src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "%d ảnh bị bỏ qua do người dùng chỉ định:\n"
+
+#: src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "%d video bị bỏ qua do người dùng chỉ định:\n"
+
+#: src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "%d ảnh/video bị bỏ qua do người dùng chỉ định:\n"
+
+#: src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d tập tin bị bỏ qua do người dùng chỉ định:\n"
+
+#: src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d ảnh đã được nhập.\n"
+
+#: src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d video đã được nhập.\n"
+
+#: src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d ảnh/video đã được nhập.\n"
+
+#: src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "Không có ảnh hoặc video được nhập.\n"
+
+#: src/Dialogs.vala:856 src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "Đã nhập xong"
+
+#: src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d giây"
+
+#: src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d phút"
+
+#: src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d giờ"
+
+#: src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 ngày"
+
+#: src/Dialogs.vala:1263 src/Resources.vala:205
+msgid "Rename Event"
+msgstr ""
+
+#: src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "Tên:"
+
+#: src/Dialogs.vala:1273 src/Resources.vala:274
+msgid "Edit Title"
+msgstr ""
+
+#: src/Dialogs.vala:1287 src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr ""
+
+#: src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr ""
+
+#: src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr ""
+
+#: src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr ""
+
+#: src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr ""
+
+#: src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "Loại bỏ %d ảnh khỏi thư viện. Bạn có muốn tiếp tục?"
+
+#: src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr ""
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "Loại bỏ ảnh khỏi thư viện"
+
+#: src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "Loại bỏ ảnh khỏi thư viện"
+
+#: src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: src/Dialogs.vala:1626
+msgid "AM"
+msgstr "sáng"
+
+#: src/Dialogs.vala:1627
+msgid "PM"
+msgstr "chiều"
+
+#: src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 giờ"
+
+#: src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr ""
+
+#: src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr ""
+
+#: src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr ""
+
+#: src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr ""
+
+#: src/Dialogs.vala:1744
+msgid "Original: "
+msgstr ""
+
+#: src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%d/%m/%Y, %H:%M:%S"
+
+#: src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%d/%m/%Y, %I:%M:%S %p"
+
+#: src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+
+#: src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ngày"
+
+#: src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "giờ"
+
+#: src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "phút"
+
+#: src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "giây"
+
+#: src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+
+#: src/Dialogs.vala:1907 src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "Thẻ (ngăn cách bằng dấu phẩy):"
+
+#: src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "Chào mừng!"
+
+#: src/Dialogs.vala:2021
+#, c-format
+msgid "Welcome to Shotwell!"
+msgstr "Chào mừng đến với Shotwell!"
+
+#: src/Dialogs.vala:2025
+#, c-format
+msgid "To get started, import photos in any of these ways:"
+msgstr "Để bắt đầu, nhập ảnh bằng một trong những cách dưới đây:"
+
+#: src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "Chọn <span weight=\"bold\">Tập tin %s nhập từ thư mục</span>"
+
+#: src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "Kéo và thả ảnh vào cửa sổ Shotwell"
+
+#: src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "Kết nối máy ảnh vào máy tính và nhập"
+
+#: src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr ""
+
+#: src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr ""
+
+#: src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr ""
+
+#: src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr ""
+
+#: src/Dialogs.vala:2252 src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(Trợ giúp)"
+
+#: src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr ""
+
+#: src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr ""
+
+#: src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr ""
+
+#: src/Dialogs.vala:2272 src/editing_tools/EditingTools.vala:777
+msgid "Custom"
+msgstr "Tùy chọn"
+
+#: src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "Mẫu không hợp lệ"
+
+#: src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr ""
+"Shotwell có thể chép ảnh vào thư mục thư viện hay nhập chúng mà không cần "
+"sao chép."
+
+#: src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr ""
+
+#: src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr ""
+
+#: src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr ""
+
+#: src/Dialogs.vala:2629 src/PhotoPage.vala:3075
+msgid "Remove From Library"
+msgstr "Loại khỏi thư viện"
+
+#: src/Dialogs.vala:2630 src/PhotoPage.vala:3075
+msgid "Removing Photo From Library"
+msgstr "Loại bỏ ảnh khỏi thư viện"
+
+#: src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr ""
+
+#: src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+
+#: src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "Không thể chuyển %d ảnh/video vào sọt rác. Xoá những tập tin này?"
+
+#: src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "Không thể xoá %d ảnh/video."
+
+#: src/folders/Branch.vala:141
+msgid "Folders"
+msgstr ""
+
+#: src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "Thẻ"
+
+#: src/BatchImport.vala:26
+msgid "Success"
+msgstr "Thành công"
+
+#: src/BatchImport.vala:29
+msgid "File error"
+msgstr "Lỗi tập tin"
+
+#: src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "Không thể giải mã tập tin"
+
+#: src/BatchImport.vala:35
+msgid "Database error"
+msgstr "Lỗi cơ sở dữ liệu"
+
+#: src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "Người dùng đã hủy bỏ nhập ảnh"
+
+#: src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "Không phải tập tin"
+
+#: src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "Tập tin đã tồn tại trong cơ sở dữ liệu"
+
+#: src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "Định dạng tập tin không được hỗ trợ"
+
+#: src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "Không phải tập tin ảnh"
+
+#: src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr ""
+
+#: src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "Đĩa đầy"
+
+#: src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "Lỗi camera"
+
+#: src/BatchImport.vala:62
+msgid "File write error"
+msgstr "Lỗi ghi tập tin"
+
+#: src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr ""
+
+#: src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "Nhập thất bại (%d)"
+
+#: src/Photo.vala:3656
+msgid "modified"
+msgstr ""
+
+#: src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "Ảnh trước"
+
+#: src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "Ảnh sau"
+
+#: src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "Không thấy tập tin ảnh nguồn: %s"
+
+#: src/PhotoPage.vala:2404 src/library/LibraryWindow.vala:360
+#: src/direct/DirectPhotoPage.vala:165
+msgid "_View"
+msgstr "H_iển thị"
+
+#: src/PhotoPage.vala:2408 src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr ""
+
+#: src/PhotoPage.vala:2413 src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2414 src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "Ảnh trước"
+
+#: src/PhotoPage.vala:2419 src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr ""
+
+#: src/PhotoPage.vala:2420 src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "Ảnh sau"
+
+#: src/PhotoPage.vala:2583 src/direct/DirectPhotoPage.vala:174
+#: src/MediaPage.vala:325
+msgid "Zoom _In"
+msgstr ""
+
+#: src/PhotoPage.vala:2584 src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "Tăng độ phóng đại của ảnh"
+
+#: src/PhotoPage.vala:2589 src/direct/DirectPhotoPage.vala:180
+#: src/MediaPage.vala:331
+msgid "Zoom _Out"
+msgstr ""
+
+#: src/PhotoPage.vala:2590 src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "Giảm độ phóng đại của ảnh"
+
+#: src/PhotoPage.vala:2595 src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr ""
+
+#: src/PhotoPage.vala:2596 src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr ""
+
+#: src/PhotoPage.vala:2601 src/direct/DirectPhotoPage.vala:192
+msgid "Zoom _100%"
+msgstr ""
+
+#: src/PhotoPage.vala:2602 src/direct/DirectPhotoPage.vala:193
+#, c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2607 src/direct/DirectPhotoPage.vala:198
+msgid "Zoom _200%"
+msgstr ""
+
+#: src/PhotoPage.vala:2608 src/direct/DirectPhotoPage.vala:199
+#, c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr ""
+
+#: src/PhotoPage.vala:2628 src/MediaPage.vala:413
+msgid "_Developer"
+msgstr ""
+
+#: src/PhotoPage.vala:3216
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "Không thể xuất %s: %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:65
+#: src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "Cơ sở dữ liệu %s"
+
+#: src/data_imports/DataImportsPluginHost.vala:148
+#: src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr ""
+
+#: src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:112 src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "_Nhập"
+
+#: src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr ""
+
+#: src/data_imports/DataImportsUI.vala:394
+#: src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr ""
+
+#: src/SlideshowPage.vala:49 src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "Thiết lập"
+
+#: src/SlideshowPage.vala:141 src/Screensaver.vala:18
+msgid "Slideshow"
+msgstr "Trình chiếu"
+
+#: src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "Trở lại"
+
+#: src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "Đến ảnh trước"
+
+#: src/SlideshowPage.vala:168 src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "Tạm dừng"
+
+#: src/SlideshowPage.vala:169 src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "Tạm dừng trình chiếu"
+
+#: src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "Tiếp theo"
+
+#: src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "Đến ảnh kế tiếp"
+
+#: src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "Đổi thiết lập trình chiếu"
+
+#: src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "Thiếu tất cả tập tin ảnh nguồn."
+
+#: src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "Phát"
+
+#: src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "Tiếp tục trình chiếu"
+
+#: src/Commands.vala:733
+msgid "Reverting"
+msgstr "Trở lại"
+
+#: src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "Hủy thao tác Trở lại"
+
+#: src/Commands.vala:777
+msgid "Enhancing"
+msgstr "Tăng cường"
+
+#: src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "Hủy thao tác tăng cường"
+
+#: src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr ""
+
+#: src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "Tạo sự kiện mới"
+
+#: src/Commands.vala:996
+msgid "Removing Event"
+msgstr "Loại bỏ sự kiện"
+
+#: src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "Chuyển ảnh sang sự kiện mới"
+
+#: src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr ""
+
+#: src/Commands.vala:1063
+msgid "Merging"
+msgstr ""
+
+#: src/Commands.vala:1064
+msgid "Unmerging"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr ""
+
+#: src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr ""
+
+#: src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] ""
+
+#: src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr ""
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "Tăng mức đánh giá"
+
+#: src/Commands.vala:1193 src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "Giảm mức đánh giá"
+
+#: src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr ""
+
+#: src/Commands.vala:1245
+msgid "Set Developer"
+msgstr ""
+
+#: src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr ""
+
+#: src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "Chỉnh ngày và giờ"
+
+#: src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "Hủy thao tác chỉnh ngày và giờ"
+
+#: src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "Ảnh gốc không thể bị chỉnh sửa."
+
+#: src/Commands.vala:1389 src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr ""
+
+#: src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] ""
+
+#: src/Commands.vala:1625 src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "Tạo thẻ"
+
+#: src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr ""
+
+#: src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "Chuyển ảnh vào sọt rác"
+
+#: src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "Phục hồi ảnh trong sọt rác"
+
+#: src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "Chuyển ảnh vào sọt rác của Shotwell"
+
+#: src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "Phục hồi ảnh trở về thư viện của Shotwell"
+
+#: src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "Chuyển ảnh vào sọt rác"
+
+#: src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "Phục hồi ảnh từ sọt rác"
+
+#: src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "Gắn cờ cho ảnh đã chọn"
+
+#: src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "Gỡ cờ các ảnh đã chọn"
+
+#: src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr ""
+
+#: src/Commands.vala:2451
+msgid "Flag"
+msgstr "Gắn cờ"
+
+#: src/Commands.vala:2451
+msgid "Unflag"
+msgstr "Gỡ cờ"
+
+#: src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: src/photos/RawSupport.vala:297 src/MediaPage.vala:420
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "Thấp (%d%%)"
+
+#: src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "Trung bình (%d%%)"
+
+#: src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "Cao (%d%%)"
+
+#: src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "Tối đa (%d%%)"
+
+#: src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "Không có ảnh/video"
+
+#: src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "Không tìm thấy ảnh/video"
+
+#: src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr ""
+
+#: src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr ""
+
+#: src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "Lấp đầy trang hiện tại"
+
+#: src/Printing.vala:256
+msgid "2 images per page"
+msgstr "2 ảnh mỗi trang"
+
+#: src/Printing.vala:257
+msgid "4 images per page"
+msgstr "4 ảnh mỗi trang"
+
+#: src/Printing.vala:258
+msgid "6 images per page"
+msgstr "6 ảnh mỗi trang"
+
+#: src/Printing.vala:259
+msgid "8 images per page"
+msgstr "8 ảnh mỗi trang"
+
+#: src/Printing.vala:260
+msgid "16 images per page"
+msgstr "16 ảnh mỗi trang"
+
+#: src/Printing.vala:261
+msgid "32 images per page"
+msgstr "32 ảnh mỗi trang"
+
+#: src/Printing.vala:348
+msgid "in."
+msgstr "in."
+
+#: src/Printing.vala:349
+msgid "cm"
+msgstr "cm"
+
+#: src/Printing.vala:817 src/editing_tools/EditingTools.vala:757
+msgid "Wallet (2 x 3 in.)"
+msgstr ""
+
+#: src/Printing.vala:820 src/editing_tools/EditingTools.vala:758
+msgid "Notecard (3 x 5 in.)"
+msgstr ""
+
+#: src/Printing.vala:823 src/editing_tools/EditingTools.vala:759
+msgid "4 x 6 in."
+msgstr "4 x 6 in."
+
+#: src/Printing.vala:826 src/editing_tools/EditingTools.vala:760
+msgid "5 x 7 in."
+msgstr "5 x 7 in."
+
+#: src/Printing.vala:829 src/editing_tools/EditingTools.vala:761
+msgid "8 x 10 in."
+msgstr "8 x 10 in."
+
+#: src/Printing.vala:832 src/editing_tools/EditingTools.vala:763
+msgid "11 x 14 in."
+msgstr "11 x 14 in."
+
+#: src/Printing.vala:835 src/editing_tools/EditingTools.vala:765
+msgid "16 x 20 in."
+msgstr "16 x 20 in."
+
+#: src/Printing.vala:841 src/editing_tools/EditingTools.vala:767
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr ""
+
+#: src/Printing.vala:844 src/editing_tools/EditingTools.vala:768
+msgid "Postcard (10 x 15 cm)"
+msgstr ""
+
+#: src/Printing.vala:847 src/editing_tools/EditingTools.vala:769
+msgid "13 x 18 cm"
+msgstr "13 x 18 cm"
+
+#: src/Printing.vala:850 src/editing_tools/EditingTools.vala:770
+msgid "18 x 24 cm"
+msgstr "18 x 24 cm"
+
+#: src/Printing.vala:853 src/editing_tools/EditingTools.vala:772
+msgid "20 x 30 cm"
+msgstr "20 x 30 cm"
+
+#: src/Printing.vala:856 src/editing_tools/EditingTools.vala:773
+msgid "24 x 40 cm"
+msgstr "24 x 40 cm"
+
+#: src/Printing.vala:859 src/editing_tools/EditingTools.vala:774
+msgid "30 x 40 cm"
+msgstr "30 x 40 cm"
+
+#: src/Printing.vala:875
+msgid "Image Settings"
+msgstr "Thiết lập ảnh"
+
+#: src/Printing.vala:888
+msgid "Printing..."
+msgstr "Đang in..."
+
+#: src/Printing.vala:908 src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"Không thể in ảnh:\n"
+"\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "Không thể mở/tạo cở sở dữ liệu ảnh %s: mã lỗi %d"
+
+#: src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"Không thể ghi vào tập tin cơ sở dữ liệu ảnh:\n"
+"%s"
+
+#: src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"Lỗi khi truy cập tập tin cơ sở dữ liệu:\n"
+"%s\n"
+"\n"
+"Lỗi: \n"
+"%s"
+
+#: src/VideoSupport.vala:464
+msgid "Export Videos"
+msgstr "Xuất video"
+
+#: src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "Gửi đến"
+
+#: src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr ""
+
+#: src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr ""
+
+#: src/library/FlaggedPage.vala:8 src/SearchFilter.vala:587
+#: src/SearchFilter.vala:588 src/SearchFilter.vala:990
+msgid "Flagged"
+msgstr "Được đánh dấu"
+
+#: src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "Sọt rác"
+
+#: src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "Sọt rác trống"
+
+#: src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "Xóa"
+
+#: src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "Xóa ảnh"
+
+#: src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "Tập tin bị thiếu"
+
+#: src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "Đang xóa..."
+
+#: src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "Lần nhập gần nhất"
+
+#: src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "_Nhập từ thư mục..."
+
+#: src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "Nhập ảnh từ đĩa vào thư viện"
+
+#: src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr ""
+
+#: src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "Sắp xếp _Sự kiện"
+
+#: src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "Xóa _thùng rác"
+
+#: src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "Xóa tất cả ảnh trong sọt rác"
+
+#: src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "Xem sự _kiện của ảnh"
+
+#: src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "Tìm _kiếm"
+
+#: src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "Tìm kiếm ảnh và movie "
+
+#: src/library/LibraryWindow.vala:352 src/direct/DirectPhotoPage.vala:46
+msgid "_File"
+msgstr "_Tập tin"
+
+#: src/library/LibraryWindow.vala:356 src/direct/DirectPhotoPage.vala:73
+msgid "_Edit"
+msgstr "_Chỉnh sửa"
+
+#: src/library/LibraryWindow.vala:364 src/direct/DirectPhotoPage.vala:77
+msgid "_Photo"
+msgstr "Ả_nh"
+
+#: src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "Ả_nh"
+
+#: src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "Sự _kiện"
+
+#: src/library/LibraryWindow.vala:376 src/MediaPage.vala:454
+msgid "Ta_gs"
+msgstr "T_hẻ"
+
+#: src/library/LibraryWindow.vala:380 src/direct/DirectPhotoPage.vala:169
+msgid "_Help"
+msgstr "Trợ _giúp"
+
+#: src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "Thông tin cơ _bản"
+
+#: src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "Hiện thông tin cơ bản cho phần chọn"
+
+#: src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "Thông tin mở rộng"
+
+#: src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "Hiện thông tin mở rộng cho phần đã chọn"
+
+#: src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "Thanh _tìm kiếm"
+
+#: src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "Hiện thanh tìm kiếm"
+
+#: src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr ""
+
+#: src/library/LibraryWindow.vala:422 src/MediaPage.vala:494
+msgid "_Ascending"
+msgstr "_Tăng dần"
+
+#: src/library/LibraryWindow.vala:423 src/MediaPage.vala:495
+msgid "Sort photos in an ascending order"
+msgstr "Sắp xếp ảnh theo thứ tự tăng dần"
+
+#: src/library/LibraryWindow.vala:429 src/MediaPage.vala:500
+msgid "D_escending"
+msgstr "_Giảm dần"
+
+#: src/library/LibraryWindow.vala:430 src/MediaPage.vala:501
+msgid "Sort photos in a descending order"
+msgstr "Sắp xếp ảnh theo thứ tự giảm dần"
+
+#: src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "Nhập từ thư mục"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "Xóa thùng rác"
+
+#: src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "Xóa thùng rác..."
+
+#: src/library/LibraryWindow.vala:896
+msgid "Shotwell is configured to import photos to your home directory.\n"
+msgstr "Shotwell được cấu hình để nhập ảnh vào thư mục chính của bạn.\n"
+
+#: src/library/LibraryWindow.vala:899
+msgid "Library Location"
+msgstr "Vị trí thư viện"
+
+#: src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "Không thể nhập ảnh từ thư mục này."
+
+#: src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: src/library/LibraryWindow.vala:1244 src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "Đang cập nhật thư viện"
+
+#: src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "Đang chuẩn bị tự động nhập ảnh..."
+
+#: src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "Tự động nhập ảnh..."
+
+#: src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "Đang ghi thông tin vào tập tin..."
+
+#: src/library/Branch.vala:37
+msgid "Library"
+msgstr "Thư viện"
+
+#: src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "Đang nhập..."
+
+#: src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "_Dừng nhập"
+
+#: src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "Dừng nhập ảnh"
+
+#: src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "Đang chuẩn bị nhập..."
+
+#: src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "Đã nhập %s"
+
+#: src/direct/DirectPhotoPage.vala:51 src/direct/DirectPhotoPage.vala:413
+msgid "_Save"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "Lưu ảnh"
+
+#: src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:223
+#, c-format
+msgid "%s does not exist."
+msgstr "%s không tồn tại."
+
+#: src/direct/DirectPhotoPage.vala:225
+#, c-format
+msgid "%s is not a file."
+msgstr "%s không phải là tập tin."
+
+#: src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s không hỗ trợ định dạng tập tin\n"
+"%s."
+
+#: src/direct/DirectPhotoPage.vala:413
+msgid "_Save a Copy"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:416
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "Không lưu các thay đổi của %s?"
+
+#: src/direct/DirectPhotoPage.vala:417
+msgid "Close _without Saving"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:450
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr ""
+
+#: src/direct/DirectPhotoPage.vala:478 src/direct/DirectPhotoPage.vala:499
+msgid "Save As"
+msgstr "Lưu mới"
+
+#: src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr ""
+
+#: src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "Trình quản lí ảnh"
+
+#: src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "Trình xem ảnh"
+
+#: src/Resources.vala:27 plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: plugins/shotwell-data-imports/FSpotImporter.vala:34
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr ""
+
+#: src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr ""
+
+#: src/Resources.vala:145 src/Resources.vala:150
+msgid "Rotate"
+msgstr "Xoay"
+
+#: src/Resources.vala:146
+msgid "Rotate Right"
+msgstr ""
+
+#: src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr ""
+
+#: src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr ""
+
+#: src/Resources.vala:151
+msgid "Rotate Left"
+msgstr ""
+
+#: src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr ""
+
+#: src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr ""
+
+#: src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr ""
+
+#: src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr ""
+
+#: src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr ""
+
+#: src/Resources.vala:160
+msgid "_Enhance"
+msgstr ""
+
+#: src/Resources.vala:161
+msgid "Enhance"
+msgstr ""
+
+#: src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr ""
+
+#: src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr ""
+
+#: src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr ""
+
+#: src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr ""
+
+#: src/Resources.vala:172
+msgid "_Crop"
+msgstr "_Cắt"
+
+#: src/Resources.vala:173
+msgid "Crop"
+msgstr "Cắt"
+
+#: src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "Cắt ảnh"
+
+#: src/Resources.vala:176 src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr ""
+
+#: src/Resources.vala:177
+msgid "Straighten"
+msgstr ""
+
+#: src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr ""
+
+#: src/Resources.vala:180
+msgid "_Red-eye"
+msgstr ""
+
+#: src/Resources.vala:181
+msgid "Red-eye"
+msgstr ""
+
+#: src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr ""
+
+#: src/Resources.vala:184
+msgid "_Adjust"
+msgstr ""
+
+#: src/Resources.vala:185
+msgid "Adjust"
+msgstr ""
+
+#: src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr ""
+
+#: src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr ""
+
+#: src/Resources.vala:189
+msgid "Revert to Original"
+msgstr ""
+
+#: src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr ""
+
+#: src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr ""
+
+#: src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr ""
+
+#: src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr ""
+
+#: src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr ""
+
+#: src/Resources.vala:198
+msgid "_Undo"
+msgstr "_Hủy thao tác"
+
+#: src/Resources.vala:199
+msgid "Undo"
+msgstr "Hủy thao tác"
+
+#: src/Resources.vala:201
+msgid "_Redo"
+msgstr ""
+
+#: src/Resources.vala:202
+msgid "Redo"
+msgstr ""
+
+#: src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr ""
+
+#: src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr ""
+
+#: src/Resources.vala:210
+msgid "_New Event"
+msgstr "Sự kiện _mới"
+
+#: src/Resources.vala:211
+msgid "New Event"
+msgstr "Sự kiện mới"
+
+#: src/Resources.vala:213
+msgid "Move Photos"
+msgstr "Di chuyển ảnh"
+
+#: src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "Chuyển ảnh sang một sự kiện"
+
+#: src/Resources.vala:216
+msgid "_Merge Events"
+msgstr ""
+
+#: src/Resources.vala:217
+msgid "Merge"
+msgstr ""
+
+#: src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr ""
+
+#: src/Resources.vala:220
+msgid "_Set Rating"
+msgstr ""
+
+#: src/Resources.vala:221
+msgid "Set Rating"
+msgstr ""
+
+#: src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "Đổi mức đánh giá của ảnh"
+
+#: src/Resources.vala:224
+msgid "_Increase"
+msgstr ""
+
+#: src/Resources.vala:225
+msgid "Increase Rating"
+msgstr ""
+
+#: src/Resources.vala:227
+msgid "_Decrease"
+msgstr ""
+
+#: src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr ""
+
+#: src/Resources.vala:230
+msgid "_Unrated"
+msgstr ""
+
+#: src/Resources.vala:231
+msgid "Unrated"
+msgstr ""
+
+#: src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr ""
+
+#: src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr ""
+
+#: src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "Loại bỏ đánh giá"
+
+#: src/Resources.vala:236
+msgid "_Rejected"
+msgstr ""
+
+#: src/Resources.vala:237
+msgid "Rejected"
+msgstr ""
+
+#: src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr ""
+
+#: src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr ""
+
+#: src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr ""
+
+#: src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr ""
+
+#: src/Resources.vala:243
+msgid "Rejected Only"
+msgstr ""
+
+#: src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr ""
+
+#: src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr ""
+
+#: src/Resources.vala:247 src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr ""
+
+#: src/Resources.vala:250
+msgid "_All Photos"
+msgstr ""
+
+#: src/Resources.vala:251 src/Resources.vala:252
+msgid "Show all photos"
+msgstr "Hiện tất cả ảnh"
+
+#: src/Resources.vala:254
+msgid "_Ratings"
+msgstr ""
+
+#: src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr ""
+
+#: src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:258
+msgid "Filter Photos"
+msgstr ""
+
+#: src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr ""
+
+#: src/Resources.vala:261
+msgid "_Duplicate"
+msgstr ""
+
+#: src/Resources.vala:262
+msgid "Duplicate"
+msgstr ""
+
+#: src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr ""
+
+#: src/Resources.vala:265
+msgid "_Export..."
+msgstr ""
+
+#: src/Resources.vala:267
+msgid "_Print..."
+msgstr ""
+
+#: src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr ""
+
+#: src/Resources.vala:270
+msgid "Publish"
+msgstr "Xuất bản"
+
+#: src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr ""
+
+#: src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr ""
+
+#: src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr ""
+
+#: src/Resources.vala:277
+msgid "Edit Comment"
+msgstr ""
+
+#: src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr ""
+
+#: src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr ""
+
+#: src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr ""
+
+#: src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "Thêm _thẻ..."
+
+#: src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr ""
+
+#: src/Resources.vala:287 src/Resources.vala:318
+msgid "Add Tags"
+msgstr "Thêm thẻ"
+
+#: src/Resources.vala:289
+msgid "_Preferences"
+msgstr ""
+
+#: src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr ""
+
+#: src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr ""
+
+#: src/Resources.vala:295
+msgid "Send _To..."
+msgstr ""
+
+#: src/Resources.vala:296
+msgid "Send T_o..."
+msgstr ""
+
+#: src/Resources.vala:298
+msgid "_Find..."
+msgstr ""
+
+#: src/Resources.vala:299
+msgid "Find"
+msgstr "Tìm"
+
+#: src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr ""
+
+#: src/Resources.vala:302
+msgid "_Flag"
+msgstr ""
+
+#: src/Resources.vala:304
+msgid "Un_flag"
+msgstr ""
+
+#: src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr ""
+
+#: src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr ""
+
+#: src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr ""
+
+#: src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "Xoá thẻ \"%s\""
+
+#: src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "Xoá thẻ"
+
+#: src/Resources.vala:332
+msgid "_New"
+msgstr ""
+
+#: src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr ""
+
+#: src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr ""
+
+#: src/Resources.vala:342
+msgid "_Rename..."
+msgstr ""
+
+#: src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "_Sửa thẻ..."
+
+#: src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "Chỉnh sửa thẻ"
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr ""
+
+#: src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr ""
+
+#: src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr ""
+
+#: src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr ""
+
+#: src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr ""
+
+#: src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr ""
+
+#: src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr ""
+
+#: src/Resources.vala:374
+msgid "Saved Search"
+msgstr "Tìm kiếm đã lưu"
+
+#: src/Resources.vala:376
+msgid "Delete Search"
+msgstr "Xoá tìm kiếm"
+
+#: src/Resources.vala:379
+msgid "_Edit..."
+msgstr "Chỉnh _sửa..."
+
+#: src/Resources.vala:380
+msgid "Re_name..."
+msgstr ""
+
+#: src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "Đổi tên tìm kiếm \"%s\" sang \"%s\""
+
+#: src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr ""
+
+#: src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr ""
+
+#: src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "Đặt mức đánh giá %s"
+
+#: src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr ""
+
+#: src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "Hiển thị %s"
+
+#: src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "Chỉ hiện ảnh với mức đánh giá %s"
+
+#: src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s hay cao hơn"
+
+#: src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr ""
+
+#: src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "Chỉ hiện ảnh với mức đánh giá %s hoặc cao hơn"
+
+#: src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "Loại bỏ ảnh đã chọn khỏi sọt rác"
+
+#: src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "Loại bỏ ảnh đã chọn khỏi thư viện"
+
+#: src/Resources.vala:647
+msgid "_Restore"
+msgstr ""
+
+#: src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr ""
+
+#: src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr ""
+
+#: src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "Mở thư mục chứa ảnh đã chọn"
+
+#: src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr ""
+
+#: src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr ""
+
+#: src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr ""
+
+#: src/Resources.vala:661
+msgid "Select _All"
+msgstr ""
+
+#: src/Resources.vala:662
+msgid "Select all items"
+msgstr "Chọn tất cả các mục"
+
+#: src/Resources.vala:740
+msgid "%-I:%M %p"
+msgstr ""
+
+#: src/Resources.vala:741
+msgid "%-I:%M:%S %p"
+msgstr ""
+
+#: src/Resources.vala:742
+msgid "%a %b %d, %Y"
+msgstr "%a %b %d, %Y"
+
+#: src/Resources.vala:743 src/Resources.vala:745
+msgid "%a %b %d"
+msgstr "%a %b %d"
+
+#: src/Resources.vala:744
+msgid "%d, %Y"
+msgstr "%d, %Y"
+
+#: src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr ""
+
+#: src/editing_tools/StraightenTool.vala:102
+#: src/editing_tools/EditingTools.vala:2204
+msgid "_Reset"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:661
+msgid "Return to current photo dimensions"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:664
+msgid "Set the crop for this photo"
+msgstr "Cắt ảnh"
+
+#: src/editing_tools/EditingTools.vala:676
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:749
+msgid "Unconstrained"
+msgstr "Không bắt buộc"
+
+#: src/editing_tools/EditingTools.vala:750
+msgid "Square"
+msgstr "Vuông"
+
+#: src/editing_tools/EditingTools.vala:751
+msgid "Screen"
+msgstr "Màn hình"
+
+#: src/editing_tools/EditingTools.vala:752
+#: plugins/shotwell-publishing/PicasaPublishing.vala:750
+msgid "Original Size"
+msgstr "Kích thước ban đầu"
+
+#: src/editing_tools/EditingTools.vala:753
+#: src/editing_tools/EditingTools.vala:756
+#: src/editing_tools/EditingTools.vala:766
+#: src/editing_tools/EditingTools.vala:776
+msgid "-"
+msgstr "-"
+
+#: src/editing_tools/EditingTools.vala:754
+msgid "SD Video (4 : 3)"
+msgstr "SD Video (4 : 3)"
+
+#: src/editing_tools/EditingTools.vala:755
+msgid "HD Video (16 : 9)"
+msgstr "HD Video (16 : 9)"
+
+#: src/editing_tools/EditingTools.vala:762
+msgid "Letter (8.5 x 11 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:764
+msgid "Tabloid (11 x 17 in.)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:771
+msgid "A4 (210 x 297 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:775
+msgid "A3 (297 x 420 mm)"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1865
+msgid "Close the red-eye tool"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:1868
+msgid "Remove any red-eye effects in the selected region"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2226
+msgid "Saturation:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2234
+msgid "Tint:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2243
+msgid "Temperature:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2251
+msgid "Shadows:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2259
+msgid "Highlights:"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset Colors"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2313
+msgid "Reset all color adjustments to original"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2665
+msgid "Temperature"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2678
+msgid "Tint"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2691
+msgid "Saturation"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2704
+msgid "Exposure"
+msgstr "Độ sáng"
+
+#: src/editing_tools/EditingTools.vala:2717
+msgid "Shadows"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2730
+msgid "Highlights"
+msgstr ""
+
+#: src/editing_tools/EditingTools.vala:2740
+msgid "Contrast Expansion"
+msgstr ""
+
+#: src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "Cố định thanh công cụ"
+
+#: src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "Cố định thanh công cụ"
+
+#: src/AppWindow.vala:53 src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "Thoát chế độ toàn màn hình"
+
+#: src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "Thoát_Toàn màn hình"
+
+#: src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "_Thoát"
+
+#: src/AppWindow.vala:496
+msgid "_About"
+msgstr "_Giới thiệu"
+
+#: src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "Toàn_Màn hình"
+
+#: src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "_Mục lục"
+
+#: src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "_Thắc mắc hay gặp phải"
+
+#: src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr ""
+
+#: src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"Một lỗi tai hại đã xảy ra khi truy cập vào thư viện của Shotwell. Shotwell "
+"không thể tiếp tục.⏎ ⏎ %s"
+
+#: src/AppWindow.vala:683 plugins/common/Resources.vala:9
+msgid "Visit the Yorba web site"
+msgstr "Xem trang web Yorba"
+
+#: src/AppWindow.vala:686 plugins/common/Resources.vala:28
+msgid "translator-credits"
+msgstr "Dự án MOST <du-an-most@lists.hanoilug.org>"
+
+#: src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "Không thể hiển thị trợ giúp: %s"
+
+#: src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr ""
+
+#: src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr ""
+
+#: src/Tag.vala:817
+msgid "untitled"
+msgstr "chưa có tên"
+
+#: src/Dimensions.vala:17
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+msgid "Original size"
+msgstr "Kích cỡ gốc"
+
+#: src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "Rộng hoặc cao"
+
+#: src/Dimensions.vala:23
+msgid "Width"
+msgstr "Rộng"
+
+#: src/Dimensions.vala:26
+msgid "Height"
+msgstr "Cao"
+
+#: src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr ""
+
+#: src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr ""
+
+#: src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr ""
+
+#: src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr ""
+
+#: src/MediaPage.vala:442 src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr ""
+
+#: src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr ""
+
+#: src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "Hiện thẻ của mỗi ảnh"
+
+#: src/MediaPage.vala:471
+msgid "By _Title"
+msgstr ""
+
+#: src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr ""
+
+#: src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr ""
+
+#: src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr ""
+
+#: src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr ""
+
+#: src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr ""
+
+#: src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+
+#: src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] ""
+
+#: src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "Sự kiện"
+
+#: src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr ""
+
+#: src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr ""
+
+#: src/events/EventPage.vala:129
+msgid "No Event"
+msgstr ""
+
+#: src/AppDirs.vala:48 src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr ""
+
+#: src/AppDirs.vala:58 src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "Không thể tạo thư mục dữ liệu %s: %s"
+
+#: src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "Hình ảnh"
+
+#: src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "Không thể tạo thư mục tạm %s: %s"
+
+#: src/AppDirs.vala:207 src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "Không thể tạo thư mục dữ liệu con %s: %s"
+
+#: src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr ""
+
+#: src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr ""
+
+#: src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "Hiệu ứng trình chiếu"
+
+#: src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr ""
+
+#: src/Exporter.vala:299
+msgid "Exporting"
+msgstr "Đang xuất"
+
+#: src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "Tập tin %s đã tồn tại. Thay thế?"
+
+#: src/Exporter.vala:319
+msgid "_Skip"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "_Replace"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Replace _All"
+msgstr ""
+
+#: src/Exporter.vala:319
+msgid "Export"
+msgstr "Xuất"
+
+#: src/SearchFilter.vala:593 src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "Ảnh"
+
+#: src/SearchFilter.vala:599 src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "Video"
+
+#: src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr ""
+
+#: src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr ""
+
+#: src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr ""
+
+#: src/SearchFilter.vala:969
+msgid "Type"
+msgstr ""
+
+#: src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "Đang đăng nhập..."
+
+#: src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr ""
+
+#: src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "Đang tải lên %d trong số %d"
+
+#: src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr ""
+
+#: src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr ""
+
+#: src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:424
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:971
+msgid "A temporary file needed for publishing is unavailable"
+msgstr ""
+
+#: plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"Bạn chưa đăng nhập vào Youtube.\n"
+"\n"
+"Bạn phải đăng nhập vào tài khoản Google và thiết lập để sử dụng Youtube. Bạn "
+"có thể thiết lập cho hầu hết các tài khoản bằng cách dùng trình duyệt đăng "
+"nhập vào Youtube ít nhất một lần."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "Bạn đã đăng nhập Youtube với tên %s."
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "Video sẽ xuất hiện trong '%s'"
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr ""
+
+#: plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "Riêng tư"
+
+#: plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1182
+msgid "Everyone"
+msgstr "Mọi người"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr ""
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1211
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1180
+msgid "Just me"
+msgstr "Cá nhân tôi"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:107
+msgid "500 x 375 pixels"
+msgstr "500 x 375 điểm ảnh"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:108
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 điểm ảnh"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 điểm ảnh"
+
+#: plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 điểm ảnh"
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:590
+msgid "Username and/or password invalid. Please try again"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+#, c-format
+msgid "Invalid URL"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:620
+#, c-format
+msgid "Invalid User Name or Password"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+#: plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: plugins/shotwell-publishing/FacebookPublishing.vala:61
+msgid "Shotwell Connect"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr ""
+
+#: plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:379
+#: plugins/shotwell-publishing/FacebookPublishing.vala:347
+msgid "Creating album..."
+msgstr "Đang tạo album..."
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr ""
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "Video sẽ xuất hiện trong:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:670
+msgid "Photos will appear in:"
+msgstr "Ảnh sẽ xuất hiện trong:"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "Nhỏ (640 x 480 điểm ảnh)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "Trung bình (1024 x 768 điểm ảnh)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "Nên dùng (1600 x 1200 điểm ảnh)"
+
+#: plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "Chuẩn (720 điểm ảnh)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "Rộng (2048 điểm ảnh)"
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1021
+msgid "Upload _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr ""
+
+#: plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "Crumble"
+
+#: plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr ""
+
+#: plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr ""
+
+#: plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr ""
+
+#: plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr ""
+
+#: plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr ""
+
+#: plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr ""
+
+#: plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+
+#: plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "Slide"
+
+#: plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "Fade"
+
+#: plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr ""
+
+#: plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr ""
+
+#: plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr ""
+
+#: ui/set_background_dialog.glade:14
+msgid "Set as Desktop Slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:55
+msgid "Generate desktop background slideshow"
+msgstr ""
+
+#: ui/set_background_dialog.glade:82
+msgid "Show each photo for"
+msgstr ""
+
+#: ui/set_background_dialog.glade:94
+msgid "period of time"
+msgstr ""
+
+#: ui/set_background_dialog.glade:116
+msgid "How long each photo is shown on the desktop background"
+msgstr ""
+
+#: ui/shotwell.glade:7
+msgid "Search"
+msgstr "Tìm"
+
+#: ui/shotwell.glade:47
+msgid "_Name of search:"
+msgstr ""
+
+#: ui/shotwell.glade:108
+msgid "_Match"
+msgstr ""
+
+#: ui/shotwell.glade:137
+msgid "of the following:"
+msgstr ""
+
+#: ui/shotwell.glade:218
+msgid "<b>Printed Image Size</b>"
+msgstr ""
+
+#: ui/shotwell.glade:235
+msgid "Use a _standard size:"
+msgstr ""
+
+#: ui/shotwell.glade:278
+msgid "Use a c_ustom size:"
+msgstr ""
+
+#: ui/shotwell.glade:368
+msgid "_Match photo aspect ratio"
+msgstr ""
+
+#: ui/shotwell.glade:392
+msgid "_Autosize:"
+msgstr ""
+
+#: ui/shotwell.glade:432
+msgid "<b>Titles</b>"
+msgstr ""
+
+#: ui/shotwell.glade:449
+msgid "Print image _title"
+msgstr ""
+
+#: ui/shotwell.glade:493
+msgid "<b>Pixel Resolution</b>"
+msgstr ""
+
+#: ui/shotwell.glade:513
+msgid "_Output photo at:"
+msgstr ""
+
+#: ui/shotwell.glade:548
+msgid "pixels per inch"
+msgstr ""
+
+#: ui/shotwell.glade:581 ui/shotwell.glade:623
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:27
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:27
+msgid "label"
+msgstr "nhãn"
+
+#: ui/shotwell.glade:719
+msgid "Shotwell Preferences"
+msgstr "Tùy chỉnh Shotwell"
+
+#: ui/shotwell.glade:796
+msgid "white"
+msgstr "trắng"
+
+#: ui/shotwell.glade:823
+msgid "black"
+msgstr "đen"
+
+#: ui/shotwell.glade:871
+msgid "_Watch library directory for new files"
+msgstr "_Phát hiện tập tin mới trong thư viện"
+
+#: ui/shotwell.glade:900
+msgid "Metadata"
+msgstr "Thông tin"
+
+#: ui/shotwell.glade:920
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "_Ghi thẻ, tựa đề, và các thông tin khác lên tập tin ảnh"
+
+#: ui/shotwell.glade:946
+msgid "Display"
+msgstr "Hiển thị"
+
+#: ui/shotwell.glade:967
+msgid "_Import photos to:"
+msgstr "Nhập ảnh _vào:"
+
+#: ui/shotwell.glade:990
+msgid "_Background:"
+msgstr "Ảnh _nền:"
+
+#: ui/shotwell.glade:1013
+msgid "Importing"
+msgstr "Nhập ảnh"
+
+#: ui/shotwell.glade:1036
+msgid "_Directory structure:"
+msgstr "_Cấu trúc thư mục:"
+
+#: ui/shotwell.glade:1075
+msgid "_Pattern:"
+msgstr "_Mẫu:"
+
+#: ui/shotwell.glade:1157
+msgid "Example:"
+msgstr "Ví dụ:"
+
+#: ui/shotwell.glade:1174
+msgid "R_ename imported files to lowercase"
+msgstr "Đổi _tên tập tin đã nhập sang chữ thường"
+
+#: ui/shotwell.glade:1203
+msgid "RAW Developer"
+msgstr ""
+
+#: ui/shotwell.glade:1238
+msgid "De_fault:"
+msgstr ""
+
+#: ui/shotwell.glade:1292
+msgid "E_xternal photo editor:"
+msgstr "Chương trình sửa ảnh _khác:"
+
+#: ui/shotwell.glade:1308
+msgid "External _RAW editor:"
+msgstr "Chương trình sửa ảnh RAW:"
+
+#: ui/shotwell.glade:1373
+msgid "External Editors"
+msgstr "Chương trình khác"
+
+#: ui/shotwell.glade:1400
+msgid "Plugins"
+msgstr "Trình cắm"
+
+#: ui/shotwell.glade:1469
+msgid "_Delay:"
+msgstr ""
+
+#: ui/shotwell.glade:1485
+msgid "_Transition effect:"
+msgstr ""
+
+#: ui/shotwell.glade:1501
+msgid "Transition d_elay:"
+msgstr ""
+
+#: ui/shotwell.glade:1513
+msgid "Show t_itle"
+msgstr ""
+
+#: ui/shotwell.glade:1603 ui/shotwell.glade:1616
+msgid "seconds"
+msgstr "giây"
+
+#: ui/shotwell.glade:1696
+msgid "_Login"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:21
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:39
+msgid "Publish to an e_xisting album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:57
+msgid "Create a _new album named:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:139
+msgid "Videos and new photo albums _visible to:"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:175
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:102
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:178
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:226
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr ""
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:197
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:137
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:229
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:99
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:116
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:115
+msgid "_Logout"
+msgstr "Đăng _xuất"
+
+#: plugins/shotwell-publishing/facebook_publishing_options_pane.glade:212
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:153
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:243
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:115
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:134
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:129
+msgid "_Publish"
+msgstr "_Xuất bản"
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:16
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_pin_entry_pane.glade:37
+msgid "Authorization _Number:"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:44
+msgid "_visibility label (populated in the code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/flickr_publishing_options_pane.glade:61
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:60
+msgid "Photo _size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:18
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:75
+msgid "An _existing album:"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:94
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:52
+msgid "A _new album named:"
+msgstr "Tê_n mới của album:"
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:113
+msgid "L_ist album in public gallery"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:134
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+
+#: plugins/shotwell-publishing/picasa_publishing_options_pane.glade:150
+msgid "Photo _size preset:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:49
+msgid "_URL of your Piwigo photo library"
+msgstr "Địa chỉ _URL của thư viện ảnh Piwigo"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:59
+msgid "User _name"
+msgstr "Tê_n người dùng"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:73
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:59
+msgid "_Password"
+msgstr "_Mật khẩu"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:130
+msgid "_Remember Password"
+msgstr "_Nhớ mật khẩu"
+
+#: plugins/shotwell-publishing/piwigo_authentication_pane.glade:151
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:107
+msgid "Login"
+msgstr "Đăng nhập"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:40
+msgid "An _existing category:"
+msgstr "Một mục lục đã _tồn tại:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:121
+msgid "Photos will be _visible by:"
+msgstr "Ảnh sẽ được hiển thị _bởi:"
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:149
+msgid "Photo size:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:176
+msgid "within category:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:210
+msgid "Album comment:"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:242
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:258
+msgid "_Do no upload tags"
+msgstr ""
+
+#: plugins/shotwell-publishing/piwigo_publishing_options_pane.glade:278
+msgid "Logout"
+msgstr "Đăng xuất"
+
+#: plugins/shotwell-publishing/youtube_publishing_options_pane.glade:55
+msgid "Video privacy _setting:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:38
+msgid "Copyright 2012 BJA Electronics"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:109
+msgid "1280 x 853 pixels"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:313
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:323
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:561
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:589
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:639
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:760
+#, c-format
+msgid "Could not load UI: %s"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/TumblrPublishing.vala:742
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:24
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:27
+msgid "Visit the Yandex.Fotki web site"
+msgstr "Xem trang web của Yandex.Fotki"
+
+#: plugins/shotwell-publishing-extras/YandexPublishing.vala:635
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "Hiện bạn chưa đăng nhập vào Yandex.Fotki."
+
+#: plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade:49
+msgid "_Email address"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:19
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade:43
+msgid "Blogs:"
+msgstr ""
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:24
+msgid "_Albums (or write new):"
+msgstr "_Album (hoặc ghi mới):"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:38
+msgid "Access _type:"
+msgstr "_Kiểu truy cập:"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:81
+msgid "Disable _comments"
+msgstr "Tắt _bình luận"
+
+#: plugins/shotwell-publishing-extras/yandex_publish_model.glade:96
+msgid "_Forbid downloading original photo"
+msgstr "_Không cho tải ảnh gốc"
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..0caa9bf
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,4589 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+# Translators:
+# Aron Xu <happyaron.xu@gmail.com>, 2012
+# b6i <baddogai@gmail.com>, 2011
+# Guokai Han <dev.hgk@gmail.com>, 2008
+# Jason Lau <dotkrnl@gmail.com>, 2013
+# Leah Liu <lliu@redhat.com>, 2008, 2009
+# Leah Liu <weliu@redhat.com>, 2005, 2006
+# Tommy He <lovenemesis@gmail.com>, 2011
+# Tommy He <lovenemesis@gmail.com>, 2011
+# Sarah Wang <sarahs@redhat.com>, 2003, 2004
+# Tommy He <lovenemesis@gmail.com>, 2012
+# Tommy He <tommy.he@linux.com>, 2010
+# verayin <vera@yorba.org>, 2011
+# Wu Yu <kiluawuyu@gmail.com>, 2007
+# xhacker <liu.dongyuan@gmail.com>, 2011
+# YunQiang Su <wzssyqa@gmail.com>, 2012
+# Yusuf Ma <yusufma77@yahoo.com>, 2004
+# Jason Lau <dotkrnl@gmail.com>, 2013
+# Tommy He <lovenemesis@gmail.com>, 2011
+# Tommy He <lovenemesis@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# Tommy He <lovenemesis@gmail.com>, 2012
+# 甘露(Gan Lu) <rhythm.gan@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-15 20:17+0000\n"
+"PO-Revision-Date: 2014-01-18 17:45+0800\n"
+"Last-Translator: 甘露(Gan Lu) <rhythm.gan@gmail.com>\n"
+"Language-Team: Chinese (Simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "用于发布需要的临时文件不可用"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"在本次 Shotwell 会话中您登录 Google 服务然后退出了。\n"
+"要继续发布到 Google,请退出并重新启动 Shotwell,然后再尝试发布。"
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "访问 Yorba 网站"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr ""
+"Tommy He <tommy.he@linux.com>, 2011\n"
+"zheng7fu2 <zheng7fu2@gmail.com>, 2011\n"
+"Xhacker Liu <liu.dongyuan@gmail.com>, 2011\n"
+"b6i <baddogai@gmail.com>, 2011\n"
+"YunQiang Su <wzssyqa@gmail.com>, 2012\n"
+"Aron Xu <happyaron.xu@gmail.com>, 2012\n"
+"Jason Lau, 刘家昌 <i@dotkrnl.com>, 2013\n"
+"甘露(Gan Lu) <rhythm.gan@gmail.com>, 2014\n"
+"\n"
+"Launchpad Contributions:\n"
+" Aron Xu https://launchpad.net/~happyaron\n"
+" David Gao https://launchpad.net/~davidgao1001\n"
+" H https://launchpad.net/~zheng7fu2\n"
+" Meng Zhuo https://launchpad.net/~mengzhuo1203\n"
+" Qiu Haoyu https://launchpad.net/~timothyqiu\n"
+" Tommy He https://launchpad.net/~tommy-he\n"
+" Vera Yin https://launchpad.net/~vera-yorba\n"
+" Wylmer Wang https://launchpad.net/~wantinghard\n"
+" Xhacker Liu https://launchpad.net/~xhacker\n"
+" YunQiang Su https://launchpad.net/~wzssyqa\n"
+" mike2718 https://launchpad.net/~mike2718\n"
+" slgray https://launchpad.net/~chenlibinpeter-gmail\n"
+" 丁威扬 https://launchpad.net/~dingvyoung"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "版权所有 2009-2013 Yorba Foundation, Yorba 基金会"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"欢迎使用 F-Spot 媒体库导入服务。\n"
+"\n"
+"请选择一个要导入的媒体库,既可以是 Shotwell 找到的现存库,也可以选择其他 F-"
+"Spot 数据库文件。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"欢迎使用 F-Spot 媒体库导入服务。\n"
+"\n"
+"请选择一个 F-Spot 数据库文件。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "手工选择一个要导入的 F-Spot 数据库文件:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr "无法打开选定的 F-Spot 数据库文件:文件不存在或不是 F-Spot 数据库"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"无法打开选定的 F-Spot 数据库文件:Shotwell 不支持此版本的 F-Spot 数据库"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "无法读取选定的 F-Spot 数据库文件:读取标签列表出错"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "无法读取选定的 F-Spot 数据库文件:读取照片出错"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell 在 F-Spot 媒体库中找到 %d 个照片并正在导入它们。重复的文件会被自动去"
+"除。\n"
+"\n"
+"您可以关闭这个会话并开始使用 Shotwell,导入工作将在后台继续进行。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot 媒体库:%s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "正在准备导入"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "核心数据导入服务"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "版权所有 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 像素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 像素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 像素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "'%s' 不是一个有效的 OAuth 授权请求响应"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr "TumblrPublisher: start( ): 无法启动;无法重启该发布器。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "输入和您 Tumblr 账户关联的用户名和密码。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "用户名或密码无效。请重试"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "无效的用户名或密码"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "无法载入 UI:%s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"您登录的 Tumblr 账户为 %s。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "版权所有 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "访问 Yandex.Fotki 网站"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "您当前未登陆至 Yandex.Fotki。"
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell 额外发布服务"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "标签"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "邮箱地址(_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "密码(_)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "登录"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"您正在以 (name) 身份登录 Tumblr.\n"
+"\n"
+"(该标签字符串在源码内产生并设定,\n"
+"因此此处的更改将不会显示)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "博客:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "照片尺寸(_S):"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "注销(_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "发布(_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "已有或新相册(_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "访问类型(_T):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "禁用评论(_C)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "禁止下载原始照片(_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "公开"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "朋友"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "私人"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell 连接"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"您尚未登录 Facebook.\n"
+"\n"
+"如果您没有 Facebook 帐号,可以在登录过程中创建一个。在登陆过程中, Shotwell "
+"Connect 将请求您上传照片和发布到订阅列表的权限。这些权限对于 Shotwell "
+"Connect 的工作是必须的。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"您已经登录了 Facebook 但并不在当前 Shotwell 进程中。\n"
+"继续在 Facebook 上发布,退出并重新启动,然后再次尝试发布。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "标准 (720 像素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "大型 (2048 像素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "正在测试连接到 Facebook..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "创建相册..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "一个发布所需要的文件不存在。无法继续发布至 Facebook。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"您已经作为 %s 登录 Facebook。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "想在哪里发布选中的照片?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "上传大小(_S):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "仅有我"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "所有人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"您目前尚未登录到 Flickr。\n"
+"\n"
+"在您的浏览器中点击“登录”以登录到 Flickr。您必须授权 Shotwell 连接到您"
+"的 Flickr 帐号。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"在本次 Shotwell 会话中您登录了 Flickr 服务然后退出了。\n"
+"要继续发布到 Flickr,请退出并重新启动 Shotwell,然后再尝试发布。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "准备登录..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "一个发布所需要的文件不存在。无法继续发布至 Flickr。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "校验认证信息..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"您已经作为 %s 登录到 Flickr。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"您的 Flickr 免费帐号限制您每月可以上传的数据。\n"
+"本月您的流量限额还剩 %d MB。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "您的 Flickr Pro 帐号让您可以无限上传。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "照片公开给(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "视频公开给(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "照片和视频公开给(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "仅朋友和家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "仅限家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "仅限朋友"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 像素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 像素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "原始尺寸"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"您当前尚未登录 Picasa 网络相册。\n"
+"\n"
+"在您的浏览器中点击登录来完成 Picasa 网络相册等各路。您必须授权 Shotwell "
+"Connect 来连接至您的 Picasa 网络相册。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr "一个发布所需要的文件不存在。无法继续发布至 Picasa。"
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "您已经作为 %s 登录 Picasa 网络相册。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "视频将出现在:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "照片将出现在:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "小 (640 x 480 像素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "中 (1024 x 768 像素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "推荐 (1600 x 1200 像素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 像素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "原始尺寸"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "正在创建相册 %s…"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "在发布至 Piwigo 时发生了错误,请重试。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr "输入您 Piwigo 照片库的 URL 以及对应 Piwigo 照片库相关的用户名和密码。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr "Shotwell 无法连接至您的 Piwigo 照片库。请检查您输入的 URL。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "无效的 URL"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "管理员,家人,朋友,联系人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "管理员,家人,朋友"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "管理员,家人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "管理员"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"您尚未登录 YouTube。\n"
+"\n"
+"您必须已经注册了一个 Google 帐号并设置为使用 YouTube 才能继续。您可以通过浏览"
+"器设置绝大多数帐号并至少登录 YouTube 一次。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "一个发布所需要的文件不存在。无法继续发布至 YouTube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "您已经作为 %s 登录 YouTube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "视频将出现在“%s”"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "公开列出"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "公开未列出"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+"(文本依赖于 FB 用户名,已在程序中修改 -\n"
+"在此输入此框内的一切均不会显示)"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "发布到已有相册(_X):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "创建一个新相册名为(_N):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "视频和新照片相册可见于(_V):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "上传前去除照片的地理位置、相机型号和其他可供辨认的信息(_R)"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "输入您使用网页浏览器登录 Flickr 后出现的确认码。"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "认证码(_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "继续(_T)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"您已登录到 Flickr 的 (name) 用户。\n"
+"\n"
+"(这个标签串设定于代码中\n"
+"在此的改变不会被显示)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr "可见度标签 (代码中)(_V)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'您已登录为 $name'\n"
+"(程序代码中)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "一个已有的相册(_E):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "一个新相册(_N):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "显示公开相片库里的相册(_I)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype 会被显示于\n"
+"(代码中)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "预置照片尺寸(_S):"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "您的 Piwigo 照片库 _URL(_)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "用户名(_)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "记住密码(_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "一个已有的分类(_):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "照片可见(_V):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "照片尺寸:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "在以下分类中:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "相册备注:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "如果有标题而没有备注,将标题作为备注(_I)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "不上传标签(_D)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "登出"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "发布"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "主要上传服务"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "视频隐私设置(_S):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "百叶窗"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "茄子"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "圈子"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "圆圈"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "时钟"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "碎片"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "渐出"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "幻灯片演示"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "方格"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "条纹"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "主要幻灯片变换"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr ""
+"Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation, Yorba "
+"基金会版权所有"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "无法创建缓存目录 %s:%s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "无法创建数据文件夹 %s:%s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "图片"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "无法创建临时文件夹 %s:%s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "无法创建数据子文件夹 %s:%s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "固定工具栏"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "将工具栏固定为打开"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "退出全屏"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "退出全屏(_F)"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "退出(_Q)"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "关于(_A)"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "全屏(_C)"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "目录(_C)"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "常见问题(_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "汇报问题(_R)…"
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"访问 Shotwell 媒体库时出现致命错误。Shotwell 无法继续。\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "无法显示帮助 %s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "无法转向 Bug 数据库:%s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "无法显示常见问题 %s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "成功"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "文件错误"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "无法解码文件"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "数据库错误"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "用户中止导入"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "不是一个文件"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "文件已存在于数据库中"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "不支持的文件格式"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "不是照片文件"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "磁盘错误"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "磁盘已满"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "相机错误"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "文件写入错误"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "损坏的图片"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "导入失败(%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "幻灯片演示(_L)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "开始幻灯片播放"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "导出照片/视频"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "导出照片/视频"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "导出照片"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "导出照片"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "正在旋转"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "正在取消旋转"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "正在水平翻转"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "正在取消水平翻转"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "正在垂直翻转"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "正在取消垂直翻转"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "正在还原"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "正在取消还原"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "正在增强"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "正在取消增强"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "应用颜色变换"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "撤销颜色变换"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "正在创建新的事件"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "正在移除事件"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "正在移动照片到新事件"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "正在设置照片至先前的事件"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "正在合并"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "正在取消合并"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "正在创建照片副本"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "正在移除照片副本"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "由于文件错误无法创建 %d 照片副本"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "恢复先前评分"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "提高评分"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "降低评分"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "设置 RAW 开发者"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "恢复原先的 RAW 开发者"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "设置开发人员"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "无法修改原始照片。"
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "正在调整日期和时间"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "正在取消日期和时间调整"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "无法修改下列原始照片。"
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "时间调整出错"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "时间修改无法在以下照片上取消。"
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "创建标签"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "移动标签 %s"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "移动照片至回收站"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "从回收站还原照片"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "将照片移至 Shotwell 回收站"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "恢复这些照片到 Shotwell 媒体库"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "正在将照片移动到回收站"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "正在从回收站还原照片"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "标注选定照片"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "取消标注选定照片"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "正在标注选定照片"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "正在取消标注选定照片"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "标注"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "取消标注"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "无法启动 Nautilus 文件管理器的发送至:%s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "发送至"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "不能输出为背景到 %s:%s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "无法准备桌面幻灯片:%s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "这将移除标签 \"%s\" 从 %d 张照片中。继续么?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "删除(_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "这将移除已保存搜索 %s。是否继续?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "切换开发者将撤销您对于此照片所作的全部更改"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "切换开发者(_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "导出视频"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr "Shotwell 无法为编辑此照片创建必需的文件,因为您没有写入 %s 的权限。"
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"由于文件错误无法导出以下照片。\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"您想要继续导出吗?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "未修改的"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "当前"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "格式(_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "质量(_Q):"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "缩放限制(_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr " 像素(_P)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "导出元数据"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "保存详细信息..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "保存详细信息..."
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(和另外 %d 个)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "导入结果报告"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "尝试导入 %d 个文件。"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "其中,%d 个文件被成功导入。"
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "以下重复的照片/视频没有被导入:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "创建现有媒体文件的副本"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "照片/视频因为相机错误而未被导入:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "错误信息:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "以下文件因为它们不被识别为照片或视频而未被导入:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "以下照片/视频因为它们不是 Shotwell 识别的格式而未被导入:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr "以下照片/视频因为 Shotwell 无法拷贝它们而未被导入:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr "无法将 %s⏎ »拷贝到 %s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "以下照片/视频因为文件损坏而未被导入:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "因为其他原因而未被导入的照片/视频:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d 个重复的照片没有导入:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d 个重复的视频没有导入:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d 个重复的照片/视频没有导入:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d 个照片由于文件或硬件错误导入失败:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d 个视频由于文件或硬件错误导入失败:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "%d 个照片/视频由于文件或硬件错误导入失败:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "%d 文件导入失败由于文件或硬件错误:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d 个照片由于无法写入媒体库导入失败:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d 个视频由于无法写入媒体库导入失败:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d 个照片/视频由于无法写入媒体库导入失败:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "%d 文件导入失败因为照片库文件夹不可写入:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "%d 个照片由于相机错误导入失败:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "%d 个视频由于相机错误导入失败:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "%d 个照片/视频由于相机错误导入失败:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d 文件导入失败由于相机错误:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d 个照片由于文件损坏导入失败:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 个视频由于文件损坏导入失败:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 个照片/视频由于文件损坏导入失败:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d 文件由于损坏导入失败:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "跳过 %d 个不支持的照片:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "跳过 %d 个非照片文件。\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "由于用户取消跳过 %d 个照片:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "由于用户取消跳过 %d 个视频:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "由于用户取消跳过 %d 个照片/视频:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d 文件被跳过由于用户取消:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "%d 个照片成功导入。\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "%d 个视频成功导入。\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "%d 个照片/视频成功导入。\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "没有导入照片或视频。\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "导入完成"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 秒"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 分钟"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 小时"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 天"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "重命名事件"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "名称:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "编辑标题"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "标题:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "修改事件备注"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "修改照片/视频备注"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "备注:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "移至垃圾箱(_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "只移除(_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "保留(_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "恢复额外修改?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "恢复额外修改?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "这将毁掉对于 %d 个外部文件所做的全部修改。继续?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "恢复额外修改(_V)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "恢复额外修改(_V)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "这将从媒体库中移除 %d 张照片中。继续么?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "从照片库移除照片"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "从照片库移除照片"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "上午"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "下午"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 小时"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "按照同样大小调整照片/视频(_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "设置所有照片/视频到这个时间(_A)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "修改原始照片文件(_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "修改原始照片文件(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "修改原始文件(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "修改原始文件(_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "原始:"
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d %p%I:%M:%S"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光时间将会向较早时改变 \n"
+"%d %s、%d %s、%d %s 和 %d %s。"
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光时间将会向较晚时改变 \n"
+"%d %s、%d %s、%d %s 和 %d %s。"
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "日"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小时"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分钟"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "秒"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"和另外 %d 个。"
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "标签(由逗号分割):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "欢迎!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "欢迎使用 Shotwell !"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "要开始使用,请用以下任意一种方式导入照片:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "选择 <span weight=\"bold\">文件 %s 从文件夹导入</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "拖放照片到 Shotwell 窗口中"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "链接相机到电脑上并导入"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "从您的 %s 文件夹导入照片(_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "您可以使用以下任意方式导入照片:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "不再显示该消息(_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "从您的 %s 照片库导入照片"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(帮助)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "年%s月%s日"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "年%s月"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "年%s月-日"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "年-月-日"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "自定义"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "无效的样式"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr "Shotwell 可以复制照片到您的媒体库,或者可以导入但并不复制。"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "复制照片(_P)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "保留原位置导入(_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "导入到媒体库"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "从媒体库移除"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "正在从媒体库移除照片"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "从照片库移除照片"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"将从 Shotwell 媒体库移除 %d 个照片/视频。你也想要从将这些文件移至桌面垃圾箱"
+"么?\n"
+"\n"
+"该操作将不可撤销。"
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"将从 Shotwell 媒体库移除 %d 个视频。你也想要从将这些文件移至桌面垃圾箱么?\n"
+"\n"
+"该操作将不可撤销。"
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"将从 Shotwell 媒体库移除 %d 个照片。你也想要从将这些文件移至桌面垃圾箱么?\n"
+"\n"
+"该操作将不可撤销。"
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "%d 个照片/视频无法移动到您的桌面回收站。删除这些文件?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d 照片/视频无法被删除。"
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "宽度或者高度"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "宽度"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "高度"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "无法监视 %s:不是一个目录(%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "事件 %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "无法为 %s 生成临时文件:%s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "正在导出"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "文件 %s 已存在。是否替换?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "跳过(_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "替换(_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "全部替换(_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "导出"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "无法进行监控更新:%s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "改变缩略图大小"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "放大(_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "放大缩略图"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "缩小(_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "缩小缩略图"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "照片排序(_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "播放视频(_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "在系统视频播放器中打开选定视频"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "开发人员(_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "相机"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "标题(_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "显示每张照片的标题"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "备注(_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "显示每张照片的备注"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "标签(_G)"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "显示每张照片的标签"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "按照标题(_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "按照标题排序"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "按照曝光日期(_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "按照曝光日期排序"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "按照评分(_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "按照评分排序"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "升序(_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "按照升序排列照片"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "降序(_D)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "按照降序排列照片"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell 无法播放选中视频:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "没有照片/视频"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "没有找到照片或视频"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "照片不可以被导出到该文件夹。"
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "修改"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "上一张照片"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "下一张照片"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "照片源文件丢失:%s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "查看(_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "工具(_O)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "前一张照片(_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "前一张照片"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "下一张照片(_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "下一张照片"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "放大缩略图"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "缩小缩略图"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "适合页面(_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "缩放照片以适合屏幕"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "缩放 _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "缩放照片至 100% 比例"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "缩放 _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "缩放照片至 200% 比例"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "无法导出 %s:%s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "填充整个页面"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "每页 2 张"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "每页 4 张"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "每页 6 张"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "每页 8 张"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "每页 16 张"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "每页 32 张"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "英寸"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "厘米"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "用于皮夹(2 x 3 英寸)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "留言卡(3 x 5 英寸)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 英寸"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 英寸"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 英寸"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 英寸"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 英寸"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "用于皮夹(9 x 13 厘米)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "明信片(10 x 15 厘米)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 厘米"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 厘米"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 厘米"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 厘米"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 厘米"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "图像设置"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "打印中..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"无法打印照片:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "今天"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "昨天"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "项目:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d 个事件"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d 个照片"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d 个视频"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "日期:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "时间:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "从:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "到:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "大小:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "持续时长:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f 秒"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "开发者:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "曝光:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "地点:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "文件大小:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "当前开发:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "原始尺寸:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "相机厂商:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "相机型号:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "闪光灯:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "焦距:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "曝光日期:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "曝光时间:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "曝光偏差:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS 纬度:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS 经度:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "艺术家:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "版权:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "软件:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "扩展信息"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "照片管理器"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "照片查看器"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "向右旋转(_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "旋转"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "向右旋转"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "向右旋转照片(按住 Ctrl 向左旋转)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "向左旋转(_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "向左旋转"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "向左旋转照片"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "水平翻转(_Z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "水平翻转"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "竖直翻转(_C)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "竖直翻转"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "增强(_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "增强"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "自动增强照片的观感"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "复制颜色调整(_C)"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "复制颜色调整"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "复制应用于照片的颜色调整"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "粘贴颜色调整(_P)"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "粘贴颜色调整"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "将复制的颜色调整应用于选定的照片"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "剪裁(_C)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "剪裁"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "剪裁照片尺寸"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "校正(_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "校正"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "校正照片"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "红眼(_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "红眼"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "降低或去除照片上的红眼效果"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "调整(_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "调整"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "调整照片的色彩和色调"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "恢复到原始(_V)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "恢复到原始"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "恢复额外修改(_D)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "恢复到主照片"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "设置为桌面背景(_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "设置选定照片为新的桌面背景"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "设置为桌面幻灯片(_D)..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "取消(_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "取消"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "重做(_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "重做"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "重新命名事件(_N)..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "为事件创建关键照片(_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "创建事件关键照片"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "新建事件(_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "新建事件"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "移动照片"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "将照片移动到一个事件"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "合并事件(_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "合并"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "将多个事件合并为一个"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "设置评分(_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "设置评分"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "改变您照片的评分"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "提高(_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "提高评分"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "降低(_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "降低评分"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "未评分(_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "未评分"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "未评分"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "设置为未评分"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "移除任何评分"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "次品(_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "次品"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "评为次品"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "设置为次品"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "设置评分为次品"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "仅次品(_R)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "仅次品(_R)"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "只显示次要的照片"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "全部为次品(_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "显示所有照片,包括次品"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "所有照片(_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "显示所有照片"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "评分(_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "显示每张照片的评分"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "过滤照片(_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "过滤照片"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "限制在过滤条件下显示的照片数量"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "副本(_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "副本"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "创建照片副本"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "导出(_E)..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "打印(_P)..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "发布(_B)..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "将所选照片发布到各种网站上"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "编辑标题(_T)..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "编辑备注(_C)..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "修改备注"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "修改事件备注(_C)"
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "修改日期和时间(_A)..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "修改日期和时间"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "添加标签(_T)..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "添加标注(A)…"
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "添加标签"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "首选项(_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "用外部编辑器打开(_X)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "用 RA_W 编辑器打开"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "发送至(_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "发送至(_O)…"
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "查找(_F)..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "查找"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "依据名称或者标签查找图片"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "标注(_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "取消标注(_F)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "无法启动编辑器:%s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "添加标签 %s"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "添加标签 %s 和 %s"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "删除标签 %s (_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "删除标签 %s"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "删除标签"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "新建(_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "重命名标签 %s (_N)..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "重命名标签 %s 为 %s"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "重命名(_R)..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "修改标签(_Y)..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "修改标签"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "为照片添加标签 %s"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "为照片添加标签 %s"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "为选中的照片添加标签 %s"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "为选中的照片添加标签 %s"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "从照片移除标签 %s (_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "从照片移除标签 %s (_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "从照片移除标签 %s"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "从照片移除标签 %s"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "无法重命名标签为 %s,同名标签已存在。"
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "无法重命名搜索为 %s,同名搜索已存在。"
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "保存搜索"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "删除搜索"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "编辑(_E)..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "重命名(_N)..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "重命名搜索 %s 为 %s"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "删除搜索 %s"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "评分 %s"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "设置评分为 %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "设置评分为 %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "显示 %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "只显示评分为 %s 的照片"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s 或更高"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "显示 %s 或更高"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "只显示评分为 %s 或更高的照片"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "从回收站中移除选中照片"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "从媒体库移除选定照片"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "还原(_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "将选定照片移回至媒体库"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "在文件管理器显示(_G)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "在文件管理器中打开选定照片目录"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "无法在文件管理器中打开:%s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "从媒体库移除(_E)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "移至回收站(_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "选择全部(_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "选择全部项目"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%-I:%M %p"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%-I:%M:%S %p"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%Y年%m月%d日%A"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%m月%d日%A"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%Y年%m月%d日"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "幻灯片放映"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "已标注"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "照片"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "视频"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW 照片"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW 照片"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "载入 UI 文件 %s 时出错:%s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "类型"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "评分"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "设置"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "后退"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "跳到上一张照片"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "暂停"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "暂停幻灯片演示"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "前进"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "跳到下一张照片"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "改变幻灯片演示设置"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "所有的照片源文件丢失。"
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "播放"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "继续幻灯片演示"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "未命名"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "导出视频"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "相机"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "不能卸载相机。请尝试从文件管理器中卸载相机。"
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "隐藏已经导入的照片"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "只显示尚未导入的照片"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "正在开始导入,请稍候..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "导入选中项目(_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "导入选定的照片到您的媒体库"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "导入全部(_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "导入所有照片到您的媒体库"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "Shotwell 需要从文件系统卸载相机来访问它。是否继续?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "卸载(_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "请卸载相机。"
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"该相机被其他程序锁定,仅在解锁后 Shotwell 才能访问。请关闭其他使用该相机的程"
+"序后重试。"
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "请关闭其他使用该相机的程序。"
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"无法从相机获取预览:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "卸载..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "获取照片信息"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "获取 %s 的预览"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "无法锁定相机:%s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "从相机删除 %d 张照片?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "从相机删除这 %d 个视频?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "从相机删除 %d 个照片/视频?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "从相机删除 %d 个文件?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "正在从相机移除照片/视频"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "由于错误无法从相机中删除 %d 个照片/视频。"
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "数据导入"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s 数据库"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "发生错误,无法继续导入 %s:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "要尝试从其他服务导入,请从上面的菜单中选择一个。"
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"您没有启用任何数据导入插件。\n"
+"\n"
+"要使用从应用程序导入数据的功能,您需要至少启用一个数据导入插件。您可在首选想"
+"对话框中启用插件。"
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "数据库文件:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "导入(_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "从应用程序导入"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "从以下位置导入媒体(_F):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "关闭(_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "无法打开/创建照片数据库 %s:错误代码 %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"无法写入照片数据库文件:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"访问数据库文件错误:\n"
+"%s\n"
+"\n"
+"错误是:\n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "文件(_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "保存(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "保存照片"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "另存为(_A)..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "以其他名字保存照片"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "使用连接到此电脑的打印机打印照片"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "编辑(_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "照片(_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "帮助(_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s 不存在。"
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s 不是一个文件。"
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr "%s 不支持 %s 类型的文件。"
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "保存副本(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "放弃对 %s 的更改?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "关闭但不保存(_W)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "保存 %s 时出错:%s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "另存为"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "回到当前照片尺寸"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "对这张照片进行剪裁"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "在肖像和风景方向上旋转剪裁矩形"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "不限制"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "方形"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "屏幕"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "标清视频(4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "高清视频(16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "书信 (8.5 x 11 英寸)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "小型海报 (11 x 17 英寸)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 毫米)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 毫米)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "关闭红眼工具"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "移除在选定区域内的所有红眼效果"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "重置(_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "饱和度:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "色彩:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "色温:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "阴影:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "高亮:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "重置颜色"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "将所有颜色修正重置至原始值"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "色温"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "色彩"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "饱和度"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "曝光"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "阴影"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "高亮"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "对比度扩展"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "角度:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d 个照片/视频"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "没有事件"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "显示每个事件的备注"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "没有事件"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "没有找到事件"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "事件"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "取消隐藏"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%m"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "文件夹"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "媒体库"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "导入..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "停止导入(_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "停止导入照片"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "准备导入..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "已导入 %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "最近导入"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "从文件夹导入(_I)..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "从磁盘导入照片到媒体库"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "从应用程序导入(_A)..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "排列事件(_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "清空回收站(_R)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "删除在回收站中的全部照片"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "查看照片所属活动(_N)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "查找(_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "按照规则查找照片和视频"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "新建保存搜索(_W)..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "照片(_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "活动(_T)"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "基本信息(_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "显示所选项的基本信息"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "扩展信息(_X)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "显示所选项的扩展信息"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "搜索栏(_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "显示搜索栏"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "侧边栏(_S)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "显示侧边栏"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "从文件夹导入"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "清空回收站"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "正在清空回收站..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell 配置为将照片导入到您的主文件夹。\n"
+"我们推荐您在 <span weight=\"bold\">编辑 %s 首选项</span>中更改此设置。\n"
+"您想继续导入照片吗?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "媒体库位置"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "无法从此文件夹导入照片。"
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "更新媒体库..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "准备自动导入照片..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "自动导入照片..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "写入元数据到文件..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "丢失文件"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "删除..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "回收站"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "回收站为空"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "刪除"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "删除照片"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"您的媒体库和当前版本的 Shotwell 不兼容。它似乎是由 Shotwell %s (schema %d)创"
+"建的,而当前版本是 %s (schema %d) 。请使用最新版本的 Shotwell。"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell 无法将您的媒体库从 %s (schema %d)版本升级到 %s (schema %d)版本。更多"
+"的信息请查询 Shotwell 维基 %s"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"您的媒体库和当前版本的 Shotwell 不兼容。它似乎是由 Shotwell %s (schema %d)创"
+"建的。当前版本是 %s (schema %d)。请删除 %s 来释放您的照片库然后重新导入照片。"
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "验证 Shotwell 数据库时发生未知错误:%s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "正在载入 Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell 程序数据目录"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "文件夹"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "请勿在程序运行时监视文件夹变化"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "不显示启动进程条"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "显示程序版本"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[文件]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "运行 '%s --help' 来查看可用命令行选项的完整列表。\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "低(%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "中(%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "高(%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "最大(%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "发布"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "准备上传"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "正在上传 %d/%d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "无法继续发布到 %s 因为发生了一个错误:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "尝试发布到其他的服务,从上面的菜单中选择一个。"
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "选中的照片/视频已经成功发布。"
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "选中的视频已经成功发布。"
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "选中照片已经成功发布。"
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "选中的视频已经成功发布。"
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "选中的照片已经成功发布。"
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "获取帐号信息..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "正在登录……"
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "发布照片"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "发布照片到(_T):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "发布视频"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "发布视频到(_T)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "发布照片和视频"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "发布照片和视频到(_T)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "无法发布"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell 无法发布选定项目,因为您尚未启用兼容的发布插件。要修复此问题,请选择"
+"<b>编辑 %s 首选项</b>,并且在<b>插件</b>标签页中启用一个或多个发布插件。"
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "已保存搜索"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "包含"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "必须有"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "以开始"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "结束以"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "不包含"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "未设为"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "是"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "不是"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "任意照片"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "一个 RAW 照片"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "一个视频"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "有"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "没有"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "修改"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "内部修改"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "外部修改"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "已标注"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "未标注"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "及更高"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "仅"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "及更低"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "晚于"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "先于"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "介于"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "和"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "任何"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "全部"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "无"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "任意文字"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "标题"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "标签"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "备注"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "事件名称"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "文件名"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "媒体类型"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "标注状态"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "照片状态"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "日期"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "新建标签(_T)..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "幻灯片过渡"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(无)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "无"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "随机"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "标签"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "设置为桌面幻灯片"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "生成桌面背景幻灯片"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "显示每张照片为"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "时间段"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "每张照片在桌面背景上出现多长时间"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "搜索"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "搜索名称(_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "匹配(_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "以下这些:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>印刷尺寸</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "使用标准尺寸(_S):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "使用自定义尺寸(_U):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "匹配照片比例(_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "自动(_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>标题</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "打印图像标题(_T)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>像素分辨率</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "输出照片为(_O):"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "每英寸像素数"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell 首选项"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "白"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "黑"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "监视媒体库文件夹中的新文件(_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "元数据"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "写入标签、标题和其他元数据到照片文件(_M)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "显示"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "导入照片到(_I):"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "背景(_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "导入中"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "目录结构(_D):"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "范例(_P):"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "例如:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "将导入文件以小写重命名(_E)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW 开发者:"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "默认(_F):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "外部照片编辑器(_X):"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "外部 RAW 编辑器(_R):"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "外部编辑器"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "插件"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "延时(_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "过渡效果(_T):"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "过渡延时(_E):"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "显示标题(_I)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "秒"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "登录(_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr "Shotwell 被配置为从您的主目录导入照片。\n"
diff --git a/po/zh_HK.po b/po/zh_HK.po
new file mode 100644
index 0000000..b67563a
--- /dev/null
+++ b/po/zh_HK.po
@@ -0,0 +1,4533 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# yevlempy <yevlempy@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-20 23:11+0000\n"
+"PO-Revision-Date: 2014-01-28 20:28+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/"
+"shotwell/language/zh_TW/)\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "發布所需的某暫存檔無法使用"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"你已在 Shotwell 工作階段中登入並登出 Google 服務。\n"
+"\n"
+"若要繼續發布至 Google 服務,請先退出 Shotwell 並重新啟動,接着再重試發布。."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "造訪 Yorba 網站"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr "Cheng-Chia Tseng <pswo10680@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "著作權 2009-2013 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"歡迎光臨 F-Spot 珍藏館匯入服務。\n"
+"\n"
+"請選取要匯入的珍藏館,你可以選取 Shotwell 找到的既有珍藏館之一,或是選取其他 F-Spot 資料庫檔案。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"歡迎光臨 F-Spot 珍藏館匯入服務。\n"
+"\n"
+"請選取一個 F-Spot 資料庫檔案。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "手動選取要匯入的 F-Spot 資料庫檔案:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr "無法開啟所選的 F-Spot 資料庫檔案:檔案不存在或不是 F-Spot 資料庫"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr "無法開啟所選的 F-Spot 資料庫檔案:這個版本的 F-Spot 資料庫不受 Shotwell 支援"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "無法讀取所選的 F-Spot 資料庫檔案:當讀取標籤表時發生錯誤"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "無法讀取所選的 F-Spot 資料庫檔案:當讀取相片表時發生錯誤"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell 已從 F-Spot 珍藏館中找到 %d 張相片,目前正在匯入。複本會被自動偵測出來並移除。\n"
+"\n"
+"你可以關閉對話盒並繼續使用 Shotwell,匯入程序會在背景執行。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot 珍藏館:%s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "正在準備匯入"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "核心資料匯入服務"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "著作權 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "「%s」不是個對 OAuth 驗證請求的有效回應"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr "TumblrPublisher: start( ):無法啟動;此發布器不能重新啟動。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "請輸入與你 Tumblr 帳戶相關聯的使用者名稱與密碼。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "使用者名稱與/或密碼無效。請重試"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "無效的使用者名稱或密碼"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "無法載入使用者介面:%s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"你正以 %s 的身份登入 Tumblr。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "著作權 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "造訪 Yandex.Fotki 網站"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "你目前尚未登入 Yandex.Fotki。"
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell 額外發布服務"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "標籤"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "電子郵件位址(_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "密碼(_P)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "登入"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"你正以 (name) 的身份登入 Tumblr。\n"
+"\n"
+"(此標籤的字串會被抽出並在代碼中設定,\n"
+"所有這裏所作的改變都不會顯示出來)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "網誌:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "相片大小(_S):"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "登出(_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "發布(_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "相簿 (或寫入新的)(_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "存取類型(_T):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "停用評論(_C)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "禁止下載原始相片(_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "發布"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "朋友"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "私人"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell 連線"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"你目前尚未登入 Facebook。\n"
+"\n"
+"若你尚未擁有 Facebook 帳號,你可以在登入程序內置立一份帳號。在登入期間,Shotwell Connect 可能會詢問你上傳相片並且發布至你饋流的許可。Shotwell Connect 需要取得這些許可權限才能運作。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"你已經在此 Shotwell 作業階段內登入過並接着登出 Facebook。\n"
+"若要繼續發布至 Facebook,請退出並重新啟動 Shotwell,接着再次嘗試發布。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "標準 (720 畫素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "大 (2048 畫素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "正在測試至 Facebook 的連線..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "正在建立相簿..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Facebook。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"你正在以 %s 身分登入 Facebook。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "你想要在何處發布所選的相片?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "上傳大小(_S):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "只有我"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "每個人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"你目前尚未登入 Flickr。\n"
+"\n"
+"點擊「登入」來從你的網絡瀏覽器中登入 Flickr。你必須授權 Shotwell Connect 可以連結至你的 Flickr 帳號。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"你已經在此 Shotwell 作業階段內登入過並接着登出 Flickr。\n"
+"若要繼續發布至 Flickr,請退出並重新啟動 Shotwell,接着再次嘗試發布。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "正在準備登入..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Flickr。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "正在驗證授權..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"你正在以 %s 身分登入 Flickr。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"你的免費 Flickr 帳號限制你每月只能上傳某個量的資料。\n"
+"這個月,你的上傳配額剩餘 %d MB。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "你的 Flickr Pro 帳號賦予你無限制的上傳量。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "誰能看見這些相片(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "誰能看見這些視像(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "誰能看見這些相片與視像(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "僅朋友與家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "僅家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "僅朋友"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 畫素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 畫素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "原始大小"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"你目前尚未登入 Picasa 網頁相簿。\n"
+"\n"
+"請在你的網頁瀏覽器中點擊「登入」以登入 Picasa 網頁相簿。你必須授權 Shotwell Connect 連結你 Picasa 網頁相簿的帳戶。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Picasa。"
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "你已經以 %s 的身份登入 Picasa 網絡相簿。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "視像將顯現於:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "相片將顯現於:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "小 (640 x 480 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "中 (1024 x 768 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "建議 (1600 x 1200 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "原始比例"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "正在建立 %s 相簿..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "當發布至 Piwigo 時得到錯誤訊息。請重試。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr "輸入你 Piwigo 相片珍藏館的網址,以及與該珍藏館相關聯的 Piwigo 帳戶其使用者名稱、密碼。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr "Shotwell 無法聯絡你的 Piwigo 相片珍藏館。請驗證你輸入的網址是否正確。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "無效的網址"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "管理員、家人、朋友、聯絡人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "管理員、家人、朋友"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "管理員、家人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "管理員"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"你目前尚未登入 YouTube。\n"
+"\n"
+"你必須已經註冊 Google 帳號並將它設定好可以使用 YouTube 才能繼續。對大多數的帳號來說,你都可以使用瀏覽器登入 YouTube 至少一次來將它設定好。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Youtube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "你正在以 %s 身分登入 YouTube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "視像將「 %s」內顯現"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "公開且列出"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "公開但不列出"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (文字所根據賴的是 FB 使用者名稱,由程式中修改 - \n"
+"任何輸入於此欄位的字皆不會顯示)"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "發布至現存相簿(_X):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "建立新相簿並命名為:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "誰能看見這些視像與新的相簿(_V):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "上傳前先移除地理位置、相機、以及其他可供辨識的資訊(_R)"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "請輸入你登入 Flickr 後在你瀏覽器中出現的確認號碼。"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "授權號碼(_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "繼續(_T)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"你已登入 Flickr,帳號為 (name)。\n"
+"\n"
+"(此標籤的字串會在代碼內部中取出並設定,\n"
+"因此此處所作的改動皆不會顯示)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr "_可見性標籤 (在代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'你正以 $name 身份登入'\n"
+"(在應用程式代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "現存的相簿(_E):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "新相簿名為(_N):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "於公眾圖庫內列出相簿(_I)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype 會出現於\n"
+"(在代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "相片大小預先設定(_S):"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "你 Piwigo 相片庫的網址(_U)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "使用者名稱(_N)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "記住密碼(_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "現有的分類(_E):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "相片會出現於(_V):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "相片大小:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "類別:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "相簿評註:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "如果有設定標題但未設定評註,則使用標題作為評註(_I)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "不要上傳標籤(_D)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "登出"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "發布"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "核心發布服務"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "視像私隱設定值(_S):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "百葉窗"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "棋盤"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "圓"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "圓"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "時鐘"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "崩解"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "淡化"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "滑過"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "方"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "條帶"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "核心投影秀轉場"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "著作權 2010 Maxim Kartashev,著作權 2011-2013 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "無法建立快取目錄 %s:%s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "無法建立資料目錄 %s:%s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "圖片"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "無法建立暫時目錄 %s:%s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "無法建立資料子目錄 %s:%s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "釘住工具列"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "開啟釘住工具列功能"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "離開全螢幕"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "離開全螢幕(_F)"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "退出(_Q)"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "關於(_A)"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "全螢幕(_C)"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "內容(_C)"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "常見問答集(_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "匯報問題(_R)..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"存取 Shotwell 的珍藏館時遭遇到嚴重錯誤。Shotwell 無法繼續執行。\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "無法顯示幫助:%s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "無法瀏覽錯誤資料庫:%s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "無法顯示 FAQ:%s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "成功"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "檔案錯誤"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "無法解碼檔案"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "資料庫錯誤"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "使用者已放棄匯入"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "不是檔案"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "檔案已經存在於資料庫"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "未支援的檔案格式"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "不是影像檔"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "磁碟失敗"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "磁碟已滿"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "相機錯誤"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "檔案寫入發生錯誤"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "損毀影像檔"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "匯入失敗 (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "投影秀(_L)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "播放投影秀"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "匯出相片/視像"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "匯出相片/視像"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "匯出相片"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "匯出相片"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "正在旋轉"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "正在復原旋轉"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "正在水平翻轉"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "正在復原水平翻轉"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "正在垂直翻轉"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "正在復原垂直翻轉"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "正在還原"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "正在復原還原"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "正在優化"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "正在復原優化"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "正在套用色彩轉換"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "正在復原色彩轉換"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "正在建立新事件"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "正在移除事件"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "正在將相片移動至新事件"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "正在將相片設定為上個事件"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "正在合併"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "正在取消合併"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "正在製作相片複本"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "正在移除相片複本"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "由於檔案錯誤,無法製作 %d 張相片的複本"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "正在復原前次評等"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "正在增加評等"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "正在降低評等"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "正在設定 RAW 顯影器"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "正在還原前個 RAW 顯影器"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "設定顯影器"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "無法調整原始相片。"
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "正在調整日期與時間"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "正在復原日期與時間調整"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "下列原始相片無法調整。"
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "時間調整發生錯誤"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "下列相片檔案的時間調整無法復原。"
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "建立標籤"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "移動標籤「%s」"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "將相片移至回收筒"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "從回收筒還原檔案"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "將相片移至 Shotwell 回收筒"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "將相片還原至 Shotwell 珍藏館"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "正在將相片移至回收筒"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "正在從回收筒還原相片"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "將所選相片加上旗幟"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "移除所選相片的旗幟"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "正為所選相片加上旗幟"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "正為所選相片移除旗幟"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "加上旗幟"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "移除旗幟"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "無法啟動 Nautilus 的「傳送到」功能:%s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "傳送至"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "無法將背景匯出至 %s:%s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "無法預備桌面投影秀:%s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "這會移除「%s」標籤,共 %d 張相片。要繼續嗎?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "刪除(_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "這會移除儲存的「%s」搜尋。要繼續嗎?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "切換顯影器將取消所有你在 Shotwell 中對此相片中所做過的更改動作"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "切換顯影器(_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "匯出視像"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr "因為你尚未獲取寫入 %s 的授權,Shotwell 無法建立檔案以供此相片編輯。"
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"由於檔案錯誤,無法匯出下列相片。\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"你想要繼續匯出嗎?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "未修改"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "目前"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "格式(_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "品質(_Q):"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "縮放限制(_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "畫素(_P)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "匯出中介資料"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "儲存細節..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "儲存細節"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(還有 %d 項)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "匯入成果報告"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "試圖匯入 %d 份檔案。"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "其中有 %d 份檔案已成功匯入。"
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "重複的相片/視像並未匯入:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "媒體項目與既有媒體重複"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "相片/視像因相機錯誤而未匯入:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "錯誤訊息:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "檔案因無法辨識出是相片或視像而未匯入:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "相片/視像因格式並非 Shotwell 所能認識而未匯入:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr "相片/視像因 Shotwell 無法將它們複製到珍藏館中而未匯入:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"無法將 %2$s\n"
+"\t複製到 %1$s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "相片/視像因檔案損毀而未匯入:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "相片/視像因其他原因而未匯入:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d 份相片複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d 份視像複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d 份相片/視像複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬件錯誤,%d 張相片匯入失敗:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬件錯誤,%d 份視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬件錯誤,%d 份相片/視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬件錯誤,%d 份檔案未能匯入:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份相片/視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份檔案未能匯入:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 張相片匯入失敗:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 份視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 份相片/視像匯入失敗:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d 份檔案因相機錯誤而未能匯入:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d 張相片因相片損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 份視像因視像損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 份相片/視像因損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d 份檔案因損毀而未能匯入:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "已略過 %d 張未支援相片:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "已略過 %d 份非影像檔案。\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 張相片:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 份視像:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 份相片/視像:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d 檔案已略過,因為使用者取消:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 張相片。\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 份視像。\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 份相片/視像。\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "沒有匯入相片或視像。\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "完成匯入"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 秒"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 分鐘"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 小時"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 天"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "重新命名事件"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "名稱:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "編輯標題"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "標題:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "編輯事件評註"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "編輯相片/視像評註"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "評註:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "將檔案移至回收筒(_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "僅移除(_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "保留(_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "是否還原外部編輯?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "要還原外部編輯嗎?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "這會破壞 %d 份外部檔案的所有更改。要繼續嗎?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "還原外部編輯(_V)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "還原外部編輯(_V)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "這會從珍藏館移除 %d 張相片。要繼續嗎?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "上午"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "下午"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 時制"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "以相同的量挪動相片/視像(_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "將全部相片/視像設定為本時間(_A)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "修改原始相片檔案(_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "修改原始相片檔案(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "修改原始檔案(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "修改原始檔案(_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "原始:"
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d %p %I:%M:%S"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光時間將往前挪動\n"
+"%d %s、%d %s、%d %s、%d %s。"
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光時間將往後挪動\n"
+"%d %s、%d %s、%d %s、%d %s。"
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小時"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分鐘"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "秒"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"與其它 %d 項。"
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "標籤 (以半形逗號 \",\" 隔開):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "歡迎!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "歡迎使用 Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "若要開始操作,請以這些方式之一匯入相片:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "選擇 <span weight=\"bold\">檔案 %s 從資料夾匯入</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "將相片拖放至 Shotwell 視窗"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "將相機連接至你的電腦並匯入"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "從你的 %s 目錄匯入相片(_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "你可以藉這些方式之一匯入相片:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "不要再次顯示此訊息(_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "從你的 %s 珍藏館匯入相片"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(幫助)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "年%s月%s日"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "年%s月"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "年%s月-日"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "年-月-日"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "自選"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "無效的樣式"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr "Shotwell 可以複製相片至你的珍藏館,或是直接將它們匯入而不必複製。"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "複製相片(_P)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "匯入位置(_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "匯入至珍藏館"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "從珍藏館移除"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "正在從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "正在從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從你的 Shotwell 珍藏館移除 %d 份相片/視像。你是否也想要將這些檔案移至你的桌面回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從你的 Shotwell 珍藏館移除 %d 份視像。你是否也想要將這些檔案移至你的桌面回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從你的 Shotwell 珍藏館移除 %d 張相片。你是否也想要將這些檔案移至你的桌面回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "%d 份相片/視像無法移至你的桌面回收筒。要刪除這些檔案嗎?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d 份相片/視像無法刪除。"
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "闊度或高度"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "闊度"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "高度"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "無法監視 %s:非目錄 (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "事件 %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "無法為 %s 建立暫時檔案:%s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "正在匯出"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "檔案 %s 已經存在。要取代嗎?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "跳過(_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "取代(_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "全部取代(_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "匯出"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "無法處理監視更新:%s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "調整縮圖大小"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "拉近(_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "放大縮圖"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "拉遠(_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "縮小縮圖"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "排序相片(_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "播放視像(_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "在系統影片播放程式內開啟所選的視像"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "顯影器(_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "相機"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "標題(_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "顯示每張相片的標題"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "評註(_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "顯示每張相片的評註"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "標籤(_G)"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "顯示每張相片的標籤"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "根據標題(_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "根據標題排序相片"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "根據拍攝日期(_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "根據拍攝日期排序照片"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "根據評等(_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "根據評等排序相片"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "遞增(_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "以遞增方式排序相片"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "遞減(_E)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "以遞減方式排序相片"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell 無法播放所選的視像:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "無相片/視像"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "找不到相片或視像"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "無法匯出相片至此目錄。"
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "已修改"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "上一張相片"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "下一張相片"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "相片來源檔案遺失:%s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "檢視(_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "工具(_O)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "上一張相片(_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "上一張相片"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "下一張相片(_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "下一張相片"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "增加相片放大倍率"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "降低相片放大倍率"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "使其適合頁面(_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "將相片拉至適合螢幕大小"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "拉至 _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "將相片拉至 100% 倍率"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "拉至 _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "將相片拉至 200% 倍率"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "無法匯出 %s:%s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "填滿整個頁面"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "每頁 2 張影像"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "每頁 4 張影像"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "每頁 6 張影像"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "每頁 8 張影像"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "每頁 16 張影像"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "每頁 32 張影像"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "英吋"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "厘米"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "皮夾 (2 x 3 英吋)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "短柬 (3 x 5 英吋)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 英吋"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 英吋"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 英吋"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 英吋"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 英吋"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "公制皮夾 (9 x 13 厘米)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "明信片 (10 x 15 厘米)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 厘米"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 厘米"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 厘米"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 厘米"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 厘米"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "影像設定值"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "正在打印..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"無法列印相片:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "今天"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "昨天"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "項目:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d 個事件"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d 張相片"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d 份視像"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "日期:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "時間:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "從:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "到:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "大小:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "時間:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f 秒"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "顯影器:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "曝光:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "位置:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "檔案大小:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "目前顯影:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "原始維度:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "相機製造商:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "相機型號:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "閃光:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "焦距:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "曝光日期:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "曝光時間:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "曝光補償:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS 緯度:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS 經度:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "藝人:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "著作權:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "軟件:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "擴充資訊"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "相片管理員"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "相片檢視器"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "向右旋轉(_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "旋轉"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "向右旋轉"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "將相片向右旋轉 (按下 Ctrl 鍵以向左旋轉)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "向左旋轉(_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "向左旋轉"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "將相片向左旋轉"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "水平翻轉(_Z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "水平翻轉"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "垂直翻轉(_C)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "垂直翻轉"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "優化(_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "優化"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "自動優化相片外觀"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "複製色彩調整(_C)"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "複製色彩調整"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "複製套用至該相片的色彩調整"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "貼上色彩調整(_P)"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "貼上色彩調整"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "將複製的色彩調整套用至所選的相片上"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "裁切(_C)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "裁切"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "裁切相片大小"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "拉直(_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "拉直"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "拉直相片"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "紅眼(_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "紅眼"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "減少或消除相片中的紅眼效應"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "調整(_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "調整"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "調整相片的色彩與色調"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "還原至原始(_V)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "還原至原始"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "還原外部編輯(_D)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "還原至主相片"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "設為桌面背景(_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "將所選的影像設為新的桌面背景"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "設為桌面投影秀(_D)..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "復原(_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "復原"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "取消復原(_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "取消復原"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "重新命名事件(_N)..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "作為事件的代表性相片(_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "作為事件的代表性相片"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "新事件(_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "新事件"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "移動相片"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "移動相片至某事件"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "合併事件(_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "合併"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "合併多事件為單一事件"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "設定評等(_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "設定評等"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "更改你相片的評等"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "增加(_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "增加評等"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "降低(_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "降低評等"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "無評等(_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "未評等"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "無評等"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "設定為無評等"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "移除任何評等"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "退絕(_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "退絕"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "評等退絕"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "設定為退絕"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "將評等設為退絕"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "只有退絕(_O)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "只有退絕"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "只顯示退絕的相片"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "全部 + 退絕(_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "顯示全部相片,包括退絕項目"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "全部相片(_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "顯示全部相片"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "評等(_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "顯示每張相片的評等"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "過濾相片(_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "過濾相片"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "限制過濾條件所顯示的相片數目"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "製作複本(_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "製作複本"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "建立相片的複本"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "匯出(_E)..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "打印(_P)..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "發布(_B)..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "發布至多種網站"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "編輯標題(_T)..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "編輯評註(_C)..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "編輯評註"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "編輯事件評註(_C)..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "調整日期與時間(_A)..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "調整日期與時間"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "加入標籤(_A)..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "添加標籤(_A)..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "加入標籤"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "偏好設定(_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "以外部編輯器開啟(_X)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "以 RA_W 編輯器開啟"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "傳送至(_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "傳送至(_O)..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "尋找(_F)..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "尋找"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "輸入出現在影像的名稱內或標籤上的文字來尋找影像"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "加上旗幟(_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "移除旗幟(_F)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "無法開啟編輯器:%s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "加入標籤「%s」"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "加入標籤「%s」與「%s」"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "刪除「%s」標籤(_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "刪除「%s」標籤"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "刪除標籤"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "新增(_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "刪除標籤「%s」..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "重新命名標籤「%s」為「%s」"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "重新命名(_R)..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "修改標籤(_Y)..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "修改標籤"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "將相片加上「%s」標籤"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "將相片加入「%s」標籤"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "將所選相片加上「%s」標籤"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "將所選的相片加入「%s」標籤"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "從相片移除「%s」標籤(_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "從相片移除「%s」標籤(_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "從相片移除「%s」標籤"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "從相片移除「%s」標籤"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "「%s」標籤已存在,因而無法重新命名標籤。"
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "因為該搜尋已經存在,無法重新命名搜尋為「%s」。"
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "儲存的搜尋"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "刪除搜尋"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "編輯(_E)..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "重新命名(_N)..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "重新命名「%s」搜尋為「%s」"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "刪除「%s」搜尋"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "為 %s 評等"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "設定評等為 %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "正在設定評等為 %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "顯示 %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "只顯示評等為 %s 的相片"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s 或更高"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "顯示 %s 或更高"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "只顯示評等為 %s 或更高的相片"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "從回收筒移除所選的相片"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "從珍藏館移除所選的相片"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "還原(_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "將所選的相片移回珍藏館"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "以檔案管理員開啟(_G)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "在檔案管理員內開啟所選的相片目錄"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "無法於檔案管理員內開啟:%s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "從珍藏館移除(_E)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "移至回收筒(_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "全選(_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "選取全部項目"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%p%-I:%M"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%p%-I:%M:%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%Y年%b%d日(%a)"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%Y年%b%d日(%a)"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d日"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "投影秀"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "已加上旗幟"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "相片"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "視像"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW 相片"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW 相片"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "載入 UI 檔 %s 時發生錯誤:%s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "類型"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "評等"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "設定值"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "返回"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "前往上一張相片"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "暫停"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "暫停投影秀"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "下一張"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "前往下一張相片"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "更改投影秀設定值"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "遺失全部相片來源檔。"
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "播放"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "繼續投影秀"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "無標題"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "匯出視像"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "相機"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "無法卸載相機。請從檔案管理員內嘗試卸載該相機。"
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "隱藏已經匯入的相片"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "只顯示尚未匯入的相片"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "正開始匯入,請稍候..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "匯入所選(_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "將所選的相片匯入你的珍藏館"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "匯入全部(_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "將全部的相片匯入你的珍藏館"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "Shotwell 需要從檔案系統卸載相機才能存取它。要繼續嗎?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "卸載(_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "請卸載該相機。"
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr "相機已被另一個應用程式鎖住。Shotwell 只能在相機沒被鎖住的情況下存取它。請關閉任何其它正在使用該相機的應用程式並重試。"
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "請關閉任何其它正在使用相機的應用程式。"
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"無法從相機擷取預覽:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "正在卸載..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "正在擷取相片資訊"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "正在為 %s 擷取預覽"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "無法鎖住相機:%s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "要從相機刪除這 %d 張相片嗎?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "要從相機刪除這 %d 份視像嗎?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "要從相機刪除這 %d 份相片/視像嗎?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "要從相機刪除這 %d 份檔案嗎?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "正在從相機移除相片/視像"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "由於錯誤發生,無法從相機刪除 %d 份相片/視像。"
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "資料匯入"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s 資料庫"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "無法繼續從 %s 匯入,因為遭遇錯誤:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "若要從其他服務匯入,請從上方選單選取其中一項。"
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"你尚未啟用任何資料匯入插件。\n"
+"\n"
+"為了使用「從應用程式匯入」的功能,你至少需要啟用一項資料匯入插件。插件可以透過「偏好設定」對話盒中啟用。"
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "資料庫檔案:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "匯入(_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "從應用程式匯入"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "從何處匯入媒體(_F):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "關閉(_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "無法開啟或建立相片資料庫 %s:錯誤代碼 %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"無法寫入相片資料庫檔案:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"存取資料庫檔案時發生錯誤:\n"
+"%s\n"
+"\n"
+"錯誤為:\n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "檔案(_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "儲存(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "儲存相片"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "另存新檔(_A)..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "以不同名稱儲存相片"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "將該相片以連結至你電腦的打印機列印"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "編輯(_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "相片(_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "幫助(_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s 不存在。"
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s 不是檔案。"
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s 不支援檔案格式\n"
+"%s。"
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "儲存複本(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "放棄對 %s 所作出的更改?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "關閉而不儲存(_W)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "當儲存至 %s 時發生錯誤:%s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "另存新檔"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "返回目前相片維度"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "為此相片設定裁切"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "在肖像與風景方向之間旋轉裁切矩形"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "未限制"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "方形"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "螢幕畫面"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD 視像 (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD 視像 (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "信紙 (8.5 x 11 英吋)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "小報紙 (11 x 17 英吋)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 公釐)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 公釐)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "關閉紅眼工具"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "移除所選區域內的紅眼效應"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "重設(_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "飽和:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "色相:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "色溫:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "陰影:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "高亮:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "重設色彩"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "重設所有色彩調整為原始狀態"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "色溫"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "色相"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "飽和"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "曝光"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "陰影"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "高亮"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "對比擴展"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "角度:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d 份相片/視像"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "無事件"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "顯示每個事件的評註"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "無事件"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "找不到事件"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "事件"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "未限定日期"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "資料夾"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "珍藏館"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "正在匯入..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "停止匯入(_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "停止匯入相片"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "正在準備匯入..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "已匯入 %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "上次匯入"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "從資料夾匯入(_I)..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "從磁碟匯入相片至珍藏館"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "從應用程式匯入(_A)..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "排序事件(_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "清空回收筒(_R)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "刪除回收筒中的所有相片"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "檢視相片的事件(_N)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "尋找(_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "根據搜尋準則尋找相片與視像"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "新的儲存搜尋(_W)..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "相片(_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "事件(_T)"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "基本資訊(_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "顯示選取項目的基礎資訊"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "擴充資訊(_X)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "顯示選取項目的擴充資訊"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "搜尋列(_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "顯示搜尋列"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "側邊欄(_I)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "顯示側邊欄"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "從資料夾匯入"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "清空回收筒"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "正在清空回收筒..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell 已設置為將相片匯入你的家屋目錄中。\n"
+"我們建議你在 <span weight=\"bold\">編輯 %s 偏好設定</span> 中更改此設定。\n"
+"你是否想要繼續匯入相片?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "珍藏館位置"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "相片無法從此目錄匯入。"
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "正在更新珍藏館..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "正在準備自動匯入相片..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "正在自動匯入相片..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "正在寫入中介資料至檔案中..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "遺失的檔案"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "正在刪除..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "回收筒"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "空的回收筒"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "刪除"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "正在刪除相片"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr "你的相片珍藏館與此版本的 Shotwell 不兼容。該珍藏館似乎是由 Shotwell %s (schema %d) 所建立。此版本為 %s (schema %d)。請使用最新版的 Shotwell。"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr "Shotwell 無法將你的珍藏館從版本 %s (schema %d)升級至 %s (schema %d)。若要瞭解更多資訊,請查看位於 %s 的 Shotwell Wiki"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr "你的珍藏館與此版本的 Shotwell 不兼容。該珍藏館似乎是由 Shotwell %s (schema %d) 所建立的。此版本為 %s (schema %d)。請刪除 %s 來清除你的珍藏館,並且重新匯入你的相片。"
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "試圖驗證 Shotwell 資料庫時發生未知錯誤:%s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "正在載入 Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell 的私人資料路徑"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "目錄"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "執行時期不要監視珍藏館目錄是否有變動"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "不要顯示初始啟動時的進度條"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "顯示應用程式的版本"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[檔案]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "執行 '%s --help' 來查看可用命令列選項的完整清單。\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "低 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "中 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "高 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "最佳 (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "發布"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "正在準備上傳"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "正在上傳 %d/%d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "因為遭遇錯誤,無法繼續發布至 %s:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "若要嘗試發布至其它服務,請從上方選單選擇。"
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "所選的相片/視像已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "所選的視像已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "所選的相片已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "所選的視像已成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "所選的相片已成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "正在擷取帳號資訊..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "正在登入..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "發布相片"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "將相片發布至(_T):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "發布視像"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "將視像發布至(_T)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "發布相片與視像"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "將相片與視像發布至(_T)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "無法發布"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr "Shotwell 無法發布所選的項目,因為你尚未啟用兼容的發布插件。若要修正此問題,請選擇 <b>編輯 %s 偏好設定</b> 並在 <b>插件</b> 分頁啟用一項或多項發布用插件。"
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "儲存的搜尋"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "包含"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "完全是"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "開頭為"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "結尾為"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "不包含"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "未設定"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "是"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "不是"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "任意相片"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW 相片"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "視像"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "有"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "沒有"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "修改"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "內部修改"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "外部修改"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "已加上旗幟"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "未加上旗幟"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "與更高"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "只有"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "與更低"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "晚於"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "早於"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "介於"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "與"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "任何"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "全部"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "無"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "任意文字"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "標題"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "標籤"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "評註"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "事件名稱"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "檔案名稱"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "媒體類型"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "旗幟狀態"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "相片狀態"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "日期"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "新增標籤(_T)..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "投影秀轉場"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(無)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "無"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "隨機"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "標籤"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "設為桌面投影秀"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "製作桌面背景投影秀"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "顯示每張相片"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "期間"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "每張相片要顯示為桌面背景多久"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "搜尋"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "搜尋的名稱(_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "比對(_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "的下列條件:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>列印的影像大小</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "使用標準大小(_S):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "使用自選大小(_C):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "符合相片寬高比(_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "自動大小(_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>標題</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "列印影像標題(_T)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>畫素解像度</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "輸出相片於(_O):"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "每英吋畫素"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell 偏好設定"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "白"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "黑"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "監視珍藏館目錄是否有新檔案(_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "中介資料"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "寫入標籤、標題與其它中介資料至相片檔案(_M)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "顯示"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "匯入相片至(_I):"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "背景(_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "匯入"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "目錄結構(_D):"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "樣式(_P):"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "範例:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "將匯入的檔案重新命名為小寫(_E)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW 顯影器"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "預設(_F):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "外部編輯器(_X):"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "外部 _RAW 編輯器:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "外部編輯器"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "插件"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "延遲(_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "轉場效果(_T):"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "轉場延遲(_D):"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "顯示標題(_I)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "秒"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "登入(_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr "Shotwell 設定為將相片匯入您的家目錄。\n"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..14889df
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,4558 @@
+# po/shotwell-core/shotwell.pot
+# PO message string template file for Shotwell Core Components
+# Copyright (C) 2009-2013 Yorba Foundation
+# See COPYING for license.
+#
+#
+# Translators:
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011-2013
+# verayin <vera@yorba.org>, 2011
+# Cheng-Chia Tseng <pswo10680@gmail.com>, 2011
+# lsbeeler <lucas@yorba.org>, 2011
+# yevlempy <yevlempy@gmail.com>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: shotwell-0.15\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=shotwell&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-01-20 23:11+0000\n"
+"PO-Revision-Date: 2014-01-27 22:25+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/"
+"shotwell/language/zh_TW/)\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: ../plugins/common/RESTSupport.vala:424
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:968
+msgid "A temporary file needed for publishing is unavailable"
+msgstr "發布所需的某暫存檔無法使用"
+
+#: ../plugins/common/RESTSupport.vala:1138
+msgid ""
+"You have already logged in and out of a Google service during this Shotwell "
+"session.\n"
+"\n"
+"To continue publishing to Google services, quit and restart Shotwell, then "
+"try publishing again."
+msgstr ""
+"您已在 Shotwell 工作階段中登入並登出 Google 服務。\n"
+"\n"
+"若要繼續發布至 Google 服務,請先退出 Shotwell 並重新啟動,接著再重試發布。."
+
+#: ../plugins/common/Resources.vala:9 ../src/AppWindow.vala:683
+msgid "Visit the Yorba web site"
+msgstr "造訪 Yorba 網站"
+
+#: ../plugins/common/Resources.vala:28 ../src/AppWindow.vala:686
+msgid "translator-credits"
+msgstr "Cheng-Chia Tseng <pswo10680@gmail.com>"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:34
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:32
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:34
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:32
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:32
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:32
+#: ../src/Resources.vala:27
+msgid "Copyright 2009-2013 Yorba Foundation"
+msgstr "著作權 2009-2013 Yorba Foundation"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:56
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select a library to import, either by selecting one of the existing "
+"libraries found by Shotwell or by selecting an alternative F-Spot database "
+"file."
+msgstr ""
+"歡迎光臨 F-Spot 珍藏館匯入服務。\n"
+"\n"
+"請選取要匯入的珍藏館,您可以選取 Shotwell 找到的既有珍藏館之一,或是選取其他 "
+"F-Spot 資料庫檔案。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:58
+msgid ""
+"Welcome to the F-Spot library import service.\n"
+"\n"
+"Please select an F-Spot database file."
+msgstr ""
+"歡迎光臨 F-Spot 珍藏館匯入服務。\n"
+"\n"
+"請選取一個 F-Spot 資料庫檔案。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:60
+msgid "Manually select an F-Spot database file to import:"
+msgstr "手動選取要匯入的 F-Spot 資料庫檔案:"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:62
+msgid ""
+"Cannot open the selected F-Spot database file: the file does not exist or is "
+"not an F-Spot database"
+msgstr "無法開啟所選的 F-Spot 資料庫檔案:檔案不存在或不是 F-Spot 資料庫"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:64
+msgid ""
+"Cannot open the selected F-Spot database file: this version of the F-Spot "
+"database is not supported by Shotwell"
+msgstr ""
+"無法開啟所選的 F-Spot 資料庫檔案:這個版本的 F-Spot 資料庫不受 Shotwell 支援"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:66
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading tags table"
+msgstr "無法讀取所選的 F-Spot 資料庫檔案:當讀取標籤表時發生錯誤"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:68
+msgid ""
+"Cannot read the selected F-Spot database file: error while reading photos "
+"table"
+msgstr "無法讀取所選的 F-Spot 資料庫檔案:當讀取相片表時發生錯誤"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:70
+#, c-format
+msgid ""
+"Shotwell has found %d photos in the F-Spot library and is currently "
+"importing them. Duplicates will be automatically detected and removed.\n"
+"\n"
+"You can close this dialog and start using Shotwell while the import is "
+"taking place in the background."
+msgstr ""
+"Shotwell 已從 F-Spot 珍藏館中找到 %d 張相片,目前正在匯入。複本會被自動偵測出"
+"來並移除。\n"
+"\n"
+"您可以關閉對話盒並繼續使用 Shotwell,匯入程序會在背景執行。"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:84
+#, c-format
+msgid "F-Spot library: %s"
+msgstr "F-Spot 珍藏館:%s"
+
+#: ../plugins/shotwell-data-imports/FSpotImporter.vala:416
+msgid "Preparing to import"
+msgstr "正在準備匯入"
+
+#: ../plugins/shotwell-data-imports/shotwell-data-imports.vala:22
+msgid "Core Data Import Services"
+msgstr "核心資料匯入服務"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:35
+msgid "Copyright 2012 BJA Electronics"
+msgstr "著作權 2012 BJA Electronics"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:104
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1229
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1246
+msgid "500 x 375 pixels"
+msgstr "500 x 375 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:105
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1230
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1247
+msgid "1024 x 768 pixels"
+msgstr "1024 x 768 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:106
+msgid "1280 x 853 pixels"
+msgstr "1280 x 853 畫素"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:310
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:320
+#, c-format
+msgid "'%s' isn't a valid response to an OAuth authentication request"
+msgstr "「%s」不是個對 OAuth 驗證請求的有效回應"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:558
+msgid ""
+"TumblrPublisher: start( ): can't start; this publisher is not restartable."
+msgstr "TumblrPublisher: start( ):無法啟動;此發布器不能重新啟動。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:586
+msgid "Enter the username and password associated with your Tumblr account."
+msgstr "請輸入與您 Tumblr 帳戶相關聯的使用者名稱與密碼。"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:587
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1000
+msgid "Username and/or password invalid. Please try again"
+msgstr "使用者名稱與/或密碼無效。請重試"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:617
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1037
+msgid "Invalid User Name or Password"
+msgstr "無效的使用者名稱或密碼"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:636
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:757
+#, c-format
+msgid "Could not load UI: %s"
+msgstr "無法載入使用者介面:%s"
+
+#: ../plugins/shotwell-publishing-extras/TumblrPublishing.vala:739
+#, c-format
+msgid ""
+"You are logged into Tumblr as %s.\n"
+"\n"
+msgstr ""
+"您正以 %s 的身份登入 Tumblr。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:22
+msgid "Copyright 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+msgstr "著作權 2010+ Evgeniy Polyakov <zbr@ioremap.net>"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:25
+msgid "Visit the Yandex.Fotki web site"
+msgstr "造訪 Yandex.Fotki 網站"
+
+#: ../plugins/shotwell-publishing-extras/YandexPublishing.vala:632
+msgid "You are not currently logged into Yandex.Fotki."
+msgstr "您目前尚未登入 Yandex.Fotki。"
+
+#: ../plugins/shotwell-publishing-extras/shotwell-publishing-extras.vala:18
+msgid "Shotwell Extra Publishing Services"
+msgstr "Shotwell 額外發布服務"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:1
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:1
+#: ../ui/shotwell.glade.h:15
+msgid "label"
+msgstr "標籤"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:2
+msgid "_Email address"
+msgstr "電子郵件位址(_E)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:3
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:4
+msgid "_Password"
+msgstr "密碼(_P)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_authentication_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:6
+msgid "Login"
+msgstr "登入"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Tumblr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"您正以 (name) 的身份登入 Tumblr。\n"
+"\n"
+"(此標籤的字串會被抽出並在代碼中設定,\n"
+"所有這裡所作的改變都不會顯示出來)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:5
+msgid "Blogs:"
+msgstr "網誌:"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:6
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:6
+msgid "Photo _size:"
+msgstr "相片大小(_S):"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:5
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:10
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:2
+msgid "_Logout"
+msgstr "登出(_L)"
+
+#: ../plugins/shotwell-publishing-extras/tumblr_publishing_options_pane.glade.h:8
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:6
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:11
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:3
+msgid "_Publish"
+msgstr "發布(_P)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:1
+msgid "_Albums (or write new):"
+msgstr "相簿 (或寫入新的)(_A):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:2
+msgid "Access _type:"
+msgstr "存取類型(_T):"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:3
+msgid "Disable _comments"
+msgstr "停用評論(_C)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:4
+msgid "_Forbid downloading original photo"
+msgstr "禁止下載原始相片(_F)"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:7
+msgid "Public"
+msgstr "發布"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:8
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1181
+msgid "Friends"
+msgstr "朋友"
+
+#: ../plugins/shotwell-publishing-extras/yandex_publish_model.glade.h:9
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:497
+msgid "Private"
+msgstr "私人"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:61
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:59
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1127
+msgid "Shotwell Connect"
+msgstr "Shotwell 連線"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:63
+msgid ""
+"You are not currently logged into Facebook.\n"
+"\n"
+"If you don't yet have a Facebook account, you can create one during the "
+"login process. During login, Shotwell Connect may ask you for permission to "
+"upload photos and publish to your feed. These permissions are required for "
+"Shotwell Connect to function."
+msgstr ""
+"您目前尚未登入 Facebook。\n"
+"\n"
+"若您尚未擁有 Facebook 帳號,您可以在登入程序內建立一份帳號。在登入期間,"
+"Shotwell Connect 可能會詢問您上傳相片並且發布至您饋流的許可。Shotwell "
+"Connect 需要取得這些許可權限才能運作。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:65
+msgid ""
+"You have already logged in and out of Facebook during this Shotwell "
+"session.\n"
+"To continue publishing to Facebook, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"您已經在此 Shotwell 作業階段內登入過並接著登出 Facebook。\n"
+"若要繼續發布至 Facebook,請退出並重新啟動 Shotwell,接著再次嘗試發布。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:86
+msgid "Standard (720 pixels)"
+msgstr "標準 (720 畫素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:89
+msgid "Large (2048 pixels)"
+msgstr "大 (2048 畫素)"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:254
+msgid "Testing connection to Facebook..."
+msgstr "正在測試至 Facebook 的連線..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:347
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:379
+msgid "Creating album..."
+msgstr "正在建立相簿..."
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:374
+msgid ""
+"A file required for publishing is unavailable. Publishing to Facebook can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Facebook。"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1019
+#, c-format
+msgid ""
+"You are logged into Facebook as %s.\n"
+"\n"
+msgstr ""
+"您正在以 %s 身分登入 Facebook。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1020
+msgid "Where would you like to publish the selected photos?"
+msgstr "您想要在何處發布所選的相片?"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1021
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:5
+msgid "Upload _size:"
+msgstr "上傳大小(_S):"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1180
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1211
+msgid "Just me"
+msgstr "只有我"
+
+#: ../plugins/shotwell-publishing/FacebookPublishing.vala:1182
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1207
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1234
+msgid "Everyone"
+msgstr "每個人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:61
+msgid ""
+"You are not currently logged into Flickr.\n"
+"\n"
+"Click Login to log into Flickr in your Web browser. You will have to "
+"authorize Shotwell Connect to link to your Flickr account."
+msgstr ""
+"您目前尚未登入 Flickr。\n"
+"\n"
+"點擊「登入」來從您的網路瀏覽器中登入 Flickr。您必須授權 Shotwell Connect 可以"
+"連結至您的 Flickr 帳號。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:63
+msgid ""
+"You have already logged in and out of Flickr during this Shotwell session.\n"
+"To continue publishing to Flickr, quit and restart Shotwell, then try "
+"publishing again."
+msgstr ""
+"您已經在此 Shotwell 作業階段內登入過並接著登出 Flickr。\n"
+"若要繼續發布至 Flickr,請退出並重新啟動 Shotwell,接著再次嘗試發布。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:375
+msgid "Preparing for login..."
+msgstr "正在準備登入..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:444
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:595
+msgid ""
+"A file required for publishing is unavailable. Publishing to Flickr can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Flickr。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:457
+msgid "Verifying authorization..."
+msgstr "正在驗證授權..."
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1153
+#, c-format
+msgid ""
+"You are logged into Flickr as %s.\n"
+"\n"
+msgstr ""
+"您正在以 %s 身分登入 Flickr。\n"
+"\n"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1155
+#, c-format
+msgid ""
+"Your free Flickr account limits how much data you can upload per month.\n"
+"This month, you have %d megabytes remaining in your upload quota."
+msgstr ""
+"您的免費 Flickr 帳號限制您每月只能上傳某個量的資料。\n"
+"這個月,您的上傳配額剩餘 %d MB。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1157
+msgid "Your Flickr Pro account entitles you to unlimited uploads."
+msgstr "您的 Flickr Pro 帳號賦予您無限制的上傳量。"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1162
+msgid "Photos _visible to:"
+msgstr "誰能看見這些相片(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1164
+msgid "Videos _visible to:"
+msgstr "誰能看見這些視訊(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1167
+msgid "Photos and videos _visible to:"
+msgstr "誰能看見這些相片與視訊(_V):"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1208
+msgid "Friends & family only"
+msgstr "僅朋友與家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1209
+msgid "Family only"
+msgstr "僅家人"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1210
+msgid "Friends only"
+msgstr "僅朋友"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1231
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1248
+msgid "2048 x 1536 pixels"
+msgstr "2048 x 1536 畫素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1232
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1249
+msgid "4096 x 3072 pixels"
+msgstr "4096 x 3072 畫素"
+
+#: ../plugins/shotwell-publishing/FlickrPublishing.vala:1233
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1250
+#: ../src/Dimensions.vala:17
+msgid "Original size"
+msgstr "原始大小"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:58
+msgid ""
+"You are not currently logged into Picasa Web Albums.\n"
+"\n"
+"Click Login to log into Picasa Web Albums in your Web browser. You will have "
+"to authorize Shotwell Connect to link to your Picasa Web Albums account."
+msgstr ""
+"您目前尚未登入 Picasa 網頁相簿。\n"
+"\n"
+"請在您的網頁瀏覽器中點擊「登入」以登入 Picasa 網頁相簿。您必須授權 Shotwell "
+"Connect 連結您 Picasa 網頁相簿的帳戶。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:361
+msgid ""
+"A file required for publishing is unavailable. Publishing to Picasa can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Picasa。"
+
+#. populate any widgets whose contents are programmatically-generated.
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:659
+#, c-format
+msgid "You are logged into Picasa Web Albums as %s."
+msgstr "您已經以 %s 的身份登入 Picasa 網路相簿。"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:665
+msgid "Videos will appear in:"
+msgstr "視訊將顯現於:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:670
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:1
+msgid "Photos will appear in:"
+msgstr "相片將顯現於:"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:746
+msgid "Small (640 x 480 pixels)"
+msgstr "小 (640 x 480 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:747
+msgid "Medium (1024 x 768 pixels)"
+msgstr "中 (1024 x 768 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:748
+msgid "Recommended (1600 x 1200 pixels)"
+msgstr "建議 (1600 x 1200 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:749
+msgid "Google+ (2048 x 1536 pixels)"
+msgstr "Google+ (2048 x 1536 畫素)"
+
+#: ../plugins/shotwell-publishing/PicasaPublishing.vala:750
+#: ../src/editing_tools/EditingTools.vala:756
+msgid "Original Size"
+msgstr "原始比例"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:746
+#, c-format
+msgid "Creating album %s..."
+msgstr "正在建立 %s 相簿..."
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:917
+msgid "An error message occurred when publishing to Piwigo. Please try again."
+msgstr "當發布至 Piwigo 時得到錯誤訊息。請重試。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:998
+msgid ""
+"Enter the URL of your Piwigo photo library as well as the username and "
+"password associated with your Piwigo account for that library."
+msgstr ""
+"輸入您 Piwigo 相片珍藏館的網址,以及與該珍藏館相關聯的 Piwigo 帳戶其使用者名"
+"稱、密碼。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:999
+msgid ""
+"Shotwell cannot contact your Piwigo photo library. Please verify the URL you "
+"entered"
+msgstr "Shotwell 無法聯絡您的 Piwigo 相片珍藏館。請驗證您輸入的網址是否正確。"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1032
+msgid "Invalid URL"
+msgstr "無效的網址"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1235
+msgid "Admins, Family, Friends, Contacts"
+msgstr "管理員、家人、朋友、聯絡人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1236
+msgid "Admins, Family, Friends"
+msgstr "管理員、家人、朋友"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1237
+msgid "Admins, Family"
+msgstr "管理員、家人"
+
+#: ../plugins/shotwell-publishing/PiwigoPublishing.vala:1238
+msgid "Admins"
+msgstr "管理員"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:57
+msgid ""
+"You are not currently logged into YouTube.\n"
+"\n"
+"You must have already signed up for a Google account and set it up for use "
+"with YouTube to continue. You can set up most accounts by using your browser "
+"to log into the YouTube site at least once."
+msgstr ""
+"您目前尚未登入 YouTube。\n"
+"\n"
+"您必須已經註冊 Google 帳號並將它設定好可以使用 YouTube 才能繼續。對大多數的帳"
+"號來說,您都可以使用瀏覽器登入 YouTube 至少一次來將它設定好。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:362
+msgid ""
+"A file required for publishing is unavailable. Publishing to Youtube can't "
+"continue."
+msgstr "發布所需的某個檔案無法使用。無法繼續發布至 Youtube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:461
+#, c-format
+msgid "You are logged into YouTube as %s."
+msgstr "您正在以 %s 身分登入 YouTube。"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:463
+#, c-format
+msgid "Videos will appear in '%s'"
+msgstr "視訊將「 %s」內顯現"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:495
+msgid "Public listed"
+msgstr "公開且列出"
+
+#: ../plugins/shotwell-publishing/YouTubePublishing.vala:496
+msgid "Public unlisted"
+msgstr "公開但不列出"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:1
+msgid ""
+" (text depends on fb username and is modified in the app - \n"
+"anything put into this field won't display)"
+msgstr ""
+" (文字所依賴的是 FB 使用者名稱,由程式中修改 - \n"
+"任何輸入於此欄位的字皆不會顯示)"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:3
+msgid "Publish to an e_xisting album:"
+msgstr "發布至現存相簿(_X):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:4
+msgid "Create a _new album named:"
+msgstr "建立新相簿並命名為:"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:6
+msgid "Videos and new photo albums _visible to:"
+msgstr "誰能看見這些視訊與新的相簿(_V):"
+
+#: ../plugins/shotwell-publishing/facebook_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:7
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:9
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:8
+msgid ""
+"_Remove location, camera, and other identifying information before uploading"
+msgstr "上傳前先移除地理位置、相機、以及其他可供辨識的資訊(_R)"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:1
+msgid ""
+"Enter the confirmation number which appears after you log into Flickr in "
+"your Web browser."
+msgstr "請輸入您登入 Flickr 後在您瀏覽器中出現的確認號碼。"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:2
+msgid "Authorization _Number:"
+msgstr "授權號碼(_N):"
+
+#: ../plugins/shotwell-publishing/flickr_pin_entry_pane.glade.h:3
+#: ../src/Dialogs.vala:131
+msgid "Con_tinue"
+msgstr "繼續(_T)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:1
+msgid ""
+"You are logged into Flickr as (name).\n"
+"\n"
+"(this label's string is populated and set inside the code, \n"
+"so changes made here will not display)"
+msgstr ""
+"您已登入 Flickr,帳號為 (name)。\n"
+"\n"
+"(此標籤的字串會在代碼內部中取出並設定,\n"
+"因此此處所作的改動皆不會顯示)"
+
+#: ../plugins/shotwell-publishing/flickr_publishing_options_pane.glade.h:5
+msgid "_visibility label (populated in the code)"
+msgstr "_可見性標籤 (在代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:1
+msgid ""
+"'you are logged in as $name'\n"
+"(populated in the application code)"
+msgstr ""
+"'您正以 $name 身份登入'\n"
+"(在應用程式代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:3
+msgid "An _existing album:"
+msgstr "現存的相簿(_E):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:4
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:3
+msgid "A _new album named:"
+msgstr "新相簿名為(_N):"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:5
+msgid "L_ist album in public gallery"
+msgstr "於公眾圖庫內列出相簿(_I)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:6
+msgid ""
+"$mediatype will appear in\n"
+"(populated in code)"
+msgstr ""
+"$mediatype 會出現於\n"
+"(在代碼中取出)"
+
+#: ../plugins/shotwell-publishing/picasa_publishing_options_pane.glade.h:8
+msgid "Photo _size preset:"
+msgstr "相片大小預先設定(_S):"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:2
+msgid "_URL of your Piwigo photo library"
+msgstr "您 Piwigo 相片庫的網址(_U)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:3
+msgid "User _name"
+msgstr "使用者名稱(_N)"
+
+#: ../plugins/shotwell-publishing/piwigo_authentication_pane.glade.h:5
+msgid "_Remember Password"
+msgstr "記住密碼(_R)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:2
+msgid "An _existing category:"
+msgstr "現有的分類(_E):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:4
+msgid "Photos will be _visible by:"
+msgstr "相片會出現於(_V):"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:5
+msgid "Photo size:"
+msgstr "相片大小:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:6
+msgid "within category:"
+msgstr "類別:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:7
+msgid "Album comment:"
+msgstr "相簿評註:"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:9
+msgid "_If a title is set and comment unset, use title as comment"
+msgstr "如果有設定標題但未設定評註,則使用標題作為評註(_I)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:10
+msgid "_Do no upload tags"
+msgstr "不要上傳標籤(_D)"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:11
+msgid "Logout"
+msgstr "登出"
+
+#: ../plugins/shotwell-publishing/piwigo_publishing_options_pane.glade.h:12
+#: ../src/Resources.vala:270
+msgid "Publish"
+msgstr "發布"
+
+#: ../plugins/shotwell-publishing/shotwell-publishing.vala:26
+msgid "Core Publishing Services"
+msgstr "核心發布服務"
+
+#: ../plugins/shotwell-publishing/youtube_publishing_options_pane.glade.h:1
+msgid "Video privacy _setting:"
+msgstr "視訊隱私設定值(_S):"
+
+#: ../plugins/shotwell-transitions/BlindsEffect.vala:20
+msgid "Blinds"
+msgstr "百葉窗"
+
+#: ../plugins/shotwell-transitions/ChessEffect.vala:20
+msgid "Chess"
+msgstr "棋盤"
+
+#: ../plugins/shotwell-transitions/CircleEffect.vala:20
+msgid "Circle"
+msgstr "圓"
+
+#: ../plugins/shotwell-transitions/CirclesEffect.vala:20
+msgid "Circles"
+msgstr "圓"
+
+#: ../plugins/shotwell-transitions/ClockEffect.vala:20
+msgid "Clock"
+msgstr "時鐘"
+
+#: ../plugins/shotwell-transitions/CrumbleEffect.vala:20
+msgid "Crumble"
+msgstr "崩解"
+
+#: ../plugins/shotwell-transitions/FadeEffect.vala:20
+msgid "Fade"
+msgstr "淡化"
+
+#: ../plugins/shotwell-transitions/SlideEffect.vala:20
+msgid "Slide"
+msgstr "滑過"
+
+#: ../plugins/shotwell-transitions/SquaresEffect.vala:20
+msgid "Squares"
+msgstr "方"
+
+#: ../plugins/shotwell-transitions/StripesEffect.vala:20
+msgid "Stripes"
+msgstr "條帶"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:28
+msgid "Core Slideshow Transitions"
+msgstr "核心投影秀轉場"
+
+#: ../plugins/shotwell-transitions/shotwell-transitions.vala:75
+msgid "Copyright 2010 Maxim Kartashev, Copyright 2011-2013 Yorba Foundation"
+msgstr "著作權 2010 Maxim Kartashev,著作權 2011-2013 Yorba Foundation"
+
+#: ../src/AppDirs.vala:48 ../src/AppDirs.vala:99
+#, c-format
+msgid "Unable to create cache directory %s: %s"
+msgstr "無法建立快取目錄 %s:%s"
+
+#: ../src/AppDirs.vala:58 ../src/AppDirs.vala:88
+#, c-format
+msgid "Unable to create data directory %s: %s"
+msgstr "無法建立資料目錄 %s:%s"
+
+#. If XDG yarfed, use ~/Pictures
+#: ../src/AppDirs.vala:152
+msgid "Pictures"
+msgstr "圖片"
+
+#: ../src/AppDirs.vala:190
+#, c-format
+msgid "Unable to create temporary directory %s: %s"
+msgstr "無法建立暫時目錄 %s:%s"
+
+#: ../src/AppDirs.vala:207 ../src/AppDirs.vala:223
+#, c-format
+msgid "Unable to create data subdirectory %s: %s"
+msgstr "無法建立資料子目錄 %s:%s"
+
+#: ../src/AppWindow.vala:49
+msgid "Pin Toolbar"
+msgstr "釘住工具列"
+
+#: ../src/AppWindow.vala:50
+msgid "Pin the toolbar open"
+msgstr "開啟釘住工具列功能"
+
+#: ../src/AppWindow.vala:53 ../src/AppWindow.vala:131
+msgid "Leave fullscreen"
+msgstr "離開全螢幕"
+
+#: ../src/AppWindow.vala:130
+msgid "Leave _Fullscreen"
+msgstr "離開全螢幕(_F)"
+
+#: ../src/AppWindow.vala:491
+msgid "_Quit"
+msgstr "退出(_Q)"
+
+#: ../src/AppWindow.vala:496
+msgid "_About"
+msgstr "關於(_A)"
+
+#: ../src/AppWindow.vala:501
+msgid "Fulls_creen"
+msgstr "全螢幕(_C)"
+
+#: ../src/AppWindow.vala:506
+msgid "_Contents"
+msgstr "內容(_C)"
+
+#: ../src/AppWindow.vala:511
+msgid "_Frequently Asked Questions"
+msgstr "常見問答集(_F)"
+
+#: ../src/AppWindow.vala:516
+msgid "_Report a Problem..."
+msgstr "回報問題(_R)..."
+
+#: ../src/AppWindow.vala:615 ../src/AppWindow.vala:636
+#: ../src/AppWindow.vala:653 ../src/Dialogs.vala:20 ../src/Dialogs.vala:28
+#: ../src/Dialogs.vala:1361 ../src/Dialogs.vala:1384
+#: ../src/data_imports/DataImportsUI.vala:399
+#: ../src/publishing/PublishingUI.vala:498
+msgid "_Cancel"
+msgstr "取消(_C)"
+
+#: ../src/AppWindow.vala:663
+#, c-format
+msgid ""
+"A fatal error occurred when accessing Shotwell's library. Shotwell cannot "
+"continue.\n"
+"\n"
+"%s"
+msgstr ""
+"存取 Shotwell 的珍藏館時遭遇到嚴重錯誤。Shotwell 無法繼續執行。\n"
+"\n"
+"%s"
+
+#: ../src/AppWindow.vala:695
+#, c-format
+msgid "Unable to display help: %s"
+msgstr "無法顯示幫助:%s"
+
+#: ../src/AppWindow.vala:703
+#, c-format
+msgid "Unable to navigate to bug database: %s"
+msgstr "無法瀏覽臭蟲資料庫:%s"
+
+#: ../src/AppWindow.vala:711
+#, c-format
+msgid "Unable to display FAQ: %s"
+msgstr "無法顯示 FAQ:%s"
+
+#: ../src/BatchImport.vala:26
+msgid "Success"
+msgstr "成功"
+
+#: ../src/BatchImport.vala:29
+msgid "File error"
+msgstr "檔案錯誤"
+
+#: ../src/BatchImport.vala:32
+msgid "Unable to decode file"
+msgstr "無法解碼檔案"
+
+#: ../src/BatchImport.vala:35
+msgid "Database error"
+msgstr "資料庫錯誤"
+
+#: ../src/BatchImport.vala:38
+msgid "User aborted import"
+msgstr "使用者已放棄匯入"
+
+#: ../src/BatchImport.vala:41
+msgid "Not a file"
+msgstr "不是檔案"
+
+#: ../src/BatchImport.vala:44
+msgid "File already exists in database"
+msgstr "檔案已經存在於資料庫"
+
+#: ../src/BatchImport.vala:47
+msgid "Unsupported file format"
+msgstr "未支援的檔案格式"
+
+#: ../src/BatchImport.vala:50
+msgid "Not an image file"
+msgstr "不是影像檔"
+
+#: ../src/BatchImport.vala:53
+msgid "Disk failure"
+msgstr "磁碟失敗"
+
+#: ../src/BatchImport.vala:56
+msgid "Disk full"
+msgstr "磁碟已滿"
+
+#: ../src/BatchImport.vala:59
+msgid "Camera error"
+msgstr "相機錯誤"
+
+#: ../src/BatchImport.vala:62
+msgid "File write error"
+msgstr "檔案寫入發生錯誤"
+
+#: ../src/BatchImport.vala:65
+msgid "Corrupt image file"
+msgstr "損毀影像檔"
+
+#: ../src/BatchImport.vala:68
+#, c-format
+msgid "Imported failed (%d)"
+msgstr "匯入失敗 (%d)"
+
+#: ../src/CollectionPage.vala:230 ../src/PhotoPage.vala:2627
+msgid "S_lideshow"
+msgstr "投影秀(_L)"
+
+#: ../src/CollectionPage.vala:231 ../src/PhotoPage.vala:2628
+msgid "Play a slideshow"
+msgstr "播放投影秀"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photo/Video"
+msgstr "匯出相片/視訊"
+
+#: ../src/CollectionPage.vala:456
+msgid "Export Photos/Videos"
+msgstr "匯出相片/視訊"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:58
+#: ../src/PhotoPage.vala:3200
+msgid "Export Photo"
+msgstr "匯出相片"
+
+#: ../src/CollectionPage.vala:458 ../src/Dialogs.vala:87
+msgid "Export Photos"
+msgstr "匯出相片"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Rotating"
+msgstr "正在旋轉"
+
+#: ../src/CollectionPage.vala:545 ../src/CollectionPage.vala:561
+msgid "Undoing Rotate"
+msgstr "正在復原旋轉"
+
+#: ../src/CollectionPage.vala:570
+msgid "Flipping Horizontally"
+msgstr "正在水平翻轉"
+
+#: ../src/CollectionPage.vala:571
+msgid "Undoing Flip Horizontally"
+msgstr "正在復原水平翻轉"
+
+#: ../src/CollectionPage.vala:580
+msgid "Flipping Vertically"
+msgstr "正在垂直翻轉"
+
+#: ../src/CollectionPage.vala:581
+msgid "Undoing Flip Vertically"
+msgstr "正在復原垂直翻轉"
+
+#: ../src/Commands.vala:733
+msgid "Reverting"
+msgstr "正在還原"
+
+#: ../src/Commands.vala:733
+msgid "Undoing Revert"
+msgstr "正在復原還原"
+
+#: ../src/Commands.vala:777
+msgid "Enhancing"
+msgstr "正在優化"
+
+#: ../src/Commands.vala:777
+msgid "Undoing Enhance"
+msgstr "正在復原優化"
+
+#: ../src/Commands.vala:845
+msgid "Applying Color Transformations"
+msgstr "正在套用色彩轉換"
+
+#: ../src/Commands.vala:845
+msgid "Undoing Color Transformations"
+msgstr "正在復原色彩轉換"
+
+#: ../src/Commands.vala:995
+msgid "Creating New Event"
+msgstr "正在建立新事件"
+
+#: ../src/Commands.vala:996
+msgid "Removing Event"
+msgstr "正在移除事件"
+
+#: ../src/Commands.vala:1005
+msgid "Moving Photos to New Event"
+msgstr "正在將相片移動至新事件"
+
+#: ../src/Commands.vala:1006
+msgid "Setting Photos to Previous Event"
+msgstr "正在將相片設定為上個事件"
+
+#: ../src/Commands.vala:1063
+msgid "Merging"
+msgstr "正在合併"
+
+#: ../src/Commands.vala:1064
+msgid "Unmerging"
+msgstr "正在取消合併"
+
+#: ../src/Commands.vala:1073
+msgid "Duplicating photos"
+msgstr "正在製作相片複本"
+
+#: ../src/Commands.vala:1073
+msgid "Removing duplicated photos"
+msgstr "正在移除相片複本"
+
+#: ../src/Commands.vala:1096
+#, c-format
+msgid "Unable to duplicate one photo due to a file error"
+msgid_plural "Unable to duplicate %d photos due to file errors"
+msgstr[0] "由於檔案錯誤,無法製作 %d 張相片的複本"
+
+#: ../src/Commands.vala:1183
+msgid "Restoring previous rating"
+msgstr "正在復原前次評等"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Increasing ratings"
+msgstr "正在增加評等"
+
+#: ../src/Commands.vala:1193 ../src/Commands.vala:1194
+msgid "Decreasing ratings"
+msgstr "正在降低評等"
+
+#: ../src/Commands.vala:1244
+msgid "Setting RAW developer"
+msgstr "正在設定 RAW 顯影器"
+
+#: ../src/Commands.vala:1244
+msgid "Restoring previous RAW developer"
+msgstr "正在還原前個 RAW 顯影器"
+
+#: ../src/Commands.vala:1245
+msgid "Set Developer"
+msgstr "設定顯影器"
+
+#: ../src/Commands.vala:1335
+msgid "Original photo could not be adjusted."
+msgstr "無法調整原始相片。"
+
+#: ../src/Commands.vala:1356
+msgid "Adjusting Date and Time"
+msgstr "正在調整日期與時間"
+
+#: ../src/Commands.vala:1356
+msgid "Undoing Date and Time Adjustment"
+msgstr "正在復原日期與時間調整"
+
+#: ../src/Commands.vala:1387
+msgid "One original photo could not be adjusted."
+msgid_plural "The following original photos could not be adjusted."
+msgstr[0] "下列原始相片無法調整。"
+
+#: ../src/Commands.vala:1389 ../src/Commands.vala:1413
+msgid "Time Adjustment Error"
+msgstr "時間調整發生錯誤"
+
+#: ../src/Commands.vala:1411
+msgid "Time adjustments could not be undone on the following photo file."
+msgid_plural ""
+"Time adjustments could not be undone on the following photo files."
+msgstr[0] "下列相片檔案的時間調整無法復原。"
+
+#: ../src/Commands.vala:1625 ../src/Commands.vala:1648
+msgid "Create Tag"
+msgstr "建立標籤"
+
+#: ../src/Commands.vala:1683
+#, c-format
+msgid "Move Tag \"%s\""
+msgstr "移動標籤「%s」"
+
+#: ../src/Commands.vala:2335
+msgid "Move Photos to Trash"
+msgstr "將相片移至回收筒"
+
+#: ../src/Commands.vala:2335
+msgid "Restore Photos from Trash"
+msgstr "從回收筒還原檔案"
+
+#: ../src/Commands.vala:2336
+msgid "Move the photos to the Shotwell trash"
+msgstr "將相片移至 Shotwell 回收筒"
+
+#: ../src/Commands.vala:2336
+msgid "Restore the photos back to the Shotwell library"
+msgstr "將相片還原至 Shotwell 珍藏館"
+
+#: ../src/Commands.vala:2355
+msgid "Moving Photos to Trash"
+msgstr "正在將相片移至回收筒"
+
+#: ../src/Commands.vala:2355
+msgid "Restoring Photos From Trash"
+msgstr "正在從回收筒還原相片"
+
+#: ../src/Commands.vala:2441
+msgid "Flag selected photos"
+msgstr "將所選相片加上旗幟"
+
+#: ../src/Commands.vala:2442
+msgid "Unflag selected photos"
+msgstr "移除所選相片的旗幟"
+
+#: ../src/Commands.vala:2443
+msgid "Flagging selected photos"
+msgstr "正為所選相片加上旗幟"
+
+#: ../src/Commands.vala:2444
+msgid "Unflagging selected photos"
+msgstr "正為所選相片移除旗幟"
+
+#: ../src/Commands.vala:2451
+msgid "Flag"
+msgstr "加上旗幟"
+
+#: ../src/Commands.vala:2451
+msgid "Unflag"
+msgstr "移除旗幟"
+
+#: ../src/DesktopIntegration.vala:118
+#, c-format
+msgid "Unable to launch Nautilus Send-To: %s"
+msgstr "無法啟動 Nautilus 的「傳送到」功能:%s"
+
+#: ../src/DesktopIntegration.vala:126
+msgid "Send To"
+msgstr "傳送至"
+
+#: ../src/DesktopIntegration.vala:171
+#, c-format
+msgid "Unable to export background to %s: %s"
+msgstr "無法將背景匯出至 %s:%s"
+
+#: ../src/DesktopIntegration.vala:299
+#, c-format
+msgid "Unable to prepare desktop slideshow: %s"
+msgstr "無法預備桌面投影秀:%s"
+
+#: ../src/Dialogs.vala:16
+#, c-format
+msgid "This will remove the tag \"%s\" from one photo. Continue?"
+msgid_plural "This will remove the tag \"%s\" from %d photos. Continue?"
+msgstr[0] "這會移除「%s」標籤,共 %d 張相片。要繼續嗎?"
+
+#: ../src/Dialogs.vala:20 ../src/Dialogs.vala:28 ../src/Dialogs.vala:1329
+#: ../src/Resources.vala:330 ../src/Resources.vala:378
+#: ../src/Resources.vala:643
+msgid "_Delete"
+msgstr "刪除(_D)"
+
+#: ../src/Dialogs.vala:25
+#, c-format
+msgid "This will remove the saved search \"%s\". Continue?"
+msgstr "這會移除儲存的「%s」搜尋。要繼續嗎?"
+
+#: ../src/Dialogs.vala:35
+msgid ""
+"Switching developers will undo all changes you have made to this photo in "
+"Shotwell"
+msgid_plural ""
+"Switching developers will undo all changes you have made to these photos in "
+"Shotwell"
+msgstr[0] "切換顯影器將取消所有您在 Shotwell 中對此相片中所做過的變更動作"
+
+#: ../src/Dialogs.vala:39
+msgid "_Switch Developer"
+msgstr "切換顯影器(_S)"
+
+#: ../src/Dialogs.vala:58
+msgid "Export Video"
+msgstr "匯出視訊"
+
+#. Ticket #3023
+#. Attempt to replace the system error with something friendlier
+#. if we can't copy an image over for editing in an external tool.
+#. Did we fail because we can't write to this directory?
+#. Yes - display an alternate error message here.
+#: ../src/Dialogs.vala:115
+#, c-format
+msgid ""
+"Shotwell couldn't create a file for editing this photo because you do not "
+"have permission to write to %s."
+msgstr "因為您尚未獲取寫入 %s 的授權,Shotwell 無法建立檔案以供此相片編輯。"
+
+#: ../src/Dialogs.vala:124
+msgid ""
+"Unable to export the following photo due to a file error.\n"
+"\n"
+msgstr ""
+"由於檔案錯誤,無法匯出下列相片。\n"
+"\n"
+
+#: ../src/Dialogs.vala:130
+msgid ""
+"\n"
+"\n"
+"Would you like to continue exporting?"
+msgstr ""
+"\n"
+"\n"
+"您想要繼續匯出嗎?"
+
+#. "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+#. aren't formats so much as they are operating modes that determine specific formats.
+#. Hereafter we'll refer to these as "special formats."
+#: ../src/Dialogs.vala:147
+msgid "Unmodified"
+msgstr "未修改"
+
+#: ../src/Dialogs.vala:148
+msgid "Current"
+msgstr "目前"
+
+#. layout controls
+#: ../src/Dialogs.vala:212
+msgid "_Format:"
+msgstr "格式(_F):"
+
+#: ../src/Dialogs.vala:215
+msgid "_Quality:"
+msgstr "品質(_Q):"
+
+#: ../src/Dialogs.vala:218
+msgid "_Scaling constraint:"
+msgstr "縮放限制(_S):"
+
+#: ../src/Dialogs.vala:221
+msgid " _pixels"
+msgstr "畫素(_P)"
+
+#: ../src/Dialogs.vala:229
+msgid "Export metadata"
+msgstr "匯出中介資料"
+
+#: ../src/Dialogs.vala:465
+msgid "Save Details..."
+msgstr "儲存細節..."
+
+#: ../src/Dialogs.vala:466
+msgid "Save Details"
+msgstr "儲存細節"
+
+#: ../src/Dialogs.vala:481
+#, c-format
+msgid "(and %d more)\n"
+msgstr "(還有 %d 項)\n"
+
+#: ../src/Dialogs.vala:534
+msgid "Import Results Report"
+msgstr "匯入成果報告"
+
+#: ../src/Dialogs.vala:538
+#, c-format
+msgid "Attempted to import %d file."
+msgid_plural "Attempted to import %d files."
+msgstr[0] "試圖匯入 %d 份檔案。"
+
+#: ../src/Dialogs.vala:541
+#, c-format
+msgid "Of these, %d file was successfully imported."
+msgid_plural "Of these, %d files were successfully imported."
+msgstr[0] "其中有 %d 份檔案已成功匯入。"
+
+#.
+#. Duplicates
+#.
+#: ../src/Dialogs.vala:553
+msgid "Duplicate Photos/Videos Not Imported:"
+msgstr "重複的相片/視訊並未匯入:"
+
+#: ../src/Dialogs.vala:557
+msgid "duplicates existing media item"
+msgstr "媒體項目與既有媒體重複"
+
+#.
+#. Files Not Imported Due to Camera Errors
+#.
+#: ../src/Dialogs.vala:568
+msgid "Photos/Videos Not Imported Due to Camera Errors:"
+msgstr "相片/視訊因相機錯誤而未匯入:"
+
+#: ../src/Dialogs.vala:571 ../src/Dialogs.vala:586 ../src/Dialogs.vala:601
+#: ../src/Dialogs.vala:617 ../src/Dialogs.vala:632 ../src/Dialogs.vala:646
+msgid "error message:"
+msgstr "錯誤訊息:"
+
+#.
+#. Files Not Imported Because They Weren't Recognized as Photos or Videos
+#.
+#: ../src/Dialogs.vala:582
+msgid "Files Not Imported Because They Weren't Recognized as Photos or Videos:"
+msgstr "檔案因無法辨識出是相片或視訊而未匯入:"
+
+#.
+#. Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+#.
+#: ../src/Dialogs.vala:597
+msgid ""
+"Photos/Videos Not Imported Because They Weren't in a Format Shotwell "
+"Understands:"
+msgstr "相片/視訊因格式並非 Shotwell 所能認識而未匯入:"
+
+#.
+#. Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+#.
+#: ../src/Dialogs.vala:612
+msgid ""
+"Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its "
+"Library:"
+msgstr "相片/視訊因 Shotwell 無法將它們複製到珍藏館中而未匯入:"
+
+#: ../src/Dialogs.vala:616
+#, c-format
+msgid ""
+"couldn't copy %s\n"
+"\tto %s"
+msgstr ""
+"無法將 %2$s\n"
+"\t複製到 %1$s"
+
+#.
+#. Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+#.
+#: ../src/Dialogs.vala:628
+msgid "Photos/Videos Not Imported Because Files Are Corrupt:"
+msgstr "相片/視訊因檔案損毀而未匯入:"
+
+#.
+#. Photos/Videos Not Imported for Other Reasons
+#.
+#: ../src/Dialogs.vala:643
+msgid "Photos/Videos Not Imported for Other Reasons:"
+msgstr "相片/視訊因其他原因而未匯入:"
+
+#: ../src/Dialogs.vala:663
+#, c-format
+msgid "1 duplicate photo was not imported:\n"
+msgid_plural "%d duplicate photos were not imported:\n"
+msgstr[0] "%d 份相片複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:666
+#, c-format
+msgid "1 duplicate video was not imported:\n"
+msgid_plural "%d duplicate videos were not imported:\n"
+msgstr[0] "%d 份視訊複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:669
+#, c-format
+msgid "1 duplicate photo/video was not imported:\n"
+msgid_plural "%d duplicate photos/videos were not imported:\n"
+msgstr[0] "%d 份相片/視訊複本未被匯入:\n"
+
+#: ../src/Dialogs.vala:683
+#, c-format
+msgid "1 photo failed to import due to a file or hardware error:\n"
+msgid_plural "%d photos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬體錯誤,%d 張相片匯入失敗:\n"
+
+#: ../src/Dialogs.vala:686
+#, c-format
+msgid "1 video failed to import due to a file or hardware error:\n"
+msgid_plural "%d videos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬體錯誤,%d 份視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:689
+#, c-format
+msgid "1 photo/video failed to import due to a file or hardware error:\n"
+msgid_plural ""
+"%d photos/videos failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬體錯誤,%d 份相片/視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:692
+#, c-format
+msgid "1 file failed to import due to a file or hardware error:\n"
+msgid_plural "%d files failed to import due to a file or hardware error:\n"
+msgstr[0] "由於檔案或硬體錯誤,%d 份檔案未能匯入:\n"
+
+#: ../src/Dialogs.vala:706
+#, c-format
+msgid ""
+"1 photo failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d photos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:709
+#, c-format
+msgid ""
+"1 video failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:712
+#, c-format
+msgid ""
+"1 photo/video failed to import because the photo library folder was not "
+"writable:\n"
+msgid_plural ""
+"%d photos/videos failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份相片/視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:715
+#, c-format
+msgid ""
+"1 file failed to import because the photo library folder was not writable:\n"
+msgid_plural ""
+"%d files failed to import because the photo library folder was not "
+"writable:\n"
+msgstr[0] "因為相片珍藏館資料夾無法寫入,%d 份檔案未能匯入:\n"
+
+#: ../src/Dialogs.vala:729
+#, c-format
+msgid "1 photo failed to import due to a camera error:\n"
+msgid_plural "%d photos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 張相片匯入失敗:\n"
+
+#: ../src/Dialogs.vala:732
+#, c-format
+msgid "1 video failed to import due to a camera error:\n"
+msgid_plural "%d videos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 份視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:735
+#, c-format
+msgid "1 photo/video failed to import due to a camera error:\n"
+msgid_plural "%d photos/videos failed to import due to a camera error:\n"
+msgstr[0] "由於相機錯誤,%d 份相片/視訊匯入失敗:\n"
+
+#: ../src/Dialogs.vala:738
+#, c-format
+msgid "1 file failed to import due to a camera error:\n"
+msgid_plural "%d files failed to import due to a camera error:\n"
+msgstr[0] "%d 份檔案因相機錯誤而未能匯入:\n"
+
+#: ../src/Dialogs.vala:752
+#, c-format
+msgid "1 photo failed to import because it was corrupt:\n"
+msgid_plural "%d photos failed to import because they were corrupt:\n"
+msgstr[0] "%d 張相片因相片損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:755
+#, c-format
+msgid "1 video failed to import because it was corrupt:\n"
+msgid_plural "%d videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 份視訊因視訊損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:758
+#, c-format
+msgid "1 photo/video failed to import because it was corrupt:\n"
+msgid_plural "%d photos/videos failed to import because they were corrupt:\n"
+msgstr[0] "%d 份相片/視訊因損毀而未能匯入:\n"
+
+#: ../src/Dialogs.vala:761
+#, c-format
+msgid "1 file failed to import because it was corrupt:\n"
+msgid_plural "%d files failed to import because it was corrupt:\n"
+msgstr[0] "%d 份檔案因損毀而未能匯入:\n"
+
+#. we have no notion of "unsupported" video files right now in Shotwell (all
+#. standard container formats are supported, it's just that the streams in them
+#. might or might not be interpretable), so this message does not need to be
+#. media specific
+#: ../src/Dialogs.vala:778
+#, c-format
+msgid "1 unsupported photo skipped:\n"
+msgid_plural "%d unsupported photos skipped:\n"
+msgstr[0] "已略過 %d 張未支援相片:\n"
+
+#. we have no notion of "non-video" video files right now in Shotwell, so this
+#. message doesn't need to be media specific
+#: ../src/Dialogs.vala:793
+#, c-format
+msgid "1 non-image file skipped.\n"
+msgid_plural "%d non-image files skipped.\n"
+msgstr[0] "已略過 %d 份非影像檔案。\n"
+
+#: ../src/Dialogs.vala:804
+#, c-format
+msgid "1 photo skipped due to user cancel:\n"
+msgid_plural "%d photos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 張相片:\n"
+
+#: ../src/Dialogs.vala:807
+#, c-format
+msgid "1 video skipped due to user cancel:\n"
+msgid_plural "%d videos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 份視訊:\n"
+
+#: ../src/Dialogs.vala:810
+#, c-format
+msgid "1 photo/video skipped due to user cancel:\n"
+msgid_plural "%d photos/videos skipped due to user cancel:\n"
+msgstr[0] "由於使用者取消,已略過 %d 份相片/視訊:\n"
+
+#: ../src/Dialogs.vala:813
+#, c-format
+msgid "1 file skipped due to user cancel:\n"
+msgid_plural "%d file skipped due to user cancel:\n"
+msgstr[0] "%d 檔案已略過,因為使用者取消:\n"
+
+#: ../src/Dialogs.vala:827
+#, c-format
+msgid "1 photo successfully imported.\n"
+msgid_plural "%d photos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 張相片。\n"
+
+#: ../src/Dialogs.vala:830
+#, c-format
+msgid "1 video successfully imported.\n"
+msgid_plural "%d videos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 份視訊。\n"
+
+#: ../src/Dialogs.vala:833
+#, c-format
+msgid "1 photo/video successfully imported.\n"
+msgid_plural "%d photos/videos successfully imported.\n"
+msgstr[0] "已成功匯入 %d 份相片/視訊。\n"
+
+#. if no media items were imported at all (i.e. an empty directory attempted), need to at least
+#. report that nothing was imported
+#: ../src/Dialogs.vala:849
+msgid "No photos or videos imported.\n"
+msgstr "沒有匯入相片或視訊。\n"
+
+#: ../src/Dialogs.vala:856 ../src/Dialogs.vala:875
+msgid "Import Complete"
+msgstr "完成匯入"
+
+#: ../src/Dialogs.vala:1103
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 秒"
+
+#: ../src/Dialogs.vala:1106
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 分鐘"
+
+#: ../src/Dialogs.vala:1110
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 小時"
+
+#: ../src/Dialogs.vala:1113
+msgid "1 day"
+msgstr "1 天"
+
+#: ../src/Dialogs.vala:1263 ../src/Resources.vala:205
+msgid "Rename Event"
+msgstr "重新命名事件"
+
+#: ../src/Dialogs.vala:1263
+msgid "Name:"
+msgstr "名稱:"
+
+#: ../src/Dialogs.vala:1273 ../src/Resources.vala:274
+msgid "Edit Title"
+msgstr "編輯標題"
+
+#: ../src/Dialogs.vala:1273 ../src/Properties.vala:340
+msgid "Title:"
+msgstr "標題:"
+
+#: ../src/Dialogs.vala:1287 ../src/Resources.vala:280
+msgid "Edit Event Comment"
+msgstr "編輯事件評註"
+
+#: ../src/Dialogs.vala:1287
+msgid "Edit Photo/Video Comment"
+msgstr "編輯相片/視訊評註"
+
+#: ../src/Dialogs.vala:1288 ../src/Properties.vala:630
+msgid "Comment:"
+msgstr "評註:"
+
+#: ../src/Dialogs.vala:1304
+msgid "_Trash File"
+msgid_plural "_Trash Files"
+msgstr[0] "將檔案移至回收筒(_T)"
+
+#: ../src/Dialogs.vala:1308
+msgid "Only _Remove"
+msgstr "僅移除(_R)"
+
+#: ../src/Dialogs.vala:1328 ../src/camera/ImportPage.vala:1739
+msgid "_Keep"
+msgstr "保留(_K)"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edit?"
+msgstr "是否還原外部編輯?"
+
+#: ../src/Dialogs.vala:1351
+msgid "Revert External Edits?"
+msgstr "要還原外部編輯嗎?"
+
+#: ../src/Dialogs.vala:1353
+#, c-format
+msgid "This will destroy all changes made to the external file. Continue?"
+msgid_plural ""
+"This will destroy all changes made to %d external files. Continue?"
+msgstr[0] "這會破壞 %d 份外部檔案的所有變更。要繼續嗎?"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edit"
+msgstr "還原外部編輯(_V)"
+
+#: ../src/Dialogs.vala:1357
+msgid "Re_vert External Edits"
+msgstr "還原外部編輯(_V)"
+
+#: ../src/Dialogs.vala:1378
+#, c-format
+msgid "This will remove the photo from the library. Continue?"
+msgid_plural "This will remove %d photos from the library. Continue?"
+msgstr[0] "這會從珍藏館移除 %d 張相片。要繼續嗎?"
+
+#: ../src/Dialogs.vala:1385
+msgid "_Remove"
+msgstr "移除(_R)"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photo From Library"
+msgstr "從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:1386
+msgid "Remove Photos From Library"
+msgstr "從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:1479
+#, c-format
+msgid "%d%%"
+msgstr "%d%%"
+
+#: ../src/Dialogs.vala:1626
+msgid "AM"
+msgstr "上午"
+
+#: ../src/Dialogs.vala:1627
+msgid "PM"
+msgstr "下午"
+
+#: ../src/Dialogs.vala:1628
+msgid "24 Hr"
+msgstr "24 時制"
+
+#: ../src/Dialogs.vala:1643
+msgid "_Shift photos/videos by the same amount"
+msgstr "以相同的量挪動相片/視訊(_S)"
+
+#: ../src/Dialogs.vala:1648
+msgid "Set _all photos/videos to this time"
+msgstr "將全部相片/視訊設定為本時間(_A)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo file"
+msgstr "修改原始相片檔案(_M)"
+
+#: ../src/Dialogs.vala:1655
+msgid "_Modify original photo files"
+msgstr "修改原始相片檔案(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original file"
+msgstr "修改原始檔案(_M)"
+
+#: ../src/Dialogs.vala:1658
+msgid "_Modify original files"
+msgstr "修改原始檔案(_M)"
+
+#: ../src/Dialogs.vala:1744
+msgid "Original: "
+msgstr "原始:"
+
+#: ../src/Dialogs.vala:1745
+msgid "%m/%d/%Y, %H:%M:%S"
+msgstr "%Y/%m/%d %H:%M:%S"
+
+#: ../src/Dialogs.vala:1746
+msgid "%m/%d/%Y, %I:%M:%S %p"
+msgstr "%Y/%m/%d %p %I:%M:%S"
+
+#: ../src/Dialogs.vala:1835
+#, c-format
+msgid ""
+"Exposure time will be shifted forward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光時間將往前挪動\n"
+"%d %s、%d %s、%d %s、%d %s。"
+
+#: ../src/Dialogs.vala:1836
+#, c-format
+msgid ""
+"Exposure time will be shifted backward by\n"
+"%d %s, %d %s, %d %s, and %d %s."
+msgstr ""
+"曝光時間將往後挪動\n"
+"%d %s、%d %s、%d %s、%d %s。"
+
+#: ../src/Dialogs.vala:1838
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: ../src/Dialogs.vala:1839
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小時"
+
+#: ../src/Dialogs.vala:1840
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分鐘"
+
+#: ../src/Dialogs.vala:1841
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "秒"
+
+#: ../src/Dialogs.vala:1885
+#, c-format
+msgid ""
+"\n"
+"\n"
+"And %d other."
+msgid_plural ""
+"\n"
+"\n"
+"And %d others."
+msgstr[0] ""
+"\n"
+"\n"
+"與其它 %d 項。"
+
+#: ../src/Dialogs.vala:1907 ../src/Dialogs.vala:1934
+msgid "Tags (separated by commas):"
+msgstr "標籤 (以半形逗號 \",\" 隔開):"
+
+#: ../src/Dialogs.vala:2014
+msgid "Welcome!"
+msgstr "歡迎!"
+
+#: ../src/Dialogs.vala:2021
+msgid "Welcome to Shotwell!"
+msgstr "歡迎使用 Shotwell!"
+
+#: ../src/Dialogs.vala:2025
+msgid "To get started, import photos in any of these ways:"
+msgstr "若要開始操作,請以這些方式之一匯入相片:"
+
+#: ../src/Dialogs.vala:2044
+#, c-format
+msgid "Choose <span weight=\"bold\">File %s Import From Folder</span>"
+msgstr "選擇 <span weight=\"bold\">檔案 %s 從資料夾匯入</span>"
+
+#: ../src/Dialogs.vala:2045
+msgid "Drag and drop photos onto the Shotwell window"
+msgstr "將相片拖放至 Shotwell 視窗"
+
+#: ../src/Dialogs.vala:2046
+msgid "Connect a camera to your computer and import"
+msgstr "將相機連接至您的電腦並匯入"
+
+#: ../src/Dialogs.vala:2056
+#, c-format
+msgid "_Import photos from your %s folder"
+msgstr "從您的 %s 目錄匯入相片(_I)"
+
+#: ../src/Dialogs.vala:2063
+msgid "You can also import photos in any of these ways:"
+msgstr "您可以藉這些方式之一匯入相片:"
+
+#: ../src/Dialogs.vala:2073
+msgid "_Don't show this message again"
+msgstr "不要再次顯示此訊息(_D)"
+
+#: ../src/Dialogs.vala:2108
+#, c-format
+msgid "Import photos from your %s library"
+msgstr "從您的 %s 珍藏館匯入相片"
+
+#. We're installed system-wide, so use the system help.
+#. We're being run from the build directory; we'll have to handle clicks to this
+#. link manually ourselves, due to a limitation ghelp: URIs.
+#: ../src/Dialogs.vala:2252 ../src/Dialogs.vala:2256
+msgid "(Help)"
+msgstr "(幫助)"
+
+#: ../src/Dialogs.vala:2265
+#, c-format
+msgid "Year%sMonth%sDay"
+msgstr "年%s月%s日"
+
+#: ../src/Dialogs.vala:2267
+#, c-format
+msgid "Year%sMonth"
+msgstr "年%s月"
+
+#: ../src/Dialogs.vala:2269
+#, c-format
+msgid "Year%sMonth-Day"
+msgstr "年%s月-日"
+
+#: ../src/Dialogs.vala:2271
+msgid "Year-Month-Day"
+msgstr "年-月-日"
+
+#: ../src/Dialogs.vala:2272 ../src/editing_tools/EditingTools.vala:781
+msgid "Custom"
+msgstr "自訂"
+
+#. Invalid pattern.
+#: ../src/Dialogs.vala:2509
+msgid "Invalid pattern"
+msgstr "無效的樣式"
+
+#. This function is used to determine whether or not files should be copied or linked when imported.
+#. Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+#: ../src/Dialogs.vala:2612
+msgid ""
+"Shotwell can copy the photos into your library folder or it can import them "
+"without copying."
+msgstr "Shotwell 可以複製相片至您的珍藏館,或是直接將它們匯入而不必複製。"
+
+#: ../src/Dialogs.vala:2617
+msgid "Co_py Photos"
+msgstr "複製相片(_P)"
+
+#: ../src/Dialogs.vala:2618
+msgid "_Import in Place"
+msgstr "匯入位置(_I)"
+
+#: ../src/Dialogs.vala:2619
+msgid "Import to Library"
+msgstr "匯入至珍藏館"
+
+#: ../src/Dialogs.vala:2629 ../src/PhotoPage.vala:3079
+msgid "Remove From Library"
+msgstr "從珍藏館移除"
+
+#: ../src/Dialogs.vala:2630 ../src/PhotoPage.vala:3079
+msgid "Removing Photo From Library"
+msgstr "正在從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:2630
+msgid "Removing Photos From Library"
+msgstr "正在從珍藏館移除相片"
+
+#: ../src/Dialogs.vala:2644
+#, c-format
+msgid ""
+"This will remove the photo/video from your Shotwell library. Would you also "
+"like to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos/videos from your Shotwell library. Would you "
+"also like to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從您的 Shotwell 珍藏館移除 %d 份相片/視訊。您是否也想要將這些檔案移至您的"
+"桌面回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2648
+#, c-format
+msgid ""
+"This will remove the video from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d videos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從您的 Shotwell 珍藏館移除 %d 份視訊。您是否也想要將這些檔案移至您的桌面"
+"回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2652
+#, c-format
+msgid ""
+"This will remove the photo from your Shotwell library. Would you also like "
+"to move the file to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgid_plural ""
+"This will remove %d photos from your Shotwell library. Would you also like "
+"to move the files to your desktop trash?\n"
+"\n"
+"This action cannot be undone."
+msgstr[0] ""
+"這會從您的 Shotwell 珍藏館移除 %d 張相片。您是否也想要將這些檔案移至您的桌面"
+"回收筒呢?\n"
+"\n"
+"這個動作無法還原。"
+
+#: ../src/Dialogs.vala:2684
+#, c-format
+msgid ""
+"The photo or video cannot be moved to your desktop trash. Delete this file?"
+msgid_plural ""
+"%d photos/videos cannot be moved to your desktop trash. Delete these files?"
+msgstr[0] "%d 份相片/視訊無法移至您的桌面回收筒。要刪除這些檔案嗎?"
+
+#. Alert the user that the files were not removed.
+#: ../src/Dialogs.vala:2701
+#, c-format
+msgid "The photo or video cannot be deleted."
+msgid_plural "%d photos/videos cannot be deleted."
+msgstr[0] "%d 份相片/視訊無法刪除。"
+
+#: ../src/Dimensions.vala:20
+msgid "Width or height"
+msgstr "寬度或高度"
+
+#: ../src/Dimensions.vala:23
+msgid "Width"
+msgstr "寬度"
+
+#: ../src/Dimensions.vala:26
+msgid "Height"
+msgstr "高度"
+
+#. verify this is a directory
+#: ../src/DirectoryMonitor.vala:889
+#, c-format
+msgid "Unable to monitor %s: Not a directory (%s)"
+msgstr "無法監視 %s:非目錄 (%s)"
+
+#. if no name, pretty up the start time
+#: ../src/Event.vala:737
+#, c-format
+msgid "Event %s"
+msgstr "事件 %s"
+
+#: ../src/Exporter.vala:232
+#, c-format
+msgid "Unable to generate a temporary file for %s: %s"
+msgstr "無法為 %s 建立暫時檔案:%s"
+
+#: ../src/Exporter.vala:299
+msgid "Exporting"
+msgstr "正在匯出"
+
+#: ../src/Exporter.vala:317
+#, c-format
+msgid "File %s already exists. Replace?"
+msgstr "檔案 %s 已經存在。要取代嗎?"
+
+#: ../src/Exporter.vala:319
+msgid "_Skip"
+msgstr "跳過(_S)"
+
+#: ../src/Exporter.vala:319
+msgid "_Replace"
+msgstr "取代(_R)"
+
+#: ../src/Exporter.vala:319
+msgid "Replace _All"
+msgstr "全部取代(_A)"
+
+#: ../src/Exporter.vala:319
+msgid "Export"
+msgstr "匯出"
+
+#: ../src/MediaMonitor.vala:400
+#, c-format
+msgid "Unable to process monitoring updates: %s"
+msgstr "無法處理監視更新:%s"
+
+#: ../src/MediaPage.vala:143
+msgid "Adjust the size of the thumbnails"
+msgstr "調整縮圖大小"
+
+#: ../src/MediaPage.vala:325 ../src/PhotoPage.vala:2583
+#: ../src/direct/DirectPhotoPage.vala:174
+msgid "Zoom _In"
+msgstr "拉近(_I)"
+
+#: ../src/MediaPage.vala:326
+msgid "Increase the magnification of the thumbnails"
+msgstr "放大縮圖"
+
+#: ../src/MediaPage.vala:331 ../src/PhotoPage.vala:2589
+#: ../src/direct/DirectPhotoPage.vala:180
+msgid "Zoom _Out"
+msgstr "拉遠(_O)"
+
+#: ../src/MediaPage.vala:332
+msgid "Decrease the magnification of the thumbnails"
+msgstr "縮小縮圖"
+
+#: ../src/MediaPage.vala:399
+msgid "Sort _Photos"
+msgstr "排序相片(_P)"
+
+#: ../src/MediaPage.vala:408
+msgid "_Play Video"
+msgstr "播放視訊(_P)"
+
+#: ../src/MediaPage.vala:409
+msgid "Open the selected videos in the system video player"
+msgstr "在系統影片播放程式內開啟所選的視訊"
+
+#: ../src/MediaPage.vala:413 ../src/PhotoPage.vala:2632
+msgid "_Developer"
+msgstr "顯影器(_D)"
+
+#: ../src/MediaPage.vala:420 ../src/photos/RawSupport.vala:297
+msgid "Shotwell"
+msgstr "Shotwell"
+
+#: ../src/MediaPage.vala:425 ../src/camera/Branch.vala:101
+#: ../src/camera/ImportPage.vala:711 ../src/camera/ImportPage.vala:727
+#: ../src/photos/RawSupport.vala:300
+msgid "Camera"
+msgstr "相機"
+
+#: ../src/MediaPage.vala:436 ../src/camera/ImportPage.vala:872
+msgid "_Titles"
+msgstr "標題(_T)"
+
+#: ../src/MediaPage.vala:437 ../src/camera/ImportPage.vala:873
+msgid "Display the title of each photo"
+msgstr "顯示每張相片的標題"
+
+#: ../src/MediaPage.vala:442 ../src/events/EventsDirectoryPage.vala:130
+msgid "_Comments"
+msgstr "評註(_C)"
+
+#: ../src/MediaPage.vala:443
+msgid "Display the comment of each photo"
+msgstr "顯示每張相片的評註"
+
+#: ../src/MediaPage.vala:454 ../src/library/LibraryWindow.vala:376
+msgid "Ta_gs"
+msgstr "標籤(_G)"
+
+#: ../src/MediaPage.vala:455
+msgid "Display each photo's tags"
+msgstr "顯示每張相片的標籤"
+
+#: ../src/MediaPage.vala:471
+msgid "By _Title"
+msgstr "依標題(_T)"
+
+#: ../src/MediaPage.vala:472
+msgid "Sort photos by title"
+msgstr "依標題排序相片"
+
+#: ../src/MediaPage.vala:477
+msgid "By Exposure _Date"
+msgstr "依拍攝日期(_D)"
+
+#: ../src/MediaPage.vala:478
+msgid "Sort photos by exposure date"
+msgstr "依拍攝日期排序照片"
+
+#: ../src/MediaPage.vala:483
+msgid "By _Rating"
+msgstr "依評等(_R)"
+
+#: ../src/MediaPage.vala:484
+msgid "Sort photos by rating"
+msgstr "依評等排序相片"
+
+#: ../src/MediaPage.vala:494 ../src/library/LibraryWindow.vala:422
+msgid "_Ascending"
+msgstr "遞增(_A)"
+
+#: ../src/MediaPage.vala:495 ../src/library/LibraryWindow.vala:423
+msgid "Sort photos in an ascending order"
+msgstr "以遞增方式排序相片"
+
+#: ../src/MediaPage.vala:500 ../src/library/LibraryWindow.vala:429
+msgid "D_escending"
+msgstr "遞減(_E)"
+
+#: ../src/MediaPage.vala:501 ../src/library/LibraryWindow.vala:430
+msgid "Sort photos in a descending order"
+msgstr "以遞減方式排序相片"
+
+#: ../src/MediaPage.vala:702
+#, c-format
+msgid ""
+"Shotwell was unable to play the selected video:\n"
+"%s"
+msgstr ""
+"Shotwell 無法播放所選的視訊:\n"
+"%s"
+
+#: ../src/Page.vala:1268
+msgid "No photos/videos"
+msgstr "無相片/視訊"
+
+#: ../src/Page.vala:1272
+msgid "No photos/videos found"
+msgstr "找不到相片或視訊"
+
+#: ../src/Page.vala:2569
+msgid "Photos cannot be exported to this directory."
+msgstr "無法匯出相片至此目錄。"
+
+#: ../src/Photo.vala:3656
+msgid "modified"
+msgstr "已修改"
+
+#. previous button
+#: ../src/PhotoPage.vala:532
+msgid "Previous photo"
+msgstr "上一張相片"
+
+#. next button
+#: ../src/PhotoPage.vala:537
+msgid "Next photo"
+msgstr "下一張相片"
+
+#: ../src/PhotoPage.vala:1844
+#, c-format
+msgid "Photo source file missing: %s"
+msgstr "相片來源檔案遺失:%s"
+
+#: ../src/PhotoPage.vala:2404 ../src/direct/DirectPhotoPage.vala:165
+#: ../src/library/LibraryWindow.vala:360
+msgid "_View"
+msgstr "檢視(_V)"
+
+#: ../src/PhotoPage.vala:2408 ../src/direct/DirectPhotoPage.vala:81
+msgid "T_ools"
+msgstr "工具(_O)"
+
+#: ../src/PhotoPage.vala:2413 ../src/direct/DirectPhotoPage.vala:86
+msgid "_Previous Photo"
+msgstr "上一張相片(_P)"
+
+#: ../src/PhotoPage.vala:2414 ../src/direct/DirectPhotoPage.vala:87
+msgid "Previous Photo"
+msgstr "上一張相片"
+
+#: ../src/PhotoPage.vala:2419 ../src/direct/DirectPhotoPage.vala:92
+msgid "_Next Photo"
+msgstr "下一張相片(_N)"
+
+#: ../src/PhotoPage.vala:2420 ../src/direct/DirectPhotoPage.vala:93
+msgid "Next Photo"
+msgstr "下一張相片"
+
+#: ../src/PhotoPage.vala:2584 ../src/direct/DirectPhotoPage.vala:175
+msgid "Increase the magnification of the photo"
+msgstr "增加相片放大倍率"
+
+#: ../src/PhotoPage.vala:2590 ../src/direct/DirectPhotoPage.vala:181
+msgid "Decrease the magnification of the photo"
+msgstr "降低相片放大倍率"
+
+#: ../src/PhotoPage.vala:2595 ../src/direct/DirectPhotoPage.vala:186
+msgid "Fit to _Page"
+msgstr "使其適合頁面(_P)"
+
+#: ../src/PhotoPage.vala:2596 ../src/direct/DirectPhotoPage.vala:187
+msgid "Zoom the photo to fit on the screen"
+msgstr "將相片拉至適合螢幕大小"
+
+#: ../src/PhotoPage.vala:2602 ../src/direct/DirectPhotoPage.vala:193
+#, no-c-format
+msgid "Zoom _100%"
+msgstr "拉至 _100%"
+
+#: ../src/PhotoPage.vala:2604 ../src/direct/DirectPhotoPage.vala:195
+#, no-c-format
+msgid "Zoom the photo to 100% magnification"
+msgstr "將相片拉至 100% 倍率"
+
+#: ../src/PhotoPage.vala:2610 ../src/direct/DirectPhotoPage.vala:201
+#, no-c-format
+msgid "Zoom _200%"
+msgstr "拉至 _200%"
+
+#: ../src/PhotoPage.vala:2612 ../src/direct/DirectPhotoPage.vala:203
+#, no-c-format
+msgid "Zoom the photo to 200% magnification"
+msgstr "將相片拉至 200% 倍率"
+
+#: ../src/PhotoPage.vala:3220
+#, c-format
+msgid "Unable to export %s: %s"
+msgstr "無法匯出 %s:%s"
+
+#: ../src/Printing.vala:255
+msgid "Fill the entire page"
+msgstr "填滿整個頁面"
+
+#: ../src/Printing.vala:256
+msgid "2 images per page"
+msgstr "每頁 2 張影像"
+
+#: ../src/Printing.vala:257
+msgid "4 images per page"
+msgstr "每頁 4 張影像"
+
+#: ../src/Printing.vala:258
+msgid "6 images per page"
+msgstr "每頁 6 張影像"
+
+#: ../src/Printing.vala:259
+msgid "8 images per page"
+msgstr "每頁 8 張影像"
+
+#: ../src/Printing.vala:260
+msgid "16 images per page"
+msgstr "每頁 16 張影像"
+
+#: ../src/Printing.vala:261
+msgid "32 images per page"
+msgstr "每頁 32 張影像"
+
+#: ../src/Printing.vala:348
+msgid "in."
+msgstr "英吋"
+
+#: ../src/Printing.vala:349
+msgid "cm"
+msgstr "公分"
+
+#: ../src/Printing.vala:817 ../src/editing_tools/EditingTools.vala:761
+msgid "Wallet (2 x 3 in.)"
+msgstr "皮夾 (2 x 3 英吋)"
+
+#: ../src/Printing.vala:820 ../src/editing_tools/EditingTools.vala:762
+msgid "Notecard (3 x 5 in.)"
+msgstr "短柬 (3 x 5 英吋)"
+
+#: ../src/Printing.vala:823 ../src/editing_tools/EditingTools.vala:763
+msgid "4 x 6 in."
+msgstr "4 x 6 英吋"
+
+#: ../src/Printing.vala:826 ../src/editing_tools/EditingTools.vala:764
+msgid "5 x 7 in."
+msgstr "5 x 7 英吋"
+
+#: ../src/Printing.vala:829 ../src/editing_tools/EditingTools.vala:765
+msgid "8 x 10 in."
+msgstr "8 x 10 英吋"
+
+#: ../src/Printing.vala:832 ../src/editing_tools/EditingTools.vala:767
+msgid "11 x 14 in."
+msgstr "11 x 14 英吋"
+
+#: ../src/Printing.vala:835 ../src/editing_tools/EditingTools.vala:769
+msgid "16 x 20 in."
+msgstr "16 x 20 英吋"
+
+#: ../src/Printing.vala:841 ../src/editing_tools/EditingTools.vala:771
+msgid "Metric Wallet (9 x 13 cm)"
+msgstr "公制皮夾 (9 x 13 公分)"
+
+#: ../src/Printing.vala:844 ../src/editing_tools/EditingTools.vala:772
+msgid "Postcard (10 x 15 cm)"
+msgstr "明信片 (10 x 15 公分)"
+
+#: ../src/Printing.vala:847 ../src/editing_tools/EditingTools.vala:773
+msgid "13 x 18 cm"
+msgstr "13 x 18 公分"
+
+#: ../src/Printing.vala:850 ../src/editing_tools/EditingTools.vala:774
+msgid "18 x 24 cm"
+msgstr "18 x 24 公分"
+
+#: ../src/Printing.vala:853 ../src/editing_tools/EditingTools.vala:776
+msgid "20 x 30 cm"
+msgstr "20 x 30 公分"
+
+#: ../src/Printing.vala:856 ../src/editing_tools/EditingTools.vala:777
+msgid "24 x 40 cm"
+msgstr "24 x 40 公分"
+
+#: ../src/Printing.vala:859 ../src/editing_tools/EditingTools.vala:778
+msgid "30 x 40 cm"
+msgstr "30 x 40 公分"
+
+#: ../src/Printing.vala:875
+msgid "Image Settings"
+msgstr "影像設定值"
+
+#: ../src/Printing.vala:888
+msgid "Printing..."
+msgstr "正在列印..."
+
+#: ../src/Printing.vala:908 ../src/Printing.vala:1111
+#, c-format
+msgid ""
+"Unable to print photo:\n"
+"\n"
+"%s"
+msgstr ""
+"無法列印相片:\n"
+"\n"
+"%s"
+
+#: ../src/Properties.vala:84
+msgid "Today"
+msgstr "今天"
+
+#: ../src/Properties.vala:86
+msgid "Yesterday"
+msgstr "昨天"
+
+#: ../src/Properties.vala:227 ../src/camera/ImportPage.vala:312
+msgid "RAW+JPEG"
+msgstr "RAW+JPEG"
+
+#: ../src/Properties.vala:343
+msgid "Items:"
+msgstr "項目:"
+
+#: ../src/Properties.vala:346
+#, c-format
+msgid "%d Event"
+msgid_plural "%d Events"
+msgstr[0] "%d 個事件"
+
+#: ../src/Properties.vala:353 ../src/events/EventDirectoryItem.vala:87
+#, c-format
+msgid "%d Photo"
+msgid_plural "%d Photos"
+msgstr[0] "%d 張相片"
+
+#: ../src/Properties.vala:355 ../src/events/EventDirectoryItem.vala:85
+#, c-format
+msgid "%d Video"
+msgid_plural "%d Videos"
+msgstr[0] "%d 份視訊"
+
+#. display only one date if start and end are the same
+#: ../src/Properties.vala:377
+msgid "Date:"
+msgstr "日期:"
+
+#. display only one time if start and end are the same
+#: ../src/Properties.vala:381
+msgid "Time:"
+msgstr "時間:"
+
+#. display time range
+#. display date range
+#: ../src/Properties.vala:384 ../src/Properties.vala:389
+msgid "From:"
+msgstr "從:"
+
+#: ../src/Properties.vala:385 ../src/Properties.vala:390
+msgid "To:"
+msgstr "到:"
+
+#: ../src/Properties.vala:395 ../src/editing_tools/EditingTools.vala:1861
+msgid "Size:"
+msgstr "大小:"
+
+#: ../src/Properties.vala:404
+msgid "Duration:"
+msgstr "時間:"
+
+#: ../src/Properties.vala:404
+#, c-format
+msgid "%.1f seconds"
+msgstr "%.1f 秒"
+
+#: ../src/Properties.vala:408
+msgid "Developer:"
+msgstr "顯影器:"
+
+#. fit both on the top line, emit and move on
+#: ../src/Properties.vala:436 ../src/Properties.vala:440
+#: ../src/Properties.vala:447 ../src/editing_tools/EditingTools.vala:2229
+msgid "Exposure:"
+msgstr "曝光:"
+
+#. nothing special to be done for now for Events
+#: ../src/Properties.vala:585
+msgid "Location:"
+msgstr "位置:"
+
+#: ../src/Properties.vala:588
+msgid "File size:"
+msgstr "檔案大小:"
+
+#: ../src/Properties.vala:592
+msgid "Current Development:"
+msgstr "目前顯影:"
+
+#: ../src/Properties.vala:594
+msgid "Original dimensions:"
+msgstr "原始維度:"
+
+#: ../src/Properties.vala:597
+msgid "Camera make:"
+msgstr "相機製造商:"
+
+#: ../src/Properties.vala:600
+msgid "Camera model:"
+msgstr "相機型號:"
+
+#: ../src/Properties.vala:603
+msgid "Flash:"
+msgstr "閃光:"
+
+#: ../src/Properties.vala:605
+msgid "Focal length:"
+msgstr "焦距:"
+
+#: ../src/Properties.vala:608
+msgid "Exposure date:"
+msgstr "曝光日期:"
+
+#: ../src/Properties.vala:611
+msgid "Exposure time:"
+msgstr "曝光時間:"
+
+#: ../src/Properties.vala:614
+msgid "Exposure bias:"
+msgstr "曝光補償:"
+
+#: ../src/Properties.vala:616
+msgid "GPS latitude:"
+msgstr "GPS 緯度:"
+
+#: ../src/Properties.vala:619
+msgid "GPS longitude:"
+msgstr "GPS 經度:"
+
+#: ../src/Properties.vala:622
+msgid "Artist:"
+msgstr "藝人:"
+
+#: ../src/Properties.vala:624
+msgid "Copyright:"
+msgstr "著作權:"
+
+#: ../src/Properties.vala:626
+msgid "Software:"
+msgstr "軟體:"
+
+#: ../src/Properties.vala:639
+msgid "Extended Information"
+msgstr "擴充資訊"
+
+#: ../src/Resources.vala:17
+msgid "Photo Manager"
+msgstr "相片管理員"
+
+#: ../src/Resources.vala:18
+msgid "Photo Viewer"
+msgstr "相片檢視器"
+
+#: ../src/Resources.vala:144
+msgid "Rotate _Right"
+msgstr "向右旋轉(_R)"
+
+#: ../src/Resources.vala:145 ../src/Resources.vala:150
+msgid "Rotate"
+msgstr "旋轉"
+
+#: ../src/Resources.vala:146
+msgid "Rotate Right"
+msgstr "向右旋轉"
+
+#: ../src/Resources.vala:147
+msgid "Rotate the photos right (press Ctrl to rotate left)"
+msgstr "將相片向右旋轉 (按下 Ctrl 鍵以向左旋轉)"
+
+#: ../src/Resources.vala:149
+msgid "Rotate _Left"
+msgstr "向左旋轉(_L)"
+
+#: ../src/Resources.vala:151
+msgid "Rotate Left"
+msgstr "向左旋轉"
+
+#: ../src/Resources.vala:152
+msgid "Rotate the photos left"
+msgstr "將相片向左旋轉"
+
+#: ../src/Resources.vala:154
+msgid "Flip Hori_zontally"
+msgstr "水平翻轉(_Z)"
+
+#: ../src/Resources.vala:155
+msgid "Flip Horizontally"
+msgstr "水平翻轉"
+
+#: ../src/Resources.vala:157
+msgid "Flip Verti_cally"
+msgstr "垂直翻轉(_C)"
+
+#: ../src/Resources.vala:158
+msgid "Flip Vertically"
+msgstr "垂直翻轉"
+
+#: ../src/Resources.vala:160
+msgid "_Enhance"
+msgstr "優化(_E)"
+
+#: ../src/Resources.vala:161
+msgid "Enhance"
+msgstr "優化"
+
+#: ../src/Resources.vala:162
+msgid "Automatically improve the photo's appearance"
+msgstr "自動優化相片外觀"
+
+#: ../src/Resources.vala:164
+msgid "_Copy Color Adjustments"
+msgstr "複製色彩調整(_C)"
+
+#: ../src/Resources.vala:165
+msgid "Copy Color Adjustments"
+msgstr "複製色彩調整"
+
+#: ../src/Resources.vala:166
+msgid "Copy the color adjustments applied to the photo"
+msgstr "複製套用至該相片的色彩調整"
+
+#: ../src/Resources.vala:168
+msgid "_Paste Color Adjustments"
+msgstr "貼上色彩調整(_P)"
+
+#: ../src/Resources.vala:169
+msgid "Paste Color Adjustments"
+msgstr "貼上色彩調整"
+
+#: ../src/Resources.vala:170
+msgid "Apply copied color adjustments to the selected photos"
+msgstr "將複製的色彩調整套用至所選的相片上"
+
+#: ../src/Resources.vala:172
+msgid "_Crop"
+msgstr "裁切(_C)"
+
+#: ../src/Resources.vala:173
+msgid "Crop"
+msgstr "裁切"
+
+#: ../src/Resources.vala:174
+msgid "Crop the photo's size"
+msgstr "裁切相片大小"
+
+#: ../src/Resources.vala:176 ../src/editing_tools/StraightenTool.vala:100
+msgid "_Straighten"
+msgstr "拉直(_S)"
+
+#: ../src/Resources.vala:177
+msgid "Straighten"
+msgstr "拉直"
+
+#: ../src/Resources.vala:178
+msgid "Straighten the photo"
+msgstr "拉直相片"
+
+#: ../src/Resources.vala:180
+msgid "_Red-eye"
+msgstr "紅眼(_R)"
+
+#: ../src/Resources.vala:181
+msgid "Red-eye"
+msgstr "紅眼"
+
+#: ../src/Resources.vala:182
+msgid "Reduce or eliminate any red-eye effects in the photo"
+msgstr "減少或消除相片中的紅眼效應"
+
+#: ../src/Resources.vala:184
+msgid "_Adjust"
+msgstr "調整(_A)"
+
+#: ../src/Resources.vala:185
+msgid "Adjust"
+msgstr "調整"
+
+#: ../src/Resources.vala:186
+msgid "Adjust the photo's color and tone"
+msgstr "調整相片的色彩與色調"
+
+#: ../src/Resources.vala:188
+msgid "Re_vert to Original"
+msgstr "還原至原始(_V)"
+
+#: ../src/Resources.vala:189
+msgid "Revert to Original"
+msgstr "還原至原始"
+
+#: ../src/Resources.vala:191
+msgid "Revert External E_dits"
+msgstr "還原外部編輯(_D)"
+
+#: ../src/Resources.vala:192
+msgid "Revert to the master photo"
+msgstr "還原至主相片"
+
+#: ../src/Resources.vala:194
+msgid "Set as _Desktop Background"
+msgstr "設為桌面背景(_D)"
+
+#: ../src/Resources.vala:195
+msgid "Set selected image to be the new desktop background"
+msgstr "將所選的影像設為新的桌面背景"
+
+#: ../src/Resources.vala:196
+msgid "Set as _Desktop Slideshow..."
+msgstr "設為桌面投影秀(_D)..."
+
+#: ../src/Resources.vala:198
+msgid "_Undo"
+msgstr "復原(_U)"
+
+#: ../src/Resources.vala:199
+msgid "Undo"
+msgstr "復原"
+
+#: ../src/Resources.vala:201
+msgid "_Redo"
+msgstr "取消復原(_R)"
+
+#: ../src/Resources.vala:202
+msgid "Redo"
+msgstr "取消復原"
+
+#: ../src/Resources.vala:204
+msgid "Re_name Event..."
+msgstr "重新命名事件(_N)..."
+
+#: ../src/Resources.vala:207
+msgid "Make _Key Photo for Event"
+msgstr "作為事件的代表性相片(_K)"
+
+#: ../src/Resources.vala:208
+msgid "Make Key Photo for Event"
+msgstr "作為事件的代表性相片"
+
+#: ../src/Resources.vala:210
+msgid "_New Event"
+msgstr "新事件(_N)"
+
+#: ../src/Resources.vala:211
+msgid "New Event"
+msgstr "新事件"
+
+#: ../src/Resources.vala:213
+msgid "Move Photos"
+msgstr "移動相片"
+
+#: ../src/Resources.vala:214
+msgid "Move photos to an event"
+msgstr "移動相片至某事件"
+
+#: ../src/Resources.vala:216
+msgid "_Merge Events"
+msgstr "合併事件(_M)"
+
+#: ../src/Resources.vala:217
+msgid "Merge"
+msgstr "合併"
+
+#: ../src/Resources.vala:218
+msgid "Combine events into a single event"
+msgstr "合併多事件為單一事件"
+
+#: ../src/Resources.vala:220
+msgid "_Set Rating"
+msgstr "設定評等(_S)"
+
+#: ../src/Resources.vala:221
+msgid "Set Rating"
+msgstr "設定評等"
+
+#: ../src/Resources.vala:222
+msgid "Change the rating of your photo"
+msgstr "變更您相片的評等"
+
+#: ../src/Resources.vala:224
+msgid "_Increase"
+msgstr "增加(_I)"
+
+#: ../src/Resources.vala:225
+msgid "Increase Rating"
+msgstr "增加評等"
+
+#: ../src/Resources.vala:227
+msgid "_Decrease"
+msgstr "降低(_D)"
+
+#: ../src/Resources.vala:228
+msgid "Decrease Rating"
+msgstr "降低評等"
+
+#: ../src/Resources.vala:230
+msgid "_Unrated"
+msgstr "無評等(_U)"
+
+#: ../src/Resources.vala:231
+msgid "Unrated"
+msgstr "未評等"
+
+#: ../src/Resources.vala:232
+msgid "Rate Unrated"
+msgstr "無評等"
+
+#: ../src/Resources.vala:233
+msgid "Setting as unrated"
+msgstr "設定為無評等"
+
+#: ../src/Resources.vala:234
+msgid "Remove any ratings"
+msgstr "移除任何評等"
+
+#: ../src/Resources.vala:236
+msgid "_Rejected"
+msgstr "退絕(_R)"
+
+#: ../src/Resources.vala:237
+msgid "Rejected"
+msgstr "退絕"
+
+#: ../src/Resources.vala:238
+msgid "Rate Rejected"
+msgstr "評等退絕"
+
+#: ../src/Resources.vala:239
+msgid "Setting as rejected"
+msgstr "設定為退絕"
+
+#: ../src/Resources.vala:240
+msgid "Set rating to rejected"
+msgstr "將評等設為退絕"
+
+#: ../src/Resources.vala:242
+msgid "Rejected _Only"
+msgstr "只有退絕(_O)"
+
+#: ../src/Resources.vala:243
+msgid "Rejected Only"
+msgstr "只有退絕"
+
+#: ../src/Resources.vala:244
+msgid "Show only rejected photos"
+msgstr "只顯示退絕的相片"
+
+#: ../src/Resources.vala:246
+msgid "All + _Rejected"
+msgstr "全部 + 退絕(_R)"
+
+#: ../src/Resources.vala:247 ../src/Resources.vala:248
+msgid "Show all photos, including rejected"
+msgstr "顯示全部相片,包括退絕項目"
+
+#: ../src/Resources.vala:250
+msgid "_All Photos"
+msgstr "全部相片(_A)"
+
+#: ../src/Resources.vala:251 ../src/Resources.vala:252
+msgid "Show all photos"
+msgstr "顯示全部相片"
+
+#: ../src/Resources.vala:254
+msgid "_Ratings"
+msgstr "評等(_R)"
+
+#: ../src/Resources.vala:255
+msgid "Display each photo's rating"
+msgstr "顯示每張相片的評等"
+
+#: ../src/Resources.vala:257
+msgid "_Filter Photos"
+msgstr "過濾相片(_F)"
+
+#: ../src/Resources.vala:258
+msgid "Filter Photos"
+msgstr "過濾相片"
+
+#: ../src/Resources.vala:259
+msgid "Limit the number of photos displayed based on a filter"
+msgstr "限制過濾條件所顯示的相片數目"
+
+#: ../src/Resources.vala:261
+msgid "_Duplicate"
+msgstr "製作複本(_D)"
+
+#: ../src/Resources.vala:262
+msgid "Duplicate"
+msgstr "製作複本"
+
+#: ../src/Resources.vala:263
+msgid "Make a duplicate of the photo"
+msgstr "建立相片的複本"
+
+#: ../src/Resources.vala:265
+msgid "_Export..."
+msgstr "匯出(_E)..."
+
+#: ../src/Resources.vala:267
+msgid "_Print..."
+msgstr "列印(_P)..."
+
+#: ../src/Resources.vala:269
+msgid "Pu_blish..."
+msgstr "發布(_B)..."
+
+#: ../src/Resources.vala:271
+msgid "Publish to various websites"
+msgstr "發布至多種網站"
+
+#: ../src/Resources.vala:273
+msgid "Edit _Title..."
+msgstr "編輯標題(_T)..."
+
+#: ../src/Resources.vala:276
+msgid "Edit _Comment..."
+msgstr "編輯評註(_C)..."
+
+#: ../src/Resources.vala:277
+msgid "Edit Comment"
+msgstr "編輯評註"
+
+#: ../src/Resources.vala:279
+msgid "Edit Event _Comment..."
+msgstr "編輯事件評註(_C)..."
+
+#: ../src/Resources.vala:282
+msgid "_Adjust Date and Time..."
+msgstr "調整日期與時間(_A)..."
+
+#: ../src/Resources.vala:283
+msgid "Adjust Date and Time"
+msgstr "調整日期與時間"
+
+#: ../src/Resources.vala:285
+msgid "Add _Tags..."
+msgstr "加入標籤(_A)..."
+
+#: ../src/Resources.vala:286
+msgid "_Add Tags..."
+msgstr "添加標籤(_A)..."
+
+#: ../src/Resources.vala:287 ../src/Resources.vala:318
+msgid "Add Tags"
+msgstr "加入標籤"
+
+#: ../src/Resources.vala:289
+msgid "_Preferences"
+msgstr "偏好設定(_P)"
+
+#: ../src/Resources.vala:291
+msgid "Open With E_xternal Editor"
+msgstr "以外部編輯器開啟(_X)"
+
+#: ../src/Resources.vala:293
+msgid "Open With RA_W Editor"
+msgstr "以 RA_W 編輯器開啟"
+
+#: ../src/Resources.vala:295
+msgid "Send _To..."
+msgstr "傳送至(_T)..."
+
+#: ../src/Resources.vala:296
+msgid "Send T_o..."
+msgstr "傳送至(_O)..."
+
+#: ../src/Resources.vala:298
+msgid "_Find..."
+msgstr "尋找(_F)..."
+
+#: ../src/Resources.vala:299
+msgid "Find"
+msgstr "尋找"
+
+#: ../src/Resources.vala:300
+msgid "Find an image by typing text that appears in its name or tags"
+msgstr "輸入出現在影像的名稱內或標籤上的文字來尋找影像"
+
+#: ../src/Resources.vala:302
+msgid "_Flag"
+msgstr "加上旗幟(_F)"
+
+#: ../src/Resources.vala:304
+msgid "Un_flag"
+msgstr "移除旗幟(_F)"
+
+#: ../src/Resources.vala:307
+#, c-format
+msgid "Unable to launch editor: %s"
+msgstr "無法開啟編輯器:%s"
+
+#: ../src/Resources.vala:312
+#, c-format
+msgid "Add Tag \"%s\""
+msgstr "加入標籤「%s」"
+
+#: ../src/Resources.vala:314
+#, c-format
+msgid "Add Tags \"%s\" and \"%s\""
+msgstr "加入標籤「%s」與「%s」"
+
+#: ../src/Resources.vala:322
+#, c-format
+msgid "_Delete Tag \"%s\""
+msgstr "刪除「%s」標籤(_D)"
+
+#: ../src/Resources.vala:326
+#, c-format
+msgid "Delete Tag \"%s\""
+msgstr "刪除「%s」標籤"
+
+#: ../src/Resources.vala:329
+msgid "Delete Tag"
+msgstr "刪除標籤"
+
+#: ../src/Resources.vala:332
+msgid "_New"
+msgstr "新增(_N)"
+
+#: ../src/Resources.vala:335
+#, c-format
+msgid "Re_name Tag \"%s\"..."
+msgstr "刪除標籤「%s」..."
+
+#: ../src/Resources.vala:339
+#, c-format
+msgid "Rename Tag \"%s\" to \"%s\""
+msgstr "重新命名標籤「%s」為「%s」"
+
+#: ../src/Resources.vala:342
+msgid "_Rename..."
+msgstr "重新命名(_R)..."
+
+#: ../src/Resources.vala:344
+msgid "Modif_y Tags..."
+msgstr "修改標籤(_Y)..."
+
+#: ../src/Resources.vala:345
+msgid "Modify Tags"
+msgstr "修改標籤"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photo as \"%s\""
+msgstr "將相片加上「%s」標籤"
+
+#: ../src/Resources.vala:348
+#, c-format
+msgid "Tag Photos as \"%s\""
+msgstr "將相片加入「%s」標籤"
+
+#: ../src/Resources.vala:352
+#, c-format
+msgid "Tag the selected photo as \"%s\""
+msgstr "將所選相片加上「%s」標籤"
+
+#: ../src/Resources.vala:353
+#, c-format
+msgid "Tag the selected photos as \"%s\""
+msgstr "將所選的相片加入「%s」標籤"
+
+#: ../src/Resources.vala:357
+#, c-format
+msgid "Remove Tag \"%s\" From _Photo"
+msgstr "從相片移除「%s」標籤(_P)"
+
+#: ../src/Resources.vala:358
+#, c-format
+msgid "Remove Tag \"%s\" From _Photos"
+msgstr "從相片移除「%s」標籤(_P)"
+
+#: ../src/Resources.vala:362
+#, c-format
+msgid "Remove Tag \"%s\" From Photo"
+msgstr "從相片移除「%s」標籤"
+
+#: ../src/Resources.vala:363
+#, c-format
+msgid "Remove Tag \"%s\" From Photos"
+msgstr "從相片移除「%s」標籤"
+
+#: ../src/Resources.vala:367
+#, c-format
+msgid "Unable to rename tag to \"%s\" because the tag already exists."
+msgstr "「%s」標籤已存在,因而無法重新命名標籤。"
+
+#: ../src/Resources.vala:371
+#, c-format
+msgid "Unable to rename search to \"%s\" because the search already exists."
+msgstr "因為該搜尋已經存在,無法重新命名搜尋為「%s」。"
+
+#: ../src/Resources.vala:374
+msgid "Saved Search"
+msgstr "儲存的搜尋"
+
+#: ../src/Resources.vala:376
+msgid "Delete Search"
+msgstr "刪除搜尋"
+
+#: ../src/Resources.vala:379
+msgid "_Edit..."
+msgstr "編輯(_E)..."
+
+#: ../src/Resources.vala:380
+msgid "Re_name..."
+msgstr "重新命名(_N)..."
+
+#: ../src/Resources.vala:383
+#, c-format
+msgid "Rename Search \"%s\" to \"%s\""
+msgstr "重新命名「%s」搜尋為「%s」"
+
+#: ../src/Resources.vala:387
+#, c-format
+msgid "Delete Search \"%s\""
+msgstr "刪除「%s」搜尋"
+
+#: ../src/Resources.vala:545
+#, c-format
+msgid "Rate %s"
+msgstr "為 %s 評等"
+
+#: ../src/Resources.vala:546
+#, c-format
+msgid "Set rating to %s"
+msgstr "設定評等為 %s"
+
+#: ../src/Resources.vala:547
+#, c-format
+msgid "Setting rating to %s"
+msgstr "正在設定評等為 %s"
+
+#: ../src/Resources.vala:549
+#, c-format
+msgid "Display %s"
+msgstr "顯示 %s"
+
+#: ../src/Resources.vala:550
+#, c-format
+msgid "Only show photos with a rating of %s"
+msgstr "只顯示評等為 %s 的相片"
+
+#: ../src/Resources.vala:551
+#, c-format
+msgid "%s or Better"
+msgstr "%s 或更高"
+
+#: ../src/Resources.vala:552
+#, c-format
+msgid "Display %s or Better"
+msgstr "顯示 %s 或更高"
+
+#: ../src/Resources.vala:553
+#, c-format
+msgid "Only show photos with a rating of %s or better"
+msgstr "只顯示評等為 %s 或更高的相片"
+
+#: ../src/Resources.vala:644
+msgid "Remove the selected photos from the trash"
+msgstr "從回收筒移除所選的相片"
+
+#: ../src/Resources.vala:645
+msgid "Remove the selected photos from the library"
+msgstr "從珍藏館移除所選的相片"
+
+#: ../src/Resources.vala:647
+msgid "_Restore"
+msgstr "還原(_R)"
+
+#: ../src/Resources.vala:648
+msgid "Move the selected photos back into the library"
+msgstr "將所選的相片移回珍藏館"
+
+#: ../src/Resources.vala:650
+msgid "Show in File Mana_ger"
+msgstr "以檔案管理員開啟(_G)"
+
+#: ../src/Resources.vala:651
+msgid "Open the selected photo's directory in the file manager"
+msgstr "在檔案管理員內開啟所選的相片目錄"
+
+#: ../src/Resources.vala:654
+#, c-format
+msgid "Unable to open in file manager: %s"
+msgstr "無法於檔案管理員內開啟:%s"
+
+#: ../src/Resources.vala:657
+msgid "R_emove From Library"
+msgstr "從珍藏館移除(_E)"
+
+#: ../src/Resources.vala:659
+msgid "_Move to Trash"
+msgstr "移至回收筒(_M)"
+
+#: ../src/Resources.vala:661
+msgid "Select _All"
+msgstr "全選(_A)"
+
+#: ../src/Resources.vala:662
+msgid "Select all items"
+msgstr "選取全部項目"
+
+#. ...precache the timestamp string...
+#. / Locale-specific time format for 12-hour time, i.e. 8:31 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:743
+msgid "%-I:%M %p"
+msgstr "%p%-I:%M"
+
+#. / Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+#. / Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:748
+msgid "%-I:%M:%S %p"
+msgstr "%p%-I:%M:%S"
+
+#. / Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:752
+msgid "%a %b %d, %Y"
+msgstr "%Y年%b%d日(%a)"
+
+#. / Locale-specific starting date format for multi-date strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#. / Locale-specific calendar date format for multi-month strings,
+#. / i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:757 ../src/Resources.vala:767
+msgid "%a %b %d"
+msgstr "%Y年%b%d日(%a)"
+
+#. / Locale-specific ending date format for multi-date strings,
+#. / i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+#. / See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+#: ../src/Resources.vala:762
+msgid "%d, %Y"
+msgstr "%d日"
+
+#: ../src/Screensaver.vala:18 ../src/SlideshowPage.vala:141
+msgid "Slideshow"
+msgstr "投影秀"
+
+#. Flagged label and toggle
+#: ../src/SearchFilter.vala:587 ../src/SearchFilter.vala:588
+#: ../src/SearchFilter.vala:990 ../src/library/FlaggedPage.vala:8
+msgid "Flagged"
+msgstr "已加上旗幟"
+
+#: ../src/SearchFilter.vala:593 ../src/SearchFilter.vala:594
+msgid "Photos"
+msgstr "相片"
+
+#: ../src/SearchFilter.vala:599 ../src/SearchFilter.vala:600
+msgid "Videos"
+msgstr "視訊"
+
+#: ../src/SearchFilter.vala:605
+msgid "RAW Photos"
+msgstr "RAW 相片"
+
+#: ../src/SearchFilter.vala:606
+msgid "RAW photos"
+msgstr "RAW 相片"
+
+#: ../src/SearchFilter.vala:952
+#, c-format
+msgid "Error loading UI file %s: %s"
+msgstr "載入 UI 檔 %s 時發生錯誤:%s"
+
+#. Type label and toggles
+#: ../src/SearchFilter.vala:969
+msgid "Type"
+msgstr "類型"
+
+#. Rating label and button
+#: ../src/SearchFilter.vala:1003 ../src/searches/SearchBoolean.vala:184
+msgid "Rating"
+msgstr "評等"
+
+#: ../src/SlideshowPage.vala:49 ../src/SlideshowPage.vala:182
+msgid "Settings"
+msgstr "設定值"
+
+#. Set up toolbar
+#. add toolbar buttons
+#: ../src/SlideshowPage.vala:161
+msgid "Back"
+msgstr "返回"
+
+#: ../src/SlideshowPage.vala:162
+msgid "Go to the previous photo"
+msgstr "前往上一張相片"
+
+#: ../src/SlideshowPage.vala:168 ../src/SlideshowPage.vala:273
+msgid "Pause"
+msgstr "暫停"
+
+#: ../src/SlideshowPage.vala:169 ../src/SlideshowPage.vala:274
+msgid "Pause the slideshow"
+msgstr "暫停投影秀"
+
+#: ../src/SlideshowPage.vala:175
+msgid "Next"
+msgstr "下一張"
+
+#: ../src/SlideshowPage.vala:176
+msgid "Go to the next photo"
+msgstr "前往下一張相片"
+
+#: ../src/SlideshowPage.vala:183
+msgid "Change slideshow settings"
+msgstr "變更投影秀設定值"
+
+#. An entire slideshow set might be missing, so check for a loop.
+#: ../src/SlideshowPage.vala:237
+msgid "All photo source files are missing."
+msgstr "遺失全部相片來源檔。"
+
+#: ../src/SlideshowPage.vala:269
+msgid "Play"
+msgstr "播放"
+
+#: ../src/SlideshowPage.vala:270
+msgid "Continue the slideshow"
+msgstr "繼續投影秀"
+
+#: ../src/Tag.vala:817
+msgid "untitled"
+msgstr "無標題"
+
+#. multiple videos
+#: ../src/VideoSupport.vala:492
+msgid "Export Videos"
+msgstr "匯出視訊"
+
+#: ../src/camera/Branch.vala:87
+msgid "Cameras"
+msgstr "相機"
+
+#: ../src/camera/ImportPage.vala:459
+msgid ""
+"Unable to unmount camera. Try unmounting the camera from the file manager."
+msgstr "無法卸載相機。請從檔案管理員內嘗試卸載該相機。"
+
+#. hide duplicates checkbox
+#: ../src/camera/ImportPage.vala:776
+msgid "Hide photos already imported"
+msgstr "隱藏已經匯入的相片"
+
+#: ../src/camera/ImportPage.vala:777
+msgid "Only display photos that have not been imported"
+msgstr "只顯示尚未匯入的相片"
+
+#. Ticket #3304 - Import page shouldn't display confusing message
+#. prior to import.
+#. TODO: replace this with approved text for "talking to camera,
+#. please wait" once new strings are being accepted.
+#: ../src/camera/ImportPage.vala:845
+msgid "Starting import, please wait..."
+msgstr "正開始匯入,請稍候..."
+
+#: ../src/camera/ImportPage.vala:884
+msgid "Import _Selected"
+msgstr "匯入所選(_S)"
+
+#: ../src/camera/ImportPage.vala:885
+msgid "Import the selected photos into your library"
+msgstr "將所選的相片匯入您的珍藏館"
+
+#: ../src/camera/ImportPage.vala:890
+msgid "Import _All"
+msgstr "匯入全部(_A)"
+
+#: ../src/camera/ImportPage.vala:891
+msgid "Import all the photos into your library"
+msgstr "將全部的相片匯入您的珍藏館"
+
+#. it's mounted, offer to unmount for the user
+#: ../src/camera/ImportPage.vala:1012
+msgid ""
+"Shotwell needs to unmount the camera from the filesystem in order to access "
+"it. Continue?"
+msgstr "Shotwell 需要從檔案系統卸載相機才能存取它。要繼續嗎?"
+
+#: ../src/camera/ImportPage.vala:1018
+msgid "_Unmount"
+msgstr "卸載(_U)"
+
+#: ../src/camera/ImportPage.vala:1023
+msgid "Please unmount the camera."
+msgstr "請卸載該相機。"
+
+#: ../src/camera/ImportPage.vala:1028
+msgid ""
+"The camera is locked by another application. Shotwell can only access the "
+"camera when it's unlocked. Please close any other application using the "
+"camera and try again."
+msgstr ""
+"相機已被另一個應用程式鎖住。Shotwell 只能在相機沒被鎖住的情況下存取它。請關閉"
+"任何其它正在使用該相機的應用程式並重試。"
+
+#: ../src/camera/ImportPage.vala:1038
+msgid "Please close any other application using the camera."
+msgstr "請關閉任何其它正在使用相機的應用程式。"
+
+#: ../src/camera/ImportPage.vala:1043
+#, c-format
+msgid ""
+"Unable to fetch previews from the camera:\n"
+"%s"
+msgstr ""
+"無法從相機擷取預覽:\n"
+"%s"
+
+#: ../src/camera/ImportPage.vala:1060
+msgid "Unmounting..."
+msgstr "正在卸載..."
+
+#: ../src/camera/ImportPage.vala:1166
+msgid "Fetching photo information"
+msgstr "正在擷取相片資訊"
+
+#: ../src/camera/ImportPage.vala:1521
+#, c-format
+msgid "Fetching preview for %s"
+msgstr "正在為 %s 擷取預覽"
+
+#: ../src/camera/ImportPage.vala:1637
+#, c-format
+msgid "Unable to lock camera: %s"
+msgstr "無法鎖住相機:%s"
+
+#: ../src/camera/ImportPage.vala:1722
+#, c-format
+msgid "Delete this photo from camera?"
+msgid_plural "Delete these %d photos from camera?"
+msgstr[0] "要從相機刪除這 %d 張相片嗎?"
+
+#: ../src/camera/ImportPage.vala:1725
+#, c-format
+msgid "Delete this video from camera?"
+msgid_plural "Delete these %d videos from camera?"
+msgstr[0] "要從相機刪除這 %d 份視訊嗎?"
+
+#: ../src/camera/ImportPage.vala:1728
+#, c-format
+msgid "Delete this photo/video from camera?"
+msgid_plural "Delete these %d photos/videos from camera?"
+msgstr[0] "要從相機刪除這 %d 份相片/視訊嗎?"
+
+#: ../src/camera/ImportPage.vala:1731
+#, c-format
+msgid "Delete these files from camera?"
+msgid_plural "Delete these %d files from camera?"
+msgstr[0] "要從相機刪除這 %d 份檔案嗎?"
+
+#: ../src/camera/ImportPage.vala:1758
+msgid "Removing photos/videos from camera"
+msgstr "正在從相機移除相片/視訊"
+
+#: ../src/camera/ImportPage.vala:1762
+#, c-format
+msgid "Unable to delete %d photo/video from the camera due to errors."
+msgid_plural "Unable to delete %d photos/videos from the camera due to errors."
+msgstr[0] "由於錯誤發生,無法從相機刪除 %d 份相片/視訊。"
+
+#: ../src/data_imports/DataImports.vala:22
+msgid "Data Imports"
+msgstr "資料匯入"
+
+#. Send an empty job to the queue to mark the end of the import
+#: ../src/data_imports/DataImportsPluginHost.vala:65
+#: ../src/data_imports/DataImportsPluginHost.vala:78
+#, c-format
+msgid "%s Database"
+msgstr "%s 資料庫"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:148
+#: ../src/data_imports/DataImportsPluginHost.vala:294
+#, c-format
+msgid "Importing from %s can't continue because an error occurred:"
+msgstr "無法繼續從 %s 匯入,因為遭遇錯誤:"
+
+#: ../src/data_imports/DataImportsPluginHost.vala:151
+msgid "To try importing from another service, select one from the above menu."
+msgstr "若要從其他服務匯入,請從上方選單選取其中一項。"
+
+#: ../src/data_imports/DataImportsUI.vala:10
+msgid ""
+"You do not have any data imports plugins enabled.\n"
+"\n"
+"In order to use the Import From Application functionality, you need to have "
+"at least one data imports plugin enabled. Plugins can be enabled in the "
+"Preferences dialog."
+msgstr ""
+"您尚未啟用任何資料匯入插件。\n"
+"\n"
+"為了使用「從應用程式匯入」的功能,您至少需要啟用一項資料匯入插件。插件可以透"
+"過「偏好設定」對話盒中啟用。"
+
+#: ../src/data_imports/DataImportsUI.vala:100
+msgid "Database file:"
+msgstr "資料庫檔案:"
+
+#: ../src/data_imports/DataImportsUI.vala:112
+#: ../src/library/LibraryWindow.vala:899
+msgid "_Import"
+msgstr "匯入(_I)"
+
+#: ../src/data_imports/DataImportsUI.vala:216
+msgid "Import From Application"
+msgstr "從應用程式匯入"
+
+#: ../src/data_imports/DataImportsUI.vala:217
+msgid "Import media _from:"
+msgstr "從何處匯入媒體(_F):"
+
+#: ../src/data_imports/DataImportsUI.vala:394
+#: ../src/publishing/PublishingUI.vala:493
+msgid "_Close"
+msgstr "關閉(_C)"
+
+#: ../src/db/DatabaseTable.vala:37
+#, c-format
+msgid "Unable to open/create photo database %s: error code %d"
+msgstr "無法開啟或建立相片資料庫 %s:錯誤代碼 %d"
+
+#: ../src/db/DatabaseTable.vala:46
+#, c-format
+msgid ""
+"Unable to write to photo database file:\n"
+" %s"
+msgstr ""
+"無法寫入相片資料庫檔案:\n"
+"%s"
+
+#: ../src/db/DatabaseTable.vala:48
+#, c-format
+msgid ""
+"Error accessing database file:\n"
+" %s\n"
+"\n"
+"Error was: \n"
+"%s"
+msgstr ""
+"存取資料庫檔案時發生錯誤:\n"
+"%s\n"
+"\n"
+"錯誤為:\n"
+"%s"
+
+#: ../src/direct/DirectPhotoPage.vala:46 ../src/library/LibraryWindow.vala:352
+msgid "_File"
+msgstr "檔案(_F)"
+
+#: ../src/direct/DirectPhotoPage.vala:51
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save"
+msgstr "儲存(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:52
+msgid "Save photo"
+msgstr "儲存相片"
+
+#: ../src/direct/DirectPhotoPage.vala:57
+msgid "Save _As..."
+msgstr "另存新檔(_A)..."
+
+#: ../src/direct/DirectPhotoPage.vala:58
+msgid "Save photo with a different name"
+msgstr "以不同名稱儲存相片"
+
+#: ../src/direct/DirectPhotoPage.vala:69
+msgid "Print the photo to a printer connected to your computer"
+msgstr "將該相片以連結至您電腦的印表機列印"
+
+#: ../src/direct/DirectPhotoPage.vala:73 ../src/library/LibraryWindow.vala:356
+msgid "_Edit"
+msgstr "編輯(_E)"
+
+#: ../src/direct/DirectPhotoPage.vala:77 ../src/library/LibraryWindow.vala:364
+msgid "_Photo"
+msgstr "相片(_P)"
+
+#: ../src/direct/DirectPhotoPage.vala:169
+#: ../src/library/LibraryWindow.vala:380
+msgid "_Help"
+msgstr "幫助(_H)"
+
+#: ../src/direct/DirectPhotoPage.vala:227
+#, c-format
+msgid "%s does not exist."
+msgstr "%s 不存在。"
+
+#: ../src/direct/DirectPhotoPage.vala:229
+#, c-format
+msgid "%s is not a file."
+msgstr "%s 不是檔案。"
+
+#: ../src/direct/DirectPhotoPage.vala:231
+#, c-format
+msgid ""
+"%s does not support the file format of\n"
+"%s."
+msgstr ""
+"%s 不支援檔案格式\n"
+"%s。"
+
+#: ../src/direct/DirectPhotoPage.vala:417
+msgid "_Save a Copy"
+msgstr "儲存複本(_S)"
+
+#: ../src/direct/DirectPhotoPage.vala:420
+#, c-format
+msgid "Lose changes to %s?"
+msgstr "放棄對 %s 所作出的變更?"
+
+#: ../src/direct/DirectPhotoPage.vala:421
+msgid "Close _without Saving"
+msgstr "關閉而不儲存(_W)"
+
+#: ../src/direct/DirectPhotoPage.vala:454
+#, c-format
+msgid "Error while saving to %s: %s"
+msgstr "當儲存至 %s 時發生錯誤:%s"
+
+#: ../src/direct/DirectPhotoPage.vala:482
+#: ../src/direct/DirectPhotoPage.vala:503
+msgid "Save As"
+msgstr "另存新檔"
+
+#: ../src/editing_tools/EditingTools.vala:665
+msgid "Return to current photo dimensions"
+msgstr "返回目前相片維度"
+
+#: ../src/editing_tools/EditingTools.vala:668
+msgid "Set the crop for this photo"
+msgstr "為此相片設定裁切"
+
+#: ../src/editing_tools/EditingTools.vala:680
+msgid "Pivot the crop rectangle between portrait and landscape orientations"
+msgstr "在肖像與風景方向之間旋轉裁切矩形"
+
+#: ../src/editing_tools/EditingTools.vala:753
+msgid "Unconstrained"
+msgstr "未限制"
+
+#: ../src/editing_tools/EditingTools.vala:754
+msgid "Square"
+msgstr "方形"
+
+#: ../src/editing_tools/EditingTools.vala:755
+msgid "Screen"
+msgstr "螢幕畫面"
+
+#: ../src/editing_tools/EditingTools.vala:757
+#: ../src/editing_tools/EditingTools.vala:760
+#: ../src/editing_tools/EditingTools.vala:770
+#: ../src/editing_tools/EditingTools.vala:780
+msgid "-"
+msgstr "-"
+
+#: ../src/editing_tools/EditingTools.vala:758
+msgid "SD Video (4 : 3)"
+msgstr "SD 視訊 (4 : 3)"
+
+#: ../src/editing_tools/EditingTools.vala:759
+msgid "HD Video (16 : 9)"
+msgstr "HD 視訊 (16 : 9)"
+
+#: ../src/editing_tools/EditingTools.vala:766
+msgid "Letter (8.5 x 11 in.)"
+msgstr "信紙 (8.5 x 11 英吋)"
+
+#: ../src/editing_tools/EditingTools.vala:768
+msgid "Tabloid (11 x 17 in.)"
+msgstr "小報紙 (11 x 17 英吋)"
+
+#: ../src/editing_tools/EditingTools.vala:775
+msgid "A4 (210 x 297 mm)"
+msgstr "A4 (210 x 297 公釐)"
+
+#: ../src/editing_tools/EditingTools.vala:779
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 公釐)"
+
+#: ../src/editing_tools/EditingTools.vala:1876
+msgid "Close the red-eye tool"
+msgstr "關閉紅眼工具"
+
+#: ../src/editing_tools/EditingTools.vala:1879
+msgid "Remove any red-eye effects in the selected region"
+msgstr "移除所選區域內的紅眼效應"
+
+#: ../src/editing_tools/EditingTools.vala:2215
+#: ../src/editing_tools/StraightenTool.vala:102
+msgid "_Reset"
+msgstr "重設(_R)"
+
+#: ../src/editing_tools/EditingTools.vala:2237
+msgid "Saturation:"
+msgstr "飽和:"
+
+#: ../src/editing_tools/EditingTools.vala:2245
+msgid "Tint:"
+msgstr "色相:"
+
+#: ../src/editing_tools/EditingTools.vala:2254
+msgid "Temperature:"
+msgstr "色溫:"
+
+#: ../src/editing_tools/EditingTools.vala:2262
+msgid "Shadows:"
+msgstr "陰影:"
+
+#: ../src/editing_tools/EditingTools.vala:2270
+msgid "Highlights:"
+msgstr "高亮:"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset Colors"
+msgstr "重設色彩"
+
+#: ../src/editing_tools/EditingTools.vala:2324
+msgid "Reset all color adjustments to original"
+msgstr "重設所有色彩調整為原始狀態"
+
+#: ../src/editing_tools/EditingTools.vala:2676
+msgid "Temperature"
+msgstr "色溫"
+
+#: ../src/editing_tools/EditingTools.vala:2689
+msgid "Tint"
+msgstr "色相"
+
+#: ../src/editing_tools/EditingTools.vala:2702
+msgid "Saturation"
+msgstr "飽和"
+
+#: ../src/editing_tools/EditingTools.vala:2715
+msgid "Exposure"
+msgstr "曝光"
+
+#: ../src/editing_tools/EditingTools.vala:2728
+msgid "Shadows"
+msgstr "陰影"
+
+#: ../src/editing_tools/EditingTools.vala:2741
+msgid "Highlights"
+msgstr "高亮"
+
+#: ../src/editing_tools/EditingTools.vala:2751
+msgid "Contrast Expansion"
+msgstr "對比擴展"
+
+#: ../src/editing_tools/StraightenTool.vala:99
+msgid "Angle:"
+msgstr "角度:"
+
+#: ../src/events/EventDirectoryItem.vala:83
+#, c-format
+msgid "%d Photo/Video"
+msgid_plural "%d Photos/Videos"
+msgstr[0] "%d 份相片/視訊"
+
+#: ../src/events/EventPage.vala:129
+msgid "No Event"
+msgstr "無事件"
+
+#: ../src/events/EventsDirectoryPage.vala:131
+msgid "Display the comment of each event"
+msgstr "顯示每個事件的評註"
+
+#: ../src/events/EventsDirectoryPage.vala:155
+msgid "No events"
+msgstr "無事件"
+
+#: ../src/events/EventsDirectoryPage.vala:159
+msgid "No events found"
+msgstr "找不到事件"
+
+#: ../src/events/EventsDirectoryPage.vala:230
+msgid "Events"
+msgstr "事件"
+
+#: ../src/events/EventsDirectoryPage.vala:244
+msgid "Undated"
+msgstr "未限定日期"
+
+#: ../src/events/EventsDirectoryPage.vala:245
+msgid "%Y"
+msgstr "%Y"
+
+#: ../src/events/EventsDirectoryPage.vala:246
+msgid "%B"
+msgstr "%B"
+
+#: ../src/folders/Branch.vala:141
+msgid "Folders"
+msgstr "資料夾"
+
+#: ../src/library/Branch.vala:37 ../ui/shotwell.glade.h:33
+msgid "Library"
+msgstr "珍藏館"
+
+#: ../src/library/ImportQueuePage.vala:8
+msgid "Importing..."
+msgstr "正在匯入..."
+
+#: ../src/library/ImportQueuePage.vala:66
+msgid "_Stop Import"
+msgstr "停止匯入(_S)"
+
+#: ../src/library/ImportQueuePage.vala:67
+msgid "Stop importing photos"
+msgstr "停止匯入相片"
+
+#: ../src/library/ImportQueuePage.vala:123
+msgid "Preparing to import..."
+msgstr "正在準備匯入..."
+
+#: ../src/library/ImportQueuePage.vala:150
+#, c-format
+msgid "Imported %s"
+msgstr "已匯入 %s"
+
+#: ../src/library/LastImportPage.vala:8
+msgid "Last Import"
+msgstr "上次匯入"
+
+#: ../src/library/LibraryWindow.vala:301
+msgid "_Import From Folder..."
+msgstr "從資料夾匯入(_I)..."
+
+#: ../src/library/LibraryWindow.vala:302
+msgid "Import photos from disk to library"
+msgstr "從磁碟匯入相片至珍藏館"
+
+#: ../src/library/LibraryWindow.vala:309
+msgid "Import From _Application..."
+msgstr "從應用程式匯入(_A)..."
+
+#: ../src/library/LibraryWindow.vala:313
+msgid "Sort _Events"
+msgstr "排序事件(_E)"
+
+#: ../src/library/LibraryWindow.vala:323
+msgid "Empty T_rash"
+msgstr "清空回收筒(_R)"
+
+#: ../src/library/LibraryWindow.vala:324
+msgid "Delete all photos in the trash"
+msgstr "刪除回收筒中的所有相片"
+
+#: ../src/library/LibraryWindow.vala:329
+msgid "View Eve_nt for Photo"
+msgstr "檢視相片的事件(_N)"
+
+#: ../src/library/LibraryWindow.vala:334
+msgid "_Find"
+msgstr "尋找(_F)"
+
+#: ../src/library/LibraryWindow.vala:335
+msgid "Find photos and videos by search criteria"
+msgstr "根據搜尋準則尋找相片與視訊"
+
+#: ../src/library/LibraryWindow.vala:346 ../src/searches/Branch.vala:77
+#: ../src/sidebar/Tree.vala:195
+msgid "Ne_w Saved Search..."
+msgstr "新的儲存搜尋(_W)..."
+
+#: ../src/library/LibraryWindow.vala:368
+msgid "_Photos"
+msgstr "相片(_P)"
+
+#: ../src/library/LibraryWindow.vala:372
+msgid "Even_ts"
+msgstr "事件(_T)"
+
+#: ../src/library/LibraryWindow.vala:391
+msgid "_Basic Information"
+msgstr "基本資訊(_B)"
+
+#: ../src/library/LibraryWindow.vala:392
+msgid "Display basic information for the selection"
+msgstr "顯示選取項目的基礎資訊"
+
+#: ../src/library/LibraryWindow.vala:397
+msgid "E_xtended Information"
+msgstr "擴充資訊(_X)"
+
+#: ../src/library/LibraryWindow.vala:398
+msgid "Display extended information for the selection"
+msgstr "顯示選取項目的擴充資訊"
+
+#: ../src/library/LibraryWindow.vala:403
+msgid "_Search Bar"
+msgstr "搜尋列(_S)"
+
+#: ../src/library/LibraryWindow.vala:404
+msgid "Display the search bar"
+msgstr "顯示搜尋列"
+
+#: ../src/library/LibraryWindow.vala:409
+msgid "S_idebar"
+msgstr "側邊欄(_I)"
+
+#: ../src/library/LibraryWindow.vala:410
+msgid "Display the sidebar"
+msgstr "顯示側邊欄"
+
+#: ../src/library/LibraryWindow.vala:668
+msgid "Import From Folder"
+msgstr "從資料夾匯入"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Empty Trash"
+msgstr "清空回收筒"
+
+#: ../src/library/LibraryWindow.vala:737
+msgid "Emptying Trash..."
+msgstr "正在清空回收筒..."
+
+#: ../src/library/LibraryWindow.vala:896
+#, c-format
+msgid ""
+"Shotwell is configured to import photos to your home directory.\n"
+"We recommend changing this in <span weight=\"bold\">Edit %s Preferences</"
+"span>.\n"
+"Do you want to continue importing photos?"
+msgstr ""
+"Shotwell 已設置為將相片匯入您的家屋目錄中。\n"
+"我們建議您在 <span weight=\"bold\">編輯 %s 偏好設定</span> 中更改此設定。\n"
+"您是否想要繼續匯入相片?"
+
+#: ../src/library/LibraryWindow.vala:899 ../ui/shotwell.glade.h:19
+msgid "Library Location"
+msgstr "珍藏館位置"
+
+#. TODO: Specify which directory/file.
+#: ../src/library/LibraryWindow.vala:912
+msgid "Photos cannot be imported from this directory."
+msgstr "相片無法從此目錄匯入。"
+
+#: ../src/library/LibraryWindow.vala:1200
+#, c-format
+msgid "%s (%d%%)"
+msgstr "%s (%d%%)"
+
+#: ../src/library/LibraryWindow.vala:1244
+#: ../src/library/LibraryWindow.vala:1255
+msgid "Updating library..."
+msgstr "正在更新珍藏館..."
+
+#: ../src/library/LibraryWindow.vala:1261
+msgid "Preparing to auto-import photos..."
+msgstr "正在準備自動匯入相片..."
+
+#: ../src/library/LibraryWindow.vala:1266
+msgid "Auto-importing photos..."
+msgstr "正在自動匯入相片..."
+
+#: ../src/library/LibraryWindow.vala:1274
+msgid "Writing metadata to files..."
+msgstr "正在寫入中介資料至檔案中..."
+
+#: ../src/library/OfflinePage.vala:8
+msgid "Missing Files"
+msgstr "遺失的檔案"
+
+#: ../src/library/OfflinePage.vala:106
+msgid "Deleting..."
+msgstr "正在刪除..."
+
+#: ../src/library/TrashPage.vala:8
+msgid "Trash"
+msgstr "回收筒"
+
+#: ../src/library/TrashPage.vala:108
+msgid "Trash is empty"
+msgstr "空的回收筒"
+
+#: ../src/library/TrashPage.vala:112
+msgid "Delete"
+msgstr "刪除"
+
+#: ../src/library/TrashPage.vala:113
+msgid "Deleting Photos"
+msgstr "正在刪除相片"
+
+#: ../src/main.vala:54
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please use the latest version of Shotwell."
+msgstr ""
+"您的相片珍藏館與此版本的 Shotwell 不相容。該珍藏館似乎是由 Shotwell %s "
+"(schema %d) 所建立。此版本為 %s (schema %d)。請使用最新版的 Shotwell。"
+
+#: ../src/main.vala:59
+#, c-format
+msgid ""
+"Shotwell was unable to upgrade your photo library from version %s (schema "
+"%d) to %s (schema %d). For more information please check the Shotwell Wiki "
+"at %s"
+msgstr ""
+"Shotwell 無法將您的珍藏館從版本 %s (schema %d)升級至 %s (schema %d)。若要瞭解"
+"更多資訊,請查看位於 %s 的 Shotwell Wiki"
+
+#: ../src/main.vala:65
+#, c-format
+msgid ""
+"Your photo library is not compatible with this version of Shotwell. It "
+"appears it was created by Shotwell %s (schema %d). This version is %s "
+"(schema %d). Please clear your library by deleting %s and re-import your "
+"photos."
+msgstr ""
+"您的珍藏館與此版本的 Shotwell 不相容。該珍藏館似乎是由 Shotwell %s (schema "
+"%d) 所建立的。此版本為 %s (schema %d)。請刪除 %s 來清除您的珍藏館,並且重新匯"
+"入您的相片。"
+
+#: ../src/main.vala:71
+#, c-format
+msgid "Unknown error attempting to verify Shotwell's database: %s"
+msgstr "試圖驗證 Shotwell 資料庫時發生未知錯誤:%s"
+
+#: ../src/main.vala:104
+msgid "Loading Shotwell"
+msgstr "正在載入 Shotwell"
+
+#: ../src/main.vala:294
+msgid "Path to Shotwell's private data"
+msgstr "Shotwell 的私人資料路徑"
+
+#: ../src/main.vala:294
+msgid "DIRECTORY"
+msgstr "目錄"
+
+#: ../src/main.vala:298
+msgid "Do not monitor library directory at runtime for changes"
+msgstr "執行時期不要監視珍藏館目錄是否有變動"
+
+#: ../src/main.vala:302
+msgid "Don't display startup progress meter"
+msgstr "不要顯示初始啟動時的進度條"
+
+#: ../src/main.vala:306
+msgid "Show the application's version"
+msgstr "顯示應用程式的版本"
+
+#. init GTK (valac has already called g_threads_init())
+#: ../src/main.vala:338
+msgid "[FILE]"
+msgstr "[檔案]"
+
+#: ../src/main.vala:342
+#, c-format
+msgid "Run '%s --help' to see a full list of available command line options.\n"
+msgstr "執行 '%s --help' 來查看可用命令列選項的完整清單。\n"
+
+#: ../src/photos/BmpSupport.vala:32
+msgid "BMP"
+msgstr "BMP"
+
+#: ../src/photos/JfifSupport.vala:84
+msgid "JPEG"
+msgstr "JPEG"
+
+#: ../src/photos/JfifSupport.vala:182
+#, c-format
+msgid "Low (%d%%)"
+msgstr "低 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:185
+#, c-format
+msgid "Medium (%d%%)"
+msgstr "中 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:188
+#, c-format
+msgid "High (%d%%)"
+msgstr "高 (%d%%)"
+
+#: ../src/photos/JfifSupport.vala:191
+#, c-format
+msgid "Maximum (%d%%)"
+msgstr "最佳 (%d%%)"
+
+#: ../src/photos/PngSupport.vala:30
+msgid "PNG"
+msgstr "PNG"
+
+#: ../src/photos/RawSupport.vala:134
+msgid "RAW"
+msgstr "RAW"
+
+#: ../src/photos/TiffSupport.vala:86
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../src/publishing/Publishing.vala:16
+msgid "Publishing"
+msgstr "發布"
+
+#: ../src/publishing/PublishingPluginHost.vala:11
+msgid "Preparing for upload"
+msgstr "正在準備上傳"
+
+#: ../src/publishing/PublishingPluginHost.vala:12
+#, c-format
+msgid "Uploading %d of %d"
+msgstr "正在上傳 %d/%d"
+
+#: ../src/publishing/PublishingPluginHost.vala:81
+#, c-format
+msgid "Publishing to %s can't continue because an error occurred:"
+msgstr "因為遭遇錯誤,無法繼續發布至 %s:"
+
+#: ../src/publishing/PublishingPluginHost.vala:84
+msgid "To try publishing to another service, select one from the above menu."
+msgstr "若要嘗試發布至其它服務,請從上方選單選擇。"
+
+#: ../src/publishing/PublishingUI.vala:105
+msgid "The selected photos/videos were successfully published."
+msgstr "所選的相片/視訊已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:107
+msgid "The selected videos were successfully published."
+msgstr "所選的視訊已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:109
+msgid "The selected photos were successfully published."
+msgstr "所選的相片已經成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:112
+msgid "The selected video was successfully published."
+msgstr "所選的視訊已成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:114
+msgid "The selected photo was successfully published."
+msgstr "所選的相片已成功發布。"
+
+#: ../src/publishing/PublishingUI.vala:122
+msgid "Fetching account information..."
+msgstr "正在擷取帳號資訊..."
+
+#: ../src/publishing/PublishingUI.vala:128
+msgid "Logging in..."
+msgstr "正在登入..."
+
+#: ../src/publishing/PublishingUI.vala:183
+msgid "Publish Photos"
+msgstr "發布相片"
+
+#: ../src/publishing/PublishingUI.vala:184
+msgid "Publish photos _to:"
+msgstr "將相片發布至(_T):"
+
+#: ../src/publishing/PublishingUI.vala:186
+msgid "Publish Videos"
+msgstr "發布視訊"
+
+#: ../src/publishing/PublishingUI.vala:187
+msgid "Publish videos _to"
+msgstr "將視訊發布至(_T)"
+
+#: ../src/publishing/PublishingUI.vala:189
+msgid "Publish Photos and Videos"
+msgstr "發布相片與視訊"
+
+#: ../src/publishing/PublishingUI.vala:190
+msgid "Publish photos and videos _to"
+msgstr "將相片與視訊發布至(_T)"
+
+#. There are no enabled publishing services that accept this media type,
+#. warn the user.
+#: ../src/publishing/PublishingUI.vala:383
+msgid "Unable to publish"
+msgstr "無法發布"
+
+#: ../src/publishing/PublishingUI.vala:384
+#, c-format
+msgid ""
+"Shotwell cannot publish the selected items because you do not have a "
+"compatible publishing plugin enabled. To correct this, choose <b>Edit %s "
+"Preferences</b> and enable one or more of the publishing plugins on the "
+"<b>Plugins</b> tab."
+msgstr ""
+"Shotwell 無法發布所選的項目,因為您尚未啟用相容的發布插件。若要修正此問題,請"
+"選擇 <b>編輯 %s 偏好設定</b> 並在 <b>插件</b> 分頁啟用一項或多項發布用插件。"
+
+#: ../src/searches/Branch.vala:68
+msgid "Saved Searches"
+msgstr "儲存的搜尋"
+
+#. Ordering must correspond with SearchConditionText.Context
+#: ../src/searches/SavedSearchDialog.vala:169
+msgid "contains"
+msgstr "包含"
+
+#. Ordering must correspond with Context
+#: ../src/searches/SavedSearchDialog.vala:170
+#: ../src/searches/SavedSearchDialog.vala:497
+msgid "is exactly"
+msgstr "完全是"
+
+#: ../src/searches/SavedSearchDialog.vala:171
+msgid "starts with"
+msgstr "開頭為"
+
+#: ../src/searches/SavedSearchDialog.vala:172
+msgid "ends with"
+msgstr "結尾為"
+
+#: ../src/searches/SavedSearchDialog.vala:173
+msgid "does not contain"
+msgstr "不包含"
+
+#: ../src/searches/SavedSearchDialog.vala:174
+#: ../src/searches/SavedSearchDialog.vala:501
+msgid "is not set"
+msgstr "未設定"
+
+#. Ordering must correspond with SearchConditionMediaType.Context
+#: ../src/searches/SavedSearchDialog.vala:245
+#: ../src/searches/SavedSearchDialog.vala:376
+#: ../src/searches/SavedSearchDialog.vala:441
+msgid "is"
+msgstr "是"
+
+#: ../src/searches/SavedSearchDialog.vala:246
+msgid "is not"
+msgstr "不是"
+
+#. Ordering must correspond with SearchConditionMediaType.MediaType
+#: ../src/searches/SavedSearchDialog.vala:252
+msgid "any photo"
+msgstr "任意相片"
+
+#: ../src/searches/SavedSearchDialog.vala:253
+msgid "a raw photo"
+msgstr "RAW 相片"
+
+#: ../src/searches/SavedSearchDialog.vala:254
+msgid "a video"
+msgstr "視訊"
+
+#: ../src/searches/SavedSearchDialog.vala:308
+msgid "has"
+msgstr "有"
+
+#: ../src/searches/SavedSearchDialog.vala:309
+msgid "has no"
+msgstr "沒有"
+
+#: ../src/searches/SavedSearchDialog.vala:314
+msgid "modifications"
+msgstr "修改"
+
+#: ../src/searches/SavedSearchDialog.vala:315
+msgid "internal modifications"
+msgstr "內部修改"
+
+#: ../src/searches/SavedSearchDialog.vala:316
+msgid "external modifications"
+msgstr "外部修改"
+
+#. Ordering must correspond with SearchConditionFlagged.State
+#: ../src/searches/SavedSearchDialog.vala:370
+msgid "flagged"
+msgstr "已加上旗幟"
+
+#: ../src/searches/SavedSearchDialog.vala:371
+msgid "not flagged"
+msgstr "未加上旗幟"
+
+#: ../src/searches/SavedSearchDialog.vala:434
+msgid "and higher"
+msgstr "與更高"
+
+#: ../src/searches/SavedSearchDialog.vala:435
+msgid "only"
+msgstr "只有"
+
+#: ../src/searches/SavedSearchDialog.vala:436
+msgid "and lower"
+msgstr "與更低"
+
+#: ../src/searches/SavedSearchDialog.vala:498
+msgid "is after"
+msgstr "晚於"
+
+#: ../src/searches/SavedSearchDialog.vala:499
+msgid "is before"
+msgstr "早於"
+
+#: ../src/searches/SavedSearchDialog.vala:500
+msgid "is between"
+msgstr "介於"
+
+#: ../src/searches/SavedSearchDialog.vala:513
+msgid "and"
+msgstr "與"
+
+#: ../src/searches/SavedSearchDialog.vala:720
+msgid "any"
+msgstr "任何"
+
+#: ../src/searches/SavedSearchDialog.vala:721
+msgid "all"
+msgstr "全部"
+
+#: ../src/searches/SavedSearchDialog.vala:722
+msgid "none"
+msgstr "無"
+
+#: ../src/searches/SearchBoolean.vala:157
+msgid "Any text"
+msgstr "任意文字"
+
+#: ../src/searches/SearchBoolean.vala:160
+msgid "Title"
+msgstr "標題"
+
+#: ../src/searches/SearchBoolean.vala:163
+msgid "Tag"
+msgstr "標籤"
+
+#: ../src/searches/SearchBoolean.vala:166
+msgid "Comment"
+msgstr "評註"
+
+#: ../src/searches/SearchBoolean.vala:169
+msgid "Event name"
+msgstr "事件名稱"
+
+#: ../src/searches/SearchBoolean.vala:172
+msgid "File name"
+msgstr "檔案名稱"
+
+#: ../src/searches/SearchBoolean.vala:175
+msgid "Media type"
+msgstr "媒體類型"
+
+#: ../src/searches/SearchBoolean.vala:178
+msgid "Flag state"
+msgstr "旗幟狀態"
+
+#: ../src/searches/SearchBoolean.vala:181
+msgid "Photo state"
+msgstr "相片狀態"
+
+#: ../src/searches/SearchBoolean.vala:187
+msgid "Date"
+msgstr "日期"
+
+#: ../src/sidebar/Tree.vala:199
+msgid "New _Tag..."
+msgstr "新增標籤(_T)..."
+
+#: ../src/slideshow/Slideshow.vala:22
+msgid "Slideshow Transitions"
+msgstr "投影秀轉場"
+
+#: ../src/slideshow/TransitionEffects.vala:98
+msgid "(None)"
+msgstr "(無)"
+
+#: ../src/slideshow/TransitionEffects.vala:287
+msgid "None"
+msgstr "無"
+
+#: ../src/slideshow/TransitionEffects.vala:339
+msgid "Random"
+msgstr "隨機"
+
+#: ../src/tags/Branch.vala:127
+msgid "Tags"
+msgstr "標籤"
+
+#: ../ui/set_background_dialog.glade.h:1
+msgid "Set as Desktop Slideshow"
+msgstr "設為桌面投影秀"
+
+#: ../ui/set_background_dialog.glade.h:2
+msgid "Generate desktop background slideshow"
+msgstr "製作桌面背景投影秀"
+
+#: ../ui/set_background_dialog.glade.h:3
+msgid "Show each photo for"
+msgstr "顯示每張相片"
+
+#: ../ui/set_background_dialog.glade.h:4
+msgid "period of time"
+msgstr "期間"
+
+#: ../ui/set_background_dialog.glade.h:5
+msgid "How long each photo is shown on the desktop background"
+msgstr "每張相片要顯示為桌面背景多久"
+
+#: ../ui/shotwell.glade.h:1
+msgid "Search"
+msgstr "搜尋"
+
+#: ../ui/shotwell.glade.h:2
+msgid "_Name of search:"
+msgstr "搜尋的名稱(_N):"
+
+#: ../ui/shotwell.glade.h:3
+msgid "_Match"
+msgstr "比對(_M)"
+
+#: ../ui/shotwell.glade.h:4
+msgid "of the following:"
+msgstr "的下列條件:"
+
+#: ../ui/shotwell.glade.h:5
+msgid "<b>Printed Image Size</b>"
+msgstr "<b>列印的影像大小</b>"
+
+#: ../ui/shotwell.glade.h:6
+msgid "Use a _standard size:"
+msgstr "使用標準大小(_S):"
+
+#: ../ui/shotwell.glade.h:7
+msgid "Use a c_ustom size:"
+msgstr "使用自訂大小(_C):"
+
+#: ../ui/shotwell.glade.h:8
+msgid "_Match photo aspect ratio"
+msgstr "符合相片寬高比(_M)"
+
+#: ../ui/shotwell.glade.h:9
+msgid "_Autosize:"
+msgstr "自動大小(_A):"
+
+#: ../ui/shotwell.glade.h:10
+msgid "<b>Titles</b>"
+msgstr "<b>標題</b>"
+
+#: ../ui/shotwell.glade.h:11
+msgid "Print image _title"
+msgstr "列印影像標題(_T)"
+
+#: ../ui/shotwell.glade.h:12
+msgid "<b>Pixel Resolution</b>"
+msgstr "<b>畫素解析度</b>"
+
+#: ../ui/shotwell.glade.h:13
+msgid "_Output photo at:"
+msgstr "輸出相片於(_O):"
+
+#: ../ui/shotwell.glade.h:14
+msgid "pixels per inch"
+msgstr "每英吋畫素"
+
+#: ../ui/shotwell.glade.h:16
+msgid "Shotwell Preferences"
+msgstr "Shotwell 偏好設定"
+
+#: ../ui/shotwell.glade.h:17
+msgid "white"
+msgstr "白"
+
+#: ../ui/shotwell.glade.h:18
+msgid "black"
+msgstr "黑"
+
+#: ../ui/shotwell.glade.h:20
+msgid "_Watch library directory for new files"
+msgstr "監視珍藏館目錄是否有新檔案(_W)"
+
+#: ../ui/shotwell.glade.h:21
+msgid "Metadata"
+msgstr "中介資料"
+
+#: ../ui/shotwell.glade.h:22
+msgid "Write tags, titles, and other _metadata to photo files"
+msgstr "寫入標籤、標題與其它中介資料至相片檔案(_M)"
+
+#: ../ui/shotwell.glade.h:23
+msgid "Display"
+msgstr "顯示"
+
+#: ../ui/shotwell.glade.h:24
+msgid "_Import photos to:"
+msgstr "匯入相片至(_I):"
+
+#: ../ui/shotwell.glade.h:25
+msgid "_Background:"
+msgstr "背景(_B):"
+
+#: ../ui/shotwell.glade.h:26
+msgid "Importing"
+msgstr "匯入"
+
+#: ../ui/shotwell.glade.h:27
+msgid "_Directory structure:"
+msgstr "目錄結構(_D):"
+
+#: ../ui/shotwell.glade.h:28
+msgid "_Pattern:"
+msgstr "樣式(_P):"
+
+#: ../ui/shotwell.glade.h:29
+msgid "Example:"
+msgstr "範例:"
+
+#: ../ui/shotwell.glade.h:30
+msgid "R_ename imported files to lowercase"
+msgstr "將匯入的檔案重新命名為小寫(_E)"
+
+#: ../ui/shotwell.glade.h:31
+msgid "RAW Developer"
+msgstr "RAW 顯影器"
+
+#: ../ui/shotwell.glade.h:32
+msgid "De_fault:"
+msgstr "預設(_F):"
+
+#: ../ui/shotwell.glade.h:34
+msgid "E_xternal photo editor:"
+msgstr "外部編輯器(_X):"
+
+#: ../ui/shotwell.glade.h:35
+msgid "External _RAW editor:"
+msgstr "外部 _RAW 編輯器:"
+
+#: ../ui/shotwell.glade.h:36
+msgid "External Editors"
+msgstr "外部編輯器"
+
+#: ../ui/shotwell.glade.h:37
+msgid "Plugins"
+msgstr "插件"
+
+#: ../ui/shotwell.glade.h:38
+msgid "_Delay:"
+msgstr "延遲(_D):"
+
+#: ../ui/shotwell.glade.h:39
+msgid "_Transition effect:"
+msgstr "轉場效果(_T):"
+
+#: ../ui/shotwell.glade.h:40
+msgid "Transition d_elay:"
+msgstr "轉場延遲(_D):"
+
+#: ../ui/shotwell.glade.h:41
+msgid "Show t_itle"
+msgstr "顯示標題(_I)"
+
+#: ../ui/shotwell.glade.h:42
+msgid "seconds"
+msgstr "秒"
+
+#: ../ui/shotwell.glade.h:43
+msgid "_Login"
+msgstr "登入(_L)"
+
+#~ msgid "Shotwell is configured to import photos to your home directory.\n"
+#~ msgstr "Shotwell 設定為將相片匯入您的家目錄。\n"
diff --git a/settings-migrator/shotwell-settings-migrator b/settings-migrator/shotwell-settings-migrator
new file mode 100644
index 0000000..9bb40eb
--- /dev/null
+++ b/settings-migrator/shotwell-settings-migrator
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+################################################################################
+#
+# Copyright 2012-2014 Yorba Foundation
+#
+# This software is licensed under the GNU LGPL (version 2.1 or later).
+# See the COPYING file in this distribution.
+#
+# Helper script to copy settings data from /apps/shotwell/ to
+# /org/yorba/shotwell/
+#
+# NOTE: this should only be run ONCE as part of the upgrade process; otherwise,
+# any stale data in the old location may be inadvertently copied over again,
+# overwriting newer data.
+#
+################################################################################
+
+sec_since_epoch=`date +%s`
+temp_file_path_prefix=/tmp/shotwell-migrate-settings-path-
+temp_file_path=$temp_file_path_prefix$sec_since_epoch
+
+# Copy from deprecated path...
+dconf dump /apps/shotwell/ > $temp_file_path
+
+# ...and into officially-blessed one.
+dconf load /org/yorba/shotwell/ < $temp_file_path
+
+# Clean out the stale paths...
+dconf reset -f /apps/shotwell/
+
+# temp file not needed anymore, zap it.
+rm -f $temp_file_path
diff --git a/shotwell-plugin-dev-1.0.m4 b/shotwell-plugin-dev-1.0.m4
new file mode 100644
index 0000000..1cbf175
--- /dev/null
+++ b/shotwell-plugin-dev-1.0.m4
@@ -0,0 +1,11 @@
+prefix=_PREFIX_
+exec_prefix=${prefix}
+libdir=${exec_prefix}/_LIB_
+includedir=${prefix}/include
+
+Name: Shotwell Plugin Development
+Description: Headers for building Shotwell plugins
+Requires: _REQUIREMENTS_
+Version: _VERSION_
+Cflags: -I${includedir}/shotwell
+
diff --git a/src/AppDirs.vala b/src/AppDirs.vala
new file mode 100644
index 0000000..6bf6759
--- /dev/null
+++ b/src/AppDirs.vala
@@ -0,0 +1,285 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+class AppDirs {
+ private const string DEFAULT_DATA_DIR = "shotwell";
+
+ private static File exec_dir;
+ private static File data_dir = null;
+ private static File tmp_dir = null;
+ private static File libexec_dir = null;
+
+ // Because this is called prior to Debug.init(), this function cannot do any logging calls
+ public static void init(string arg0) {
+ File exec_file = File.new_for_path(Posix.realpath(Environment.find_program_in_path(arg0)));
+ exec_dir = exec_file.get_parent();
+ }
+
+ // Because this *may* be called prior to Debug.init(), this function cannot do any logging
+ // calls
+ public static void terminate() {
+ }
+
+ public static File get_home_dir() {
+ return File.new_for_path(Environment.get_home_dir());
+ }
+
+ public static File get_cache_dir() {
+ return ((data_dir == null) ?
+ File.new_for_path(Environment.get_user_cache_dir()).get_child(DEFAULT_DATA_DIR) :
+ data_dir);
+ }
+
+ public static void try_migrate_data() {
+ File new_dir = get_data_dir();
+ File old_dir = get_home_dir().get_child(".shotwell");
+ if (new_dir.query_exists() || !old_dir.query_exists())
+ return;
+
+ File cache_dir = get_cache_dir();
+ Posix.mode_t mask = Posix.umask(0700);
+ if (!cache_dir.query_exists()) {
+ try {
+ cache_dir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create cache directory %s: %s").printf(cache_dir.get_path(),
+ err.message));
+ }
+ }
+ GLib.FileUtils.rename(old_dir.get_child("thumbs").get_path(), cache_dir.get_child("thumbs").get_path());
+
+ if (!new_dir.get_parent().query_exists()) {
+ try {
+ new_dir.get_parent().make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create data directory %s: %s").printf(new_dir.get_parent().get_path(),
+ err.message));
+ }
+ }
+ GLib.FileUtils.rename(old_dir.get_path(), new_dir.get_path());
+ GLib.FileUtils.chmod(new_dir.get_path(), 0700);
+
+ Posix.umask(mask);
+ }
+
+ // This can only be called once, and it better be called at startup
+ public static void set_data_dir(string user_data_dir) requires (!is_string_empty(user_data_dir)) {
+ assert(data_dir == null);
+
+ // fix up to absolute path
+ string path = strip_pretty_path(user_data_dir);
+ if (!Path.is_absolute(path))
+ data_dir = get_home_dir().get_child(path);
+ else
+ data_dir = File.new_for_path(path);
+
+ message("Setting private data directory to %s", data_dir.get_path());
+ }
+
+ public static void verify_data_dir() {
+ File data_dir = get_data_dir();
+ try {
+ if (!data_dir.query_exists(null))
+ data_dir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create data directory %s: %s").printf(data_dir.get_path(),
+ err.message));
+ }
+ }
+
+ public static void verify_cache_dir() {
+ File cache_dir = get_cache_dir();
+ try {
+ if (!cache_dir.query_exists(null))
+ cache_dir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create cache directory %s: %s").printf(cache_dir.get_path(),
+ err.message));
+ }
+ }
+
+ /**
+ * @brief Returns the build directory if not installed yet, or a path
+ * to where any helper applets we need will live if installed.
+ */
+ public static File get_libexec_dir() {
+ if (libexec_dir == null) {
+ if (get_install_dir() == null) {
+ // not installed yet - use wherever we were run from
+ libexec_dir = get_exec_dir();
+ } else {
+ libexec_dir = File.new_for_path(Resources.LIBEXECDIR);
+ }
+ }
+
+ return libexec_dir;
+ }
+
+ // Return the directory in which Shotwell is installed, or null if uninstalled.
+ public static File? get_install_dir() {
+ return get_sys_install_dir(exec_dir);
+ }
+
+ public static File get_data_dir() {
+ return (data_dir == null) ? File.new_for_path(Environment.get_user_data_dir()).get_child(DEFAULT_DATA_DIR) : data_dir;
+ }
+
+ // The "import directory" is the same as the library directory, and are often used
+ // interchangeably throughout the code.
+ public static File get_import_dir() {
+ string path = Config.Facade.get_instance().get_import_dir();
+ if (!is_string_empty(path)) {
+ // tilde -> home directory
+ path = strip_pretty_path(path);
+
+ // if non-empty and relative, make it relative to the user's home directory
+ if (!Path.is_absolute(path))
+ return get_home_dir().get_child(path);
+
+ // non-empty and absolute, it's golden
+ return File.new_for_path(path);
+ }
+
+ // Empty path, use XDG Pictures directory
+ path = Environment.get_user_special_dir(UserDirectory.PICTURES);
+ if (!is_string_empty(path))
+ return File.new_for_path(path);
+
+ // If XDG yarfed, use ~/Pictures
+ return get_home_dir().get_child(_("Pictures"));
+ }
+
+ // Library folder + photo folder, based on user's preferred directory pattern.
+ public static File get_baked_import_dir(time_t tm) {
+ string? pattern = Config.Facade.get_instance().get_directory_pattern();
+ if (is_string_empty(pattern))
+ pattern = Config.Facade.get_instance().get_directory_pattern_custom();
+ if (is_string_empty(pattern))
+ pattern = "%Y" + Path.DIR_SEPARATOR_S + "%m" + Path.DIR_SEPARATOR_S + "%d"; // default
+
+ DateTime date = new DateTime.from_unix_local(tm);
+ return File.new_for_path(get_import_dir().get_path() + Path.DIR_SEPARATOR_S + date.format(pattern));
+ }
+
+ // Returns true if the File is in or is equal to the library/import directory.
+ public static bool is_in_import_dir(File file) {
+ File import_dir = get_import_dir();
+
+ return file.has_prefix(import_dir) || file.equal(import_dir);
+ }
+
+ public static void set_import_dir(string path) {
+ Config.Facade.get_instance().set_import_dir(path);
+ }
+
+ public static File get_exec_dir() {
+ return exec_dir;
+ }
+
+ public static File get_temp_dir() {
+ if (tmp_dir == null) {
+ tmp_dir = File.new_for_path(DirUtils.mkdtemp (Environment.get_tmp_dir() + "/shotwell-XXXXXX"));
+
+ try {
+ if (!tmp_dir.query_exists(null))
+ tmp_dir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create temporary directory %s: %s").printf(
+ tmp_dir.get_path(), err.message));
+ }
+ }
+
+ return tmp_dir;
+ }
+
+ public static File get_data_subdir(string name, string? subname = null) {
+ File subdir = get_data_dir().get_child(name);
+ if (subname != null)
+ subdir = subdir.get_child(subname);
+
+ try {
+ if (!subdir.query_exists(null))
+ subdir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create data subdirectory %s: %s").printf(subdir.get_path(),
+ err.message));
+ }
+
+ return subdir;
+ }
+
+ public static File get_cache_subdir(string name, string? subname = null) {
+ File subdir = get_cache_dir().get_child(name);
+ if (subname != null)
+ subdir = subdir.get_child(subname);
+
+ try {
+ if (!subdir.query_exists(null))
+ subdir.make_directory_with_parents(null);
+ } catch (Error err) {
+ AppWindow.panic(_("Unable to create data subdirectory %s: %s").printf(subdir.get_path(),
+ err.message));
+ }
+
+ return subdir;
+ }
+
+ public static File get_resources_dir() {
+ File? install_dir = get_install_dir();
+
+ return (install_dir != null) ? install_dir.get_child("share").get_child("shotwell")
+ : get_exec_dir();
+ }
+
+ public static File get_lib_dir() {
+ File? install_dir = get_install_dir();
+
+ return (install_dir != null) ? install_dir.get_child(Resources.LIB).get_child("shotwell")
+ : get_exec_dir();
+ }
+
+ public static File get_system_plugins_dir() {
+ return get_lib_dir().get_child("plugins");
+ }
+
+ public static File get_user_plugins_dir() {
+ return get_home_dir().get_child(".gnome2").get_child("shotwell").get_child("plugins");
+ }
+
+ public static File? get_log_file() {
+ if (Environment.get_variable("SHOTWELL_LOG_FILE") != null) {
+ if (Environment.get_variable("SHOTWELL_LOG_FILE") == ":console:") {
+ return null;
+ } else {
+ return File.new_for_path(Environment.get_variable("SHOTWELL_LOG_FILE"));
+ }
+ } else {
+ return File.new_for_path(Environment.get_user_cache_dir()).
+ get_child("shotwell").get_child("shotwell.log");
+ }
+ }
+
+ public static File get_thumbnailer_bin() {
+ const string filename = "shotwell-video-thumbnailer";
+ File f = File.new_for_path(AppDirs.get_libexec_dir().get_path() + "/thumbnailer/" + filename);
+ if (!f.query_exists()) {
+ // If we're running installed.
+ f = File.new_for_path(AppDirs.get_libexec_dir().get_path() + "/" + filename);
+ }
+ return f;
+ }
+
+ public static File get_settings_migrator_bin() {
+ const string filename = "shotwell-settings-migrator";
+ File f = File.new_for_path(AppDirs.get_libexec_dir().get_path() + "/settings-migrator/" + filename);
+ if (!f.query_exists()) {
+ // If we're running installed.
+ f = File.new_for_path(AppDirs.get_libexec_dir().get_path() + "/" + filename);
+ }
+ return f;
+ }
+}
+
diff --git a/src/AppWindow.vala b/src/AppWindow.vala
new file mode 100644
index 0000000..9c1f2b4
--- /dev/null
+++ b/src/AppWindow.vala
@@ -0,0 +1,961 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class FullscreenWindow : PageWindow {
+ public const int TOOLBAR_INVOCATION_MSEC = 250;
+ public const int TOOLBAR_DISMISSAL_SEC = 2;
+ public const int TOOLBAR_CHECK_DISMISSAL_MSEC = 500;
+
+ private Gtk.Window toolbar_window = new Gtk.Window(Gtk.WindowType.POPUP);
+ private Gtk.ToolButton close_button = new Gtk.ToolButton.from_stock(Gtk.Stock.LEAVE_FULLSCREEN);
+ private Gtk.ToggleToolButton pin_button = new Gtk.ToggleToolButton.from_stock(Resources.PIN_TOOLBAR);
+ private bool is_toolbar_shown = false;
+ private bool waiting_for_invoke = false;
+ private time_t left_toolbar_time = 0;
+ private bool switched_to = false;
+ private bool is_toolbar_dismissal_enabled;
+
+ public FullscreenWindow(Page page) {
+ set_current_page(page);
+
+ File ui_file = Resources.get_ui("fullscreen.ui");
+
+ try {
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ error("Error loading UI file %s: %s", ui_file.get_path(), err.message);
+ }
+
+ Gtk.ActionGroup action_group = new Gtk.ActionGroup("FullscreenActionGroup");
+ action_group.add_actions(create_actions(), this);
+ ui.insert_action_group(action_group, 0);
+ ui.ensure_update();
+
+ Gtk.AccelGroup accel_group = ui.get_accel_group();
+ if (accel_group != null)
+ add_accel_group(accel_group);
+
+ set_screen(AppWindow.get_instance().get_screen());
+
+ // Needed so fullscreen will occur on correct monitor in multi-monitor setups
+ Gdk.Rectangle monitor = get_monitor_geometry();
+ move(monitor.x, monitor.y);
+
+ set_border_width(0);
+
+ // restore pin state
+ is_toolbar_dismissal_enabled = Config.Facade.get_instance().get_pin_toolbar_state();
+
+ pin_button.set_label(_("Pin Toolbar"));
+ pin_button.set_tooltip_text(_("Pin the toolbar open"));
+ pin_button.set_active(!is_toolbar_dismissal_enabled);
+ pin_button.clicked.connect(update_toolbar_dismissal);
+
+ close_button.set_tooltip_text(_("Leave fullscreen"));
+ close_button.clicked.connect(on_close);
+
+ Gtk.Toolbar toolbar = page.get_toolbar();
+ toolbar.set_show_arrow(false);
+
+ if (page is SlideshowPage) {
+ // slideshow page doesn't own toolbar to hide it, subscribe to signal instead
+ ((SlideshowPage) page).hide_toolbar.connect(hide_toolbar);
+ } else {
+ // only non-slideshow pages should have pin button
+ toolbar.insert(pin_button, -1);
+ }
+
+ page.set_cursor_hide_time(TOOLBAR_DISMISSAL_SEC * 1000);
+ page.start_cursor_hiding();
+
+ toolbar.insert(close_button, -1);
+
+ // set up toolbar along bottom of screen
+ toolbar_window.set_screen(get_screen());
+ toolbar_window.set_border_width(0);
+ toolbar_window.add(toolbar);
+
+ toolbar_window.realize.connect(on_toolbar_realized);
+
+ add(page);
+
+ // call to set_default_size() saves one repaint caused by changing
+ // size from default to full screen. In slideshow mode, this change
+ // also causes pixbuf cache updates, so it really saves some work.
+ set_default_size(monitor.width, monitor.height);
+
+ // need to create a Gdk.Window to set masks
+ fullscreen();
+ show_all();
+
+ // capture motion events to show the toolbar
+ add_events(Gdk.EventMask.POINTER_MOTION_MASK);
+
+ // start off with toolbar invoked, as a clue for the user
+ invoke_toolbar();
+ }
+
+ public void disable_toolbar_dismissal() {
+ is_toolbar_dismissal_enabled = false;
+ }
+
+ public void update_toolbar_dismissal() {
+ is_toolbar_dismissal_enabled = !pin_button.get_active();
+ }
+
+ private Gdk.Rectangle get_monitor_geometry() {
+ Gdk.Rectangle monitor;
+
+ get_screen().get_monitor_geometry(
+ get_screen().get_monitor_at_window(AppWindow.get_instance().get_window()), out monitor);
+
+ return monitor;
+ }
+
+ public override bool configure_event(Gdk.EventConfigure event) {
+ bool result = base.configure_event(event);
+
+ if (!switched_to) {
+ get_current_page().switched_to();
+ switched_to = true;
+ }
+
+ return result;
+ }
+
+ private Gtk.ActionEntry[] create_actions() {
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry leave_fullscreen = { "LeaveFullscreen", Gtk.Stock.LEAVE_FULLSCREEN,
+ TRANSLATABLE, "F11", TRANSLATABLE, on_close };
+ leave_fullscreen.label = _("Leave _Fullscreen");
+ leave_fullscreen.tooltip = _("Leave fullscreen");
+ actions += leave_fullscreen;
+
+ return actions;
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ // check for an escape/abort
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ on_close();
+
+ return true;
+ }
+
+ // Make sure this event gets propagated to the underlying window...
+ AppWindow.get_instance().key_press_event(event);
+
+ // ...then let the base class take over
+ return (base.key_press_event != null) ? base.key_press_event(event) : false;
+ }
+
+ private void on_close() {
+ Config.Facade.get_instance().set_pin_toolbar_state(is_toolbar_dismissal_enabled);
+ hide_toolbar();
+ toolbar_window = null;
+
+ AppWindow.get_instance().end_fullscreen();
+ }
+
+ public new void close() {
+ on_close();
+ }
+
+ public override void destroy() {
+ Page? page = get_current_page();
+ clear_current_page();
+
+ if (page != null) {
+ page.stop_cursor_hiding();
+ page.switching_from();
+ }
+
+ base.destroy();
+ }
+
+ public override bool delete_event(Gdk.EventAny event) {
+ on_close();
+ AppWindow.get_instance().destroy();
+
+ return true;
+ }
+
+ public override bool motion_notify_event(Gdk.EventMotion event) {
+ if (!is_toolbar_shown) {
+ // if pointer is in toolbar height range without the mouse down (i.e. in the middle of
+ // an edit operation) and it stays there the necessary amount of time, invoke the
+ // toolbar
+ if (!waiting_for_invoke && is_pointer_in_toolbar()) {
+ Timeout.add(TOOLBAR_INVOCATION_MSEC, on_check_toolbar_invocation);
+ waiting_for_invoke = true;
+ }
+ }
+
+ return (base.motion_notify_event != null) ? base.motion_notify_event(event) : false;
+ }
+
+ private bool is_pointer_in_toolbar() {
+ Gdk.DeviceManager? devmgr = get_display().get_device_manager();
+ if (devmgr == null) {
+ debug("No device manager for display");
+
+ return false;
+ }
+
+ int py;
+ devmgr.get_client_pointer().get_position(null, null, out py);
+
+ int wy;
+ toolbar_window.get_window().get_geometry(null, out wy, null, null);
+
+ return (py >= wy);
+ }
+
+ private bool on_check_toolbar_invocation() {
+ waiting_for_invoke = false;
+
+ if (is_toolbar_shown)
+ return false;
+
+ if (!is_pointer_in_toolbar())
+ return false;
+
+ invoke_toolbar();
+
+ return false;
+ }
+
+ private void on_toolbar_realized() {
+ Gtk.Requisition req;
+ toolbar_window.get_preferred_size(null, out req);
+
+ // place the toolbar in the center of the monitor along the bottom edge
+ Gdk.Rectangle monitor = get_monitor_geometry();
+ int tx = monitor.x + (monitor.width - req.width) / 2;
+ if (tx < 0)
+ tx = 0;
+
+ int ty = monitor.y + monitor.height - req.height;
+ if (ty < 0)
+ ty = 0;
+
+ toolbar_window.move(tx, ty);
+ toolbar_window.set_opacity(Resources.TRANSIENT_WINDOW_OPACITY);
+ }
+
+ private void invoke_toolbar() {
+ toolbar_window.show_all();
+
+ is_toolbar_shown = true;
+
+ Timeout.add(TOOLBAR_CHECK_DISMISSAL_MSEC, on_check_toolbar_dismissal);
+ }
+
+ private bool on_check_toolbar_dismissal() {
+ if (!is_toolbar_shown)
+ return false;
+
+ if (toolbar_window == null)
+ return false;
+
+ // if dismissal is disabled, keep open but keep checking
+ if ((!is_toolbar_dismissal_enabled))
+ return true;
+
+ // if the pointer is in toolbar range, keep it alive, but keep checking
+ if (is_pointer_in_toolbar()) {
+ left_toolbar_time = 0;
+
+ return true;
+ }
+
+ // if this is the first time noticed, start the timer and keep checking
+ if (left_toolbar_time == 0) {
+ left_toolbar_time = time_t();
+
+ return true;
+ }
+
+ // see if enough time has elapsed
+ time_t now = time_t();
+ assert(now >= left_toolbar_time);
+
+ if (now - left_toolbar_time < TOOLBAR_DISMISSAL_SEC)
+ return true;
+
+ hide_toolbar();
+
+ return false;
+ }
+
+ private void hide_toolbar() {
+ toolbar_window.hide();
+ is_toolbar_shown = false;
+ }
+}
+
+// PageWindow is a Gtk.Window with essential functions for hosting a Page. There may be more than
+// one PageWindow in the system, and closing one does not imply exiting the application.
+//
+// PageWindow offers support for hosting a single Page; multiple Pages must be handled by the
+// subclass. A subclass should set current_page to the user-visible Page for it to receive
+// various notifications. It is the responsibility of the subclass to notify Pages when they're
+// switched to and from, and other aspects of the Page interface.
+public abstract class PageWindow : Gtk.Window {
+ protected Gtk.UIManager ui = new Gtk.UIManager();
+
+ private Page current_page = null;
+ private int busy_counter = 0;
+
+ protected virtual void switched_pages(Page? old_page, Page? new_page) {
+ }
+
+ public PageWindow() {
+ // the current page needs to know when modifier keys are pressed
+ add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK
+ | Gdk.EventMask.STRUCTURE_MASK);
+
+ set_has_resize_grip(false);
+ }
+
+ public Gtk.UIManager get_ui_manager() {
+ return ui;
+ }
+
+ public Page? get_current_page() {
+ return current_page;
+ }
+
+ public virtual void set_current_page(Page page) {
+ if (current_page != null)
+ current_page.clear_container();
+
+ Page? old_page = current_page;
+ current_page = page;
+ current_page.set_container(this);
+
+ switched_pages(old_page, page);
+ }
+
+ public virtual void clear_current_page() {
+ if (current_page != null)
+ current_page.clear_container();
+
+ Page? old_page = current_page;
+ current_page = null;
+
+ switched_pages(old_page, null);
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ if (get_focus() is Gtk.Entry && get_focus().key_press_event(event))
+ return true;
+
+ if (current_page != null && current_page.notify_app_key_pressed(event))
+ return true;
+
+ return (base.key_press_event != null) ? base.key_press_event(event) : false;
+ }
+
+ public override bool key_release_event(Gdk.EventKey event) {
+ if (get_focus() is Gtk.Entry && get_focus().key_release_event(event))
+ return true;
+
+ if (current_page != null && current_page.notify_app_key_released(event))
+ return true;
+
+ return (base.key_release_event != null) ? base.key_release_event(event) : false;
+ }
+
+ public override bool focus_in_event(Gdk.EventFocus event) {
+ if (current_page != null && current_page.notify_app_focus_in(event))
+ return true;
+
+ return (base.focus_in_event != null) ? base.focus_in_event(event) : false;
+ }
+
+ public override bool focus_out_event(Gdk.EventFocus event) {
+ if (current_page != null && current_page.notify_app_focus_out(event))
+ return true;
+
+ return (base.focus_out_event != null) ? base.focus_out_event(event) : false;
+ }
+
+ public override bool configure_event(Gdk.EventConfigure event) {
+ if (current_page != null) {
+ if (current_page.notify_configure_event(event))
+ return true;
+ }
+
+ return (base.configure_event != null) ? base.configure_event(event) : false;
+ }
+
+ public void set_busy_cursor() {
+ if (busy_counter++ > 0)
+ return;
+
+ get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.WATCH));
+ spin_event_loop();
+ }
+
+ public void set_normal_cursor() {
+ if (busy_counter <= 0) {
+ busy_counter = 0;
+ return;
+ } else if (--busy_counter > 0) {
+ return;
+ }
+
+ get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+ spin_event_loop();
+ }
+
+}
+
+// AppWindow is the parent window for most windows in Shotwell (FullscreenWindow is the exception).
+// There are multiple types of AppWindows (LibraryWindow, DirectWindow) for different tasks, but only
+// one AppWindow may exist per process. Thus, if the user closes an AppWindow, the program exits.
+//
+// AppWindow also offers support for going into fullscreen mode. It handles the interface
+// notifications Page is expecting when switching back and forth.
+public abstract class AppWindow : PageWindow {
+ public const int DND_ICON_SCALE = 128;
+
+ protected static AppWindow instance = null;
+
+ private static FullscreenWindow fullscreen_window = null;
+ private static CommandManager command_manager = null;
+
+ // the AppWindow maintains its own UI manager because the first UIManager an action group is
+ // added to is the one that claims its accelerators
+ protected Gtk.ActionGroup[] common_action_groups;
+ protected bool maximized = false;
+ protected Dimensions dimensions;
+ protected int pos_x = 0;
+ protected int pos_y = 0;
+
+ private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("AppWindowGlobalActionGroup");
+
+ public AppWindow() {
+ // although there are multiple AppWindow types, only one may exist per-process
+ assert(instance == null);
+ instance = this;
+
+ title = Resources.APP_TITLE;
+
+ GLib.List<Gdk.Pixbuf> pixbuf_list = new GLib.List<Gdk.Pixbuf>();
+ foreach (string resource in Resources.APP_ICONS)
+ pixbuf_list.append(Resources.get_icon(resource, 0));
+ set_default_icon_list(pixbuf_list);
+
+ // restore previous size and maximization state
+ if (this is LibraryWindow) {
+ Config.Facade.get_instance().get_library_window_state(out maximized, out dimensions);
+ } else {
+ assert(this is DirectWindow);
+ Config.Facade.get_instance().get_direct_window_state(out maximized, out dimensions);
+ }
+
+ set_default_size(dimensions.width, dimensions.height);
+
+ if (maximized)
+ maximize();
+
+ assert(command_manager == null);
+ command_manager = new CommandManager();
+ command_manager.altered.connect(on_command_manager_altered);
+
+ // Because the first UIManager to associated with an ActionGroup claims the accelerators,
+ // need to create the AppWindow's ActionGroup early on and add it to an application-wide
+ // UIManager. In order to activate those accelerators, we need to create a dummy UI string
+ // that lists all the common actions. We build it on-the-fly from the actions associated
+ // with each ActionGroup while we're adding the groups to the UIManager.
+ common_action_groups = create_common_action_groups();
+ foreach (Gtk.ActionGroup group in common_action_groups)
+ ui.insert_action_group(group, 0);
+
+ try {
+ ui.add_ui_from_string(build_dummy_ui_string(common_action_groups), -1);
+ } catch (Error err) {
+ error("Unable to add AppWindow UI: %s", err.message);
+ }
+
+ ui.ensure_update();
+ add_accel_group(ui.get_accel_group());
+ }
+
+ private Gtk.ActionEntry[] create_common_actions() {
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry quit = { "CommonQuit", Gtk.Stock.QUIT, TRANSLATABLE, "<Ctrl>Q",
+ TRANSLATABLE, on_quit };
+ quit.label = _("_Quit");
+ actions += quit;
+
+ Gtk.ActionEntry about = { "CommonAbout", Gtk.Stock.ABOUT, TRANSLATABLE, null,
+ TRANSLATABLE, on_about };
+ about.label = _("_About");
+ actions += about;
+
+ Gtk.ActionEntry fullscreen = { "CommonFullscreen", Gtk.Stock.FULLSCREEN,
+ TRANSLATABLE, "F11", TRANSLATABLE, on_fullscreen };
+ fullscreen.label = _("Fulls_creen");
+ actions += fullscreen;
+
+ Gtk.ActionEntry help_contents = { "CommonHelpContents", Gtk.Stock.HELP,
+ TRANSLATABLE, "F1", TRANSLATABLE, on_help_contents };
+ help_contents.label = _("_Contents");
+ actions += help_contents;
+
+ Gtk.ActionEntry help_faq = { "CommonHelpFAQ", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_help_faq };
+ help_faq.label = _("_Frequently Asked Questions");
+ actions += help_faq;
+
+ Gtk.ActionEntry help_report_problem = { "CommonHelpReportProblem", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_help_report_problem };
+ help_report_problem.label = _("_Report a Problem...");
+ actions += help_report_problem;
+
+ Gtk.ActionEntry undo = { "CommonUndo", Gtk.Stock.UNDO, TRANSLATABLE, "<Ctrl>Z",
+ TRANSLATABLE, on_undo };
+ undo.label = Resources.UNDO_MENU;
+ actions += undo;
+
+ Gtk.ActionEntry redo = { "CommonRedo", Gtk.Stock.REDO, TRANSLATABLE, "<Ctrl><Shift>Z",
+ TRANSLATABLE, on_redo };
+ redo.label = Resources.REDO_MENU;
+ actions += redo;
+
+ Gtk.ActionEntry jump_to_file = { "CommonJumpToFile", Gtk.Stock.JUMP_TO, TRANSLATABLE,
+ "<Ctrl><Shift>M", TRANSLATABLE, on_jump_to_file };
+ jump_to_file.label = Resources.JUMP_TO_FILE_MENU;
+ actions += jump_to_file;
+
+ Gtk.ActionEntry select_all = { "CommonSelectAll", Gtk.Stock.SELECT_ALL, TRANSLATABLE,
+ "<Ctrl>A", TRANSLATABLE, on_select_all };
+ select_all.label = Resources.SELECT_ALL_MENU;
+ actions += select_all;
+
+ Gtk.ActionEntry select_none = { "CommonSelectNone", null, null,
+ "<Ctrl><Shift>A", TRANSLATABLE, on_select_none };
+ actions += select_none;
+
+ return actions;
+ }
+
+ protected abstract void on_fullscreen();
+
+ public static bool has_instance() {
+ return instance != null;
+ }
+
+ public static AppWindow get_instance() {
+ return instance;
+ }
+
+ public static FullscreenWindow get_fullscreen() {
+ return fullscreen_window;
+ }
+
+ public static Gtk.Builder create_builder(string glade_filename = "shotwell.glade", void *user = null) {
+ Gtk.Builder builder = new Gtk.Builder();
+ try {
+ builder.add_from_file(AppDirs.get_resources_dir().get_child("ui").get_child(
+ glade_filename).get_path());
+ } catch(GLib.Error error) {
+ warning("Unable to create Gtk.Builder: %s\n", error.message);
+ }
+
+ builder.connect_signals(user);
+
+ return builder;
+ }
+
+ public static void error_message(string message, Gtk.Window? parent = null) {
+ error_message_with_title(Resources.APP_TITLE, message, parent);
+ }
+
+ public static void error_message_with_title(string title, string message, Gtk.Window? parent = null, bool should_escape = true) {
+ // Per the Gnome HIG (http://library.gnome.org/devel/hig-book/2.32/windows-alert.html.en),
+ // alert-style dialogs mustn't have titles; we use the title as the primary text, and the
+ // existing message as the secondary text.
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog.with_markup((parent != null) ? parent : get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "%s", build_alert_body_text(title, message, should_escape));
+
+ // Occasionally, with_markup doesn't actually do anything, but set_markup always works.
+ dialog.set_markup(build_alert_body_text(title, message, should_escape));
+
+ dialog.use_markup = true;
+ dialog.run();
+ dialog.destroy();
+ }
+
+ public static bool negate_affirm_question(string message, string negative, string affirmative,
+ string? title = null, Gtk.Window? parent = null) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog((parent != null) ? parent : get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", build_alert_body_text(title, message));
+
+ dialog.set_markup(build_alert_body_text(title, message));
+ dialog.add_buttons(negative, Gtk.ResponseType.NO, affirmative, Gtk.ResponseType.YES);
+ dialog.set_urgency_hint(true);
+
+ bool response = (dialog.run() == Gtk.ResponseType.YES);
+
+ dialog.destroy();
+
+ return response;
+ }
+
+ public static Gtk.ResponseType negate_affirm_cancel_question(string message, string negative,
+ string affirmative, string? title = null, Gtk.Window? parent = null) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog.with_markup((parent != null) ? parent : get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", build_alert_body_text(title, message));
+
+ dialog.add_buttons(negative, Gtk.ResponseType.NO, affirmative, Gtk.ResponseType.YES,
+ _("_Cancel"), Gtk.ResponseType.CANCEL);
+
+ // Occasionally, with_markup doesn't actually enable markup, but set_markup always works.
+ dialog.set_markup(build_alert_body_text(title, message));
+ dialog.use_markup = true;
+
+ int response = dialog.run();
+
+ dialog.destroy();
+
+ return (Gtk.ResponseType) response;
+ }
+
+ public static Gtk.ResponseType affirm_cancel_question(string message, string affirmative,
+ string? title = null, Gtk.Window? parent = null) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog.with_markup((parent != null) ? parent : get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", message);
+ // Occasionally, with_markup doesn't actually enable markup...? Force the issue.
+ dialog.set_markup(message);
+ dialog.use_markup = true;
+ dialog.title = (title != null) ? title : Resources.APP_TITLE;
+ dialog.add_buttons(affirmative, Gtk.ResponseType.YES, _("_Cancel"),
+ Gtk.ResponseType.CANCEL);
+
+ int response = dialog.run();
+
+ dialog.destroy();
+
+ return (Gtk.ResponseType) response;
+ }
+
+ public static Gtk.ResponseType negate_affirm_all_cancel_question(string message,
+ string negative, string affirmative, string affirmative_all, string? title = null,
+ Gtk.Window? parent = null) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog((parent != null) ? parent : get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", message);
+ dialog.title = (title != null) ? title : Resources.APP_TITLE;
+ dialog.add_buttons(negative, Gtk.ResponseType.NO, affirmative, Gtk.ResponseType.YES,
+ affirmative_all, Gtk.ResponseType.APPLY, _("_Cancel"), Gtk.ResponseType.CANCEL);
+
+ int response = dialog.run();
+
+ dialog.destroy();
+
+ return (Gtk.ResponseType) response;
+ }
+
+ public static void database_error(DatabaseError err) {
+ panic(_("A fatal error occurred when accessing Shotwell's library. Shotwell cannot continue.\n\n%s").printf(
+ err.message));
+ }
+
+ public static void panic(string msg) {
+ critical(msg);
+ error_message(msg);
+
+ Application.get_instance().panic();
+ }
+
+ public abstract string get_app_role();
+
+ protected void on_about() {
+ Gtk.show_about_dialog(this,
+ "version", Resources.APP_VERSION,
+ "comments", get_app_role(),
+ "copyright", Resources.COPYRIGHT,
+ "website", Resources.HOME_URL,
+ "license", Resources.LICENSE,
+ "website-label", _("Visit the Yorba web site"),
+ "authors", Resources.AUTHORS,
+ "logo", Resources.get_icon(Resources.ICON_ABOUT_LOGO, -1),
+ "translator-credits", _("translator-credits"),
+ null
+ );
+ }
+
+ private void on_help_contents() {
+ try {
+ Resources.launch_help(get_screen());
+ } catch (Error err) {
+ error_message(_("Unable to display help: %s").printf(err.message));
+ }
+ }
+
+ private void on_help_report_problem() {
+ try {
+ show_uri(Resources.BUG_DB_URL);
+ } catch (Error err) {
+ error_message(_("Unable to navigate to bug database: %s").printf(err.message));
+ }
+ }
+
+ private void on_help_faq() {
+ try {
+ show_uri(Resources.FAQ_URL);
+ } catch (Error err) {
+ error_message(_("Unable to display FAQ: %s").printf(err.message));
+ }
+ }
+
+ protected virtual void on_quit() {
+ Application.get_instance().exit();
+ }
+
+ protected void on_jump_to_file() {
+ if (get_current_page().get_view().get_selected_count() != 1)
+ return;
+
+ MediaSource? media = get_current_page().get_view().get_selected_at(0).get_source()
+ as MediaSource;
+ if (media == null)
+ return;
+
+ try {
+ AppWindow.get_instance().show_file_uri(media.get_master_file());
+ } catch (Error err) {
+ AppWindow.error_message(Resources.jump_to_file_failed(err));
+ }
+ }
+
+ protected override void destroy() {
+ on_quit();
+ }
+
+ public void show_file_uri(File file) throws Error {
+ string tmp;
+
+ // if file manager is nautilus then pass the full path to file; otherwise pass
+ // the enclosing directory
+ if(get_nautilus_install_location() != null) {
+ tmp = file.get_uri().replace("'","\\\'");
+ show_file_in_nautilus(tmp);
+ } else {
+ tmp = file.get_parent().get_uri().replace("'","\\\'");
+ show_uri(tmp);
+ }
+ }
+
+ public void show_uri(string url) throws Error {
+ sys_show_uri(get_window().get_screen(), url);
+ }
+
+ protected virtual Gtk.ActionGroup[] create_common_action_groups() {
+ Gtk.ActionGroup[] groups = new Gtk.ActionGroup[0];
+
+ common_action_group.add_actions(create_common_actions(), this);
+ groups += common_action_group;
+
+ return groups;
+ }
+
+ public Gtk.ActionGroup[] get_common_action_groups() {
+ return common_action_groups;
+ }
+
+ public virtual void replace_common_placeholders(Gtk.UIManager ui) {
+ }
+
+ public void go_fullscreen(Page page) {
+ // if already fullscreen, use that
+ if (fullscreen_window != null) {
+ fullscreen_window.present();
+
+ return;
+ }
+
+ get_position(out pos_x, out pos_y);
+ hide();
+
+ FullscreenWindow fsw = new FullscreenWindow(page);
+
+ if (get_current_page() != null)
+ get_current_page().switching_to_fullscreen(fsw);
+
+ fullscreen_window = fsw;
+ fullscreen_window.present();
+ }
+
+ public void end_fullscreen() {
+ if (fullscreen_window == null)
+ return;
+
+ move(pos_x, pos_y);
+
+ show_all();
+
+ if (get_current_page() != null)
+ get_current_page().returning_from_fullscreen(fullscreen_window);
+
+ fullscreen_window.hide();
+ fullscreen_window.destroy();
+ fullscreen_window = null;
+
+ present();
+ }
+
+ public Gtk.Action? get_common_action(string name) {
+ foreach (Gtk.ActionGroup group in common_action_groups) {
+ Gtk.Action? action = group.get_action(name);
+ if (action != null)
+ return action;
+ }
+
+ warning("No common action found: %s", name);
+
+ return null;
+ }
+
+ public void set_common_action_sensitive(string name, bool sensitive) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.sensitive = sensitive;
+ }
+
+ public void set_common_action_important(string name, bool important) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.is_important = important;
+ }
+
+ public void set_common_action_visible(string name, bool visible) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.visible = visible;
+ }
+
+ protected override void switched_pages(Page? old_page, Page? new_page) {
+ update_common_action_availability(old_page, new_page);
+
+ if (old_page != null) {
+ old_page.get_view().contents_altered.disconnect(on_update_common_actions);
+ old_page.get_view().selection_group_altered.disconnect(on_update_common_actions);
+ old_page.get_view().items_state_changed.disconnect(on_update_common_actions);
+ }
+
+ if (new_page != null) {
+ new_page.get_view().contents_altered.connect(on_update_common_actions);
+ new_page.get_view().selection_group_altered.connect(on_update_common_actions);
+ new_page.get_view().items_state_changed.connect(on_update_common_actions);
+
+ update_common_actions(new_page, new_page.get_view().get_selected_count(),
+ new_page.get_view().get_count());
+ }
+
+ base.switched_pages(old_page, new_page);
+ }
+
+ // This is called when a Page is switched out and certain common actions are simply
+ // unavailable for the new one. This is different than update_common_actions() in that that
+ // call is made when state within the Page has changed.
+ protected virtual void update_common_action_availability(Page? old_page, Page? new_page) {
+ bool is_checkerboard = new_page is CheckerboardPage;
+
+ set_common_action_sensitive("CommonSelectAll", is_checkerboard);
+ set_common_action_sensitive("CommonSelectNone", is_checkerboard);
+ }
+
+ // This is a counterpart to Page.update_actions(), but for common Gtk.Actions
+ // NOTE: Although CommonFullscreen is declared here, it's implementation is up to the subclasses,
+ // therefore they need to update its action.
+ protected virtual void update_common_actions(Page page, int selected_count, int count) {
+ if (page is CheckerboardPage)
+ set_common_action_sensitive("CommonSelectAll", count > 0);
+ set_common_action_sensitive("CommonJumpToFile", selected_count == 1);
+
+ decorate_undo_action();
+ decorate_redo_action();
+ }
+
+ private void on_update_common_actions() {
+ Page? page = get_current_page();
+ if (page != null)
+ update_common_actions(page, page.get_view().get_selected_count(), page.get_view().get_count());
+ }
+
+ public static CommandManager get_command_manager() {
+ return command_manager;
+ }
+
+ private void on_command_manager_altered() {
+ decorate_undo_action();
+ decorate_redo_action();
+ }
+
+ private void decorate_command_manager_action(string name, string prefix,
+ string default_explanation, CommandDescription? desc) {
+ Gtk.Action? action = get_common_action(name);
+ if (action == null)
+ return;
+
+ if (desc != null) {
+ action.label = "%s %s".printf(prefix, desc.get_name());
+ action.tooltip = desc.get_explanation();
+ action.sensitive = true;
+ } else {
+ action.label = prefix;
+ action.tooltip = default_explanation;
+ action.sensitive = false;
+ }
+ }
+
+ public void decorate_undo_action() {
+ decorate_command_manager_action("CommonUndo", Resources.UNDO_MENU, "",
+ get_command_manager().get_undo_description());
+ }
+
+ public void decorate_redo_action() {
+ decorate_command_manager_action("CommonRedo", Resources.REDO_MENU, "",
+ get_command_manager().get_redo_description());
+ }
+
+ private void on_undo() {
+ command_manager.undo();
+ }
+
+ private void on_redo() {
+ command_manager.redo();
+ }
+
+ private void on_select_all() {
+ Page? page = get_current_page() as CheckerboardPage;
+ if (page != null)
+ page.get_view().select_all();
+ }
+
+ private void on_select_none() {
+ Page? page = get_current_page() as CheckerboardPage;
+ if (page != null)
+ page.get_view().unselect_all();
+ }
+
+ public override bool configure_event(Gdk.EventConfigure event) {
+ maximized = (get_window().get_state() == Gdk.WindowState.MAXIMIZED);
+
+ if (!maximized)
+ get_size(out dimensions.width, out dimensions.height);
+
+ return base.configure_event(event);
+ }
+
+}
+
diff --git a/src/Application.vala b/src/Application.vala
new file mode 100644
index 0000000..95163cf
--- /dev/null
+++ b/src/Application.vala
@@ -0,0 +1,228 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Application {
+ private static Application instance = null;
+ private Gtk.Application system_app = null;
+ private int system_app_run_retval = 0;
+ private bool direct;
+
+ public virtual signal void starting() {
+ }
+
+ public virtual signal void exiting(bool panicked) {
+ }
+
+ public virtual signal void init_done() {
+ }
+
+ private bool fixup_raw_thumbs = false;
+
+ public void set_raw_thumbs_fix_required(bool should_fixup) {
+ fixup_raw_thumbs = should_fixup;
+ }
+
+ public bool get_raw_thumbs_fix_required() {
+ return fixup_raw_thumbs;
+ }
+
+ private bool running = false;
+ private bool exiting_fired = false;
+
+ private Application(bool is_direct) {
+ if (is_direct) {
+ // we allow multiple instances of ourself in direct mode, so DON'T
+ // attempt to be unique. We don't request any command-line handling
+ // here because this is processed elsewhere, and we don't need to handle
+ // command lines from remote instances, since we don't care about them.
+ system_app = new Gtk.Application("org.yorba.shotwell-direct", GLib.ApplicationFlags.HANDLES_OPEN |
+ GLib.ApplicationFlags.NON_UNIQUE);
+ } else {
+ // we've been invoked in library mode; set up for uniqueness and handling
+ // of incoming command lines from remote instances (needed for getting
+ // storage device and camera mounts).
+ system_app = new Gtk.Application("org.yorba.shotwell", GLib.ApplicationFlags.HANDLES_OPEN |
+ GLib.ApplicationFlags.HANDLES_COMMAND_LINE);
+ }
+
+ // GLib will assert if we don't do this...
+ try {
+ system_app.register();
+ } catch (Error e) {
+ panic();
+ }
+
+ direct = is_direct;
+
+ if (!direct) {
+ system_app.command_line.connect(on_command_line);
+ }
+
+ system_app.activate.connect(on_activated);
+ system_app.startup.connect(on_activated);
+ }
+
+ /**
+ * @brief This is a helper for library mode that should only be
+ * called if we've gotten a camera mount and are _not_ the primary
+ * instance.
+ */
+ public static void send_to_primary_instance(string[]? argv) {
+ get_instance().system_app.run(argv);
+ }
+
+ /**
+ * @brief A helper for library mode that tells the primary
+ * instance to bring its window to the foreground. This
+ * should only be called if we are _not_ the primary instance.
+ */
+ public static void present_primary_instance() {
+ get_instance().system_app.activate();
+ }
+
+ public static bool get_is_remote() {
+ return get_instance().system_app.get_is_remote();
+ }
+
+ public static bool get_is_direct() {
+ return get_instance().direct;
+ }
+
+ /**
+ * @brief Signal handler for GApplication's 'command-line' signal.
+ *
+ * The most likely scenario for this to be fired is if the user
+ * either tried to run us twice in library mode, or we've just gotten
+ * a camera/removeable-storage mount; in either case, the remote instance
+ * will trigger this and exit, and we'll need to bring the window back up...
+ */
+ public static void on_activated() {
+ get_instance();
+
+ LibraryWindow lw = AppWindow.get_instance() as LibraryWindow;
+ if ((lw != null) && (!get_is_direct())) {
+ LibraryWindow.get_app().present();
+ }
+ }
+
+ /**
+ * @brief Signal handler for GApplication's 'command-line' signal.
+ *
+ * Gets fired whenever a remote instance tries to run, usually
+ * with an incoming camera connection.
+ *
+ * @note This does _not_ get called in direct-edit mode.
+ */
+ public static int on_command_line(ApplicationCommandLine acl) {
+ string[]? argv = acl.get_arguments();
+
+ if (argv != null) {
+ foreach (string s in argv) {
+ LibraryWindow lw = AppWindow.get_instance() as LibraryWindow;
+ if (lw != null) {
+ lw.mounted_camera_shell_notification(s, false);
+ }
+ }
+ }
+ on_activated();
+ return 0;
+ }
+
+ /**
+ * @brief Initializes the Shotwell application object and prepares
+ * it for use.
+ *
+ * @param is_direct Whether the application was invoked in direct
+ * or in library mode; defaults to FALSE, that is, library mode.
+ *
+ * @note This MUST be called prior to calling get_instance(), as the
+ * application needs to know what mode it was brought up in; failure to
+ * call this first will lead to an assertion.
+ */
+ public static void init(bool is_direct = false) {
+ if (instance == null)
+ instance = new Application(is_direct);
+ }
+
+ public static void terminate() {
+ get_instance().exit();
+ }
+
+ public static Application get_instance() {
+ assert (instance != null);
+
+ return instance;
+ }
+
+ public void start(string[]? argv = null) {
+ if (running)
+ return;
+
+ running = true;
+
+ starting();
+
+ assert(AppWindow.get_instance() != null);
+ system_app.add_window(AppWindow.get_instance());
+ system_app_run_retval = system_app.run(argv);
+
+ if (!direct) {
+ system_app.command_line.disconnect(on_command_line);
+ }
+
+ system_app.activate.disconnect(on_activated);
+ system_app.startup.disconnect(on_activated);
+
+ running = false;
+ }
+
+ public void exit() {
+ // only fire this once, but thanks to terminate(), it will be fired at least once (even
+ // if start() is not called and "starting" is not fired)
+ if (exiting_fired || !running)
+ return;
+
+ exiting_fired = true;
+
+ exiting(false);
+
+ system_app.release();
+ }
+
+ // This will fire the exiting signal with panicked set to true, but only if exit() hasn't
+ // already been called. This call will immediately halt the application.
+ public void panic() {
+ if (!exiting_fired) {
+ exiting_fired = true;
+ exiting(true);
+ }
+ Posix.exit(1);
+ }
+
+ /**
+ * @brief Allows the caller to ask for some part of the desktop session's functionality to
+ * be prevented from running; wrapper for Gtk.Application.inhibit().
+ *
+ * @note The return value is a 'cookie' that needs to be passed to 'uninhibit' to turn
+ * off a requested inhibition and should be saved by the caller.
+ */
+ public uint inhibit(Gtk.ApplicationInhibitFlags what, string? reason="none given") {
+ return system_app.inhibit(AppWindow.get_instance(), what, reason);
+ }
+
+ /**
+ * @brief Turns off a previously-requested inhibition. Wrapper for
+ * Gtk.Application.uninhibit().
+ */
+ public void uninhibit(uint cookie) {
+ system_app.uninhibit(cookie);
+ }
+
+ public int get_run_return_value() {
+ return system_app_run_retval;
+ }
+}
+
diff --git a/src/BatchImport.vala b/src/BatchImport.vala
new file mode 100644
index 0000000..d4298ed
--- /dev/null
+++ b/src/BatchImport.vala
@@ -0,0 +1,2051 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public enum ImportResult {
+ SUCCESS,
+ FILE_ERROR,
+ DECODE_ERROR,
+ DATABASE_ERROR,
+ USER_ABORT,
+ NOT_A_FILE,
+ PHOTO_EXISTS,
+ UNSUPPORTED_FORMAT,
+ NOT_AN_IMAGE,
+ DISK_FAILURE,
+ DISK_FULL,
+ CAMERA_ERROR,
+ FILE_WRITE_ERROR,
+ PIXBUF_CORRUPT_IMAGE;
+
+ public string to_string() {
+ switch (this) {
+ case SUCCESS:
+ return _("Success");
+
+ case FILE_ERROR:
+ return _("File error");
+
+ case DECODE_ERROR:
+ return _("Unable to decode file");
+
+ case DATABASE_ERROR:
+ return _("Database error");
+
+ case USER_ABORT:
+ return _("User aborted import");
+
+ case NOT_A_FILE:
+ return _("Not a file");
+
+ case PHOTO_EXISTS:
+ return _("File already exists in database");
+
+ case UNSUPPORTED_FORMAT:
+ return _("Unsupported file format");
+
+ case NOT_AN_IMAGE:
+ return _("Not an image file");
+
+ case DISK_FAILURE:
+ return _("Disk failure");
+
+ case DISK_FULL:
+ return _("Disk full");
+
+ case CAMERA_ERROR:
+ return _("Camera error");
+
+ case FILE_WRITE_ERROR:
+ return _("File write error");
+
+ case PIXBUF_CORRUPT_IMAGE:
+ return _("Corrupt image file");
+
+ default:
+ return _("Imported failed (%d)").printf((int) this);
+ }
+ }
+
+ public bool is_abort() {
+ switch (this) {
+ case ImportResult.DISK_FULL:
+ case ImportResult.DISK_FAILURE:
+ case ImportResult.USER_ABORT:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ public bool is_nonuser_abort() {
+ switch (this) {
+ case ImportResult.DISK_FULL:
+ case ImportResult.DISK_FAILURE:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ public static ImportResult convert_error(Error err, ImportResult default_result) {
+ if (err is FileError) {
+ FileError ferr = (FileError) err;
+
+ if (ferr is FileError.NOSPC)
+ return ImportResult.DISK_FULL;
+ else if (ferr is FileError.IO)
+ return ImportResult.DISK_FAILURE;
+ else if (ferr is FileError.ISDIR)
+ return ImportResult.NOT_A_FILE;
+ else if (ferr is FileError.ACCES)
+ return ImportResult.FILE_WRITE_ERROR;
+ else if (ferr is FileError.PERM)
+ return ImportResult.FILE_WRITE_ERROR;
+ else
+ return ImportResult.FILE_ERROR;
+ } else if (err is IOError) {
+ IOError ioerr = (IOError) err;
+
+ if (ioerr is IOError.NO_SPACE)
+ return ImportResult.DISK_FULL;
+ else if (ioerr is IOError.FAILED)
+ return ImportResult.DISK_FAILURE;
+ else if (ioerr is IOError.IS_DIRECTORY)
+ return ImportResult.NOT_A_FILE;
+ else if (ioerr is IOError.CANCELLED)
+ return ImportResult.USER_ABORT;
+ else if (ioerr is IOError.READ_ONLY)
+ return ImportResult.FILE_WRITE_ERROR;
+ else if (ioerr is IOError.PERMISSION_DENIED)
+ return ImportResult.FILE_WRITE_ERROR;
+ else
+ return ImportResult.FILE_ERROR;
+ } else if (err is GPhotoError) {
+ return ImportResult.CAMERA_ERROR;
+ } else if (err is Gdk.PixbufError) {
+ Gdk.PixbufError pixbuferr = (Gdk.PixbufError) err;
+
+ if (pixbuferr is Gdk.PixbufError.CORRUPT_IMAGE)
+ return ImportResult.PIXBUF_CORRUPT_IMAGE;
+ else if (pixbuferr is Gdk.PixbufError.INSUFFICIENT_MEMORY)
+ return default_result;
+ else if (pixbuferr is Gdk.PixbufError.BAD_OPTION)
+ return default_result;
+ else if (pixbuferr is Gdk.PixbufError.UNKNOWN_TYPE)
+ return ImportResult.UNSUPPORTED_FORMAT;
+ else if (pixbuferr is Gdk.PixbufError.UNSUPPORTED_OPERATION)
+ return default_result;
+ else if (pixbuferr is Gdk.PixbufError.FAILED)
+ return default_result;
+ else
+ return default_result;
+ }
+
+ return default_result;
+ }
+}
+
+// A BatchImportJob describes a unit of work the BatchImport object should perform. It returns
+// a file to be imported. If the file is a directory, it is automatically recursed by BatchImport
+// to find all files that need to be imported into the library.
+//
+// NOTE: All methods may be called from the context of a background thread or the main GTK thread.
+// Implementations should be able to handle either situation. The prepare method will always be
+// called by the same thread context.
+public abstract class BatchImportJob {
+ public abstract string get_dest_identifier();
+
+ public abstract string get_source_identifier();
+
+ public abstract bool is_directory();
+
+ public abstract string get_basename();
+
+ public abstract string get_path();
+
+ public virtual DuplicatedFile? get_duplicated_file() {
+ return null;
+ }
+
+ // Attaches a sibling job (for RAW+JPEG)
+ public abstract void set_associated(BatchImportJob associated);
+
+ // Returns the file size of the BatchImportJob or returns a file/directory which can be queried
+ // by BatchImportJob to determine it. Returns true if the size is return, false if the File is
+ // specified.
+ //
+ // filesize should only be returned if BatchImportJob represents a single file.
+ public abstract bool determine_file_size(out uint64 filesize, out File file_or_dir);
+
+ // NOTE: prepare( ) is called from a background thread in the worker pool
+ public abstract bool prepare(out File file_to_import, out bool copy_to_library) throws Error;
+
+ // Completes the import for the new library photo once it's been imported.
+ // If the job is directory based, this method will be called for each photo
+ // discovered in the directory. This method is only called for photographs
+ // that have been successfully imported.
+ //
+ // Returns true if any action was taken, false otherwise.
+ //
+ // NOTE: complete( )is called from the foreground thread
+ public virtual bool complete(MediaSource source, BatchImportRoll import_roll) throws Error {
+ return false;
+ }
+
+ // returns a non-zero time_t value if this has a valid exposure time override, returns zero
+ // otherwise
+ public virtual time_t get_exposure_time_override() {
+ return 0;
+ }
+}
+
+public class FileImportJob : BatchImportJob {
+ private File file_or_dir;
+ private bool copy_to_library;
+ private FileImportJob? associated = null;
+
+ public FileImportJob(File file_or_dir, bool copy_to_library) {
+ this.file_or_dir = file_or_dir;
+ this.copy_to_library = copy_to_library;
+ }
+
+ public override string get_dest_identifier() {
+ return file_or_dir.get_path();
+ }
+
+ public override string get_source_identifier() {
+ return file_or_dir.get_path();
+ }
+
+ public override bool is_directory() {
+ return query_is_directory(file_or_dir);
+ }
+
+ public override string get_basename() {
+ return file_or_dir.get_basename();
+ }
+
+ public override string get_path() {
+ return is_directory() ? file_or_dir.get_path() : file_or_dir.get_parent().get_path();
+ }
+
+ public override void set_associated(BatchImportJob associated) {
+ this.associated = associated as FileImportJob;
+ }
+
+ public override bool determine_file_size(out uint64 filesize, out File file) {
+ filesize = 0;
+ file = file_or_dir;
+
+ return false;
+ }
+
+ public override bool prepare(out File file_to_import, out bool copy) {
+ file_to_import = file_or_dir;
+ copy = copy_to_library;
+
+ return true;
+ }
+
+ public File get_file() {
+ return file_or_dir;
+ }
+}
+
+// A BatchImportRoll represents important state for a group of imported media. If this is shared
+// among multiple BatchImport objects, the imported media will appear to have been imported all at
+// once.
+public class BatchImportRoll {
+ public ImportID import_id;
+ public ViewCollection generated_events = new ViewCollection("BatchImportRoll generated events");
+
+ public BatchImportRoll() {
+ this.import_id = ImportID.generate();
+ }
+}
+
+// A BatchImportResult associates a particular job with a File that an import was performed on
+// and the import result. A BatchImportJob can specify multiple files, so there is not necessarily
+// a one-to-one relationship beteen it and this object.
+//
+// Note that job may be null (in the case of a pre-failed job that must be reported) and file may
+// be null (for similar reasons).
+public class BatchImportResult {
+ public BatchImportJob job;
+ public File? file;
+ public string src_identifier; // Source path
+ public string dest_identifier; // Destination path
+ public ImportResult result;
+ public string? errmsg = null;
+ public DuplicatedFile? duplicate_of;
+
+ public BatchImportResult(BatchImportJob job, File? file, string src_identifier,
+ string dest_identifier, DuplicatedFile? duplicate_of, ImportResult result) {
+ this.job = job;
+ this.file = file;
+ this.src_identifier = src_identifier;
+ this.dest_identifier = dest_identifier;
+ this.duplicate_of = duplicate_of;
+ this.result = result;
+ }
+
+ public BatchImportResult.from_error(BatchImportJob job, File? file, string src_identifier,
+ string dest_identifier, Error err, ImportResult default_result) {
+ this.job = job;
+ this.file = file;
+ this.src_identifier = src_identifier;
+ this.dest_identifier = dest_identifier;
+ this.result = ImportResult.convert_error(err, default_result);
+ this.errmsg = err.message;
+ }
+}
+
+public class ImportManifest {
+ public Gee.List<MediaSource> imported = new Gee.ArrayList<MediaSource>();
+ public Gee.List<BatchImportResult> success = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> camera_failed = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> failed = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> write_failed = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> skipped_photos = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> skipped_files = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> aborted = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> already_imported = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> corrupt_files = new Gee.ArrayList<BatchImportResult>();
+ public Gee.List<BatchImportResult> all = new Gee.ArrayList<BatchImportResult>();
+
+ public ImportManifest(Gee.List<BatchImportJob>? prefailed = null,
+ Gee.List<BatchImportJob>? pre_already_imported = null) {
+ if (prefailed != null) {
+ foreach (BatchImportJob job in prefailed) {
+ BatchImportResult batch_result = new BatchImportResult(job, null,
+ job.get_source_identifier(), job.get_dest_identifier(), null,
+ ImportResult.FILE_ERROR);
+
+ add_result(batch_result);
+ }
+ }
+
+ if (pre_already_imported != null) {
+ foreach (BatchImportJob job in pre_already_imported) {
+ BatchImportResult batch_result = new BatchImportResult(job,
+ File.new_for_path(job.get_basename()),
+ job.get_source_identifier(), job.get_dest_identifier(),
+ job.get_duplicated_file(), ImportResult.PHOTO_EXISTS);
+
+ add_result(batch_result);
+ }
+ }
+ }
+
+ public void add_result(BatchImportResult batch_result) {
+ bool reported = true;
+ switch (batch_result.result) {
+ case ImportResult.SUCCESS:
+ success.add(batch_result);
+ break;
+
+ case ImportResult.USER_ABORT:
+ if (batch_result.file != null && !query_is_directory(batch_result.file))
+ aborted.add(batch_result);
+ else
+ reported = false;
+ break;
+
+ case ImportResult.UNSUPPORTED_FORMAT:
+ skipped_photos.add(batch_result);
+ break;
+
+ case ImportResult.NOT_A_FILE:
+ case ImportResult.NOT_AN_IMAGE:
+ skipped_files.add(batch_result);
+ break;
+
+ case ImportResult.PHOTO_EXISTS:
+ already_imported.add(batch_result);
+ break;
+
+ case ImportResult.CAMERA_ERROR:
+ camera_failed.add(batch_result);
+ break;
+
+ case ImportResult.FILE_WRITE_ERROR:
+ write_failed.add(batch_result);
+ break;
+
+ case ImportResult.PIXBUF_CORRUPT_IMAGE:
+ corrupt_files.add(batch_result);
+ break;
+
+ default:
+ failed.add(batch_result);
+ break;
+ }
+
+ if (reported)
+ all.add(batch_result);
+ }
+}
+
+// BatchImport performs the work of taking a file (supplied by BatchImportJob's) and properly importing
+// it into the system, including database additions and thumbnail creation. It can be monitored by
+// multiple observers, but only one ImportReporter can be registered.
+//
+// TODO: With background threads. the better way to implement this is via a FSM (finite state
+// machine) that exists in states and responds to various events thrown off by the background
+// jobs. However, getting this code to a point that it works with threads is task enough, so it
+// will have to wait (especially since we'll want to write a generic FSM engine).
+public class BatchImport : Object {
+ private const int WORK_SNIFFER_THROBBER_MSEC = 125;
+
+ public const int REPORT_EVERY_N_PREPARED_FILES = 100;
+ public const int REPORT_PREPARED_FILES_EVERY_N_MSEC = 3000;
+
+ private const int READY_SOURCES_COUNT_OVERFLOW = 10;
+
+ private const int DISPLAY_QUEUE_TIMER_MSEC = 125;
+ private const int DISPLAY_QUEUE_HYSTERESIS_OVERFLOW = (3 * 1000) / DISPLAY_QUEUE_TIMER_MSEC;
+
+ private static Workers feeder_workers = new Workers(1, false);
+ private static Workers import_workers = new Workers(Workers.thread_per_cpu_minus_one(), false);
+
+ private Gee.Iterable<BatchImportJob> jobs;
+ private BatchImportRoll import_roll;
+ private string name;
+ private uint64 completed_bytes = 0;
+ private uint64 total_bytes = 0;
+ private unowned ImportReporter reporter;
+ private ImportManifest manifest;
+ private bool scheduled = false;
+ private bool completed = false;
+ private int file_imports_to_perform = -1;
+ private int file_imports_completed = 0;
+ private Cancellable? cancellable = null;
+ private ulong last_preparing_ms = 0;
+ private Gee.HashSet<File> skipset;
+#if !NO_DUPE_DETECTION
+ private Gee.HashMap<string, File> imported_full_md5_table = new Gee.HashMap<string, File>();
+#endif
+ private uint throbber_id = 0;
+ private int max_outstanding_import_jobs = Workers.thread_per_cpu_minus_one();
+ private bool untrash_duplicates = true;
+ private bool mark_duplicates_online = true;
+
+ // These queues are staging queues, holding batches of work that must happen in the import
+ // process, working on them all at once to minimize overhead.
+ private Gee.List<PreparedFile> ready_files = new Gee.LinkedList<PreparedFile>();
+ private Gee.List<CompletedImportObject> ready_thumbnails =
+ new Gee.LinkedList<CompletedImportObject>();
+ private Gee.List<CompletedImportObject> display_imported_queue =
+ new Gee.LinkedList<CompletedImportObject>();
+ private Gee.List<CompletedImportObject> ready_sources = new Gee.LinkedList<CompletedImportObject>();
+
+ // Called at the end of the batched jobs. Can be used to report the result of the import
+ // to the user. This is called BEFORE import_complete is fired.
+ public delegate void ImportReporter(ImportManifest manifest, BatchImportRoll import_roll);
+
+ // Called once, when the scheduled task begins
+ public signal void starting();
+
+ // Called repeatedly while preparing the launched BatchImport
+ public signal void preparing();
+
+ // Called repeatedly to report the progress of the BatchImport (but only called after the
+ // last "preparing" signal)
+ public signal void progress(uint64 completed_bytes, uint64 total_bytes);
+
+ // Called for each Photo or Video imported to the system. For photos, the pixbuf is
+ // screen-sized and rotated. For videos, the pixbuf is a frame-grab of the first frame.
+ //
+ // The to_follow number is the number of queued-up sources to expect following this signal
+ // in one burst.
+ public signal void imported(MediaSource source, Gdk.Pixbuf pixbuf, int to_follow);
+
+ // Called when a fatal error occurs that stops the import entirely. Remaining jobs will be
+ // failed and import_complete() is still fired.
+ public signal void fatal_error(ImportResult result, string message);
+
+ // Called when a job fails. import_complete will also be called at the end of the batch
+ public signal void import_job_failed(BatchImportResult result);
+
+ // Called at the end of the batched jobs; this will be signalled exactly once for the batch
+ public signal void import_complete(ImportManifest manifest, BatchImportRoll import_roll);
+
+ public BatchImport(Gee.Iterable<BatchImportJob> jobs, string name, ImportReporter? reporter,
+ Gee.ArrayList<BatchImportJob>? prefailed = null,
+ Gee.ArrayList<BatchImportJob>? pre_already_imported = null,
+ Cancellable? cancellable = null, BatchImportRoll? import_roll = null,
+ ImportManifest? skip_manifest = null) {
+ this.jobs = jobs;
+ this.name = name;
+ this.reporter = reporter;
+ this.manifest = new ImportManifest(prefailed, pre_already_imported);
+ this.cancellable = (cancellable != null) ? cancellable : new Cancellable();
+ this.import_roll = import_roll != null ? import_roll : new BatchImportRoll();
+
+ if (skip_manifest != null) {
+ skipset = new Gee.HashSet<File>(file_hash, file_equal);
+ foreach (MediaSource source in skip_manifest.imported) {
+ skipset.add(source.get_file());
+ }
+ }
+
+ // watch for user exit in the application
+ Application.get_instance().exiting.connect(user_halt);
+
+ // Use a timer to report imported photos to observers
+ Timeout.add(DISPLAY_QUEUE_TIMER_MSEC, display_imported_timer);
+ }
+
+ ~BatchImport() {
+#if TRACE_DTORS
+ debug("DTOR: BatchImport (%s)", name);
+#endif
+ Application.get_instance().exiting.disconnect(user_halt);
+ }
+
+ public string get_name() {
+ return name;
+ }
+
+ public void user_halt() {
+ cancellable.cancel();
+ }
+
+ public bool get_untrash_duplicates() {
+ return untrash_duplicates;
+ }
+
+ public void set_untrash_duplicates(bool untrash_duplicates) {
+ this.untrash_duplicates = untrash_duplicates;
+ }
+
+ public bool get_mark_duplicates_online() {
+ return mark_duplicates_online;
+ }
+
+ public void set_mark_duplicates_online(bool mark_duplicates_online) {
+ this.mark_duplicates_online = mark_duplicates_online;
+ }
+
+ private void log_status(string where) {
+#if TRACE_IMPORT
+ debug("%s: to_perform=%d completed=%d ready_files=%d ready_thumbnails=%d display_queue=%d ready_sources=%d",
+ where, file_imports_to_perform, file_imports_completed, ready_files.size,
+ ready_thumbnails.size, display_imported_queue.size, ready_sources.size);
+ debug("%s workers: feeder=%d import=%d", where, feeder_workers.get_pending_job_count(),
+ import_workers.get_pending_job_count());
+#endif
+ }
+
+ private bool report_failure(BatchImportResult import_result) {
+ bool proceed = true;
+
+ manifest.add_result(import_result);
+
+ if (import_result.result != ImportResult.SUCCESS) {
+ import_job_failed(import_result);
+
+ if (import_result.file != null && !import_result.result.is_abort()) {
+ uint64 filesize = 0;
+ try {
+ // A BatchImportResult file is guaranteed to be a single file
+ filesize = query_total_file_size(import_result.file);
+ } catch (Error err) {
+ warning("Unable to query file size of %s: %s", import_result.file.get_path(),
+ err.message);
+ }
+
+ report_progress(filesize);
+ }
+ }
+
+ // fire this signal only once, and only on non-user aborts
+ if (import_result.result.is_nonuser_abort() && proceed) {
+ fatal_error(import_result.result, import_result.errmsg);
+ proceed = false;
+ }
+
+ return proceed;
+ }
+
+ private void report_progress(uint64 increment_of_progress) {
+ completed_bytes += increment_of_progress;
+
+ // only report "progress" if progress has been made (and enough time has progressed),
+ // otherwise still preparing
+ if (completed_bytes == 0) {
+ ulong now = now_ms();
+ if (now - last_preparing_ms > 250) {
+ last_preparing_ms = now;
+ preparing();
+ }
+ } else if (increment_of_progress > 0) {
+ ulong now = now_ms();
+ if (now - last_preparing_ms > 250) {
+ last_preparing_ms = now;
+ progress(completed_bytes, total_bytes);
+ }
+ }
+ }
+
+ private bool report_failures(BackgroundImportJob background_job) {
+ bool proceed = true;
+
+ foreach (BatchImportResult import_result in background_job.failed) {
+ if (!report_failure(import_result))
+ proceed = false;
+ }
+
+ return proceed;
+ }
+
+ private void report_completed(string where) {
+ if (completed)
+ error("Attempted to complete already-completed import: %s", where);
+
+ completed = true;
+
+ flush_ready_sources();
+
+ log_status("Import completed: %s".printf(where));
+
+ // report completed to the reporter (called prior to the "import_complete" signal)
+ if (reporter != null)
+ reporter(manifest, import_roll);
+
+ import_complete(manifest, import_roll);
+ }
+
+ // This should be called whenever a file's import process is complete, successful or otherwise
+ private void file_import_complete() {
+ // mark this job as completed
+ file_imports_completed++;
+ if (file_imports_to_perform != -1)
+ assert(file_imports_completed <= file_imports_to_perform);
+
+ // because notifications can come in after completions, have to watch if this is the
+ // last file
+ if (file_imports_to_perform != -1 && file_imports_completed == file_imports_to_perform)
+ report_completed("completed preparing files, all outstanding imports completed");
+ }
+
+ public void schedule() {
+ assert(scheduled == false);
+ scheduled = true;
+
+ starting();
+
+ // fire off a background job to generate all FileToPrepare work
+ feeder_workers.enqueue(new WorkSniffer(this, jobs, on_work_sniffed_out, cancellable,
+ on_sniffer_cancelled, skipset));
+ throbber_id = Timeout.add(WORK_SNIFFER_THROBBER_MSEC, on_sniffer_working);
+ }
+
+ //
+ // WorkSniffer stage
+ //
+
+ private bool on_sniffer_working() {
+ report_progress(0);
+
+ return true;
+ }
+
+ private void on_work_sniffed_out(BackgroundJob j) {
+ assert(!completed);
+
+ WorkSniffer sniffer = (WorkSniffer) j;
+
+ log_status("on_work_sniffed_out");
+
+ if (!report_failures(sniffer) || sniffer.files_to_prepare.size == 0) {
+ report_completed("work sniffed out: nothing to do");
+
+ return;
+ }
+
+ total_bytes = sniffer.total_bytes;
+
+ // submit single background job to go out and prepare all the files, reporting back when/if
+ // they're ready for import; this is important because gPhoto can't handle multiple accesses
+ // to a camera without fat locking, and it's just not worth it. Serializing the imports
+ // also means the user sees the photos coming in in (roughly) the order they selected them
+ // on the screen
+ PrepareFilesJob prepare_files_job = new PrepareFilesJob(this, sniffer.files_to_prepare,
+ on_file_prepared, on_files_prepared, cancellable, on_file_prepare_cancelled);
+
+ feeder_workers.enqueue(prepare_files_job);
+
+ if (throbber_id > 0) {
+ Source.remove(throbber_id);
+ throbber_id = 0;
+ }
+ }
+
+ private void on_sniffer_cancelled(BackgroundJob j) {
+ assert(!completed);
+
+ WorkSniffer sniffer = (WorkSniffer) j;
+
+ log_status("on_sniffer_cancelled");
+
+ report_failures(sniffer);
+ report_completed("work sniffer cancelled");
+
+ if (throbber_id > 0) {
+ Source.remove(throbber_id);
+ throbber_id = 0;
+ }
+ }
+
+ //
+ // PrepareFiles stage
+ //
+
+ private void flush_import_jobs() {
+ // flush ready thumbnails before ready files because PreparedFileImportJob is more intense
+ // than ThumbnailWriterJob; reversing this order causes work to back up in ready_thumbnails
+ // and takes longer for the user to see progress (which is only reported after the thumbnail
+ // has been written)
+ while (ready_thumbnails.size > 0 && import_workers.get_pending_job_count() < max_outstanding_import_jobs) {
+ import_workers.enqueue(new ThumbnailWriterJob(this, ready_thumbnails.remove_at(0),
+ on_thumbnail_writer_completed, cancellable, on_thumbnail_writer_cancelled));
+ }
+
+ while(ready_files.size > 0 && import_workers.get_pending_job_count() < max_outstanding_import_jobs) {
+ import_workers.enqueue(new PreparedFileImportJob(this, ready_files.remove_at(0),
+ import_roll.import_id, on_import_files_completed, cancellable,
+ on_import_files_cancelled));
+ }
+ }
+
+ // This checks for duplicates in the current import batch, which may not already be in the
+ // library and therefore not detected there.
+ private File? get_in_current_import(PreparedFile prepared_file) {
+#if !NO_DUPE_DETECTION
+ if (prepared_file.full_md5 != null
+ && imported_full_md5_table.has_key(prepared_file.full_md5)) {
+
+ return imported_full_md5_table.get(prepared_file.full_md5);
+ }
+
+ // add for next one
+ if (prepared_file.full_md5 != null)
+ imported_full_md5_table.set(prepared_file.full_md5, prepared_file.file);
+#endif
+ return null;
+ }
+
+ // Called when a cluster of files are located and deemed proper for import by PrepareFiledJob
+ private void on_file_prepared(BackgroundJob j, NotificationObject? user) {
+ assert(!completed);
+
+ PreparedFileCluster cluster = (PreparedFileCluster) user;
+
+ log_status("on_file_prepared (%d files)".printf(cluster.list.size));
+
+ process_prepared_files.begin(cluster.list);
+ }
+
+ // TODO: This logic can be cleaned up. Attempt to remove all calls to
+ // the database, as it's a blocking call (use in-memory lookups whenever possible)
+ private async void process_prepared_files(Gee.List<PreparedFile> list) {
+ foreach (PreparedFile prepared_file in list) {
+ Idle.add(process_prepared_files.callback);
+ yield;
+
+ BatchImportResult import_result = null;
+
+ // first check if file is already registered as a media object
+
+ LibraryPhotoSourceCollection.State photo_state;
+ LibraryPhoto? photo = LibraryPhoto.global.get_state_by_file(prepared_file.file,
+ out photo_state);
+ if (photo != null) {
+ switch (photo_state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(),
+ DuplicatedFile.create_from_file(photo.get_master_file()),
+ ImportResult.PHOTO_EXISTS);
+
+ if (photo_state == LibraryPhotoSourceCollection.State.OFFLINE)
+ photo.mark_online();
+ break;
+
+ case LibraryPhotoSourceCollection.State.TRASH:
+ // let the code below deal with it
+ break;
+
+ default:
+ error("Unknown LibraryPhotoSourceCollection state: %s", photo_state.to_string());
+ }
+ }
+
+ if (import_result != null) {
+ report_failure(import_result);
+ file_import_complete();
+
+ continue;
+ }
+
+ VideoSourceCollection.State video_state;
+ Video? video = Video.global.get_state_by_file(prepared_file.file, out video_state);
+ if (video != null) {
+ switch (video_state) {
+ case VideoSourceCollection.State.ONLINE:
+ case VideoSourceCollection.State.OFFLINE:
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(),
+ DuplicatedFile.create_from_file(video.get_master_file()),
+ ImportResult.PHOTO_EXISTS);
+
+ if (video_state == VideoSourceCollection.State.OFFLINE)
+ video.mark_online();
+ break;
+
+ case VideoSourceCollection.State.TRASH:
+ // let the code below deal with it
+ break;
+
+ default:
+ error("Unknown VideoSourceCollection state: %s", video_state.to_string());
+ }
+ }
+
+ if (import_result != null) {
+ report_failure(import_result);
+ file_import_complete();
+
+ continue;
+ }
+
+ // now check if the file is a duplicate
+
+ if (prepared_file.is_video && Video.is_duplicate(prepared_file.file, prepared_file.full_md5)) {
+ VideoID[] duplicate_ids =
+ VideoTable.get_instance().get_duplicate_ids(prepared_file.file,
+ prepared_file.full_md5);
+ assert(duplicate_ids.length > 0);
+
+ DuplicatedFile? duplicated_file =
+ DuplicatedFile.create_from_video_id(duplicate_ids[0]);
+
+ ImportResult result_code = ImportResult.PHOTO_EXISTS;
+ if (mark_duplicates_online) {
+ Video? dupe_video =
+ (Video) Video.global.get_offline_bin().fetch_by_master_file(prepared_file.file);
+ if (dupe_video == null)
+ dupe_video = (Video) Video.global.get_offline_bin().fetch_by_md5(prepared_file.full_md5);
+
+ if(dupe_video != null) {
+ debug("duplicate video found offline, marking as online: %s",
+ prepared_file.file.get_path());
+
+ dupe_video.set_master_file(prepared_file.file);
+ dupe_video.mark_online();
+
+ duplicated_file = null;
+
+ manifest.imported.add(dupe_video);
+ report_progress(dupe_video.get_filesize());
+ file_import_complete();
+
+ result_code = ImportResult.SUCCESS;
+ }
+ }
+
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(), duplicated_file,
+ result_code);
+
+ if (result_code == ImportResult.SUCCESS) {
+ manifest.add_result(import_result);
+
+ continue;
+ }
+ }
+
+ if (get_in_current_import(prepared_file) != null) {
+ // this looks for duplicates within the import set, since Photo.is_duplicate
+ // only looks within already-imported photos for dupes
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(),
+ DuplicatedFile.create_from_file(get_in_current_import(prepared_file)),
+ ImportResult.PHOTO_EXISTS);
+ } else if (Photo.is_duplicate(prepared_file.file, null, prepared_file.full_md5,
+ prepared_file.file_format)) {
+ if (untrash_duplicates) {
+ // If a file is being linked and has a dupe in the trash, we take it out of the trash
+ // and revert its edits.
+ photo = LibraryPhoto.global.get_trashed_by_file(prepared_file.file);
+
+ if (photo == null && prepared_file.full_md5 != null)
+ photo = LibraryPhoto.global.get_trashed_by_md5(prepared_file.full_md5);
+
+ if (photo != null) {
+ debug("duplicate linked photo found in trash, untrashing and removing transforms for %s",
+ prepared_file.file.get_path());
+
+ photo.set_master_file(prepared_file.file);
+ photo.untrash();
+ photo.remove_all_transformations();
+ }
+ }
+
+ if (photo == null && mark_duplicates_online) {
+ // if a duplicate is found marked offline, make it online
+ photo = LibraryPhoto.global.get_offline_by_file(prepared_file.file);
+
+ if (photo == null && prepared_file.full_md5 != null)
+ photo = LibraryPhoto.global.get_offline_by_md5(prepared_file.full_md5);
+
+ if (photo != null) {
+ debug("duplicate photo found marked offline, marking online: %s",
+ prepared_file.file.get_path());
+
+ photo.set_master_file(prepared_file.file);
+ photo.mark_online();
+ }
+ }
+
+ if (photo != null) {
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(), null,
+ ImportResult.SUCCESS);
+
+ manifest.imported.add(photo);
+ manifest.add_result(import_result);
+
+ report_progress(photo.get_filesize());
+ file_import_complete();
+
+ continue;
+ }
+
+ debug("duplicate photo detected, not importing %s", prepared_file.file.get_path());
+
+ PhotoID[] photo_ids =
+ PhotoTable.get_instance().get_duplicate_ids(prepared_file.file, null,
+ prepared_file.full_md5, prepared_file.file_format);
+ assert(photo_ids.length > 0);
+
+ DuplicatedFile duplicated_file = DuplicatedFile.create_from_photo_id(photo_ids[0]);
+
+ import_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(), duplicated_file,
+ ImportResult.PHOTO_EXISTS);
+ }
+
+ if (import_result != null) {
+ report_failure(import_result);
+ file_import_complete();
+
+ continue;
+ }
+
+ report_progress(0);
+ ready_files.add(prepared_file);
+ }
+
+ flush_import_jobs();
+ }
+
+ private void done_preparing_files(BackgroundJob j, string caller) {
+ assert(!completed);
+
+ PrepareFilesJob prepare_files_job = (PrepareFilesJob) j;
+
+ report_failures(prepare_files_job);
+
+ // mark this job as completed and record how many file imports must finish to be complete
+ file_imports_to_perform = prepare_files_job.prepared_files;
+ assert(file_imports_to_perform >= file_imports_completed);
+
+ log_status(caller);
+
+ // this call can result in report_completed() being called, so don't call twice
+ flush_import_jobs();
+
+ // if none prepared, then none outstanding (or will become outstanding, depending on how
+ // the notifications are queued)
+ if (file_imports_to_perform == 0 && !completed)
+ report_completed("no files prepared for import");
+ else if (file_imports_completed == file_imports_to_perform && !completed)
+ report_completed("completed preparing files, all outstanding imports completed");
+ }
+
+ private void on_files_prepared(BackgroundJob j) {
+ done_preparing_files(j, "on_files_prepared");
+ }
+
+ private void on_file_prepare_cancelled(BackgroundJob j) {
+ done_preparing_files(j, "on_file_prepare_cancelled");
+ }
+
+ //
+ // Files ready for import stage
+ //
+
+ private void on_import_files_completed(BackgroundJob j) {
+ assert(!completed);
+
+ PreparedFileImportJob job = (PreparedFileImportJob) j;
+
+ log_status("on_import_files_completed");
+
+ // should be ready in some form
+ assert(job.not_ready == null);
+
+ // mark failed photo
+ if (job.failed != null) {
+ assert(job.failed.result != ImportResult.SUCCESS);
+
+ report_failure(job.failed);
+ file_import_complete();
+ }
+
+ // resurrect ready photos before adding to database and rest of system ... this is more
+ // efficient than doing them one at a time
+ if (job.ready != null) {
+ assert(job.ready.batch_result.result == ImportResult.SUCCESS);
+
+ Tombstone? tombstone = Tombstone.global.locate(job.ready.final_file);
+ if (tombstone != null)
+ Tombstone.global.resurrect(tombstone);
+
+ // import ready photos into database
+ MediaSource? source = null;
+ if (job.ready.is_video) {
+ job.ready.batch_result.result = Video.import_create(job.ready.video_import_params,
+ out source);
+ } else {
+ job.ready.batch_result.result = LibraryPhoto.import_create(job.ready.photo_import_params,
+ out source);
+ Photo photo = source as Photo;
+
+ if (job.ready.photo_import_params.final_associated_file != null) {
+ // Associate RAW+JPEG in database.
+ BackingPhotoRow bpr = new BackingPhotoRow();
+ bpr.file_format = PhotoFileFormat.JFIF;
+ bpr.filepath = job.ready.photo_import_params.final_associated_file.get_path();
+ debug("Associating %s with sibling %s", ((Photo) source).get_file().get_path(),
+ bpr.filepath);
+ try {
+ ((Photo) source).add_backing_photo_for_development(RawDeveloper.CAMERA, bpr);
+ } catch (Error e) {
+ warning("Unable to associate JPEG with RAW. File: %s Error: %s",
+ bpr.filepath, e.message);
+ }
+ }
+
+ // Set the default developer for raw photos
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ RawDeveloper d = Config.Facade.get_instance().get_default_raw_developer();
+ if (d == RawDeveloper.CAMERA && !photo.is_raw_developer_available(d))
+ d = RawDeveloper.EMBEDDED;
+
+ photo.set_default_raw_developer(d);
+ photo.set_raw_developer(d);
+ }
+ }
+
+ if (job.ready.batch_result.result != ImportResult.SUCCESS) {
+ debug("on_import_file_completed: %s", job.ready.batch_result.result.to_string());
+
+ report_failure(job.ready.batch_result);
+ file_import_complete();
+ } else {
+ ready_thumbnails.add(new CompletedImportObject(source, job.ready.get_thumbnails(),
+ job.ready.prepared_file.job, job.ready.batch_result));
+ }
+ }
+
+ flush_import_jobs();
+ }
+
+ private void on_import_files_cancelled(BackgroundJob j) {
+ assert(!completed);
+
+ PreparedFileImportJob job = (PreparedFileImportJob) j;
+
+ log_status("on_import_files_cancelled");
+
+ if (job.not_ready != null) {
+ report_failure(new BatchImportResult(job.not_ready.job, job.not_ready.file,
+ job.not_ready.file.get_path(), job.not_ready.file.get_path(), null,
+ ImportResult.USER_ABORT));
+ file_import_complete();
+ }
+
+ if (job.failed != null) {
+ report_failure(job.failed);
+ file_import_complete();
+ }
+
+ if (job.ready != null) {
+ report_failure(job.ready.abort());
+ file_import_complete();
+ }
+
+ flush_import_jobs();
+ }
+
+ //
+ // ThumbnailWriter stage
+ //
+ // Because the LibraryPhoto has been created at this stage, any cancelled work must also
+ // destroy the LibraryPhoto.
+ //
+
+ private void on_thumbnail_writer_completed(BackgroundJob j) {
+ assert(!completed);
+
+ ThumbnailWriterJob job = (ThumbnailWriterJob) j;
+ CompletedImportObject completed = job.completed_import_source;
+
+ log_status("on_thumbnail_writer_completed");
+
+ if (completed.batch_result.result != ImportResult.SUCCESS) {
+ warning("Failed to import %s: unable to write thumbnails (%s)",
+ completed.source.to_string(), completed.batch_result.result.to_string());
+
+ if (completed.source is LibraryPhoto)
+ LibraryPhoto.import_failed(completed.source as LibraryPhoto);
+ else if (completed.source is Video)
+ Video.import_failed(completed.source as Video);
+
+ report_failure(completed.batch_result);
+ file_import_complete();
+ } else {
+ manifest.imported.add(completed.source);
+ manifest.add_result(completed.batch_result);
+
+ display_imported_queue.add(completed);
+ }
+
+ flush_import_jobs();
+ }
+
+ private void on_thumbnail_writer_cancelled(BackgroundJob j) {
+ assert(!completed);
+
+ ThumbnailWriterJob job = (ThumbnailWriterJob) j;
+ CompletedImportObject completed = job.completed_import_source;
+
+ log_status("on_thumbnail_writer_cancelled");
+
+ if (completed.source is LibraryPhoto)
+ LibraryPhoto.import_failed(completed.source as LibraryPhoto);
+ else if (completed.source is Video)
+ Video.import_failed(completed.source as Video);
+
+ report_failure(completed.batch_result);
+ file_import_complete();
+
+ flush_import_jobs();
+ }
+
+ //
+ // Display imported sources and integrate into system
+ //
+
+ private void flush_ready_sources() {
+ if (ready_sources.size == 0)
+ return;
+
+ // the user_preview and thumbnails in the CompletedImportObjects are not available at
+ // this stage
+
+ log_status("flush_ready_sources (%d)".printf(ready_sources.size));
+
+ Gee.ArrayList<MediaSource> all = new Gee.ArrayList<MediaSource>();
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ Gee.HashMap<MediaSource, BatchImportJob> completion_list =
+ new Gee.HashMap<MediaSource, BatchImportJob>();
+ foreach (CompletedImportObject completed in ready_sources) {
+ all.add(completed.source);
+
+ if (completed.source is LibraryPhoto)
+ photos.add((LibraryPhoto) completed.source);
+ else if (completed.source is Video)
+ videos.add((Video) completed.source);
+
+ completion_list.set(completed.source, completed.original_job);
+ }
+
+ MediaCollectionRegistry.get_instance().begin_transaction_on_all();
+ Event.global.freeze_notifications();
+ Tag.global.freeze_notifications();
+
+ LibraryPhoto.global.import_many(photos);
+ Video.global.import_many(videos);
+
+ // allow the BatchImportJob to perform final work on the MediaSource
+ foreach (MediaSource media in completion_list.keys) {
+ try {
+ completion_list.get(media).complete(media, import_roll);
+ } catch (Error err) {
+ warning("Completion error when finalizing import of %s: %s", media.to_string(),
+ err.message);
+ }
+ }
+
+ // generate events for MediaSources not yet assigned
+ Event.generate_many_events(all, import_roll.generated_events);
+
+ Tag.global.thaw_notifications();
+ Event.global.thaw_notifications();
+ MediaCollectionRegistry.get_instance().commit_transaction_on_all();
+
+ ready_sources.clear();
+ }
+
+ // This is called throughout the import process to notify watchers of imported photos in such
+ // a way that the GTK event queue gets a chance to operate.
+ private bool display_imported_timer() {
+ if (display_imported_queue.size == 0)
+ return !completed;
+
+ if (cancellable.is_cancelled())
+ debug("Importing %d photos at once", display_imported_queue.size);
+
+ log_status("display_imported_timer");
+
+ // only display one at a time, so the user can see them come into the library in order.
+ // however, if the queue backs up to the hysteresis point (currently defined as more than
+ // 3 seconds wait for the last photo on the queue), then begin doing them in increasingly
+ // larger chunks, to stop the queue from growing and then to get ahead of the other
+ // import cycles.
+ //
+ // if cancelled, want to do as many as possible, but want to relinquish the thread to
+ // keep the system active
+ int total = 1;
+ if (!cancellable.is_cancelled()) {
+ if (display_imported_queue.size > DISPLAY_QUEUE_HYSTERESIS_OVERFLOW)
+ total =
+ 1 << ((display_imported_queue.size / DISPLAY_QUEUE_HYSTERESIS_OVERFLOW) + 2).clamp(0, 16);
+ } else {
+ // do in overflow-sized chunks
+ total = DISPLAY_QUEUE_HYSTERESIS_OVERFLOW;
+ }
+
+ total = int.min(total, display_imported_queue.size);
+
+#if TRACE_IMPORT
+ if (total > 1) {
+ debug("DISPLAY IMPORT QUEUE: hysteresis, dumping %d/%d media sources", total,
+ display_imported_queue.size);
+ }
+#endif
+
+ // post-decrement because the 0-based total is used when firing "imported"
+ while (total-- > 0) {
+ CompletedImportObject completed_object = display_imported_queue.remove_at(0);
+
+ // stash preview for reporting progress
+ Gdk.Pixbuf user_preview = completed_object.user_preview;
+
+ // expensive pixbufs no longer needed
+ completed_object.user_preview = null;
+ completed_object.thumbnails = null;
+
+ // Stage the number of ready media objects to incorporate into the system rather than
+ // doing them one at a time, to keep the UI thread responsive.
+ // NOTE: completed_object must be added prior to file_import_complete()
+ ready_sources.add(completed_object);
+
+ imported(completed_object.source, user_preview, total);
+ report_progress(completed_object.source.get_filesize());
+ file_import_complete();
+ }
+
+ if (ready_sources.size >= READY_SOURCES_COUNT_OVERFLOW || cancellable.is_cancelled())
+ flush_ready_sources();
+
+ return true;
+ }
+} /* class BatchImport */
+
+public class DuplicatedFile : Object {
+ private VideoID? video_id;
+ private PhotoID? photo_id;
+ private File? file;
+
+ private DuplicatedFile() {
+ this.video_id = null;
+ this.photo_id = null;
+ this.file = null;
+ }
+
+ public static DuplicatedFile create_from_photo_id(PhotoID photo_id) {
+ assert(photo_id.is_valid());
+
+ DuplicatedFile result = new DuplicatedFile();
+ result.photo_id = photo_id;
+ return result;
+ }
+
+ public static DuplicatedFile create_from_video_id(VideoID video_id) {
+ assert(video_id.is_valid());
+
+ DuplicatedFile result = new DuplicatedFile();
+ result.video_id = video_id;
+ return result;
+ }
+
+ public static DuplicatedFile create_from_file(File file) {
+ DuplicatedFile result = new DuplicatedFile();
+
+ result.file = file;
+
+ return result;
+ }
+
+ public File get_file() {
+ if (file != null) {
+ return file;
+ } else if (photo_id != null) {
+ Photo photo_object = (Photo) LibraryPhoto.global.fetch(photo_id);
+ file = photo_object.get_master_file();
+ return file;
+ } else if (video_id != null) {
+ Video video_object = (Video) Video.global.fetch(video_id);
+ file = video_object.get_master_file();
+ return file;
+ } else {
+ assert_not_reached();
+ }
+ }
+}
+
+//
+// The order of the background jobs is important, both for how feedback is presented to the user
+// and to protect certain subsystems which don't work well in a multithreaded situation (i.e.
+// gPhoto).
+//
+// 1. WorkSniffer builds a list of all the work to do. If the BatchImportJob is a file, there's
+// not much more to do. If it represents a directory, the directory is traversed, with more work
+// generated for each file. Very little processing is done here on each file, however, and the
+// BatchImportJob.prepare is only called when a directory.
+//
+// 2. PrepareFilesJob walks the list WorkSniffer generated, preparing each file and examining it
+// for any obvious problems. This in turn generates a list of prepared files (i.e. downloaded from
+// camera).
+//
+// 3. Each file ready for importing is a separate background job. It is responsible for copying
+// the file (if required), examining it, and generating a pixbuf for preview and thumbnails.
+//
+
+private abstract class BackgroundImportJob : BackgroundJob {
+ public ImportResult abort_flag = ImportResult.SUCCESS;
+ public Gee.List<BatchImportResult> failed = new Gee.ArrayList<BatchImportResult>();
+
+ protected BackgroundImportJob(BatchImport owner, CompletionCallback callback,
+ Cancellable cancellable, CancellationCallback? cancellation) {
+ base (owner, callback, cancellable, cancellation);
+ }
+
+ // Subclasses should call this every iteration, and if the result is not SUCCESS, consider the
+ // operation (and therefore all after) aborted
+ protected ImportResult abort_check() {
+ if (abort_flag == ImportResult.SUCCESS && is_cancelled())
+ abort_flag = ImportResult.USER_ABORT;
+
+ return abort_flag;
+ }
+
+ protected void abort(ImportResult result) {
+ // only update the abort flag if not already set
+ if (abort_flag == ImportResult.SUCCESS)
+ abort_flag = result;
+ }
+
+ protected void report_failure(BatchImportJob job, File? file, string src_identifier,
+ string dest_identifier, ImportResult result) {
+ assert(result != ImportResult.SUCCESS);
+
+ // if fatal but the flag is not set, set it now
+ if (result.is_abort())
+ abort(result);
+ else
+ warning("Import failure %s: %s", src_identifier, result.to_string());
+
+ failed.add(new BatchImportResult(job, file, src_identifier, dest_identifier, null,
+ result));
+ }
+
+ protected void report_error(BatchImportJob job, File? file, string src_identifier,
+ string dest_identifier, Error err, ImportResult default_result) {
+ ImportResult result = ImportResult.convert_error(err, default_result);
+
+ warning("Import error %s: %s (%s)", src_identifier, err.message, result.to_string());
+
+ if (result.is_abort())
+ abort(result);
+
+ failed.add(new BatchImportResult.from_error(job, file, src_identifier, dest_identifier,
+ err, default_result));
+ }
+}
+
+private class FileToPrepare {
+ public BatchImportJob job;
+ public File? file;
+ public bool copy_to_library;
+ public FileToPrepare? associated = null;
+
+ public FileToPrepare(BatchImportJob job, File? file = null, bool copy_to_library = true) {
+ this.job = job;
+ this.file = file;
+ this.copy_to_library = copy_to_library;
+ }
+
+ public void set_associated(FileToPrepare? a) {
+ associated = a;
+ }
+
+ public string get_parent_path() {
+ return file != null ? file.get_parent().get_path() : job.get_path();
+ }
+
+ public string get_path() {
+ return file != null ? file.get_path() : (File.new_for_path(job.get_path()).get_child(
+ job.get_basename())).get_path();
+ }
+
+ public string get_basename() {
+ return file != null ? file.get_basename() : job.get_basename();
+ }
+
+ public bool is_directory() {
+ return file != null ? (file.query_file_type(FileQueryInfoFlags.NONE) == FileType.DIRECTORY) :
+ job.is_directory();
+ }
+}
+
+private class WorkSniffer : BackgroundImportJob {
+ public Gee.List<FileToPrepare> files_to_prepare = new Gee.ArrayList<FileToPrepare>();
+ public uint64 total_bytes = 0;
+
+ private Gee.Iterable<BatchImportJob> jobs;
+ private Gee.HashSet<File>? skipset;
+
+ public WorkSniffer(BatchImport owner, Gee.Iterable<BatchImportJob> jobs, CompletionCallback callback,
+ Cancellable cancellable, CancellationCallback cancellation, Gee.HashSet<File>? skipset = null) {
+ base (owner, callback, cancellable, cancellation);
+
+ this.jobs = jobs;
+ this.skipset = skipset;
+ }
+
+ public override void execute() {
+ // walk the list of jobs accumulating work for the background jobs; if submitted job
+ // is a directory, recurse into the directory picking up files to import (also creating
+ // work for the background jobs)
+ foreach (BatchImportJob job in jobs) {
+ ImportResult result = abort_check();
+ if (result != ImportResult.SUCCESS) {
+ report_failure(job, null, job.get_source_identifier(), job.get_dest_identifier(),
+ result);
+
+ continue;
+ }
+
+ try {
+ sniff_job(job);
+ } catch (Error err) {
+ report_error(job, null, job.get_source_identifier(), job.get_dest_identifier(), err,
+ ImportResult.FILE_ERROR);
+ }
+
+ if (is_cancelled())
+ break;
+ }
+
+ // Time to handle RAW+JPEG pairs!
+ // Now we build a new list of all the files (but not folders) we're
+ // importing and sort it by filename.
+ Gee.List<FileToPrepare> sorted = new Gee.ArrayList<FileToPrepare>();
+ foreach (FileToPrepare ftp in files_to_prepare) {
+ if (!ftp.is_directory())
+ sorted.add(ftp);
+ }
+ sorted.sort((a, b) => {
+ FileToPrepare file_a = (FileToPrepare) a;
+ FileToPrepare file_b = (FileToPrepare) b;
+ string sa = file_a.get_path();
+ string sb = file_b.get_path();
+ return utf8_cs_compare(sa, sb);
+ });
+
+ // For each file, check if the current file is RAW. If so, check the previous
+ // and next files to see if they're a "plus jpeg."
+ for (int i = 0; i < sorted.size; ++i) {
+ string name, ext;
+ FileToPrepare ftp = sorted.get(i);
+ disassemble_filename(ftp.get_basename(), out name, out ext);
+
+ if (is_string_empty(ext))
+ continue;
+
+ if (RawFileFormatProperties.get_instance().is_recognized_extension(ext)) {
+ // Got a raw file. See if it has a pair. If a pair is found, remove it
+ // from the list and link it to the RAW file.
+ if (i > 0 && is_paired(ftp, sorted.get(i - 1))) {
+ FileToPrepare associated_file = sorted.get(i - 1);
+ files_to_prepare.remove(associated_file);
+ ftp.set_associated(associated_file);
+ } else if (i < sorted.size - 1 && is_paired(ftp, sorted.get(i + 1))) {
+ FileToPrepare associated_file = sorted.get(i + 1);
+ files_to_prepare.remove(associated_file);
+ ftp.set_associated(associated_file);
+ }
+ }
+ }
+ }
+
+ // Check if a file is paired. The raw file must be a raw photo. A file
+ // is "paired" if it has the same basename as the raw file, is in the same
+ // directory, and is a JPEG.
+ private bool is_paired(FileToPrepare raw, FileToPrepare maybe_paired) {
+ if (raw.get_parent_path() != maybe_paired.get_parent_path())
+ return false;
+
+ string name, ext, test_name, test_ext;
+ disassemble_filename(maybe_paired.get_basename(), out test_name, out test_ext);
+
+ if (!JfifFileFormatProperties.get_instance().is_recognized_extension(test_ext))
+ return false;
+
+ disassemble_filename(raw.get_basename(), out name, out ext);
+
+ return name == test_name;
+ }
+
+ private void sniff_job(BatchImportJob job) throws Error {
+ uint64 size;
+ File file_or_dir;
+ bool determined_size = job.determine_file_size(out size, out file_or_dir);
+ if (determined_size)
+ total_bytes += size;
+
+ if (job.is_directory()) {
+ // safe to call job.prepare without it invoking extra I/O; this is merely a directory
+ // to search
+ File dir;
+ bool copy_to_library;
+ if (!job.prepare(out dir, out copy_to_library)) {
+ report_failure(job, null, job.get_source_identifier(), job.get_dest_identifier(),
+ ImportResult.FILE_ERROR);
+
+ return;
+ }
+ assert(query_is_directory(dir));
+
+ try {
+ search_dir(job, dir, copy_to_library);
+ } catch (Error err) {
+ report_error(job, dir, job.get_source_identifier(), dir.get_path(), err,
+ ImportResult.FILE_ERROR);
+ }
+ } else {
+ // if did not get the file size, do so now
+ if (!determined_size)
+ total_bytes += query_total_file_size(file_or_dir, get_cancellable());
+
+ // job is a direct file, so no need to search, prepare it directly
+ if ((file_or_dir != null) && skipset != null && skipset.contains(file_or_dir))
+ return; /* do a short-circuit return and don't enqueue if this file is to be
+ skipped */
+
+ files_to_prepare.add(new FileToPrepare(job));
+ }
+ }
+
+ public void search_dir(BatchImportJob job, File dir, bool copy_to_library) throws Error {
+ FileEnumerator enumerator = dir.enumerate_children("standard::*",
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+
+ FileInfo info = null;
+ while ((info = enumerator.next_file(get_cancellable())) != null) {
+ // next_file() doesn't always respect the cancellable
+ if (is_cancelled())
+ break;
+
+ File child = dir.get_child(info.get_name());
+ FileType file_type = info.get_file_type();
+
+ if (file_type == FileType.DIRECTORY) {
+ if (info.get_name().has_prefix("."))
+ continue;
+
+ try {
+ search_dir(job, child, copy_to_library);
+ } catch (Error err) {
+ report_error(job, child, child.get_path(), child.get_path(), err,
+ ImportResult.FILE_ERROR);
+ }
+ } else if (file_type == FileType.REGULAR) {
+ if ((skipset != null) && skipset.contains(child))
+ continue; /* don't enqueue if this file is to be skipped */
+
+ if ((Photo.is_file_image(child) && PhotoFileFormat.is_file_supported(child)) ||
+ VideoReader.is_supported_video_file(child)) {
+ total_bytes += info.get_size();
+ files_to_prepare.add(new FileToPrepare(job, child, copy_to_library));
+
+ continue;
+ }
+ } else {
+ warning("Ignoring import of %s file type %d", child.get_path(), (int) file_type);
+ }
+ }
+ }
+}
+
+private class PreparedFile {
+ public BatchImportJob job;
+ public ImportResult result;
+ public File file;
+ public File? associated_file = null;
+ public string source_id;
+ public string dest_id;
+ public bool copy_to_library;
+ public string? exif_md5;
+ public string? thumbnail_md5;
+ public string? full_md5;
+ public PhotoFileFormat file_format;
+ public uint64 filesize;
+ public bool is_video;
+
+ public PreparedFile(BatchImportJob job, File file, File? associated_file, string source_id, string dest_id,
+ bool copy_to_library, string? exif_md5, string? thumbnail_md5, string? full_md5,
+ PhotoFileFormat file_format, uint64 filesize, bool is_video = false) {
+ this.job = job;
+ this.result = ImportResult.SUCCESS;
+ this.file = file;
+ this.associated_file = associated_file;
+ this.source_id = source_id;
+ this.dest_id = dest_id;
+ this.copy_to_library = copy_to_library;
+ this.exif_md5 = exif_md5;
+ this.thumbnail_md5 = thumbnail_md5;
+ this.full_md5 = full_md5;
+ this.file_format = file_format;
+ this.filesize = filesize;
+ this.is_video = is_video;
+ }
+}
+
+private class PreparedFileCluster : InterlockedNotificationObject {
+ public Gee.ArrayList<PreparedFile> list;
+
+ public PreparedFileCluster(Gee.ArrayList<PreparedFile> list) {
+ this.list = list;
+ }
+}
+
+private class PrepareFilesJob : BackgroundImportJob {
+ // Do not examine until the CompletionCallback has been called.
+ public int prepared_files = 0;
+
+ private Gee.List<FileToPrepare> files_to_prepare;
+ private unowned NotificationCallback notification;
+ private File library_dir;
+
+ // these are for debugging and testing only
+ private int import_file_count = 0;
+ private int fail_every = 0;
+ private int skip_every = 0;
+
+ public PrepareFilesJob(BatchImport owner, Gee.List<FileToPrepare> files_to_prepare,
+ NotificationCallback notification, CompletionCallback callback, Cancellable cancellable,
+ CancellationCallback cancellation) {
+ base (owner, callback, cancellable, cancellation);
+
+ this.files_to_prepare = files_to_prepare;
+ this.notification = notification;
+ library_dir = AppDirs.get_import_dir();
+ fail_every = get_test_variable("SHOTWELL_FAIL_EVERY");
+ skip_every = get_test_variable("SHOTWELL_SKIP_EVERY");
+
+ set_notification_priority(Priority.LOW);
+ }
+
+ private static int get_test_variable(string name) {
+ string value = Environment.get_variable(name);
+
+ return (value == null || value.length == 0) ? 0 : int.parse(value);
+ }
+
+ public override void execute() {
+ Timer timer = new Timer();
+
+ Gee.ArrayList<PreparedFile> list = new Gee.ArrayList<PreparedFile>();
+ foreach (FileToPrepare file_to_prepare in files_to_prepare) {
+ ImportResult result = abort_check();
+ if (result != ImportResult.SUCCESS) {
+ report_failure(file_to_prepare.job, null, file_to_prepare.job.get_dest_identifier(),
+ file_to_prepare.job.get_source_identifier(), result);
+
+ continue;
+ }
+
+ BatchImportJob job = file_to_prepare.job;
+ File? file = file_to_prepare.file;
+ File? associated = file_to_prepare.associated != null ? file_to_prepare.associated.file : null;
+ bool copy_to_library = file_to_prepare.copy_to_library;
+
+ // if no file seen, then it needs to be offered/generated by the BatchImportJob
+ if (file == null) {
+ if (!create_file(job, out file, out copy_to_library))
+ continue;
+ }
+
+ if (associated == null && file_to_prepare.associated != null) {
+ create_file(file_to_prepare.associated.job, out associated, out copy_to_library);
+ }
+
+ PreparedFile prepared_file;
+ result = prepare_file(job, file, associated, copy_to_library, out prepared_file);
+ if (result == ImportResult.SUCCESS) {
+ prepared_files++;
+ list.add(prepared_file);
+ } else {
+ report_failure(job, file, job.get_source_identifier(), file.get_path(),
+ result);
+ }
+
+ if (list.size >= BatchImport.REPORT_EVERY_N_PREPARED_FILES
+ || ((timer.elapsed() * 1000.0) > BatchImport.REPORT_PREPARED_FILES_EVERY_N_MSEC && list.size > 0)) {
+#if TRACE_IMPORT
+ debug("Notifying that %d prepared files are ready", list.size);
+#endif
+ PreparedFileCluster cluster = new PreparedFileCluster(list);
+ list = new Gee.ArrayList<PreparedFile>();
+ notify(notification, cluster);
+ timer.start();
+ }
+ }
+
+ if (list.size > 0) {
+ ImportResult result = abort_check();
+ if (result == ImportResult.SUCCESS) {
+ notify(notification, new PreparedFileCluster(list));
+ } else {
+ // subtract these, as they are not being submitted
+ assert(prepared_files >= list.size);
+ prepared_files -= list.size;
+
+ foreach (PreparedFile prepared_file in list) {
+ report_failure(prepared_file.job, prepared_file.file,
+ prepared_file.job.get_source_identifier(), prepared_file.file.get_path(),
+ result);
+ }
+ }
+ }
+ }
+
+ // If there's no file, call this function to get it from the batch import job.
+ private bool create_file(BatchImportJob job, out File file, out bool copy_to_library) {
+ try {
+ if (!job.prepare(out file, out copy_to_library)) {
+ report_failure(job, null, job.get_source_identifier(),
+ job.get_dest_identifier(), ImportResult.FILE_ERROR);
+
+ return false;
+ }
+ } catch (Error err) {
+ report_error(job, null, job.get_source_identifier(), job.get_dest_identifier(),
+ err, ImportResult.FILE_ERROR);
+
+ return false;
+ }
+ return true;
+ }
+
+ private ImportResult prepare_file(BatchImportJob job, File file, File? associated_file,
+ bool copy_to_library, out PreparedFile prepared_file) {
+ prepared_file = null;
+
+ bool is_video = VideoReader.is_supported_video_file(file);
+
+ if ((!is_video) && (!Photo.is_file_image(file)))
+ return ImportResult.NOT_AN_IMAGE;
+
+ if ((!is_video) && (!PhotoFileFormat.is_file_supported(file)))
+ return ImportResult.UNSUPPORTED_FORMAT;
+
+ import_file_count++;
+
+ // test case (can be set with SHOTWELL_FAIL_EVERY environment variable)
+ if (fail_every > 0) {
+ if (import_file_count % fail_every == 0)
+ return ImportResult.FILE_ERROR;
+ }
+
+ // test case (can be set with SHOTWELL_SKIP_EVERY environment variable)
+ if (skip_every > 0) {
+ if (import_file_count % skip_every == 0)
+ return ImportResult.NOT_A_FILE;
+ }
+
+ string exif_only_md5 = null;
+ string thumbnail_md5 = null;
+ string full_md5 = null;
+
+ try {
+ full_md5 = md5_file(file);
+#if TRACE_MD5
+ debug("import MD5 for file %s = %s", file.get_path(), full_md5);
+#endif
+ } catch (Error err) {
+ warning("Unable to perform MD5 checksum on file %s: %s", file.get_path(),
+ err.message);
+
+ return ImportResult.convert_error(err, ImportResult.FILE_ERROR);
+ }
+
+ // we only care about file extensions and metadata if we're importing a photo --
+ // we don't care about these things for video
+ PhotoFileFormat file_format = PhotoFileFormat.get_by_file_extension(file);
+ if (!is_video) {
+ if (file_format == PhotoFileFormat.UNKNOWN) {
+ warning("Skipping %s: unrecognized file extension", file.get_path());
+
+ return ImportResult.UNSUPPORTED_FORMAT;
+ }
+ PhotoFileReader reader = file_format.create_reader(file.get_path());
+ PhotoMetadata? metadata = null;
+ try {
+ metadata = reader.read_metadata();
+ } catch (Error err) {
+ warning("Unable to read metadata for %s (%s): continuing to attempt import",
+ file.get_path(), err.message);
+ }
+
+ if (metadata != null) {
+ uint8[]? flattened_sans_thumbnail = metadata.flatten_exif(false);
+ if (flattened_sans_thumbnail != null && flattened_sans_thumbnail.length > 0)
+ exif_only_md5 = md5_binary(flattened_sans_thumbnail, flattened_sans_thumbnail.length);
+
+ uint8[]? flattened_thumbnail = metadata.flatten_exif_preview();
+ if (flattened_thumbnail != null && flattened_thumbnail.length > 0)
+ thumbnail_md5 = md5_binary(flattened_thumbnail, flattened_thumbnail.length);
+ }
+ }
+
+ uint64 filesize = 0;
+ try {
+ filesize = query_total_file_size(file, get_cancellable());
+ } catch (Error err) {
+ warning("Unable to query file size of %s: %s", file.get_path(), err.message);
+
+ return ImportResult.convert_error(err, ImportResult.FILE_ERROR);
+ }
+
+ // never copy file if already in library directory
+ bool is_in_library_dir = file.has_prefix(library_dir);
+
+ // notify the BatchImport this is ready to go
+ prepared_file = new PreparedFile(job, file, associated_file, job.get_source_identifier(),
+ job.get_dest_identifier(), copy_to_library && !is_in_library_dir, exif_only_md5,
+ thumbnail_md5, full_md5, file_format, filesize, is_video);
+
+ return ImportResult.SUCCESS;
+ }
+}
+
+private class ReadyForImport {
+ public File final_file;
+ public PreparedFile prepared_file;
+ public PhotoImportParams? photo_import_params;
+ public VideoImportParams? video_import_params;
+ public BatchImportResult batch_result;
+ public bool is_video;
+
+ public ReadyForImport(File final_file, PreparedFile prepared_file,
+ PhotoImportParams? photo_import_params, VideoImportParams? video_import_params,
+ BatchImportResult batch_result) {
+ if (prepared_file.is_video)
+ assert((video_import_params != null) && (photo_import_params == null));
+ else
+ assert((video_import_params == null) && (photo_import_params != null));
+
+ this.final_file = final_file;
+ this.prepared_file = prepared_file;
+ this.batch_result = batch_result;
+ this.video_import_params = video_import_params;
+ this.photo_import_params = photo_import_params;
+ this.is_video = prepared_file.is_video;
+ }
+
+ public BatchImportResult abort() {
+ // if file copied, delete it
+ if (final_file != null && final_file != prepared_file.file) {
+ debug("Deleting aborted import copy %s", final_file.get_path());
+ try {
+ final_file.delete(null);
+ } catch (Error err) {
+ warning("Unable to delete copy of imported file (aborted import) %s: %s",
+ final_file.get_path(), err.message);
+ }
+ }
+
+ batch_result = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.job.get_source_identifier(), prepared_file.job.get_dest_identifier(),
+ null, ImportResult.USER_ABORT);
+
+ return batch_result;
+ }
+
+ public Thumbnails get_thumbnails() {
+ return (photo_import_params != null) ? photo_import_params.thumbnails :
+ video_import_params.thumbnails;
+ }
+}
+
+private class PreparedFileImportJob : BackgroundJob {
+ public PreparedFile? not_ready;
+ public ReadyForImport? ready = null;
+ public BatchImportResult? failed = null;
+
+ private ImportID import_id;
+
+ public PreparedFileImportJob(BatchImport owner, PreparedFile prepared_file, ImportID import_id,
+ CompletionCallback callback, Cancellable cancellable, CancellationCallback cancellation) {
+ base (owner, callback, cancellable, cancellation);
+
+ this.import_id = import_id;
+ not_ready = prepared_file;
+
+ set_completion_priority(Priority.LOW);
+ }
+
+ public override void execute() {
+ PreparedFile prepared_file = not_ready;
+ not_ready = null;
+
+ File final_file = prepared_file.file;
+ File? final_associated_file = prepared_file.associated_file;
+
+ if (prepared_file.copy_to_library) {
+ try {
+ // Copy file.
+ final_file = LibraryFiles.duplicate(prepared_file.file, null, true);
+ if (final_file == null) {
+ failed = new BatchImportResult(prepared_file.job, prepared_file.file,
+ prepared_file.file.get_path(), prepared_file.file.get_path(), null,
+ ImportResult.FILE_ERROR);
+
+ return;
+ }
+
+ // Copy associated file.
+ if (final_associated_file != null) {
+ final_associated_file = LibraryFiles.duplicate(prepared_file.associated_file, null, true);
+ }
+ } catch (Error err) {
+ string filename = final_file != null ? final_file.get_path() : prepared_file.source_id;
+ failed = new BatchImportResult.from_error(prepared_file.job, prepared_file.file,
+ filename, filename, err, ImportResult.FILE_ERROR);
+
+ return;
+ }
+ }
+
+ debug("Importing %s", final_file.get_path());
+
+ ImportResult result = ImportResult.SUCCESS;
+ VideoImportParams? video_import_params = null;
+ PhotoImportParams? photo_import_params = null;
+ if (prepared_file.is_video) {
+ video_import_params = new VideoImportParams(final_file, import_id,
+ prepared_file.full_md5, new Thumbnails(),
+ prepared_file.job.get_exposure_time_override());
+
+ result = VideoReader.prepare_for_import(video_import_params);
+ } else {
+ photo_import_params = new PhotoImportParams(final_file, final_associated_file, import_id,
+ PhotoFileSniffer.Options.GET_ALL, prepared_file.exif_md5,
+ prepared_file.thumbnail_md5, prepared_file.full_md5, new Thumbnails());
+
+ result = Photo.prepare_for_import(photo_import_params);
+ }
+
+ if (result != ImportResult.SUCCESS && final_file != prepared_file.file) {
+ debug("Deleting failed imported copy %s", final_file.get_path());
+ try {
+ final_file.delete(null);
+ } catch (Error err) {
+ // don't let this file error cause a failure
+ warning("Unable to delete copy of imported file %s: %s", final_file.get_path(),
+ err.message);
+ }
+ }
+
+ BatchImportResult batch_result = new BatchImportResult(prepared_file.job, final_file,
+ final_file.get_path(), final_file.get_path(), null, result);
+ if (batch_result.result != ImportResult.SUCCESS)
+ failed = batch_result;
+ else
+ ready = new ReadyForImport(final_file, prepared_file, photo_import_params,
+ video_import_params, batch_result);
+ }
+}
+
+private class CompletedImportObject {
+ public Thumbnails? thumbnails;
+ public BatchImportResult batch_result;
+ public MediaSource source;
+ public BatchImportJob original_job;
+ public Gdk.Pixbuf user_preview;
+
+ public CompletedImportObject(MediaSource source, Thumbnails thumbnails,
+ BatchImportJob original_job, BatchImportResult import_result) {
+ this.thumbnails = thumbnails;
+ this.batch_result = import_result;
+ this.source = source;
+ this.original_job = original_job;
+ user_preview = thumbnails.get(ThumbnailCache.Size.LARGEST);
+ }
+}
+
+private class ThumbnailWriterJob : BackgroundImportJob {
+ public CompletedImportObject completed_import_source;
+
+ public ThumbnailWriterJob(BatchImport owner, CompletedImportObject completed_import_source,
+ CompletionCallback callback, Cancellable cancellable, CancellationCallback cancel_callback) {
+ base (owner, callback, cancellable, cancel_callback);
+
+ assert(completed_import_source.thumbnails != null);
+ this.completed_import_source = completed_import_source;
+
+ set_completion_priority(Priority.LOW);
+ }
+
+ public override void execute() {
+ try {
+ ThumbnailCache.import_thumbnails(completed_import_source.source,
+ completed_import_source.thumbnails, true);
+ completed_import_source.batch_result.result = ImportResult.SUCCESS;
+ } catch (Error err) {
+ completed_import_source.batch_result.result = ImportResult.convert_error(err,
+ ImportResult.FILE_ERROR);
+ }
+
+ // destroy the thumbnails (but not the user preview) to free up memory
+ completed_import_source.thumbnails = null;
+ }
+}
+
diff --git a/src/Box.vala b/src/Box.vala
new file mode 100644
index 0000000..f48bcfb
--- /dev/null
+++ b/src/Box.vala
@@ -0,0 +1,403 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public enum BoxLocation {
+ OUTSIDE,
+ INSIDE,
+ TOP_SIDE,
+ LEFT_SIDE,
+ RIGHT_SIDE,
+ BOTTOM_SIDE,
+ TOP_LEFT,
+ BOTTOM_LEFT,
+ TOP_RIGHT,
+ BOTTOM_RIGHT
+}
+
+public enum BoxComplements {
+ NONE,
+ VERTICAL,
+ HORIZONTAL,
+ BOTH;
+
+ public static BoxComplements derive(bool horizontal_complement, bool vertical_complement) {
+ if (horizontal_complement && vertical_complement)
+ return BOTH;
+ else if(horizontal_complement)
+ return HORIZONTAL;
+ else if (vertical_complement)
+ return VERTICAL;
+
+ return NONE;
+ }
+}
+
+public struct Box {
+ public static const int HAND_GRENADES = 12;
+
+ public int left;
+ public int top;
+ public int right;
+ public int bottom;
+
+ public Box(int left = 0, int top = 0, int right = 0, int bottom = 0) {
+ // Sanity check on top left vertex.
+ left = left.clamp(0, int.MAX);
+ top = top.clamp(0, int.MAX);
+
+ // Sanity check on dimensions - force
+ // box to be at least 1 px by 1 px.
+ if (right <= left)
+ right = left + 1;
+
+ if (bottom <= top)
+ bottom = top + 1;
+
+ this.left = left;
+ this.top = top;
+ this.right = right;
+ this.bottom = bottom;
+ }
+
+ public static Box from_rectangle(Gdk.Rectangle rect) {
+ return Box(rect.x, rect.y, rect.x + rect.width - 1, rect.y + rect.height - 1);
+ }
+
+ public static Box from_allocation(Gtk.Allocation alloc) {
+ return Box(alloc.x, alloc.y, alloc.x + alloc.width - 1, alloc.y + alloc.height - 1);
+ }
+
+ // This ensures a proper box is built from the points supplied, no matter the relationship
+ // between the two points
+ public static Box from_points(Gdk.Point corner1, Gdk.Point corner2) {
+ return Box(int.min(corner1.x, corner2.x), int.min(corner1.y, corner2.y),
+ int.max(corner1.x, corner2.x), int.max(corner1.y, corner2.y));
+ }
+
+ public static Box from_center(Gdk.Point center, int width, int height) {
+ return Box(center.x - (width / 2), center.y - (height / 2),
+ center.x + (width / 2), center.y + (height / 2));
+ }
+
+ public int get_width() {
+ assert(right >= left);
+
+ return right - left + 1;
+ }
+
+ public int get_height() {
+ assert(bottom >= top);
+
+ return bottom - top + 1;
+ }
+
+ public bool is_valid() {
+ return (left >= 0) && (top >= 0) && (right >= left) && (bottom >= top);
+ }
+
+ public bool equals(Box box) {
+ return (left == box.left && top == box.top && right == box.right && bottom == box.bottom);
+ }
+
+ // Adjust width, preserving the box's center.
+ public void adjust_width(int width) {
+ int center_x = (left + right) / 2;
+ left = center_x - (width / 2);
+ right = center_x + (width / 2);
+ }
+
+ // Adjust height, preserving the box's center.
+ public void adjust_height(int height) {
+ int center_y = (top + bottom) / 2;
+ top = center_y - (height / 2);
+ bottom = center_y + (height / 2);
+ }
+
+ public Box get_scaled(Dimensions scaled) {
+ double x_scale, y_scale;
+ get_dimensions().get_scale_ratios(scaled, out x_scale, out y_scale);
+
+ int l = (int) Math.round((double) left * x_scale);
+ int t = (int) Math.round((double) top * y_scale);
+
+ // fix-up to match the scaled dimensions
+ int r = l + scaled.width - 1;
+ int b = t + scaled.height - 1;
+
+ Box box = Box(l, t, r, b);
+ assert(box.get_width() == scaled.width || box.get_height() == scaled.height);
+
+ return box;
+ }
+
+ public Box get_scaled_similar(Dimensions original, Dimensions scaled) {
+ double x_scale, y_scale;
+ original.get_scale_ratios(scaled, out x_scale, out y_scale);
+
+ int l = (int) Math.round((double) left * x_scale);
+ int t = (int) Math.round((double) top * y_scale);
+ int r = (int) Math.round((double) right * x_scale);
+ int b = (int) Math.round((double) bottom * y_scale);
+
+ // catch rounding errors
+ if (r >= scaled.width)
+ r = scaled.width - 1;
+
+ if (b >= scaled.height)
+ b = scaled.height - 1;
+
+ return Box(l, t, r, b);
+ }
+
+ public Box get_offset(int xofs, int yofs) {
+ return Box(left + xofs, top + yofs, right + xofs, bottom + yofs);
+ }
+
+ public Dimensions get_dimensions() {
+ return Dimensions(get_width(), get_height());
+ }
+
+ public void get_points(out Gdk.Point top_left, out Gdk.Point bottom_right) {
+ top_left = { left, top };
+ bottom_right = { right, bottom };
+ }
+
+ public Gdk.Rectangle get_rectangle() {
+ Gdk.Rectangle rect = Gdk.Rectangle();
+ rect.x = left;
+ rect.y = top;
+ rect.width = get_width();
+ rect.height = get_height();
+
+ return rect;
+ }
+
+ public Gdk.Point get_center() {
+ return { (left + right) / 2, (top + bottom) / 2 };
+ }
+
+ public Box rotate_clockwise(Dimensions space) {
+ int l = space.width - bottom - 1;
+ int t = left;
+ int r = space.width - top - 1;
+ int b = right;
+
+ return Box(l, t, r, b);
+ }
+
+ public Box rotate_counterclockwise(Dimensions space) {
+ int l = top;
+ int t = space.height - right - 1;
+ int r = bottom;
+ int b = space.height - left - 1;
+
+ return Box(l, t, r, b);
+ }
+
+ public Box flip_left_to_right(Dimensions space) {
+ int l = space.width - right - 1;
+ int r = space.width - left - 1;
+
+ return Box(l, top, r, bottom);
+ }
+
+ public Box flip_top_to_bottom(Dimensions space) {
+ int t = space.height - bottom - 1;
+ int b = space.height - top - 1;
+
+ return Box(left, t, right, b);
+ }
+
+ public bool intersects(Box compare) {
+ int left_intersect = int.max(left, compare.left);
+ int top_intersect = int.max(top, compare.top);
+ int right_intersect = int.min(right, compare.right);
+ int bottom_intersect = int.min(bottom, compare.bottom);
+
+ return (right_intersect >= left_intersect && bottom_intersect >= top_intersect);
+ }
+
+ public Box get_reduced(int amount) {
+ return Box(left + amount, top + amount, right - amount, bottom - amount);
+ }
+
+ public Box get_expanded(int amount) {
+ return Box(left - amount, top - amount, right + amount, bottom + amount);
+ }
+
+ public bool contains(Gdk.Point point) {
+ return point.x >= left && point.x <= right && point.y >= top && point.y <= bottom;
+ }
+
+ // This specialized method is only concerned with resized comparisons between two Boxes,
+ // of which one is altered in up to two dimensions: (top or bottom) and/or (left or right).
+ // There may be overlap between the two returned Boxes.
+ public BoxComplements resized_complements(Box resized, out Box horizontal, out bool horizontal_enlarged,
+ out Box vertical, out bool vertical_enlarged) {
+
+ bool horizontal_complement = true;
+ if (resized.top < top) {
+ // enlarged from top
+ horizontal = Box(resized.left, resized.top, resized.right, top);
+ horizontal_enlarged = true;
+ } else if (resized.top > top) {
+ // shrunk from top
+ horizontal = Box(left, top, right, resized.top);
+ horizontal_enlarged = false;
+ } else if (resized.bottom < bottom) {
+ // shrunk from bottom
+ horizontal = Box(left, resized.bottom, right, bottom);
+ horizontal_enlarged = false;
+ } else if (resized.bottom > bottom) {
+ // enlarged from bottom
+ horizontal = Box(resized.left, bottom, resized.right, resized.bottom);
+ horizontal_enlarged = true;
+ } else {
+ horizontal = Box();
+ horizontal_enlarged = false;
+ horizontal_complement = false;
+ }
+
+ bool vertical_complement = true;
+ if (resized.left < left) {
+ // enlarged left
+ vertical = Box(resized.left, resized.top, left, resized.bottom);
+ vertical_enlarged = true;
+ } else if (resized.left > left) {
+ // shrunk left
+ vertical = Box(left, top, resized.left, bottom);
+ vertical_enlarged = false;
+ } else if (resized.right < right) {
+ // shrunk right
+ vertical = Box(resized.right, top, right, bottom);
+ vertical_enlarged = false;
+ } else if (resized.right > right) {
+ // enlarged right
+ vertical = Box(right, resized.top, resized.right, resized.bottom);
+ vertical_enlarged = true;
+ } else {
+ vertical = Box();
+ vertical_enlarged = false;
+ vertical_complement = false;
+ }
+
+ return BoxComplements.derive(horizontal_complement, vertical_complement);
+ }
+
+ // This specialized method is only concerned with the complements of identical Boxes in two
+ // different, spatial locations. There may be overlap between the four returned Boxes. However,
+ // no portion of any of the four boxes will be outside the scope of the two compared boxes.
+ public BoxComplements shifted_complements(Box shifted, out Box horizontal_this,
+ out Box vertical_this, out Box horizontal_shifted, out Box vertical_shifted) {
+ assert(get_width() == shifted.get_width());
+ assert(get_height() == shifted.get_height());
+
+ bool horizontal_complement = true;
+ if (shifted.top < top && shifted.bottom > top) {
+ // shifted up
+ horizontal_this = Box(left, shifted.bottom, right, bottom);
+ horizontal_shifted = Box(shifted.left, shifted.top, shifted.right, top);
+ } else if (shifted.top > top && shifted.top < bottom) {
+ // shifted down
+ horizontal_this = Box(left, top, right, shifted.top);
+ horizontal_shifted = Box(shifted.left, bottom, shifted.right, shifted.bottom);
+ } else {
+ // no vertical shift
+ horizontal_this = Box();
+ horizontal_shifted = Box();
+ horizontal_complement = false;
+ }
+
+ bool vertical_complement = true;
+ if (shifted.left < left && shifted.right > left) {
+ // shifted left
+ vertical_this = Box(shifted.right, top, right, bottom);
+ vertical_shifted = Box(shifted.left, shifted.top, left, shifted.bottom);
+ } else if (shifted.left > left && shifted.left < right) {
+ // shifted right
+ vertical_this = Box(left, top, shifted.left, bottom);
+ vertical_shifted = Box(right, shifted.top, shifted.right, shifted.bottom);
+ } else {
+ // no horizontal shift
+ vertical_this = Box();
+ vertical_shifted = Box();
+ vertical_complement = false;
+ }
+
+ return BoxComplements.derive(horizontal_complement, vertical_complement);
+ }
+
+ public Box rubber_band(Gdk.Point point) {
+ assert(point.x >= 0);
+ assert(point.y >= 0);
+
+ int t = int.min(top, point.y);
+ int b = int.max(bottom, point.y);
+ int l = int.min(left, point.x);
+ int r = int.max(right, point.x);
+
+ return Box(l, t, r, b);
+ }
+
+ public string to_string() {
+ return "%d,%d %d,%d (%s)".printf(left, top, right, bottom, get_dimensions().to_string());
+ }
+
+ private static bool in_zone(double pos, int zone) {
+ int top_zone = zone - HAND_GRENADES;
+ int bottom_zone = zone + HAND_GRENADES;
+
+ return in_between(pos, top_zone, bottom_zone);
+ }
+
+ private static bool in_between(double pos, int top, int bottom) {
+ int ipos = (int) pos;
+
+ return (ipos > top) && (ipos < bottom);
+ }
+
+ private static bool near_in_between(double pos, int top, int bottom) {
+ int ipos = (int) pos;
+ int top_zone = top - HAND_GRENADES;
+ int bottom_zone = bottom + HAND_GRENADES;
+
+ return (ipos > top_zone) && (ipos < bottom_zone);
+ }
+
+ public BoxLocation approx_location(int x, int y) {
+ bool near_width = near_in_between(x, left, right);
+ bool near_height = near_in_between(y, top, bottom);
+
+ if (in_zone(x, left) && near_height) {
+ if (in_zone(y, top)) {
+ return BoxLocation.TOP_LEFT;
+ } else if (in_zone(y, bottom)) {
+ return BoxLocation.BOTTOM_LEFT;
+ } else {
+ return BoxLocation.LEFT_SIDE;
+ }
+ } else if (in_zone(x, right) && near_height) {
+ if (in_zone(y, top)) {
+ return BoxLocation.TOP_RIGHT;
+ } else if (in_zone(y, bottom)) {
+ return BoxLocation.BOTTOM_RIGHT;
+ } else {
+ return BoxLocation.RIGHT_SIDE;
+ }
+ } else if (in_zone(y, top) && near_width) {
+ // if left or right was in zone, already caught top left & top right
+ return BoxLocation.TOP_SIDE;
+ } else if (in_zone(y, bottom) && near_width) {
+ // if left or right was in zone, already caught bottom left & bottom right
+ return BoxLocation.BOTTOM_SIDE;
+ } else if (in_between(x, left, right) && in_between(y, top, bottom)) {
+ return BoxLocation.INSIDE;
+ } else {
+ return BoxLocation.OUTSIDE;
+ }
+ }
+}
+
diff --git a/src/CheckerboardLayout.vala b/src/CheckerboardLayout.vala
new file mode 100644
index 0000000..398152e
--- /dev/null
+++ b/src/CheckerboardLayout.vala
@@ -0,0 +1,1872 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+private class CheckerboardItemText {
+ private static int one_line_height = 0;
+
+ private string text;
+ private bool marked_up;
+ private Pango.Alignment alignment;
+ private Pango.Layout layout = null;
+ private bool single_line = true;
+ private int height = 0;
+
+ public Gdk.Rectangle allocation = Gdk.Rectangle();
+
+ public CheckerboardItemText(string text, Pango.Alignment alignment = Pango.Alignment.LEFT,
+ bool marked_up = false) {
+ this.text = text;
+ this.marked_up = marked_up;
+ this.alignment = alignment;
+
+ single_line = is_single_line();
+ }
+
+ private bool is_single_line() {
+ return !String.contains_char(text, '\n');
+ }
+
+ public bool is_marked_up() {
+ return marked_up;
+ }
+
+ public bool is_set_to(string text, bool marked_up, Pango.Alignment alignment) {
+ return (this.marked_up == marked_up && this.alignment == alignment && this.text == text);
+ }
+
+ public string get_text() {
+ return text;
+ }
+
+ public int get_height() {
+ if (height == 0)
+ update_height();
+
+ return height;
+ }
+
+ public Pango.Layout get_pango_layout(int max_width = 0) {
+ if (layout == null)
+ create_pango();
+
+ if (max_width > 0)
+ layout.set_width(max_width * Pango.SCALE);
+
+ return layout;
+ }
+
+ public void clear_pango_layout() {
+ layout = null;
+ }
+
+ private void update_height() {
+ if (one_line_height != 0 && single_line)
+ height = one_line_height;
+ else
+ create_pango();
+ }
+
+ private void create_pango() {
+ // create layout for this string and ellipsize so it never extends past its laid-down width
+ layout = AppWindow.get_instance().create_pango_layout(null);
+ if (!marked_up)
+ layout.set_text(text, -1);
+ else
+ layout.set_markup(text, -1);
+
+ layout.set_ellipsize(Pango.EllipsizeMode.END);
+ layout.set_alignment(alignment);
+
+ // getting pixel size is expensive, and we only need the height, so use cached values
+ // whenever possible
+ if (one_line_height != 0 && single_line) {
+ height = one_line_height;
+ } else {
+ int width;
+ layout.get_pixel_size(out width, out height);
+
+ // cache first one-line height discovered
+ if (one_line_height == 0 && single_line)
+ one_line_height = height;
+ }
+ }
+}
+
+public abstract class CheckerboardItem : ThumbnailView {
+ // Collection properties CheckerboardItem understands
+ // SHOW_TITLES (bool)
+ public const string PROP_SHOW_TITLES = "show-titles";
+ // SHOW_COMMENTS (bool)
+ public const string PROP_SHOW_COMMENTS = "show-comments";
+ // SHOW_SUBTITLES (bool)
+ public const string PROP_SHOW_SUBTITLES = "show-subtitles";
+
+ public const int FRAME_WIDTH = 8;
+ public const int LABEL_PADDING = 4;
+ public const int BORDER_WIDTH = 1;
+
+ public const int SHADOW_RADIUS = 4;
+ public const float SHADOW_INITIAL_ALPHA = 0.5f;
+
+ public const int TRINKET_SCALE = 12;
+ public const int TRINKET_PADDING = 1;
+
+ public const int BRIGHTEN_SHIFT = 0x18;
+
+ public Dimensions requisition = Dimensions();
+ public Gdk.Rectangle allocation = Gdk.Rectangle();
+
+ private bool exposure = false;
+ private CheckerboardItemText? title = null;
+ private bool title_visible = true;
+ private CheckerboardItemText? comment = null;
+ private bool comment_visible = true;
+ private CheckerboardItemText? subtitle = null;
+ private bool subtitle_visible = false;
+ private Gdk.Pixbuf pixbuf = null;
+ private Gdk.Pixbuf display_pixbuf = null;
+ private Gdk.Pixbuf brightened = null;
+ private Dimensions pixbuf_dim = Dimensions();
+ private int col = -1;
+ private int row = -1;
+ private int horizontal_trinket_offset = 0;
+
+ public CheckerboardItem(ThumbnailSource source, Dimensions initial_pixbuf_dim, string title, string? comment,
+ bool marked_up = false, Pango.Alignment alignment = Pango.Alignment.LEFT) {
+ base(source);
+
+ pixbuf_dim = initial_pixbuf_dim;
+ this.title = new CheckerboardItemText(title, alignment, marked_up);
+ // on the checkboard page we display the comment in
+ // one line, i.e., replacing all newlines with spaces.
+ // that means that the display will contain "..." if the comment
+ // is too long.
+ // warning: changes here have to be done in set_comment, too!
+ if (comment != null)
+ this.comment = new CheckerboardItemText(comment.replace("\n", " "), alignment,
+ marked_up);
+
+ // Don't calculate size here, wait for the item to be assigned to a ViewCollection
+ // (notify_membership_changed) and calculate when the collection's property settings
+ // are known
+ }
+
+ public override string get_name() {
+ return (title != null) ? title.get_text() : base.get_name();
+ }
+
+ public string get_title() {
+ return (title != null) ? title.get_text() : "";
+ }
+
+ public string get_comment() {
+ return (comment != null) ? comment.get_text() : "";
+ }
+
+ public void set_title(string text, bool marked_up = false,
+ Pango.Alignment alignment = Pango.Alignment.LEFT) {
+ if (title != null && title.is_set_to(text, marked_up, alignment))
+ return;
+
+ title = new CheckerboardItemText(text, alignment, marked_up);
+
+ if (title_visible) {
+ recalc_size("set_title");
+ notify_view_altered();
+ }
+ }
+
+ public void clear_title() {
+ if (title == null)
+ return;
+
+ title = null;
+
+ if (title_visible) {
+ recalc_size("clear_title");
+ notify_view_altered();
+ }
+ }
+
+ private void set_title_visible(bool visible) {
+ if (title_visible == visible)
+ return;
+
+ title_visible = visible;
+
+ recalc_size("set_title_visible");
+ notify_view_altered();
+ }
+
+ public void set_comment(string text, bool marked_up = false,
+ Pango.Alignment alignment = Pango.Alignment.LEFT) {
+ if (comment != null && comment.is_set_to(text, marked_up, alignment))
+ return;
+
+ comment = new CheckerboardItemText(text.replace("\n", " "), alignment, marked_up);
+
+ if (comment_visible) {
+ recalc_size("set_comment");
+ notify_view_altered();
+ }
+ }
+
+ public void clear_comment() {
+ if (comment == null)
+ return;
+
+ comment = null;
+
+ if (comment_visible) {
+ recalc_size("clear_comment");
+ notify_view_altered();
+ }
+ }
+
+ private void set_comment_visible(bool visible) {
+ if (comment_visible == visible)
+ return;
+
+ comment_visible = visible;
+
+ recalc_size("set_comment_visible");
+ notify_view_altered();
+ }
+
+
+ public string get_subtitle() {
+ return (subtitle != null) ? subtitle.get_text() : "";
+ }
+
+ public void set_subtitle(string text, bool marked_up = false,
+ Pango.Alignment alignment = Pango.Alignment.LEFT) {
+ if (subtitle != null && subtitle.is_set_to(text, marked_up, alignment))
+ return;
+
+ subtitle = new CheckerboardItemText(text, alignment, marked_up);
+
+ if (subtitle_visible) {
+ recalc_size("set_subtitle");
+ notify_view_altered();
+ }
+ }
+
+ public void clear_subtitle() {
+ if (subtitle == null)
+ return;
+
+ subtitle = null;
+
+ if (subtitle_visible) {
+ recalc_size("clear_subtitle");
+ notify_view_altered();
+ }
+ }
+
+ private void set_subtitle_visible(bool visible) {
+ if (subtitle_visible == visible)
+ return;
+
+ subtitle_visible = visible;
+
+ recalc_size("set_subtitle_visible");
+ notify_view_altered();
+ }
+
+ protected override void notify_membership_changed(DataCollection? collection) {
+ bool title_visible = (bool) get_collection_property(PROP_SHOW_TITLES, true);
+ bool comment_visible = (bool) get_collection_property(PROP_SHOW_COMMENTS, true);
+ bool subtitle_visible = (bool) get_collection_property(PROP_SHOW_SUBTITLES, false);
+
+ bool altered = false;
+ if (this.title_visible != title_visible) {
+ this.title_visible = title_visible;
+ altered = true;
+ }
+
+ if (this.comment_visible != comment_visible) {
+ this.comment_visible = comment_visible;
+ altered = true;
+ }
+
+ if (this.subtitle_visible != subtitle_visible) {
+ this.subtitle_visible = subtitle_visible;
+ altered = true;
+ }
+
+ if (altered || !requisition.has_area()) {
+ recalc_size("notify_membership_changed");
+ notify_view_altered();
+ }
+
+ base.notify_membership_changed(collection);
+ }
+
+ protected override void notify_collection_property_set(string name, Value? old, Value val) {
+ switch (name) {
+ case PROP_SHOW_TITLES:
+ set_title_visible((bool) val);
+ break;
+
+ case PROP_SHOW_COMMENTS:
+ set_comment_visible((bool) val);
+ break;
+
+ case PROP_SHOW_SUBTITLES:
+ set_subtitle_visible((bool) val);
+ break;
+ }
+
+ base.notify_collection_property_set(name, old, val);
+ }
+
+ // The alignment point is the coordinate on the y-axis (relative to the top of the
+ // CheckerboardItem) which this item should be aligned to. This allows for
+ // bottom-alignment along the bottom edge of the thumbnail.
+ public int get_alignment_point() {
+ return FRAME_WIDTH + BORDER_WIDTH + pixbuf_dim.height;
+ }
+
+ public virtual void exposed() {
+ exposure = true;
+ }
+
+ public virtual void unexposed() {
+ exposure = false;
+
+ if (title != null)
+ title.clear_pango_layout();
+
+ if (comment != null)
+ comment.clear_pango_layout();
+
+ if (subtitle != null)
+ subtitle.clear_pango_layout();
+ }
+
+ public virtual bool is_exposed() {
+ return exposure;
+ }
+
+ public bool has_image() {
+ return pixbuf != null;
+ }
+
+ public Gdk.Pixbuf? get_image() {
+ return pixbuf;
+ }
+
+ public void set_image(Gdk.Pixbuf pixbuf) {
+ this.pixbuf = pixbuf;
+ display_pixbuf = pixbuf;
+ pixbuf_dim = Dimensions.for_pixbuf(pixbuf);
+
+ recalc_size("set_image");
+ notify_view_altered();
+ }
+
+ public void clear_image(Dimensions dim) {
+ bool had_image = pixbuf != null;
+
+ pixbuf = null;
+ display_pixbuf = null;
+ pixbuf_dim = dim;
+
+ recalc_size("clear_image");
+
+ if (had_image)
+ notify_view_altered();
+ }
+
+ public static int get_max_width(int scale) {
+ // width is frame width (two sides) + frame padding (two sides) + width of pixbuf (text
+ // never wider)
+ return (FRAME_WIDTH * 2) + scale;
+ }
+
+ private void recalc_size(string reason) {
+ Dimensions old_requisition = requisition;
+
+ // only add in the text heights if they're displayed
+ int title_height = (title != null && title_visible)
+ ? title.get_height() + LABEL_PADDING : 0;
+ int comment_height = (comment != null && comment_visible)
+ ? comment.get_height() + LABEL_PADDING : 0;
+ int subtitle_height = (subtitle != null && subtitle_visible)
+ ? subtitle.get_height() + LABEL_PADDING : 0;
+
+ // width is frame width (two sides) + frame padding (two sides) + width of pixbuf
+ // (text never wider)
+ requisition.width = (FRAME_WIDTH * 2) + (BORDER_WIDTH * 2) + pixbuf_dim.width;
+
+ // height is frame width (two sides) + frame padding (two sides) + height of pixbuf
+ // + height of text + label padding (between pixbuf and text)
+ requisition.height = (FRAME_WIDTH * 2) + (BORDER_WIDTH * 2)
+ + pixbuf_dim.height + title_height + comment_height + subtitle_height;
+
+#if TRACE_REFLOW_ITEMS
+ debug("recalc_size %s: %s title_height=%d comment_height=%d subtitle_height=%d requisition=%s",
+ get_source().get_name(), reason, title_height, comment_height, subtitle_height,
+ requisition.to_string());
+#endif
+
+ if (!requisition.approx_equals(old_requisition)) {
+#if TRACE_REFLOW_ITEMS
+ debug("recalc_size %s: %s notifying geometry altered", get_source().get_name(), reason);
+#endif
+ notify_geometry_altered();
+ }
+ }
+
+ protected static Dimensions get_border_dimensions(Dimensions object_dim, int border_width) {
+ Dimensions dimensions = Dimensions();
+ dimensions.width = object_dim.width + (border_width * 2);
+ dimensions.height = object_dim.height + (border_width * 2);
+ return dimensions;
+ }
+
+ protected static Gdk.Point get_border_origin(Gdk.Point object_origin, int border_width) {
+ Gdk.Point origin = Gdk.Point();
+ origin.x = object_origin.x - border_width;
+ origin.y = object_origin.y - border_width;
+ return origin;
+ }
+
+ protected virtual void paint_shadow(Cairo.Context ctx, Dimensions dimensions, Gdk.Point origin,
+ int radius, float initial_alpha) {
+ double rgb_all = 0.0;
+
+ // top right corner
+ paint_shadow_in_corner(ctx, origin.x + dimensions.width, origin.y + radius, rgb_all, radius,
+ initial_alpha, -0.5 * Math.PI, 0);
+ // bottom right corner
+ paint_shadow_in_corner(ctx, origin.x + dimensions.width, origin.y + dimensions.height, rgb_all,
+ radius, initial_alpha, 0, 0.5 * Math.PI);
+ // bottom left corner
+ paint_shadow_in_corner(ctx, origin.x + radius, origin.y + dimensions.height, rgb_all, radius,
+ initial_alpha, 0.5 * Math.PI, Math.PI);
+
+ // left right
+ Cairo.Pattern lr = new Cairo.Pattern.linear(0, origin.y + dimensions.height,
+ 0, origin.y + dimensions.height + radius);
+ lr.add_color_stop_rgba(0.0, rgb_all, rgb_all, rgb_all, initial_alpha);
+ lr.add_color_stop_rgba(1.0, rgb_all, rgb_all, rgb_all, 0.0);
+ ctx.set_source(lr);
+ ctx.rectangle(origin.x + radius, origin.y + dimensions.height, dimensions.width - radius, radius);
+ ctx.fill();
+
+ // top down
+ Cairo.Pattern td = new Cairo.Pattern.linear(origin.x + dimensions.width,
+ 0, origin.x + dimensions.width + radius, 0);
+ td.add_color_stop_rgba(0.0, rgb_all, rgb_all, rgb_all, initial_alpha);
+ td.add_color_stop_rgba(1.0, rgb_all, rgb_all, rgb_all, 0.0);
+ ctx.set_source(td);
+ ctx.rectangle(origin.x + dimensions.width, origin.y + radius,
+ radius, dimensions.height - radius);
+ ctx.fill();
+ }
+
+ protected void paint_shadow_in_corner(Cairo.Context ctx, int x, int y,
+ double rgb_all, float radius, float initial_alpha, double arc1, double arc2) {
+ Cairo.Pattern p = new Cairo.Pattern.radial(x, y, 0, x, y, radius);
+ p.add_color_stop_rgba(0.0, rgb_all, rgb_all, rgb_all, initial_alpha);
+ p.add_color_stop_rgba(1.0, rgb_all, rgb_all, rgb_all, 0);
+ ctx.set_source(p);
+ ctx.move_to(x, y);
+ ctx.arc(x, y, radius, arc1, arc2);
+ ctx.close_path();
+ ctx.fill();
+ }
+
+ protected virtual void paint_border(Cairo.Context ctx, Dimensions object_dimensions,
+ Gdk.Point object_origin, int border_width) {
+ if (border_width == 1) {
+ ctx.rectangle(object_origin.x - border_width, object_origin.y - border_width,
+ object_dimensions.width + (border_width * 2),
+ object_dimensions.height + (border_width * 2));
+ ctx.fill();
+ } else {
+ Dimensions dimensions = get_border_dimensions(object_dimensions, border_width);
+ Gdk.Point origin = get_border_origin(object_origin, border_width);
+
+ // amount of rounding needed on corners varies by size of object
+ double scale = int.max(object_dimensions.width, object_dimensions.height);
+ draw_rounded_corners_filled(ctx, dimensions, origin, 0.25 * scale);
+ }
+ }
+
+ protected virtual void paint_image(Cairo.Context ctx, Gdk.Pixbuf pixbuf, Gdk.Point origin) {
+ if (pixbuf.get_has_alpha()) {
+ ctx.rectangle(origin.x, origin.y, pixbuf.get_width(), pixbuf.get_height());
+ ctx.fill();
+ }
+ Gdk.cairo_set_source_pixbuf(ctx, pixbuf, origin.x, origin.y);
+ ctx.paint();
+ }
+
+ private int get_selection_border_width(int scale) {
+ return ((scale <= ((Thumbnail.MIN_SCALE + Thumbnail.MAX_SCALE) / 3)) ? 2 : 3)
+ + BORDER_WIDTH;
+ }
+
+ protected virtual Gdk.Pixbuf? get_top_left_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_top_right_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_bottom_left_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_bottom_right_trinket(int scale) {
+ return null;
+ }
+
+ public void paint(Cairo.Context ctx, Gdk.RGBA bg_color, Gdk.RGBA selected_color,
+ Gdk.RGBA text_color, Gdk.RGBA? border_color) {
+ // calc the top-left point of the pixbuf
+ Gdk.Point pixbuf_origin = Gdk.Point();
+ pixbuf_origin.x = allocation.x + FRAME_WIDTH + BORDER_WIDTH;
+ pixbuf_origin.y = allocation.y + FRAME_WIDTH + BORDER_WIDTH;
+
+ ctx.set_line_width(FRAME_WIDTH);
+ ctx.set_source_rgba(selected_color.red, selected_color.green, selected_color.blue,
+ selected_color.alpha);
+
+ // draw shadow
+ if (border_color != null) {
+ ctx.save();
+ Dimensions shadow_dim = Dimensions();
+ shadow_dim.width = pixbuf_dim.width + BORDER_WIDTH;
+ shadow_dim.height = pixbuf_dim.height + BORDER_WIDTH;
+ paint_shadow(ctx, shadow_dim, pixbuf_origin, SHADOW_RADIUS, SHADOW_INITIAL_ALPHA);
+ ctx.restore();
+ }
+
+ // draw selection border
+ if (is_selected()) {
+ // border thickness depends on the size of the thumbnail
+ ctx.save();
+ paint_border(ctx, pixbuf_dim, pixbuf_origin,
+ get_selection_border_width(int.max(pixbuf_dim.width, pixbuf_dim.height)));
+ ctx.restore();
+ }
+
+ // draw border
+ if (border_color != null) {
+ ctx.save();
+ ctx.set_source_rgba(border_color.red, border_color.green, border_color.blue,
+ border_color.alpha);
+ paint_border(ctx, pixbuf_dim, pixbuf_origin, BORDER_WIDTH);
+ ctx.restore();
+ }
+
+ if (display_pixbuf != null) {
+ ctx.save();
+ ctx.set_source_rgba(bg_color.red, bg_color.green, bg_color.blue, bg_color.alpha);
+ paint_image(ctx, display_pixbuf, pixbuf_origin);
+ ctx.restore();
+ }
+
+ ctx.set_source_rgba(text_color.red, text_color.green, text_color.blue, text_color.alpha);
+
+ // title and subtitles are LABEL_PADDING below bottom of pixbuf
+ int text_y = allocation.y + FRAME_WIDTH + pixbuf_dim.height + FRAME_WIDTH + LABEL_PADDING;
+ if (title != null && title_visible) {
+ // get the layout sized so its with is no more than the pixbuf's
+ // resize the text width to be no more than the pixbuf's
+ title.allocation.x = allocation.x + FRAME_WIDTH;
+ title.allocation.y = text_y;
+ title.allocation.width = pixbuf_dim.width;
+ title.allocation.height = title.get_height();
+
+ ctx.move_to(title.allocation.x, title.allocation.y);
+ Pango.cairo_show_layout(ctx, title.get_pango_layout(pixbuf_dim.width));
+
+ text_y += title.get_height() + LABEL_PADDING;
+ }
+
+ if (comment != null && comment_visible) {
+ comment.allocation.x = allocation.x + FRAME_WIDTH;
+ comment.allocation.y = text_y;
+ comment.allocation.width = pixbuf_dim.width;
+ comment.allocation.height = comment.get_height();
+
+ ctx.move_to(comment.allocation.x, comment.allocation.y);
+ Pango.cairo_show_layout(ctx, comment.get_pango_layout(pixbuf_dim.width));
+
+ text_y += comment.get_height() + LABEL_PADDING;
+ }
+
+ if (subtitle != null && subtitle_visible) {
+ subtitle.allocation.x = allocation.x + FRAME_WIDTH;
+ subtitle.allocation.y = text_y;
+ subtitle.allocation.width = pixbuf_dim.width;
+ subtitle.allocation.height = subtitle.get_height();
+
+ ctx.move_to(subtitle.allocation.x, subtitle.allocation.y);
+ Pango.cairo_show_layout(ctx, subtitle.get_pango_layout(pixbuf_dim.width));
+
+ // increment text_y if more text lines follow
+ }
+
+ ctx.set_source_rgba(selected_color.red, selected_color.green, selected_color.blue,
+ selected_color.alpha);
+
+ // draw trinkets last
+ Gdk.Pixbuf? trinket = get_bottom_left_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = pixbuf_origin.x + TRINKET_PADDING + get_horizontal_trinket_offset();
+ int y = pixbuf_origin.y + pixbuf_dim.height - trinket.get_height() -
+ TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.get_width(), trinket.get_height());
+ ctx.fill();
+ }
+
+ trinket = get_top_left_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = pixbuf_origin.x + TRINKET_PADDING + get_horizontal_trinket_offset();
+ int y = pixbuf_origin.y + TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.get_width(), trinket.get_height());
+ ctx.fill();
+ }
+
+ trinket = get_top_right_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = pixbuf_origin.x + pixbuf_dim.width - trinket.width -
+ get_horizontal_trinket_offset() - TRINKET_PADDING;
+ int y = pixbuf_origin.y + TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.get_width(), trinket.get_height());
+ ctx.fill();
+ }
+
+ trinket = get_bottom_right_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = pixbuf_origin.x + pixbuf_dim.width - trinket.width -
+ get_horizontal_trinket_offset() - TRINKET_PADDING;
+ int y = pixbuf_origin.y + pixbuf_dim.height - trinket.height -
+ TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.get_width(), trinket.get_height());
+ ctx.fill();
+ }
+ }
+
+ protected void set_horizontal_trinket_offset(int horizontal_trinket_offset) {
+ assert(horizontal_trinket_offset >= 0);
+ this.horizontal_trinket_offset = horizontal_trinket_offset;
+ }
+
+ protected int get_horizontal_trinket_offset() {
+ return horizontal_trinket_offset;
+ }
+
+ public void set_grid_coordinates(int col, int row) {
+ this.col = col;
+ this.row = row;
+ }
+
+ public int get_column() {
+ return col;
+ }
+
+ public int get_row() {
+ return row;
+ }
+
+ public void brighten() {
+ // "should" implies "can" and "didn't already"
+ if (brightened != null || pixbuf == null)
+ return;
+
+ // create a new lightened pixbuf to display
+ brightened = pixbuf.copy();
+ shift_colors(brightened, BRIGHTEN_SHIFT, BRIGHTEN_SHIFT, BRIGHTEN_SHIFT, 0);
+
+ display_pixbuf = brightened;
+
+ notify_view_altered();
+ }
+
+ public void unbrighten() {
+ // "should", "can", "didn't already"
+ if (brightened == null || pixbuf == null)
+ return;
+
+ brightened = null;
+
+ // return to the normal image
+ display_pixbuf = pixbuf;
+
+ notify_view_altered();
+ }
+
+ public override void visibility_changed(bool visible) {
+ // if going from visible to hidden, unbrighten
+ if (!visible)
+ unbrighten();
+
+ base.visibility_changed(visible);
+ }
+
+ private bool query_tooltip_on_text(CheckerboardItemText text, Gtk.Tooltip tooltip) {
+ if (!text.get_pango_layout().is_ellipsized())
+ return false;
+
+ if (text.is_marked_up())
+ tooltip.set_markup(text.get_text());
+ else
+ tooltip.set_text(text.get_text());
+
+ return true;
+ }
+
+ public bool query_tooltip(int x, int y, Gtk.Tooltip tooltip) {
+ if (title != null && title_visible && coord_in_rectangle(x, y, title.allocation))
+ return query_tooltip_on_text(title, tooltip);
+
+ if (comment != null && comment_visible && coord_in_rectangle(x, y, comment.allocation))
+ return query_tooltip_on_text(comment, tooltip);
+
+ if (subtitle != null && subtitle_visible && coord_in_rectangle(x, y, subtitle.allocation))
+ return query_tooltip_on_text(subtitle, tooltip);
+
+ return false;
+ }
+}
+
+public class CheckerboardLayout : Gtk.DrawingArea {
+ public const int TOP_PADDING = 16;
+ public const int BOTTOM_PADDING = 16;
+ public const int ROW_GUTTER_PADDING = 24;
+
+ // the following are minimums, as the pads and gutters expand to fill up the window width
+ public const int COLUMN_GUTTER_PADDING = 24;
+
+ // For a 40% alpha channel
+ private const double SELECTION_ALPHA = 0.40;
+
+ // The number of pixels that the scrollbars of Gtk.ScrolledWindows allocate for themselves
+ // before their final size is computed. This must be taken into account when computing
+ // the width of this widget. This value was 0 in Gtk+ 2.x but is 1 in Gtk+ 3.x. See
+ // ticket #3870 (http://redmine.yorba.org/issues/3870) for more information
+ private const int SCROLLBAR_PLACEHOLDER_WIDTH = 1;
+
+ private class LayoutRow {
+ public int y;
+ public int height;
+ public CheckerboardItem[] items;
+
+ public LayoutRow(int y, int height, int num_in_row) {
+ this.y = y;
+ this.height = height;
+ this.items = new CheckerboardItem[num_in_row];
+ }
+ }
+
+ private ViewCollection view;
+ private string page_name = "";
+ private LayoutRow[] item_rows = null;
+ private Gee.HashSet<CheckerboardItem> exposed_items = new Gee.HashSet<CheckerboardItem>();
+ private Gtk.Adjustment hadjustment = null;
+ private Gtk.Adjustment vadjustment = null;
+ private string message = null;
+ private Gdk.RGBA selected_color;
+ private Gdk.RGBA unselected_color;
+ private Gdk.RGBA border_color;
+ private Gdk.RGBA bg_color;
+ private Gdk.Rectangle visible_page = Gdk.Rectangle();
+ private int last_width = 0;
+ private int columns = 0;
+ private int rows = 0;
+ private Gdk.Point drag_origin = Gdk.Point();
+ private Gdk.Point drag_endpoint = Gdk.Point();
+ private Gdk.Rectangle selection_band = Gdk.Rectangle();
+ private int scale = 0;
+ private bool flow_scheduled = false;
+ private bool exposure_dirty = true;
+ private CheckerboardItem? anchor = null;
+ private bool in_center_on_anchor = false;
+ private bool size_allocate_due_to_reflow = false;
+ private bool is_in_view = false;
+ private bool reflow_needed = false;
+
+ public CheckerboardLayout(ViewCollection view) {
+ this.view = view;
+
+ clear_drag_select();
+
+ // subscribe to the new collection
+ view.contents_altered.connect(on_contents_altered);
+ view.items_altered.connect(on_items_altered);
+ view.items_state_changed.connect(on_items_state_changed);
+ view.items_visibility_changed.connect(on_items_visibility_changed);
+ view.ordering_changed.connect(on_ordering_changed);
+ view.views_altered.connect(on_views_altered);
+ view.geometries_altered.connect(on_geometries_altered);
+ view.items_selected.connect(on_items_selection_changed);
+ view.items_unselected.connect(on_items_selection_changed);
+
+ override_background_color(Gtk.StateFlags.NORMAL, Config.Facade.get_instance().get_bg_color());
+
+ Config.Facade.get_instance().colors_changed.connect(on_colors_changed);
+
+ // CheckerboardItems offer tooltips
+ has_tooltip = true;
+ }
+
+ ~CheckerboardLayout() {
+#if TRACE_DTORS
+ debug("DTOR: CheckerboardLayout for %s", view.to_string());
+#endif
+
+ view.contents_altered.disconnect(on_contents_altered);
+ view.items_altered.disconnect(on_items_altered);
+ view.items_state_changed.disconnect(on_items_state_changed);
+ view.items_visibility_changed.disconnect(on_items_visibility_changed);
+ view.ordering_changed.disconnect(on_ordering_changed);
+ view.views_altered.disconnect(on_views_altered);
+ view.geometries_altered.disconnect(on_geometries_altered);
+ view.items_selected.disconnect(on_items_selection_changed);
+ view.items_unselected.disconnect(on_items_selection_changed);
+
+ if (hadjustment != null)
+ hadjustment.value_changed.disconnect(on_viewport_shifted);
+
+ if (vadjustment != null)
+ vadjustment.value_changed.disconnect(on_viewport_shifted);
+
+ if (parent != null)
+ parent.size_allocate.disconnect(on_viewport_resized);
+
+ Config.Facade.get_instance().colors_changed.disconnect(on_colors_changed);
+ }
+
+ public void set_adjustments(Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment) {
+ this.hadjustment = hadjustment;
+ this.vadjustment = vadjustment;
+
+ // monitor adjustment changes to report when the visible page shifts
+ hadjustment.value_changed.connect(on_viewport_shifted);
+ vadjustment.value_changed.connect(on_viewport_shifted);
+
+ // monitor parent's size changes for a similar reason
+ parent.size_allocate.connect(on_viewport_resized);
+ }
+
+ // This method allows for some optimizations to occur in reflow() by using the known max.
+ // width of all items in the layout.
+ public void set_scale(int scale) {
+ this.scale = scale;
+ }
+
+ public int get_scale() {
+ return scale;
+ }
+
+ public void set_name(string name) {
+ page_name = name;
+ }
+
+ private void on_viewport_resized() {
+ Gtk.Requisition req;
+ get_preferred_size(null, out req);
+
+ Gtk.Allocation parent_allocation;
+ parent.get_allocation(out parent_allocation);
+
+ if (message == null) {
+ // set the layout's new size to be the same as the parent's width but maintain
+ // it's own height
+#if TRACE_REFLOW
+ debug("on_viewport_resized: due_to_reflow=%s set_size_request %dx%d",
+ size_allocate_due_to_reflow.to_string(), parent_allocation.width, req.height);
+#endif
+ set_size_request(parent_allocation.width - SCROLLBAR_PLACEHOLDER_WIDTH, req.height);
+ } else {
+ // set the layout's width and height to always match the parent's
+ set_size_request(parent_allocation.width, parent_allocation.height);
+ }
+
+ // possible for this widget's size_allocate not to be called, so need to update the page
+ // rect here
+ viewport_resized();
+
+ if (!size_allocate_due_to_reflow)
+ clear_anchor();
+ else
+ size_allocate_due_to_reflow = false;
+ }
+
+ private void on_viewport_shifted() {
+ update_visible_page();
+ need_exposure("on_viewport_shift");
+
+ clear_anchor();
+ }
+
+ private void on_items_selection_changed() {
+ clear_anchor();
+ }
+
+ private void clear_anchor() {
+ if (in_center_on_anchor)
+ return;
+
+ anchor = null;
+ }
+
+ private void update_anchor() {
+ assert(!in_center_on_anchor);
+
+ Gee.List<CheckerboardItem> items_on_page = intersection(visible_page);
+ if (items_on_page.size == 0) {
+ anchor = null;
+ return;
+ }
+
+ foreach (CheckerboardItem item in items_on_page) {
+ if (item.is_selected()) {
+ anchor = item;
+ return;
+ }
+ }
+
+ if (vadjustment.get_value() == 0) {
+ anchor = null;
+ return;
+ }
+
+ // this could be improved to always find the visual center...in the case where only
+ // a few photos are in the last visible row, this can choose a photo near the right
+ anchor = items_on_page.get((int) items_on_page.size / 2);
+ }
+
+ private void center_on_anchor(double upper) {
+ if (anchor == null)
+ return;
+
+ in_center_on_anchor = true;
+
+ double anchor_pos = anchor.allocation.y + (anchor.allocation.height / 2) -
+ (vadjustment.get_page_size() / 2);
+ vadjustment.set_value(anchor_pos.clamp(vadjustment.get_lower(),
+ vadjustment.get_upper() - vadjustment.get_page_size()));
+
+ in_center_on_anchor = false;
+ }
+
+ private void on_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ if (added != null)
+ message = null;
+
+ if (removed != null) {
+ foreach (DataObject object in removed)
+ exposed_items.remove((CheckerboardItem) object);
+ }
+
+ // release spatial data structure ... contents_altered means a reflow is required, and since
+ // items may be removed, this ensures we're not holding the ref on a removed view
+ item_rows = null;
+
+ need_reflow("on_contents_altered");
+ }
+
+ private void on_items_altered() {
+ need_reflow("on_items_altered");
+ }
+
+ private void on_items_state_changed(Gee.Iterable<DataView> changed) {
+ items_dirty("on_items_state_changed", changed);
+ }
+
+ private void on_items_visibility_changed(Gee.Iterable<DataView> changed) {
+ need_reflow("on_items_visibility_changed");
+ }
+
+ private void on_ordering_changed() {
+ need_reflow("on_ordering_changed");
+ }
+
+ private void on_views_altered(Gee.Collection<DataView> altered) {
+ items_dirty("on_views_altered", altered);
+ }
+
+ private void on_geometries_altered() {
+ need_reflow("on_geometries_altered");
+ }
+
+ private void need_reflow(string caller) {
+ if (flow_scheduled)
+ return;
+
+ if (!is_in_view) {
+ reflow_needed = true;
+ return;
+ }
+
+#if TRACE_REFLOW
+ debug("need_reflow %s: %s", page_name, caller);
+#endif
+ flow_scheduled = true;
+ Idle.add_full(Priority.HIGH, do_reflow);
+ }
+
+ private bool do_reflow() {
+ reflow("do_reflow");
+ need_exposure("do_reflow");
+
+ flow_scheduled = false;
+
+ return false;
+ }
+
+ private void need_exposure(string caller) {
+#if TRACE_REFLOW
+ debug("need_exposure %s: %s", page_name, caller);
+#endif
+ exposure_dirty = true;
+ queue_draw();
+ }
+
+ public void set_message(string? text) {
+ if (text == message)
+ return;
+
+ message = text;
+
+ if (text != null) {
+ // message is being set, change size to match parent's; if no parent, then the size
+ // will be set later when added to the parent
+ if (parent != null) {
+ Gtk.Allocation parent_allocation;
+ parent.get_allocation(out parent_allocation);
+
+ set_size_request(parent_allocation.width, parent_allocation.height);
+ }
+ } else {
+ // message is being cleared, layout all the items again
+ need_reflow("set_message");
+ }
+ }
+
+ public void unset_message() {
+ set_message(null);
+ }
+
+ private void update_visible_page() {
+ if (hadjustment != null && vadjustment != null)
+ visible_page = get_adjustment_page(hadjustment, vadjustment);
+ }
+
+ public void set_in_view(bool in_view) {
+ is_in_view = in_view;
+
+ if (in_view) {
+ if (reflow_needed)
+ need_reflow("set_in_view (true)");
+ else
+ need_exposure("set_in_view (true)");
+ } else
+ unexpose_items("set_in_view (false)");
+ }
+
+ public CheckerboardItem? get_item_at_pixel(double xd, double yd) {
+ if (message != null || item_rows == null)
+ return null;
+
+ int x = (int) xd;
+ int y = (int) yd;
+
+ // binary search the rows for the one in range of the pixel
+ LayoutRow in_range = null;
+ int min = 0;
+ int max = item_rows.length;
+ for(;;) {
+ int mid = min + ((max - min) / 2);
+ LayoutRow row = item_rows[mid];
+
+ if (row == null || y < row.y) {
+ // undershot
+ // row == null happens when there is an exact number of elements to fill the last row
+ max = mid - 1;
+ } else if (y > (row.y + row.height)) {
+ // undershot
+ min = mid + 1;
+ } else {
+ // bingo
+ in_range = row;
+
+ break;
+ }
+
+ if (min > max)
+ break;
+ }
+
+ if (in_range == null)
+ return null;
+
+ // look for item in row's column in range of the pixel
+ foreach (CheckerboardItem item in in_range.items) {
+ // this happens on an incompletely filled-in row (usually the last one with empty
+ // space remaining)
+ if (item == null)
+ continue;
+
+ if (x < item.allocation.x) {
+ // overshot ... this happens because there's gaps in the columns
+ break;
+ }
+
+ // need to verify actually over item's full dimensions, since they vary in size inside
+ // a row
+ if (x <= (item.allocation.x + item.allocation.width) && y >= item.allocation.y
+ && y <= (item.allocation.y + item.allocation.height))
+ return item;
+ }
+
+ return null;
+ }
+
+ public Gee.List<CheckerboardItem> get_visible_items() {
+ return intersection(visible_page);
+ }
+
+ public Gee.List<CheckerboardItem> intersection(Gdk.Rectangle area) {
+ Gee.ArrayList<CheckerboardItem> intersects = new Gee.ArrayList<CheckerboardItem>();
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ Gdk.Rectangle bitbucket = Gdk.Rectangle();
+ foreach (LayoutRow row in item_rows) {
+ if (row == null)
+ continue;
+
+ if ((area.y + area.height) < row.y) {
+ // overshoot
+ break;
+ }
+
+ if ((row.y + row.height) < area.y) {
+ // haven't reached it yet
+ continue;
+ }
+
+ // see if the row intersects the area
+ Gdk.Rectangle row_rect = Gdk.Rectangle();
+ row_rect.x = 0;
+ row_rect.y = row.y;
+ row_rect.width = allocation.width;
+ row_rect.height = row.height;
+
+ if (area.intersect(row_rect, out bitbucket)) {
+ // see what elements, if any, intersect the area
+ foreach (CheckerboardItem item in row.items) {
+ if (item == null)
+ continue;
+
+ if (area.intersect(item.allocation, out bitbucket))
+ intersects.add(item);
+ }
+ }
+ }
+
+ return intersects;
+ }
+
+ public CheckerboardItem? get_item_relative_to(CheckerboardItem item, CompassPoint point) {
+ if (view.get_count() == 0)
+ return null;
+
+ assert(columns > 0);
+ assert(rows > 0);
+
+ int col = item.get_column();
+ int row = item.get_row();
+
+ if (col < 0 || row < 0) {
+ critical("Attempting to locate item not placed in layout: %s", item.get_title());
+
+ return null;
+ }
+
+ switch (point) {
+ case CompassPoint.NORTH:
+ if (--row < 0)
+ row = 0;
+ break;
+
+ case CompassPoint.SOUTH:
+ if (++row >= rows)
+ row = rows - 1;
+ break;
+
+ case CompassPoint.EAST:
+ if (++col >= columns) {
+ if(++row >= rows) {
+ row = rows - 1;
+ col = columns - 1;
+ } else {
+ col = 0;
+ }
+ }
+ break;
+
+ case CompassPoint.WEST:
+ if (--col < 0) {
+ if (--row < 0) {
+ row = 0;
+ col = 0;
+ } else {
+ col = columns - 1;
+ }
+ }
+ break;
+
+ default:
+ error("Bad compass point %d", (int) point);
+ }
+
+ CheckerboardItem? new_item = get_item_at_coordinate(col, row);
+
+ if (new_item == null && point == CompassPoint.SOUTH) {
+ // nothing directly below, get last item on next row
+ new_item = (CheckerboardItem?) view.get_last();
+ if (new_item.get_row() <= item.get_row())
+ new_item = null;
+ }
+
+ return (new_item != null) ? new_item : item;
+ }
+
+ public CheckerboardItem? get_item_at_coordinate(int col, int row) {
+ if (row >= item_rows.length)
+ return null;
+
+ LayoutRow item_row = item_rows[row];
+ if (item_row == null)
+ return null;
+
+ if (col >= item_row.items.length)
+ return null;
+
+ return item_row.items[col];
+ }
+
+ public void set_drag_select_origin(int x, int y) {
+ clear_drag_select();
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ drag_origin.x = x.clamp(0, allocation.width);
+ drag_origin.y = y.clamp(0, allocation.height);
+ }
+
+ public void set_drag_select_endpoint(int x, int y) {
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ drag_endpoint.x = x.clamp(0, allocation.width);
+ drag_endpoint.y = y.clamp(0, allocation.height);
+
+ // drag_origin and drag_endpoint are maintained only to generate selection_band; all reporting
+ // and drawing functions refer to it, not drag_origin and drag_endpoint
+ Gdk.Rectangle old_selection_band = selection_band;
+ selection_band = Box.from_points(drag_origin, drag_endpoint).get_rectangle();
+
+ // force repaint of the union of the old and new, which covers the band reducing in size
+ if (get_window() != null) {
+ Gdk.Rectangle union;
+ selection_band.union(old_selection_band, out union);
+
+ queue_draw_area(union.x, union.y, union.width, union.height);
+ }
+ }
+
+ public Gee.List<CheckerboardItem>? items_in_selection_band() {
+ if (!Dimensions.for_rectangle(selection_band).has_area())
+ return null;
+
+ return intersection(selection_band);
+ }
+
+ public bool is_drag_select_active() {
+ return drag_origin.x >= 0 && drag_origin.y >= 0;
+ }
+
+ public void clear_drag_select() {
+ selection_band = Gdk.Rectangle();
+ drag_origin.x = -1;
+ drag_origin.y = -1;
+ drag_endpoint.x = -1;
+ drag_endpoint.y = -1;
+
+ // force a total repaint to clear the selection band
+ queue_draw();
+ }
+
+ private void viewport_resized() {
+ // update visible page rect
+ update_visible_page();
+
+ // only reflow() if the width has changed
+ if (visible_page.width != last_width) {
+ int old_width = last_width;
+ last_width = visible_page.width;
+
+ need_reflow("viewport_resized (%d -> %d)".printf(old_width, visible_page.width));
+ } else {
+ // don't need to reflow but exposure may have changed
+ need_exposure("viewport_resized (same width=%d)".printf(last_width));
+ }
+ }
+
+ private void expose_items(string caller) {
+ // create a new hash set of exposed items that represents an intersection of the old set
+ // and the new
+ Gee.HashSet<CheckerboardItem> new_exposed_items = new Gee.HashSet<CheckerboardItem>();
+
+ view.freeze_notifications();
+
+ Gee.List<CheckerboardItem> items = get_visible_items();
+ foreach (CheckerboardItem item in items) {
+ new_exposed_items.add(item);
+
+ // if not in the old list, then need to expose
+ if (!exposed_items.remove(item))
+ item.exposed();
+ }
+
+ // everything remaining in the old exposed list is now unexposed
+ foreach (CheckerboardItem item in exposed_items)
+ item.unexposed();
+
+ // swap out lists
+ exposed_items = new_exposed_items;
+ exposure_dirty = false;
+
+#if TRACE_REFLOW
+ debug("expose_items %s: exposed %d items, thawing", page_name, exposed_items.size);
+#endif
+ view.thaw_notifications();
+#if TRACE_REFLOW
+ debug("expose_items %s: thaw finished", page_name);
+#endif
+ }
+
+ private void unexpose_items(string caller) {
+ view.freeze_notifications();
+
+ foreach (CheckerboardItem item in exposed_items)
+ item.unexposed();
+
+ exposed_items.clear();
+ exposure_dirty = false;
+
+#if TRACE_REFLOW
+ debug("unexpose_items %s: thawing", page_name);
+#endif
+ view.thaw_notifications();
+#if TRACE_REFLOW
+ debug("unexpose_items %s: thawed", page_name);
+#endif
+ }
+
+ private void reflow(string caller) {
+ reflow_needed = false;
+
+ // if set in message mode, nothing to do here
+ if (message != null)
+ return;
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ int visible_width = (visible_page.width > 0) ? visible_page.width : allocation.width;
+
+#if TRACE_REFLOW
+ debug("reflow: Using visible page width of %d (allocated: %d)", visible_width,
+ allocation.width);
+#endif
+
+ // don't bother until layout is of some appreciable size (even this is too low)
+ if (visible_width <= 1)
+ return;
+
+ int total_items = view.get_count();
+
+ // need to set_size in case all items were removed and the viewport size has changed
+ if (total_items == 0) {
+ set_size_request(visible_width, 0);
+ item_rows = new LayoutRow[0];
+
+ return;
+ }
+
+#if TRACE_REFLOW
+ debug("reflow %s: %s (%d items)", page_name, caller, total_items);
+#endif
+
+ // look for anchor if there is none currently
+ if (anchor == null || !anchor.is_visible())
+ update_anchor();
+
+ // clear the rows data structure, as the reflow will completely rearrange it
+ item_rows = null;
+
+ // Step 1: Determine the widest row in the layout, and from it the number of columns.
+ // If owner supplies an image scaling for all items in the layout, then this can be
+ // calculated quickly.
+ int max_cols = 0;
+ if (scale > 0) {
+ // calculate interior width
+ int remaining_width = visible_width - (COLUMN_GUTTER_PADDING * 2);
+ int max_item_width = CheckerboardItem.get_max_width(scale);
+ max_cols = remaining_width / max_item_width;
+ if (max_cols <= 0)
+ max_cols = 1;
+
+ // if too large with gutters, decrease until columns fit
+ while (max_cols > 1
+ && ((max_cols * max_item_width) + ((max_cols - 1) * COLUMN_GUTTER_PADDING) > remaining_width)) {
+#if TRACE_REFLOW
+ debug("reflow %s: scaled cols estimate: reducing max_cols from %d to %d", page_name,
+ max_cols, max_cols - 1);
+#endif
+ max_cols--;
+ }
+
+ // special case: if fewer items than columns, they are the columns
+ if (total_items < max_cols)
+ max_cols = total_items;
+
+#if TRACE_REFLOW
+ debug("reflow %s: scaled cols estimate: max_cols=%d remaining_width=%d max_item_width=%d",
+ page_name, max_cols, remaining_width, max_item_width);
+#endif
+ } else {
+ int x = COLUMN_GUTTER_PADDING;
+ int col = 0;
+ int row_width = 0;
+ int widest_row = 0;
+
+ for (int ctr = 0; ctr < total_items; ctr++) {
+ CheckerboardItem item = (CheckerboardItem) view.get_at(ctr);
+ Dimensions req = item.requisition;
+
+ // the items must be requisitioned for this code to work
+ assert(req.has_area());
+
+ // carriage return (i.e. this item will overflow the view)
+ if ((x + req.width + COLUMN_GUTTER_PADDING) > visible_width) {
+ if (row_width > widest_row) {
+ widest_row = row_width;
+ max_cols = col;
+ }
+
+ col = 0;
+ x = COLUMN_GUTTER_PADDING;
+ row_width = 0;
+ }
+
+ x += req.width + COLUMN_GUTTER_PADDING;
+ row_width += req.width;
+
+ col++;
+ }
+
+ // account for dangling last row
+ if (row_width > widest_row)
+ max_cols = col;
+
+#if TRACE_REFLOW
+ debug("reflow %s: manual cols estimate: max_cols=%d widest_row=%d", page_name, max_cols,
+ widest_row);
+#endif
+ }
+
+ assert(max_cols > 0);
+ int max_rows = (total_items / max_cols) + 1;
+
+ // Step 2: Now that the number of columns is known, find the maximum height for each row
+ // and the maximum width for each column
+ int row = 0;
+ int tallest = 0;
+ int widest = 0;
+ int row_alignment_point = 0;
+ int total_width = 0;
+ int col = 0;
+ int[] column_widths = new int[max_cols];
+ int[] row_heights = new int[max_rows];
+ int[] alignment_points = new int[max_rows];
+ int gutter = 0;
+
+ for (;;) {
+ for (int ctr = 0; ctr < total_items; ctr++ ) {
+ CheckerboardItem item = (CheckerboardItem) view.get_at(ctr);
+ Dimensions req = item.requisition;
+ int alignment_point = item.get_alignment_point();
+
+ // alignment point better be sane
+ assert(alignment_point < req.height);
+
+ if (req.height > tallest)
+ tallest = req.height;
+
+ if (req.width > widest)
+ widest = req.width;
+
+ if (alignment_point > row_alignment_point)
+ row_alignment_point = alignment_point;
+
+ // store largest thumb size of each column as well as track the total width of the
+ // layout (which is the sum of the width of each column)
+ if (column_widths[col] < req.width) {
+ total_width -= column_widths[col];
+ column_widths[col] = req.width;
+ total_width += req.width;
+ }
+
+ if (++col >= max_cols) {
+ alignment_points[row] = row_alignment_point;
+ row_heights[row++] = tallest;
+
+ col = 0;
+ row_alignment_point = 0;
+ tallest = 0;
+ }
+ }
+
+ // account for final dangling row
+ if (col != 0) {
+ alignment_points[row] = row_alignment_point;
+ row_heights[row] = tallest;
+ }
+
+ // Step 3: Calculate the gutter between the items as being equidistant of the
+ // remaining space (adding one gutter to account for the right-hand one)
+ gutter = (visible_width - total_width) / (max_cols + 1);
+
+ // if only one column, gutter size could be less than minimums
+ if (max_cols == 1)
+ break;
+
+ // have to reassemble if the gutter is too small ... this happens because Step One
+ // takes a guess at the best column count, but when the max. widths of the columns are
+ // added up, they could overflow
+ if (gutter < COLUMN_GUTTER_PADDING) {
+ max_cols--;
+ max_rows = (total_items / max_cols) + 1;
+
+#if TRACE_REFLOW
+ debug("reflow %s: readjusting columns: alloc.width=%d total_width=%d widest=%d gutter=%d max_cols now=%d",
+ page_name, visible_width, total_width, widest, gutter, max_cols);
+#endif
+
+ col = 0;
+ row = 0;
+ tallest = 0;
+ widest = 0;
+ total_width = 0;
+ row_alignment_point = 0;
+ column_widths = new int[max_cols];
+ row_heights = new int[max_rows];
+ alignment_points = new int[max_rows];
+ } else {
+ break;
+ }
+ }
+
+#if TRACE_REFLOW
+ debug("reflow %s: width:%d total_width:%d max_cols:%d gutter:%d", page_name, visible_width,
+ total_width, max_cols, gutter);
+#endif
+
+ // Step 4: Recalculate the height of each row according to the row's alignment point (which
+ // may cause shorter items to extend below the bottom of the tallest one, extending the
+ // height of the row)
+ col = 0;
+ row = 0;
+
+ for (int ctr = 0; ctr < total_items; ctr++) {
+ CheckerboardItem item = (CheckerboardItem) view.get_at(ctr);
+ Dimensions req = item.requisition;
+
+ // this determines how much padding the item requires to be bottom-alignment along the
+ // alignment point; add to the height and you have the item's "true" height on the
+ // laid-down row
+ int true_height = req.height + (alignment_points[row] - item.get_alignment_point());
+ assert(true_height >= req.height);
+
+ // add that to its height to determine it's actual height on the laid-down row
+ if (true_height > row_heights[row]) {
+#if TRACE_REFLOW
+ debug("reflow %s: Adjusting height of row %d from %d to %d", page_name, row,
+ row_heights[row], true_height);
+#endif
+ row_heights[row] = true_height;
+ }
+
+ // carriage return
+ if (++col >= max_cols) {
+ col = 0;
+ row++;
+ }
+ }
+
+ // for the spatial structure
+ item_rows = new LayoutRow[max_rows];
+
+ // Step 5: Lay out the items in the space using all the information gathered
+ int x = gutter;
+ int y = TOP_PADDING;
+ col = 0;
+ row = 0;
+ LayoutRow current_row = null;
+
+ for (int ctr = 0; ctr < total_items; ctr++) {
+ CheckerboardItem item = (CheckerboardItem) view.get_at(ctr);
+ Dimensions req = item.requisition;
+
+ // this centers the item in the column
+ int xpadding = (column_widths[col] - req.width) / 2;
+ assert(xpadding >= 0);
+
+ // this bottom-aligns the item along the discovered alignment point
+ int ypadding = alignment_points[row] - item.get_alignment_point();
+ assert(ypadding >= 0);
+
+ // save pixel and grid coordinates
+ item.allocation.x = x + xpadding;
+ item.allocation.y = y + ypadding;
+ item.allocation.width = req.width;
+ item.allocation.height = req.height;
+ item.set_grid_coordinates(col, row);
+
+ // add to current row in spatial data structure
+ if (current_row == null)
+ current_row = new LayoutRow(y, row_heights[row], max_cols);
+
+ current_row.items[col] = item;
+
+ x += column_widths[col] + gutter;
+
+ // carriage return
+ if (++col >= max_cols) {
+ assert(current_row != null);
+ item_rows[row] = current_row;
+ current_row = null;
+
+ x = gutter;
+ y += row_heights[row] + ROW_GUTTER_PADDING;
+ col = 0;
+ row++;
+ }
+ }
+
+ // add last row to spatial data structure
+ if (current_row != null)
+ item_rows[row] = current_row;
+
+ // save dimensions of checkerboard
+ columns = max_cols;
+ rows = row + 1;
+ assert(rows == max_rows);
+
+ // Step 6: Define the total size of the page as the size of the visible width (to avoid
+ // the horizontal scrollbar from appearing) and the height of all the items plus padding
+ int total_height = y + row_heights[row] + BOTTOM_PADDING;
+ if (visible_width != allocation.width || total_height != allocation.height) {
+#if TRACE_REFLOW
+ debug("reflow %s: Changing layout dimensions from %dx%d to %dx%d", page_name,
+ allocation.width, allocation.height, visible_width, total_height);
+#endif
+ set_size_request(visible_width, total_height);
+ size_allocate_due_to_reflow = true;
+
+ // when height changes, center on the anchor to minimize amount of visual change
+ center_on_anchor(total_height);
+ }
+ }
+
+ private void items_dirty(string reason, Gee.Iterable<DataView> items) {
+ Gdk.Rectangle dirty = Gdk.Rectangle();
+ foreach (DataView data_view in items) {
+ CheckerboardItem item = (CheckerboardItem) data_view;
+
+ if (!item.is_visible())
+ continue;
+
+ assert(view.contains(item));
+
+ // if not allocated, need to reflow the entire layout; don't bother queueing a draw
+ // for any of these, reflow will handle that
+ if (item.allocation.width <= 0 || item.allocation.height <= 0) {
+ need_reflow("items_dirty: %s".printf(reason));
+
+ return;
+ }
+
+ // only mark area as dirty if visible in viewport
+ Gdk.Rectangle intersection = Gdk.Rectangle();
+ if (!visible_page.intersect(item.allocation, out intersection))
+ continue;
+
+ // grow the dirty area
+ if (dirty.width == 0 || dirty.height == 0)
+ dirty = intersection;
+ else
+ dirty.union(intersection, out dirty);
+ }
+
+ if (dirty.width > 0 && dirty.height > 0) {
+#if TRACE_REFLOW
+ debug("items_dirty %s (%s): Queuing draw of dirty area %s on visible_page %s",
+ page_name, reason, rectangle_to_string(dirty), rectangle_to_string(visible_page));
+#endif
+ queue_draw_area(dirty.x, dirty.y, dirty.width, dirty.height);
+ }
+ }
+
+ public override void map() {
+ base.map();
+
+ set_colors();
+ }
+
+ private void set_colors(bool in_focus = true) {
+ // set up selected/unselected colors
+ selected_color = Config.Facade.get_instance().get_selected_color(in_focus);
+ unselected_color = Config.Facade.get_instance().get_unselected_color();
+ border_color = Config.Facade.get_instance().get_border_color();
+ bg_color = get_style_context().get_background_color(Gtk.StateFlags.NORMAL);
+ }
+
+ public override void size_allocate(Gtk.Allocation allocation) {
+ base.size_allocate(allocation);
+
+ viewport_resized();
+ }
+
+ public override bool draw(Cairo.Context ctx) {
+ // Note: It's possible for draw to be called when in_view is false; this happens
+ // when pages are switched prior to switched_to() being called, and some of the other
+ // controls allow for events to be processed while they are orienting themselves. Since
+ // we want switched_to() to be the final call in the process (indicating that the page is
+ // now in place and should do its thing to update itself), have to be be prepared for
+ // GTK/GDK calls between the widgets being actually present on the screen and "switched to"
+
+ // watch for message mode
+ if (message == null) {
+#if TRACE_REFLOW
+ debug("draw %s: %s", page_name, rectangle_to_string(visible_page));
+#endif
+
+ if (exposure_dirty)
+ expose_items("draw");
+
+ // have all items in the exposed area paint themselves
+ foreach (CheckerboardItem item in intersection(visible_page)) {
+ item.paint(ctx, bg_color, item.is_selected() ? selected_color : unselected_color,
+ unselected_color, border_color);
+ }
+ } else {
+ // draw the message in the center of the window
+ Pango.Layout pango_layout = create_pango_layout(message);
+ int text_width, text_height;
+ pango_layout.get_pixel_size(out text_width, out text_height);
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ int x = allocation.width - text_width;
+ x = (x > 0) ? x / 2 : 0;
+
+ int y = allocation.height - text_height;
+ y = (y > 0) ? y / 2 : 0;
+
+ ctx.set_source_rgb(unselected_color.red, unselected_color.green, unselected_color.blue);
+ ctx.move_to(x, y);
+ Pango.cairo_show_layout(ctx, pango_layout);
+ }
+
+ bool result = (base.draw != null) ? base.draw(ctx) : true;
+
+ // draw the selection band last, so it appears floating over everything else
+ draw_selection_band(ctx);
+
+ return result;
+ }
+
+ private void draw_selection_band(Cairo.Context ctx) {
+ // no selection band, nothing to draw
+ if (selection_band.width <= 1 || selection_band.height <= 1)
+ return;
+
+ // This requires adjustments
+ if (hadjustment == null || vadjustment == null)
+ return;
+
+ // find the visible intersection of the viewport and the selection band
+ Gdk.Rectangle visible_page = get_adjustment_page(hadjustment, vadjustment);
+ Gdk.Rectangle visible_band = Gdk.Rectangle();
+ visible_page.intersect(selection_band, out visible_band);
+
+ // pixelate selection rectangle interior
+ if (visible_band.width > 1 && visible_band.height > 1) {
+ ctx.set_source_rgba(selected_color.red, selected_color.green, selected_color.blue,
+ SELECTION_ALPHA);
+ ctx.rectangle(visible_band.x, visible_band.y, visible_band.width,
+ visible_band.height);
+ ctx.fill();
+ }
+
+ // border
+ // See this for an explanation of the adjustments to the band's dimensions
+ // http://cairographics.org/FAQ/#sharp_lines
+ ctx.set_line_width(1.0);
+ ctx.set_line_cap(Cairo.LineCap.SQUARE);
+ ctx.set_source_rgb(selected_color.red, selected_color.green, selected_color.blue);
+ ctx.rectangle((double) selection_band.x + 0.5, (double) selection_band.y + 0.5,
+ (double) selection_band.width - 1.0, (double) selection_band.height - 1.0);
+ ctx.stroke();
+ }
+
+ public override bool query_tooltip(int x, int y, bool keyboard_mode, Gtk.Tooltip tooltip) {
+ CheckerboardItem? item = get_item_at_pixel(x, y);
+
+ return (item != null) ? item.query_tooltip(x, y, tooltip) : false;
+ }
+
+ private void on_colors_changed() {
+ override_background_color(Gtk.StateFlags.NORMAL, Config.Facade.get_instance().get_bg_color());
+ set_colors();
+ }
+
+ public override bool focus_in_event(Gdk.EventFocus event) {
+ set_colors(true);
+ items_dirty("focus_in_event", view.get_selected());
+
+ return base.focus_in_event(event);
+ }
+
+ public override bool focus_out_event(Gdk.EventFocus event) {
+ set_colors(false);
+ items_dirty("focus_out_event", view.get_selected());
+
+ return base.focus_out_event(event);
+ }
+}
diff --git a/src/CollectionPage.vala b/src/CollectionPage.vala
new file mode 100644
index 0000000..070452c
--- /dev/null
+++ b/src/CollectionPage.vala
@@ -0,0 +1,765 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class CollectionViewManager : ViewManager {
+ private CollectionPage page;
+
+ public CollectionViewManager(CollectionPage page) {
+ this.page = page;
+ }
+
+ public override DataView create_view(DataSource source) {
+ return page.create_thumbnail(source);
+ }
+}
+
+public abstract class CollectionPage : MediaPage {
+ private const double DESKTOP_SLIDESHOW_TRANSITION_SEC = 2.0;
+
+ protected class CollectionSearchViewFilter : DefaultSearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.FLAG |
+ SearchFilterCriteria.MEDIA | SearchFilterCriteria.RATING;
+ }
+ }
+
+ private ExporterUI exporter = null;
+ private CollectionSearchViewFilter search_filter = new CollectionSearchViewFilter();
+
+ public CollectionPage(string page_name) {
+ base (page_name);
+
+ get_view().items_altered.connect(on_photos_altered);
+
+ init_item_context_menu("/CollectionContextMenu");
+ init_toolbar("/CollectionToolbar");
+
+ show_all();
+
+ // watch for updates to the external app settings
+ Config.Facade.get_instance().external_app_changed.connect(on_external_app_changed);
+ }
+
+ public override Gtk.Toolbar get_toolbar() {
+ if (toolbar == null) {
+ base.get_toolbar();
+
+ // separator to force slider to right side of toolbar
+ Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
+ separator.set_expand(true);
+ separator.set_draw(false);
+ get_toolbar().insert(separator, -1);
+
+ Gtk.SeparatorToolItem drawn_separator = new Gtk.SeparatorToolItem();
+ drawn_separator.set_expand(false);
+ drawn_separator.set_draw(true);
+
+ get_toolbar().insert(drawn_separator, -1);
+
+ // zoom slider assembly
+ MediaPage.ZoomSliderAssembly zoom_slider_assembly = create_zoom_slider_assembly();
+ connect_slider(zoom_slider_assembly);
+ get_toolbar().insert(zoom_slider_assembly, -1);
+ }
+
+ return toolbar;
+ }
+
+ private static InjectionGroup create_file_menu_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/FileMenu/FileExtrasPlaceholder");
+
+ group.add_menu_item("Print");
+ group.add_separator();
+ group.add_menu_item("Publish");
+ group.add_menu_item("SendTo");
+ group.add_menu_item("SetBackground");
+
+ return group;
+ }
+
+ private static InjectionGroup create_edit_menu_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/EditMenu/EditExtrasPlaceholder");
+
+ group.add_menu_item("Duplicate");
+
+ return group;
+ }
+
+ private static InjectionGroup create_view_menu_fullscreen_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/ViewMenu/ViewExtrasFullscreenSlideshowPlaceholder");
+
+ group.add_menu_item("Fullscreen", "CommonFullscreen");
+ group.add_separator();
+ group.add_menu_item("Slideshow");
+
+ return group;
+ }
+
+ private static InjectionGroup create_photos_menu_edits_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasEditsPlaceholder");
+
+ group.add_menu_item("RotateClockwise");
+ group.add_menu_item("RotateCounterclockwise");
+ group.add_menu_item("FlipHorizontally");
+ group.add_menu_item("FlipVertically");
+ group.add_separator();
+ group.add_menu_item("Enhance");
+ group.add_menu_item("Revert");
+ group.add_separator();
+ group.add_menu_item("CopyColorAdjustments");
+ group.add_menu_item("PasteColorAdjustments");
+
+ return group;
+ }
+
+ private static InjectionGroup create_photos_menu_date_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasDateTimePlaceholder");
+
+ group.add_menu_item("AdjustDateTime");
+
+ return group;
+ }
+
+ private static InjectionGroup create_photos_menu_externals_injectables() {
+ InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasExternalsPlaceholder");
+
+ group.add_menu_item("ExternalEdit");
+ group.add_menu_item("ExternalEditRAW");
+ group.add_menu_item("PlayVideo");
+
+ return group;
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("collection.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry print = { "Print", Gtk.Stock.PRINT, TRANSLATABLE, "<Ctrl>P",
+ TRANSLATABLE, on_print };
+ print.label = Resources.PRINT_MENU;
+ actions += print;
+
+ Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
+ TRANSLATABLE, on_publish };
+ publish.label = Resources.PUBLISH_MENU;
+ publish.tooltip = Resources.PUBLISH_TOOLTIP;
+ actions += publish;
+
+ Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
+ TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
+ rotate_right.label = Resources.ROTATE_CW_MENU;
+ rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
+ actions += rotate_right;
+
+ Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
+ TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
+ rotate_left.label = Resources.ROTATE_CCW_MENU;
+ rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
+ actions += rotate_left;
+
+ Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_horizontally };
+ hflip.label = Resources.HFLIP_MENU;
+ actions += hflip;
+
+ Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_vertically };
+ vflip.label = Resources.VFLIP_MENU;
+ actions += vflip;
+
+ Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
+ TRANSLATABLE, on_enhance };
+ enhance.label = Resources.ENHANCE_MENU;
+ enhance.tooltip = Resources.ENHANCE_TOOLTIP;
+ actions += enhance;
+
+ Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
+ "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
+ copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
+ copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
+ actions += copy_adjustments;
+
+ Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
+ "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
+ paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
+ paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
+ actions += paste_adjustments;
+
+ Gtk.ActionEntry revert = { "Revert", Gtk.Stock.REVERT_TO_SAVED, TRANSLATABLE, null,
+ TRANSLATABLE, on_revert };
+ revert.label = Resources.REVERT_MENU;
+ actions += revert;
+
+ Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
+ TRANSLATABLE, on_set_background };
+ set_background.label = Resources.SET_BACKGROUND_MENU;
+ set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
+ actions += set_background;
+
+ Gtk.ActionEntry duplicate = { "Duplicate", null, TRANSLATABLE, "<Ctrl>D", TRANSLATABLE,
+ on_duplicate_photo };
+ duplicate.label = Resources.DUPLICATE_PHOTO_MENU;
+ duplicate.tooltip = Resources.DUPLICATE_PHOTO_TOOLTIP;
+ actions += duplicate;
+
+ Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_adjust_date_time };
+ adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
+ actions += adjust_date_time;
+
+ Gtk.ActionEntry external_edit = { "ExternalEdit", Gtk.Stock.EDIT, TRANSLATABLE, "<Ctrl>Return",
+ TRANSLATABLE, on_external_edit };
+ external_edit.label = Resources.EXTERNAL_EDIT_MENU;
+ actions += external_edit;
+
+ Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return",
+ TRANSLATABLE, on_external_edit_raw };
+ edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
+ actions += edit_raw;
+
+ Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
+ on_slideshow };
+ slideshow.label = _("S_lideshow");
+ slideshow.tooltip = _("Play a slideshow");
+ actions += slideshow;
+
+ return actions;
+ }
+
+ protected override InjectionGroup[] init_collect_injection_groups() {
+ InjectionGroup[] groups = base.init_collect_injection_groups();
+
+ groups += create_file_menu_injectables();
+ groups += create_edit_menu_injectables();
+ groups += create_view_menu_fullscreen_injectables();
+ groups += create_photos_menu_edits_injectables();
+ groups += create_photos_menu_date_injectables();
+ groups += create_photos_menu_externals_injectables();
+
+ return groups;
+ }
+
+ private bool selection_has_video() {
+ return MediaSourceCollection.has_video((Gee.Collection<MediaSource>) get_view().get_selected_sources());
+ }
+
+ private bool page_has_photo() {
+ return MediaSourceCollection.has_photo((Gee.Collection<MediaSource>) get_view().get_sources());
+ }
+
+ private bool selection_has_photo() {
+ return MediaSourceCollection.has_photo((Gee.Collection<MediaSource>) get_view().get_selected_sources());
+ }
+
+ protected override void init_actions(int selected_count, int count) {
+ base.init_actions(selected_count, count);
+
+ set_action_short_label("RotateClockwise", Resources.ROTATE_CW_LABEL);
+ set_action_short_label("RotateCounterclockwise", Resources.ROTATE_CCW_LABEL);
+ set_action_short_label("Publish", Resources.PUBLISH_LABEL);
+
+ set_action_important("RotateClockwise", true);
+ set_action_important("RotateCounterclockwise", true);
+ set_action_important("Enhance", true);
+ set_action_important("Publish", true);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ base.update_actions(selected_count, count);
+
+ bool one_selected = selected_count == 1;
+ bool has_selected = selected_count > 0;
+
+ bool primary_is_video = false;
+ if (has_selected)
+ if (get_view().get_selected_at(0).get_source() is Video)
+ primary_is_video = true;
+
+ bool selection_has_videos = selection_has_video();
+ bool page_has_photos = page_has_photo();
+
+ // don't allow duplication of the selection if it contains a video -- videos are huge and
+ // and they're not editable anyway, so there seems to be no use case for duplicating them
+ set_action_sensitive("Duplicate", has_selected && (!selection_has_videos));
+ set_action_visible("ExternalEdit", (!primary_is_video));
+ set_action_sensitive("ExternalEdit",
+ one_selected && !is_string_empty(Config.Facade.get_instance().get_external_photo_app()));
+ set_action_visible("ExternalEditRAW",
+ one_selected && (!primary_is_video)
+ && ((Photo) get_view().get_selected_at(0).get_source()).get_master_file_format() ==
+ PhotoFileFormat.RAW
+ && !is_string_empty(Config.Facade.get_instance().get_external_raw_app()));
+ set_action_sensitive("Revert", (!selection_has_videos) && can_revert_selected());
+ set_action_sensitive("Enhance", (!selection_has_videos) && has_selected);
+ set_action_sensitive("CopyColorAdjustments", (!selection_has_videos) && one_selected &&
+ ((Photo) get_view().get_selected_at(0).get_source()).has_color_adjustments());
+ set_action_sensitive("PasteColorAdjustments", (!selection_has_videos) && has_selected &&
+ PixelTransformationBundle.has_copied_color_adjustments());
+ set_action_sensitive("RotateClockwise", (!selection_has_videos) && has_selected);
+ set_action_sensitive("RotateCounterclockwise", (!selection_has_videos) && has_selected);
+ set_action_sensitive("FlipHorizontally", (!selection_has_videos) && has_selected);
+ set_action_sensitive("FlipVertically", (!selection_has_videos) && has_selected);
+
+ // Allow changing of exposure time, even if there's a video in the current
+ // selection.
+ set_action_sensitive("AdjustDateTime", has_selected);
+
+ set_action_sensitive("NewEvent", has_selected);
+ set_action_sensitive("AddTags", has_selected);
+ set_action_sensitive("ModifyTags", one_selected);
+ set_action_sensitive("Slideshow", page_has_photos && (!primary_is_video));
+ set_action_sensitive("Print", (!selection_has_videos) && has_selected);
+ set_action_sensitive("Publish", has_selected);
+
+ set_action_sensitive("SetBackground", (!selection_has_videos) && has_selected );
+ if (has_selected) {
+ Gtk.Action? set_background = get_action("SetBackground");
+ if (set_background != null) {
+ set_background.label = one_selected
+ ? Resources.SET_BACKGROUND_MENU
+ : Resources.SET_BACKGROUND_SLIDESHOW_MENU;
+ }
+ }
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> altered) {
+ // only check for revert if the media object is a photo and its image has changed in some
+ // way and it's in the selection
+ foreach (DataObject object in altered.keys) {
+ DataView view = (DataView) object;
+
+ if (!view.is_selected() || !altered.get(view).has_subject("image"))
+ continue;
+
+ LibraryPhoto? photo = view.get_source() as LibraryPhoto;
+ if (photo == null)
+ continue;
+
+ // since the photo can be altered externally to Shotwell now, need to make the revert
+ // command available appropriately, even if the selection doesn't change
+ set_action_sensitive("Revert", can_revert_selected());
+ set_action_sensitive("CopyColorAdjustments", photo.has_color_adjustments());
+
+ break;
+ }
+ }
+
+ private void on_print() {
+ if (get_view().get_selected_count() > 0) {
+ PrintManager.get_instance().spool_photo(
+ (Gee.Collection<Photo>) get_view().get_selected_sources_of_type(typeof(Photo)));
+ }
+ }
+
+ private void on_external_app_changed() {
+ int selected_count = get_view().get_selected_count();
+
+ set_action_sensitive("ExternalEdit", selected_count == 1 && Config.Facade.get_instance().get_external_photo_app() != "");
+ }
+
+ // see #2020
+ // double clcik = switch to photo page
+ // Super + double click = open in external editor
+ // Enter = switch to PhotoPage
+ // Ctrl + Enter = open in external editor (handled with accelerators)
+ // Shift + Ctrl + Enter = open in external RAW editor (handled with accelerators)
+ protected override void on_item_activated(CheckerboardItem item, CheckerboardPage.Activator
+ activator, CheckerboardPage.KeyboardModifiers modifiers) {
+ Thumbnail thumbnail = (Thumbnail) item;
+
+ // none of the fancy Super, Ctrl, Shift, etc., keyboard accelerators apply to videos,
+ // since they can't be RAW files or be opened in an external editor, etc., so if this is
+ // a video, just play it and do a short-circuit return
+ if (thumbnail.get_media_source() is Video) {
+ on_play_video();
+ return;
+ }
+
+ LibraryPhoto? photo = thumbnail.get_media_source() as LibraryPhoto;
+ if (photo == null)
+ return;
+
+ // switch to full-page view or open in external editor
+ debug("activating %s", photo.to_string());
+
+ if (activator == CheckerboardPage.Activator.MOUSE) {
+ if (modifiers.super_pressed)
+ on_external_edit();
+ else
+ LibraryWindow.get_app().switch_to_photo_page(this, photo);
+ } else if (activator == CheckerboardPage.Activator.KEYBOARD) {
+ if (!modifiers.shift_pressed && !modifiers.ctrl_pressed)
+ LibraryWindow.get_app().switch_to_photo_page(this, photo);
+ }
+ }
+
+ protected override bool on_app_key_pressed(Gdk.EventKey event) {
+ bool handled = true;
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Page_Up":
+ case "KP_Page_Up":
+ case "Page_Down":
+ case "KP_Page_Down":
+ case "Home":
+ case "KP_Home":
+ case "End":
+ case "KP_End":
+ key_press_event(event);
+ break;
+
+ case "bracketright":
+ activate_action("RotateClockwise");
+ break;
+
+ case "bracketleft":
+ activate_action("RotateCounterclockwise");
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ return handled ? true : base.on_app_key_pressed(event);
+ }
+
+ protected override void on_export() {
+ if (exporter != null)
+ return;
+
+ Gee.Collection<MediaSource> export_list =
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources();
+ if (export_list.size == 0)
+ return;
+
+ bool has_some_photos = selection_has_photo();
+ bool has_some_videos = selection_has_video();
+ assert(has_some_photos || has_some_videos);
+
+ // if we don't have any photos, then everything is a video, so skip displaying the Export
+ // dialog and go right to the video export operation
+ if (!has_some_photos) {
+ exporter = Video.export_many((Gee.Collection<Video>) export_list, on_export_completed);
+ return;
+ }
+
+ string title = null;
+ if (has_some_videos)
+ title = (export_list.size == 1) ? _("Export Photo/Video") : _("Export Photos/Videos");
+ else
+ title = (export_list.size == 1) ? _("Export Photo") : _("Export Photos");
+ ExportDialog export_dialog = new ExportDialog(title);
+
+ // Setting up the parameters object requires a bit of thinking about what the user wants.
+ // If the selection contains only photos, then we do what we've done in previous versions
+ // of Shotwell -- we use whatever settings the user selected on his last export operation
+ // (the thinking here being that if you've been exporting small PNGs for your blog
+ // for the last n export operations, then it's likely that for your (n + 1)-th export
+ // operation you'll also be exporting a small PNG for your blog). However, if the selection
+ // contains any videos, then we set the parameters to the "Current" operating mode, since
+ // videos can't be saved as PNGs (or any other specific photo format).
+ ExportFormatParameters export_params = (has_some_videos) ? ExportFormatParameters.current() :
+ ExportFormatParameters.last();
+
+ int scale;
+ ScaleConstraint constraint;
+ if (!export_dialog.execute(out scale, out constraint, ref export_params))
+ return;
+
+ Scaling scaling = Scaling.for_constraint(constraint, scale, false);
+
+ // handle the single-photo case, which is treated like a Save As file operation
+ if (export_list.size == 1) {
+ LibraryPhoto photo = null;
+ foreach (LibraryPhoto p in (Gee.Collection<LibraryPhoto>) export_list) {
+ photo = p;
+ break;
+ }
+
+ File save_as =
+ ExportUI.choose_file(photo.get_export_basename_for_parameters(export_params));
+ if (save_as == null)
+ return;
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ photo.export(save_as, scaling, export_params.quality,
+ photo.get_export_format_for_parameters(export_params), export_params.mode ==
+ ExportFormatMode.UNMODIFIED, export_params.export_metadata);
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ export_error_dialog(save_as, false);
+ }
+
+ return;
+ }
+
+ // multiple photos or videos
+ File export_dir = ExportUI.choose_dir(title);
+ if (export_dir == null)
+ return;
+
+ exporter = new ExporterUI(new Exporter(export_list, export_dir, scaling, export_params));
+ exporter.export(on_export_completed);
+ }
+
+ private void on_export_completed() {
+ exporter = null;
+ }
+
+ private bool can_revert_selected() {
+ foreach (DataSource source in get_view().get_selected_sources()) {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo != null && (photo.has_transformations() || photo.has_editable()))
+ return true;
+ }
+
+ return false;
+ }
+
+ private bool can_revert_editable_selected() {
+ foreach (DataSource source in get_view().get_selected_sources()) {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo != null && photo.has_editable())
+ return true;
+ }
+
+ return false;
+ }
+
+ private void on_rotate_clockwise() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ RotateMultipleCommand command = new RotateMultipleCommand(get_view().get_selected(),
+ Rotation.CLOCKWISE, Resources.ROTATE_CW_FULL_LABEL, Resources.ROTATE_CW_TOOLTIP,
+ _("Rotating"), _("Undoing Rotate"));
+ get_command_manager().execute(command);
+ }
+
+ private void on_publish() {
+ if (get_view().get_selected_count() > 0)
+ PublishingUI.PublishingDialog.go(
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources());
+ }
+
+ private void on_rotate_counterclockwise() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ RotateMultipleCommand command = new RotateMultipleCommand(get_view().get_selected(),
+ Rotation.COUNTERCLOCKWISE, Resources.ROTATE_CCW_FULL_LABEL, Resources.ROTATE_CCW_TOOLTIP,
+ _("Rotating"), _("Undoing Rotate"));
+ get_command_manager().execute(command);
+ }
+
+ private void on_flip_horizontally() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ RotateMultipleCommand command = new RotateMultipleCommand(get_view().get_selected(),
+ Rotation.MIRROR, Resources.HFLIP_LABEL, "", _("Flipping Horizontally"),
+ _("Undoing Flip Horizontally"));
+ get_command_manager().execute(command);
+ }
+
+ private void on_flip_vertically() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ RotateMultipleCommand command = new RotateMultipleCommand(get_view().get_selected(),
+ Rotation.UPSIDE_DOWN, Resources.VFLIP_LABEL, "", _("Flipping Vertically"),
+ _("Undoing Flip Vertically"));
+ get_command_manager().execute(command);
+ }
+
+ private void on_revert() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ if (can_revert_editable_selected()) {
+ if (!revert_editable_dialog(AppWindow.get_instance(),
+ (Gee.Collection<Photo>) get_view().get_selected_sources())) {
+ return;
+ }
+
+ foreach (DataObject object in get_view().get_selected_sources())
+ ((Photo) object).revert_to_master();
+ }
+
+ RevertMultipleCommand command = new RevertMultipleCommand(get_view().get_selected());
+ get_command_manager().execute(command);
+ }
+
+ public void on_copy_adjustments() {
+ if (get_view().get_selected_count() != 1)
+ return;
+ Photo photo = (Photo) get_view().get_selected_at(0).get_source();
+ PixelTransformationBundle.set_copied_color_adjustments(photo.get_color_adjustments());
+ set_action_sensitive("PasteColorAdjustments", true);
+ }
+
+ public void on_paste_adjustments() {
+ PixelTransformationBundle? copied_adjustments = PixelTransformationBundle.get_copied_color_adjustments();
+ if (get_view().get_selected_count() == 0 || copied_adjustments == null)
+ return;
+
+ AdjustColorsMultipleCommand command = new AdjustColorsMultipleCommand(get_view().get_selected(),
+ copied_adjustments, Resources.PASTE_ADJUSTMENTS_LABEL, Resources.PASTE_ADJUSTMENTS_TOOLTIP);
+ get_command_manager().execute(command);
+ }
+
+ private void on_enhance() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ EnhanceMultipleCommand command = new EnhanceMultipleCommand(get_view().get_selected());
+ get_command_manager().execute(command);
+ }
+
+ private void on_duplicate_photo() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ DuplicateMultiplePhotosCommand command = new DuplicateMultiplePhotosCommand(
+ get_view().get_selected());
+ get_command_manager().execute(command);
+ }
+
+ private void on_adjust_date_time() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ bool selected_has_videos = false;
+ bool only_videos_selected = true;
+
+ foreach (DataView dv in get_view().get_selected()) {
+ if (dv.get_source() is Video)
+ selected_has_videos = true;
+ else
+ only_videos_selected = false;
+ }
+
+ Dateable photo_source = (Dateable) get_view().get_selected_at(0).get_source();
+
+ AdjustDateTimeDialog dialog = new AdjustDateTimeDialog(photo_source,
+ get_view().get_selected_count(), true, selected_has_videos, only_videos_selected);
+
+ int64 time_shift;
+ bool keep_relativity, modify_originals;
+ if (dialog.execute(out time_shift, out keep_relativity, out modify_originals)) {
+ AdjustDateTimePhotosCommand command = new AdjustDateTimePhotosCommand(
+ get_view().get_selected(), time_shift, keep_relativity, modify_originals);
+ get_command_manager().execute(command);
+ }
+ }
+
+ private void on_external_edit() {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ Photo photo = (Photo) get_view().get_selected_at(0).get_source();
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ photo.open_with_external_editor();
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ open_external_editor_error_dialog(err, photo);
+ }
+ }
+
+ private void on_external_edit_raw() {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ Photo photo = (Photo) get_view().get_selected_at(0).get_source();
+ if (photo.get_master_file_format() != PhotoFileFormat.RAW)
+ return;
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ photo.open_with_raw_external_editor();
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ AppWindow.error_message(Resources.launch_editor_failed(err));
+ }
+ }
+
+ public void on_set_background() {
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ MediaSourceCollection.filter_media((Gee.Collection<MediaSource>) get_view().get_selected_sources(),
+ photos, null);
+
+ if (photos.size == 1) {
+ AppWindow.get_instance().set_busy_cursor();
+ DesktopIntegration.set_background(photos[0]);
+ AppWindow.get_instance().set_normal_cursor();
+ } else if (photos.size > 1) {
+ SetBackgroundSlideshowDialog dialog = new SetBackgroundSlideshowDialog();
+ int delay;
+ if (dialog.execute(out delay)) {
+ AppWindow.get_instance().set_busy_cursor();
+ DesktopIntegration.set_background_slideshow(photos, delay,
+ DESKTOP_SLIDESHOW_TRANSITION_SEC);
+ AppWindow.get_instance().set_normal_cursor();
+ }
+ }
+ }
+
+ private void on_slideshow() {
+ if (get_view().get_count() == 0)
+ return;
+
+ // use first selected photo, else use first photo
+ Gee.List<DataSource>? sources = (get_view().get_selected_count() > 0)
+ ? get_view().get_selected_sources_of_type(typeof(LibraryPhoto))
+ : get_view().get_sources_of_type(typeof(LibraryPhoto));
+ if (sources == null || sources.size == 0)
+ return;
+
+ Thumbnail? thumbnail = (Thumbnail?) get_view().get_view_for_source(sources[0]);
+ if (thumbnail == null)
+ return;
+
+ LibraryPhoto? photo = thumbnail.get_media_source() as LibraryPhoto;
+ if (photo == null)
+ return;
+
+ AppWindow.get_instance().go_fullscreen(new SlideshowPage(LibraryPhoto.global, get_view(),
+ photo));
+ }
+
+ protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
+ Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
+ as Gtk.ToolButton;
+ if (rotate_button != null)
+ rotate_button.set_related_action(get_action("RotateCounterclockwise"));
+
+ return base.on_ctrl_pressed(event);
+ }
+
+ protected override bool on_ctrl_released(Gdk.EventKey? event) {
+ Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
+ as Gtk.ToolButton;
+ if (rotate_button != null)
+ rotate_button.set_related_action(get_action("RotateClockwise"));
+
+ return base.on_ctrl_released(event);
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
diff --git a/src/ColorTransformation.vala b/src/ColorTransformation.vala
new file mode 100644
index 0000000..74e4cf2
--- /dev/null
+++ b/src/ColorTransformation.vala
@@ -0,0 +1,1519 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public struct RGBAnalyticPixel {
+ public float red;
+ public float green;
+ public float blue;
+
+ private const float INV_255 = 1.0f / 255.0f;
+
+ public RGBAnalyticPixel() {
+ red = 0.0f;
+ green = 0.0f;
+ blue = 0.0f;
+ }
+
+ public RGBAnalyticPixel.from_components(float red, float green,
+ float blue) {
+ this.red = red.clamp(0.0f, 1.0f);
+ this.green = green.clamp(0.0f, 1.0f);
+ this.blue = blue.clamp(0.0f, 1.0f);
+ }
+
+ public RGBAnalyticPixel.from_quantized_components(uchar red_quantized,
+ uchar green_quantized, uchar blue_quantized) {
+ this.red = ((float) red_quantized) * INV_255;
+ this.green = ((float) green_quantized) * INV_255;
+ this.blue = ((float) blue_quantized) * INV_255;
+ }
+
+ public RGBAnalyticPixel.from_hsv(HSVAnalyticPixel hsv_pixel) {
+ RGBAnalyticPixel from_hsv = hsv_pixel.to_rgb();
+ red = from_hsv.red;
+ green = from_hsv.green;
+ blue = from_hsv.blue;
+ }
+
+ public uchar quantized_red() {
+ return (uchar)(red * 255.0f);
+ }
+
+ public uchar quantized_green() {
+ return (uchar)(green * 255.0f);
+ }
+
+ public uchar quantized_blue() {
+ return (uchar)(blue * 255.0f);
+ }
+
+ public bool equals(RGBAnalyticPixel? rhs) {
+ return ((red == rhs.red) && (green == rhs.green) && (blue == rhs.blue));
+ }
+
+ public uint hash_code() {
+ return (((uint)(red * 255.0f)) << 16) + (((uint)(green * 255.0f)) << 8) +
+ ((uint)(blue * 255.0f));
+ }
+
+ public HSVAnalyticPixel to_hsv() {
+ return HSVAnalyticPixel.from_rgb(this);
+ }
+}
+
+public struct HSVAnalyticPixel {
+ public float hue;
+ public float saturation;
+ public float light_value;
+
+ private const float INV_255 = 1.0f / 255.0f;
+
+ public HSVAnalyticPixel() {
+ hue = 0.0f;
+ saturation = 0.0f;
+ light_value = 0.0f;
+ }
+
+ public HSVAnalyticPixel.from_components(float hue, float saturation,
+ float light_value) {
+ this.hue = hue.clamp(0.0f, 1.0f);
+ this.saturation = saturation.clamp(0.0f, 1.0f);
+ this.light_value = light_value.clamp(0.0f, 1.0f);
+ }
+
+ public HSVAnalyticPixel.from_quantized_components(uchar hue_quantized,
+ uchar saturation_quantized, uchar light_value_quantized) {
+ this.hue = ((float) hue_quantized) * INV_255;
+ this.saturation = ((float) saturation_quantized) * INV_255;
+ this.light_value = ((float) light_value_quantized) * INV_255;
+ }
+
+ public HSVAnalyticPixel.from_rgb(RGBAnalyticPixel p) {
+ float max_component = float.max(float.max(p.red, p.green), p.blue);
+ float min_component = float.min(float.min(p.red, p.green), p.blue);
+
+ light_value = max_component;
+ saturation = (max_component != 0.0f) ? ((max_component - min_component) /
+ max_component) : 0.0f;
+
+ if (saturation == 0.0f) {
+ hue = 0.0f; /* hue is undefined in the zero saturation case */
+ } else {
+ float delta = max_component - min_component;
+ if (p.red == max_component) {
+ hue = (p.green - p.blue) / delta;
+ } else if (p.green == max_component) {
+ hue = 2.0f + ((p.blue - p.red) / delta);
+ } else if (p.blue == max_component) {
+ hue = 4.0f + ((p.red - p.green) / delta);
+ }
+
+ hue *= 60.0f;
+ if (hue < 0.0f)
+ hue += 360.0f;
+
+ hue /= 360.0f; /* normalize hue */
+ }
+
+ hue = hue.clamp(0.0f, 1.0f);
+ saturation = saturation.clamp(0.0f, 1.0f);
+ light_value = light_value.clamp(0.0f, 1.0f);
+ }
+
+ public RGBAnalyticPixel to_rgb() {
+ RGBAnalyticPixel result = RGBAnalyticPixel();
+
+ if (saturation == 0.0f) {
+ result.red = light_value;
+ result.green = light_value;
+ result.blue = light_value;
+ } else {
+ float hue_denorm = hue * 360.0f;
+ if (hue_denorm == 360.0f)
+ hue_denorm = 0.0f;
+
+ float hue_hexant = hue_denorm / 60.0f;
+
+ int hexant_i_part = (int) hue_hexant;
+
+ float hexant_f_part = hue_hexant - ((float) hexant_i_part);
+
+ /* the p, q, and t quantities from section 13.3 of Foley, et. al. */
+ float p = light_value * (1.0f - saturation);
+ float q = light_value * (1.0f - (saturation * hexant_f_part));
+ float t = light_value * (1.0f - (saturation * (1.0f - hexant_f_part)));
+ switch (hexant_i_part) {
+ /* the (r, g, b) components of the output pixel are computed
+ from the light_value, p, q, and t quantities differently
+ depending on which "hexant" (1/6 of a full rotation) of the
+ HSV color cone the hue lies in. For example, if the hue lies
+ in the yellow hexant, the dominant channels in the output
+ are red and green, so we map relatively more of the light_value
+ into these colors than if, say, the hue were to lie in the
+ cyan hexant. See chapter 13 of Foley, et. al. for more
+ information. */
+ case 0:
+ result.red = light_value;
+ result.green = t;
+ result.blue = p;
+ break;
+
+ case 1:
+ result.red = q;
+ result.green = light_value;
+ result.blue = p;
+ break;
+
+ case 2:
+ result.red = p;
+ result.green = light_value;
+ result.blue = t;
+ break;
+
+ case 3:
+ result.red = p;
+ result.green = q;
+ result.blue = light_value;
+ break;
+
+ case 4:
+ result.red = t;
+ result.green = p;
+ result.blue = light_value;
+ break;
+
+ case 5:
+ result.red = light_value;
+ result.green = p;
+ result.blue = q;
+ break;
+
+ default:
+ error("bad color hexant in HSV-to-RGB conversion");
+ }
+ }
+
+ return result;
+ }
+
+ public bool equals(ref HSVAnalyticPixel rhs) {
+ return ((hue == rhs.hue) && (saturation == rhs.saturation) &&
+ (light_value == rhs.light_value));
+ }
+
+ public uint hash_code() {
+ return (((uint)(hue * 255.0f)) << 16) + (((uint)(saturation * 255.0f)) << 8) +
+ ((uint)(light_value * 255.0f));
+ }
+}
+
+public enum CompositionMode {
+ NONE,
+ RGB_MATRIX
+}
+
+public enum PixelFormat {
+ RGB,
+ HSV
+}
+
+public enum PixelTransformationType {
+ TONE_EXPANSION,
+ SHADOWS,
+ HIGHLIGHTS,
+ TEMPERATURE,
+ TINT,
+ SATURATION,
+ EXPOSURE
+}
+
+public class PixelTransformationBundle {
+ private static PixelTransformationBundle? copied_color_adjustments = null;
+
+ private Gee.HashMap<int, PixelTransformation> map = new Gee.HashMap<int, PixelTransformation>(
+ Gee.Functions.get_hash_func_for(typeof(int)), Gee.Functions.get_equal_func_for(typeof(int)));
+
+ public PixelTransformationBundle() {
+ }
+
+ public static PixelTransformationBundle? get_copied_color_adjustments() {
+ return copied_color_adjustments;
+ }
+
+ public static void set_copied_color_adjustments(PixelTransformationBundle adjustments) {
+ copied_color_adjustments = adjustments;
+ }
+
+ public static bool has_copied_color_adjustments() {
+ return copied_color_adjustments != null;
+ }
+
+ public void set(PixelTransformation transformation) {
+ map.set((int) transformation.get_transformation_type(), transformation);
+ }
+
+ public void set_to_identity() {
+ set(new ExpansionTransformation.from_extrema(0, 255));
+ set(new ShadowDetailTransformation(0.0f));
+ set(new HighlightDetailTransformation(0.0f));
+ set(new TemperatureTransformation(0.0f));
+ set(new TintTransformation(0.0f));
+ set(new SaturationTransformation(0.0f));
+ set(new ExposureTransformation(0.0f));
+ }
+
+ public void load(KeyValueMap store) {
+ string expansion_params_encoded = store.get_string("expansion", "-");
+ if (expansion_params_encoded == "-")
+ set(new ExpansionTransformation.from_extrema(0, 255));
+ else
+ set(new ExpansionTransformation.from_string(expansion_params_encoded));
+
+ set(new ShadowDetailTransformation(store.get_float("shadows", 0.0f)));
+ set(new HighlightDetailTransformation(store.get_float("highlights", 0.0f)));
+ set(new TemperatureTransformation(store.get_float("temperature", 0.0f)));
+ set(new TintTransformation(store.get_float("tint", 0.0f)));
+ set(new SaturationTransformation(store.get_float("saturation", 0.0f)));
+ set(new ExposureTransformation(store.get_float("exposure", 0.0f)));
+ }
+
+ public KeyValueMap save(string group) {
+ KeyValueMap store = new KeyValueMap(group);
+
+ ExpansionTransformation? new_expansion_trans =
+ (ExpansionTransformation) get_transformation(PixelTransformationType.TONE_EXPANSION);
+ assert(new_expansion_trans != null);
+ store.set_string("expansion", new_expansion_trans.to_string());
+
+ ShadowDetailTransformation? new_shadows_trans =
+ (ShadowDetailTransformation) get_transformation(PixelTransformationType.SHADOWS);
+ assert(new_shadows_trans != null);
+ store.set_float("shadows", new_shadows_trans.get_parameter());
+
+ HighlightDetailTransformation? new_highlight_trans =
+ (HighlightDetailTransformation) get_transformation(PixelTransformationType.HIGHLIGHTS);
+ assert(new_highlight_trans != null);
+ store.set_float("highlights", new_highlight_trans.get_parameter());
+
+ TemperatureTransformation? new_temp_trans =
+ (TemperatureTransformation) get_transformation(PixelTransformationType.TEMPERATURE);
+ assert(new_temp_trans != null);
+ store.set_float("temperature", new_temp_trans.get_parameter());
+
+ TintTransformation? new_tint_trans =
+ (TintTransformation) get_transformation(PixelTransformationType.TINT);
+ assert(new_tint_trans != null);
+ store.set_float("tint", new_tint_trans.get_parameter());
+
+ SaturationTransformation? new_sat_trans =
+ (SaturationTransformation) get_transformation(PixelTransformationType.SATURATION);
+ assert(new_sat_trans != null);
+ store.set_float("saturation", new_sat_trans.get_parameter());
+
+ ExposureTransformation? new_exposure_trans =
+ (ExposureTransformation) get_transformation(PixelTransformationType.EXPOSURE);
+ assert(new_exposure_trans != null);
+ store.set_float("exposure", new_exposure_trans.get_parameter());
+
+ return store;
+ }
+
+ public int get_count() {
+ return map.size;
+ }
+
+ public PixelTransformation? get_transformation(PixelTransformationType type) {
+ return map.get((int) type);
+ }
+
+ public Gee.Iterable<PixelTransformation> get_transformations() {
+ return map.values;
+ }
+
+ public bool is_identity() {
+ foreach (PixelTransformation adjustment in get_transformations()) {
+ if (!adjustment.is_identity())
+ return false;
+ }
+
+ return true;
+ }
+
+ public PixelTransformer generate_transformer() {
+ PixelTransformer transformer = new PixelTransformer();
+ foreach (PixelTransformation transformation in get_transformations())
+ transformer.attach_transformation(transformation);
+
+ return transformer;
+ }
+
+ public PixelTransformationBundle copy() {
+ PixelTransformationBundle bundle = new PixelTransformationBundle();
+ foreach (PixelTransformation transformation in get_transformations())
+ bundle.set(transformation);
+
+ return bundle;
+ }
+}
+
+public abstract class PixelTransformation {
+ private PixelTransformationType type;
+
+ public PixelTransformation(PixelTransformationType type) {
+ this.type = type;
+ }
+
+ public PixelTransformationType get_transformation_type() {
+ return type;
+ }
+
+ public abstract PixelFormat get_preferred_format();
+
+ public virtual CompositionMode get_composition_mode() {
+ return CompositionMode.NONE;
+ }
+
+ public virtual void compose_with(PixelTransformation other) {
+ error("PixelTransformation: compose_with( ): this type of pixel " +
+ "transformation doesn't support composition.");
+ }
+
+ public virtual bool is_identity() {
+ return true;
+ }
+
+ public virtual HSVAnalyticPixel transform_pixel_hsv(HSVAnalyticPixel p) {
+ return p;
+ }
+
+ public virtual RGBAnalyticPixel transform_pixel_rgb(RGBAnalyticPixel p) {
+ return p;
+ }
+
+ public virtual string to_string() {
+ return "PixelTransformation";
+ }
+
+ public abstract PixelTransformation copy();
+}
+
+public class RGBTransformation : PixelTransformation {
+ /* matrix entries are stored in row-major order; by default, the matrix formed
+ by matrix_entries is the 4x4 identity matrix */
+ protected float[] matrix_entries;
+
+ protected const int MATRIX_SIZE = 16;
+
+ protected bool identity = true;
+
+ public RGBTransformation(PixelTransformationType type) {
+ base(type);
+
+ // Can't initialize these in their member declarations because of a valac bug that
+ // I've been unable to produce a minimal test case for to report (JN). May be
+ // related to this bug:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=570821
+ matrix_entries = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ }
+
+ public override PixelFormat get_preferred_format() {
+ return PixelFormat.RGB;
+ }
+
+ public override CompositionMode get_composition_mode() {
+ return CompositionMode.RGB_MATRIX;
+ }
+
+ public override void compose_with(PixelTransformation other) {
+ if (other.get_composition_mode() != CompositionMode.RGB_MATRIX)
+ error("RGBTransformation: compose_with( ): 'other' transformation " +
+ "does not support RGB_MATRIX composition mode");
+
+ RGBTransformation transform = (RGBTransformation) other;
+
+ float[] result_matrix_entries = new float[16];
+
+ /* row 0 */
+ result_matrix_entries[0] =
+ (transform.matrix_entries[0] * matrix_entries[0]) +
+ (transform.matrix_entries[1] * matrix_entries[4]) +
+ (transform.matrix_entries[2] * matrix_entries[8]) +
+ (transform.matrix_entries[3] * matrix_entries[12]);
+
+ result_matrix_entries[1] =
+ (transform.matrix_entries[0] * matrix_entries[1]) +
+ (transform.matrix_entries[1] * matrix_entries[5]) +
+ (transform.matrix_entries[2] * matrix_entries[9]) +
+ (transform.matrix_entries[3] * matrix_entries[13]);
+
+ result_matrix_entries[2] =
+ (transform.matrix_entries[0] * matrix_entries[2]) +
+ (transform.matrix_entries[1] * matrix_entries[6]) +
+ (transform.matrix_entries[2] * matrix_entries[10]) +
+ (transform.matrix_entries[3] * matrix_entries[14]);
+
+ result_matrix_entries[3] =
+ (transform.matrix_entries[0] * matrix_entries[3]) +
+ (transform.matrix_entries[1] * matrix_entries[7]) +
+ (transform.matrix_entries[2] * matrix_entries[11]) +
+ (transform.matrix_entries[3] * matrix_entries[15]);
+
+ /* row 1 */
+ result_matrix_entries[4] =
+ (transform.matrix_entries[4] * matrix_entries[0]) +
+ (transform.matrix_entries[5] * matrix_entries[4]) +
+ (transform.matrix_entries[6] * matrix_entries[8]) +
+ (transform.matrix_entries[7] * matrix_entries[12]);
+
+ result_matrix_entries[5] =
+ (transform.matrix_entries[4] * matrix_entries[1]) +
+ (transform.matrix_entries[5] * matrix_entries[5]) +
+ (transform.matrix_entries[6] * matrix_entries[9]) +
+ (transform.matrix_entries[7] * matrix_entries[13]);
+
+ result_matrix_entries[6] =
+ (transform.matrix_entries[4] * matrix_entries[2]) +
+ (transform.matrix_entries[5] * matrix_entries[6]) +
+ (transform.matrix_entries[6] * matrix_entries[10]) +
+ (transform.matrix_entries[7] * matrix_entries[14]);
+
+ result_matrix_entries[7] =
+ (transform.matrix_entries[4] * matrix_entries[3]) +
+ (transform.matrix_entries[5] * matrix_entries[7]) +
+ (transform.matrix_entries[6] * matrix_entries[11]) +
+ (transform.matrix_entries[7] * matrix_entries[15]);
+
+ /* row 2 */
+ result_matrix_entries[8] =
+ (transform.matrix_entries[8] * matrix_entries[0]) +
+ (transform.matrix_entries[9] * matrix_entries[4]) +
+ (transform.matrix_entries[10] * matrix_entries[8]) +
+ (transform.matrix_entries[11] * matrix_entries[12]);
+
+ result_matrix_entries[9] =
+ (transform.matrix_entries[8] * matrix_entries[1]) +
+ (transform.matrix_entries[9] * matrix_entries[5]) +
+ (transform.matrix_entries[10] * matrix_entries[9]) +
+ (transform.matrix_entries[11] * matrix_entries[13]);
+
+ result_matrix_entries[10] =
+ (transform.matrix_entries[8] * matrix_entries[2]) +
+ (transform.matrix_entries[9] * matrix_entries[6]) +
+ (transform.matrix_entries[10] * matrix_entries[10]) +
+ (transform.matrix_entries[11] * matrix_entries[14]);
+
+ result_matrix_entries[11] =
+ (transform.matrix_entries[8] * matrix_entries[3]) +
+ (transform.matrix_entries[9] * matrix_entries[7]) +
+ (transform.matrix_entries[10] * matrix_entries[11]) +
+ (transform.matrix_entries[11] * matrix_entries[15]);
+
+ /* row 3 */
+ result_matrix_entries[12] =
+ (transform.matrix_entries[12] * matrix_entries[0]) +
+ (transform.matrix_entries[13] * matrix_entries[4]) +
+ (transform.matrix_entries[14] * matrix_entries[8]) +
+ (transform.matrix_entries[15] * matrix_entries[12]);
+
+ result_matrix_entries[13] =
+ (transform.matrix_entries[12] * matrix_entries[1]) +
+ (transform.matrix_entries[13] * matrix_entries[5]) +
+ (transform.matrix_entries[14] * matrix_entries[9]) +
+ (transform.matrix_entries[15] * matrix_entries[13]);
+
+ result_matrix_entries[14] =
+ (transform.matrix_entries[12] * matrix_entries[2]) +
+ (transform.matrix_entries[13] * matrix_entries[6]) +
+ (transform.matrix_entries[14] * matrix_entries[10]) +
+ (transform.matrix_entries[15] * matrix_entries[14]);
+
+ result_matrix_entries[15] =
+ (transform.matrix_entries[12] * matrix_entries[3]) +
+ (transform.matrix_entries[13] * matrix_entries[7]) +
+ (transform.matrix_entries[14] * matrix_entries[11]) +
+ (transform.matrix_entries[15] * matrix_entries[15]);
+
+ for (int i = 0; i < MATRIX_SIZE; i++)
+ matrix_entries[i] = result_matrix_entries[i];
+
+ identity = (identity && transform.identity);
+ }
+
+ public override HSVAnalyticPixel transform_pixel_hsv(HSVAnalyticPixel p) {
+ return (transform_pixel_rgb(p.to_rgb())).to_hsv();
+ }
+
+ public override RGBAnalyticPixel transform_pixel_rgb(RGBAnalyticPixel p) {
+ float red_out = (p.red * matrix_entries[0]) +
+ (p.green * matrix_entries[1]) +
+ (p.blue * matrix_entries[2]) +
+ matrix_entries[3];
+ red_out = red_out.clamp(0.0f, 1.0f);
+
+ float green_out = (p.red * matrix_entries[4]) +
+ (p.green * matrix_entries[5]) +
+ (p.blue * matrix_entries[6]) +
+ matrix_entries[7];
+ green_out = green_out.clamp(0.0f, 1.0f);
+
+ float blue_out = (p.red * matrix_entries[8]) +
+ (p.green * matrix_entries[9]) +
+ (p.blue * matrix_entries[10]) +
+ matrix_entries[11];
+ blue_out = blue_out.clamp(0.0f, 1.0f);
+
+ return RGBAnalyticPixel.from_components(red_out, green_out, blue_out);
+ }
+
+ public override bool is_identity() {
+ return identity;
+ }
+
+ public override PixelTransformation copy() {
+ RGBTransformation result = new RGBTransformation(get_transformation_type());
+
+ for (int i = 0; i < MATRIX_SIZE; i++) {
+ result.matrix_entries[i] = matrix_entries[i];
+ }
+
+ return result;
+ }
+}
+
+public abstract class HSVTransformation : PixelTransformation {
+ public HSVTransformation(PixelTransformationType type) {
+ base(type);
+ }
+
+ public override PixelFormat get_preferred_format() {
+ return PixelFormat.HSV;
+ }
+
+ public override RGBAnalyticPixel transform_pixel_rgb(RGBAnalyticPixel p) {
+ return (transform_pixel_hsv(p.to_hsv())).to_rgb();
+ }
+}
+
+public class TintTransformation : RGBTransformation {
+ private const float INTENSITY_FACTOR = 0.25f;
+ public const float MIN_PARAMETER = -16.0f;
+ public const float MAX_PARAMETER = 16.0f;
+
+ private float parameter;
+
+ public TintTransformation(float client_param) {
+ base(PixelTransformationType.TINT);
+
+ parameter = client_param.clamp(MIN_PARAMETER, MAX_PARAMETER);
+
+ if (parameter != 0.0f) {
+ float adjusted_param = parameter / MAX_PARAMETER;
+ adjusted_param *= INTENSITY_FACTOR;
+
+ matrix_entries[11] -= (adjusted_param / 2);
+ matrix_entries[7] += adjusted_param;
+ matrix_entries[3] -= (adjusted_param / 2);
+
+ identity = false;
+ }
+ }
+
+ public float get_parameter() {
+ return parameter;
+ }
+}
+
+public class TemperatureTransformation : RGBTransformation {
+ private const float INTENSITY_FACTOR = 0.33f;
+ public const float MIN_PARAMETER = -16.0f;
+ public const float MAX_PARAMETER = 16.0f;
+
+ private float parameter;
+
+ public TemperatureTransformation(float client_parameter) {
+ base(PixelTransformationType.TEMPERATURE);
+
+ parameter = client_parameter.clamp(MIN_PARAMETER, MAX_PARAMETER);
+
+ if (parameter != 0.0f) {
+ float adjusted_param = parameter / MAX_PARAMETER;
+ adjusted_param *= INTENSITY_FACTOR;
+
+ matrix_entries[11] -= adjusted_param;
+ matrix_entries[7] += (adjusted_param / 2);
+ matrix_entries[3] += (adjusted_param / 2);
+
+ identity = false;
+ }
+ }
+
+ public float get_parameter() {
+ return parameter;
+ }
+}
+
+public class SaturationTransformation : RGBTransformation {
+ public const float MIN_PARAMETER = -16.0f;
+ public const float MAX_PARAMETER = 16.0f;
+
+ private float parameter;
+
+ public SaturationTransformation(float client_parameter) {
+ base(PixelTransformationType.SATURATION);
+
+ parameter = client_parameter.clamp(MIN_PARAMETER, MAX_PARAMETER);
+
+ if (parameter != 0.0f) {
+ float adjusted_param = parameter / MAX_PARAMETER;
+ adjusted_param += 1.0f;
+
+ float one_third = 0.3333333f;
+
+ matrix_entries[0] = ((1.0f - adjusted_param) * one_third) +
+ adjusted_param;
+ matrix_entries[1] = (1.0f - adjusted_param) * one_third;
+ matrix_entries[2] = (1.0f - adjusted_param) * one_third;
+
+ matrix_entries[4] = (1.0f - adjusted_param) * one_third;
+ matrix_entries[5] = ((1.0f - adjusted_param) * one_third) +
+ adjusted_param;
+ matrix_entries[6] = (1.0f - adjusted_param) * one_third;
+
+ matrix_entries[8] = (1.0f - adjusted_param) * one_third;
+ matrix_entries[9] = (1.0f - adjusted_param) * one_third;
+ matrix_entries[10] = ((1.0f - adjusted_param) * one_third) +
+ adjusted_param;
+
+ identity = false;
+ }
+ }
+
+ public float get_parameter() {
+ return parameter;
+ }
+}
+
+public class ExposureTransformation : RGBTransformation {
+ public const float MIN_PARAMETER = -16.0f;
+ public const float MAX_PARAMETER = 16.0f;
+
+ float parameter;
+
+ public ExposureTransformation(float client_parameter) {
+ base(PixelTransformationType.EXPOSURE);
+
+ parameter = client_parameter.clamp(MIN_PARAMETER, MAX_PARAMETER);
+
+ if (parameter != 0.0f) {
+
+ float adjusted_param = ((parameter + 16.0f) / 32.0f) + 0.5f;
+
+ matrix_entries[0] = adjusted_param;
+ matrix_entries[5] = adjusted_param;
+ matrix_entries[10] = adjusted_param;
+
+ identity = false;
+ }
+ }
+
+ public float get_parameter() {
+ return parameter;
+ }
+}
+
+public class PixelTransformer {
+ private Gee.ArrayList<PixelTransformation> transformations =
+ new Gee.ArrayList<PixelTransformation>();
+ private PixelTransformation[] optimized_transformations = null;
+ private int optimized_slots_used = 0;
+
+ public PixelTransformer() {
+ }
+
+ public PixelTransformer copy() {
+ PixelTransformer clone = new PixelTransformer();
+
+ foreach (PixelTransformation transformation in transformations)
+ clone.transformations.add(transformation);
+
+ return clone;
+ }
+
+ private void build_optimized_transformations() {
+ optimized_transformations = new PixelTransformation[transformations.size];
+
+ PixelTransformation pre_trans = null;
+ optimized_slots_used = 0;
+ for (int i = 0; i < transformations.size; i++) {
+ PixelTransformation trans = transformations.get(i);
+
+ if (trans.is_identity())
+ continue;
+
+ PixelTransformation this_trans = null;
+ if (trans.get_composition_mode() == CompositionMode.NONE)
+ this_trans = trans;
+ else
+ this_trans = trans.copy();
+
+ if ((pre_trans != null) && (this_trans.get_composition_mode() != CompositionMode.NONE)
+ && (this_trans.get_composition_mode() == pre_trans.get_composition_mode())) {
+ pre_trans.compose_with(this_trans);
+ } else {
+ optimized_transformations[optimized_slots_used++] = this_trans;
+ pre_trans = this_trans;
+ }
+ }
+ }
+
+ private RGBAnalyticPixel apply_transformations(RGBAnalyticPixel p) {
+ PixelFormat current_format = PixelFormat.RGB;
+ RGBAnalyticPixel p_rgb = p;
+ HSVAnalyticPixel p_hsv = HSVAnalyticPixel();
+
+ for (int i = 0; i < optimized_slots_used; i++) {
+ PixelTransformation trans = optimized_transformations[i];
+ if (trans.get_preferred_format() == PixelFormat.RGB) {
+ if (current_format == PixelFormat.HSV) {
+ p_rgb = p_hsv.to_rgb();
+ current_format = PixelFormat.RGB;
+ }
+ p_rgb = trans.transform_pixel_rgb(p_rgb);
+ } else {
+ if (current_format == PixelFormat.RGB) {
+ p_hsv = p_rgb.to_hsv();
+ current_format = PixelFormat.HSV;
+ }
+ p_hsv = trans.transform_pixel_hsv(p_hsv);
+ }
+ }
+
+ if (current_format == PixelFormat.HSV)
+ p_rgb = p_hsv.to_rgb();
+
+ return p_rgb;
+ }
+
+ /* NOTE: this method allows the same transformation to be added multiple
+ times. There's nothing wrong with this behavior as of today,
+ but it may be a policy that we want to change in the future */
+ public void attach_transformation(PixelTransformation trans) {
+ transformations.add(trans);
+ optimized_transformations = null;
+ }
+
+ /* NOTE: if a transformation has been added multiple times, only the first
+ instance of it will be removed */
+ public void detach_transformation(PixelTransformation victim) {
+ transformations.remove(victim);
+ optimized_transformations = null;
+ }
+
+ /* NOTE: if a transformation has been added multiple times, only the first
+ instance of it will be replaced with 'new' */
+ public void replace_transformation(PixelTransformation old_trans,
+ PixelTransformation new_trans) {
+ for (int i = 0; i < transformations.size; i++) {
+ if (transformations.get(i) == old_trans) {
+ transformations.set(i, new_trans);
+
+ optimized_transformations = null;
+ return;
+ }
+ }
+ error("PixelTransformer: replace_transformation( ): old_trans is not present in " +
+ "transformation collection");
+ }
+
+ public void transform_pixbuf(Gdk.Pixbuf pixbuf, Cancellable? cancellable = null) {
+ transform_to_other_pixbuf(pixbuf, pixbuf, cancellable);
+ }
+
+ public void transform_from_fp(ref float[] fp_pixel_cache, Gdk.Pixbuf dest) {
+ if (optimized_transformations == null)
+ build_optimized_transformations();
+
+ int dest_width = dest.get_width();
+ int dest_height = dest.get_height();
+ int dest_num_channels = dest.get_n_channels();
+ int dest_rowstride = dest.get_rowstride();
+ unowned uchar[] dest_pixels = dest.get_pixels();
+
+ int cache_pixel_ticker = 0;
+
+ for (int j = 0; j < dest_height; j++) {
+ int row_start_index = j * dest_rowstride;
+ int row_end_index = row_start_index + (dest_width * dest_num_channels);
+ for (int i = row_start_index; i < row_end_index; i += dest_num_channels) {
+ RGBAnalyticPixel pixel = RGBAnalyticPixel.from_components(
+ fp_pixel_cache[cache_pixel_ticker],
+ fp_pixel_cache[cache_pixel_ticker + 1],
+ fp_pixel_cache[cache_pixel_ticker + 2]);
+
+ cache_pixel_ticker += 3;
+
+ pixel = apply_transformations(pixel);
+
+ dest_pixels[i] = (uchar) (pixel.red * 255.0f);
+ dest_pixels[i + 1] = (uchar) (pixel.green * 255.0f);
+ dest_pixels[i + 2] = (uchar) (pixel.blue * 255.0f);
+ }
+ }
+ }
+
+ public void transform_to_other_pixbuf(Gdk.Pixbuf source, Gdk.Pixbuf dest,
+ Cancellable? cancellable = null) {
+ if (source.width != dest.width)
+ error("PixelTransformer: source and destination pixbufs must have the same width");
+
+ if (source.height != dest.height)
+ error("PixelTransformer: source and destination pixbufs must have the same height");
+
+ if (source.n_channels != dest.n_channels)
+ error("PixelTransformer: source and destination pixbufs must have the same number " +
+ "of channels");
+
+ if (optimized_transformations == null)
+ build_optimized_transformations();
+
+ int n_channels = source.get_n_channels();
+ int rowstride = source.get_rowstride();
+ int width = source.get_width();
+ int height = source.get_height();
+ int rowbytes = n_channels * width;
+ unowned uchar[] source_pixels = source.get_pixels();
+ unowned uchar[] dest_pixels = dest.get_pixels();
+ for (int j = 0; j < height; j++) {
+ int row_start_index = j * rowstride;
+ int row_end_index = row_start_index + rowbytes;
+ for (int i = row_start_index; i < row_end_index; i += n_channels) {
+ RGBAnalyticPixel current_pixel = RGBAnalyticPixel.from_quantized_components(
+ source_pixels[i], source_pixels[i + 1], source_pixels[i + 2]);
+
+ current_pixel = apply_transformations(current_pixel);
+
+ dest_pixels[i] = current_pixel.quantized_red();
+ dest_pixels[i + 1] = current_pixel.quantized_green();
+ dest_pixels[i + 2] = current_pixel.quantized_blue();
+ }
+
+ if ((cancellable != null) && (cancellable.is_cancelled())) {
+ return;
+ }
+ }
+ }
+}
+
+class RGBHistogram {
+ private const uchar MARKED_BACKGROUND = 30;
+ private const uchar MARKED_FOREGROUND = 210;
+ private const uchar UNMARKED_BACKGROUND = 120;
+
+ public const int GRAPHIC_WIDTH = 256;
+ public const int GRAPHIC_HEIGHT = 100;
+
+ private int[] red_counts = new int[256];
+ private int[] green_counts = new int[256];
+ private int[] blue_counts = new int[256];
+ private int[] qualitative_red_counts = null;
+ private int[] qualitative_green_counts = null;
+ private int[] qualitative_blue_counts = null;
+ private Gdk.Pixbuf graphic = null;
+
+ public RGBHistogram(Gdk.Pixbuf pixbuf) {
+ int sample_bytes = pixbuf.get_bits_per_sample() / 8;
+ int pixel_bytes = sample_bytes * pixbuf.get_n_channels();
+ int row_length_bytes = pixel_bytes * pixbuf.width;
+
+ unowned uchar[] pixel_data = pixbuf.get_pixels();
+
+ for (int y = 0; y < pixbuf.height; y++) {
+ int row_start_offset = y * pixbuf.rowstride;
+
+ int r_offset = row_start_offset;
+ int g_offset = row_start_offset + sample_bytes;
+ int b_offset = row_start_offset + sample_bytes + sample_bytes;
+
+ while (b_offset < (row_start_offset + row_length_bytes)) {
+ red_counts[pixel_data[r_offset]] += 1;
+ green_counts[pixel_data[g_offset]] += 1;
+ blue_counts[pixel_data[b_offset]] += 1;
+
+ r_offset += pixel_bytes;
+ g_offset += pixel_bytes;
+ b_offset += pixel_bytes;
+ }
+ }
+ }
+
+ private int correct_snap_to_quantization(int[] buckets, int i) {
+ assert(buckets.length == 256);
+ assert((i >= 0) && (i <= 255));
+
+ if (i == 0) {
+ if (buckets[i] > 0)
+ if (buckets[i + 1] > 0)
+ if (buckets[i] > (2 * buckets[i + 1]))
+ return buckets[i + 1];
+ } else if (i == 255) {
+ if (buckets[i] > 0)
+ if (buckets[i - 1] > 0)
+ if (buckets[i] > (2 * buckets[i - 1]))
+ return buckets[i - 1];
+ } else {
+ if (buckets[i] > 0)
+ if (buckets[i] > ((buckets[i - 1] + buckets[i + 1]) / 2))
+ return (buckets[i - 1] + buckets[i + 1]) / 2;
+ }
+
+ return buckets[i];
+ }
+
+ private int correct_snap_from_quantization(int[] buckets, int i) {
+ assert(buckets.length == 256);
+ assert((i >= 0) && (i <= 255));
+
+ if (i == 0) {
+ return buckets[i];
+ } else if (i == 255) {
+ return buckets[i];
+ } else {
+ if (buckets[i] == 0)
+ if (buckets[i - 1] > 0)
+ if (buckets[i + 1] > 0)
+ return (buckets[i - 1] + buckets[i + 1]) / 2;
+ }
+
+ return buckets[i];
+ }
+
+ private void smooth_extrema(ref int[] count_data) {
+ assert(count_data.length == 256);
+
+ /* the blocks of code below are unrolled loops that replace values at the extrema
+ (buckets 0-4 and 251-255, inclusive) of the histogram with a weighted
+ average of their neighbors. This mitigates quantization and pooling artifacts */
+
+ count_data[0] = (5 * count_data[0] + 3 * count_data[1] + 2 * count_data[2]) /
+ 10;
+ count_data[1] = (3 * count_data[0] + 5 * count_data[1] + 3 * count_data[2] +
+ 2 * count_data[3]) / 13;
+ count_data[2] = (2 * count_data[0] + 3 * count_data[1] + 5 * count_data[2] +
+ 3 * count_data[3] + 2 * count_data[4]) / 15;
+ count_data[3] = (2 * count_data[1] + 3 * count_data[2] + 5 * count_data[3] +
+ 3 * count_data[4] + 2 * count_data[5]) / 15;
+ count_data[4] = (2 * count_data[2] + 3 * count_data[3] + 5 * count_data[4] +
+ 3 * count_data[5] + 2 * count_data[6]) / 15;
+
+ count_data[255] = (5 * count_data[255] + 3 * count_data[254] + 2 * count_data[253]) /
+ 10;
+ count_data[254] = (3 * count_data[255] + 5 * count_data[254] + 3 * count_data[253] +
+ 2 * count_data[252]) / 13;
+ count_data[253] = (2 * count_data[255] + 3 * count_data[254] + 5 * count_data[253] +
+ 3 * count_data[252] + 2 * count_data[251]) / 15;
+ count_data[252] = (2 * count_data[254] + 3 * count_data[253] + 5 * count_data[252] +
+ 3 * count_data[251] + 2 * count_data[250]) / 15;
+ count_data[251] = (2 * count_data[253] + 3 * count_data[252] + 5 * count_data[251] +
+ 3 * count_data[250] + 2 * count_data[249]) / 15;
+ }
+
+ private void prepare_qualitative_counts() {
+ if ((qualitative_red_counts != null) && (qualitative_green_counts != null) &&
+ (qualitative_blue_counts != null))
+ return;
+
+ qualitative_red_counts = new int[256];
+ qualitative_green_counts = new int[256];
+ qualitative_blue_counts = new int[256];
+
+ int[] temp_red_counts = new int[256];
+ int[] temp_green_counts = new int[256];
+ int[] temp_blue_counts = new int[256];
+
+ /* Remove snap-away-from-value quantization artifacts from the qualitative
+ histogram. While these are indeed present in the underlying data as a
+ consequence of sampling, transformation, and reconstruction, they lead
+ to an unpleasant looking histogram, so we detect and eliminate them here */
+ for (int i = 0; i < 256; i++) {
+ qualitative_red_counts[i] =
+ correct_snap_from_quantization(red_counts, i);
+ qualitative_green_counts[i] =
+ correct_snap_from_quantization(green_counts, i);
+ qualitative_blue_counts[i] =
+ correct_snap_from_quantization(blue_counts, i);
+ }
+
+ for (int i = 0; i < 256; i++) {
+ temp_red_counts[i] = qualitative_red_counts[i];
+ temp_green_counts[i] = qualitative_green_counts[i];
+ temp_blue_counts[i] = qualitative_blue_counts[i];
+ }
+
+ /* Remove snap-to-value quantization artifacts from the qualitative
+ histogram */
+ for (int i = 0; i < 256; i++) {
+ qualitative_red_counts[i] =
+ correct_snap_to_quantization(temp_red_counts, i);
+ qualitative_green_counts[i] =
+ correct_snap_to_quantization(temp_green_counts, i);
+ qualitative_blue_counts[i] =
+ correct_snap_to_quantization(temp_blue_counts, i);
+ }
+
+ /* constrain the peaks in the qualitative histogram so that no peak can be more
+ than 8 times higher than the mean height of the entire image */
+ int mean_qual_count = 0;
+ for (int i = 0; i < 256; i++) {
+ mean_qual_count += (qualitative_red_counts[i] + qualitative_green_counts[i] +
+ qualitative_blue_counts[i]);
+ }
+ mean_qual_count /= (256 * 3);
+ int constrained_max_qual_count = 8 * mean_qual_count;
+ for (int i = 0; i < 256; i++) {
+ if (qualitative_red_counts[i] > constrained_max_qual_count)
+ qualitative_red_counts[i] = constrained_max_qual_count;
+
+ if (qualitative_green_counts[i] > constrained_max_qual_count)
+ qualitative_green_counts[i] = constrained_max_qual_count;
+
+ if (qualitative_blue_counts[i] > constrained_max_qual_count)
+ qualitative_blue_counts[i] = constrained_max_qual_count;
+ }
+
+ smooth_extrema(ref qualitative_red_counts);
+ smooth_extrema(ref qualitative_green_counts);
+ smooth_extrema(ref qualitative_blue_counts);
+ }
+
+ public Gdk.Pixbuf get_graphic() {
+ if (graphic == null) {
+ prepare_qualitative_counts();
+ int max_count = 0;
+ for (int i = 0; i < 256; i++) {
+ if (qualitative_red_counts[i] > max_count)
+ max_count = qualitative_red_counts[i];
+ if (qualitative_green_counts[i] > max_count)
+ max_count = qualitative_green_counts[i];
+ if (qualitative_blue_counts[i] > max_count)
+ max_count = qualitative_blue_counts[i];
+ }
+
+ graphic = new Gdk.Pixbuf(Gdk.Colorspace.RGB, false, 8,
+ GRAPHIC_WIDTH, GRAPHIC_HEIGHT);
+
+ int rowstride = graphic.rowstride;
+ int sample_bytes = graphic.get_bits_per_sample() / 8;
+ int pixel_bytes = sample_bytes * graphic.get_n_channels();
+
+ double scale_bar = 0.98 * ((double) GRAPHIC_HEIGHT) /
+ ((double) max_count);
+
+ unowned uchar[] pixel_data = graphic.get_pixels();
+
+ /* detect pathological case of bilevel black & white images -- in this case, draw
+ a blank histogram and return it to the caller */
+ if (max_count == 0) {
+ for (int i = 0; i < (pixel_bytes * graphic.width * graphic.height); i++) {
+ pixel_data[i] = UNMARKED_BACKGROUND;
+ }
+ return graphic;
+ }
+
+ for (int x = 0; x < 256; x++) {
+ int red_bar_height = (int)(((double) qualitative_red_counts[x]) *
+ scale_bar);
+ int green_bar_height = (int)(((double) qualitative_green_counts[x]) *
+ scale_bar);
+ int blue_bar_height = (int)(((double) qualitative_blue_counts[x]) *
+ scale_bar);
+
+ int max_bar_height = int.max(int.max(red_bar_height,
+ green_bar_height), blue_bar_height);
+
+ int y = GRAPHIC_HEIGHT - 1;
+ int pixel_index = (x * pixel_bytes) + (y * rowstride);
+ for ( ; y >= (GRAPHIC_HEIGHT - max_bar_height); y--) {
+ pixel_data[pixel_index] = MARKED_BACKGROUND;
+ pixel_data[pixel_index + 1] = MARKED_BACKGROUND;
+ pixel_data[pixel_index + 2] = MARKED_BACKGROUND;
+
+ if (y >= (GRAPHIC_HEIGHT - red_bar_height - 1))
+ pixel_data[pixel_index] = MARKED_FOREGROUND;
+ if (y >= (GRAPHIC_HEIGHT - green_bar_height - 1))
+ pixel_data[pixel_index + 1] = MARKED_FOREGROUND;
+ if (y >= (GRAPHIC_HEIGHT - blue_bar_height - 1))
+ pixel_data[pixel_index + 2] = MARKED_FOREGROUND;
+
+ pixel_index -= rowstride;
+ }
+
+ for ( ; y >= 0; y--) {
+ pixel_data[pixel_index] = UNMARKED_BACKGROUND;
+ pixel_data[pixel_index + 1] = UNMARKED_BACKGROUND;
+ pixel_data[pixel_index + 2] = UNMARKED_BACKGROUND;
+
+ pixel_index -= rowstride;
+ }
+ }
+ }
+
+ return graphic;
+ }
+}
+
+public class IntensityHistogram {
+ private int[] counts = new int[256];
+ private float[] probabilities = new float[256];
+ private float[] cumulative_probabilities = new float[256];
+
+ public IntensityHistogram(Gdk.Pixbuf pixbuf) {
+ int n_channels = pixbuf.get_n_channels();
+ int rowstride = pixbuf.get_rowstride();
+ int width = pixbuf.get_width();
+ int height = pixbuf.get_height();
+ int rowbytes = n_channels * width;
+ unowned uchar[] pixels = pixbuf.get_pixels();
+ for (int j = 0; j < height; j++) {
+ int row_start_index = j * rowstride;
+ int row_end_index = row_start_index + rowbytes;
+ for (int i = row_start_index; i < row_end_index; i += n_channels) {
+ RGBAnalyticPixel pix_rgb = RGBAnalyticPixel.from_quantized_components(
+ pixels[i], pixels[i + 1], pixels[i + 2]);
+ HSVAnalyticPixel pix_hsi = HSVAnalyticPixel.from_rgb(pix_rgb);
+ int quantized_light_value = (int)(pix_hsi.light_value * 255.0f);
+ counts[quantized_light_value] += 1;
+ }
+ }
+
+ float pixel_count = (float)(pixbuf.width * pixbuf.height);
+ float accumulator = 0.0f;
+ for (int i = 0; i < 256; i++) {
+ probabilities[i] = ((float) counts[i]) / pixel_count;
+ accumulator += probabilities[i];
+ cumulative_probabilities[i] = accumulator;
+ }
+ }
+
+ public float get_cumulative_probability(int level) {
+ // clamp out-of-range pixels to prevent crashing.
+ level = level.clamp(0, 255);
+ return cumulative_probabilities[level];
+ }
+}
+
+public class ExpansionTransformation : HSVTransformation {
+ private float[] remap_table = null;
+ private const float LOW_DISCARD_MASS = 0.02f;
+ private const float HIGH_DISCARD_MASS = 0.02f;
+
+ private int low_kink;
+ private int high_kink;
+
+ public ExpansionTransformation(IntensityHistogram histogram) {
+ base(PixelTransformationType.TONE_EXPANSION);
+
+ remap_table = new float[256];
+
+ float LOW_KINK_MASS = LOW_DISCARD_MASS;
+ low_kink = 0;
+ while (histogram.get_cumulative_probability(low_kink) < LOW_KINK_MASS)
+ low_kink++;
+
+ float HIGH_KINK_MASS = 1.0f - HIGH_DISCARD_MASS;
+ high_kink = 255;
+ while ((histogram.get_cumulative_probability(high_kink) > HIGH_KINK_MASS) && (high_kink > 0))
+ high_kink--;
+
+ build_remap_table();
+ }
+
+ public ExpansionTransformation.from_extrema(int black_point, int white_point) {
+ base(PixelTransformationType.TONE_EXPANSION);
+
+ white_point = white_point.clamp(0, 255);
+ black_point = black_point.clamp(0, 255);
+
+ if (black_point == white_point) {
+ if (black_point == 0)
+ white_point = 1;
+ else if (white_point == 255)
+ black_point = 254;
+ else
+ black_point = white_point - 1;
+ }
+
+ low_kink = black_point;
+ high_kink = white_point;
+
+ build_remap_table();
+ }
+
+ public ExpansionTransformation.from_string(string encoded_transformation) {
+ base(PixelTransformationType.TONE_EXPANSION);
+
+ encoded_transformation.canon("0123456789. ", ' ');
+ encoded_transformation.chug();
+ encoded_transformation.chomp();
+
+ int num_captured = encoded_transformation.scanf("%d %d", &low_kink,
+ &high_kink);
+
+ assert(num_captured == 2);
+
+ build_remap_table();
+ }
+
+ private void build_remap_table() {
+ if (remap_table == null)
+ remap_table = new float[256];
+
+ float low_kink_f = ((float) low_kink) / 255.0f;
+ float high_kink_f = ((float) high_kink) / 255.0f;
+
+ float slope = 1.0f / (high_kink_f - low_kink_f);
+ float intercept = -(low_kink_f / (high_kink_f - low_kink_f));
+
+ int i = 0;
+ for ( ; i <= low_kink; i++)
+ remap_table[i] = 0.0f;
+
+ for ( ; i < high_kink; i++)
+ remap_table[i] = slope * (((float) i) / 255.0f) + intercept;
+
+ for ( ; i < 256; i++)
+ remap_table[i] = 1.0f;
+ }
+
+ public override HSVAnalyticPixel transform_pixel_hsv(HSVAnalyticPixel pixel) {
+ int remap_index = (int)(pixel.light_value * 255.0f);
+
+ HSVAnalyticPixel result = pixel;
+ result.light_value = remap_table[remap_index];
+
+ result.light_value = result.light_value.clamp(0.0f, 1.0f);
+
+ return result;
+ }
+
+ public override string to_string() {
+ return "{ %d, %d }".printf(low_kink, high_kink);
+ }
+
+ public int get_white_point() {
+ return high_kink;
+ }
+
+ public int get_black_point() {
+ return low_kink;
+ }
+
+ public override bool is_identity() {
+ return ((low_kink == 0) && (high_kink == 255));
+ }
+
+ public override PixelTransformation copy() {
+ return new ExpansionTransformation.from_extrema(low_kink, high_kink);
+ }
+}
+
+public class ShadowDetailTransformation : HSVTransformation {
+ private const float MAX_EFFECT_SHIFT = 0.5f;
+ private const float MIN_TONAL_WIDTH = 0.1f;
+ private const float MAX_TONAL_WIDTH = 1.0f;
+ private const float TONAL_WIDTH = 1.0f;
+
+ private float intensity = 0.0f;
+ private float[] remap_table = null;
+
+ public const float MIN_PARAMETER = 0.0f;
+ public const float MAX_PARAMETER = 32.0f;
+
+ public ShadowDetailTransformation(float user_intensity) {
+ base(PixelTransformationType.SHADOWS);
+
+ intensity = user_intensity;
+ float intensity_adj = (intensity / MAX_PARAMETER).clamp(0.0f, 1.0f);
+
+ float effect_shift = MAX_EFFECT_SHIFT * intensity_adj;
+ HermiteGammaApproximationFunction func =
+ new HermiteGammaApproximationFunction(TONAL_WIDTH);
+
+ remap_table = new float[256];
+ for (int i = 0; i < 256; i++) {
+ float x = ((float) i) / 255.0f;
+ float weight = func.evaluate(x);
+ remap_table[i] = (weight * (x + effect_shift)) + ((1.0f - weight) * x);
+ }
+ }
+
+ public override HSVAnalyticPixel transform_pixel_hsv(HSVAnalyticPixel pixel) {
+ HSVAnalyticPixel result = pixel;
+ result.light_value = (remap_table[(int)(pixel.light_value * 255.0f)]).clamp(0.0f, 1.0f);
+ return result;
+ }
+
+ public override PixelTransformation copy() {
+ return new ShadowDetailTransformation(intensity);
+ }
+
+ public override bool is_identity() {
+ return (intensity == 0.0f);
+ }
+
+ public float get_parameter() {
+ return intensity;
+ }
+}
+
+public class HermiteGammaApproximationFunction {
+ private float x_scale = 1.0f;
+ private float nonzero_interval_upper = 1.0f;
+
+ public HermiteGammaApproximationFunction(float user_interval_upper) {
+ nonzero_interval_upper = user_interval_upper.clamp(0.1f, 1.0f);
+ x_scale = 1.0f / nonzero_interval_upper;
+ }
+
+ public float evaluate(float x) {
+ if (x < 0.0f)
+ return 0.0f;
+ else if (x > nonzero_interval_upper)
+ return 0.0f;
+ else {
+ float indep_var = x_scale * x;
+
+ float dep_var = 6.0f * ((indep_var * indep_var * indep_var) -
+ (2.0f * (indep_var * indep_var)) + (indep_var));
+
+ return dep_var.clamp(0.0f, 1.0f);
+ }
+ }
+}
+
+public class HighlightDetailTransformation : HSVTransformation {
+ private const float MAX_EFFECT_SHIFT = 0.5f;
+ private const float MIN_TONAL_WIDTH = 0.1f;
+ private const float MAX_TONAL_WIDTH = 1.0f;
+ private const float TONAL_WIDTH = 1.0f;
+
+ private float intensity = 0.0f;
+ private float[] remap_table = null;
+
+ public const float MIN_PARAMETER = -32.0f;
+ public const float MAX_PARAMETER = 0.0f;
+
+ public HighlightDetailTransformation(float user_intensity) {
+ base(PixelTransformationType.HIGHLIGHTS);
+
+ intensity = user_intensity;
+ float intensity_adj = (intensity / MIN_PARAMETER).clamp(0.0f, 1.0f);
+
+ float effect_shift = MAX_EFFECT_SHIFT * intensity_adj;
+ HermiteGammaApproximationFunction func =
+ new HermiteGammaApproximationFunction(TONAL_WIDTH);
+
+ remap_table = new float[256];
+ for (int i = 0; i < 256; i++) {
+ float x = ((float) i) / 255.0f;
+ float weight = func.evaluate(1.0f - x);
+ remap_table[i] = (weight * (x - effect_shift)) + ((1.0f - weight) * x);
+ }
+ }
+
+ public override HSVAnalyticPixel transform_pixel_hsv(HSVAnalyticPixel pixel) {
+ HSVAnalyticPixel result = pixel;
+ result.light_value = (remap_table[(int)(pixel.light_value * 255.0f)]).clamp(0.0f, 1.0f);
+ return result;
+ }
+
+ public override PixelTransformation copy() {
+ return new HighlightDetailTransformation(intensity);
+ }
+
+ public override bool is_identity() {
+ return (intensity == 0.0f);
+ }
+
+ public float get_parameter() {
+ return intensity;
+ }
+}
+
+namespace AutoEnhance {
+ const int SHADOW_DETECT_MIN_INTENSITY = 8;
+ const int SHADOW_DETECT_MAX_INTENSITY = 100;
+ const int SHADOW_DETECT_INTENSITY_RANGE = SHADOW_DETECT_MAX_INTENSITY -
+ SHADOW_DETECT_MIN_INTENSITY;
+ const float SHADOW_MODE_HIGH_DISCARD_MASS = 0.02f;
+ const float SHADOW_AGGRESSIVENESS_MUL = 0.4f;
+ const int EMPIRICAL_DARK = 30;
+
+public PixelTransformationBundle create_auto_enhance_adjustments(Gdk.Pixbuf pixbuf) {
+ PixelTransformationBundle adjustments = new PixelTransformationBundle();
+
+ IntensityHistogram analysis_histogram = new IntensityHistogram(pixbuf);
+ /* compute the percentage of pixels in the image that fall into the shadow range --
+ this measures "of the pixels in the image, how many of them are in shadow?" */
+ float pct_in_range =
+ 100.0f *(analysis_histogram.get_cumulative_probability(SHADOW_DETECT_MAX_INTENSITY) -
+ analysis_histogram.get_cumulative_probability(SHADOW_DETECT_MIN_INTENSITY));
+
+ /* compute the mean intensity of the pixels that are in the shadow range -- this measures
+ "of those pixels that are in shadow, just how dark are they?" */
+ float shadow_range_mean_prob_val =
+ (analysis_histogram.get_cumulative_probability(SHADOW_DETECT_MIN_INTENSITY) +
+ analysis_histogram.get_cumulative_probability(SHADOW_DETECT_MAX_INTENSITY)) * 0.5f;
+ int shadow_mean_intensity = SHADOW_DETECT_MIN_INTENSITY;
+ for ( ; shadow_mean_intensity <= SHADOW_DETECT_MAX_INTENSITY; shadow_mean_intensity++) {
+ if (analysis_histogram.get_cumulative_probability(shadow_mean_intensity) >= shadow_range_mean_prob_val)
+ break;
+ }
+
+ /* if more than 40 percent of the pixels in the image are in the shadow detection range,
+ or if the mean intensity within the shadow range is less than 50 (an empirically
+ determined threshold below which pixels appear very dark), regardless of the
+ percent of pixels in it, then perform shadow detail enhancement. Otherwise,
+ skip shadow detail enhancement and perform a traditional contrast expansion */
+ if ((pct_in_range > 40.0f) || (pct_in_range > 20.0f) && (shadow_mean_intensity < EMPIRICAL_DARK)) {
+ float shadow_trans_effect_size = ((((float) SHADOW_DETECT_MAX_INTENSITY) -
+ ((float) shadow_mean_intensity)) / ((float) SHADOW_DETECT_INTENSITY_RANGE)) *
+ ShadowDetailTransformation.MAX_PARAMETER;
+
+ shadow_trans_effect_size *= SHADOW_AGGRESSIVENESS_MUL;
+
+ adjustments.set(new ShadowDetailTransformation(shadow_trans_effect_size));
+
+ /* if shadow detail expansion is being performed, we still perform contrast expansion,
+ but only on the top end */
+ int discard_point = 255;
+ for ( ; discard_point > -1; discard_point--) {
+ if ((1.0f - analysis_histogram.get_cumulative_probability(discard_point)) >
+ SHADOW_MODE_HIGH_DISCARD_MASS)
+ break;
+ }
+
+ adjustments.set(new ExpansionTransformation.from_extrema(0, discard_point));
+ }
+ else {
+ adjustments.set(new ExpansionTransformation(analysis_histogram));
+ adjustments.set(new ShadowDetailTransformation(0));
+ }
+ /* zero out any existing color transformations as these may conflict with
+ auto-enhancement */
+ adjustments.set(new HighlightDetailTransformation(0.0f));
+ adjustments.set(new TemperatureTransformation(0.0f));
+ adjustments.set(new TintTransformation(0.0f));
+ adjustments.set(new ExposureTransformation(0.0f));
+ adjustments.set(new SaturationTransformation(0.0f));
+
+ return adjustments;
+}
+}
+
diff --git a/src/CommandManager.vala b/src/CommandManager.vala
new file mode 100644
index 0000000..070bc73
--- /dev/null
+++ b/src/CommandManager.vala
@@ -0,0 +1,201 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public interface CommandDescription : Object {
+ public abstract string get_name();
+
+ public abstract string get_explanation();
+}
+
+// Command's overrideable action calls are guaranteed to be called in this order:
+//
+// * prepare()
+// * execute() (once and only once)
+// * prepare()
+// * undo()
+// * prepare()
+// * redo()
+// * prepare()
+// * undo()
+// * prepare()
+// * redo() ...
+//
+// redo()'s default implementation is to call execute, which in many cases is appropriate.
+public abstract class Command : Object, CommandDescription {
+ private string name;
+ private string explanation;
+ private weak CommandManager manager = null;
+
+ public Command(string name, string explanation) {
+ this.name = name;
+ this.explanation = explanation;
+ }
+
+ ~Command() {
+#if TRACE_DTORS
+ debug("DTOR: Command %s (%s)", name, explanation);
+#endif
+ }
+
+ public virtual void prepare() {
+ }
+
+ public abstract void execute();
+
+ public abstract void undo();
+
+ public virtual void redo() {
+ execute();
+ }
+
+ // Command compression, allowing multiple commands of similar type to be undone/redone at the
+ // same time. If this method returns true, it's assumed the passed Command has been executed.
+ public virtual bool compress(Command command) {
+ return false;
+ }
+
+ public virtual string get_name() {
+ return name;
+ }
+
+ public virtual string get_explanation() {
+ return explanation;
+ }
+
+ public CommandManager? get_command_manager() {
+ return manager;
+ }
+
+ // This should only be called by CommandManager.
+ public void internal_set_command_manager(CommandManager manager) {
+ assert(this.manager == null);
+
+ this.manager = manager;
+ }
+}
+
+public class CommandManager {
+ public const int DEFAULT_DEPTH = 20;
+
+ private int depth;
+ private Gee.ArrayList<Command> undo_stack = new Gee.ArrayList<Command>();
+ private Gee.ArrayList<Command> redo_stack = new Gee.ArrayList<Command>();
+
+ public signal void altered(bool can_undo, bool can_redo);
+
+ public CommandManager(int depth = DEFAULT_DEPTH) {
+ assert(depth > 0);
+
+ this.depth = depth;
+ }
+
+ public void reset() {
+ undo_stack.clear();
+ redo_stack.clear();
+
+ altered(false, false);
+ }
+
+ public void execute(Command command) {
+ // assign command to this manager
+ command.internal_set_command_manager(this);
+
+ // clear redo stack; executing a command implies not going to undo an undo
+ redo_stack.clear();
+
+ // see if this command can be compressed (merged) with the topmost command
+ Command? top_command = top(undo_stack);
+ if (top_command != null) {
+ if (top_command.compress(command))
+ return;
+ }
+
+ // update state before executing command
+ push(undo_stack, command);
+
+ command.prepare();
+ command.execute();
+
+ // notify after execution
+ altered(can_undo(), can_redo());
+ }
+
+ public bool can_undo() {
+ return undo_stack.size > 0;
+ }
+
+ public CommandDescription? get_undo_description() {
+ return top(undo_stack);
+ }
+
+ public bool undo() {
+ Command? command = pop(undo_stack);
+ if (command == null)
+ return false;
+
+ // update state before execution
+ push(redo_stack, command);
+
+ // undo command with state ready
+ command.prepare();
+ command.undo();
+
+ // report state changed after command has executed
+ altered(can_undo(), can_redo());
+
+ return true;
+ }
+
+ public bool can_redo() {
+ return redo_stack.size > 0;
+ }
+
+ public CommandDescription? get_redo_description() {
+ return top(redo_stack);
+ }
+
+ public bool redo() {
+ Command? command = pop(redo_stack);
+ if (command == null)
+ return false;
+
+ // update state before execution
+ push(undo_stack, command);
+
+ // redo command with state ready
+ command.prepare();
+ command.redo();
+
+ // report state changed after command has executed
+ altered(can_undo(), can_redo());
+
+ return true;
+ }
+
+ private Command? top(Gee.ArrayList<Command> stack) {
+ return (stack.size > 0) ? stack.get(stack.size - 1) : null;
+ }
+
+ private void push(Gee.ArrayList<Command> stack, Command command) {
+ stack.add(command);
+
+ // maintain a max depth
+ while (stack.size >= depth)
+ stack.remove_at(0);
+ }
+
+ private Command? pop(Gee.ArrayList<Command> stack) {
+ if (stack.size <= 0)
+ return null;
+
+ Command command = stack.get(stack.size - 1);
+ bool removed = stack.remove(command);
+ assert(removed);
+
+ return command;
+ }
+}
+
diff --git a/src/Commands.vala b/src/Commands.vala
new file mode 100644
index 0000000..0ad8ecb
--- /dev/null
+++ b/src/Commands.vala
@@ -0,0 +1,2497 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// PageCommand stores the current page when a Command is created. Subclasses can call return_to_page()
+// if it's appropriate to return to that page when executing an undo() or redo().
+public abstract class PageCommand : Command {
+ private Page? page;
+ private bool auto_return = true;
+ private Photo library_photo = null;
+ private CollectionPage collection_page = null;
+
+ public PageCommand(string name, string explanation) {
+ base (name, explanation);
+
+ page = AppWindow.get_instance().get_current_page();
+
+ if (page != null) {
+ page.destroy.connect(on_page_destroyed);
+
+ // If the command occurred on a LibaryPhotoPage, the PageCommand must record additional
+ // objects to be restore it to its old state: a specific photo to focus on, a page to return
+ // to, and a view collection to operate over. Note that these objects can be cleared if
+ // the page goes into the background. The required objects are stored below.
+ LibraryPhotoPage photo_page = page as LibraryPhotoPage;
+ if (photo_page != null) {
+ library_photo = photo_page.get_photo();
+ collection_page = photo_page.get_controller_page();
+
+ if (library_photo != null && collection_page != null) {
+ library_photo.destroyed.connect(on_photo_destroyed);
+ collection_page.destroy.connect(on_controller_destroyed);
+ } else {
+ library_photo = null;
+ collection_page = null;
+ }
+ }
+ }
+ }
+
+ ~PageCommand() {
+ if (page != null)
+ page.destroy.disconnect(on_page_destroyed);
+
+ if (library_photo != null)
+ library_photo.destroyed.disconnect(on_photo_destroyed);
+
+ if (collection_page != null)
+ collection_page.destroy.disconnect(on_controller_destroyed);
+ }
+
+ public void set_auto_return_to_page(bool auto_return) {
+ this.auto_return = auto_return;
+ }
+
+ public override void prepare() {
+ if (auto_return)
+ return_to_page();
+
+ base.prepare();
+ }
+
+ public void return_to_page() {
+ LibraryPhotoPage photo_page = page as LibraryPhotoPage;
+
+ if (photo_page != null) {
+ if (library_photo != null && collection_page != null) {
+ bool photo_in_collection = false;
+ int count = collection_page.get_view().get_count();
+ for (int i = 0; i < count; i++) {
+ if ( ((Thumbnail) collection_page.get_view().get_at(i)).get_media_source() == library_photo) {
+ photo_in_collection = true;
+ break;
+ }
+ }
+
+ if (photo_in_collection)
+ LibraryWindow.get_app().switch_to_photo_page(collection_page, library_photo);
+ }
+ } else if (page != null)
+ AppWindow.get_instance().set_current_page(page);
+ }
+
+ private void on_page_destroyed() {
+ page.destroy.disconnect(on_page_destroyed);
+ page = null;
+ }
+
+ private void on_photo_destroyed() {
+ library_photo.destroyed.disconnect(on_photo_destroyed);
+ library_photo = null;
+ }
+
+ private void on_controller_destroyed() {
+ collection_page.destroy.disconnect(on_controller_destroyed);
+ collection_page = null;
+ }
+
+}
+
+public abstract class SingleDataSourceCommand : PageCommand {
+ protected DataSource source;
+
+ public SingleDataSourceCommand(DataSource source, string name, string explanation) {
+ base(name, explanation);
+
+ this.source = source;
+
+ source.destroyed.connect(on_source_destroyed);
+ }
+
+ ~SingleDataSourceCommand() {
+ source.destroyed.disconnect(on_source_destroyed);
+ }
+
+ public DataSource get_source() {
+ return source;
+ }
+
+ private void on_source_destroyed() {
+ // too much risk in simply removing this from the CommandManager; if this is considered too
+ // broad a brushstroke, can return to this later
+ get_command_manager().reset();
+ }
+}
+
+public abstract class SimpleProxyableCommand : PageCommand {
+ private SourceProxy proxy;
+ private Gee.HashSet<SourceProxy> proxies = new Gee.HashSet<SourceProxy>();
+
+ public SimpleProxyableCommand(Proxyable proxyable, string name, string explanation) {
+ base (name, explanation);
+
+ proxy = proxyable.get_proxy();
+ proxy.broken.connect(on_proxy_broken);
+ }
+
+ ~SimpleProxyableCommand() {
+ proxy.broken.disconnect(on_proxy_broken);
+ clear_added_proxies();
+ }
+
+ public override void execute() {
+ execute_on_source(proxy.get_source());
+ }
+
+ protected abstract void execute_on_source(DataSource source);
+
+ public override void undo() {
+ undo_on_source(proxy.get_source());
+ }
+
+ protected abstract void undo_on_source(DataSource source);
+
+ // If the Command deals with other Proxyables during processing, it can add them here and the
+ // SimpleProxyableCommand will deal with created a SourceProxy and if it signals it's broken.
+ // Note that these cannot be removed programatically, but only cleared en masse; it's expected
+ // this is fine for the nature of a Command.
+ protected void add_proxyables(Gee.Collection<Proxyable> proxyables) {
+ foreach (Proxyable proxyable in proxyables) {
+ SourceProxy added_proxy = proxyable.get_proxy();
+ added_proxy.broken.connect(on_proxy_broken);
+ proxies.add(added_proxy);
+ }
+ }
+
+ // See add_proxyables() for a note on use.
+ protected void clear_added_proxies() {
+ foreach (SourceProxy added_proxy in proxies)
+ added_proxy.broken.disconnect(on_proxy_broken);
+
+ proxies.clear();
+ }
+
+ private void on_proxy_broken() {
+ debug("on_proxy_broken");
+ get_command_manager().reset();
+ }
+}
+
+public abstract class SinglePhotoTransformationCommand : SingleDataSourceCommand {
+ private PhotoTransformationState state;
+
+ public SinglePhotoTransformationCommand(Photo photo, string name, string explanation) {
+ base(photo, name, explanation);
+
+ state = photo.save_transformation_state();
+ state.broken.connect(on_state_broken);
+ }
+
+ ~SinglePhotoTransformationCommand() {
+ state.broken.disconnect(on_state_broken);
+ }
+
+ public override void undo() {
+ ((Photo) source).load_transformation_state(state);
+ }
+
+ private void on_state_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public abstract class GenericPhotoTransformationCommand : SingleDataSourceCommand {
+ private PhotoTransformationState original_state = null;
+ private PhotoTransformationState transformed_state = null;
+
+ public GenericPhotoTransformationCommand(Photo photo, string name, string explanation) {
+ base(photo, name, explanation);
+ }
+
+ ~GenericPhotoTransformationState() {
+ if (original_state != null)
+ original_state.broken.disconnect(on_state_broken);
+
+ if (transformed_state != null)
+ transformed_state.broken.disconnect(on_state_broken);
+ }
+
+ public override void execute() {
+ Photo photo = (Photo) source;
+
+ original_state = photo.save_transformation_state();
+ original_state.broken.connect(on_state_broken);
+
+ execute_on_photo(photo);
+
+ transformed_state = photo.save_transformation_state();
+ transformed_state.broken.connect(on_state_broken);
+ }
+
+ public abstract void execute_on_photo(Photo photo);
+
+ public override void undo() {
+ // use the original state of the photo
+ ((Photo) source).load_transformation_state(original_state);
+ }
+
+ public override void redo() {
+ // use the state of the photo after transformation
+ ((Photo) source).load_transformation_state(transformed_state);
+ }
+
+ protected virtual bool can_compress(Command command) {
+ return false;
+ }
+
+ public override bool compress(Command command) {
+ if (!can_compress(command))
+ return false;
+
+ GenericPhotoTransformationCommand generic = command as GenericPhotoTransformationCommand;
+ if (generic == null)
+ return false;
+
+ if (generic.source != source)
+ return false;
+
+ // execute this new (and successive) command
+ generic.execute();
+
+ // save it's new transformation state as ours
+ transformed_state = generic.transformed_state;
+
+ return true;
+ }
+
+ private void on_state_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public abstract class MultipleDataSourceCommand : PageCommand {
+ protected const int MIN_OPS_FOR_PROGRESS_WINDOW = 5;
+
+ protected Gee.ArrayList<DataSource> source_list = new Gee.ArrayList<DataSource>();
+
+ private string progress_text;
+ private string undo_progress_text;
+ private Gee.ArrayList<DataSource> acted_upon = new Gee.ArrayList<DataSource>();
+ private Gee.HashSet<SourceCollection> hooked_collections = new Gee.HashSet<SourceCollection>();
+
+ public MultipleDataSourceCommand(Gee.Iterable<DataView> iter, string progress_text,
+ string undo_progress_text, string name, string explanation) {
+ base(name, explanation);
+
+ this.progress_text = progress_text;
+ this.undo_progress_text = undo_progress_text;
+
+ foreach (DataView view in iter) {
+ DataSource source = view.get_source();
+ SourceCollection? collection = (SourceCollection) source.get_membership();
+
+ if (collection != null) {
+ hooked_collections.add(collection);
+ }
+ source_list.add(source);
+ }
+
+ foreach (SourceCollection current_collection in hooked_collections) {
+ current_collection.item_destroyed.connect(on_source_destroyed);
+ }
+ }
+
+ ~MultipleDataSourceCommand() {
+ foreach (SourceCollection current_collection in hooked_collections) {
+ current_collection.item_destroyed.disconnect(on_source_destroyed);
+ }
+ }
+
+ public Gee.Iterable<DataSource> get_sources() {
+ return source_list;
+ }
+
+ public int get_source_count() {
+ return source_list.size;
+ }
+
+ private void on_source_destroyed(DataSource source) {
+ // as with SingleDataSourceCommand, too risky to selectively remove commands from the stack,
+ // although this could be reconsidered in the future
+ if (source_list.contains(source))
+ get_command_manager().reset();
+ }
+
+ public override void execute() {
+ acted_upon.clear();
+
+ start_transaction();
+ execute_all(true, true, source_list, acted_upon);
+ commit_transaction();
+ }
+
+ public abstract void execute_on_source(DataSource source);
+
+ public override void undo() {
+ if (acted_upon.size > 0) {
+ start_transaction();
+ execute_all(false, false, acted_upon, null);
+ commit_transaction();
+
+ acted_upon.clear();
+ }
+ }
+
+ public abstract void undo_on_source(DataSource source);
+
+ private void start_transaction() {
+ foreach (SourceCollection sources in hooked_collections) {
+ MediaSourceCollection? media_collection = sources as MediaSourceCollection;
+ if (media_collection != null)
+ media_collection.transaction_controller.begin();
+ }
+ }
+
+ private void commit_transaction() {
+ foreach (SourceCollection sources in hooked_collections) {
+ MediaSourceCollection? media_collection = sources as MediaSourceCollection;
+ if (media_collection != null)
+ media_collection.transaction_controller.commit();
+ }
+ }
+
+ private void execute_all(bool exec, bool can_cancel, Gee.ArrayList<DataSource> todo,
+ Gee.ArrayList<DataSource>? completed) {
+ AppWindow.get_instance().set_busy_cursor();
+
+ int count = 0;
+ int total = todo.size;
+ int two_percent = (int) ((double) total / 50.0);
+ if (two_percent <= 0)
+ two_percent = 1;
+
+ string text = exec ? progress_text : undo_progress_text;
+
+ Cancellable cancellable = null;
+ ProgressDialog progress = null;
+ if (total >= MIN_OPS_FOR_PROGRESS_WINDOW) {
+ cancellable = can_cancel ? new Cancellable() : null;
+ progress = new ProgressDialog(AppWindow.get_instance(), text, cancellable);
+ }
+
+ foreach (DataSource source in todo) {
+ if (exec)
+ execute_on_source(source);
+ else
+ undo_on_source(source);
+
+ if (completed != null)
+ completed.add(source);
+
+ if (progress != null) {
+ if ((++count % two_percent) == 0) {
+ progress.set_fraction(count, total);
+ spin_event_loop();
+ }
+
+ if (cancellable != null && cancellable.is_cancelled())
+ break;
+ }
+ }
+
+ if (progress != null)
+ progress.close();
+
+ AppWindow.get_instance().set_normal_cursor();
+ }
+}
+
+// TODO: Upgrade MultipleDataSourceAtOnceCommand to use TransactionControllers.
+public abstract class MultipleDataSourceAtOnceCommand : PageCommand {
+ private Gee.HashSet<DataSource> sources = new Gee.HashSet<DataSource>();
+ private Gee.HashSet<SourceCollection> hooked_collections = new Gee.HashSet<SourceCollection>();
+
+ public MultipleDataSourceAtOnceCommand(Gee.Collection<DataSource> sources, string name,
+ string explanation) {
+ base (name, explanation);
+
+ this.sources.add_all(sources);
+
+ foreach (DataSource source in this.sources) {
+ SourceCollection? membership = source.get_membership() as SourceCollection;
+ if (membership != null)
+ hooked_collections.add(membership);
+ }
+
+ foreach (SourceCollection source_collection in hooked_collections)
+ source_collection.items_destroyed.connect(on_sources_destroyed);
+ }
+
+ ~MultipleDataSourceAtOnceCommand() {
+ foreach (SourceCollection source_collection in hooked_collections)
+ source_collection.items_destroyed.disconnect(on_sources_destroyed);
+ }
+
+ public override void execute() {
+ AppWindow.get_instance().set_busy_cursor();
+
+ DatabaseTable.begin_transaction();
+ MediaCollectionRegistry.get_instance().freeze_all();
+
+ execute_on_all(sources);
+
+ MediaCollectionRegistry.get_instance().thaw_all();
+ try {
+ DatabaseTable.commit_transaction();
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ } finally {
+ AppWindow.get_instance().set_normal_cursor();
+ }
+ }
+
+ protected abstract void execute_on_all(Gee.Collection<DataSource> sources);
+
+ public override void undo() {
+ AppWindow.get_instance().set_busy_cursor();
+
+ DatabaseTable.begin_transaction();
+ MediaCollectionRegistry.get_instance().freeze_all();
+
+ undo_on_all(sources);
+
+ MediaCollectionRegistry.get_instance().thaw_all();
+ try {
+ DatabaseTable.commit_transaction();
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ } finally {
+ AppWindow.get_instance().set_normal_cursor();
+ }
+ }
+
+ protected abstract void undo_on_all(Gee.Collection<DataSource> sources);
+
+ private void on_sources_destroyed(Gee.Collection<DataSource> destroyed) {
+ foreach (DataSource source in destroyed) {
+ if (sources.contains(source)) {
+ get_command_manager().reset();
+
+ break;
+ }
+ }
+ }
+}
+
+public abstract class MultiplePhotoTransformationCommand : MultipleDataSourceCommand {
+ private Gee.HashMap<Photo, PhotoTransformationState> map = new Gee.HashMap<
+ Photo, PhotoTransformationState>();
+
+ public MultiplePhotoTransformationCommand(Gee.Iterable<DataView> iter, string progress_text,
+ string undo_progress_text, string name, string explanation) {
+ base(iter, progress_text, undo_progress_text, name, explanation);
+
+ foreach (DataSource source in source_list) {
+ Photo photo = (Photo) source;
+ PhotoTransformationState state = photo.save_transformation_state();
+ state.broken.connect(on_state_broken);
+
+ map.set(photo, state);
+ }
+ }
+
+ ~MultiplePhotoTransformationCommand() {
+ foreach (PhotoTransformationState state in map.values)
+ state.broken.disconnect(on_state_broken);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ Photo photo = (Photo) source;
+
+ PhotoTransformationState state = map.get(photo);
+ assert(state != null);
+
+ photo.load_transformation_state(state);
+ }
+
+ private void on_state_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public class RotateSingleCommand : SingleDataSourceCommand {
+ private Rotation rotation;
+
+ public RotateSingleCommand(Photo photo, Rotation rotation, string name, string explanation) {
+ base(photo, name, explanation);
+
+ this.rotation = rotation;
+ }
+
+ public override void execute() {
+ ((Photo) source).rotate(rotation);
+ }
+
+ public override void undo() {
+ ((Photo) source).rotate(rotation.opposite());
+ }
+}
+
+public class RotateMultipleCommand : MultipleDataSourceCommand {
+ private Rotation rotation;
+
+ public RotateMultipleCommand(Gee.Iterable<DataView> iter, Rotation rotation, string name,
+ string explanation, string progress_text, string undo_progress_text) {
+ base(iter, progress_text, undo_progress_text, name, explanation);
+
+ this.rotation = rotation;
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Photo) source).rotate(rotation);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ ((Photo) source).rotate(rotation.opposite());
+ }
+}
+
+public class EditTitleCommand : SingleDataSourceCommand {
+ private string new_title;
+ private string? old_title;
+
+ public EditTitleCommand(MediaSource source, string new_title) {
+ base(source, Resources.EDIT_TITLE_LABEL, "");
+
+ this.new_title = new_title;
+ old_title = source.get_title();
+ }
+
+ public override void execute() {
+ ((MediaSource) source).set_title(new_title);
+ }
+
+ public override void undo() {
+ ((MediaSource) source).set_title(old_title);
+ }
+}
+
+public class EditCommentCommand : SingleDataSourceCommand {
+ private string new_comment;
+ private string? old_comment;
+
+ public EditCommentCommand(MediaSource source, string new_comment) {
+ base(source, Resources.EDIT_COMMENT_LABEL, "");
+
+ this.new_comment = new_comment;
+ old_comment = source.get_comment();
+ }
+
+ public override void execute() {
+ ((MediaSource) source).set_comment(new_comment);
+ }
+
+ public override void undo() {
+ ((MediaSource) source).set_comment(old_comment);
+ }
+}
+
+public class EditMultipleTitlesCommand : MultipleDataSourceAtOnceCommand {
+ public string new_title;
+ public Gee.HashMap<MediaSource, string?> old_titles = new Gee.HashMap<MediaSource, string?>();
+
+ public EditMultipleTitlesCommand(Gee.Collection<MediaSource> media_sources, string new_title) {
+ base (media_sources, Resources.EDIT_TITLE_LABEL, "");
+
+ this.new_title = new_title;
+ foreach (MediaSource media in media_sources)
+ old_titles.set(media, media.get_title());
+ }
+
+ public override void execute_on_all(Gee.Collection<DataSource> sources) {
+ foreach (DataSource source in sources)
+ ((MediaSource) source).set_title(new_title);
+ }
+
+ public override void undo_on_all(Gee.Collection<DataSource> sources) {
+ foreach (DataSource source in sources)
+ ((MediaSource) source).set_title(old_titles.get((MediaSource) source));
+ }
+}
+
+public class EditMultipleCommentsCommand : MultipleDataSourceAtOnceCommand {
+ public string new_comment;
+ public Gee.HashMap<MediaSource, string?> old_comments = new Gee.HashMap<MediaSource, string?>();
+
+ public EditMultipleCommentsCommand(Gee.Collection<MediaSource> media_sources, string new_comment) {
+ base (media_sources, Resources.EDIT_COMMENT_LABEL, "");
+
+ this.new_comment = new_comment;
+ foreach (MediaSource media in media_sources)
+ old_comments.set(media, media.get_comment());
+ }
+
+ public override void execute_on_all(Gee.Collection<DataSource> sources) {
+ foreach (DataSource source in sources)
+ ((MediaSource) source).set_comment(new_comment);
+ }
+
+ public override void undo_on_all(Gee.Collection<DataSource> sources) {
+ foreach (DataSource source in sources)
+ ((MediaSource) source).set_comment(old_comments.get((MediaSource) source));
+ }
+}
+
+public class RenameEventCommand : SimpleProxyableCommand {
+ private string new_name;
+ private string? old_name;
+
+ public RenameEventCommand(Event event, string new_name) {
+ base(event, Resources.RENAME_EVENT_LABEL, "");
+
+ this.new_name = new_name;
+ old_name = event.get_raw_name();
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Event) source).rename(new_name);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ ((Event) source).rename(old_name);
+ }
+}
+
+public class EditEventCommentCommand : SimpleProxyableCommand {
+ private string new_comment;
+ private string? old_comment;
+
+ public EditEventCommentCommand(Event event, string new_comment) {
+ base(event, Resources.EDIT_COMMENT_LABEL, "");
+
+ this.new_comment = new_comment;
+ old_comment = event.get_comment();
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Event) source).set_comment(new_comment);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ ((Event) source).set_comment(old_comment);
+ }
+}
+
+public class SetKeyPhotoCommand : SingleDataSourceCommand {
+ private MediaSource new_primary_source;
+ private MediaSource old_primary_source;
+
+ public SetKeyPhotoCommand(Event event, MediaSource new_primary_source) {
+ base(event, Resources.MAKE_KEY_PHOTO_LABEL, "");
+
+ this.new_primary_source = new_primary_source;
+ old_primary_source = event.get_primary_source();
+ }
+
+ public override void execute() {
+ ((Event) source).set_primary_source(new_primary_source);
+ }
+
+ public override void undo() {
+ ((Event) source).set_primary_source(old_primary_source);
+ }
+}
+
+public class RevertSingleCommand : GenericPhotoTransformationCommand {
+ public RevertSingleCommand(Photo photo) {
+ base(photo, Resources.REVERT_LABEL, "");
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ photo.remove_all_transformations();
+ }
+
+ public override bool compress(Command command) {
+ RevertSingleCommand revert_single_command = command as RevertSingleCommand;
+ if (revert_single_command == null)
+ return false;
+
+ if (revert_single_command.source != source)
+ return false;
+
+ // no need to execute anything; multiple successive reverts on the same photo are as good
+ // as one
+ return true;
+ }
+}
+
+public class RevertMultipleCommand : MultiplePhotoTransformationCommand {
+ public RevertMultipleCommand(Gee.Iterable<DataView> iter) {
+ base(iter, _("Reverting"), _("Undoing Revert"), Resources.REVERT_LABEL,
+ "");
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Photo) source).remove_all_transformations();
+ }
+}
+
+public class EnhanceSingleCommand : GenericPhotoTransformationCommand {
+ public EnhanceSingleCommand(Photo photo) {
+ base(photo, Resources.ENHANCE_LABEL, Resources.ENHANCE_TOOLTIP);
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ AppWindow.get_instance().set_busy_cursor();
+#if MEASURE_ENHANCE
+ Timer overall_timer = new Timer();
+#endif
+
+ photo.enhance();
+
+#if MEASURE_ENHANCE
+ overall_timer.stop();
+ debug("Auto-Enhance overall time: %f sec", overall_timer.elapsed());
+#endif
+ AppWindow.get_instance().set_normal_cursor();
+ }
+
+ public override bool compress(Command command) {
+ EnhanceSingleCommand enhance_single_command = command as EnhanceSingleCommand;
+ if (enhance_single_command == null)
+ return false;
+
+ if (enhance_single_command.source != source)
+ return false;
+
+ // multiple successive enhances on the same photo are as good as a single
+ return true;
+ }
+}
+
+public class EnhanceMultipleCommand : MultiplePhotoTransformationCommand {
+ public EnhanceMultipleCommand(Gee.Iterable<DataView> iter) {
+ base(iter, _("Enhancing"), _("Undoing Enhance"), Resources.ENHANCE_LABEL,
+ Resources.ENHANCE_TOOLTIP);
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Photo) source).enhance();
+ }
+}
+
+public class StraightenCommand : GenericPhotoTransformationCommand {
+ private double theta;
+ private Box crop; // straightening can change the crop rectangle
+
+ public StraightenCommand(Photo photo, double theta, Box crop, string name, string explanation) {
+ base(photo, name, explanation);
+
+ this.theta = theta;
+ this.crop = crop;
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ photo.set_straighten(theta);
+ photo.set_crop(crop);
+ }
+}
+
+public class CropCommand : GenericPhotoTransformationCommand {
+ private Box crop;
+
+ public CropCommand(Photo photo, Box crop, string name, string explanation) {
+ base(photo, name, explanation);
+
+ this.crop = crop;
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ photo.set_crop(crop);
+ }
+}
+
+public class AdjustColorsSingleCommand : GenericPhotoTransformationCommand {
+ private PixelTransformationBundle transformations;
+
+ public AdjustColorsSingleCommand(Photo photo, PixelTransformationBundle transformations,
+ string name, string explanation) {
+ base(photo, name, explanation);
+
+ this.transformations = transformations;
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ AppWindow.get_instance().set_busy_cursor();
+
+ photo.set_color_adjustments(transformations);
+
+ AppWindow.get_instance().set_normal_cursor();
+ }
+
+ public override bool can_compress(Command command) {
+ return command is AdjustColorsSingleCommand;
+ }
+}
+
+public class AdjustColorsMultipleCommand : MultiplePhotoTransformationCommand {
+ private PixelTransformationBundle transformations;
+
+ public AdjustColorsMultipleCommand(Gee.Iterable<DataView> iter,
+ PixelTransformationBundle transformations, string name, string explanation) {
+ base(iter, _("Applying Color Transformations"), _("Undoing Color Transformations"),
+ name, explanation);
+
+ this.transformations = transformations;
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((Photo) source).set_color_adjustments(transformations);
+ }
+}
+
+public class RedeyeCommand : GenericPhotoTransformationCommand {
+ private EditingTools.RedeyeInstance redeye_instance;
+
+ public RedeyeCommand(Photo photo, EditingTools.RedeyeInstance redeye_instance, string name,
+ string explanation) {
+ base(photo, name, explanation);
+
+ this.redeye_instance = redeye_instance;
+ }
+
+ public override void execute_on_photo(Photo photo) {
+ photo.add_redeye_instance(redeye_instance);
+ }
+}
+
+public abstract class MovePhotosCommand : Command {
+ // Piggyback on a private command so that processing to determine new_event can occur before
+ // construction, if needed
+ protected class RealMovePhotosCommand : MultipleDataSourceCommand {
+ private SourceProxy new_event_proxy = null;
+ private Gee.HashMap<MediaSource, SourceProxy?> old_events = new Gee.HashMap<
+ MediaSource, SourceProxy?>();
+
+ public RealMovePhotosCommand(Event? new_event, Gee.Iterable<DataView> source_views,
+ string progress_text, string undo_progress_text, string name, string explanation) {
+ base(source_views, progress_text, undo_progress_text, name, explanation);
+
+ // get proxies for each media source's event
+ foreach (DataSource source in source_list) {
+ MediaSource current_media = (MediaSource) source;
+ Event? old_event = current_media.get_event();
+ SourceProxy? old_event_proxy = (old_event != null) ? old_event.get_proxy() : null;
+
+ // if any of the proxies break, the show's off
+ if (old_event_proxy != null)
+ old_event_proxy.broken.connect(on_proxy_broken);
+
+ old_events.set(current_media, old_event_proxy);
+ }
+
+ // stash the proxy of the new event
+ new_event_proxy = new_event.get_proxy();
+ new_event_proxy.broken.connect(on_proxy_broken);
+ }
+
+ ~RealMovePhotosCommand() {
+ new_event_proxy.broken.disconnect(on_proxy_broken);
+
+ foreach (SourceProxy? proxy in old_events.values) {
+ if (proxy != null)
+ proxy.broken.disconnect(on_proxy_broken);
+ }
+ }
+
+ public override void execute() {
+ // Are we at an event page already?
+ if ((LibraryWindow.get_app().get_current_page() is EventPage)) {
+ Event evt = ((EventPage) LibraryWindow.get_app().get_current_page()).get_event();
+
+ // Will moving these empty this event?
+ if (evt.get_media_count() == source_list.size) {
+ // Yes - jump away from this event, since it will have zero
+ // entries and is going to be removed.
+ LibraryWindow.get_app().switch_to_event((Event) new_event_proxy.get_source());
+ }
+ } else {
+ // We're in a library or tag page.
+
+ // Are we moving these to a newly-created (and therefore empty) event?
+ if (((Event) new_event_proxy.get_source()).get_media_count() == 0) {
+ // Yes - jump to the new event.
+ LibraryWindow.get_app().switch_to_event((Event) new_event_proxy.get_source());
+ }
+ }
+
+ // Otherwise - don't jump; users found the jumping disconcerting.
+
+ // create the new event
+ base.execute();
+ }
+
+ public override void execute_on_source(DataSource source) {
+ ((MediaSource) source).set_event((Event?) new_event_proxy.get_source());
+ }
+
+ public override void undo_on_source(DataSource source) {
+ MediaSource current_media = (MediaSource) source;
+ SourceProxy? event_proxy = old_events.get(current_media);
+
+ current_media.set_event(event_proxy != null ? (Event?) event_proxy.get_source() : null);
+ }
+
+ private void on_proxy_broken() {
+ get_command_manager().reset();
+ }
+ }
+
+ protected RealMovePhotosCommand real_command;
+
+ public MovePhotosCommand(string name, string explanation) {
+ base(name, explanation);
+ }
+
+ public override void prepare() {
+ assert(real_command != null);
+ real_command.prepare();
+ }
+
+ public override void execute() {
+ assert(real_command != null);
+ real_command.execute();
+ }
+
+ public override void undo() {
+ assert(real_command != null);
+ real_command.undo();
+ }
+}
+
+public class NewEventCommand : MovePhotosCommand {
+ public NewEventCommand(Gee.Iterable<DataView> iter) {
+ base(Resources.NEW_EVENT_LABEL, "");
+
+ // get the primary or "key" source for the new event (which is simply the first one)
+ MediaSource key_source = null;
+ foreach (DataView view in iter) {
+ MediaSource current_source = (MediaSource) view.get_source();
+
+ if (key_source == null) {
+ key_source = current_source;
+ break;
+ }
+ }
+
+ // key photo is required for an event
+ assert(key_source != null);
+
+ Event new_event = Event.create_empty_event(key_source);
+
+ real_command = new RealMovePhotosCommand(new_event, iter, _("Creating New Event"),
+ _("Removing Event"), Resources.NEW_EVENT_LABEL,
+ "");
+ }
+}
+
+public class SetEventCommand : MovePhotosCommand {
+ public SetEventCommand(Gee.Iterable<DataView> iter, Event new_event) {
+ base(Resources.SET_PHOTO_EVENT_LABEL, Resources.SET_PHOTO_EVENT_TOOLTIP);
+
+ real_command = new RealMovePhotosCommand(new_event, iter, _("Moving Photos to New Event"),
+ _("Setting Photos to Previous Event"), Resources.SET_PHOTO_EVENT_LABEL,
+ "");
+ }
+}
+
+public class MergeEventsCommand : MovePhotosCommand {
+ public MergeEventsCommand(Gee.Iterable<DataView> iter) {
+ base (Resources.MERGE_LABEL, "");
+
+ // Because it requires fewer operations to merge small events onto large ones,
+ // rather than the other way round, we try to choose the event with the most
+ // sources as the 'master', preferring named events over unnamed ones so that
+ // names can persist.
+ Event master_event = null;
+ int named_evt_src_count = 0;
+ int unnamed_evt_src_count = 0;
+ Gee.ArrayList<ThumbnailView> media_thumbs = new Gee.ArrayList<ThumbnailView>();
+
+ foreach (DataView view in iter) {
+ Event event = (Event) view.get_source();
+
+ // First event we've examined?
+ if (master_event == null) {
+ // Yes. Make it the master for now and remember it as
+ // having the most sources (out of what we've seen so far).
+ master_event = event;
+ unnamed_evt_src_count = master_event.get_media_count();
+ if (event.has_name())
+ named_evt_src_count = master_event.get_media_count();
+ } else {
+ // No. Check whether this event has a name and whether
+ // it has more sources than any other we've seen...
+ if (event.has_name()) {
+ if (event.get_media_count() > named_evt_src_count) {
+ named_evt_src_count = event.get_media_count();
+ master_event = event;
+ }
+ } else if (named_evt_src_count == 0) {
+ // Per the original app design, named events -always- trump
+ // unnamed ones, so only choose an unnamed one if we haven't
+ // seen any named ones yet.
+ if (event.get_media_count() > unnamed_evt_src_count) {
+ unnamed_evt_src_count = event.get_media_count();
+ master_event = event;
+ }
+ }
+ }
+
+ // store all media sources in this operation; they will be moved to the master event
+ // (keep proxies of their original event for undo)
+ foreach (MediaSource media_source in event.get_media())
+ media_thumbs.add(new ThumbnailView(media_source));
+ }
+
+ assert(master_event != null);
+ assert(media_thumbs.size > 0);
+
+ real_command = new RealMovePhotosCommand(master_event, media_thumbs, _("Merging"),
+ _("Unmerging"), Resources.MERGE_LABEL, "");
+ }
+}
+
+public class DuplicateMultiplePhotosCommand : MultipleDataSourceCommand {
+ private Gee.HashMap<LibraryPhoto, LibraryPhoto> dupes = new Gee.HashMap<LibraryPhoto, LibraryPhoto>();
+ private int failed = 0;
+
+ public DuplicateMultiplePhotosCommand(Gee.Iterable<DataView> iter) {
+ base (iter, _("Duplicating photos"), _("Removing duplicated photos"),
+ Resources.DUPLICATE_PHOTO_LABEL, Resources.DUPLICATE_PHOTO_TOOLTIP);
+
+ LibraryPhoto.global.item_destroyed.connect(on_photo_destroyed);
+ }
+
+ ~DuplicateMultiplePhotosCommand() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_photo_destroyed);
+ }
+
+ private void on_photo_destroyed(DataSource source) {
+ // if one of the duplicates is destroyed, can no longer undo it (which destroys it again)
+ if (dupes.values.contains((LibraryPhoto) source))
+ get_command_manager().reset();
+ }
+
+ public override void execute() {
+ dupes.clear();
+ failed = 0;
+
+ base.execute();
+
+ if (failed > 0) {
+ string error_string = (ngettext("Unable to duplicate one photo due to a file error",
+ "Unable to duplicate %d photos due to file errors", failed)).printf(failed);
+ AppWindow.error_message(error_string);
+ }
+ }
+
+ public override void execute_on_source(DataSource source) {
+ LibraryPhoto photo = (LibraryPhoto) source;
+
+ try {
+ LibraryPhoto dupe = photo.duplicate();
+ dupes.set(photo, dupe);
+ } catch (Error err) {
+ critical("Unable to duplicate file %s: %s", photo.get_file().get_path(), err.message);
+ failed++;
+ }
+ }
+
+ public override void undo() {
+ // disconnect from monitoring the duplicates' destruction, as undo() does exactly that
+ LibraryPhoto.global.item_destroyed.disconnect(on_photo_destroyed);
+
+ base.undo();
+
+ // be sure to drop everything that was destroyed
+ dupes.clear();
+ failed = 0;
+
+ // re-monitor for duplicates' destruction
+ LibraryPhoto.global.item_destroyed.connect(on_photo_destroyed);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ LibraryPhoto photo = (LibraryPhoto) source;
+
+ Marker marker = LibraryPhoto.global.mark(dupes.get(photo));
+ LibraryPhoto.global.destroy_marked(marker, true);
+ }
+}
+
+public class SetRatingSingleCommand : SingleDataSourceCommand {
+ private Rating last_rating;
+ private Rating new_rating;
+ private bool set_direct;
+ private bool incrementing;
+
+ public SetRatingSingleCommand(DataSource source, Rating rating) {
+ base (source, Resources.rating_label(rating), "");
+ set_direct = true;
+ new_rating = rating;
+
+ last_rating = ((LibraryPhoto)source).get_rating();
+ }
+
+ public SetRatingSingleCommand.inc_dec(DataSource source, bool is_incrementing) {
+ base (source, is_incrementing ? Resources.INCREASE_RATING_LABEL :
+ Resources.DECREASE_RATING_LABEL, "");
+ set_direct = false;
+ incrementing = is_incrementing;
+
+ last_rating = ((MediaSource) source).get_rating();
+ }
+
+ public override void execute() {
+ if (set_direct)
+ ((MediaSource) source).set_rating(new_rating);
+ else {
+ if (incrementing)
+ ((MediaSource) source).increase_rating();
+ else
+ ((MediaSource) source).decrease_rating();
+ }
+ }
+
+ public override void undo() {
+ ((MediaSource) source).set_rating(last_rating);
+ }
+}
+
+public class SetRatingCommand : MultipleDataSourceCommand {
+ private Gee.HashMap<DataSource, Rating> last_rating_map;
+ private Rating new_rating;
+ private bool set_direct;
+ private bool incrementing;
+ private int action_count = 0;
+
+ public SetRatingCommand(Gee.Iterable<DataView> iter, Rating rating) {
+ base (iter, Resources.rating_progress(rating), _("Restoring previous rating"),
+ Resources.rating_label(rating), "");
+ set_direct = true;
+ new_rating = rating;
+
+ save_source_states(iter);
+ }
+
+ public SetRatingCommand.inc_dec(Gee.Iterable<DataView> iter, bool is_incrementing) {
+ base (iter,
+ is_incrementing ? _("Increasing ratings") : _("Decreasing ratings"),
+ is_incrementing ? _("Decreasing ratings") : _("Increasing ratings"),
+ is_incrementing ? Resources.INCREASE_RATING_LABEL : Resources.DECREASE_RATING_LABEL,
+ "");
+ set_direct = false;
+ incrementing = is_incrementing;
+
+ save_source_states(iter);
+ }
+
+ private void save_source_states(Gee.Iterable<DataView> iter) {
+ last_rating_map = new Gee.HashMap<DataSource, Rating>();
+
+ foreach (DataView view in iter) {
+ DataSource source = view.get_source();
+ last_rating_map[source] = ((MediaSource) source).get_rating();
+ }
+ }
+
+ public override void execute() {
+ action_count = 0;
+ base.execute();
+ }
+
+ public override void undo() {
+ action_count = 0;
+ base.undo();
+ }
+
+ public override void execute_on_source(DataSource source) {
+ if (set_direct)
+ ((MediaSource) source).set_rating(new_rating);
+ else {
+ if (incrementing)
+ ((MediaSource) source).increase_rating();
+ else
+ ((MediaSource) source).decrease_rating();
+ }
+ }
+
+ public override void undo_on_source(DataSource source) {
+ ((MediaSource) source).set_rating(last_rating_map[source]);
+ }
+}
+
+public class SetRawDeveloperCommand : MultipleDataSourceCommand {
+ private Gee.HashMap<Photo, RawDeveloper> last_developer_map;
+ private Gee.HashMap<Photo, PhotoTransformationState> last_transformation_map;
+ private RawDeveloper new_developer;
+
+ public SetRawDeveloperCommand(Gee.Iterable<DataView> iter, RawDeveloper developer) {
+ base (iter, _("Setting RAW developer"), _("Restoring previous RAW developer"),
+ _("Set Developer"), "");
+ new_developer = developer;
+ save_source_states(iter);
+ }
+
+ private void save_source_states(Gee.Iterable<DataView> iter) {
+ last_developer_map = new Gee.HashMap<Photo, RawDeveloper>();
+ last_transformation_map = new Gee.HashMap<Photo, PhotoTransformationState>();
+
+ foreach (DataView view in iter) {
+ Photo? photo = view.get_source() as Photo;
+ if (is_raw_photo(photo)) {
+ last_developer_map[photo] = photo.get_raw_developer();
+ last_transformation_map[photo] = photo.save_transformation_state();
+ }
+ }
+ }
+
+ public override void execute() {
+ base.execute();
+ }
+
+ public override void undo() {
+ base.undo();
+ }
+
+ public override void execute_on_source(DataSource source) {
+ Photo? photo = source as Photo;
+ if (is_raw_photo(photo)) {
+ if (new_developer == RawDeveloper.CAMERA && !photo.is_raw_developer_available(RawDeveloper.CAMERA))
+ photo.set_raw_developer(RawDeveloper.EMBEDDED);
+ else
+ photo.set_raw_developer(new_developer);
+ }
+ }
+
+ public override void undo_on_source(DataSource source) {
+ Photo? photo = source as Photo;
+ if (is_raw_photo(photo)) {
+ photo.set_raw_developer(last_developer_map[photo]);
+ photo.load_transformation_state(last_transformation_map[photo]);
+ }
+ }
+
+ private bool is_raw_photo(Photo? photo) {
+ return photo != null && photo.get_master_file_format() == PhotoFileFormat.RAW;
+ }
+}
+
+public class AdjustDateTimePhotoCommand : SingleDataSourceCommand {
+ private Dateable dateable;
+ private Event? prev_event;
+ private int64 time_shift;
+ private bool modify_original;
+
+ public AdjustDateTimePhotoCommand(Dateable dateable, int64 time_shift, bool modify_original) {
+ base(dateable, Resources.ADJUST_DATE_TIME_LABEL, "");
+
+ this.dateable = dateable;
+ this.time_shift = time_shift;
+ this.modify_original = modify_original;
+ }
+
+ public override void execute() {
+ set_time(dateable, dateable.get_exposure_time() + (time_t) time_shift);
+
+ prev_event = dateable.get_event();
+
+ ViewCollection all_events = new ViewCollection("tmp");
+
+ foreach (DataObject dobj in Event.global.get_all()) {
+ Event event = dobj as Event;
+ if (event != null) {
+ all_events.add(new EventView(event));
+ }
+ }
+ Event.generate_single_event(dateable, all_events, null);
+ }
+
+ public override void undo() {
+ set_time(dateable, dateable.get_exposure_time() - (time_t) time_shift);
+
+ dateable.set_event(prev_event);
+ }
+
+ private void set_time(Dateable dateable, time_t exposure_time) {
+ if (modify_original && dateable is Photo) {
+ try {
+ ((Photo)dateable).set_exposure_time_persistent(exposure_time);
+ } catch(GLib.Error err) {
+ AppWindow.error_message(_("Original photo could not be adjusted."));
+ }
+ } else {
+ dateable.set_exposure_time(exposure_time);
+ }
+ }
+}
+
+public class AdjustDateTimePhotosCommand : MultipleDataSourceCommand {
+ private int64 time_shift;
+ private bool keep_relativity;
+ private bool modify_originals;
+ private Gee.Map<Dateable, Event?> prev_events;
+
+ // used when photos are batch changed instead of shifted uniformly
+ private time_t? new_time = null;
+ private Gee.HashMap<Dateable, time_t?> old_times;
+ private Gee.ArrayList<Dateable> error_list;
+
+ public AdjustDateTimePhotosCommand(Gee.Iterable<DataView> iter, int64 time_shift,
+ bool keep_relativity, bool modify_originals) {
+ base(iter, _("Adjusting Date and Time"), _("Undoing Date and Time Adjustment"),
+ Resources.ADJUST_DATE_TIME_LABEL, "");
+
+ this.time_shift = time_shift;
+ this.keep_relativity = keep_relativity;
+ this.modify_originals = modify_originals;
+
+ // TODO: implement modify originals option
+
+ prev_events = new Gee.HashMap<Dateable, Event?>();
+
+ // this should be replaced by a first function when we migrate to Gee's List
+ foreach (DataView view in iter) {
+ prev_events.set(view.get_source() as Dateable, (view.get_source() as MediaSource).get_event());
+
+ if (new_time == null) {
+ new_time = ((Dateable) view.get_source()).get_exposure_time() +
+ (time_t) time_shift;
+ break;
+ }
+ }
+
+ old_times = new Gee.HashMap<Dateable, time_t?>();
+ }
+
+ public override void execute() {
+ error_list = new Gee.ArrayList<Dateable>();
+ base.execute();
+
+ if (error_list.size > 0) {
+ multiple_object_error_dialog(error_list,
+ ngettext("One original photo could not be adjusted.",
+ "The following original photos could not be adjusted.", error_list.size),
+ _("Time Adjustment Error"));
+ }
+
+ ViewCollection all_events = new ViewCollection("tmp");
+
+ foreach (Dateable d in prev_events.keys) {
+ foreach (DataObject dobj in Event.global.get_all()) {
+ Event event = dobj as Event;
+ if (event != null) {
+ all_events.add(new EventView(event));
+ }
+ }
+ Event.generate_single_event(d, all_events, null);
+ }
+ }
+
+ public override void undo() {
+ error_list = new Gee.ArrayList<Dateable>();
+ base.undo();
+
+ if (error_list.size > 0) {
+ multiple_object_error_dialog(error_list,
+ ngettext("Time adjustments could not be undone on the following photo file.",
+ "Time adjustments could not be undone on the following photo files.",
+ error_list.size), _("Time Adjustment Error"));
+ }
+ }
+
+ private void set_time(Dateable dateable, time_t exposure_time) {
+ // set_exposure_time_persistent wouldn't work on videos,
+ // since we can't actually write them from inside shotwell,
+ // so check whether we're working on a Photo or a Video
+ if (modify_originals && (dateable is Photo)) {
+ try {
+ ((Photo) dateable).set_exposure_time_persistent(exposure_time);
+ } catch(GLib.Error err) {
+ error_list.add(dateable);
+ }
+ } else {
+ // modifying originals is disabled, or this is a
+ // video
+ dateable.set_exposure_time(exposure_time);
+ }
+ }
+
+ public override void execute_on_source(DataSource source) {
+ Dateable dateable = ((Dateable) source);
+
+ if (keep_relativity && dateable.get_exposure_time() != 0) {
+ set_time(dateable, dateable.get_exposure_time() + (time_t) time_shift);
+ } else {
+ old_times.set(dateable, dateable.get_exposure_time());
+ set_time(dateable, new_time);
+ }
+
+ ViewCollection all_events = new ViewCollection("tmp");
+
+ foreach (DataObject dobj in Event.global.get_all()) {
+ Event event = dobj as Event;
+ if (event != null) {
+ all_events.add(new EventView(event));
+ }
+ }
+ Event.generate_single_event(dateable, all_events, null);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ Dateable photo = ((Dateable) source);
+
+ if (old_times.has_key(photo)) {
+ set_time(photo, old_times.get(photo));
+ old_times.unset(photo);
+ } else {
+ set_time(photo, photo.get_exposure_time() - (time_t) time_shift);
+ }
+
+ (source as MediaSource).set_event(prev_events.get(source as Dateable));
+ }
+}
+
+public class AddTagsCommand : PageCommand {
+ private Gee.HashMap<SourceProxy, Gee.ArrayList<MediaSource>> map =
+ new Gee.HashMap<SourceProxy, Gee.ArrayList<MediaSource>>();
+
+ public AddTagsCommand(string[] paths, Gee.Collection<MediaSource> sources) {
+ base (Resources.add_tags_label(paths), "");
+
+ // load/create the tags here rather than in execute() so that we can merely use the proxy
+ // to access it ... this is important with the redo() case, where the tags may have been
+ // created by another proxy elsewhere
+ foreach (string path in paths) {
+ Gee.List<string> paths_to_create =
+ HierarchicalTagUtilities.enumerate_parent_paths(path);
+ paths_to_create.add(path);
+
+ foreach (string create_path in paths_to_create) {
+ Tag tag = Tag.for_path(create_path);
+ SourceProxy tag_proxy = tag.get_proxy();
+
+ // for each Tag, only attach sources which are not already attached, otherwise undo()
+ // will not be symmetric
+ Gee.ArrayList<MediaSource> add_sources = new Gee.ArrayList<MediaSource>();
+ foreach (MediaSource source in sources) {
+ if (!tag.contains(source))
+ add_sources.add(source);
+ }
+
+ if (add_sources.size > 0) {
+ tag_proxy.broken.connect(on_proxy_broken);
+ map.set(tag_proxy, add_sources);
+ }
+ }
+ }
+
+ LibraryPhoto.global.item_destroyed.connect(on_source_destroyed);
+ Video.global.item_destroyed.connect(on_source_destroyed);
+ }
+
+ ~AddTagsCommand() {
+ foreach (SourceProxy tag_proxy in map.keys)
+ tag_proxy.broken.disconnect(on_proxy_broken);
+
+ LibraryPhoto.global.item_destroyed.disconnect(on_source_destroyed);
+ Video.global.item_destroyed.disconnect(on_source_destroyed);
+ }
+
+ public override void execute() {
+ foreach (SourceProxy tag_proxy in map.keys)
+ ((Tag) tag_proxy.get_source()).attach_many(map.get(tag_proxy));
+ }
+
+ public override void undo() {
+ foreach (SourceProxy tag_proxy in map.keys) {
+ Tag tag = (Tag) tag_proxy.get_source();
+
+ tag.detach_many(map.get(tag_proxy));
+ }
+ }
+
+ private void on_source_destroyed(DataSource source) {
+ foreach (Gee.ArrayList<MediaSource> sources in map.values) {
+ if (sources.contains((MediaSource) source)) {
+ get_command_manager().reset();
+
+ return;
+ }
+ }
+ }
+
+ private void on_proxy_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public class RenameTagCommand : SimpleProxyableCommand {
+ private string old_name;
+ private string new_name;
+
+ // NOTE: new_name should be a name, not a path
+ public RenameTagCommand(Tag tag, string new_name) {
+ base (tag, Resources.rename_tag_label(tag.get_user_visible_name(), new_name),
+ tag.get_name());
+
+ old_name = tag.get_user_visible_name();
+ this.new_name = new_name;
+ }
+
+ protected override void execute_on_source(DataSource source) {
+ if (!((Tag) source).rename(new_name))
+ AppWindow.error_message(Resources.rename_tag_exists_message(new_name));
+ }
+
+ protected override void undo_on_source(DataSource source) {
+ if (!((Tag) source).rename(old_name))
+ AppWindow.error_message(Resources.rename_tag_exists_message(old_name));
+ }
+}
+
+public class DeleteTagCommand : SimpleProxyableCommand {
+ Gee.List<SourceProxy>? recursive_victim_proxies = null;
+
+ public DeleteTagCommand(Tag tag) {
+ base (tag, Resources.delete_tag_label(tag.get_user_visible_name()), tag.get_name());
+ }
+
+ protected override void execute_on_source(DataSource source) {
+ Tag tag = (Tag) source;
+
+ // process children first, if any
+ Gee.List<Tag> recursive_victims = tag.get_hierarchical_children();
+ if (recursive_victims.size > 0) {
+ // save proxies for these Tags and then delete, in order .. can't use mark_many() or
+ // add_proxyables() here because they make no guarantee of order
+ recursive_victim_proxies = new Gee.ArrayList<SourceProxy>();
+ foreach (Tag victim in recursive_victims) {
+ SourceProxy proxy = victim.get_proxy();
+ proxy.broken.connect(on_proxy_broken);
+ recursive_victim_proxies.add(proxy);
+
+ Tag.global.destroy_marked(Tag.global.mark(victim), false);
+ }
+ }
+
+ // destroy parent tag, which is already proxied
+ Tag.global.destroy_marked(Tag.global.mark(source), false);
+ }
+
+ protected override void undo_on_source(DataSource source) {
+ // merely instantiating the Tag will rehydrate it ... should always work, because the
+ // undo stack is cleared if the proxy ever breaks
+ assert(source is Tag);
+
+ // rehydrate the children, in reverse order
+ if (recursive_victim_proxies != null) {
+ for (int i = recursive_victim_proxies.size - 1; i >= 0; i--) {
+ SourceProxy proxy = recursive_victim_proxies.get(i);
+
+ DataSource victim_source = proxy.get_source();
+ assert(victim_source is Tag);
+
+ proxy.broken.disconnect(on_proxy_broken);
+ }
+
+ recursive_victim_proxies = null;
+ }
+ }
+
+ private void on_proxy_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public class NewChildTagCommand : SimpleProxyableCommand {
+ Tag? created_child = null;
+
+ public NewChildTagCommand(Tag tag) {
+ base (tag, _("Create Tag"), tag.get_name());
+ }
+
+ protected override void execute_on_source(DataSource source) {
+ Tag tag = (Tag) source;
+ created_child = tag.create_new_child();
+ }
+
+ protected override void undo_on_source(DataSource source) {
+ Tag.global.destroy_marked(Tag.global.mark(created_child), true);
+ }
+
+ public Tag get_created_child() {
+ assert(created_child != null);
+
+ return created_child;
+ }
+}
+
+public class NewRootTagCommand : PageCommand {
+ SourceProxy? created_proxy = null;
+
+ public NewRootTagCommand() {
+ base (_("Create Tag"), "");
+ }
+
+ protected override void execute() {
+ if (created_proxy == null)
+ created_proxy = Tag.create_new_root().get_proxy();
+ else
+ created_proxy.get_source();
+ }
+
+ protected override void undo() {
+ Tag.global.destroy_marked(Tag.global.mark(created_proxy.get_source()), true);
+ }
+
+ public Tag get_created_tag() {
+ return (Tag) created_proxy.get_source();
+ }
+}
+
+public class ReparentTagCommand : PageCommand {
+ string from_path;
+ string to_path;
+ string? to_path_parent_path;
+ Gee.List<SourceProxy>? src_before_state = null;
+ Gee.List<SourceProxy>? dest_before_state = null;
+ Gee.List<SourceProxy>? after_state = null;
+ Gee.HashSet<MediaSource> sources_in_play = new Gee.HashSet<MediaSource>();
+ Gee.Map<string, Gee.Set<MediaSource>> dest_parent_attachments = null;
+ Gee.Map<string, Gee.Set<MediaSource>> src_parent_detachments = null;
+ Gee.Map<string, Gee.Set<MediaSource>> in_play_child_structure = null;
+ Gee.Map<string, Gee.Set<MediaSource>> existing_dest_child_structure = null;
+ Gee.Set<MediaSource>? existing_dest_membership = null;
+ bool to_path_exists = false;
+
+ public ReparentTagCommand(Tag tag, string new_parent_path) {
+ base (_("Move Tag \"%s\"").printf(tag.get_user_visible_name()), "");
+
+ this.from_path = tag.get_path();
+
+ bool has_children = (tag.get_hierarchical_children().size > 0);
+ string basename = tag.get_user_visible_name();
+
+ if (new_parent_path == Tag.PATH_SEPARATOR_STRING)
+ this.to_path = (has_children) ? (Tag.PATH_SEPARATOR_STRING + basename) : basename;
+ else if (new_parent_path.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ this.to_path = new_parent_path + Tag.PATH_SEPARATOR_STRING + basename;
+ else
+ this.to_path = Tag.PATH_SEPARATOR_STRING + new_parent_path + Tag.PATH_SEPARATOR_STRING +
+ basename;
+
+ string? new_to_path = HierarchicalTagUtilities.get_root_path_form(to_path);
+ if (new_to_path != null)
+ this.to_path = new_to_path;
+
+ if (Tag.global.exists(this.to_path))
+ to_path_exists = true;
+
+ sources_in_play.add_all(tag.get_sources());
+
+ LibraryPhoto.global.items_destroyed.connect(on_items_destroyed);
+ Video.global.items_destroyed.connect(on_items_destroyed);
+ }
+
+ ~ReparentTagCommand() {
+ LibraryPhoto.global.items_destroyed.disconnect(on_items_destroyed);
+ Video.global.items_destroyed.disconnect(on_items_destroyed);
+ }
+
+ private void on_items_destroyed(Gee.Collection<DataSource> destroyed) {
+ foreach (DataSource source in destroyed) {
+ if (sources_in_play.contains((MediaSource) source))
+ get_command_manager().reset();
+ }
+ }
+
+ private Gee.Map<string, Gee.Set<MediaSource>> get_child_structure_at(string client_path) {
+ string? path = HierarchicalTagUtilities.get_root_path_form(client_path);
+ path = (path != null) ? path : client_path;
+
+ Gee.Map<string, Gee.Set<MediaSource>> result =
+ new Gee.HashMap<string, Gee.Set<MediaSource>>();
+
+ if (!Tag.global.exists(path))
+ return result;
+
+ Tag tag = Tag.for_path(path);
+
+ string path_prefix = tag.get_path() + Tag.PATH_SEPARATOR_STRING;
+ foreach (Tag t in tag.get_hierarchical_children()) {
+ string child_subpath = t.get_path().replace(path_prefix, "");
+
+ result.set(child_subpath, new Gee.HashSet<MediaSource>());
+ result.get(child_subpath).add_all(t.get_sources());
+ }
+
+ return result;
+ }
+
+ private void restore_child_attachments_at(string client_path,
+ Gee.Map<string, Gee.Set<MediaSource>> child_structure) {
+
+ string? new_path = HierarchicalTagUtilities.get_root_path_form(client_path);
+ string path = (new_path != null) ? new_path : client_path;
+
+ assert(Tag.global.exists(path));
+ Tag tag = Tag.for_path(path);
+
+ foreach (string child_subpath in child_structure.keys) {
+ string child_path = tag.get_path() + Tag.PATH_SEPARATOR_STRING + child_subpath;
+
+ if (!tag.get_path().has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ tag.promote();
+ child_path = tag.get_path() + Tag.PATH_SEPARATOR_STRING + child_subpath;
+ }
+
+ assert(Tag.global.exists(child_path));
+
+ foreach (MediaSource s in child_structure.get(child_subpath))
+ Tag.for_path(child_path).attach(s);
+ }
+ }
+
+ private void reattach_in_play_sources_at(string client_path) {
+ string? new_path = HierarchicalTagUtilities.get_root_path_form(client_path);
+ string path = (new_path != null) ? new_path : client_path;
+
+ assert(Tag.global.exists(path));
+
+ Tag tag = Tag.for_path(path);
+
+ foreach (MediaSource s in sources_in_play)
+ tag.attach(s);
+ }
+
+ private void save_before_state() {
+ assert(src_before_state == null);
+ assert(dest_before_state == null);
+
+ src_before_state = new Gee.ArrayList<SourceProxy>();
+ dest_before_state = new Gee.ArrayList<SourceProxy>();
+
+ // capture the child structure of the from tag
+ assert(in_play_child_structure == null);
+ in_play_child_structure = get_child_structure_at(from_path);
+
+ // save the state of the from tag
+ assert(Tag.global.exists(from_path));
+ Tag from_tag = Tag.for_path(from_path);
+ src_before_state.add(from_tag.get_proxy());
+
+ // capture the child structure of the parent of the to tag, if the to tag has a parent
+ Gee.List<string> parent_paths = HierarchicalTagUtilities.enumerate_parent_paths(to_path);
+ if (parent_paths.size > 0)
+ to_path_parent_path = parent_paths.get(parent_paths.size - 1);
+ if (to_path_parent_path != null) {
+ assert(existing_dest_child_structure == null);
+ existing_dest_child_structure = get_child_structure_at(to_path_parent_path);
+ }
+
+ // if the to tag doesn't have a parent, then capture the structure of the to tag itself
+ if (to_path_parent_path == null) {
+ assert(existing_dest_child_structure == null);
+ assert(existing_dest_membership == null);
+ existing_dest_child_structure = get_child_structure_at(to_path);
+ existing_dest_membership = new Gee.HashSet<MediaSource>();
+ existing_dest_membership.add_all(Tag.for_path(to_path).get_sources());
+ }
+
+ // save the state of the to tag's parent
+ if (to_path_parent_path != null) {
+ string? new_tpp = HierarchicalTagUtilities.get_root_path_form(to_path_parent_path);
+ to_path_parent_path = (new_tpp != null) ? new_tpp : to_path_parent_path;
+ assert(Tag.global.exists(to_path_parent_path));
+ dest_before_state.add(Tag.for_path(to_path_parent_path).get_proxy());
+ }
+
+ // if the to tag doesn't have a parent, save the state of the to tag itself
+ if (to_path_parent_path == null) {
+ dest_before_state.add(Tag.for_path(to_path).get_proxy());
+ }
+
+ // save the state of the children of the from tag in order from most basic to most derived
+ Gee.List<Tag> from_children = from_tag.get_hierarchical_children();
+ for (int i = from_children.size - 1; i >= 0; i--)
+ src_before_state.add(from_children.get(i).get_proxy());
+
+ // save the state of the children of the to tag's parent in order from most basic to most
+ // derived
+ if (to_path_parent_path != null) {
+ Gee.List<Tag> to_children = Tag.for_path(to_path_parent_path).get_hierarchical_children();
+ for (int i = to_children.size - 1; i >= 0; i--)
+ dest_before_state.add(to_children.get(i).get_proxy());
+ }
+
+ // if the to tag doesn't have a parent, then save the state of the to tag's direct
+ // children, if any
+ if (to_path_parent_path == null) {
+ Gee.List<Tag> to_children = Tag.for_path(to_path).get_hierarchical_children();
+ for (int i = to_children.size - 1; i >= 0; i--)
+ dest_before_state.add(to_children.get(i).get_proxy());
+ }
+ }
+
+ private void restore_before_state() {
+ assert(src_before_state != null);
+ assert(existing_dest_child_structure != null);
+
+ // unwind the destination tree to its pre-merge state
+ if (to_path_parent_path != null) {
+ string? new_tpp = HierarchicalTagUtilities.get_root_path_form(to_path_parent_path);
+ to_path_parent_path = (new_tpp != null) ? new_tpp : to_path_parent_path;
+ }
+
+ string unwind_target = (to_path_parent_path != null) ? to_path_parent_path : to_path;
+ foreach (Tag t in Tag.for_path(unwind_target).get_hierarchical_children()) {
+ string child_subpath = t.get_path().replace(unwind_target, "");
+ if (child_subpath.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ child_subpath = child_subpath.substring(1);
+
+ if (!existing_dest_child_structure.has_key(child_subpath)) {
+ Tag.global.destroy_marked(Tag.global.mark(t), true);
+ } else {
+ Gee.Set<MediaSource> starting_sources = new Gee.HashSet<MediaSource>();
+ starting_sources.add_all(t.get_sources());
+ foreach (MediaSource source in starting_sources)
+ if (!(existing_dest_child_structure.get(child_subpath).contains(source)))
+ t.detach(source);
+ }
+ }
+
+ for (int i = 0; i < src_before_state.size; i++)
+ src_before_state.get(i).get_source();
+
+ for (int i = 0; i < dest_before_state.size; i++)
+ dest_before_state.get(i).get_source();
+
+ if (to_path_parent_path != null) {
+ string? new_path = HierarchicalTagUtilities.get_root_path_form(to_path_parent_path);
+ string path = (new_path != null) ? new_path : to_path_parent_path;
+
+ assert(Tag.global.exists(path));
+
+ Tag t = Tag.for_path(path);
+
+ Gee.List<Tag> kids = t.get_hierarchical_children();
+ foreach (Tag kidtag in kids)
+ kidtag.detach_many(kidtag.get_sources());
+
+ restore_child_attachments_at(path, existing_dest_child_structure);
+ } else {
+ assert(existing_dest_membership != null);
+ Tag.for_path(to_path).detach_many(Tag.for_path(to_path).get_sources());
+ Tag.for_path(to_path).attach_many(existing_dest_membership);
+
+ Gee.List<Tag> kids = Tag.for_path(to_path).get_hierarchical_children();
+ foreach (Tag kidtag in kids)
+ kidtag.detach_many(kidtag.get_sources());
+
+ restore_child_attachments_at(to_path, existing_dest_child_structure);
+ }
+ }
+
+ private void save_after_state() {
+ assert(after_state == null);
+
+ after_state = new Gee.ArrayList<SourceProxy>();
+
+ // save the state of the to tag
+ assert(Tag.global.exists(to_path));
+ Tag to_tag = Tag.for_path(to_path);
+ after_state.add(to_tag.get_proxy());
+
+ // save the state of the children of the to tag in order from most basic to most derived
+ Gee.List<Tag> to_children = to_tag.get_hierarchical_children();
+ for (int i = to_children.size - 1; i >= 0; i--)
+ after_state.add(to_children.get(i).get_proxy());
+ }
+
+ private void restore_after_state() {
+ assert(after_state != null);
+
+ for (int i = 0; i < after_state.size; i++)
+ after_state.get(i).get_source();
+ }
+
+ private void prepare_parent(string path) {
+ // find our new parent tag (if one exists) and promote it
+ Tag? new_parent = null;
+ if (path.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ Gee.List<string> parent_paths = HierarchicalTagUtilities.enumerate_parent_paths(path);
+ if (parent_paths.size > 0) {
+ string immediate_parent_path = parent_paths.get(parent_paths.size - 1);
+ if (Tag.global.exists(immediate_parent_path))
+ new_parent = Tag.for_path(immediate_parent_path);
+ else if (Tag.global.exists(immediate_parent_path.substring(1)))
+ new_parent = Tag.for_path(immediate_parent_path.substring(1));
+ else
+ assert_not_reached();
+ }
+ }
+ if (new_parent != null)
+ new_parent.promote();
+ }
+
+ private void do_source_parent_detachments() {
+ assert(Tag.global.exists(from_path));
+ Tag from_tag = Tag.for_path(from_path);
+
+ // see if this copy operation will detach any media items from the source tag's parents
+ if (src_parent_detachments == null) {
+ src_parent_detachments = new Gee.HashMap<string, Gee.Set<MediaSource>>();
+ foreach (MediaSource source in from_tag.get_sources()) {
+ Tag? current_parent = from_tag.get_hierarchical_parent();
+ int running_attach_count = from_tag.get_attachment_count(source) + 1;
+ while (current_parent != null) {
+ string current_parent_path = current_parent.get_path();
+ if (!src_parent_detachments.has_key(current_parent_path))
+ src_parent_detachments.set(current_parent_path, new Gee.HashSet<MediaSource>());
+
+ int curr_parent_attach_count = current_parent.get_attachment_count(source);
+
+ assert (curr_parent_attach_count >= running_attach_count);
+
+ // if this parent tag has no other child tags that the current media item is
+ // attached to
+ if (curr_parent_attach_count == running_attach_count)
+ src_parent_detachments.get(current_parent_path).add(source);
+
+ running_attach_count++;
+ current_parent = current_parent.get_hierarchical_parent();
+ }
+ }
+ }
+
+ // perform collected detachments
+ foreach (string p in src_parent_detachments.keys)
+ foreach (MediaSource s in src_parent_detachments.get(p))
+ Tag.for_path(p).detach(s);
+ }
+
+ private void do_source_parent_reattachments() {
+ assert(src_parent_detachments != null);
+
+ foreach (string p in src_parent_detachments.keys)
+ foreach (MediaSource s in src_parent_detachments.get(p))
+ Tag.for_path(p).attach(s);
+ }
+
+ private void do_destination_parent_detachments() {
+ assert(dest_parent_attachments != null);
+
+ foreach (string p in dest_parent_attachments.keys)
+ foreach (MediaSource s in dest_parent_attachments.get(p))
+ Tag.for_path(p).detach(s);
+ }
+
+ private void do_destination_parent_reattachments() {
+ assert(dest_parent_attachments != null);
+
+ foreach (string p in dest_parent_attachments.keys)
+ foreach (MediaSource s in dest_parent_attachments.get(p))
+ Tag.for_path(p).attach(s);
+ }
+
+ private void copy_subtree(string from, string to) {
+ assert(Tag.global.exists(from));
+ Tag from_tag = Tag.for_path(from);
+
+ // get (or create) a tag for the destination path
+ Tag to_tag = Tag.for_path(to);
+
+ // see if this copy operation will attach any new media items to the destination's parents,
+ // if so, record them for later undo/redo
+ dest_parent_attachments = new Gee.HashMap<string, Gee.Set<MediaSource>>();
+ foreach (MediaSource source in from_tag.get_sources()) {
+ Tag? current_parent = to_tag.get_hierarchical_parent();
+ while (current_parent != null) {
+ string current_parent_path = current_parent.get_path();
+ if (!dest_parent_attachments.has_key(current_parent_path))
+ dest_parent_attachments.set(current_parent_path, new Gee.HashSet<MediaSource>());
+
+ if (!current_parent.contains(source))
+ dest_parent_attachments.get(current_parent_path).add(source);
+
+ current_parent = current_parent.get_hierarchical_parent();
+ }
+ }
+
+ foreach (MediaSource source in from_tag.get_sources())
+ to_tag.attach(source);
+
+ // loop through the children of the from tag in order from most basic to most derived,
+ // creating corresponding child tags on the to tag and attaching corresponding sources
+ Gee.List<Tag> from_children = from_tag.get_hierarchical_children();
+ for (int i = from_children.size - 1; i >= 0; i--) {
+ Tag from_child = from_children.get(i);
+
+ string child_subpath = from_child.get_path().replace(from + Tag.PATH_SEPARATOR_STRING,
+ "");
+
+ Tag to_child = Tag.for_path(to_tag.get_path() + Tag.PATH_SEPARATOR_STRING +
+ child_subpath);
+
+ foreach (MediaSource source in from_child.get_sources())
+ to_child.attach(source);
+ }
+ }
+
+ private void destroy_subtree(string client_path) {
+ string? victim_path = HierarchicalTagUtilities.get_root_path_form(client_path);
+ if (victim_path == null)
+ victim_path = client_path;
+
+ if (!Tag.global.exists(victim_path))
+ return;
+
+ Tag victim = Tag.for_path(victim_path);
+
+ // destroy the children of the victim in order from most derived to most basic
+ Gee.List<Tag> victim_children = victim.get_hierarchical_children();
+ for (int i = 0; i < victim_children.size; i++)
+ Tag.global.destroy_marked(Tag.global.mark(victim_children.get(i)), true);
+
+ // destroy the victim itself
+ Tag.global.destroy_marked(Tag.global.mark(victim), true);
+ }
+
+ public override void execute() {
+ if (after_state == null) {
+ save_before_state();
+
+ prepare_parent(to_path);
+
+ copy_subtree(from_path, to_path);
+
+ save_after_state();
+
+ do_source_parent_detachments();
+
+ destroy_subtree(from_path);
+ } else {
+ prepare_parent(to_path);
+
+ restore_after_state();
+
+ restore_child_attachments_at(to_path, in_play_child_structure);
+ reattach_in_play_sources_at(to_path);
+
+ do_source_parent_detachments();
+ do_destination_parent_reattachments();
+
+ destroy_subtree(from_path);
+ }
+ }
+
+ public override void undo() {
+ assert(src_before_state != null);
+
+ prepare_parent(from_path);
+
+ restore_before_state();
+
+ if (!to_path_exists)
+ destroy_subtree(to_path);
+
+ restore_child_attachments_at(from_path, in_play_child_structure);
+ reattach_in_play_sources_at(from_path);
+
+ do_source_parent_reattachments();
+ do_destination_parent_detachments();
+
+ HierarchicalTagUtilities.cleanup_root_path(to_path);
+ HierarchicalTagUtilities.cleanup_root_path(from_path);
+ if (to_path_parent_path != null)
+ HierarchicalTagUtilities.cleanup_root_path(to_path_parent_path);
+ }
+}
+
+public class ModifyTagsCommand : SingleDataSourceCommand {
+ private MediaSource media;
+ private Gee.ArrayList<SourceProxy> to_add = new Gee.ArrayList<SourceProxy>();
+ private Gee.ArrayList<SourceProxy> to_remove = new Gee.ArrayList<SourceProxy>();
+
+ public ModifyTagsCommand(MediaSource media, Gee.Collection<Tag> new_tag_list) {
+ base (media, Resources.MODIFY_TAGS_LABEL, "");
+
+ this.media = media;
+
+ // Prepare to remove all existing tags, if any, from the current media source.
+ Gee.List<Tag>? original_tags = Tag.global.fetch_for_source(media);
+ if (original_tags != null) {
+ foreach (Tag tag in original_tags) {
+ SourceProxy proxy = tag.get_proxy();
+ to_remove.add(proxy);
+ proxy.broken.connect(on_proxy_broken);
+ }
+ }
+
+ // Prepare to add all new tags; remember, if a tag is added, its parent must be
+ // added as well. So enumerate all paths to add and then get the tags for them.
+ Gee.SortedSet<string> new_paths = new Gee.TreeSet<string>();
+ foreach (Tag new_tag in new_tag_list) {
+ string new_tag_path = new_tag.get_path();
+
+ new_paths.add(new_tag_path);
+ new_paths.add_all(HierarchicalTagUtilities.enumerate_parent_paths(new_tag_path));
+ }
+
+ foreach (string path in new_paths) {
+ assert(Tag.global.exists(path));
+
+ SourceProxy proxy = Tag.for_path(path).get_proxy();
+ to_add.add(proxy);
+ proxy.broken.connect(on_proxy_broken);
+ }
+ }
+
+ ~ModifyTagsCommand() {
+ foreach (SourceProxy proxy in to_add)
+ proxy.broken.disconnect(on_proxy_broken);
+
+ foreach (SourceProxy proxy in to_remove)
+ proxy.broken.disconnect(on_proxy_broken);
+ }
+
+ public override void execute() {
+ foreach (SourceProxy proxy in to_remove)
+ ((Tag) proxy.get_source()).detach(media);
+
+ foreach (SourceProxy proxy in to_add)
+ ((Tag) proxy.get_source()).attach(media);
+ }
+
+ public override void undo() {
+ foreach (SourceProxy proxy in to_add)
+ ((Tag) proxy.get_source()).detach(media);
+
+ foreach (SourceProxy proxy in to_remove)
+ ((Tag) proxy.get_source()).attach(media);
+ }
+
+ private void on_proxy_broken() {
+ get_command_manager().reset();
+ }
+}
+
+public class TagUntagPhotosCommand : SimpleProxyableCommand {
+ private Gee.Collection<MediaSource> sources;
+ private bool attach;
+ private Gee.MultiMap<Tag, MediaSource>? detached_from = null;
+ private Gee.List<Tag>? attached_to = null;
+
+ public TagUntagPhotosCommand(Tag tag, Gee.Collection<MediaSource> sources, int count, bool attach) {
+ base (tag,
+ attach ? Resources.tag_photos_label(tag.get_user_visible_name(), count)
+ : Resources.untag_photos_label(tag.get_user_visible_name(), count),
+ tag.get_name());
+
+ this.sources = sources;
+ this.attach = attach;
+
+ LibraryPhoto.global.item_destroyed.connect(on_source_destroyed);
+ Video.global.item_destroyed.connect(on_source_destroyed);
+ }
+
+ ~TagUntagPhotosCommand() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_source_destroyed);
+ Video.global.item_destroyed.disconnect(on_source_destroyed);
+ }
+
+ public override void execute_on_source(DataSource source) {
+ if (attach)
+ do_attach((Tag) source);
+ else
+ do_detach((Tag) source);
+ }
+
+ public override void undo_on_source(DataSource source) {
+ if (attach)
+ do_detach((Tag) source);
+ else
+ do_attach((Tag) source);
+ }
+
+ private void do_attach(Tag tag) {
+ // if not attaching previously detached Tags, attach and done
+ if (detached_from == null) {
+ tag.attach_many(sources);
+
+ attached_to = new Gee.ArrayList<Tag>();
+
+ Tag curr_tmp = tag;
+
+ while (curr_tmp != null) {
+ attached_to.add(curr_tmp);
+ curr_tmp = curr_tmp.get_hierarchical_parent();
+ }
+
+ return;
+ }
+
+ // reattach
+ foreach (Tag detached_tag in detached_from.get_all_keys())
+ detached_tag.attach_many(detached_from.get(detached_tag));
+
+ detached_from = null;
+ clear_added_proxies();
+ }
+
+ private void do_detach(Tag tag) {
+ if (attached_to == null) {
+ // detaching a MediaSource from a Tag may result in the MediaSource being detached from
+ // many tags (due to heirarchical tagging), so save the MediaSources for each detached
+ // Tag for reversing the process
+ detached_from = tag.detach_many(sources);
+
+ // since the "master" Tag (supplied in the ctor) is not necessarily the only one being
+ // saved, add proxies for all of the other ones as well
+ add_proxyables(detached_from.get_keys());
+ } else {
+ foreach (Tag t in attached_to) {
+ foreach (MediaSource ms in sources) {
+ // is this photo/video attached to this tag elsewhere?
+ if (t.get_attachment_count(ms) < 2) {
+ //no, remove it.
+ t.detach(ms);
+ }
+ }
+ }
+ }
+ }
+
+ private void on_source_destroyed(DataSource source) {
+ debug("on_source_destroyed: %s", source.to_string());
+ if (sources.contains((MediaSource) source))
+ get_command_manager().reset();
+ }
+}
+
+public class RenameSavedSearchCommand : SingleDataSourceCommand {
+ private SavedSearch search;
+ private string old_name;
+ private string new_name;
+
+ public RenameSavedSearchCommand(SavedSearch search, string new_name) {
+ base (search, Resources.rename_search_label(search.get_name(), new_name), search.get_name());
+
+ this.search = search;
+ old_name = search.get_name();
+ this.new_name = new_name;
+ }
+
+ public override void execute() {
+ if (!search.rename(new_name))
+ AppWindow.error_message(Resources.rename_search_exists_message(new_name));
+ }
+
+ public override void undo() {
+ if (!search.rename(old_name))
+ AppWindow.error_message(Resources.rename_search_exists_message(old_name));
+ }
+}
+
+public class DeleteSavedSearchCommand : SingleDataSourceCommand {
+ private SavedSearch search;
+
+ public DeleteSavedSearchCommand(SavedSearch search) {
+ base (search, Resources.delete_search_label(search.get_name()), search.get_name());
+
+ this.search = search;
+ }
+
+ public override void execute() {
+ SavedSearchTable.get_instance().remove(search);
+ }
+
+ public override void undo() {
+ search.reconstitute();
+ }
+}
+
+public class TrashUntrashPhotosCommand : PageCommand {
+ private Gee.Collection<MediaSource> sources;
+ private bool to_trash;
+
+ public TrashUntrashPhotosCommand(Gee.Collection<MediaSource> sources, bool to_trash) {
+ base (
+ to_trash ? _("Move Photos to Trash") : _("Restore Photos from Trash"),
+ to_trash ? _("Move the photos to the Shotwell trash") : _("Restore the photos back to the Shotwell library"));
+
+ this.sources = sources;
+ this.to_trash = to_trash;
+
+ LibraryPhoto.global.item_destroyed.connect(on_photo_destroyed);
+ Video.global.item_destroyed.connect(on_photo_destroyed);
+ }
+
+ ~TrashUntrashPhotosCommand() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_photo_destroyed);
+ Video.global.item_destroyed.disconnect(on_photo_destroyed);
+ }
+
+ private ProgressDialog? get_progress_dialog(bool to_trash) {
+ if (sources.size <= 5)
+ return null;
+
+ ProgressDialog dialog = new ProgressDialog(AppWindow.get_instance(),
+ to_trash ? _("Moving Photos to Trash") : _("Restoring Photos From Trash"));
+ dialog.update_display_every((sources.size / 5).clamp(2, 10));
+
+ return dialog;
+ }
+
+ public override void execute() {
+ ProgressDialog? dialog = get_progress_dialog(to_trash);
+
+ ProgressMonitor monitor = null;
+ if (dialog != null)
+ monitor = dialog.monitor;
+
+ if (to_trash)
+ trash(monitor);
+ else
+ untrash(monitor);
+
+ if (dialog != null)
+ dialog.close();
+ }
+
+ public override void undo() {
+ ProgressDialog? dialog = get_progress_dialog(!to_trash);
+
+ ProgressMonitor monitor = null;
+ if (dialog != null)
+ monitor = dialog.monitor;
+
+ if (to_trash)
+ untrash(monitor);
+ else
+ trash(monitor);
+
+ if (dialog != null)
+ dialog.close();
+ }
+
+ private void trash(ProgressMonitor? monitor) {
+ int ctr = 0;
+ int count = sources.size;
+
+ LibraryPhoto.global.transaction_controller.begin();
+ Video.global.transaction_controller.begin();
+
+ foreach (MediaSource source in sources) {
+ source.trash();
+ if (monitor != null)
+ monitor(++ctr, count);
+ }
+
+ LibraryPhoto.global.transaction_controller.commit();
+ Video.global.transaction_controller.commit();
+ }
+
+ private void untrash(ProgressMonitor? monitor) {
+ int ctr = 0;
+ int count = sources.size;
+
+ LibraryPhoto.global.transaction_controller.begin();
+ Video.global.transaction_controller.begin();
+
+ foreach (MediaSource source in sources) {
+ source.untrash();
+ if (monitor != null)
+ monitor(++ctr, count);
+ }
+
+ LibraryPhoto.global.transaction_controller.commit();
+ Video.global.transaction_controller.commit();
+ }
+
+ private void on_photo_destroyed(DataSource source) {
+ // in this case, don't need to reset the command manager, simply remove the photo from the
+ // internal list and allow the others to be moved to and from the trash
+ sources.remove((MediaSource) source);
+
+ // however, if all photos missing, then remove this from the command stack, and there's
+ // only one way to do that
+ if (sources.size == 0)
+ get_command_manager().reset();
+ }
+}
+
+public class FlagUnflagCommand : MultipleDataSourceAtOnceCommand {
+ private const int MIN_PROGRESS_BAR_THRESHOLD = 1000;
+ private const string FLAG_SELECTED_STRING = _("Flag selected photos");
+ private const string UNFLAG_SELECTED_STRING = _("Unflag selected photos");
+ private const string FLAG_PROGRESS = _("Flagging selected photos");
+ private const string UNFLAG_PROGRESS = _("Unflagging selected photos");
+
+ private bool flag;
+ private ProgressDialog progress_dialog = null;
+
+ public FlagUnflagCommand(Gee.Collection<MediaSource> sources, bool flag) {
+ base (sources,
+ flag ? _("Flag") : _("Unflag"),
+ flag ? FLAG_SELECTED_STRING : UNFLAG_SELECTED_STRING);
+
+ this.flag = flag;
+
+ if (sources.size >= MIN_PROGRESS_BAR_THRESHOLD) {
+ progress_dialog = new ProgressDialog(null,
+ flag ? FLAG_PROGRESS : UNFLAG_PROGRESS);
+
+ progress_dialog.show_all();
+ }
+ }
+
+ public override void execute_on_all(Gee.Collection<DataSource> sources) {
+ int num_processed = 0;
+
+ foreach (DataSource source in sources) {
+ flag_unflag(source, flag);
+
+ num_processed++;
+
+ if (progress_dialog != null) {
+ progress_dialog.set_fraction(num_processed, sources.size);
+ progress_dialog.queue_draw();
+ spin_event_loop();
+ }
+ }
+
+ if (progress_dialog != null)
+ progress_dialog.hide();
+ }
+
+ public override void undo_on_all(Gee.Collection<DataSource> sources) {
+ foreach (DataSource source in sources)
+ flag_unflag(source, !flag);
+ }
+
+ private void flag_unflag(DataSource source, bool flag) {
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null) {
+ if (flag)
+ flaggable.mark_flagged();
+ else
+ flaggable.mark_unflagged();
+ }
+ }
+}
diff --git a/src/CustomComponents.vala b/src/CustomComponents.vala
new file mode 100644
index 0000000..4ace52c
--- /dev/null
+++ b/src/CustomComponents.vala
@@ -0,0 +1,513 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+extern void qsort(void *p, size_t num, size_t size, GLib.CompareFunc func);
+
+public class ThemeLoader {
+ private struct LightweightColor {
+ public uchar red;
+ public uchar green;
+ public uchar blue;
+
+ public LightweightColor() {
+ red = green = blue = 0;
+ }
+ }
+
+ private const int NUM_SUPPORTED_INTENSITIES = 6;
+ private const int THEME_OUTLINE_COLOR = 0;
+ private const int THEME_BEVEL_DARKER_COLOR = 1;
+ private const int THEME_BEVEL_DARK_COLOR = 2;
+ private const int THEME_BASE_COLOR = 3;
+ private const int THEME_BEVEL_LIGHT_COLOR = 4;
+ private const int THEME_BEVEL_LIGHTER_COLOR = 5;
+
+ private static LightweightColor[] theme_colors = null;
+
+ private static void populate_theme_params() {
+ if (theme_colors != null)
+ return;
+
+ theme_colors = new LightweightColor[NUM_SUPPORTED_INTENSITIES];
+
+ Gtk.Settings settings = Gtk.Settings.get_default();
+ HashTable<string, Gdk.Color?> color_table = settings.color_hash;
+ Gdk.Color? base_color = color_table.lookup("bg_color");
+ if (base_color == null && !Gdk.Color.parse("#fff", out base_color))
+ error("can't parse color");
+
+ RGBAnalyticPixel base_color_analytic_rgb =
+ RGBAnalyticPixel.from_quantized_components(base_color.red >> 8,
+ base_color.green >> 8, base_color.blue >> 8);
+ HSVAnalyticPixel base_color_analytic_hsv =
+ HSVAnalyticPixel.from_rgb(base_color_analytic_rgb);
+
+ HSVAnalyticPixel bevel_light_analytic_hsv = base_color_analytic_hsv;
+ bevel_light_analytic_hsv.light_value *= 1.15f;
+ bevel_light_analytic_hsv.light_value =
+ bevel_light_analytic_hsv.light_value.clamp(0.0f, 1.0f);
+
+ HSVAnalyticPixel bevel_lighter_analytic_hsv = bevel_light_analytic_hsv;
+ bevel_lighter_analytic_hsv.light_value *= 1.15f;
+ bevel_lighter_analytic_hsv.light_value =
+ bevel_lighter_analytic_hsv.light_value.clamp(0.0f, 1.0f);
+
+ HSVAnalyticPixel bevel_dark_analytic_hsv = base_color_analytic_hsv;
+ bevel_dark_analytic_hsv.light_value *= 0.85f;
+ bevel_dark_analytic_hsv.light_value =
+ bevel_dark_analytic_hsv.light_value.clamp(0.0f, 1.0f);
+
+ HSVAnalyticPixel bevel_darker_analytic_hsv = bevel_dark_analytic_hsv;
+ bevel_darker_analytic_hsv.light_value *= 0.85f;
+ bevel_darker_analytic_hsv.light_value =
+ bevel_darker_analytic_hsv.light_value.clamp(0.0f, 1.0f);
+
+ HSVAnalyticPixel outline_analytic_hsv = bevel_darker_analytic_hsv;
+ outline_analytic_hsv.light_value *= 0.66f;
+ outline_analytic_hsv.light_value =
+ outline_analytic_hsv.light_value.clamp(0.0f, 1.0f);
+
+ RGBAnalyticPixel outline_analytic_rgb = outline_analytic_hsv.to_rgb();
+ theme_colors[THEME_OUTLINE_COLOR] =
+ populate_one_theme_param(outline_analytic_rgb);
+
+ RGBAnalyticPixel bevel_darker_analytic_rgb = bevel_darker_analytic_hsv.to_rgb();
+ theme_colors[THEME_BEVEL_DARKER_COLOR] =
+ populate_one_theme_param(bevel_darker_analytic_rgb);
+
+ RGBAnalyticPixel bevel_dark_analytic_rgb = bevel_dark_analytic_hsv.to_rgb();
+ theme_colors[THEME_BEVEL_DARK_COLOR] =
+ populate_one_theme_param(bevel_dark_analytic_rgb);
+
+ theme_colors[THEME_BASE_COLOR] =
+ populate_one_theme_param(base_color_analytic_rgb);
+
+ RGBAnalyticPixel bevel_light_analytic_rgb = bevel_light_analytic_hsv.to_rgb();
+ theme_colors[THEME_BEVEL_LIGHT_COLOR] =
+ populate_one_theme_param(bevel_light_analytic_rgb);
+
+ RGBAnalyticPixel bevel_lighter_analytic_rgb = bevel_light_analytic_hsv.to_rgb();
+ theme_colors[THEME_BEVEL_LIGHTER_COLOR] =
+ populate_one_theme_param(bevel_lighter_analytic_rgb);
+ }
+
+ private static LightweightColor populate_one_theme_param(RGBAnalyticPixel from) {
+ LightweightColor into = LightweightColor();
+
+ into.red = (uchar)(from.red * 255.0f);
+ into.green = (uchar)(from.green * 255.0f);
+ into.blue = (uchar)(from.blue * 255.0f);
+
+ return into;
+ }
+
+ public static Gdk.Pixbuf load_icon(string source_basename) {
+ populate_theme_params();
+
+ Gdk.Pixbuf loaded_pixbuf = Resources.get_icon(source_basename, 0).copy();
+
+ /* Sweep through the icon image data loaded from disk and determine how many
+ unique colors are in it. We do this with the aid of a HashSet. */
+ Gee.HashSet<RGBAnalyticPixel?> colors =
+ new Gee.HashSet<RGBAnalyticPixel?>(rgb_pixel_hash_func,
+ rgb_pixel_equal_func);
+ unowned uchar[] pixel_data = loaded_pixbuf.get_pixels();
+ for (int j = 0; j < loaded_pixbuf.height; j++) {
+ for (int i = 0; i < loaded_pixbuf.width; i++) {
+ int pixel_index = (j * loaded_pixbuf.rowstride) + (i * loaded_pixbuf.n_channels);
+
+ RGBAnalyticPixel pixel_color = RGBAnalyticPixel.from_quantized_components(
+ pixel_data[pixel_index], pixel_data[pixel_index + 1],
+ pixel_data[pixel_index + 2]);
+ colors.add(pixel_color);
+ }
+ }
+
+ /* If the image data loaded from disk didn't contain NUM_SUPPORTED_INTENSITIES
+ colors, then we can't unambiguously map the colors in the loaded image data
+ to theme colors on the user's system, so propagate an error */
+ if (colors.size != NUM_SUPPORTED_INTENSITIES)
+ error("ThemeLoader: load_icon: pixbuf does not contain the correct number " +
+ "of unique colors");
+
+ /* sort the colors in the loaded image data in order of increasing intensity; this
+ means that we have to convert the loaded colors from RGB to HSV format */
+ HSVAnalyticPixel[] hsv_pixels = new HSVAnalyticPixel[6];
+ int pixel_ticker = 0;
+ foreach (RGBAnalyticPixel rgb_pixel in colors)
+ hsv_pixels[pixel_ticker++] = HSVAnalyticPixel.from_rgb(rgb_pixel);
+ qsort(hsv_pixels, hsv_pixels.length, sizeof(HSVAnalyticPixel), hsv_pixel_compare_func);
+
+ /* step through each pixel in the image data loaded from disk and map its color
+ to one of the user's theme colors */
+ for (int j = 0; j < loaded_pixbuf.height; j++) {
+ for (int i = 0; i < loaded_pixbuf.width; i++) {
+ int pixel_index = (j * loaded_pixbuf.rowstride) + (i * loaded_pixbuf.n_channels);
+ RGBAnalyticPixel pixel_color = RGBAnalyticPixel.from_quantized_components(
+ pixel_data[pixel_index], pixel_data[pixel_index + 1],
+ pixel_data[pixel_index + 2]);
+ HSVAnalyticPixel pixel_color_hsv = HSVAnalyticPixel.from_rgb(pixel_color);
+ int this_intensity = 0;
+ for (int k = 0; k < NUM_SUPPORTED_INTENSITIES; k++) {
+ if (hsv_pixels[k].light_value == pixel_color_hsv.light_value) {
+ this_intensity = k;
+ break;
+ }
+ }
+ pixel_data[pixel_index] = theme_colors[this_intensity].red;
+ pixel_data[pixel_index + 1] = theme_colors[this_intensity].green;
+ pixel_data[pixel_index + 2] = theme_colors[this_intensity].blue;
+ }
+ }
+
+ return loaded_pixbuf;
+ }
+
+ private static int hsv_pixel_compare_func(void* pixval1, void* pixval2) {
+ HSVAnalyticPixel pixel_val_1 = * ((HSVAnalyticPixel*) pixval1);
+ HSVAnalyticPixel pixel_val_2 = * ((HSVAnalyticPixel*) pixval2);
+
+ return (int) (255.0f * (pixel_val_1.light_value - pixel_val_2.light_value));
+ }
+
+ private static bool rgb_pixel_equal_func(RGBAnalyticPixel? p1, RGBAnalyticPixel? p2) {
+ return (p1.equals(p2));
+ }
+
+ private static uint rgb_pixel_hash_func(RGBAnalyticPixel? pixel_val) {
+ return pixel_val.hash_code();
+ }
+}
+
+public class RGBHistogramManipulator : Gtk.DrawingArea {
+ private enum LocationCode { LEFT_NUB, RIGHT_NUB, LEFT_TROUGH, RIGHT_TROUGH,
+ INSENSITIVE_AREA }
+ private const int NUB_SIZE = 13;
+ private const int NUB_HALF_WIDTH = NUB_SIZE / 2;
+ private const int NUB_V_NUDGE = 4;
+ private const int TROUGH_WIDTH = 256 + (2 * NUB_HALF_WIDTH);
+ private const int TROUGH_HEIGHT = 4;
+ private const int TROUGH_BOTTOM_OFFSET = 1;
+ private const int CONTROL_WIDTH = TROUGH_WIDTH + 2;
+ private const int CONTROL_HEIGHT = 118;
+ private const int NUB_V_POSITION = CONTROL_HEIGHT - TROUGH_HEIGHT - TROUGH_BOTTOM_OFFSET
+ - (NUB_SIZE - TROUGH_HEIGHT) / 2 - NUB_V_NUDGE - 2;
+ private int left_nub_max = 255 - NUB_SIZE - 1;
+ private int right_nub_min = NUB_SIZE + 1;
+
+ private static Gtk.Widget dummy_slider = null;
+ private static Gtk.Widget dummy_frame = null;
+ private static Gtk.WidgetPath slider_draw_path = new Gtk.WidgetPath();
+ private static Gtk.WidgetPath frame_draw_path = new Gtk.WidgetPath();
+ private static bool paths_setup = false;
+
+ private RGBHistogram histogram = null;
+ private int left_nub_position = 0;
+ private int right_nub_position = 255;
+ private Gdk.Pixbuf nub_pixbuf = ThemeLoader.load_icon("drag_nub.png");
+ private bool is_left_nub_tracking = false;
+ private bool is_right_nub_tracking = false;
+ private int track_start_x = 0;
+ private int track_nub_start_position = 0;
+
+ public RGBHistogramManipulator( ) {
+ set_size_request(CONTROL_WIDTH, CONTROL_HEIGHT);
+
+ if (dummy_slider == null)
+ dummy_slider = new Gtk.Scale(Gtk.Orientation.HORIZONTAL, null);
+
+ if (dummy_frame == null)
+ dummy_frame = new Gtk.Frame(null);
+
+ if (!paths_setup) {
+ slider_draw_path.append_type(typeof(Gtk.Scale));
+ slider_draw_path.iter_add_class(0, "scale");
+ slider_draw_path.iter_add_class(0, "range");
+
+ frame_draw_path.append_type(typeof(Gtk.Frame));
+ frame_draw_path.iter_add_class(0, "default");
+
+ paths_setup = true;
+ }
+
+ add_events(Gdk.EventMask.BUTTON_PRESS_MASK);
+ add_events(Gdk.EventMask.BUTTON_RELEASE_MASK);
+ add_events(Gdk.EventMask.BUTTON_MOTION_MASK);
+
+ button_press_event.connect(on_button_press);
+ button_release_event.connect(on_button_release);
+ motion_notify_event.connect(on_button_motion);
+ }
+
+ private LocationCode hit_test_point(int x, int y) {
+ if (y < NUB_V_POSITION)
+ return LocationCode.INSENSITIVE_AREA;
+
+ if ((x > left_nub_position) && (x < left_nub_position + NUB_SIZE))
+ return LocationCode.LEFT_NUB;
+
+ if ((x > right_nub_position) && (x < right_nub_position + NUB_SIZE))
+ return LocationCode.RIGHT_NUB;
+
+ if (y < (NUB_V_POSITION + NUB_V_NUDGE + 1))
+ return LocationCode.INSENSITIVE_AREA;
+
+ if ((x - left_nub_position) * (x - left_nub_position) <
+ (x - right_nub_position) * (x - right_nub_position))
+ return LocationCode.LEFT_TROUGH;
+ else
+ return LocationCode.RIGHT_TROUGH;
+ }
+
+ private bool on_button_press(Gdk.EventButton event_record) {
+ LocationCode loc = hit_test_point((int) event_record.x, (int) event_record.y);
+
+ switch (loc) {
+ case LocationCode.LEFT_NUB:
+ track_start_x = ((int) event_record.x);
+ track_nub_start_position = left_nub_position;
+ is_left_nub_tracking = true;
+ return true;
+
+ case LocationCode.RIGHT_NUB:
+ track_start_x = ((int) event_record.x);
+ track_nub_start_position = right_nub_position;
+ is_right_nub_tracking = true;
+ return true;
+
+ case LocationCode.LEFT_TROUGH:
+ left_nub_position = ((int) event_record.x) - NUB_HALF_WIDTH;
+ left_nub_position = left_nub_position.clamp(0, left_nub_max);
+ force_update();
+ nub_position_changed();
+ update_nub_extrema();
+ return true;
+
+ case LocationCode.RIGHT_TROUGH:
+ right_nub_position = ((int) event_record.x) - NUB_HALF_WIDTH;
+ right_nub_position = right_nub_position.clamp(right_nub_min, 255);
+ force_update();
+ nub_position_changed();
+ update_nub_extrema();
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ private bool on_button_release(Gdk.EventButton event_record) {
+ if (is_left_nub_tracking || is_right_nub_tracking) {
+ nub_position_changed();
+ update_nub_extrema();
+ }
+
+ is_left_nub_tracking = false;
+ is_right_nub_tracking = false;
+
+ return false;
+ }
+
+ private bool on_button_motion(Gdk.EventMotion event_record) {
+ if ((!is_left_nub_tracking) && (!is_right_nub_tracking))
+ return false;
+
+ if (is_left_nub_tracking) {
+ int track_x_delta = ((int) event_record.x) - track_start_x;
+ left_nub_position = (track_nub_start_position + track_x_delta);
+ left_nub_position = left_nub_position.clamp(0, left_nub_max);
+ } else { /* right nub is tracking */
+ int track_x_delta = ((int) event_record.x) - track_start_x;
+ right_nub_position = (track_nub_start_position + track_x_delta);
+ right_nub_position = right_nub_position.clamp(right_nub_min, 255);
+ }
+
+ force_update();
+ return true;
+ }
+
+ public override bool draw(Cairo.Context ctx) {
+ Gtk.Border padding = get_style_context().get_padding(Gtk.StateFlags.NORMAL);
+
+ Gdk.Rectangle area = Gdk.Rectangle();
+ area.x = padding.left;
+ area.y = padding.top;
+ area.width = RGBHistogram.GRAPHIC_WIDTH + padding.right;
+ area.height = RGBHistogram.GRAPHIC_HEIGHT + padding.bottom;
+
+ draw_histogram_frame(ctx, area);
+ draw_histogram(ctx, area);
+ draw_trough(ctx, area);
+ draw_nub(ctx, area, left_nub_position);
+ draw_nub(ctx, area, right_nub_position);
+
+ return true;
+ }
+
+ private void draw_histogram_frame(Cairo.Context ctx, Gdk.Rectangle area) {
+ // the framed area is inset and slightly smaller than the overall histogram
+ // control area
+ Gdk.Rectangle framed_area = area;
+ framed_area.x += 5;
+ framed_area.y += 1;
+ framed_area.width -= 8;
+ framed_area.height -= 12;
+
+ Gtk.StyleContext stylectx = dummy_frame.get_style_context();
+ stylectx.save();
+
+ stylectx.get_path().append_type(typeof(Gtk.Frame));
+ stylectx.get_path().iter_add_class(0, "default");
+ stylectx.add_class(Gtk.STYLE_CLASS_TROUGH);
+ stylectx.set_junction_sides(Gtk.JunctionSides.TOP | Gtk.JunctionSides.BOTTOM |
+ Gtk.JunctionSides.LEFT | Gtk.JunctionSides.RIGHT);
+
+ stylectx.render_frame(ctx, framed_area.x, framed_area.y, framed_area.width,
+ framed_area.height);
+
+ stylectx.restore();
+ }
+
+ private void draw_histogram(Cairo.Context ctx, Gdk.Rectangle area) {
+ if (histogram == null)
+ return;
+
+ Gdk.Pixbuf histogram_graphic = histogram.get_graphic().copy();
+ unowned uchar[] pixel_data = histogram_graphic.get_pixels();
+
+ int edge_blend_red = 0;
+ int edge_blend_green = 0;
+ int edge_blend_blue = 0;
+ int body_blend_red = 20;
+ int body_blend_green = 20;
+ int body_blend_blue = 20;
+
+ if (left_nub_position > 0) {
+ int edge_pixel_index = histogram_graphic.n_channels * left_nub_position;
+ for (int i = 0; i < histogram_graphic.height; i++) {
+ int body_pixel_index = i * histogram_graphic.rowstride;
+ int row_last_pixel = body_pixel_index + histogram_graphic.n_channels *
+ left_nub_position;
+ while (body_pixel_index < row_last_pixel) {
+ pixel_data[body_pixel_index] =
+ (uchar) ((pixel_data[body_pixel_index] + body_blend_red) / 2);
+ pixel_data[body_pixel_index + 1] =
+ (uchar) ((pixel_data[body_pixel_index + 1] + body_blend_green) / 2);
+ pixel_data[body_pixel_index + 2] =
+ (uchar) ((pixel_data[body_pixel_index + 2] + body_blend_blue) / 2);
+
+ body_pixel_index += histogram_graphic.n_channels;
+ }
+
+ pixel_data[edge_pixel_index] =
+ (uchar) ((pixel_data[edge_pixel_index] + edge_blend_red) / 2);
+ pixel_data[edge_pixel_index + 1] =
+ (uchar) ((pixel_data[edge_pixel_index + 1] + edge_blend_green) / 2);
+ pixel_data[edge_pixel_index + 2] =
+ (uchar) ((pixel_data[edge_pixel_index + 2] + edge_blend_blue) / 2);
+
+ edge_pixel_index += histogram_graphic.rowstride;
+ }
+ }
+
+ edge_blend_red = 250;
+ edge_blend_green = 250;
+ edge_blend_blue = 250;
+ body_blend_red = 200;
+ body_blend_green = 200;
+ body_blend_blue = 200;
+
+ if (right_nub_position < 255) {
+ int edge_pixel_index = histogram_graphic.n_channels * right_nub_position;
+ for (int i = 0; i < histogram_graphic.height; i++) {
+ int body_pixel_index = i * histogram_graphic.rowstride +
+ histogram_graphic.n_channels * 255;
+ int row_last_pixel = i * histogram_graphic.rowstride +
+ histogram_graphic.n_channels * right_nub_position;
+ while (body_pixel_index > row_last_pixel) {
+ pixel_data[body_pixel_index] =
+ (uchar) ((pixel_data[body_pixel_index] + body_blend_red) / 2);
+ pixel_data[body_pixel_index + 1] =
+ (uchar) ((pixel_data[body_pixel_index + 1] + body_blend_green) / 2);
+ pixel_data[body_pixel_index + 2] =
+ (uchar) ((pixel_data[body_pixel_index + 2] + body_blend_blue) / 2);
+
+ body_pixel_index -= histogram_graphic.n_channels;
+ }
+ pixel_data[edge_pixel_index] =
+ (uchar) ((pixel_data[edge_pixel_index] + edge_blend_red) / 2);
+ pixel_data[edge_pixel_index + 1] =
+ (uchar) ((pixel_data[edge_pixel_index + 1] + edge_blend_green) / 2);
+ pixel_data[edge_pixel_index + 2] =
+ (uchar) ((pixel_data[edge_pixel_index + 2] + edge_blend_blue) / 2);
+
+ edge_pixel_index += histogram_graphic.rowstride;
+ }
+ }
+
+ Gdk.cairo_set_source_pixbuf(ctx, histogram_graphic, area.x + NUB_HALF_WIDTH, area.y + 2);
+ ctx.paint();
+ }
+
+ private void draw_trough(Cairo.Context ctx, Gdk.Rectangle area) {
+ int trough_x = area.x;
+ int trough_y = area.y + (CONTROL_HEIGHT - TROUGH_HEIGHT - TROUGH_BOTTOM_OFFSET - 3);
+
+ Gtk.StyleContext stylectx = dummy_slider.get_style_context();
+ stylectx.save();
+
+ stylectx.get_path().append_type(typeof(Gtk.Scale));
+ stylectx.get_path().iter_add_class(0, "scale");
+ stylectx.add_class(Gtk.STYLE_CLASS_TROUGH);
+
+ stylectx.render_activity(ctx, trough_x, trough_y, TROUGH_WIDTH, TROUGH_HEIGHT);
+
+ stylectx.restore();
+ }
+
+ private void draw_nub(Cairo.Context ctx, Gdk.Rectangle area, int position) {
+ Gdk.cairo_set_source_pixbuf(ctx, nub_pixbuf, area.x + position, area.y + NUB_V_POSITION);
+ ctx.paint();
+ }
+
+ private void force_update() {
+ get_window().invalidate_rect(null, true);
+ get_window().process_updates(true);
+ }
+
+ private void update_nub_extrema() {
+ right_nub_min = left_nub_position + NUB_SIZE + 1;
+ left_nub_max = right_nub_position - NUB_SIZE - 1;
+ }
+
+ public signal void nub_position_changed();
+
+ public void update_histogram(Gdk.Pixbuf source_pixbuf) {
+ histogram = new RGBHistogram(source_pixbuf);
+ force_update();
+ }
+
+ public int get_left_nub_position() {
+ return left_nub_position;
+ }
+
+ public int get_right_nub_position() {
+ return right_nub_position;
+ }
+
+ public void set_left_nub_position(int user_nub_pos) {
+ assert ((user_nub_pos >= 0) && (user_nub_pos <= 255));
+ left_nub_position = user_nub_pos.clamp(0, left_nub_max);
+ update_nub_extrema();
+ }
+
+ public void set_right_nub_position(int user_nub_pos) {
+ assert ((user_nub_pos >= 0) && (user_nub_pos <= 255));
+ right_nub_position = user_nub_pos.clamp(right_nub_min, 255);
+ update_nub_extrema();
+ }
+}
+
diff --git a/src/Debug.vala b/src/Debug.vala
new file mode 100644
index 0000000..ad626f4
--- /dev/null
+++ b/src/Debug.vala
@@ -0,0 +1,146 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+namespace Debug {
+ private const LogLevelFlags DEFAULT_LOG_MASK =
+ LogLevelFlags.LEVEL_CRITICAL |
+ LogLevelFlags.LEVEL_WARNING |
+ LogLevelFlags.LEVEL_MESSAGE;
+
+ public const string VIEWER_PREFIX = "V";
+ public const string LIBRARY_PREFIX = "L";
+
+ // Ideally, there would be a LogLevelFlags.NONE constant to use as
+ // empty value but failing that, 0 works as well
+ private LogLevelFlags log_mask = 0;
+ private string log_app_version_prefix;
+ // log_file_stream is the canonical reference to the file stream (and owns
+ // it), while log_out and log_err are indirections that can point to
+ // log_file_stream or stdout and stderr respectively
+ private unowned FileStream log_out = null;
+ private unowned FileStream log_err = null;
+ private FileStream log_file_stream = null;
+
+ public static void init(string app_version_prefix) {
+ log_app_version_prefix = app_version_prefix;
+
+ // default to stdout/stderr if file cannot be opened or console is specified
+ log_out = stdout;
+ log_err = stderr;
+
+ string log_file_error_msg = null;
+
+ // logging to disk is currently off for viewer more; see http://trac.yorba.org/ticket/2078
+ File? log_file = (log_app_version_prefix == LIBRARY_PREFIX) ? AppDirs.get_log_file() : null;
+ if(log_file != null) {
+ File log_dir = log_file.get_parent();
+ try {
+ if (log_dir.query_exists(null) == false) {
+ if (!log_dir.make_directory_with_parents(null)) {
+ log_file_error_msg = "Unable to create data directory %s".printf(log_dir.get_path());
+ }
+ }
+ } catch (Error err) {
+ log_file_error_msg = err.message;
+ }
+ // overwrite the log file every time the application is started
+ // to ensure it doesn't grow too large; if there is a need for
+ // keeping the log, the 'w' should be replaced by 'a' and some sort
+ // of log rotation implemented
+ log_file_stream = FileStream.open(log_file.get_path(), "w");
+ if(log_file_stream != null) {
+ log_out = log_file_stream;
+ log_err = log_file_stream;
+ } else {
+ log_file_error_msg = "Unable to open or create log file %s".printf(log_file.get_path());
+ }
+ }
+
+ if (Environment.get_variable("SHOTWELL_LOG") != null) {
+ log_mask = LogLevelFlags.LEVEL_MASK;
+ } else {
+ log_mask = ((Environment.get_variable("SHOTWELL_INFO") != null) ?
+ log_mask | LogLevelFlags.LEVEL_INFO :
+ log_mask);
+ log_mask = ((Environment.get_variable("SHOTWELL_DEBUG") != null) ?
+ log_mask | LogLevelFlags.LEVEL_DEBUG :
+ log_mask);
+ log_mask = ((Environment.get_variable("SHOTWELL_MESSAGE") != null) ?
+ log_mask | LogLevelFlags.LEVEL_MESSAGE :
+ log_mask);
+ log_mask = ((Environment.get_variable("SHOTWELL_WARNING") != null) ?
+ log_mask | LogLevelFlags.LEVEL_WARNING :
+ log_mask);
+ log_mask = ((Environment.get_variable("SHOTWELL_CRITICAL") != null) ?
+ log_mask | LogLevelFlags.LEVEL_CRITICAL :
+ log_mask);
+ }
+
+ Log.set_handler(null, LogLevelFlags.LEVEL_INFO, info_handler);
+ Log.set_handler(null, LogLevelFlags.LEVEL_DEBUG, debug_handler);
+ Log.set_handler(null, LogLevelFlags.LEVEL_MESSAGE, message_handler);
+ Log.set_handler(null, LogLevelFlags.LEVEL_WARNING, warning_handler);
+ Log.set_handler(null, LogLevelFlags.LEVEL_CRITICAL, critical_handler);
+
+ if(log_mask == 0 && log_file != null) {
+ // if the log mask is still 0 and we have a log file, set the
+ // mask to the default
+ log_mask = DEFAULT_LOG_MASK;
+ }
+
+ if(log_file_error_msg != null) {
+ warning("%s", log_file_error_msg);
+ }
+ }
+
+ public static void terminate() {
+ }
+
+ private bool is_enabled(LogLevelFlags flag) {
+ return ((log_mask & flag) > 0);
+ }
+
+ private void log(FileStream stream, string prefix, string message) {
+ time_t now = time_t();
+ stream.printf("%s %d %s [%s] %s\n",
+ log_app_version_prefix,
+ Posix.getpid(),
+ Time.local(now).to_string(),
+ prefix,
+ message
+ );
+ stream.flush();
+ }
+
+ private void info_handler(string? domain, LogLevelFlags flags, string message) {
+ if (is_enabled(LogLevelFlags.LEVEL_INFO))
+ log(log_out, "INF", message);
+ }
+
+ private void debug_handler(string? domain, LogLevelFlags flags, string message) {
+ if (is_enabled(LogLevelFlags.LEVEL_DEBUG))
+ log(log_out, "DBG", message);
+ }
+
+ private void message_handler(string? domain, LogLevelFlags flags, string message) {
+ if (is_enabled(LogLevelFlags.LEVEL_MESSAGE))
+ log(log_err, "MSG", message);
+ }
+
+ private void warning_handler(string? domain, LogLevelFlags flags, string message) {
+ if (is_enabled(LogLevelFlags.LEVEL_WARNING))
+ log(log_err, "WRN", message);
+ }
+
+ private void critical_handler(string? domain, LogLevelFlags flags, string message) {
+ if (is_enabled(LogLevelFlags.LEVEL_CRITICAL)) {
+ log(log_err, "CRT", message);
+ if (log_file_stream != null)
+ log(stderr, "CRT", message); // also log to console
+ }
+ }
+}
+
diff --git a/src/DesktopIntegration.vala b/src/DesktopIntegration.vala
new file mode 100644
index 0000000..ebdc45e
--- /dev/null
+++ b/src/DesktopIntegration.vala
@@ -0,0 +1,308 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DesktopIntegration {
+
+private const string SENDTO_EXEC = "nautilus-sendto";
+private const string DESKTOP_SLIDESHOW_XML_FILENAME = "wallpaper.xml";
+
+private int init_count = 0;
+private bool send_to_installed = false;
+private ExporterUI send_to_exporter = null;
+private ExporterUI desktop_slideshow_exporter = null;
+private double desktop_slideshow_transition = 0.0;
+private double desktop_slideshow_duration = 0.0;
+
+public void init() {
+ if (init_count++ != 0)
+ return;
+
+ send_to_installed = Environment.find_program_in_path(SENDTO_EXEC) != null;
+}
+
+public void terminate() {
+ if (--init_count == 0)
+ return;
+}
+
+public AppInfo? get_default_app_for_mime_types(string[] mime_types,
+ Gee.ArrayList<string> preferred_apps) {
+ SortedList<AppInfo> external_apps = get_apps_for_mime_types(mime_types);
+
+ foreach (string preferred_app in preferred_apps) {
+ foreach (AppInfo external_app in external_apps) {
+ if (external_app.get_name().contains(preferred_app))
+ return external_app;
+ }
+ }
+
+ return null;
+}
+
+// compare the app names, case insensitive
+public static int64 app_info_comparator(void *a, void *b) {
+ return ((AppInfo) a).get_name().down().collate(((AppInfo) b).get_name().down());
+}
+
+public SortedList<AppInfo> get_apps_for_mime_types(string[] mime_types) {
+ SortedList<AppInfo> external_apps = new SortedList<AppInfo>(app_info_comparator);
+
+ if (mime_types.length == 0)
+ return external_apps;
+
+ // 3 loops because SortedList.contains() wasn't paying nicely with AppInfo,
+ // probably because it has a special equality function
+ foreach (string mime_type in mime_types) {
+ string content_type = ContentType.from_mime_type(mime_type);
+ if (content_type == null)
+ break;
+
+ foreach (AppInfo external_app in
+ AppInfo.get_all_for_type(content_type)) {
+ bool already_contains = false;
+
+ foreach (AppInfo app in external_apps) {
+ if (app.get_name() == external_app.get_name()) {
+ already_contains = true;
+ break;
+ }
+ }
+
+ // dont add Shotwell to app list
+ if (!already_contains && !external_app.get_name().contains(Resources.APP_TITLE))
+ external_apps.add(external_app);
+ }
+ }
+
+ return external_apps;
+}
+
+public string? get_app_open_command(AppInfo app_info) {
+ string? str = app_info.get_commandline();
+
+ return str != null ? str : app_info.get_executable();
+}
+
+public bool is_send_to_installed() {
+ return send_to_installed;
+}
+
+public void files_send_to(File[] files) {
+ if (files.length == 0)
+ return;
+
+ string[] argv = new string[files.length + 1];
+ argv[0] = SENDTO_EXEC;
+
+ for (int ctr = 0; ctr < files.length; ctr++)
+ argv[ctr + 1] = files[ctr].get_path();
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+
+ Pid child_pid;
+ Process.spawn_async(
+ "/",
+ argv,
+ null, // environment
+ SpawnFlags.SEARCH_PATH,
+ null, // child setup
+ out child_pid);
+
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ AppWindow.error_message(_("Unable to launch Nautilus Send-To: %s").printf(err.message));
+ }
+}
+
+public void send_to(Gee.Collection<MediaSource> media) {
+ if (media.size == 0 || send_to_exporter != null)
+ return;
+
+ ExportDialog dialog = new ExportDialog(_("Send To"));
+
+ // determine the mix of media in the export collection -- if it contains only
+ // videos then we can use the Video.export_many( ) fast path and not have to
+ // worry about ExportFormatParameters or the Export... dialog
+ if (MediaSourceCollection.has_video(media) && !MediaSourceCollection.has_photo(media)) {
+ send_to_exporter = Video.export_many((Gee.Collection<Video>) media,
+ on_send_to_export_completed, true);
+ return;
+ }
+
+ int scale;
+ ScaleConstraint constraint;
+ ExportFormatParameters export_params = ExportFormatParameters.current();
+ if (!dialog.execute(out scale, out constraint, ref export_params))
+ return;
+
+ send_to_exporter = new ExporterUI(new Exporter.for_temp_file(media,
+ Scaling.for_constraint(constraint, scale, false), export_params));
+ send_to_exporter.export(on_send_to_export_completed);
+}
+
+private void on_send_to_export_completed(Exporter exporter, bool is_cancelled) {
+ if (!is_cancelled)
+ files_send_to(exporter.get_exported_files());
+
+ send_to_exporter = null;
+}
+
+public void set_background(Photo photo) {
+ // attempt to set the wallpaper to the photo's native format, but if not writeable, go to the
+ // system default
+ PhotoFileFormat file_format = photo.get_best_export_file_format();
+
+ File save_as = AppDirs.get_data_subdir("wallpaper").get_child(
+ file_format.get_default_basename("wallpaper"));
+
+ if (Config.Facade.get_instance().get_desktop_background() == save_as.get_path()) {
+ save_as = AppDirs.get_data_subdir("wallpaper").get_child(
+ file_format.get_default_basename("wallpaper_alt"));
+ }
+
+ try {
+ photo.export(save_as, Scaling.for_original(), Jpeg.Quality.HIGH, file_format);
+ } catch (Error err) {
+ AppWindow.error_message(_("Unable to export background to %s: %s").printf(save_as.get_path(),
+ err.message));
+
+ return;
+ }
+
+ Config.Facade.get_instance().set_desktop_background(save_as.get_path());
+
+ GLib.FileUtils.chmod(save_as.get_parse_name(), 0644);
+}
+
+// Helper class for set_background_slideshow()
+// Used to build xml file that describes background
+// slideshow for Gnome
+private class BackgroundSlideshowXMLBuilder {
+ private File destination;
+ private double duration;
+ private double transition;
+ private File tmp_file;
+ private DataOutputStream? outs = null;
+ private File? first_file = null;
+ private File? last_file = null;
+
+ public BackgroundSlideshowXMLBuilder(File destination, double duration, double transition) {
+ this.destination = destination;
+ this.duration = duration;
+ this.transition = transition;
+
+ tmp_file = destination.get_parent().get_child(destination.get_basename() + ".tmp");
+ }
+
+ public void open() throws Error {
+ outs = new DataOutputStream(tmp_file.replace(null, false, FileCreateFlags.NONE, null));
+ outs.put_string("<background>\n");
+ }
+
+ private void write_transition(File from, File to) throws Error {
+ outs.put_string(" <transition>\n");
+ outs.put_string(" <duration>%2.2f</duration>\n".printf(transition));
+ outs.put_string(" <from>%s</from>\n".printf(from.get_path()));
+ outs.put_string(" <to>%s</to>\n".printf(to.get_path()));
+ outs.put_string(" </transition>\n");
+ }
+
+ private void write_static(File file) throws Error {
+ outs.put_string(" <static>\n");
+ outs.put_string(" <duration>%2.2f</duration>\n".printf(duration));
+ outs.put_string(" <file>%s</file>\n".printf(file.get_path()));
+ outs.put_string(" </static>\n");
+ }
+
+ public void add_photo(File file) throws Error {
+ assert(outs != null);
+
+ if (first_file == null)
+ first_file = file;
+
+ if (last_file != null)
+ write_transition(last_file, file);
+
+ write_static(file);
+
+ last_file = file;
+ }
+
+ public File? close() throws Error {
+ if (outs == null)
+ return null;
+
+ // transition back to first file
+ if (first_file != null && last_file != null)
+ write_transition(last_file, first_file);
+
+ outs.put_string("</background>\n");
+
+ outs.close();
+ outs = null;
+
+ // move to destination name
+ tmp_file.move(destination, FileCopyFlags.OVERWRITE);
+ GLib.FileUtils.chmod(destination.get_parse_name(), 0644);
+
+ return destination;
+ }
+}
+
+public void set_background_slideshow(Gee.Collection<Photo> photos, double duration, double transition) {
+ if (desktop_slideshow_exporter != null)
+ return;
+
+ File wallpaper_dir = AppDirs.get_data_subdir("wallpaper");
+
+ Gee.Set<string> exceptions = new Gee.HashSet<string>();
+ exceptions.add(DESKTOP_SLIDESHOW_XML_FILENAME);
+ try {
+ delete_all_files(wallpaper_dir, exceptions);
+ } catch (Error err) {
+ warning("Error attempting to clear wallpaper directory: %s", err.message);
+ }
+
+ desktop_slideshow_duration = duration;
+ desktop_slideshow_transition = transition;
+
+ Exporter exporter = new Exporter(photos, wallpaper_dir,
+ Scaling.to_fill_screen(AppWindow.get_instance()), ExportFormatParameters.current(),
+ true);
+ desktop_slideshow_exporter = new ExporterUI(exporter);
+ desktop_slideshow_exporter.export(on_desktop_slideshow_exported);
+}
+
+private void on_desktop_slideshow_exported(Exporter exporter, bool is_cancelled) {
+ desktop_slideshow_exporter = null;
+
+ if (is_cancelled)
+ return;
+
+ File? xml_file = null;
+ BackgroundSlideshowXMLBuilder xml_builder = new BackgroundSlideshowXMLBuilder(
+ AppDirs.get_data_subdir("wallpaper").get_child(DESKTOP_SLIDESHOW_XML_FILENAME),
+ desktop_slideshow_duration, desktop_slideshow_transition);
+ try {
+ xml_builder.open();
+
+ foreach (File file in exporter.get_exported_files())
+ xml_builder.add_photo(file);
+
+ xml_file = xml_builder.close();
+ } catch (Error err) {
+ AppWindow.error_message(_("Unable to prepare desktop slideshow: %s").printf(
+ err.message));
+
+ return;
+ }
+
+ Config.Facade.get_instance().set_desktop_background(xml_file.get_path());
+}
+
+}
diff --git a/src/Dialogs.vala b/src/Dialogs.vala
new file mode 100644
index 0000000..149a6de
--- /dev/null
+++ b/src/Dialogs.vala
@@ -0,0 +1,2714 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// namespace for future migration of AppWindow alert and other question dialogs into single
+// place: http://trac.yorba.org/ticket/3452
+namespace Dialogs {
+
+public bool confirm_delete_tag(Tag tag) {
+ int count = tag.get_sources_count();
+ if (count == 0)
+ return true;
+ string msg = ngettext(
+ "This will remove the tag \"%s\" from one photo. Continue?",
+ "This will remove the tag \"%s\" from %d photos. Continue?",
+ count).printf(tag.get_user_visible_name(), count);
+
+ return AppWindow.negate_affirm_question(msg, _("_Cancel"), _("_Delete"),
+ Resources.DELETE_TAG_TITLE);
+}
+
+public bool confirm_delete_saved_search(SavedSearch search) {
+ string msg = _("This will remove the saved search \"%s\". Continue?")
+ .printf(search.get_name());
+
+ return AppWindow.negate_affirm_question(msg, _("_Cancel"), _("_Delete"),
+ Resources.DELETE_SAVED_SEARCH_DIALOG_TITLE);
+}
+
+public bool confirm_warn_developer_changed(int number) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog.with_markup(AppWindow.get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, "%s",
+ "<span weight=\"bold\" size=\"larger\">%s</span>".printf(ngettext("Switching developers will undo all changes you have made to this photo in Shotwell",
+ "Switching developers will undo all changes you have made to these photos in Shotwell", number)));
+
+ dialog.add_buttons(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL);
+ dialog.add_buttons(_("_Switch Developer"), Gtk.ResponseType.YES);
+
+ int response = dialog.run();
+
+ dialog.destroy();
+
+ return response == Gtk.ResponseType.YES;
+}
+
+}
+
+namespace ExportUI {
+private static File current_export_dir = null;
+
+public File? choose_file(string current_file_basename) {
+ if (current_export_dir == null)
+ current_export_dir = File.new_for_path(Environment.get_home_dir());
+
+ string file_chooser_title = VideoReader.is_supported_video_filename(current_file_basename) ?
+ _("Export Video") : _("Export Photo");
+
+ Gtk.FileChooserDialog chooser = new Gtk.FileChooserDialog(file_chooser_title,
+ AppWindow.get_instance(), Gtk.FileChooserAction.SAVE, Gtk.Stock.CANCEL,
+ Gtk.ResponseType.CANCEL, Gtk.Stock.SAVE, Gtk.ResponseType.ACCEPT, null);
+ chooser.set_do_overwrite_confirmation(true);
+ chooser.set_current_folder(current_export_dir.get_path());
+ chooser.set_current_name(current_file_basename);
+ chooser.set_local_only(false);
+
+ // The log handler reset should be removed once GTK 3.4 becomes widely available;
+ // please see https://bugzilla.gnome.org/show_bug.cgi?id=662814 for details.
+ Log.set_handler("Gtk", LogLevelFlags.LEVEL_WARNING, suppress_warnings);
+ File file = null;
+ if (chooser.run() == Gtk.ResponseType.ACCEPT) {
+ file = File.new_for_path(chooser.get_filename());
+ current_export_dir = file.get_parent();
+ }
+ Log.set_handler("Gtk", LogLevelFlags.LEVEL_WARNING, Log.default_handler);
+ chooser.destroy();
+
+ return file;
+}
+
+public File? choose_dir(string? user_title = null) {
+ if (current_export_dir == null)
+ current_export_dir = File.new_for_path(Environment.get_home_dir());
+
+ if (user_title == null)
+ user_title = _("Export Photos");
+
+ Gtk.FileChooserDialog chooser = new Gtk.FileChooserDialog(user_title,
+ AppWindow.get_instance(), Gtk.FileChooserAction.SELECT_FOLDER, Gtk.Stock.CANCEL,
+ Gtk.ResponseType.CANCEL, Gtk.Stock.OK, Gtk.ResponseType.ACCEPT, null);
+ chooser.set_current_folder(current_export_dir.get_path());
+ chooser.set_local_only(false);
+
+ File dir = null;
+ if (chooser.run() == Gtk.ResponseType.ACCEPT) {
+ dir = File.new_for_path(chooser.get_filename());
+ current_export_dir = dir;
+ }
+
+ chooser.destroy();
+
+ return dir;
+}
+}
+
+// Ticket #3023
+// Attempt to replace the system error with something friendlier
+// if we can't copy an image over for editing in an external tool.
+public void open_external_editor_error_dialog(Error err, Photo photo) {
+ // Did we fail because we can't write to this directory?
+ if (err is IOError.PERMISSION_DENIED || err is FileError.PERM) {
+ // Yes - display an alternate error message here.
+ AppWindow.error_message(
+ _("Shotwell couldn't create a file for editing this photo because you do not have permission to write to %s.").printf(photo.get_master_file().get_parent().get_path()));
+ } else {
+ // No - something else is wrong, display the error message
+ // the system gave us.
+ AppWindow.error_message(Resources.launch_editor_failed(err));
+ }
+}
+
+public Gtk.ResponseType export_error_dialog(File dest, bool photos_remaining) {
+ string message = _("Unable to export the following photo due to a file error.\n\n") +
+ dest.get_path();
+
+ Gtk.ResponseType response = Gtk.ResponseType.NONE;
+
+ if (photos_remaining) {
+ message += _("\n\nWould you like to continue exporting?");
+ response = AppWindow.affirm_cancel_question(message, _("Con_tinue"));
+ } else {
+ AppWindow.error_message(message);
+ }
+
+ return response;
+}
+
+
+public class ExportDialog : Gtk.Dialog {
+ public const int DEFAULT_SCALE = 1200;
+
+ // "Unmodified" and "Current," though they appear in the "Format:" popup menu, really
+ // aren't formats so much as they are operating modes that determine specific formats.
+ // Hereafter we'll refer to these as "special formats."
+ public const int NUM_SPECIAL_FORMATS = 2;
+ public const string UNMODIFIED_FORMAT_LABEL = _("Unmodified");
+ public const string CURRENT_FORMAT_LABEL = _("Current");
+
+ public const ScaleConstraint[] CONSTRAINT_ARRAY = { ScaleConstraint.ORIGINAL,
+ ScaleConstraint.DIMENSIONS, ScaleConstraint.WIDTH, ScaleConstraint.HEIGHT };
+
+ public const Jpeg.Quality[] QUALITY_ARRAY = { Jpeg.Quality.LOW, Jpeg.Quality.MEDIUM,
+ Jpeg.Quality.HIGH, Jpeg.Quality.MAXIMUM };
+
+ private static ScaleConstraint current_constraint = ScaleConstraint.ORIGINAL;
+ private static ExportFormatParameters current_parameters = ExportFormatParameters.current();
+ private static int current_scale = DEFAULT_SCALE;
+
+ private Gtk.Grid table = new Gtk.Grid();
+ private Gtk.ComboBoxText quality_combo;
+ private Gtk.ComboBoxText constraint_combo;
+ private Gtk.ComboBoxText format_combo;
+ private Gtk.CheckButton export_metadata;
+ private Gee.ArrayList<string> format_options = new Gee.ArrayList<string>();
+ private Gtk.Entry pixels_entry;
+ private Gtk.Widget ok_button;
+ private bool in_insert = false;
+
+ public ExportDialog(string title) {
+ this.title = title;
+ resizable = false;
+
+ quality_combo = new Gtk.ComboBoxText();
+ int ctr = 0;
+ foreach (Jpeg.Quality quality in QUALITY_ARRAY) {
+ quality_combo.append_text(quality.to_string());
+ if (quality == current_parameters.quality)
+ quality_combo.set_active(ctr);
+ ctr++;
+ }
+
+ constraint_combo = new Gtk.ComboBoxText();
+ ctr = 0;
+ foreach (ScaleConstraint constraint in CONSTRAINT_ARRAY) {
+ constraint_combo.append_text(constraint.to_string());
+ if (constraint == current_constraint)
+ constraint_combo.set_active(ctr);
+ ctr++;
+ }
+
+ format_combo = new Gtk.ComboBoxText();
+ format_add_option(UNMODIFIED_FORMAT_LABEL);
+ format_add_option(CURRENT_FORMAT_LABEL);
+ foreach (PhotoFileFormat format in PhotoFileFormat.get_writeable()) {
+ format_add_option(format.get_properties().get_user_visible_name());
+ }
+
+ pixels_entry = new Gtk.Entry();
+ pixels_entry.set_max_length(6);
+ pixels_entry.set_size_request(60, -1);
+ pixels_entry.set_text("%d".printf(current_scale));
+
+ // register after preparation to avoid signals during init
+ constraint_combo.changed.connect(on_constraint_changed);
+ format_combo.changed.connect(on_format_changed);
+ pixels_entry.changed.connect(on_pixels_changed);
+ pixels_entry.insert_text.connect(on_pixels_insert_text);
+ pixels_entry.activate.connect(on_activate);
+
+ // layout controls
+ add_label(_("_Format:"), 0, 0, format_combo);
+ add_control(format_combo, 1, 0);
+
+ add_label(_("_Quality:"), 0, 1, quality_combo);
+ add_control(quality_combo, 1, 1);
+
+ add_label(_("_Scaling constraint:"), 0, 2, constraint_combo);
+ add_control(constraint_combo, 1, 2);
+
+ Gtk.Label pixels_label = new Gtk.Label.with_mnemonic(_(" _pixels"));
+ pixels_label.set_mnemonic_widget(pixels_entry);
+
+ Gtk.Box pixels_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+ pixels_box.pack_start(pixels_entry, false, false, 0);
+ pixels_box.pack_end(pixels_label, false, false, 0);
+ add_control(pixels_box, 1, 3);
+
+ export_metadata = new Gtk.CheckButton.with_label(_("Export metadata"));
+ add_control(export_metadata, 1, 4);
+ export_metadata.active = true;
+
+ table.set_row_spacing(4);
+ table.set_column_spacing(4);
+ table.set_margin_top(4);
+ table.set_margin_bottom(4);
+ table.set_margin_left(4);
+ table.set_margin_right(4);
+
+ ((Gtk.Box) get_content_area()).add(table);
+
+ // add buttons to action area
+ add_button(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL);
+ ok_button = add_button(Gtk.Stock.OK, Gtk.ResponseType.OK);
+
+ ok_button.set_can_default(true);
+ ok_button.has_default = true;
+ set_default(ok_button);
+
+ if (current_constraint == ScaleConstraint.ORIGINAL) {
+ pixels_entry.sensitive = false;
+ quality_combo.sensitive = false;
+ }
+
+ ok_button.grab_focus();
+ }
+
+ private void format_add_option(string format_name) {
+ format_options.add(format_name);
+ format_combo.append_text(format_name);
+ }
+
+ private void format_set_active_text(string text) {
+ int selection_ticker = 0;
+
+ foreach (string current_text in format_options) {
+ if (current_text == text) {
+ format_combo.set_active(selection_ticker);
+ return;
+ }
+ selection_ticker++;
+ }
+
+ error("format_set_active_text: text '%s' isn't in combo box", text);
+ }
+
+ private PhotoFileFormat get_specified_format() {
+ int index = format_combo.get_active();
+ if (index < NUM_SPECIAL_FORMATS)
+ index = NUM_SPECIAL_FORMATS;
+
+ index -= NUM_SPECIAL_FORMATS;
+ PhotoFileFormat[] writeable_formats = PhotoFileFormat.get_writeable();
+ return writeable_formats[index];
+ }
+
+ private string get_label_for_parameters(ExportFormatParameters params) {
+ switch(params.mode) {
+ case ExportFormatMode.UNMODIFIED:
+ return UNMODIFIED_FORMAT_LABEL;
+
+ case ExportFormatMode.CURRENT:
+ return CURRENT_FORMAT_LABEL;
+
+ case ExportFormatMode.SPECIFIED:
+ return params.specified_format.get_properties().get_user_visible_name();
+
+ default:
+ error("get_label_for_parameters: unrecognized export format mode");
+ }
+ }
+
+ // unlike other parameters, which should be persisted across dialog executions, the
+ // format parameters must be set each time the dialog is executed -- this is why
+ // it's passed qualified as ref and not as out
+ public bool execute(out int scale, out ScaleConstraint constraint,
+ ref ExportFormatParameters parameters) {
+ show_all();
+
+ // if the export format mode isn't set to last (i.e., don't use the persisted settings),
+ // reset the scale constraint to original size
+ if (parameters.mode != ExportFormatMode.LAST) {
+ current_constraint = constraint = ScaleConstraint.ORIGINAL;
+ constraint_combo.set_active(0);
+ }
+
+ if (parameters.mode == ExportFormatMode.LAST)
+ parameters = current_parameters;
+ else if (parameters.mode == ExportFormatMode.SPECIFIED && !parameters.specified_format.can_write())
+ parameters.specified_format = PhotoFileFormat.get_system_default_format();
+
+ format_set_active_text(get_label_for_parameters(parameters));
+ on_format_changed();
+
+ bool ok = (run() == Gtk.ResponseType.OK);
+ if (ok) {
+ int index = constraint_combo.get_active();
+ assert(index >= 0);
+ constraint = CONSTRAINT_ARRAY[index];
+ current_constraint = constraint;
+
+ scale = int.parse(pixels_entry.get_text());
+ if (constraint != ScaleConstraint.ORIGINAL)
+ assert(scale > 0);
+ current_scale = scale;
+
+ parameters.export_metadata = export_metadata.sensitive ? export_metadata.active : false;
+
+ if (format_combo.get_active_text() == UNMODIFIED_FORMAT_LABEL) {
+ parameters.mode = current_parameters.mode = ExportFormatMode.UNMODIFIED;
+ } else if (format_combo.get_active_text() == CURRENT_FORMAT_LABEL) {
+ parameters.mode = current_parameters.mode = ExportFormatMode.CURRENT;
+ } else {
+ parameters.mode = current_parameters.mode = ExportFormatMode.SPECIFIED;
+ parameters.specified_format = current_parameters.specified_format = get_specified_format();
+ if (current_parameters.specified_format == PhotoFileFormat.JFIF)
+ parameters.quality = current_parameters.quality = QUALITY_ARRAY[quality_combo.get_active()];
+ }
+ } else {
+ scale = 0;
+ constraint = ScaleConstraint.ORIGINAL;
+ }
+
+ destroy();
+
+ return ok;
+ }
+
+ private void add_label(string text, int x, int y, Gtk.Widget? widget = null) {
+ Gtk.Alignment left_aligned = new Gtk.Alignment(0.0f, 0.5f, 0, 0);
+
+ Gtk.Label new_label = new Gtk.Label.with_mnemonic(text);
+ new_label.set_use_underline(true);
+
+ if (widget != null)
+ new_label.set_mnemonic_widget(widget);
+
+ left_aligned.add(new_label);
+
+ table.attach(left_aligned, x, y, 1, 1);
+ }
+
+ private void add_control(Gtk.Widget widget, int x, int y) {
+ Gtk.Alignment left_aligned = new Gtk.Alignment(0, 0.5f, 0, 0);
+ left_aligned.add(widget);
+
+ table.attach(left_aligned, x, y, 1, 1);
+ }
+
+ private void on_constraint_changed() {
+ bool original = CONSTRAINT_ARRAY[constraint_combo.get_active()] == ScaleConstraint.ORIGINAL;
+ bool jpeg = format_combo.get_active_text() ==
+ PhotoFileFormat.JFIF.get_properties().get_user_visible_name();
+ pixels_entry.sensitive = !original;
+ quality_combo.sensitive = !original && jpeg;
+ if (original)
+ ok_button.sensitive = true;
+ else
+ on_pixels_changed();
+ }
+
+ private void on_format_changed() {
+ bool original = CONSTRAINT_ARRAY[constraint_combo.get_active()] == ScaleConstraint.ORIGINAL;
+
+ if (format_combo.get_active_text() == UNMODIFIED_FORMAT_LABEL) {
+ // if the user wishes to export the media unmodified, then we just copy the original
+ // files, so parameterizing size, quality, etc. is impossible -- these are all
+ // just as they are in the original file. In this case, we set the scale constraint to
+ // original and lock out all the controls
+ constraint_combo.set_active(0); /* 0 == original size */
+ constraint_combo.set_sensitive(false);
+ quality_combo.set_sensitive(false);
+ pixels_entry.sensitive = false;
+ export_metadata.active = false;
+ export_metadata.sensitive = false;
+ } else if (format_combo.get_active_text() == CURRENT_FORMAT_LABEL) {
+ // if the user wishes to export the media in its current format, we allow sizing but
+ // not JPEG quality customization, because in a batch of many photos, it's not
+ // guaranteed that all of them will be JPEGs or RAWs that get converted to JPEGs. Some
+ // could be PNGs, and PNG has no notion of quality. So lock out the quality control.
+ // If the user wants to set JPEG quality, he or she can explicitly specify the JPEG
+ // format.
+ constraint_combo.set_sensitive(true);
+ quality_combo.set_sensitive(false);
+ pixels_entry.sensitive = !original;
+ export_metadata.sensitive = true;
+ } else {
+ // if the user has chosen a specific format, then allow JPEG quality customization if
+ // the format is JPEG and the user is re-sizing the image, otherwise, disallow JPEG
+ // quality customization; always allow scaling.
+ constraint_combo.set_sensitive(true);
+ bool jpeg = get_specified_format() == PhotoFileFormat.JFIF;
+ quality_combo.sensitive = !original && jpeg;
+ export_metadata.sensitive = true;
+ }
+ }
+
+ private void on_activate() {
+ response(Gtk.ResponseType.OK);
+ }
+
+ private void on_pixels_changed() {
+ ok_button.sensitive = (pixels_entry.get_text_length() > 0) && (int.parse(pixels_entry.get_text()) > 0);
+ }
+
+ private void on_pixels_insert_text(string text, int length, ref int position) {
+ // This is necessary because SignalHandler.block_by_func() is not properly bound
+ if (in_insert)
+ return;
+
+ in_insert = true;
+
+ if (length == -1)
+ length = (int) text.length;
+
+ // only permit numeric text
+ string new_text = "";
+ for (int ctr = 0; ctr < length; ctr++) {
+ if (text[ctr].isdigit()) {
+ new_text += ((char) text[ctr]).to_string();
+ }
+ }
+
+ if (new_text.length > 0)
+ pixels_entry.insert_text(new_text, (int) new_text.length, ref position);
+
+ Signal.stop_emission_by_name(pixels_entry, "insert-text");
+
+ in_insert = false;
+ }
+}
+
+namespace ImportUI {
+private const int REPORT_FAILURE_COUNT = 4;
+internal const string SAVE_RESULTS_BUTTON_NAME = _("Save Details...");
+internal const string SAVE_RESULTS_FILE_CHOOSER_TITLE = _("Save Details");
+internal const int SAVE_RESULTS_RESPONSE_ID = 1024;
+
+private string? generate_import_failure_list(Gee.List<BatchImportResult> failed, bool show_dest_id) {
+ if (failed.size == 0)
+ return null;
+
+ string list = "";
+ for (int ctr = 0; ctr < REPORT_FAILURE_COUNT && ctr < failed.size; ctr++) {
+ list += "%s\n".printf(show_dest_id ? failed.get(ctr).dest_identifier :
+ failed.get(ctr).src_identifier);
+ }
+
+ int remaining = failed.size - REPORT_FAILURE_COUNT;
+ if (remaining > 0)
+ list += _("(and %d more)\n").printf(remaining);
+
+ return list;
+}
+
+public class QuestionParams {
+ public string question;
+ public string yes_button;
+ public string no_button;
+
+ public QuestionParams(string question, string yes_button, string no_button) {
+ this.question = question;
+ this.yes_button = yes_button;
+ this.no_button = no_button;
+ }
+}
+
+public bool import_has_photos(Gee.Collection<BatchImportResult> import_collection) {
+ foreach (BatchImportResult current_result in import_collection) {
+ if (current_result.file != null
+ && PhotoFileFormat.get_by_file_extension(current_result.file) != PhotoFileFormat.UNKNOWN) {
+ return true;
+ }
+ }
+ return false;
+}
+
+public bool import_has_videos(Gee.Collection<BatchImportResult> import_collection) {
+ foreach (BatchImportResult current_result in import_collection) {
+ if (current_result.file != null && VideoReader.is_supported_video_file(current_result.file))
+ return true;
+ }
+ return false;
+}
+
+public string get_media_specific_string(Gee.Collection<BatchImportResult> import_collection,
+ string photos_msg, string videos_msg, string both_msg, string neither_msg) {
+ bool has_photos = import_has_photos(import_collection);
+ bool has_videos = import_has_videos(import_collection);
+
+ if (has_photos && has_videos)
+ return both_msg;
+ else if (has_photos)
+ return photos_msg;
+ else if (has_videos)
+ return videos_msg;
+ else
+ return neither_msg;
+}
+
+public string create_result_report_from_manifest(ImportManifest manifest) {
+ StringBuilder builder = new StringBuilder();
+
+ string header = _("Import Results Report") + " (Shotwell " + Resources.APP_VERSION + " @ " +
+ TimeVal().to_iso8601() + ")\n\n";
+ builder.append(header);
+
+ string subhead = (ngettext("Attempted to import %d file.", "Attempted to import %d files.",
+ manifest.all.size)).printf(manifest.all.size);
+ subhead += " ";
+ subhead += (ngettext("Of these, %d file was successfully imported.",
+ "Of these, %d files were successfully imported.", manifest.success.size)).printf(
+ manifest.success.size);
+ subhead += "\n\n";
+ builder.append(subhead);
+
+ string current_file_summary = "";
+
+ //
+ // Duplicates
+ //
+ if (manifest.already_imported.size > 0) {
+ builder.append(_("Duplicate Photos/Videos Not Imported:") + "\n\n");
+
+ foreach (BatchImportResult result in manifest.already_imported) {
+ current_file_summary = result.src_identifier + " " +
+ _("duplicates existing media item") + "\n\t" +
+ result.duplicate_of.get_file().get_path() + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Files Not Imported Due to Camera Errors
+ //
+ if (manifest.camera_failed.size > 0) {
+ builder.append(_("Photos/Videos Not Imported Due to Camera Errors:") + "\n\n");
+
+ foreach (BatchImportResult result in manifest.camera_failed) {
+ current_file_summary = result.src_identifier + "\n\t" + _("error message:") + " " +
+ result.errmsg + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Files Not Imported Because They Weren't Recognized as Photos or Videos
+ //
+ if (manifest.skipped_files.size > 0) {
+ builder.append(_("Files Not Imported Because They Weren't Recognized as Photos or Videos:")
+ + "\n\n");
+
+ foreach (BatchImportResult result in manifest.skipped_files) {
+ current_file_summary = result.src_identifier + "\n\t" + _("error message:") + " " +
+ result.errmsg + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands
+ //
+ if (manifest.skipped_photos.size > 0) {
+ builder.append(_("Photos/Videos Not Imported Because They Weren't in a Format Shotwell Understands:")
+ + "\n\n");
+
+ foreach (BatchImportResult result in manifest.skipped_photos) {
+ current_file_summary = result.src_identifier + "\n\t" + _("error message:") + " " +
+ result.errmsg + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library
+ //
+ if (manifest.write_failed.size > 0) {
+ builder.append(_("Photos/Videos Not Imported Because Shotwell Couldn't Copy Them into its Library:")
+ + "\n\n");
+
+ foreach (BatchImportResult result in manifest.write_failed) {
+ current_file_summary = (_("couldn't copy %s\n\tto %s")).printf(result.src_identifier,
+ result.dest_identifier) + "\n\t" + _("error message:") + " " +
+ result.errmsg + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Photos/Videos Not Imported Because GDK Pixbuf Library Identified them as Corrupt
+ //
+ if (manifest.corrupt_files.size > 0) {
+ builder.append(_("Photos/Videos Not Imported Because Files Are Corrupt:")
+ + "\n\n");
+
+ foreach (BatchImportResult result in manifest.corrupt_files) {
+ current_file_summary = result.src_identifier + "\n\t" + _("error message:") + " |" +
+ result.errmsg + "|\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ //
+ // Photos/Videos Not Imported for Other Reasons
+ //
+ if (manifest.failed.size > 0) {
+ builder.append(_("Photos/Videos Not Imported for Other Reasons:") + "\n\n");
+
+ foreach (BatchImportResult result in manifest.failed) {
+ current_file_summary = result.src_identifier + "\n\t" + _("error message:") + " " +
+ result.errmsg + "\n\n";
+
+ builder.append(current_file_summary);
+ }
+ }
+
+ return builder.str;
+}
+
+// Summarizes the contents of an import manifest in an on-screen message window. Returns
+// true if the user selected the yes action, false otherwise.
+public bool report_manifest(ImportManifest manifest, bool show_dest_id,
+ QuestionParams? question = null) {
+ string message = "";
+
+ if (manifest.already_imported.size > 0) {
+ string photos_message = (ngettext("1 duplicate photo was not imported:\n",
+ "%d duplicate photos were not imported:\n",
+ manifest.already_imported.size)).printf(manifest.already_imported.size);
+ string videos_message = (ngettext("1 duplicate video was not imported:\n",
+ "%d duplicate videos were not imported:\n",
+ manifest.already_imported.size)).printf(manifest.already_imported.size);
+ string both_message = (ngettext("1 duplicate photo/video was not imported:\n",
+ "%d duplicate photos/videos were not imported:\n",
+ manifest.already_imported.size)).printf(manifest.already_imported.size);
+
+ message += get_media_specific_string(manifest.already_imported, photos_message,
+ videos_message, both_message, both_message);
+
+ message += generate_import_failure_list(manifest.already_imported, show_dest_id);
+ }
+
+ if (manifest.failed.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo failed to import due to a file or hardware error:\n",
+ "%d photos failed to import due to a file or hardware error:\n",
+ manifest.failed.size)).printf(manifest.failed.size);
+ string videos_message = (ngettext("1 video failed to import due to a file or hardware error:\n",
+ "%d videos failed to import due to a file or hardware error:\n",
+ manifest.failed.size)).printf(manifest.failed.size);
+ string both_message = (ngettext("1 photo/video failed to import due to a file or hardware error:\n",
+ "%d photos/videos failed to import due to a file or hardware error:\n",
+ manifest.failed.size)).printf(manifest.failed.size);
+ string neither_message = (ngettext("1 file failed to import due to a file or hardware error:\n",
+ "%d files failed to import due to a file or hardware error:\n",
+ manifest.failed.size)).printf(manifest.failed.size);
+
+ message += get_media_specific_string(manifest.failed, photos_message, videos_message,
+ both_message, neither_message);
+
+ message += generate_import_failure_list(manifest.failed, show_dest_id);
+ }
+
+ if (manifest.write_failed.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo failed to import because the photo library folder was not writable:\n",
+ "%d photos failed to import because the photo library folder was not writable:\n",
+ manifest.write_failed.size)).printf(manifest.write_failed.size);
+ string videos_message = (ngettext("1 video failed to import because the photo library folder was not writable:\n",
+ "%d videos failed to import because the photo library folder was not writable:\n",
+ manifest.write_failed.size)).printf(manifest.write_failed.size);
+ string both_message = (ngettext("1 photo/video failed to import because the photo library folder was not writable:\n",
+ "%d photos/videos failed to import because the photo library folder was not writable:\n",
+ manifest.write_failed.size)).printf(manifest.write_failed.size);
+ string neither_message = (ngettext("1 file failed to import because the photo library folder was not writable:\n",
+ "%d files failed to import because the photo library folder was not writable:\n",
+ manifest.write_failed.size)).printf(manifest.write_failed.size);
+
+ message += get_media_specific_string(manifest.write_failed, photos_message, videos_message,
+ both_message, neither_message);
+
+ message += generate_import_failure_list(manifest.write_failed, show_dest_id);
+ }
+
+ if (manifest.camera_failed.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo failed to import due to a camera error:\n",
+ "%d photos failed to import due to a camera error:\n",
+ manifest.camera_failed.size)).printf(manifest.camera_failed.size);
+ string videos_message = (ngettext("1 video failed to import due to a camera error:\n",
+ "%d videos failed to import due to a camera error:\n",
+ manifest.camera_failed.size)).printf(manifest.camera_failed.size);
+ string both_message = (ngettext("1 photo/video failed to import due to a camera error:\n",
+ "%d photos/videos failed to import due to a camera error:\n",
+ manifest.camera_failed.size)).printf(manifest.camera_failed.size);
+ string neither_message = (ngettext("1 file failed to import due to a camera error:\n",
+ "%d files failed to import due to a camera error:\n",
+ manifest.camera_failed.size)).printf(manifest.camera_failed.size);
+
+ message += get_media_specific_string(manifest.camera_failed, photos_message, videos_message,
+ both_message, neither_message);
+
+ message += generate_import_failure_list(manifest.camera_failed, show_dest_id);
+ }
+
+ if (manifest.corrupt_files.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo failed to import because it was corrupt:\n",
+ "%d photos failed to import because they were corrupt:\n",
+ manifest.corrupt_files.size)).printf(manifest.corrupt_files.size);
+ string videos_message = (ngettext("1 video failed to import because it was corrupt:\n",
+ "%d videos failed to import because they were corrupt:\n",
+ manifest.corrupt_files.size)).printf(manifest.corrupt_files.size);
+ string both_message = (ngettext("1 photo/video failed to import because it was corrupt:\n",
+ "%d photos/videos failed to import because they were corrupt:\n",
+ manifest.corrupt_files.size)).printf(manifest.corrupt_files.size);
+ string neither_message = (ngettext("1 file failed to import because it was corrupt:\n",
+ "%d files failed to import because it was corrupt:\n",
+ manifest.corrupt_files.size)).printf(manifest.corrupt_files.size);
+
+ message += get_media_specific_string(manifest.corrupt_files, photos_message, videos_message,
+ both_message, neither_message);
+
+ message += generate_import_failure_list(manifest.corrupt_files, show_dest_id);
+ }
+
+ if (manifest.skipped_photos.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+ // we have no notion of "unsupported" video files right now in Shotwell (all
+ // standard container formats are supported, it's just that the streams in them
+ // might or might not be interpretable), so this message does not need to be
+ // media specific
+ string skipped_photos_message = (ngettext("1 unsupported photo skipped:\n",
+ "%d unsupported photos skipped:\n", manifest.skipped_photos.size)).printf(
+ manifest.skipped_photos.size);
+
+ message += skipped_photos_message;
+
+ message += generate_import_failure_list(manifest.skipped_photos, show_dest_id);
+ }
+
+ if (manifest.skipped_files.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ // we have no notion of "non-video" video files right now in Shotwell, so this
+ // message doesn't need to be media specific
+ string skipped_files_message = (ngettext("1 non-image file skipped.\n",
+ "%d non-image files skipped.\n", manifest.skipped_files.size)).printf(
+ manifest.skipped_files.size);
+
+ message += skipped_files_message;
+ }
+
+ if (manifest.aborted.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo skipped due to user cancel:\n",
+ "%d photos skipped due to user cancel:\n",
+ manifest.aborted.size)).printf(manifest.aborted.size);
+ string videos_message = (ngettext("1 video skipped due to user cancel:\n",
+ "%d videos skipped due to user cancel:\n",
+ manifest.aborted.size)).printf(manifest.aborted.size);
+ string both_message = (ngettext("1 photo/video skipped due to user cancel:\n",
+ "%d photos/videos skipped due to user cancel:\n",
+ manifest.aborted.size)).printf(manifest.aborted.size);
+ string neither_message = (ngettext("1 file skipped due to user cancel:\n",
+ "%d file skipped due to user cancel:\n",
+ manifest.aborted.size)).printf(manifest.aborted.size);
+
+ message += get_media_specific_string(manifest.aborted, photos_message, videos_message,
+ both_message, neither_message);
+
+ message += generate_import_failure_list(manifest.aborted, show_dest_id);
+ }
+
+ if (manifest.success.size > 0) {
+ if (message.length > 0)
+ message += "\n";
+
+ string photos_message = (ngettext("1 photo successfully imported.\n",
+ "%d photos successfully imported.\n",
+ manifest.success.size)).printf(manifest.success.size);
+ string videos_message = (ngettext("1 video successfully imported.\n",
+ "%d videos successfully imported.\n",
+ manifest.success.size)).printf(manifest.success.size);
+ string both_message = (ngettext("1 photo/video successfully imported.\n",
+ "%d photos/videos successfully imported.\n",
+ manifest.success.size)).printf(manifest.success.size);
+
+ message += get_media_specific_string(manifest.success, photos_message, videos_message,
+ both_message, "");
+ }
+
+ int total = manifest.success.size + manifest.failed.size + manifest.camera_failed.size
+ + manifest.skipped_photos.size + manifest.skipped_files.size + manifest.corrupt_files.size
+ + manifest.already_imported.size + manifest.aborted.size + manifest.write_failed.size;
+ assert(total == manifest.all.size);
+
+ // if no media items were imported at all (i.e. an empty directory attempted), need to at least
+ // report that nothing was imported
+ if (total == 0)
+ message += _("No photos or videos imported.\n");
+
+ Gtk.MessageDialog dialog = null;
+ int dialog_response = Gtk.ResponseType.NONE;
+ if (question == null) {
+ dialog = new Gtk.MessageDialog(AppWindow.get_instance(), Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, "%s", message);
+ dialog.title = _("Import Complete");
+ Gtk.Widget save_results_button = dialog.add_button(ImportUI.SAVE_RESULTS_BUTTON_NAME,
+ ImportUI.SAVE_RESULTS_RESPONSE_ID);
+ save_results_button.set_visible(manifest.success.size < manifest.all.size);
+ Gtk.Widget ok_button = dialog.add_button(Gtk.Stock.OK, Gtk.ResponseType.OK);
+ dialog.set_default(ok_button);
+
+ Gtk.Window dialog_parent = (Gtk.Window) dialog.get_parent();
+ dialog_response = dialog.run();
+ dialog.destroy();
+
+ if (dialog_response == ImportUI.SAVE_RESULTS_RESPONSE_ID)
+ save_import_results(dialog_parent, create_result_report_from_manifest(manifest));
+
+ } else {
+ message += ("\n" + question.question);
+
+ dialog = new Gtk.MessageDialog(AppWindow.get_instance(), Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", message);
+ dialog.title = _("Import Complete");
+ Gtk.Widget save_results_button = dialog.add_button(ImportUI.SAVE_RESULTS_BUTTON_NAME,
+ ImportUI.SAVE_RESULTS_RESPONSE_ID);
+ save_results_button.set_visible(manifest.success.size < manifest.all.size);
+ Gtk.Widget no_button = dialog.add_button(question.no_button, Gtk.ResponseType.NO);
+ dialog.add_button(question.yes_button, Gtk.ResponseType.YES);
+ dialog.set_default(no_button);
+
+ dialog_response = dialog.run();
+ while (dialog_response == ImportUI.SAVE_RESULTS_RESPONSE_ID) {
+ save_import_results(dialog, create_result_report_from_manifest(manifest));
+ dialog_response = dialog.run();
+ }
+
+ dialog.hide();
+ dialog.destroy();
+ }
+
+ return (dialog_response == Gtk.ResponseType.YES);
+}
+
+internal void save_import_results(Gtk.Window? chooser_dialog_parent, string results_log) {
+ Gtk.FileChooserDialog chooser_dialog = new Gtk.FileChooserDialog(
+ ImportUI.SAVE_RESULTS_FILE_CHOOSER_TITLE, chooser_dialog_parent, Gtk.FileChooserAction.SAVE,
+ Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, Gtk.Stock.SAVE, Gtk.ResponseType.ACCEPT, null);
+ chooser_dialog.set_do_overwrite_confirmation(true);
+ chooser_dialog.set_current_folder(Environment.get_home_dir());
+ chooser_dialog.set_current_name("Shotwell Import Log.txt");
+ chooser_dialog.set_local_only(false);
+
+ int dialog_result = chooser_dialog.run();
+ File? chosen_file = chooser_dialog.get_file();
+ chooser_dialog.hide();
+ chooser_dialog.destroy();
+
+ if (dialog_result == Gtk.ResponseType.ACCEPT && chosen_file != null) {
+ try {
+ FileOutputStream outstream = chosen_file.replace(null, false, FileCreateFlags.NONE);
+ outstream.write(results_log.data);
+ outstream.close();
+ } catch (Error err) {
+ critical("couldn't save import results to log file %s: %s", chosen_file.get_path(),
+ err.message);
+ }
+ }
+}
+
+}
+
+public abstract class TextEntryDialogMediator {
+ private TextEntryDialog dialog;
+
+ public TextEntryDialogMediator(string title, string label, string? initial_text = null,
+ Gee.Collection<string>? completion_list = null, string? completion_delimiter = null) {
+ Gtk.Builder builder = AppWindow.create_builder();
+ dialog = new TextEntryDialog();
+ dialog.get_content_area().add((Gtk.Box) builder.get_object("dialog-vbox2"));
+ dialog.set_builder(builder);
+ dialog.setup(on_modify_validate, title, label, initial_text, completion_list, completion_delimiter);
+ }
+
+ protected virtual bool on_modify_validate(string text) {
+ return true;
+ }
+
+ protected string? _execute() {
+ return dialog.execute();
+ }
+}
+
+public abstract class MultiTextEntryDialogMediator {
+ private MultiTextEntryDialog dialog;
+
+ public MultiTextEntryDialogMediator(string title, string label, string? initial_text = null) {
+ Gtk.Builder builder = AppWindow.create_builder();
+ dialog = new MultiTextEntryDialog();
+ dialog.get_content_area().add((Gtk.Box) builder.get_object("dialog-vbox4"));
+ dialog.set_builder(builder);
+ dialog.setup(on_modify_validate, title, label, initial_text);
+ }
+
+ protected virtual bool on_modify_validate(string text) {
+ return true;
+ }
+
+ protected string? _execute() {
+ return dialog.execute();
+ }
+}
+
+
+// This method takes primary and secondary texts and returns ready-to-use pango markup
+// for a HIG-compliant alert dialog. Please see
+// http://library.gnome.org/devel/hig-book/2.32/windows-alert.html.en for details.
+public string build_alert_body_text(string? primary_text, string? secondary_text, bool should_escape = true) {
+ if (should_escape) {
+ return "<span weight=\"Bold\" size=\"larger\">%s</span>\n%s".printf(
+ guarded_markup_escape_text(primary_text), guarded_markup_escape_text(secondary_text));
+ }
+
+ return "<span weight=\"Bold\" size=\"larger\">%s</span>\n%s".printf(
+ guarded_markup_escape_text(primary_text), secondary_text);
+}
+
+// Entry completion for values separated by separators (e.g. comma in the case of tags)
+// Partly inspired by the class of the same name in gtkmm-utils by Marko Anastasov
+public class EntryMultiCompletion : Gtk.EntryCompletion {
+ private string delimiter;
+
+ public EntryMultiCompletion(Gee.Collection<string> completion_list, string? delimiter) {
+ assert(delimiter == null || delimiter.length == 1);
+ this.delimiter = delimiter;
+
+ set_model(create_completion_store(completion_list));
+ set_text_column(0);
+ set_match_func(match_func);
+ }
+
+ private static Gtk.ListStore create_completion_store(Gee.Collection<string> completion_list) {
+ Gtk.ListStore completion_store = new Gtk.ListStore(1, typeof(string));
+ Gtk.TreeIter store_iter;
+ Gee.Iterator<string> completion_iter = completion_list.iterator();
+ while (completion_iter.next()) {
+ completion_store.append(out store_iter);
+ completion_store.set(store_iter, 0, completion_iter.get(), -1);
+ }
+
+ return completion_store;
+ }
+
+ private bool match_func(Gtk.EntryCompletion completion, string key, Gtk.TreeIter iter) {
+ Gtk.TreeModel model = completion.get_model();
+ string possible_match;
+ model.get(iter, 0, out possible_match);
+
+ // Normalize key and possible matches to allow comparison of non-ASCII characters.
+ // Use a "COMPOSE" normalization to allow comparison to the position value returned by
+ // Gtk.Entry, i.e. one character=one position. Using the default normalization a character
+ // like "é" or "ö" would have a length of two.
+ possible_match = possible_match.casefold().normalize(-1, NormalizeMode.ALL_COMPOSE);
+ string normed_key = key.normalize(-1, NormalizeMode.ALL_COMPOSE);
+
+ if (delimiter == null) {
+ return possible_match.has_prefix(normed_key.strip());
+ } else {
+ if (normed_key.contains(delimiter)) {
+ // check whether cursor is before last delimiter
+ int offset = normed_key.char_count(normed_key.last_index_of_char(delimiter[0]));
+ int position = ((Gtk.Entry) get_entry()).get_position();
+ if (position <= offset)
+ return false; // TODO: Autocompletion for tags not last in list
+ }
+
+ string last_part = get_last_part(normed_key.strip(), delimiter);
+
+ if (last_part.length == 0)
+ return false; // need at least one character to show matches
+
+ return possible_match.has_prefix(last_part.strip());
+ }
+ }
+
+ public override bool match_selected(Gtk.TreeModel model, Gtk.TreeIter iter) {
+ string match;
+ model.get(iter, 0, out match);
+
+ Gtk.Entry entry = (Gtk.Entry)get_entry();
+
+ string old_text = entry.get_text().normalize(-1, NormalizeMode.ALL_COMPOSE);
+ if (old_text.length > 0) {
+ if (old_text.contains(delimiter)) {
+ old_text = old_text.substring(0, old_text.last_index_of_char(delimiter[0]) + 1) + (delimiter != " " ? " " : "");
+ } else
+ old_text = "";
+ }
+
+ string new_text = old_text + match + delimiter + (delimiter != " " ? " " : "");
+ entry.set_text(new_text);
+ entry.set_position((int) new_text.length);
+
+ return true;
+ }
+
+ // Find last string after any delimiter
+ private static string get_last_part(string s, string delimiter) {
+ string[] split = s.split(delimiter);
+
+ if((split != null) && (split[0] != null)) {
+ return split[split.length - 1];
+ } else {
+ return "";
+ }
+ }
+}
+
+public class SetBackgroundSlideshowDialog {
+ private Gtk.Dialog dialog;
+ private Gtk.Label delay_value_label;
+ private Gtk.Scale delay_scale;
+ private int delay_value = 0;
+
+ public SetBackgroundSlideshowDialog() {
+ Gtk.Builder builder = AppWindow.create_builder("set_background_dialog.glade", this);
+
+ dialog = builder.get_object("dialog1") as Gtk.Dialog;
+ dialog.set_type_hint(Gdk.WindowTypeHint.DIALOG);
+ dialog.set_parent_window(AppWindow.get_instance().get_parent_window());
+ dialog.set_transient_for(AppWindow.get_instance());
+ dialog.set_default_response(Gtk.ResponseType.OK);
+
+ delay_value_label = builder.get_object("delay_value_label") as Gtk.Label;
+
+ delay_scale = builder.get_object("delay_scale") as Gtk.Scale;
+ delay_scale.value_changed.connect(on_delay_scale_value_changed);
+ delay_scale.adjustment.value = 50;
+ }
+
+ private void on_delay_scale_value_changed() {
+ double value = delay_scale.adjustment.value;
+
+ // f(x)=x^5 allows to have fine-grained values (seconds) to the left
+ // and very coarse-grained values (hours) to the right of the slider.
+ // We limit maximum value to 1 day and minimum to 5 seconds.
+ delay_value = (int) (Math.pow(value, 5) / Math.pow(90, 5) * 60 * 60 * 24 + 5);
+
+ // convert to text and remove fractions from values > 1 minute
+ string text;
+ if (delay_value < 60) {
+ text = ngettext("%d second", "%d seconds", delay_value).printf(delay_value);
+ } else if (delay_value < 60 * 60) {
+ int minutes = delay_value / 60;
+ text = ngettext("%d minute", "%d minutes", minutes).printf(minutes);
+ delay_value = minutes * 60;
+ } else if (delay_value < 60 * 60 * 24) {
+ int hours = delay_value / (60 * 60);
+ text = ngettext("%d hour", "%d hours", hours).printf(hours);
+ delay_value = hours * (60 * 60);
+ } else {
+ text = _("1 day");
+ delay_value = 60 * 60 * 24;
+ }
+
+ delay_value_label.label = text;
+ }
+
+ public bool execute(out int delay_value) {
+ dialog.show_all();
+
+ bool result = dialog.run() == Gtk.ResponseType.OK;
+
+ dialog.destroy();
+
+ delay_value = this.delay_value;
+
+ return result;
+ }
+}
+
+public class TextEntryDialog : Gtk.Dialog {
+ public delegate bool OnModifyValidateType(string text);
+
+ private unowned OnModifyValidateType on_modify_validate;
+ private Gtk.Entry entry;
+ private Gtk.Builder builder;
+ private Gtk.Button button1;
+ private Gtk.Button button2;
+ private Gtk.ButtonBox action_area_box;
+
+ public void set_builder(Gtk.Builder builder) {
+ this.builder = builder;
+ }
+
+ public void setup(OnModifyValidateType? modify_validate, string title, string label,
+ string? initial_text, Gee.Collection<string>? completion_list, string? completion_delimiter) {
+ set_title(title);
+ set_resizable(true);
+ set_default_size (350, 104);
+ set_parent_window(AppWindow.get_instance().get_parent_window());
+ set_transient_for(AppWindow.get_instance());
+ on_modify_validate = modify_validate;
+
+ Gtk.Label name_label = builder.get_object("label") as Gtk.Label;
+ name_label.set_text(label);
+
+ entry = builder.get_object("entry") as Gtk.Entry;
+ entry.set_text(initial_text != null ? initial_text : "");
+ entry.grab_focus();
+ entry.changed.connect(on_entry_changed);
+
+ action_area_box = (Gtk.ButtonBox) get_action_area();
+ action_area_box.set_layout(Gtk.ButtonBoxStyle.END);
+
+ button1 = (Gtk.Button) add_button(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL);
+ button2 = (Gtk.Button) add_button(Gtk.Stock.SAVE, Gtk.ResponseType.OK);
+ set_default_response(Gtk.ResponseType.OK);
+
+ if (completion_list != null) { // Textfield with autocompletion
+ EntryMultiCompletion completion = new EntryMultiCompletion(completion_list,
+ completion_delimiter);
+ entry.set_completion(completion);
+ }
+
+ set_default_response(Gtk.ResponseType.OK);
+ set_has_resize_grip(false);
+ }
+
+ public string? execute() {
+ string? text = null;
+
+ // validate entry to start with
+ set_response_sensitive(Gtk.ResponseType.OK, on_modify_validate(entry.get_text()));
+
+ show_all();
+
+ if (run() == Gtk.ResponseType.OK)
+ text = entry.get_text();
+
+ entry.changed.disconnect(on_entry_changed);
+ destroy();
+
+ return text;
+ }
+
+ public void on_entry_changed() {
+ set_response_sensitive(Gtk.ResponseType.OK, on_modify_validate(entry.get_text()));
+ }
+}
+
+public class MultiTextEntryDialog : Gtk.Dialog {
+ public delegate bool OnModifyValidateType(string text);
+
+ private unowned OnModifyValidateType on_modify_validate;
+ private Gtk.TextView entry;
+ private Gtk.Builder builder;
+ private Gtk.Button button1;
+ private Gtk.Button button2;
+ private Gtk.ButtonBox action_area_box;
+
+ public void set_builder(Gtk.Builder builder) {
+ this.builder = builder;
+ }
+
+ public void setup(OnModifyValidateType? modify_validate, string title, string label, string? initial_text) {
+ set_title(title);
+ set_resizable(true);
+ set_default_size(500,300);
+ set_parent_window(AppWindow.get_instance().get_parent_window());
+ set_transient_for(AppWindow.get_instance());
+ on_modify_validate = modify_validate;
+
+ Gtk.Label name_label = builder.get_object("label9") as Gtk.Label;
+ name_label.set_text(label);
+
+ Gtk.ScrolledWindow scrolled = builder.get_object("scrolledwindow1") as Gtk.ScrolledWindow;
+ scrolled.set_shadow_type (Gtk.ShadowType.ETCHED_IN);
+
+ entry = builder.get_object("textview1") as Gtk.TextView;
+ entry.set_wrap_mode (Gtk.WrapMode.WORD);
+ entry.buffer = new Gtk.TextBuffer(null);
+ entry.buffer.text = (initial_text != null ? initial_text : "");
+
+ entry.grab_focus();
+
+ action_area_box = (Gtk.ButtonBox) get_action_area();
+ action_area_box.set_layout(Gtk.ButtonBoxStyle.END);
+
+ button1 = (Gtk.Button) add_button(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL);
+ button2 = (Gtk.Button) add_button(Gtk.Stock.SAVE, Gtk.ResponseType.OK);
+
+ set_has_resize_grip(true);
+ }
+
+ public string? execute() {
+ string? text = null;
+
+ show_all();
+
+ if (run() == Gtk.ResponseType.OK)
+ text = entry.buffer.text;
+
+ destroy();
+
+ return text;
+ }
+}
+
+public class EventRenameDialog : TextEntryDialogMediator {
+ public EventRenameDialog(string? event_name) {
+ base (_("Rename Event"), _("Name:"), event_name);
+ }
+
+ public virtual string? execute() {
+ return Event.prep_event_name(_execute());
+ }
+}
+
+public class EditTitleDialog : TextEntryDialogMediator {
+ public EditTitleDialog(string? photo_title) {
+ base (_("Edit Title"), _("Title:"), photo_title);
+ }
+
+ public virtual string? execute() {
+ return MediaSource.prep_title(_execute());
+ }
+
+ protected override bool on_modify_validate(string text) {
+ return true;
+ }
+}
+
+public class EditCommentDialog : MultiTextEntryDialogMediator {
+ public EditCommentDialog(string? comment, bool is_event = false) {
+ string title_tmp = (is_event) ? _("Edit Event Comment") : _("Edit Photo/Video Comment");
+ base(title_tmp, _("Comment:"), comment);
+ }
+
+ public virtual string? execute() {
+ return MediaSource.prep_comment(_execute());
+ }
+
+ protected override bool on_modify_validate(string text) {
+ return true;
+ }
+}
+
+// Returns: Gtk.ResponseType.YES (trash photos), Gtk.ResponseType.NO (only remove photos) and
+// Gtk.ResponseType.CANCEL.
+public Gtk.ResponseType remove_from_library_dialog(Gtk.Window owner, string title,
+ string user_message, int count) {
+ string trash_action = ngettext("_Trash File", "_Trash Files", count);
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(owner, Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.WARNING, Gtk.ButtonsType.CANCEL, "%s", user_message);
+ dialog.add_button(_("Only _Remove"), Gtk.ResponseType.NO);
+ dialog.add_button(trash_action, Gtk.ResponseType.YES);
+
+ // This dialog was previously created outright; we now 'hijack'
+ // dialog's old title and use it as the primary text, along with
+ // using the message as the secondary text.
+ dialog.set_markup(build_alert_body_text(title, user_message));
+
+ Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+
+ dialog.destroy();
+
+ return result;
+}
+
+// Returns: Gtk.ResponseType.YES (delete photos), Gtk.ResponseType.NO (keep photos)
+public Gtk.ResponseType remove_from_filesystem_dialog(Gtk.Window owner, string title,
+ string user_message) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(owner, Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION, Gtk.ButtonsType.NONE, "%s", user_message);
+ dialog.add_button(_("_Keep"), Gtk.ResponseType.NO);
+ dialog.add_button(_("_Delete"), Gtk.ResponseType.YES);
+ dialog.set_default_response( Gtk.ResponseType.NO);
+
+ dialog.set_markup(build_alert_body_text(title, user_message));
+
+ Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+
+ dialog.destroy();
+
+ return result;
+}
+
+public bool revert_editable_dialog(Gtk.Window owner, Gee.Collection<Photo> photos) {
+ int count = 0;
+ foreach (Photo photo in photos) {
+ if (photo.has_editable())
+ count++;
+ }
+
+ if (count == 0)
+ return false;
+
+ string headline = (count == 1) ? _("Revert External Edit?") : _("Revert External Edits?");
+ string msg = ngettext(
+ "This will destroy all changes made to the external file. Continue?",
+ "This will destroy all changes made to %d external files. Continue?",
+ count).printf(count);
+
+ string action = (count == 1) ? _("Re_vert External Edit") : _("Re_vert External Edits");
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(owner, Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, "%s", msg);
+ dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL);
+ dialog.add_button(action, Gtk.ResponseType.YES);
+
+ dialog.set_markup(build_alert_body_text(headline, msg));
+
+ Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+
+ dialog.destroy();
+
+ return result == Gtk.ResponseType.YES;
+}
+
+public bool remove_offline_dialog(Gtk.Window owner, int count) {
+ if (count == 0)
+ return false;
+
+ string msg = ngettext(
+ "This will remove the photo from the library. Continue?",
+ "This will remove %d photos from the library. Continue?",
+ count).printf(count);
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(owner, Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, "%s", msg);
+ dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL);
+ dialog.add_button(_("_Remove"), Gtk.ResponseType.OK);
+ dialog.title = (count == 1) ? _("Remove Photo From Library") : _("Remove Photos From Library");
+
+ Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+
+ dialog.destroy();
+
+ return result == Gtk.ResponseType.OK;
+}
+
+public class ProgressDialog : Gtk.Window {
+ private Gtk.ProgressBar progress_bar = new Gtk.ProgressBar();
+ private Gtk.Button cancel_button = null;
+ private Cancellable cancellable;
+ private uint64 last_count = uint64.MAX;
+ private int update_every = 1;
+ private int minimum_on_screen_time_msec = 500;
+ private ulong time_started;
+#if UNITY_SUPPORT
+ UnityProgressBar uniprobar = UnityProgressBar.get_instance();
+#endif
+
+ public ProgressDialog(Gtk.Window? owner, string text, Cancellable? cancellable = null) {
+ this.cancellable = cancellable;
+
+ set_title(text);
+ set_resizable(false);
+ if (owner != null)
+ set_transient_for(owner);
+ set_modal(true);
+ set_type_hint(Gdk.WindowTypeHint.DIALOG);
+
+ progress_bar.set_size_request(300, -1);
+ progress_bar.set_show_text(true);
+
+ Gtk.Box vbox_bar = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ vbox_bar.pack_start(progress_bar, true, false, 0);
+
+ if (cancellable != null) {
+ cancel_button = new Gtk.Button.from_stock(Gtk.Stock.CANCEL);
+ cancel_button.clicked.connect(on_cancel);
+ delete_event.connect(on_window_closed);
+ }
+
+ Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ hbox.pack_start(vbox_bar, true, false, 0);
+ if (cancel_button != null)
+ hbox.pack_end(cancel_button, false, false, 0);
+
+ Gtk.Label primary_text_label = new Gtk.Label("");
+ primary_text_label.set_markup("<span weight=\"bold\">%s</span>".printf(text));
+ primary_text_label.set_alignment(0, 0.5f);
+
+ Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 12);
+ vbox.pack_start(primary_text_label, false, false, 0);
+ vbox.pack_start(hbox, true, false, 0);
+
+ Gtk.Alignment alignment = new Gtk.Alignment(0.5f, 0.5f, 1.0f, 1.0f);
+ alignment.set_padding(12, 12, 12, 12);
+ alignment.add(vbox);
+
+ add(alignment);
+
+ time_started = now_ms();
+ }
+
+ public override void realize() {
+ base.realize();
+
+ // if unable to cancel the progress bar, remove the close button
+ if (cancellable == null)
+ get_window().set_functions(Gdk.WMFunction.MOVE);
+ }
+
+ public void update_display_every(int update_every) {
+ assert(update_every >= 1);
+
+ this.update_every = update_every;
+ }
+
+ public void set_minimum_on_screen_time_msec(int minimum_on_screen_time_msec) {
+ this.minimum_on_screen_time_msec = minimum_on_screen_time_msec;
+ }
+
+ public void set_fraction(int current, int total) {
+ set_percentage((double) current / (double) total);
+ }
+
+ public void set_percentage(double pct) {
+ pct = pct.clamp(0.0, 1.0);
+
+ maybe_show_all(pct);
+
+ progress_bar.set_fraction(pct);
+ progress_bar.set_text(_("%d%%").printf((int) (pct * 100.0)));
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: set progress
+ uniprobar.set_progress(pct);
+#endif
+ }
+
+ public void set_status(string text) {
+ progress_bar.set_text(text);
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+ show_all();
+ }
+
+ // This can be used as a ProgressMonitor delegate.
+ public bool monitor(uint64 count, uint64 total, bool do_event_loop = true) {
+ if ((last_count == uint64.MAX) || (count - last_count) >= update_every) {
+ set_percentage((double) count / (double) total);
+ last_count = count;
+ }
+
+ bool keep_going = (cancellable != null) ? !cancellable.is_cancelled() : true;
+
+ // TODO: get rid of this. non-trivial, as some progress-monitor operations are blocking
+ // and need to allow the event loop to spin
+ //
+ // Important: Since it's possible the progress dialog might be destroyed inside this call,
+ // avoid referring to "this" afterwards at all costs (in case all refs have been dropped)
+
+ if (do_event_loop)
+ spin_event_loop();
+
+ return keep_going;
+ }
+
+ public new void close() {
+#if UNITY_SUPPORT
+ //UnityProgressBar: reset
+ uniprobar.reset();
+#endif
+ hide();
+ destroy();
+ }
+
+ private bool on_window_closed() {
+ on_cancel();
+ return false; // return false so that the system handler will remove the window from
+ // the screen
+ }
+
+ private void on_cancel() {
+ if (cancellable != null)
+ cancellable.cancel();
+
+ cancel_button.sensitive = false;
+ }
+
+ private void maybe_show_all(double pct) {
+ // Appear only after a while because some jobs may take only a
+ // fraction of second to complete so there's no point in showing progress.
+ if (!this.visible && now_ms() - time_started > minimum_on_screen_time_msec) {
+ // calculate percents completed in one ms
+ double pps = pct * 100.0 / minimum_on_screen_time_msec;
+ // calculate [very rough] estimate of time to complete in ms
+ double ttc = 100.0 / pps;
+ // If there is still more work to do for at least MINIMUM_ON_SCREEN_TIME_MSEC,
+ // finally display the dialog.
+ if (ttc > minimum_on_screen_time_msec) {
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+ show_all();
+ spin_event_loop();
+ }
+ }
+ }
+}
+
+public class AdjustDateTimeDialog : Gtk.Dialog {
+ private const int64 SECONDS_IN_DAY = 60 * 60 * 24;
+ private const int64 SECONDS_IN_HOUR = 60 * 60;
+ private const int64 SECONDS_IN_MINUTE = 60;
+ private const int YEAR_OFFSET = 1900;
+ private bool no_original_time = false;
+
+ private const int CALENDAR_THUMBNAIL_SCALE = 1;
+
+ time_t original_time;
+ Gtk.Label original_time_label;
+ Gtk.Calendar calendar;
+ Gtk.SpinButton hour;
+ Gtk.SpinButton minute;
+ Gtk.SpinButton second;
+ Gtk.ComboBoxText system;
+ Gtk.RadioButton relativity_radio_button;
+ Gtk.RadioButton batch_radio_button;
+ Gtk.CheckButton modify_originals_check_button;
+ Gtk.Label notification;
+
+ private enum TimeSystem {
+ AM,
+ PM,
+ 24HR;
+ }
+
+ TimeSystem previous_time_system;
+
+ public AdjustDateTimeDialog(Dateable source, int photo_count, bool display_options = true,
+ bool contains_video = false, bool only_video = false) {
+ assert(source != null);
+
+ set_modal(true);
+ set_resizable(false);
+ set_transient_for(AppWindow.get_instance());
+
+ add_buttons(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.Stock.OK, Gtk.ResponseType.OK);
+ set_title(Resources.ADJUST_DATE_TIME_LABEL);
+
+ calendar = new Gtk.Calendar();
+ calendar.day_selected.connect(on_time_changed);
+ calendar.month_changed.connect(on_time_changed);
+ calendar.next_year.connect(on_time_changed);
+ calendar.prev_year.connect(on_time_changed);
+
+ if (Config.Facade.get_instance().get_use_24_hour_time())
+ hour = new Gtk.SpinButton.with_range(0, 23, 1);
+ else
+ hour = new Gtk.SpinButton.with_range(1, 12, 1);
+
+ hour.output.connect(on_spin_button_output);
+ hour.set_width_chars(2);
+
+ minute = new Gtk.SpinButton.with_range(0, 59, 1);
+ minute.set_width_chars(2);
+ minute.output.connect(on_spin_button_output);
+
+ second = new Gtk.SpinButton.with_range(0, 59, 1);
+ second.set_width_chars(2);
+ second.output.connect(on_spin_button_output);
+
+ system = new Gtk.ComboBoxText();
+ system.append_text(_("AM"));
+ system.append_text(_("PM"));
+ system.append_text(_("24 Hr"));
+ system.changed.connect(on_time_system_changed);
+
+ Gtk.Box clock = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+
+ clock.pack_start(hour, false, false, 3);
+ clock.pack_start(new Gtk.Label(":"), false, false, 3); // internationalize?
+ clock.pack_start(minute, false, false, 3);
+ clock.pack_start(new Gtk.Label(":"), false, false, 3);
+ clock.pack_start(second, false, false, 3);
+ clock.pack_start(system, false, false, 3);
+
+ set_default_response(Gtk.ResponseType.OK);
+
+ relativity_radio_button = new Gtk.RadioButton.with_mnemonic(null,
+ _("_Shift photos/videos by the same amount"));
+ relativity_radio_button.set_active(Config.Facade.get_instance().get_keep_relativity());
+ relativity_radio_button.sensitive = display_options && photo_count > 1;
+
+ batch_radio_button = new Gtk.RadioButton.with_mnemonic(relativity_radio_button.get_group(),
+ _("Set _all photos/videos to this time"));
+ batch_radio_button.set_active(!Config.Facade.get_instance().get_keep_relativity());
+ batch_radio_button.sensitive = display_options && photo_count > 1;
+ batch_radio_button.toggled.connect(on_time_changed);
+
+ if (contains_video) {
+ modify_originals_check_button = new Gtk.CheckButton.with_mnemonic((photo_count == 1) ?
+ _("_Modify original photo file") : _("_Modify original photo files"));
+ } else {
+ modify_originals_check_button = new Gtk.CheckButton.with_mnemonic((photo_count == 1) ?
+ _("_Modify original file") : _("_Modify original files"));
+ }
+
+ modify_originals_check_button.set_active(Config.Facade.get_instance().get_commit_metadata_to_masters() &&
+ display_options);
+ modify_originals_check_button.sensitive = (!only_video) &&
+ (!Config.Facade.get_instance().get_commit_metadata_to_masters() && display_options);
+
+ Gtk.Box time_content = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ time_content.pack_start(calendar, true, false, 3);
+ time_content.pack_start(clock, true, false, 3);
+
+ if (display_options) {
+ time_content.pack_start(relativity_radio_button, true, false, 3);
+ time_content.pack_start(batch_radio_button, true, false, 3);
+ time_content.pack_start(modify_originals_check_button, true, false, 3);
+ }
+
+ Gdk.Pixbuf preview = null;
+ try {
+ // Instead of calling get_pixbuf() here, we use the thumbnail instead;
+ // this was needed for Videos, since they don't support get_pixbuf().
+ preview = source.get_thumbnail(CALENDAR_THUMBNAIL_SCALE);
+ } catch (Error err) {
+ warning("Unable to fetch preview for %s", source.to_string());
+ }
+
+ Gtk.Box image_content = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ Gtk.Image image = (preview != null) ? new Gtk.Image.from_pixbuf(preview) : new Gtk.Image();
+ original_time_label = new Gtk.Label(null);
+ image_content.pack_start(image, true, false, 3);
+ image_content.pack_start(original_time_label, true, false, 3);
+
+ Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+ hbox.pack_start(image_content, true, false, 6);
+ hbox.pack_start(time_content, true, false, 6);
+
+ Gtk.Alignment hbox_alignment = new Gtk.Alignment(0.5f, 0.5f, 0, 0);
+ hbox_alignment.set_padding(6, 3, 6, 6);
+ hbox_alignment.add(hbox);
+
+ ((Gtk.Box) get_content_area()).pack_start(hbox_alignment, true, false, 6);
+
+ notification = new Gtk.Label("");
+ notification.set_line_wrap(true);
+ notification.set_justify(Gtk.Justification.CENTER);
+ notification.set_size_request(-1, -1);
+ notification.set_padding(12, 6);
+
+ ((Gtk.Box) get_content_area()).pack_start(notification, true, true, 0);
+
+ original_time = source.get_exposure_time();
+
+ if (original_time == 0) {
+ original_time = time_t();
+ no_original_time = true;
+ }
+
+ set_time(Time.local(original_time));
+ set_original_time_label(Config.Facade.get_instance().get_use_24_hour_time());
+ }
+
+ private void set_time(Time time) {
+ calendar.select_month(time.month, time.year + YEAR_OFFSET);
+ calendar.select_day(time.day);
+
+ if (Config.Facade.get_instance().get_use_24_hour_time()) {
+ hour.set_value(time.hour);
+ system.set_active(TimeSystem.24HR);
+ } else {
+ int AMPM_hour = time.hour % 12;
+ hour.set_value((AMPM_hour == 0) ? 12 : AMPM_hour);
+ system.set_active((time.hour >= 12) ? TimeSystem.PM : TimeSystem.AM);
+ }
+
+ minute.set_value(time.minute);
+ second.set_value(time.second);
+
+ previous_time_system = (TimeSystem) system.get_active();
+ }
+
+ private void set_original_time_label(bool use_24_hr_format) {
+ if (no_original_time)
+ return;
+
+ original_time_label.set_text(_("Original: ") +
+ Time.local(original_time).format(use_24_hr_format ? _("%m/%d/%Y, %H:%M:%S") :
+ _("%m/%d/%Y, %I:%M:%S %p")));
+ }
+
+ private time_t get_time() {
+ Time time = Time();
+
+ time.second = (int) second.get_value();
+ time.minute = (int) minute.get_value();
+
+ // convert to 24 hr
+ int hour = (int) hour.get_value();
+ time.hour = (hour == 12 && system.get_active() != TimeSystem.24HR) ? 0 : hour;
+ time.hour += ((system.get_active() == TimeSystem.PM) ? 12 : 0);
+
+ uint year, month, day;
+ calendar.get_date(out year, out month, out day);
+ time.year = ((int) year) - YEAR_OFFSET;
+ time.month = (int) month;
+ time.day = (int) day;
+
+ time.isdst = -1;
+
+ return time.mktime();
+ }
+
+ public bool execute(out int64 time_shift, out bool keep_relativity,
+ out bool modify_originals) {
+ show_all();
+
+ bool response = false;
+
+ if (run() == Gtk.ResponseType.OK) {
+ if (no_original_time)
+ time_shift = (int64) get_time();
+ else
+ time_shift = (int64) (get_time() - original_time);
+
+ keep_relativity = relativity_radio_button.get_active();
+
+ if (relativity_radio_button.sensitive)
+ Config.Facade.get_instance().set_keep_relativity(keep_relativity);
+
+ modify_originals = modify_originals_check_button.get_active();
+
+ if (modify_originals_check_button.sensitive)
+ Config.Facade.get_instance().set_modify_originals(modify_originals);
+
+ response = true;
+ } else {
+ time_shift = 0;
+ keep_relativity = true;
+ modify_originals = false;
+ }
+
+ destroy();
+
+ return response;
+ }
+
+ private bool on_spin_button_output(Gtk.SpinButton button) {
+ button.set_text("%02d".printf((int) button.get_value()));
+
+ on_time_changed();
+
+ return true;
+ }
+
+ private void on_time_changed() {
+ int64 time_shift = ((int64) get_time() - (int64) original_time);
+
+ previous_time_system = (TimeSystem) system.get_active();
+
+ if (time_shift == 0 || no_original_time || (batch_radio_button.get_active() &&
+ batch_radio_button.sensitive)) {
+ notification.hide();
+ } else {
+ bool forward = time_shift > 0;
+ int days, hours, minutes, seconds;
+
+ time_shift = time_shift.abs();
+
+ days = (int) (time_shift / SECONDS_IN_DAY);
+ time_shift = time_shift % SECONDS_IN_DAY;
+ hours = (int) (time_shift / SECONDS_IN_HOUR);
+ time_shift = time_shift % SECONDS_IN_HOUR;
+ minutes = (int) (time_shift / SECONDS_IN_MINUTE);
+ seconds = (int) (time_shift % SECONDS_IN_MINUTE);
+
+ string shift_status = (forward) ?
+ _("Exposure time will be shifted forward by\n%d %s, %d %s, %d %s, and %d %s.") :
+ _("Exposure time will be shifted backward by\n%d %s, %d %s, %d %s, and %d %s.");
+
+ notification.set_text(shift_status.printf(days, ngettext("day", "days", days),
+ hours, ngettext("hour", "hours", hours), minutes,
+ ngettext("minute", "minutes", minutes), seconds,
+ ngettext("second", "seconds", seconds)));
+
+ notification.show();
+ }
+ }
+
+ private void on_time_system_changed() {
+ if (previous_time_system == system.get_active())
+ return;
+
+ Config.Facade.get_instance().set_use_24_hour_time(system.get_active() == TimeSystem.24HR);
+
+ if (system.get_active() == TimeSystem.24HR) {
+ int time = (hour.get_value() == 12.0) ? 0 : (int) hour.get_value();
+ time = time + ((previous_time_system == TimeSystem.PM) ? 12 : 0);
+
+ hour.set_range(0, 23);
+ set_original_time_label(true);
+
+ hour.set_value(time);
+ } else {
+ int AMPM_hour = ((int) hour.get_value()) % 12;
+
+ hour.set_range(1, 12);
+ set_original_time_label(false);
+
+ hour.set_value((AMPM_hour == 0) ? 12 : AMPM_hour);
+ }
+
+ on_time_changed();
+ }
+}
+
+public const int MAX_OBJECTS_DISPLAYED = 3;
+public void multiple_object_error_dialog(Gee.ArrayList<DataObject> objects, string message,
+ string title) {
+ string dialog_message = message + "\n";
+
+ //add objects
+ for(int i = 0; i < MAX_OBJECTS_DISPLAYED && objects.size > i; i++)
+ dialog_message += "\n" + objects.get(i).to_string();
+
+ int remainder = objects.size - MAX_OBJECTS_DISPLAYED;
+ if (remainder > 0) {
+ dialog_message += ngettext("\n\nAnd %d other.", "\n\nAnd %d others.",
+ remainder).printf(remainder);
+ }
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(AppWindow.get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "%s", dialog_message);
+
+ dialog.title = title;
+
+ dialog.run();
+ dialog.destroy();
+}
+
+public abstract class TagsDialog : TextEntryDialogMediator {
+ public TagsDialog(string title, string label, string? initial_text = null) {
+ base (title, label, initial_text, HierarchicalTagIndex.get_global_index().get_all_tags(),
+ ",");
+ }
+}
+
+public class AddTagsDialog : TagsDialog {
+ public AddTagsDialog() {
+ base (Resources.ADD_TAGS_TITLE, _("Tags (separated by commas):"));
+ }
+
+ public string[]? execute() {
+ string? text = _execute();
+ if (text == null)
+ return null;
+
+ // only want to return null if the user chose cancel, however, on_modify_validate ensures
+ // that Tag.prep_tag_names won't return a zero-length array (and it never returns null)
+ return Tag.prep_tag_names(text.split(","));
+ }
+
+ protected override bool on_modify_validate(string text) {
+ if (text.contains(Tag.PATH_SEPARATOR_STRING))
+ return false;
+
+ // Can't simply call Tag.prep_tag_names().length because of this bug:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=602208
+ string[] names = Tag.prep_tag_names(text.split(","));
+
+ return names.length > 0;
+ }
+}
+
+public class ModifyTagsDialog : TagsDialog {
+ public ModifyTagsDialog(MediaSource source) {
+ base (Resources.MODIFY_TAGS_LABEL, _("Tags (separated by commas):"),
+ get_initial_text(source));
+ }
+
+ private static string? get_initial_text(MediaSource source) {
+ Gee.Collection<Tag>? source_tags = Tag.global.fetch_for_source(source);
+ if (source_tags == null)
+ return null;
+
+ Gee.Collection<Tag> terminal_tags = Tag.get_terminal_tags(source_tags);
+
+ Gee.SortedSet<string> tag_basenames = new Gee.TreeSet<string>();
+ foreach (Tag tag in terminal_tags)
+ tag_basenames.add(HierarchicalTagUtilities.get_basename(tag.get_path()));
+
+ string? text = null;
+ foreach (string name in tag_basenames) {
+ if (text == null)
+ text = "";
+ else
+ text += ", ";
+
+ text += name;
+ }
+
+ return text;
+ }
+
+ public Gee.ArrayList<Tag>? execute() {
+ string? text = _execute();
+ if (text == null)
+ return null;
+
+ Gee.ArrayList<Tag> new_tags = new Gee.ArrayList<Tag>();
+
+ // return empty list if no tags specified
+ if (is_string_empty(text))
+ return new_tags;
+
+ // break up by comma-delimiter, prep for use, and separate into list
+ string[] tag_names = Tag.prep_tag_names(text.split(","));
+
+ tag_names = HierarchicalTagIndex.get_global_index().get_paths_for_names_array(tag_names);
+
+ foreach (string name in tag_names)
+ new_tags.add(Tag.for_path(name));
+
+ return new_tags;
+ }
+
+ protected override bool on_modify_validate(string text) {
+ return (!text.contains(Tag.PATH_SEPARATOR_STRING));
+ }
+
+}
+
+public interface WelcomeServiceEntry : GLib.Object {
+ public abstract string get_service_name();
+
+ public abstract void execute();
+}
+
+public class WelcomeDialog : Gtk.Dialog {
+ Gtk.CheckButton hide_button;
+ Gtk.CheckButton? system_pictures_import_check = null;
+ Gtk.CheckButton[] external_import_checks = new Gtk.CheckButton[0];
+ WelcomeServiceEntry[] external_import_entries = new WelcomeServiceEntry[0];
+ Gtk.Label secondary_text;
+ Gtk.Label instruction_header;
+ Gtk.Box import_content;
+ Gtk.Box import_action_checkbox_packer;
+ Gtk.Box external_import_action_checkbox_packer;
+ Spit.DataImports.WelcomeImportMetaHost import_meta_host;
+ bool import_content_already_installed = false;
+ bool ok_clicked = false;
+
+ public WelcomeDialog(Gtk.Window owner) {
+ import_meta_host = new Spit.DataImports.WelcomeImportMetaHost(this);
+ bool show_system_pictures_import = is_system_pictures_import_possible();
+ Gtk.Widget ok_button = add_button(Gtk.Stock.OK, Gtk.ResponseType.OK);
+ set_title(_("Welcome!"));
+ set_resizable(false);
+ set_type_hint(Gdk.WindowTypeHint.DIALOG);
+ set_transient_for(owner);
+
+ Gtk.Label primary_text = new Gtk.Label("");
+ primary_text.set_markup(
+ "<span size=\"large\" weight=\"bold\">%s</span>".printf(_("Welcome to Shotwell!")));
+ primary_text.set_alignment(0, 0.5f);
+ secondary_text = new Gtk.Label("");
+ secondary_text.set_markup("<span weight=\"normal\">%s</span>".printf(
+ _("To get started, import photos in any of these ways:")));
+ secondary_text.set_alignment(0, 0.5f);
+ Gtk.Image image = new Gtk.Image.from_pixbuf(Resources.get_icon(Resources.ICON_APP, 50));
+
+ Gtk.Box header_text = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ header_text.pack_start(primary_text, false, false, 5);
+ header_text.pack_start(secondary_text, false, false, 0);
+
+ Gtk.Box header_content = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 12);
+ header_content.pack_start(image, false, false, 0);
+ header_content.pack_start(header_text, false, false, 0);
+
+ Gtk.Label instructions = new Gtk.Label("");
+ string indent_prefix = " "; // we can't tell what the indent prefix is going to be so assume we need one
+
+ string arrow_glyph = (get_direction() == Gtk.TextDirection.RTL) ? "◂" : "▸";
+
+ instructions.set_markup(((indent_prefix + "&#8226; %s\n") + (indent_prefix + "&#8226; %s\n")
+ + (indent_prefix + "&#8226; %s")).printf(
+ _("Choose <span weight=\"bold\">File %s Import From Folder</span>").printf(arrow_glyph),
+ _("Drag and drop photos onto the Shotwell window"),
+ _("Connect a camera to your computer and import")));
+ instructions.set_alignment(0, 0.5f);
+
+ import_action_checkbox_packer = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
+
+ external_import_action_checkbox_packer = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
+ import_action_checkbox_packer.add(external_import_action_checkbox_packer);
+
+ if (show_system_pictures_import) {
+ system_pictures_import_check = new Gtk.CheckButton.with_mnemonic(
+ _("_Import photos from your %s folder").printf(
+ get_display_pathname(AppDirs.get_import_dir())));
+ import_action_checkbox_packer.add(system_pictures_import_check);
+ system_pictures_import_check.set_active(true);
+ }
+
+ instruction_header = new Gtk.Label(
+ _("You can also import photos in any of these ways:"));
+ instruction_header.set_alignment(0.0f, 0.5f);
+ instruction_header.set_margin_top(20);
+
+ Gtk.Box content = new Gtk.Box(Gtk.Orientation.VERTICAL, 16);
+ content.pack_start(header_content, true, true, 0);
+ import_content = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
+ content.add(import_content);
+ content.pack_start(instructions, false, false, 0);
+
+ hide_button = new Gtk.CheckButton.with_mnemonic(_("_Don't show this message again"));
+ hide_button.set_active(true);
+ content.pack_start(hide_button, false, false, 6);
+
+ Gtk.Alignment alignment = new Gtk.Alignment(0, 0, 0, 0);
+ alignment.set_padding(12, 0, 12, 12);
+ alignment.add(content);
+
+ ((Gtk.Box) get_content_area()).pack_start(alignment, false, false, 0);
+
+ set_has_resize_grip(false);
+
+ ok_button.grab_focus();
+
+ install_import_content();
+
+ import_meta_host.start();
+ }
+
+ private void install_import_content() {
+ if (
+ (external_import_checks.length > 0 || system_pictures_import_check != null) &&
+ (import_content_already_installed == false)
+ ) {
+ secondary_text.set_markup("");
+ import_content.add(import_action_checkbox_packer);
+ import_content.add(instruction_header);
+ import_content_already_installed = true;
+ }
+ }
+
+ public void install_service_entry(WelcomeServiceEntry entry) {
+ debug("WelcomeDialog: Installing service entry for %s".printf(entry.get_service_name()));
+ external_import_entries += entry;
+ Gtk.CheckButton entry_check = new Gtk.CheckButton.with_label(
+ _("Import photos from your %s library").printf(entry.get_service_name()));
+ external_import_checks += entry_check;
+ entry_check.set_active(true);
+ external_import_action_checkbox_packer.add(entry_check);
+ install_import_content();
+ }
+
+ /**
+ * Connected to the 'response' signal. This is part of a workaround
+ * for the fact that run()-ning this dialog can interfere with displaying
+ * images from a camera; please see #4997 for details.
+ */
+ private void on_dismiss(int resp) {
+ if (resp == Gtk.ResponseType.OK) {
+ ok_clicked = true;
+ }
+ hide();
+ Gtk.main_quit();
+ }
+
+ public bool execute(out WelcomeServiceEntry[] selected_import_entries, out bool do_system_pictures_import) {
+ // it's unsafe to call run() here - it interferes with displaying
+ // images from a camera - so we process the dialog ourselves.
+ response.connect(on_dismiss);
+ show_all();
+ show();
+
+ // this will block the thread we're in until a matching call
+ // to main_quit() is encountered; this happens when either the window
+ // is closed or OK is clicked.
+ Gtk.main();
+
+ // at this point, the inner main loop will have been exited.
+ // we've got the response, so we don't need this signal anymore.
+ response.disconnect(on_dismiss);
+
+ bool ok = ok_clicked;
+ bool show_dialog = true;
+
+ if (ok)
+ show_dialog = !hide_button.get_active();
+
+ // Use a temporary variable as += cannot be used on parameters
+ WelcomeServiceEntry[] result = new WelcomeServiceEntry[0];
+ for (int i = 0; i < external_import_entries.length; i++) {
+ if (external_import_checks[i].get_active() == true)
+ result += external_import_entries[i];
+ }
+ selected_import_entries = result;
+ do_system_pictures_import =
+ (system_pictures_import_check != null) ? system_pictures_import_check.get_active() : false;
+
+ destroy();
+
+ return show_dialog;
+ }
+
+ private static bool is_system_pictures_import_possible() {
+ File system_pictures = AppDirs.get_import_dir();
+ if (!system_pictures.query_exists(null))
+ return false;
+
+ if (!(system_pictures.query_file_type(FileQueryInfoFlags.NONE, null) == FileType.DIRECTORY))
+ return false;
+
+ try {
+ FileEnumerator syspics_child_enum = system_pictures.enumerate_children("standard::*",
+ FileQueryInfoFlags.NONE, null);
+ return (syspics_child_enum.next_file(null) != null);
+ } catch (Error e) {
+ return false;
+ }
+ }
+}
+
+public class PreferencesDialog {
+ private class PathFormat {
+ public PathFormat(string name, string? pattern) {
+ this.name = name;
+ this.pattern = pattern;
+ }
+ public string name;
+ public string? pattern;
+ }
+
+ private static PreferencesDialog preferences_dialog;
+
+ private Gtk.Dialog dialog;
+ private Gtk.Builder builder;
+ private Gtk.Adjustment bg_color_adjustment;
+ private Gtk.Scale bg_color_slider;
+ private Gtk.ComboBox photo_editor_combo;
+ private Gtk.ComboBox raw_editor_combo;
+ private SortedList<AppInfo> external_raw_apps;
+ private SortedList<AppInfo> external_photo_apps;
+ private Gtk.FileChooserButton library_dir_button;
+ private Gtk.ComboBoxText dir_pattern_combo;
+ private Gtk.Entry dir_pattern_entry;
+ private Gtk.Label dir_pattern_example;
+ private bool allow_closing = false;
+ private string? lib_dir = null;
+ private Gee.ArrayList<PathFormat> path_formats = new Gee.ArrayList<PathFormat>();
+ private GLib.DateTime example_date = new GLib.DateTime.local(2009, 3, 10, 18, 16, 11);
+ private Gtk.CheckButton lowercase;
+ private Gtk.Button close_button;
+ private Plugins.ManifestWidgetMediator plugins_mediator = new Plugins.ManifestWidgetMediator();
+ private Gtk.ComboBoxText default_raw_developer_combo;
+
+ private PreferencesDialog() {
+ builder = AppWindow.create_builder();
+
+ dialog = builder.get_object("preferences_dialog") as Gtk.Dialog;
+ dialog.set_parent_window(AppWindow.get_instance().get_parent_window());
+ dialog.set_transient_for(AppWindow.get_instance());
+ dialog.delete_event.connect(on_delete);
+ dialog.response.connect(on_close);
+ dialog.set_has_resize_grip(false);
+
+ bg_color_adjustment = builder.get_object("bg_color_adjustment") as Gtk.Adjustment;
+ bg_color_adjustment.set_value(bg_color_adjustment.get_upper() -
+ (Config.Facade.get_instance().get_bg_color().red * 65535.0));
+ bg_color_adjustment.value_changed.connect(on_value_changed);
+
+ bg_color_slider = builder.get_object("bg_color_slider") as Gtk.Scale;
+ bg_color_slider.button_press_event.connect(on_bg_color_reset);
+
+ library_dir_button = builder.get_object("library_dir_button") as Gtk.FileChooserButton;
+
+ close_button = builder.get_object("close_button") as Gtk.Button;
+
+ photo_editor_combo = builder.get_object("external_photo_editor_combo") as Gtk.ComboBox;
+ raw_editor_combo = builder.get_object("external_raw_editor_combo") as Gtk.ComboBox;
+
+ Gtk.Label pattern_help = builder.get_object("pattern_help") as Gtk.Label;
+
+ // Ticket #3162 - Move dir pattern blurb into Gnome help.
+ // Because specifying a particular snippet of the help requires
+ // us to know where its located, we can't hardcode a URL anymore;
+ // instead, we ask for the help path, and if we find it, we tell
+ // yelp to read from there, otherwise, we read from system-wide.
+ string help_path = Resources.get_help_path();
+
+ if (help_path == null) {
+ // We're installed system-wide, so use the system help.
+ pattern_help.set_markup("<a href=\"" + Resources.DIR_PATTERN_URI_SYSWIDE + "\">" + _("(Help)") + "</a>");
+ } else {
+ // We're being run from the build directory; we'll have to handle clicks to this
+ // link manually ourselves, due to a limitation ghelp: URIs.
+ pattern_help.set_markup("<a href=\"dummy:\">" + _("(Help)") + "</a>");
+ pattern_help.activate_link.connect(on_local_pattern_help);
+ }
+
+ dir_pattern_combo = new Gtk.ComboBoxText();
+ Gtk.Alignment dir_choser_align = builder.get_object("dir choser") as Gtk.Alignment;
+ dir_choser_align.add(dir_pattern_combo);
+ dir_pattern_entry = builder.get_object("dir_pattern_entry") as Gtk.Entry;
+ dir_pattern_example = builder.get_object("dynamic example") as Gtk.Label;
+ add_to_dir_formats(_("Year%sMonth%sDay").printf(Path.DIR_SEPARATOR_S, Path.DIR_SEPARATOR_S),
+ "%Y" + Path.DIR_SEPARATOR_S + "%m" + Path.DIR_SEPARATOR_S + "%d");
+ add_to_dir_formats(_("Year%sMonth").printf(Path.DIR_SEPARATOR_S), "%Y" +
+ Path.DIR_SEPARATOR_S + "%m");
+ add_to_dir_formats(_("Year%sMonth-Day").printf(Path.DIR_SEPARATOR_S),
+ "%Y" + Path.DIR_SEPARATOR_S + "%m-%d");
+ add_to_dir_formats(_("Year-Month-Day"), "%Y-%m-%d");
+ add_to_dir_formats(_("Custom"), null); // Custom must always be last.
+ dir_pattern_combo.changed.connect(on_dir_pattern_combo_changed);
+ dir_pattern_entry.changed.connect(on_dir_pattern_entry_changed);
+
+ (builder.get_object("dir_structure_label") as Gtk.Label).set_mnemonic_widget(dir_pattern_combo);
+
+ lowercase = builder.get_object("lowercase") as Gtk.CheckButton;
+ lowercase.toggled.connect(on_lowercase_toggled);
+
+ Gtk.Bin plugin_manifest_container = builder.get_object("plugin-manifest-bin") as Gtk.Bin;
+ plugin_manifest_container.add(plugins_mediator.widget);
+
+ populate_preference_options();
+
+ photo_editor_combo.changed.connect(on_photo_editor_changed);
+ raw_editor_combo.changed.connect(on_raw_editor_changed);
+
+ Gtk.CheckButton auto_import_button = builder.get_object("autoimport") as Gtk.CheckButton;
+ auto_import_button.set_active(Config.Facade.get_instance().get_auto_import_from_library());
+
+ Gtk.CheckButton commit_metadata_button = builder.get_object("write_metadata") as Gtk.CheckButton;
+ commit_metadata_button.set_active(Config.Facade.get_instance().get_commit_metadata_to_masters());
+
+ default_raw_developer_combo = builder.get_object("default_raw_developer") as Gtk.ComboBoxText;
+ default_raw_developer_combo.append_text(RawDeveloper.CAMERA.get_label());
+ default_raw_developer_combo.append_text(RawDeveloper.SHOTWELL.get_label());
+ set_raw_developer_combo(Config.Facade.get_instance().get_default_raw_developer());
+ default_raw_developer_combo.changed.connect(on_default_raw_developer_changed);
+
+ dialog.map_event.connect(map_event);
+ }
+
+ public void populate_preference_options() {
+ populate_app_combo_box(photo_editor_combo, PhotoFileFormat.get_editable_mime_types(),
+ Config.Facade.get_instance().get_external_photo_app(), out external_photo_apps);
+
+ populate_app_combo_box(raw_editor_combo, PhotoFileFormat.RAW.get_mime_types(),
+ Config.Facade.get_instance().get_external_raw_app(), out external_raw_apps);
+
+ setup_dir_pattern(dir_pattern_combo, dir_pattern_entry);
+
+ lowercase.set_active(Config.Facade.get_instance().get_use_lowercase_filenames());
+ }
+
+ // Ticket #3162, part II - if we're not yet installed, then we have to manually launch
+ // the help viewer and specify the full path to the subsection we want...
+ private bool on_local_pattern_help(string ignore) {
+ try {
+ Resources.launch_help(AppWindow.get_instance().get_screen(), "?other-files");
+ } catch (Error e) {
+ message("Unable to launch help: %s", e.message);
+ }
+ return true;
+ }
+
+ private void populate_app_combo_box(Gtk.ComboBox combo_box, string[] mime_types,
+ string current_app_executable, out SortedList<AppInfo> external_apps) {
+ // get list of all applications for the given mime types
+ assert(mime_types.length != 0);
+ external_apps = DesktopIntegration.get_apps_for_mime_types(mime_types);
+
+ if (external_apps.size == 0)
+ return;
+
+ // populate application ComboBox with app names and icons
+ Gtk.CellRendererPixbuf pixbuf_renderer = new Gtk.CellRendererPixbuf();
+ Gtk.CellRendererText text_renderer = new Gtk.CellRendererText();
+ combo_box.clear();
+ combo_box.pack_start(pixbuf_renderer, false);
+ combo_box.pack_start(text_renderer, false);
+ combo_box.add_attribute(pixbuf_renderer, "pixbuf", 0);
+ combo_box.add_attribute(text_renderer, "text", 1);
+
+ // TODO: need more space between icons and text
+ Gtk.ListStore combo_store = new Gtk.ListStore(2, typeof(Gdk.Pixbuf), typeof(string));
+ Gtk.TreeIter iter;
+
+ int current_app = -1;
+
+ foreach (AppInfo app in external_apps) {
+ combo_store.append(out iter);
+
+ Icon app_icon = app.get_icon();
+ try {
+ if (app_icon is FileIcon) {
+ combo_store.set_value(iter, 0, scale_pixbuf(new Gdk.Pixbuf.from_file(
+ ((FileIcon) app_icon).get_file().get_path()), Resources.DEFAULT_ICON_SCALE,
+ Gdk.InterpType.BILINEAR, false));
+ } else if (app_icon is ThemedIcon) {
+ Gdk.Pixbuf icon_pixbuf =
+ Gtk.IconTheme.get_default().load_icon(((ThemedIcon) app_icon).get_names()[0],
+ Resources.DEFAULT_ICON_SCALE, Gtk.IconLookupFlags.FORCE_SIZE);
+
+ combo_store.set_value(iter, 0, icon_pixbuf);
+ }
+ } catch (GLib.Error error) {
+ warning("Error loading icon pixbuf: " + error.message);
+ }
+
+ combo_store.set_value(iter, 1, app.get_name());
+
+ if (app.get_commandline() == current_app_executable)
+ current_app = external_apps.index_of(app);
+ }
+
+ // TODO: allow users to choose unlisted applications like Nautilus's "Open with -> Other Application..."
+
+ combo_box.set_model(combo_store);
+
+ if (current_app != -1)
+ combo_box.set_active(current_app);
+ }
+
+ private void setup_dir_pattern(Gtk.ComboBox combo_box, Gtk.Entry entry) {
+ string? pattern = Config.Facade.get_instance().get_directory_pattern();
+ bool found = false;
+ if (null != pattern) {
+ // Locate pre-built text.
+ int i = 0;
+ foreach (PathFormat pf in path_formats) {
+ if (pf.pattern == pattern) {
+ combo_box.set_active(i);
+ found = true;
+ break;
+ }
+ i++;
+ }
+ } else {
+ // Custom path.
+ string? s = Config.Facade.get_instance().get_directory_pattern_custom();
+ if (!is_string_empty(s)) {
+ combo_box.set_active(path_formats.size - 1); // Assume "custom" is last.
+ found = true;
+ }
+ }
+
+ if (!found) {
+ combo_box.set_active(0);
+ }
+
+ on_dir_pattern_combo_changed();
+ }
+
+ public static void show() {
+ if (preferences_dialog == null)
+ preferences_dialog = new PreferencesDialog();
+
+ preferences_dialog.populate_preference_options();
+ preferences_dialog.dialog.show_all();
+ preferences_dialog.library_dir_button.set_current_folder(AppDirs.get_import_dir().get_path());
+
+ // Ticket #3001: Cause the dialog to become active if the user chooses 'Preferences'
+ // from the menus a second time.
+ preferences_dialog.dialog.present();
+ }
+
+ // For items that should only be committed when the dialog is closed, not as soon as the change
+ // is made.
+ private void commit_on_close() {
+ Config.Facade.get_instance().commit_bg_color();
+
+ Gtk.CheckButton? autoimport = builder.get_object("autoimport") as Gtk.CheckButton;
+ if (autoimport != null)
+ Config.Facade.get_instance().set_auto_import_from_library(autoimport.active);
+
+ Gtk.CheckButton? commit_metadata = builder.get_object("write_metadata") as Gtk.CheckButton;
+ if (commit_metadata != null)
+ Config.Facade.get_instance().set_commit_metadata_to_masters(commit_metadata.active);
+
+ if (lib_dir != null)
+ AppDirs.set_import_dir(lib_dir);
+
+ PathFormat pf = path_formats.get(dir_pattern_combo.get_active());
+ if (null == pf.pattern) {
+ Config.Facade.get_instance().set_directory_pattern_custom(dir_pattern_entry.text);
+ Config.Facade.get_instance().set_directory_pattern(null);
+ } else {
+ Config.Facade.get_instance().set_directory_pattern(pf.pattern);
+ }
+ }
+
+ private bool on_delete() {
+ if (!get_allow_closing())
+ return true;
+
+ commit_on_close();
+ return dialog.hide_on_delete(); //prevent widgets from getting destroyed
+ }
+
+ private void on_close() {
+ if (!get_allow_closing())
+ return;
+
+ dialog.hide();
+ commit_on_close();
+ }
+
+ private void on_value_changed() {
+ set_background_color((double)(bg_color_adjustment.get_upper() -
+ bg_color_adjustment.get_value()) / 65535.0);
+ }
+
+ private bool on_bg_color_reset(Gdk.EventButton event) {
+ if (event.button == 1 && event.type == Gdk.EventType.BUTTON_PRESS
+ && has_only_key_modifier(event.state, Gdk.ModifierType.CONTROL_MASK)) {
+ // Left Mouse Button and CTRL pressed
+ bg_color_slider.set_value(bg_color_adjustment.get_upper() -
+ (parse_color(Config.Facade.DEFAULT_BG_COLOR).red * 65536.0f));
+ on_value_changed();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private void on_dir_pattern_combo_changed() {
+ PathFormat pf = path_formats.get(dir_pattern_combo.get_active());
+ if (null == pf.pattern) {
+ // Custom format.
+ string? dir_pattern = Config.Facade.get_instance().get_directory_pattern_custom();
+ if (is_string_empty(dir_pattern))
+ dir_pattern = "";
+ dir_pattern_entry.set_text(dir_pattern);
+ dir_pattern_entry.editable = true;
+ dir_pattern_entry.sensitive = true;
+ } else {
+ dir_pattern_entry.set_text(pf.pattern);
+ dir_pattern_entry.editable = false;
+ dir_pattern_entry.sensitive = false;
+ }
+ }
+
+ private void on_dir_pattern_entry_changed() {
+ string example = example_date.format(dir_pattern_entry.text);
+ if (is_string_empty(example) && !is_string_empty(dir_pattern_entry.text)) {
+ // Invalid pattern.
+ dir_pattern_example.set_text(_("Invalid pattern"));
+ dir_pattern_entry.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, Gtk.Stock.DIALOG_ERROR);
+ dir_pattern_entry.set_icon_activatable(Gtk.EntryIconPosition.SECONDARY, false);
+ set_allow_closing(false);
+ } else {
+ // Valid pattern.
+ dir_pattern_example.set_text(example);
+ dir_pattern_entry.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, null);
+ set_allow_closing(true);
+ }
+ }
+
+ private void set_allow_closing(bool allow) {
+ dialog.set_deletable(allow);
+ close_button.set_sensitive(allow);
+ allow_closing = allow;
+ }
+
+ private bool get_allow_closing() {
+ return allow_closing;
+ }
+
+ private void set_background_color(double bg_color_value) {
+ Config.Facade.get_instance().set_bg_color(to_grayscale(bg_color_value));
+ }
+
+ private Gdk.RGBA to_grayscale(double color_value) {
+ Gdk.RGBA color = Gdk.RGBA();
+
+ color.red = color_value;
+ color.green = color_value;
+ color.blue = color_value;
+ color.alpha = 1.0;
+
+ return color;
+ }
+
+ private void on_photo_editor_changed() {
+ int photo_app_choice_index = (photo_editor_combo.get_active() < external_photo_apps.size) ?
+ photo_editor_combo.get_active() : external_photo_apps.size;
+
+ AppInfo app = external_photo_apps.get_at(photo_app_choice_index);
+
+ Config.Facade.get_instance().set_external_photo_app(DesktopIntegration.get_app_open_command(app));
+
+ debug("setting external photo editor to: %s", DesktopIntegration.get_app_open_command(app));
+ }
+
+ private void on_raw_editor_changed() {
+ int raw_app_choice_index = (raw_editor_combo.get_active() < external_raw_apps.size) ?
+ raw_editor_combo.get_active() : external_raw_apps.size;
+
+ AppInfo app = external_raw_apps.get_at(raw_app_choice_index);
+
+ Config.Facade.get_instance().set_external_raw_app(app.get_commandline());
+
+ debug("setting external raw editor to: %s", app.get_commandline());
+ }
+
+ private RawDeveloper raw_developer_from_combo() {
+ if (default_raw_developer_combo.get_active() == 0)
+ return RawDeveloper.CAMERA;
+ return RawDeveloper.SHOTWELL;
+ }
+
+ private void set_raw_developer_combo(RawDeveloper d) {
+ if (d == RawDeveloper.CAMERA)
+ default_raw_developer_combo.set_active(0);
+ else
+ default_raw_developer_combo.set_active(1);
+ }
+
+ private void on_default_raw_developer_changed() {
+ Config.Facade.get_instance().set_default_raw_developer(raw_developer_from_combo());
+ }
+
+ private void on_current_folder_changed() {
+ lib_dir = library_dir_button.get_filename();
+ }
+
+ private bool map_event() {
+ // Set the signal for the lib dir button after the dialog is displayed,
+ // because the FileChooserButton has a nasty habbit of selecting a
+ // different folder when displayed if the provided path doesn't exist.
+ // See ticket #3000 for more info.
+ library_dir_button.current_folder_changed.connect(on_current_folder_changed);
+ return true;
+ }
+
+ private void add_to_dir_formats(string name, string? pattern) {
+ PathFormat pf = new PathFormat(name, pattern);
+ path_formats.add(pf);
+ dir_pattern_combo.append_text(name);
+ }
+
+ private void on_lowercase_toggled() {
+ Config.Facade.get_instance().set_use_lowercase_filenames(lowercase.get_active());
+ }
+}
+
+// This function is used to determine whether or not files should be copied or linked when imported.
+// Returns ACCEPT for copy, REJECT for link, and CANCEL for (drum-roll) cancel.
+public Gtk.ResponseType copy_files_dialog() {
+ string msg = _("Shotwell can copy the photos into your library folder or it can import them without copying.");
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(AppWindow.get_instance(), Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION, Gtk.ButtonsType.CANCEL, "%s", msg);
+
+ dialog.add_button(_("Co_py Photos"), Gtk.ResponseType.ACCEPT);
+ dialog.add_button(_("_Import in Place"), Gtk.ResponseType.REJECT);
+ dialog.title = _("Import to Library");
+
+ Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+
+ dialog.destroy();
+
+ return result;
+}
+
+public void remove_photos_from_library(Gee.Collection<LibraryPhoto> photos) {
+ remove_from_app(photos, _("Remove From Library"),
+ (photos.size == 1) ? _("Removing Photo From Library") : _("Removing Photos From Library"));
+}
+
+public void remove_from_app(Gee.Collection<MediaSource> sources, string dialog_title,
+ string progress_dialog_text) {
+ if (sources.size == 0)
+ return;
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media(sources, photos, videos);
+
+ string? user_message = null;
+ if ((!photos.is_empty) && (!videos.is_empty)) {
+ user_message = ngettext("This will remove the photo/video from your Shotwell library. Would you also like to move the file to your desktop trash?\n\nThis action cannot be undone.",
+ "This will remove %d photos/videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n\nThis action cannot be undone.",
+ sources.size).printf(sources.size);
+ } else if (!videos.is_empty) {
+ user_message = ngettext("This will remove the video from your Shotwell library. Would you also like to move the file to your desktop trash?\n\nThis action cannot be undone.",
+ "This will remove %d videos from your Shotwell library. Would you also like to move the files to your desktop trash?\n\nThis action cannot be undone.",
+ sources.size).printf(sources.size);
+ } else {
+ user_message = ngettext("This will remove the photo from your Shotwell library. Would you also like to move the file to your desktop trash?\n\nThis action cannot be undone.",
+ "This will remove %d photos from your Shotwell library. Would you also like to move the files to your desktop trash?\n\nThis action cannot be undone.",
+ sources.size).printf(sources.size);
+ }
+
+ Gtk.ResponseType result = remove_from_library_dialog(AppWindow.get_instance(), dialog_title,
+ user_message, sources.size);
+ if (result != Gtk.ResponseType.YES && result != Gtk.ResponseType.NO)
+ return;
+
+ bool delete_backing = (result == Gtk.ResponseType.YES);
+
+ AppWindow.get_instance().set_busy_cursor();
+
+ ProgressDialog progress = null;
+ ProgressMonitor monitor = null;
+ if (sources.size >= 20) {
+ progress = new ProgressDialog(AppWindow.get_instance(), progress_dialog_text);
+ monitor = progress.monitor;
+ }
+
+ Gee.ArrayList<LibraryPhoto> not_removed_photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> not_removed_videos = new Gee.ArrayList<Video>();
+
+ // Remove and attempt to trash.
+ LibraryPhoto.global.remove_from_app(photos, delete_backing, monitor, not_removed_photos);
+ Video.global.remove_from_app(videos, delete_backing, monitor, not_removed_videos);
+
+ // Check for files we couldn't trash.
+ int num_not_removed = not_removed_photos.size + not_removed_videos.size;
+ if (delete_backing && num_not_removed > 0) {
+ string not_deleted_message =
+ ngettext("The photo or video cannot be moved to your desktop trash. Delete this file?",
+ "%d photos/videos cannot be moved to your desktop trash. Delete these files?",
+ num_not_removed).printf(num_not_removed);
+ Gtk.ResponseType result_delete = remove_from_filesystem_dialog(AppWindow.get_instance(),
+ dialog_title, not_deleted_message);
+
+ if (Gtk.ResponseType.YES == result_delete) {
+ // Attempt to delete the files.
+ Gee.ArrayList<LibraryPhoto> not_deleted_photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> not_deleted_videos = new Gee.ArrayList<Video>();
+ LibraryPhoto.global.delete_backing_files(not_removed_photos, monitor, not_deleted_photos);
+ Video.global.delete_backing_files(not_removed_videos, monitor, not_deleted_videos);
+
+ int num_not_deleted = not_deleted_photos.size + not_deleted_videos.size;
+ if (num_not_deleted > 0) {
+ // Alert the user that the files were not removed.
+ string delete_failed_message =
+ ngettext("The photo or video cannot be deleted.",
+ "%d photos/videos cannot be deleted.",
+ num_not_deleted).printf(num_not_deleted);
+ AppWindow.error_message_with_title(dialog_title, delete_failed_message, AppWindow.get_instance());
+ }
+ }
+ }
+
+ if (progress != null)
+ progress.close();
+
+ AppWindow.get_instance().set_normal_cursor();
+}
+
diff --git a/src/Dimensions.vala b/src/Dimensions.vala
new file mode 100644
index 0000000..0c8c895
--- /dev/null
+++ b/src/Dimensions.vala
@@ -0,0 +1,732 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public enum ScaleConstraint {
+ ORIGINAL,
+ DIMENSIONS,
+ WIDTH,
+ HEIGHT,
+ FILL_VIEWPORT;
+
+ public string? to_string() {
+ switch (this) {
+ case ORIGINAL:
+ return _("Original size");
+
+ case DIMENSIONS:
+ return _("Width or height");
+
+ case WIDTH:
+ return _("Width");
+
+ case HEIGHT:
+ return _("Height");
+
+ case FILL_VIEWPORT:
+ // TODO: Translate (not used in UI at this point)
+ return "Fill Viewport";
+ }
+
+ warn_if_reached();
+
+ return null;
+ }
+}
+
+public struct Dimensions {
+ public int width;
+ public int height;
+
+ public Dimensions(int width = 0, int height = 0) {
+ if ((width < 0) || (height < 0))
+ warning("Tried to construct a Dimensions object with negative width or height - forcing sensible default values.");
+
+ this.width = width.clamp(0, width);
+ this.height = height.clamp(0, height);
+ }
+
+ public static Dimensions for_pixbuf(Gdk.Pixbuf pixbuf) {
+ return Dimensions(pixbuf.get_width(), pixbuf.get_height());
+ }
+
+ public static Dimensions for_allocation(Gtk.Allocation allocation) {
+ return Dimensions(allocation.width, allocation.height);
+ }
+
+ public static Dimensions for_widget_allocation(Gtk.Widget widget) {
+ Gtk.Allocation allocation;
+ widget.get_allocation(out allocation);
+
+ return Dimensions(allocation.width, allocation.height);
+ }
+
+ public static Dimensions for_rectangle(Gdk.Rectangle rect) {
+ return Dimensions(rect.width, rect.height);
+ }
+
+ public bool has_area() {
+ return (width > 0 && height > 0);
+ }
+
+ public Dimensions floor(Dimensions min = Dimensions(1, 1)) {
+ return Dimensions((width > min.width) ? width : min.width,
+ (height > min.height) ? height : min.height);
+ }
+
+ public string to_string() {
+ return "%dx%d".printf(width, height);
+ }
+
+ public bool equals(Dimensions dim) {
+ return (width == dim.width && height == dim.height);
+ }
+
+ // sometimes a pixel or two is okay
+ public bool approx_equals(Dimensions dim, int fudge = 1) {
+ return (width - dim.width).abs() <= fudge && (height - dim.height).abs() <= fudge;
+ }
+
+ public bool approx_scaled(int scale, int fudge = 1) {
+ return (width <= (scale + fudge)) && (height <= (scale + fudge));
+ }
+
+ public int major_axis() {
+ return int.max(width, height);
+ }
+
+ public int minor_axis() {
+ return int.min(width, height);
+ }
+
+ public Dimensions with_min(int min_width, int min_height) {
+ return Dimensions(int.max(width, min_width), int.max(height, min_height));
+ }
+
+ public Dimensions with_max(int max_width, int max_height) {
+ return Dimensions(int.min(width, max_width), int.min(height, max_height));
+ }
+
+ public Dimensions get_scaled(int scale, bool scale_up) {
+ assert(scale > 0);
+
+ // check for existing best-fit
+ if ((width == scale && height < scale) || (height == scale && width < scale))
+ return Dimensions(width, height);
+
+ // watch for scaling up
+ if (!scale_up && (width < scale && height < scale))
+ return Dimensions(width, height);
+
+ if ((width - scale) > (height - scale))
+ return get_scaled_by_width(scale);
+ else
+ return get_scaled_by_height(scale);
+ }
+
+ public void get_scale_ratios(Dimensions scaled, out double width_ratio, out double height_ratio) {
+ width_ratio = (double) scaled.width / (double) width;
+ height_ratio = (double) scaled.height / (double) height;
+ }
+
+ public double get_aspect_ratio() {
+ return ((double) width) / height;
+ }
+
+ public Dimensions get_scaled_proportional(Dimensions viewport) {
+ double width_ratio, height_ratio;
+ get_scale_ratios(viewport, out width_ratio, out height_ratio);
+
+ double scaled_width, scaled_height;
+ if (width_ratio < height_ratio) {
+ scaled_width = viewport.width;
+ scaled_height = (double) height * width_ratio;
+ } else {
+ scaled_width = (double) width * height_ratio;
+ scaled_height = viewport.height;
+ }
+
+ Dimensions scaled = Dimensions((int) Math.round(scaled_width),
+ (int) Math.round(scaled_height)).floor();
+ assert(scaled.height <= viewport.height);
+ assert(scaled.width <= viewport.width);
+
+ return scaled;
+ }
+
+ public Dimensions get_scaled_to_fill_viewport(Dimensions viewport) {
+ double width_ratio, height_ratio;
+ get_scale_ratios(viewport, out width_ratio, out height_ratio);
+
+ double scaled_width, scaled_height;
+ if (width < viewport.width && height >= viewport.height) {
+ // too narrow
+ scaled_width = viewport.width;
+ scaled_height = (double) height * width_ratio;
+ } else if (width >= viewport.width && height < viewport.height) {
+ // too short
+ scaled_width = (double) width * height_ratio;
+ scaled_height = viewport.height;
+ } else {
+ // both are smaller or larger
+ double ratio = double.max(width_ratio, height_ratio);
+
+ scaled_width = (double) width * ratio;
+ scaled_height = (double) height * ratio;
+ }
+
+ return Dimensions((int) Math.round(scaled_width), (int) Math.round(scaled_height)).floor();
+ }
+
+ public Gdk.Rectangle get_scaled_rectangle(Dimensions scaled, Gdk.Rectangle rect) {
+ double x_scale, y_scale;
+ get_scale_ratios(scaled, out x_scale, out y_scale);
+
+ Gdk.Rectangle scaled_rect = Gdk.Rectangle();
+ scaled_rect.x = (int) Math.round((double) rect.x * x_scale);
+ scaled_rect.y = (int) Math.round((double) rect.y * y_scale);
+ scaled_rect.width = (int) Math.round((double) rect.width * x_scale);
+ scaled_rect.height = (int) Math.round((double) rect.height * y_scale);
+
+ if (scaled_rect.width <= 0)
+ scaled_rect.width = 1;
+
+ if (scaled_rect.height <= 0)
+ scaled_rect.height = 1;
+
+ return scaled_rect;
+ }
+
+ // Returns the current dimensions scaled in a similar proportion as the two suppled dimensions
+ public Dimensions get_scaled_similar(Dimensions original, Dimensions scaled) {
+ double x_scale, y_scale;
+ original.get_scale_ratios(scaled, out x_scale, out y_scale);
+
+ double scale = double.min(x_scale, y_scale);
+
+ return Dimensions((int) Math.round((double) width * scale),
+ (int) Math.round((double) height * scale)).floor();
+ }
+
+ public Dimensions get_scaled_by_width(int scale) {
+ assert(scale > 0);
+
+ double ratio = (double) scale / (double) width;
+
+ return Dimensions(scale, (int) Math.round((double) height * ratio)).floor();
+ }
+
+ public Dimensions get_scaled_by_height(int scale) {
+ assert(scale > 0);
+
+ double ratio = (double) scale / (double) height;
+
+ return Dimensions((int) Math.round((double) width * ratio), scale).floor();
+ }
+
+ public Dimensions get_scaled_by_constraint(int scale, ScaleConstraint constraint) {
+ switch (constraint) {
+ case ScaleConstraint.ORIGINAL:
+ return Dimensions(width, height);
+
+ case ScaleConstraint.DIMENSIONS:
+ return (width >= height) ? get_scaled_by_width(scale) : get_scaled_by_height(scale);
+
+ case ScaleConstraint.WIDTH:
+ return get_scaled_by_width(scale);
+
+ case ScaleConstraint.HEIGHT:
+ return get_scaled_by_height(scale);
+
+ default:
+ error("Bad constraint: %d", (int) constraint);
+ }
+ }
+}
+
+public struct Scaling {
+ private const int NO_SCALE = 0;
+
+ private ScaleConstraint constraint;
+ private int scale;
+ private Dimensions viewport;
+ private bool scale_up;
+
+ private Scaling(ScaleConstraint constraint, int scale, Dimensions viewport, bool scale_up) {
+ this.constraint = constraint;
+ this.scale = scale;
+ this.viewport = viewport;
+ this.scale_up = scale_up;
+ }
+
+ public static Scaling for_original() {
+ return Scaling(ScaleConstraint.ORIGINAL, NO_SCALE, Dimensions(), false);
+ }
+
+ public static Scaling for_screen(Gtk.Window window, bool scale_up) {
+ return for_viewport(get_screen_dimensions(window), scale_up);
+ }
+
+ public static Scaling for_best_fit(int pixels, bool scale_up) {
+ assert(pixels > 0);
+
+ return Scaling(ScaleConstraint.DIMENSIONS, pixels, Dimensions(), scale_up);
+ }
+
+ public static Scaling for_viewport(Dimensions viewport, bool scale_up) {
+ assert(viewport.has_area());
+
+ return Scaling(ScaleConstraint.DIMENSIONS, NO_SCALE, viewport, scale_up);
+ }
+
+ public static Scaling for_widget(Gtk.Widget widget, bool scale_up) {
+ Dimensions viewport = Dimensions.for_widget_allocation(widget);
+
+ // Because it seems that Gtk.Application realizes the main window and its
+ // attendant widgets lazily, it's possible to get here with the PhotoPage's
+ // canvas believing it is 1px by 1px, which can lead to a scaling that
+ // gdk_pixbuf_scale_simple can't handle.
+ //
+ // If we get here, and the widget we're being drawn into is 1x1, then, most likely,
+ // it's not fully realized yet (since nothing in Shotwell requires this), so just
+ // ignore it and return something safe instead.
+ if ((viewport.width <= 1) || (viewport.height <= 1))
+ return for_original();
+
+ return Scaling(ScaleConstraint.DIMENSIONS, NO_SCALE, viewport, scale_up);
+ }
+
+ public static Scaling to_fill_viewport(Dimensions viewport) {
+ // Please see the comment in Scaling.for_widget as to why this is
+ // required.
+ if ((viewport.width <= 1) || (viewport.height <= 1))
+ return for_original();
+
+ return Scaling(ScaleConstraint.FILL_VIEWPORT, NO_SCALE, viewport, true);
+ }
+
+ public static Scaling to_fill_screen(Gtk.Window window) {
+ return to_fill_viewport(get_screen_dimensions(window));
+ }
+
+ public static Scaling for_constraint(ScaleConstraint constraint, int scale, bool scale_up) {
+ return Scaling(constraint, scale, Dimensions(), scale_up);
+ }
+
+ private static Dimensions get_screen_dimensions(Gtk.Window window) {
+ Gdk.Screen screen = window.get_screen();
+
+ return Dimensions(screen.get_width(), screen.get_height());
+ }
+
+ private int scale_to_pixels() {
+ return (scale >= 0) ? scale : 0;
+ }
+
+ public bool is_unscaled() {
+ return constraint == ScaleConstraint.ORIGINAL;
+ }
+
+ public bool is_best_fit(Dimensions original, out int pixels) {
+ pixels = 0;
+
+ if (scale == NO_SCALE)
+ return false;
+
+ switch (constraint) {
+ case ScaleConstraint.ORIGINAL:
+ case ScaleConstraint.FILL_VIEWPORT:
+ return false;
+
+ default:
+ pixels = scale_to_pixels();
+ assert(pixels > 0);
+
+ return true;
+ }
+ }
+
+ public bool is_best_fit_dimensions(Dimensions original, out Dimensions scaled) {
+ scaled = Dimensions();
+
+ if (scale == NO_SCALE)
+ return false;
+
+ switch (constraint) {
+ case ScaleConstraint.ORIGINAL:
+ case ScaleConstraint.FILL_VIEWPORT:
+ return false;
+
+ default:
+ int pixels = scale_to_pixels();
+ assert(pixels > 0);
+
+ scaled = original.get_scaled_by_constraint(pixels, constraint);
+
+ return true;
+ }
+ }
+
+ public bool is_for_viewport(Dimensions original, out Dimensions scaled) {
+ scaled = Dimensions();
+
+ if (scale != NO_SCALE)
+ return false;
+
+ switch (constraint) {
+ case ScaleConstraint.ORIGINAL:
+ case ScaleConstraint.FILL_VIEWPORT:
+ return false;
+
+ default:
+ assert(viewport.has_area());
+
+ if (!scale_up && original.width < viewport.width && original.height < viewport.height)
+ scaled = original;
+ else
+ scaled = original.get_scaled_proportional(viewport);
+
+ return true;
+ }
+ }
+
+ public bool is_fill_viewport(Dimensions original, out Dimensions scaled) {
+ scaled = Dimensions();
+
+ if (constraint != ScaleConstraint.FILL_VIEWPORT)
+ return false;
+
+ assert(viewport.has_area());
+ scaled = original.get_scaled_to_fill_viewport(viewport);
+
+ return true;
+ }
+
+ public Dimensions get_scaled_dimensions(Dimensions original) {
+ if (is_unscaled())
+ return original;
+
+ Dimensions scaled;
+ if (is_fill_viewport(original, out scaled))
+ return scaled;
+
+ if (is_best_fit_dimensions(original, out scaled))
+ return scaled;
+
+ bool is_viewport = is_for_viewport(original, out scaled);
+ assert(is_viewport);
+
+ return scaled;
+ }
+
+ public Gdk.Pixbuf perform_on_pixbuf(Gdk.Pixbuf pixbuf, Gdk.InterpType interp, bool scale_up) {
+ if (is_unscaled())
+ return pixbuf;
+
+ Dimensions pixbuf_dim = Dimensions.for_pixbuf(pixbuf);
+
+ int pixels;
+ if (is_best_fit(pixbuf_dim, out pixels))
+ return scale_pixbuf(pixbuf, pixels, interp, scale_up);
+
+ Dimensions scaled;
+ if (is_fill_viewport(pixbuf_dim, out scaled))
+ return resize_pixbuf(pixbuf, scaled, interp);
+
+ bool is_viewport = is_for_viewport(pixbuf_dim, out scaled);
+ assert(is_viewport);
+
+ return resize_pixbuf(pixbuf, scaled, interp);
+ }
+
+ public string to_string() {
+ if (constraint == ScaleConstraint.ORIGINAL)
+ return "scaling: UNSCALED";
+ else if (constraint == ScaleConstraint.FILL_VIEWPORT)
+ return "scaling: fill viewport %s".printf(viewport.to_string());
+ else if (scale != NO_SCALE)
+ return "scaling: best-fit (%s %d pixels %s)".printf(constraint.to_string(),
+ scale_to_pixels(), scale_up ? "scaled up" : "not scaled up");
+ else
+ return "scaling: viewport %s (%s)".printf(viewport.to_string(),
+ scale_up ? "scaled up" : "not scaled up");
+ }
+
+ public bool equals(Scaling scaling) {
+ return (constraint == scaling.constraint) && (scale == scaling.scale)
+ && viewport.equals(scaling.viewport);
+ }
+}
+
+public struct ZoomState {
+ private Dimensions content_dimensions;
+ private Dimensions viewport_dimensions;
+ private double zoom_factor;
+ private double interpolation_factor;
+ private double min_factor;
+ private double max_factor;
+ private Gdk.Point viewport_center;
+
+ public ZoomState(Dimensions content_dimensions, Dimensions viewport_dimensions,
+ double slider_val = 0.0, Gdk.Point? viewport_center = null) {
+ this.content_dimensions = content_dimensions;
+ this.viewport_dimensions = viewport_dimensions;
+ this.interpolation_factor = slider_val;
+
+ compute_zoom_factors();
+
+ if ((viewport_center == null) || ((viewport_center.x == 0) && (viewport_center.y == 0)) ||
+ (slider_val == 0.0)) {
+ center_viewport();
+ } else {
+ this.viewport_center = viewport_center;
+ clamp_viewport_center();
+ }
+ }
+
+ public ZoomState.rescale(ZoomState existing, double new_slider_val) {
+ this.content_dimensions = existing.content_dimensions;
+ this.viewport_dimensions = existing.viewport_dimensions;
+ this.interpolation_factor = new_slider_val;
+
+ compute_zoom_factors();
+
+ if (new_slider_val == 0.0) {
+ center_viewport();
+ } else {
+ viewport_center.x = (int) (zoom_factor * (existing.viewport_center.x /
+ existing.zoom_factor));
+ viewport_center.y = (int) (zoom_factor * (existing.viewport_center.y /
+ existing.zoom_factor));
+ clamp_viewport_center();
+ }
+ }
+
+ public ZoomState.rescale_to_isomorphic(ZoomState existing) {
+ this.content_dimensions = existing.content_dimensions;
+ this.viewport_dimensions = existing.viewport_dimensions;
+ this.interpolation_factor = Math.log(1.0 / existing.min_factor) /
+ (Math.log(existing.max_factor / existing.min_factor));
+
+ compute_zoom_factors();
+
+ if (this.interpolation_factor == 0.0) {
+ center_viewport();
+ } else {
+ viewport_center.x = (int) (zoom_factor * (existing.viewport_center.x /
+ existing.zoom_factor));
+ viewport_center.y = (int) (zoom_factor * (existing.viewport_center.y /
+ existing.zoom_factor));
+ clamp_viewport_center();
+ }
+ }
+
+ public ZoomState.pan(ZoomState existing, Gdk.Point new_viewport_center) {
+ this.content_dimensions = existing.content_dimensions;
+ this.viewport_dimensions = existing.viewport_dimensions;
+ this.interpolation_factor = existing.interpolation_factor;
+
+ compute_zoom_factors();
+
+ this.viewport_center = new_viewport_center;
+
+ clamp_viewport_center();
+ }
+
+ private void clamp_viewport_center() {
+ int zoomed_width = get_zoomed_width();
+ int zoomed_height = get_zoomed_height();
+
+ viewport_center.x = viewport_center.x.clamp(viewport_dimensions.width / 2,
+ zoomed_width - (viewport_dimensions.width / 2) - 1);
+ viewport_center.y = viewport_center.y.clamp(viewport_dimensions.height / 2,
+ zoomed_height - (viewport_dimensions.height / 2) - 1);
+ }
+
+ private void center_viewport() {
+ viewport_center.x = get_zoomed_width() / 2;
+ viewport_center.y = get_zoomed_height() / 2;
+ }
+
+ private void compute_zoom_factors() {
+ max_factor = 2.0;
+
+ double viewport_to_content_x;
+ double viewport_to_content_y;
+ content_dimensions.get_scale_ratios(viewport_dimensions, out viewport_to_content_x,
+ out viewport_to_content_y);
+ min_factor = double.min(viewport_to_content_x, viewport_to_content_y);
+ if (min_factor > 1.0)
+ min_factor = 1.0;
+
+ zoom_factor = min_factor * Math.pow(max_factor / min_factor, interpolation_factor);
+ }
+
+ public double get_interpolation_factor() {
+ return interpolation_factor;
+ }
+
+ /* gets the viewing rectangle with respect to the zoomed content */
+ public Gdk.Rectangle get_viewing_rectangle_wrt_content() {
+ int zoomed_width = get_zoomed_width();
+ int zoomed_height = get_zoomed_height();
+
+ Gdk.Rectangle result = Gdk.Rectangle();
+
+ if (viewport_dimensions.width < zoomed_width) {
+ result.x = viewport_center.x - (viewport_dimensions.width / 2);
+ } else {
+ result.x = (zoomed_width - viewport_dimensions.width) / 2;
+ }
+ if (result.x < 0)
+ result.x = 0;
+
+ if (viewport_dimensions.height < zoomed_height) {
+ result.y = viewport_center.y - (viewport_dimensions.height / 2);
+ } else {
+ result.y = (zoomed_height - viewport_dimensions.height) / 2;
+ }
+ if (result.y < 0)
+ result.y = 0;
+
+ int right = result.x + viewport_dimensions.width;
+ if (right > zoomed_width)
+ right = zoomed_width;
+ result.width = right - result.x;
+
+ int bottom = result.y + viewport_dimensions.height;
+ if (bottom > zoomed_height)
+ bottom = zoomed_height;
+ result.height = bottom - result.y;
+
+ result.width = result.width.clamp(1, int.MAX);
+ result.height = result.height.clamp(1, int.MAX);
+
+ return result;
+ }
+
+ /* gets the viewing rectangle with respect to the on-screen canvas where zoomed content is
+ drawn */
+ public Gdk.Rectangle get_viewing_rectangle_wrt_screen() {
+ Gdk.Rectangle wrt_content = get_viewing_rectangle_wrt_content();
+
+ Gdk.Rectangle result = Gdk.Rectangle();
+ result.x = (viewport_dimensions.width / 2) - (wrt_content.width / 2);
+ if (result.x < 0)
+ result.x = 0;
+ result.y = (viewport_dimensions.height / 2) - (wrt_content.height / 2);
+ if (result.y < 0)
+ result.y = 0;
+ result.width = wrt_content.width;
+ result.height = wrt_content.height;
+
+ return result;
+ }
+
+ /* gets the projection of the viewing rectangle into the arbitrary pixbuf 'for_pixbuf' */
+ public Gdk.Rectangle get_viewing_rectangle_projection(Gdk.Pixbuf for_pixbuf) {
+ double zoomed_width = get_zoomed_width();
+ double zoomed_height = get_zoomed_height();
+
+ double horiz_scale = for_pixbuf.width / zoomed_width;
+ double vert_scale = for_pixbuf.height / zoomed_height;
+ double scale = (horiz_scale + vert_scale) / 2.0;
+
+ Gdk.Rectangle viewing_rectangle = get_viewing_rectangle_wrt_content();
+
+ Gdk.Rectangle result = Gdk.Rectangle();
+ result.x = (int) (viewing_rectangle.x * scale);
+ result.x = result.x.clamp(0, for_pixbuf.width);
+ result.y = (int) (viewing_rectangle.y * scale);
+ result.y = result.y.clamp(0, for_pixbuf.height);
+ int right = (int) ((viewing_rectangle.x + viewing_rectangle.width) * scale);
+ right = right.clamp(0, for_pixbuf.width);
+ int bottom = (int) ((viewing_rectangle.y + viewing_rectangle.height) * scale);
+ bottom = bottom.clamp(0, for_pixbuf.height);
+ result.width = right - result.x;
+ result.height = bottom - result.y;
+
+ return result;
+ }
+
+
+ public double get_zoom_factor() {
+ return zoom_factor;
+ }
+
+ public int get_zoomed_width() {
+ return (int) (content_dimensions.width * zoom_factor);
+ }
+
+ public int get_zoomed_height() {
+ return (int) (content_dimensions.height * zoom_factor);
+ }
+
+ public Gdk.Point get_viewport_center() {
+ return viewport_center;
+ }
+
+ public string to_string() {
+ string named_modes = "";
+ if (is_min())
+ named_modes = named_modes + ((named_modes == "") ? "MIN" : ", MIN");
+ if (is_default())
+ named_modes = named_modes + ((named_modes == "") ? "DEFAULT" : ", DEFAULT");
+ if (is_isomorphic())
+ named_modes = named_modes + ((named_modes =="") ? "ISOMORPHIC" : ", ISOMORPHIC");
+ if (is_max())
+ named_modes = named_modes + ((named_modes =="") ? "MAX" : ", MAX");
+ if (named_modes == "")
+ named_modes = "(none)";
+
+ Gdk.Rectangle viewing_rect = get_viewing_rectangle_wrt_content();
+
+ return (("ZoomState {\n content dimensions = %d x %d;\n viewport dimensions = " +
+ "%d x %d;\n min factor = %f;\n max factor = %f;\n current factor = %f;" +
+ "\n zoomed width = %d;\n zoomed height = %d;\n named modes = %s;" +
+ "\n viewing rectangle = { x: %d, y: %d, width: %d, height: %d };" +
+ "\n viewport center = (%d, %d);\n}\n").printf(
+ content_dimensions.width, content_dimensions.height, viewport_dimensions.width,
+ viewport_dimensions.height, min_factor, max_factor, zoom_factor, get_zoomed_width(),
+ get_zoomed_height(), named_modes, viewing_rect.x, viewing_rect.y, viewing_rect.width,
+ viewing_rect.height, viewport_center.x, viewport_center.y));
+ }
+
+ public bool is_min() {
+ return (zoom_factor == min_factor);
+ }
+
+ public bool is_default() {
+ return is_min();
+ }
+
+ public bool is_max() {
+ return (zoom_factor == max_factor);
+ }
+
+ public bool is_isomorphic() {
+ return (zoom_factor == 1.0);
+ }
+
+ public bool equals(ZoomState other) {
+ if (!content_dimensions.equals(other.content_dimensions))
+ return false;
+ if (!viewport_dimensions.equals(other.viewport_dimensions))
+ return false;
+ if (zoom_factor != other.zoom_factor)
+ return false;
+ if (min_factor != other.min_factor)
+ return false;
+ if (max_factor != other.max_factor)
+ return false;
+ if (viewport_center.x != other.viewport_center.x)
+ return false;
+ if (viewport_center.y != other.viewport_center.y)
+ return false;
+
+ return true;
+ }
+}
+
diff --git a/src/DirectoryMonitor.vala b/src/DirectoryMonitor.vala
new file mode 100644
index 0000000..1778fe4
--- /dev/null
+++ b/src/DirectoryMonitor.vala
@@ -0,0 +1,1454 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+//
+// DirectoryMonitor will monitor an entire directory for changes to all files and directories
+// within it. It uses FileMonitor to monitor all directories it discovers at initialization
+// and reports changes to the files and directories just as FileMonitor reports them. Subclasses
+// can override the notify_* methods to filter or monitor events before the signal is fired,
+// or can override the signals themselves to be notified afterwards.
+//
+// start_discovery() must be called to initiate monitoring. Directories and files will be reported
+// as they're discovered. Directories will be monitored as they're discovered as well. Discovery
+// can only be initiated once.
+//
+// All signals are virtual and have a corresponding notify_* protected virtual function.
+// Subclasses can either override the notify or the signal to decide when they want to process
+// the event.
+//
+// DirectoryMonitor also adds a level of intelligence to GLib's monitoring API.Because certain
+// file/directory events are decomposed by FileMonitor into more atomic events, it's difficult
+// to know when these "composed" events have occurred. (For example, a file move is reported
+// as a DELETED event followed by a CREATED event, with no clue that the two are related.) Later
+// versions added the MOVE event, but we can't rely on those being installed. Also, documentation
+// suggests it's only available with certain back-ends.
+//
+// DirectoryMonitor attempts to solve this by deducing when a set of events actually equals
+// a composite event. It requires more memory in order to do this (i.e. it stores all files and
+// their information), but the trade-off is easier file/directory monitoring via familiar
+// semantics.
+//
+// DirectoryMonitor also will synthesize events when normal monitor events don't produce expected
+// results. For example, if a directory is moved out of DirectoryMonitor's root, it is reported
+// as a delete event, but none of its children are reported as deleted. Similarly, a directory
+// rename can be captured as a move, but notifications for all its children are not fired and
+// are synthesized by DirectoryMonitor. DirectoryMonitor will fire delete and move notifications
+// for all the directory's children in depth-first order.
+//
+// In general, DirectoryMonitor attempts to preserve ordering of events, so that (for example) a
+// file-altered event doesn't fire before a file-created, and so on.
+//
+// Because of these requirements, DirectoryMonitor maintains a FileInfo struct on all directories
+// and files being monitored. (It maintains the attributes gather during the discovery phase, i.e.
+// SUPPLIED_ATTRIBUTES.) This information can be retrieved via get_info(), get_file_id(), and
+// get_etag(). These calls can be made at any time; the information is stored before any signal
+// is fired.
+//
+// Note that DirectoryMonitor currently only supports files and directories. Other file types
+// (special, symbolic links, shortcuts, and mount points) are not supported. It has been seen
+// when a temporary file is created for its file type to be reported as "unknown" and when it's
+// altered/deleted to be reported as a regular file. This means it's possible for a file not to
+// be reported as discovered or created but to be reported as altered and/or deleted.
+//
+// DirectoryMonitor can be configured to not recurse (in which case it only discovers/monitors
+// the root directory) and to not monitor (in which case only discovery occurs).
+//
+
+public class DirectoryMonitor : Object {
+ public const int DEFAULT_PRIORITY = Priority.LOW;
+ public const FileQueryInfoFlags DIR_INFO_FLAGS = FileQueryInfoFlags.NONE;
+ public const FileQueryInfoFlags FILE_INFO_FLAGS = FileQueryInfoFlags.NOFOLLOW_SYMLINKS;
+
+ // when using UNKNOWN_FILE_FLAGS, check if the resulting FileInfo's symlink status matches
+ // symlink support for files and directories by calling is_file_symlink_supported().
+ public const FileQueryInfoFlags UNKNOWN_INFO_FLAGS = FileQueryInfoFlags.NONE;
+ public const bool SUPPORT_DIR_SYMLINKS = true;
+ public const bool SUPPORT_FILE_SYMLINKS = false;
+
+ public const string SUPPLIED_ATTRIBUTES = Util.FILE_ATTRIBUTES;
+
+ private const FileMonitorFlags FILE_MONITOR_FLAGS = FileMonitorFlags.SEND_MOVED;
+ private const uint DELETED_EXPIRATION_MSEC = 500;
+ private const int MAX_EXPLORATION_DIRS = 5;
+
+ private enum FType {
+ FILE,
+ DIRECTORY,
+ UNSUPPORTED
+ }
+
+ private class QueryInfoQueueElement {
+ private static uint current = 0;
+
+ public DirectoryMonitor owner;
+ public File file;
+ public File? other_file;
+ public FileMonitorEvent event;
+ public uint position;
+ public ulong time_created_msec;
+ public FileInfo? info = null;
+ public Error? err = null;
+ public bool completed = false;
+
+ public QueryInfoQueueElement(DirectoryMonitor owner, File file, File? other_file,
+ FileMonitorEvent event) {
+ this.owner = owner;
+ this.file = file;
+ this.other_file = other_file;
+ this.event = event;
+ this.position = current++;
+ this.time_created_msec = now_ms();
+ }
+
+ public void on_completed(Object? source, AsyncResult aresult) {
+ File source_file = (File) source;
+
+ // finish the async operation to get the result
+ try {
+ info = source_file.query_info_async.end(aresult);
+ } catch (Error err) {
+ this.err = err;
+ }
+
+ // mark as completed
+ completed = true;
+
+ // notify owner this job is finished, to process the queue
+ owner.process_query_queue(this);
+ }
+ }
+
+ // The FileInfoMap solves several related problems while maintaining FileInfo's in memory
+ // so they're available to users of DirectoryMonitor as well as DirectoryMonitor itself,
+ // which uses them to detect certain conditions. FileInfoMap uses a File ID to maintain
+ // only unique references to each File (and thus can be used to detect symlinked files).
+ private class FileInfoMap {
+ private Gee.HashMap<File, FileInfo> map = new Gee.HashMap<File, FileInfo>(file_hash,
+ file_equal);
+ private Gee.HashMap<string, File> id_map = new Gee.HashMap<string, File>(null, null,
+ file_equal);
+
+ public FileInfoMap() {
+ }
+
+ protected bool normalize_file(File file, FileInfo? info, out File normalized, out string id) {
+ // if no info is supplied, see if file straight-up corresponds .. if not, we're out of
+ // luck
+ FileInfo? local_info = info;
+ if (local_info == null) {
+ local_info = map.get(file);
+ if (local_info == null) {
+ normalized = null;
+ id = null;
+
+ return false;
+ }
+ }
+
+ string? file_id = get_file_info_id(local_info);
+ if (file_id == null) {
+ normalized = null;
+ id = null;
+
+ return false;
+ }
+
+ File? known_file = id_map.get(file_id);
+
+ id = (string) file_id;
+ normalized = (known_file != null) ? known_file : file;
+
+ return true;
+ }
+
+ public bool update(File file, FileInfo info) {
+ // if the file out-and-out exists, remove it now
+ if (map.has_key(file)) {
+ bool removed = map.unset(file);
+ assert(removed);
+ }
+
+ // if the id exists, remove it too
+ string? existing_id = get_file_info_id(info);
+ if (existing_id != null && id_map.has_key(existing_id)) {
+ bool removed = id_map.unset(existing_id);
+ assert(removed);
+ }
+
+ string id;
+ File normalized;
+ if (!normalize_file(file, info, out normalized, out id))
+ return false;
+
+ map.set(normalized, info);
+ id_map.set(id, normalized);
+
+ return true;
+ }
+
+ public bool remove(File file, FileInfo? info) {
+ string id;
+ File normalized;
+ if (!normalize_file(file, info, out normalized, out id))
+ return false;
+
+ map.unset(normalized);
+ id_map.unset(id);
+
+ return true;
+ }
+
+ // This calls the virtual function remove() for all files, so overriding it is sufficient
+ // (but not necessarily most efficient)
+ public void remove_all(Gee.Collection<File> files) {
+ foreach (File file in files)
+ remove(file, null);
+ }
+
+ public bool contains(File file, FileInfo? info) {
+ string id;
+ File normalized;
+ if (!normalize_file(file, info, out normalized, out id))
+ return false;
+
+ return id_map.has_key(id);
+ }
+
+ public string? get_id(File file, FileInfo? info) {
+ // if FileInfo is valid, easy pickings
+ if (info != null)
+ return get_file_info_id(info);
+
+ string id;
+ File normalized;
+ if (!normalize_file(file, null, out normalized, out id))
+ return null;
+
+ return id;
+ }
+
+ public Gee.Collection<File> get_all() {
+ return map.keys;
+ }
+
+ public FileInfo? get_info(File file) {
+ // if file is known as-is, use that
+ FileInfo? info = map.get(file);
+ if (info != null)
+ return info;
+
+ string id;
+ File normalized;
+ if (!normalize_file(file, null, out normalized, out id))
+ return null;
+
+ return map.get(normalized);
+ }
+
+ public FileInfo? query_info(File file, Cancellable? cancellable) {
+ FileInfo? info = get_info(file);
+ if (info != null)
+ return info;
+
+ // This *only* retrieves the file ID, which is then used to obtain the in-memory file
+ // information.
+ try {
+ info = file.query_info(FileAttribute.ID_FILE, UNKNOWN_INFO_FLAGS, cancellable);
+ } catch (Error err) {
+ warning("Unable to query file ID of %s: %s", file.get_path(), err.message);
+
+ return null;
+ }
+
+ if (!is_file_symlink_supported(info))
+ return null;
+
+ string? id = info.get_attribute_string(FileAttribute.ID_FILE);
+ if (id == null)
+ return null;
+
+ File? normalized = id_map.get(id);
+ if (normalized == null)
+ return null;
+
+ return map.get(file);
+ }
+
+ public File? find_match(FileInfo match) {
+ string? match_id = get_file_info_id(match);
+ if (match_id == null)
+ return null;
+
+ // get all the interesting matchable items from the supplied FileInfo
+ int64 match_size = match.get_size();
+ TimeVal match_time = match.get_modification_time();
+
+ foreach (File file in map.keys) {
+ FileInfo info = map.get(file);
+
+ // file id match is instant match
+ if (get_file_info_id(info) == match_id)
+ return file;
+
+ // if file size *and* modification time match, stop
+ if (match_size != info.get_size())
+ continue;
+
+ TimeVal time = info.get_modification_time();
+
+ if (time.tv_sec != match_time.tv_sec)
+ continue;
+
+ return file;
+ }
+
+ return null;
+ }
+
+ public void remove_descendents(File root, FileInfoMap descendents) {
+ Gee.ArrayList<File> pruned = null;
+ foreach (File file in map.keys) {
+ File? parent = file.get_parent();
+ while (parent != null) {
+ if (parent.equal(root)) {
+ if (pruned == null)
+ pruned = new Gee.ArrayList<File>();
+
+ pruned.add(file);
+ descendents.update(file, map.get(file));
+
+ break;
+ }
+
+ parent = parent.get_parent();
+ }
+ }
+
+ if (pruned != null)
+ remove_all(pruned);
+ }
+
+ // This returns only the immediate descendents of the root sorted by type. Returns the
+ // total number of children located.
+ public int get_children(File root, Gee.Collection<File> files, Gee.Collection<File> dirs) {
+ int count = 0;
+ foreach (File file in map.keys) {
+ File? parent = file.get_parent();
+ if (parent == null || !parent.equal(root))
+ continue;
+
+ FType ftype = get_ftype(map.get(file));
+ switch (ftype) {
+ case FType.FILE:
+ files.add(file);
+ count++;
+ break;
+
+ case FType.DIRECTORY:
+ dirs.add(file);
+ count++;
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ }
+
+ return count;
+ }
+ }
+
+ private File root;
+ private bool recurse;
+ private bool monitoring;
+ private Gee.HashMap<string, FileMonitor> monitors = new Gee.HashMap<string, FileMonitor>();
+ private Gee.Queue<QueryInfoQueueElement> query_info_queue = new Gee.LinkedList<
+ QueryInfoQueueElement>();
+ private FileInfoMap files = new FileInfoMap();
+ private FileInfoMap parent_moved = new FileInfoMap();
+ private Cancellable cancellable = new Cancellable();
+ private int outstanding_exploration_dirs = 0;
+ private bool started = false;
+ private bool has_discovery_started = false;
+ private uint delete_timer_id = 0;
+
+ // This signal will be fired *after* directory-moved has been fired.
+ public virtual signal void root_moved(File old_root, File new_root, FileInfo new_root_info) {
+ }
+
+ // If the root is deleted, then the DirectoryMonitor is essentially dead; it has no monitor
+ // to wait for the root to be re-created, and everything beneath the root is obviously blown
+ // away as well.
+ //
+ // This signal will be fired *after* directory-deleted has been fired.
+ public virtual signal void root_deleted(File root) {
+ }
+
+ public virtual signal void discovery_started() {
+ }
+
+ public virtual signal void file_discovered(File file, FileInfo info) {
+ }
+
+ public virtual signal void directory_discovered(File file, FileInfo info) {
+ }
+
+ // reason is a user-visible string. May be called more than once during discovery.
+ // Discovery always completes with discovery-completed.
+ public virtual signal void discovery_failed(string reason) {
+ }
+
+ public virtual signal void discovery_completed() {
+ has_discovery_started = false;
+ mdbg("discovery completed");
+ }
+
+ public virtual signal void file_created(File file, FileInfo info) {
+ }
+
+ public virtual signal void file_moved(File old_file, File new_file, FileInfo new_file_info) {
+ }
+
+ // FileInfo is not updated for each file-altered signal.
+ public virtual signal void file_altered(File file) {
+ }
+
+ // This is called when the monitor detects that alteration (attributes or otherwise) to the
+ // file has completed.
+ public virtual signal void file_alteration_completed(File file, FileInfo info) {
+ }
+
+ public virtual signal void file_attributes_altered(File file) {
+ }
+
+ public virtual signal void file_deleted(File file) {
+ }
+
+ // This implies that the directory is now being monitored.
+ public virtual signal void directory_created(File dir, FileInfo info) {
+ }
+
+ // This implies that the old directory is no longer being monitored and the new one is.
+ public virtual signal void directory_moved(File old_dir, File new_dir, FileInfo new_dir_info) {
+ }
+
+ // FileInfo is not updated for each directory-altered signal.
+ public virtual signal void directory_altered(File dir) {
+ }
+
+ // This is called when the monitor detects that alteration (attributes or otherwise) to the
+ // directory has completed.
+ public virtual signal void directory_alteration_completed(File dir, FileInfo info) {
+ }
+
+ public virtual signal void directory_attributes_altered(File dir) {
+ }
+
+ // This implies that the directory is now no longer be monitored (unsurprisingly).
+ public virtual signal void directory_deleted(File dir) {
+ }
+
+ public virtual signal void closed() {
+ }
+
+ public DirectoryMonitor(File root, bool recurse, bool monitoring) {
+ this.root = root;
+ this.recurse = recurse;
+ this.monitoring = monitoring;
+ }
+
+ protected static void mdbg(string msg) {
+#if TRACE_MONITORING
+ debug("%s", msg);
+#endif
+ }
+
+ public bool is_recursive() {
+ return recurse;
+ }
+
+ public bool is_monitoring() {
+ return monitoring;
+ }
+
+ protected virtual void notify_root_deleted(File root) {
+ assert(this.root.equal(root));
+
+ mdbg("root deleted");
+ root_deleted(root);
+ }
+
+ private void internal_notify_root_moved(File old_root, File new_root, FileInfo new_root_info) {
+ bool removed = files.remove(old_root, null);
+ assert(removed);
+
+ bool updated = files.update(new_root, new_root_info);
+ assert(updated);
+
+ root = new_root;
+
+ notify_root_moved(old_root, new_root, new_root_info);
+ }
+
+ protected virtual void notify_root_moved(File old_root, File new_root, FileInfo new_root_info) {
+ assert(this.root.equal(old_root));
+
+ mdbg("root moved: %s -> %s".printf(old_root.get_path(), new_root.get_path()));
+ root_moved(old_root, new_root, new_root_info);
+ }
+
+ protected virtual void notify_discovery_started() {
+ mdbg("discovery started");
+ discovery_started();
+ }
+
+ protected virtual void internal_notify_file_discovered(File file, FileInfo info) {
+ if (!files.update(file, info)) {
+ debug("DirectoryMonitor.internal_notify_file_discovered: %s discovered but not added to file map",
+ file.get_path());
+
+ return;
+ }
+
+ notify_file_discovered(file, info);
+ }
+
+ protected virtual void notify_file_discovered(File file, FileInfo info) {
+ mdbg("file discovered: %s".printf(file.get_path()));
+ file_discovered(file, info);
+ }
+
+ protected virtual void internal_notify_directory_discovered(File dir, FileInfo info) {
+ bool updated = files.update(dir, info);
+ assert(updated);
+
+ notify_directory_discovered(dir, info);
+ }
+
+ protected virtual void notify_directory_discovered(File dir, FileInfo info) {
+ mdbg("directory discovered: %s".printf(dir.get_path()));
+ directory_discovered(dir, info);
+ }
+
+ protected virtual void notify_discovery_failed(string reason) {
+ warning("discovery failed: %s", reason);
+ discovery_failed(reason);
+ }
+
+ protected virtual void notify_discovery_completed() {
+ discovery_completed();
+ }
+
+ private void internal_notify_file_created(File file, FileInfo info) {
+ File old_file;
+ FileInfo old_file_info;
+ if (is_file_create_move(file, info, out old_file, out old_file_info)) {
+ internal_notify_file_moved(old_file, file, info);
+ } else {
+ bool updated = files.update(file, info);
+ assert(updated);
+
+ notify_file_created(file, info);
+ }
+ }
+
+ protected virtual void notify_file_created(File file, FileInfo info) {
+ mdbg("file created: %s".printf(file.get_path()));
+ file_created(file, info);
+ }
+
+ private void internal_notify_file_moved(File old_file, File new_file, FileInfo new_file_info) {
+ // don't assert because it's possible this call was generated via a deleted-created
+ // sequence, in which case the old_file won't be in files
+ files.remove(old_file, null);
+
+ bool updated = files.update(new_file, new_file_info);
+ assert(updated);
+
+ notify_file_moved(old_file, new_file, new_file_info);
+ }
+
+ protected virtual void notify_file_moved(File old_file, File new_file, FileInfo new_file_info) {
+ mdbg("file moved: %s -> %s".printf(old_file.get_path(), new_file.get_path()));
+ file_moved(old_file, new_file, new_file_info);
+ }
+
+ protected virtual void notify_file_altered(File file) {
+ mdbg("file altered: %s".printf(file.get_path()));
+ file_altered(file);
+ }
+
+ private void internal_notify_file_alteration_completed(File file, FileInfo info) {
+ bool updated = files.update(file, info);
+ assert(updated);
+
+ notify_file_alteration_completed(file, info);
+ }
+
+ protected virtual void notify_file_alteration_completed(File file, FileInfo info) {
+ mdbg("file alteration completed: %s".printf(file.get_path()));
+ file_alteration_completed(file, info);
+ }
+
+ protected virtual void notify_file_attributes_altered(File file) {
+ mdbg("file attributes altered: %s".printf(file.get_path()));
+ file_attributes_altered(file);
+ }
+
+ private void internal_notify_file_deleted(File file) {
+ bool removed = files.remove(file, null);
+ assert(removed);
+
+ notify_file_deleted(file);
+ }
+
+ protected virtual void notify_file_deleted(File file) {
+ mdbg("file deleted: %s".printf(file.get_path()));
+ file_deleted(file);
+ }
+
+ private void internal_notify_directory_created(File dir, FileInfo info) {
+ File old_dir;
+ FileInfo old_dir_info;
+ if (is_file_create_move(dir, info, out old_dir, out old_dir_info)) {
+ // A directory move, like a file move, is actually a directory-deleted followed
+ // by a directory-created. Unlike a file move, what follows directory-created
+ // is a file/directory-created for each file and directory inside the folder
+ // (although the matching deletes are never fired). We want to issue moves for
+ // all those files as well and suppress the create calls.
+ files.remove_descendents(old_dir, parent_moved);
+
+ internal_notify_directory_moved(old_dir, old_dir_info, dir, info);
+ } else {
+ bool updated = files.update(dir, info);
+ assert(updated);
+
+ notify_directory_created(dir, info);
+ }
+ }
+
+ protected virtual void notify_directory_created(File dir, FileInfo info) {
+ mdbg("directory created: %s".printf(dir.get_path()));
+ directory_created(dir, info);
+ }
+
+ private void internal_notify_directory_moved(File old_dir, FileInfo old_dir_info, File new_dir,
+ FileInfo new_dir_info) {
+ async_internal_notify_directory_moved.begin(old_dir, old_dir_info, new_dir, new_dir_info);
+ }
+
+ private async void async_internal_notify_directory_moved(File old_dir, FileInfo old_dir_info,
+ File new_dir, FileInfo new_dir_info) {
+ Gee.ArrayList<File> file_children = new Gee.ArrayList<File>(file_equal);
+ Gee.ArrayList<File> dir_children = new Gee.ArrayList<File>(file_equal);
+ int count = files.get_children(old_dir, file_children, dir_children);
+ if (count > 0) {
+ // descend into directories and let them notify their children on the way up
+ // (if files.get_info() returns null, that indicates the directory/file was already
+ // deleted in recurse)
+ foreach (File dir_child in dir_children) {
+ FileInfo? dir_info = files.get_info(dir_child);
+ if (dir_info == null) {
+ warning("Unable to retrieve directory-moved info for %s", dir_child.get_path());
+
+ continue;
+ }
+
+ yield async_internal_notify_directory_moved(dir_child, dir_info,
+ new_dir.get_child(dir_child.get_basename()), dir_info);
+ }
+
+ // then move the children
+ foreach (File file_child in file_children) {
+ FileInfo? file_info = files.get_info(file_child);
+ if (file_info == null) {
+ warning("Unable to retrieve directory-moved info for %s", file_child.get_path());
+
+ continue;
+ }
+
+ internal_notify_file_moved(file_child, new_dir.get_child(file_child.get_basename()),
+ file_info);
+
+ Idle.add(async_internal_notify_directory_moved.callback, DEFAULT_PRIORITY);
+ yield;
+ }
+ }
+
+ // Don't assert here because it's possible this call was made due to a deleted-created
+ // sequence, in which case the directory has already been removed from files
+ files.remove(old_dir, null);
+
+ bool updated = files.update(new_dir, new_dir_info);
+ assert(updated);
+
+ // remove the old monitor and add the new one
+ remove_monitor(old_dir, old_dir_info);
+ add_monitor(new_dir, new_dir_info);
+
+ notify_directory_moved(old_dir, new_dir, new_dir_info);
+ }
+
+ protected virtual void notify_directory_moved(File old_dir, File new_dir, FileInfo new_dir_info) {
+ mdbg("directory moved: %s -> %s".printf(old_dir.get_path(), new_dir.get_path()));
+ directory_moved(old_dir, new_dir, new_dir_info);
+
+ if (old_dir.equal(root))
+ internal_notify_root_moved(old_dir, new_dir, new_dir_info);
+ }
+
+ protected virtual void notify_directory_altered(File dir) {
+ mdbg("directory altered: %s".printf(dir.get_path()));
+ directory_altered(dir);
+ }
+
+ private void internal_notify_directory_alteration_completed(File dir, FileInfo info) {
+ bool updated = files.update(dir, info);
+ assert(updated);
+
+ notify_directory_alteration_completed(dir, info);
+ }
+
+ protected virtual void notify_directory_alteration_completed(File dir, FileInfo info) {
+ mdbg("directory alteration completed: %s".printf(dir.get_path()));
+ directory_alteration_completed(dir, info);
+ }
+
+ protected virtual void notify_directory_attributes_altered(File dir) {
+ mdbg("directory attributes altered: %s".printf(dir.get_path()));
+ directory_attributes_altered(dir);
+ }
+
+ private void internal_notify_directory_deleted(File dir) {
+ FileInfo? info = files.get_info(dir);
+ assert(info != null);
+
+ // stop monitoring this directory
+ remove_monitor(dir, info);
+
+ async_notify_directory_deleted.begin(dir, false);
+ }
+
+ private async void async_notify_directory_deleted(File dir, bool already_removed) {
+ // Note that in this function no assertion checking is done ... there are many
+ // reasons a deleted file may not be known to the internal bookkeeping; if
+ // the file is gone and we didn't know about it, then it's no problem.
+
+ // because a directory can be deleted without its children being deleted first (probably
+ // means it has been moved to a location outside of the monitored root), need to
+ // synthesize notifications for all its children
+ Gee.ArrayList<File> file_children = new Gee.ArrayList<File>(file_equal);
+ Gee.ArrayList<File> dir_children = new Gee.ArrayList<File>(file_equal);
+ int count = files.get_children(dir, file_children, dir_children);
+ if (count > 0) {
+ // don't use internal_* variants as they deal with "real" and not synthesized
+ // notifications. also note that files.get_info() can return null because items are
+ // being deleted on the way back up the tree ... when files.get_info() returns null,
+ // it means the file/directory was already deleted in a recursed method, and so no
+ // assertions on them
+
+ // descend first into directories, deleting files and directories on the way up
+ foreach (File dir_child in dir_children)
+ yield async_notify_directory_deleted(dir_child, false);
+
+ // now notify deletions on all immediate children files ... don't notify directory
+ // deletion because that's handled right before exiting this method
+ foreach (File file_child in file_children) {
+ files.remove(file_child, null);
+
+ notify_file_deleted(file_child);
+
+ Idle.add(async_notify_directory_deleted.callback, DEFAULT_PRIORITY);
+ yield;
+ }
+ }
+
+ if (!already_removed)
+ files.remove(dir, null);
+
+ notify_directory_deleted(dir);
+ }
+
+ protected virtual void notify_directory_deleted(File dir) {
+ mdbg("directory deleted: %s".printf(dir.get_path()));
+ directory_deleted(dir);
+
+ if (dir.equal(root))
+ notify_root_deleted(dir);
+ }
+
+ protected virtual void notify_closed() {
+ mdbg("monitoring of %s closed".printf(root.get_path()));
+ closed();
+ }
+
+ public File get_root() {
+ return root;
+ }
+
+ public bool is_in_root(File file) {
+ return file.has_prefix(root);
+ }
+
+ public bool has_started() {
+ return started;
+ }
+
+ public void start_discovery() {
+ assert(!started);
+
+ has_discovery_started = true;
+ started = true;
+
+ notify_discovery_started();
+
+ // start exploring the directory, adding monitors as the directories are discovered
+ outstanding_exploration_dirs = 1;
+ explore_async.begin(root, null, true);
+ }
+
+ // This should be called when a DirectoryMonitor needs to be destroyed or released. This
+ // will halt background exploration and close all resources.
+ public virtual void close() {
+ // cancel any outstanding async I/O
+ cancellable.cancel();
+
+ // cancel all monitors
+ foreach (FileMonitor monitor in monitors.values)
+ cancel_monitor(monitor);
+
+ monitors.clear();
+
+ notify_closed();
+ }
+
+ private static FType get_ftype(FileInfo info) {
+ FileType file_type = info.get_file_type();
+ switch (file_type) {
+ case FileType.REGULAR:
+ return FType.FILE;
+
+ case FileType.DIRECTORY:
+ return FType.DIRECTORY;
+
+ default:
+ mdbg("query_ftype: Unknown file type %s".printf(file_type.to_string()));
+ return FType.UNSUPPORTED;
+ }
+ }
+
+ private async void explore_async(File dir, FileInfo? dir_info, bool in_discovery) {
+ if (files.contains(dir, dir_info)) {
+ warning("Directory loop detected at %s, not exploring", dir.get_path());
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+
+ // if FileInfo wasn't supplied by caller, fetch it now
+ FileInfo? local_dir_info = dir_info;
+ if (local_dir_info == null) {
+ try {
+ local_dir_info = yield dir.query_info_async(SUPPLIED_ATTRIBUTES, DIR_INFO_FLAGS,
+ DEFAULT_PRIORITY, cancellable);
+ } catch (Error err) {
+ warning("Unable to retrieve info on %s: %s", dir.get_path(), err.message);
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+ }
+
+ if (local_dir_info.get_is_hidden()) {
+ warning("Ignoring hidden directory %s", dir.get_path());
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+
+ // File ID is required for directory monitoring. No ID, no ride!
+ // TODO: Replace the warning with notify_discovery_failed() and provide a user-visible
+ // string.
+ if (get_file_info_id(local_dir_info) == null) {
+ warning("Unable to retrieve file ID on %s: skipping", dir.get_path());
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+
+ // verify this is a directory
+ if (local_dir_info.get_file_type() != FileType.DIRECTORY) {
+ notify_discovery_failed(_("Unable to monitor %s: Not a directory (%s)").printf(
+ dir.get_path(), local_dir_info.get_file_type().to_string()));
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+
+ // collect all directories and files in the directory, to consolidate reporting them as
+ // well as traversing the subdirectories -- but to avoid a lot of unnecessary resource
+ // allocations (think empty directories, or leaf nodes with only files), only allocate
+ // the maps when necessary
+ Gee.HashMap<File, FileInfo> dir_map = null;
+ Gee.HashMap<File, FileInfo> file_map = null;
+
+ try {
+ FileEnumerator enumerator = yield dir.enumerate_children_async(SUPPLIED_ATTRIBUTES,
+ UNKNOWN_INFO_FLAGS, DEFAULT_PRIORITY, cancellable);
+ for (;;) {
+ List<FileInfo>? infos = yield enumerator.next_files_async(10, DEFAULT_PRIORITY,
+ cancellable);
+ if (infos == null)
+ break;
+
+ foreach (FileInfo info in infos) {
+ // we don't deal with hidden files or directories
+ if (info.get_is_hidden()) {
+ warning("Skipping hidden file/directory %s",
+ dir.get_child(info.get_name()).get_path());
+
+ continue;
+ }
+
+ // check for symlink support
+ if (!is_file_symlink_supported(info))
+ continue;
+
+ switch (info.get_file_type()) {
+ case FileType.REGULAR:
+ if (file_map == null)
+ file_map = new Gee.HashMap<File, FileInfo>(file_hash, file_equal);
+
+ file_map.set(dir.get_child(info.get_name()), info);
+ break;
+
+ case FileType.DIRECTORY:
+ if (dir_map == null)
+ dir_map = new Gee.HashMap<File, FileInfo>(file_hash, file_equal);
+
+ dir_map.set(dir.get_child(info.get_name()), info);
+ break;
+
+ default:
+ // ignored
+ break;
+ }
+ }
+ }
+ } catch (Error err2) {
+ warning("Aborted directory traversal of %s: %s", dir.get_path(), err2.message);
+
+ explore_directory_completed(in_discovery);
+
+ return;
+ }
+
+ // report the local (caller-supplied) directory as discovered *before* reporting its files
+ if (in_discovery)
+ internal_notify_directory_discovered(dir, local_dir_info);
+ else
+ internal_notify_directory_created(dir, local_dir_info);
+
+ // now with everything snarfed up and the directory reported as discovered, begin
+ // monitoring the directory
+ add_monitor(dir, local_dir_info);
+
+ // report files in local directory
+ if (file_map != null)
+ yield notify_directory_files(file_map, in_discovery);
+
+ // post all the subdirectory traversals, allowing them to report themselves as discovered
+ if (recurse && dir_map != null) {
+ foreach (File subdir in dir_map.keys) {
+ if (++outstanding_exploration_dirs > MAX_EXPLORATION_DIRS)
+ yield explore_async(subdir, dir_map.get(subdir), in_discovery);
+ else
+ explore_async.begin(subdir, dir_map.get(subdir), in_discovery);
+ }
+ }
+
+ explore_directory_completed(in_discovery);
+ }
+
+ private async void notify_directory_files(Gee.Map<File, FileInfo> map, bool in_discovery) {
+ Gee.MapIterator<File, FileInfo> iter = map.map_iterator();
+ while (iter.next()) {
+ if (in_discovery)
+ internal_notify_file_discovered(iter.get_key(), iter.get_value());
+ else
+ internal_notify_file_created(iter.get_key(), iter.get_value());
+
+ Idle.add(notify_directory_files.callback, DEFAULT_PRIORITY);
+ yield;
+ }
+ }
+
+ // called whenever exploration of a directory is completed, to know when to signal that
+ // discovery has ended
+ private void explore_directory_completed(bool in_discovery) {
+ assert(outstanding_exploration_dirs > 0);
+ outstanding_exploration_dirs--;
+
+ if (in_discovery && outstanding_exploration_dirs == 0)
+ notify_discovery_completed();
+ }
+
+ // Only submit directories ... file monitoring is wasteful when a single directory monitor can
+ // do all the work. Returns true if monitor added, false if already monitored (or not
+ // monitoring, or unable to monitor due to error).
+ private bool add_monitor(File dir, FileInfo info) {
+ if (!monitoring)
+ return false;
+
+ string? id = files.get_id(dir, info);
+ if (id == null)
+ return false;
+
+ // if one already exists, nop
+ if (monitors.has_key(id))
+ return false;
+
+ FileMonitor monitor = null;
+ try {
+ monitor = dir.monitor_directory(FILE_MONITOR_FLAGS, null);
+ } catch (Error err) {
+ warning("Unable to monitor %s: %s", dir.get_path(), err.message);
+
+ return false;
+ }
+
+ monitors.set(id, monitor);
+ monitor.changed.connect(on_monitor_notification);
+
+ mdbg("Added monitor for %s".printf(dir.get_path()));
+
+ return true;
+ }
+
+ // Returns true if the directory is removed (i.e. was being monitored).
+ private bool remove_monitor(File dir, FileInfo info) {
+ if (!monitoring)
+ return false;
+
+ string? id = files.get_id(dir, info);
+ if (id == null)
+ return false;
+
+ FileMonitor? monitor = monitors.get(id);
+ if (monitor == null)
+ return false;
+
+ bool removed = monitors.unset(id);
+ assert(removed);
+
+ cancel_monitor(monitor);
+
+ mdbg("Removed monitor for %s".printf(dir.get_path()));
+
+ return true;
+ }
+
+ private void cancel_monitor(FileMonitor monitor) {
+ monitor.changed.disconnect(on_monitor_notification);
+ monitor.cancel();
+ }
+
+ private void on_monitor_notification(File file, File? other_file, FileMonitorEvent event) {
+ mdbg("NOTIFY %s: file=%s other_file=%s".printf(event.to_string(), file.get_path(),
+ other_file != null ? other_file.get_path() : "(none)"));
+
+ // The problem: Having basic file information about each file is valuable (and necessary
+ // in certain situations), but it is a blocking operation, no matter how "quick" it
+ // may seem. Async I/O is perfect to handle this, but it can complete out of order, and
+ // it's highly desirous to report events in the same order they're received. FileInfo
+ // queries are queued up then and processed in order as they're completed.
+
+ // Every event needs to be queued, but not all events generates query I/O
+ QueryInfoQueueElement query_info = new QueryInfoQueueElement(this, file, other_file, event);
+ query_info_queue.offer(query_info);
+
+ switch (event) {
+ case FileMonitorEvent.CREATED:
+ case FileMonitorEvent.CHANGES_DONE_HINT:
+ file.query_info_async.begin(SUPPLIED_ATTRIBUTES, UNKNOWN_INFO_FLAGS,
+ DEFAULT_PRIORITY, cancellable, query_info.on_completed);
+ break;
+
+ case FileMonitorEvent.DELETED:
+ // don't complete it yet, it might be followed by a CREATED event indicating a
+ // move ... instead, let it sit on the queue and allow the timer (or a coming
+ // CREATED event) complete it
+ if (delete_timer_id == 0)
+ delete_timer_id = Timeout.add(DELETED_EXPIRATION_MSEC / 2, check_for_expired_delete_events);
+ break;
+
+ case FileMonitorEvent.MOVED:
+ // unlike the others, other_file is the destination of the move, and therefore the
+ // one we need to get info on
+ if (other_file != null) {
+ other_file.query_info_async.begin(SUPPLIED_ATTRIBUTES, UNKNOWN_INFO_FLAGS,
+ DEFAULT_PRIORITY, cancellable, query_info.on_completed);
+ } else {
+ warning("Unable to process MOVED event: no other_file");
+ query_info_queue.remove(query_info);
+ }
+ break;
+
+ default:
+ // artificially complete it
+ query_info.completed = true;
+ process_query_queue(query_info);
+ break;
+ }
+ }
+
+ private void process_query_queue(QueryInfoQueueElement? query_info) {
+ // if the completed element was a CREATE event, attempt to match it to a DELETE (which
+ // then converts into a MOVED) and remove the CREATE event
+ if (query_info != null && query_info.info != null && query_info.event == FileMonitorEvent.CREATED) {
+ // if there's no match in the files table for this created file, then it can't be
+ // matched to a previously deleted file
+ File? match = files.find_match(query_info.info);
+ if (match != null) {
+ bool matched = false;
+ foreach (QueryInfoQueueElement enqueued in query_info_queue) {
+ if (enqueued.event != FileMonitorEvent.DELETED
+ || enqueued.completed
+ || !match.equal(enqueued.file)) {
+ continue;
+ }
+
+ mdbg("Matching CREATED %s to DELETED %s for MOVED".printf(query_info.file.get_path(),
+ enqueued.file.get_path()));
+
+ enqueued.event = FileMonitorEvent.MOVED;
+ enqueued.other_file = query_info.file;
+ enqueued.info = query_info.info;
+ enqueued.completed = true;
+
+ matched = true;
+
+ break;
+ }
+
+ if (matched)
+ query_info_queue.remove(query_info);
+ }
+ }
+
+ // peel off completed events from the queue in order
+ for (;;) {
+ // check if empty or waiting for completion on the next event
+ QueryInfoQueueElement? next = query_info_queue.peek();
+ if (next == null || !next.completed)
+ break;
+
+ // remove
+ QueryInfoQueueElement? n = query_info_queue.poll();
+ assert(next == n);
+
+ mdbg("Completed info query %u for %s on %s".printf(next.position, next.event.to_string(),
+ next.file.get_path()));
+
+ if (next.err != null) {
+ mdbg("Unable to retrieve file information for %s, dropping %s: %s".printf(
+ next.file.get_path(), next.event.to_string(), next.err.message));
+
+ continue;
+ }
+
+ // Directory monitoring requires file ID. No ID, no ride!
+ if (next.info != null && get_file_info_id(next.info) == null) {
+ mdbg("Unable to retrieve file ID for %s, dropping %s".printf(next.file.get_path(),
+ next.event.to_string()));
+
+ continue;
+ }
+
+ // watch for symlink support
+ if (next.info != null && !is_file_symlink_supported(next.info)) {
+ mdbg("No symlink support for %s, dropping %s".printf(next.file.get_path(),
+ next.event.to_string()));
+
+ continue;
+ }
+
+ on_monitor_notification_ready(next.file, next.other_file, next.info, next.event);
+ }
+ }
+
+ private void on_monitor_notification_ready(File file, File? other_file, FileInfo? info,
+ FileMonitorEvent event) {
+ mdbg("READY %s: file=%s other_file=%s".printf(event.to_string(), file.get_path(),
+ other_file != null ? other_file.get_path() : "(null)"));
+
+ // Nasty, nasty switches-in-a-switch construct, but this demuxes the possibilities into
+ // easily digestible upcalls and signals
+ switch (event) {
+ case FileMonitorEvent.CREATED:
+ assert(info != null);
+
+ FType ftype = get_ftype(info);
+ switch (ftype) {
+ case FType.FILE:
+ internal_notify_file_created(file, info);
+ break;
+
+ case FType.DIRECTORY:
+ // other files may have been created under this new directory before we have
+ // a chance to register a monitor, so scan it now looking for new additions
+ // (this call will notify of creation and monitor this new directory once
+ // it's been scanned)
+ outstanding_exploration_dirs++;
+ explore_async.begin(file, info, false);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.CHANGED:
+ // don't query info for each change, but only when done hint comes down the pipe
+ assert(info == null);
+
+ FileInfo local_info = get_file_info(file);
+ if (local_info == null) {
+ mdbg("Changed event for unknown file %s".printf(file.get_path()));
+
+ break;
+ }
+
+ FType ftype = get_ftype(local_info);
+ switch (ftype) {
+ case FType.FILE:
+ notify_file_altered(file);
+ break;
+
+ case FType.DIRECTORY:
+ notify_directory_altered(file);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.CHANGES_DONE_HINT:
+ assert(info != null);
+
+ FType ftype = get_ftype(info);
+ switch (ftype) {
+ case FType.FILE:
+ internal_notify_file_alteration_completed(file, info);
+ break;
+
+ case FType.DIRECTORY:
+ internal_notify_directory_alteration_completed(file, info);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.MOVED:
+ assert(info != null);
+ assert(other_file != null);
+
+ // in the moved case, file info is for other file (the destination in the move
+ // operation)
+ FType ftype = get_ftype(info);
+ switch (ftype) {
+ case FType.FILE:
+ internal_notify_file_moved(file, other_file, info);
+ break;
+
+ case FType.DIRECTORY:
+ // get the old FileInfo (contained in files)
+ FileInfo? old_dir_info = files.get_info(file);
+ if (old_dir_info == null) {
+ warning("Directory moved event for unknown file %s", file.get_path());
+
+ break;
+ }
+
+ internal_notify_directory_moved(file, old_dir_info, other_file, info);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.DELETED:
+ assert(info == null);
+
+ FileInfo local_info = get_file_info(file);
+ if (local_info == null) {
+ warning("Deleted event for unknown file %s", file.get_path());
+
+ break;
+ }
+
+ FType ftype = get_ftype(local_info);
+ switch (ftype) {
+ case FType.FILE:
+ internal_notify_file_deleted(file);
+ break;
+
+ case FType.DIRECTORY:
+ internal_notify_directory_deleted(file);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.ATTRIBUTE_CHANGED:
+ // doesn't fetch attributes until CHANGES_DONE_HINT comes down the pipe
+ assert(info == null);
+
+ FileInfo local_info = get_file_info(file);
+ if (local_info == null) {
+ warning("Attribute changed event for unknown file %s", file.get_path());
+
+ break;
+ }
+
+ FType ftype = get_ftype(local_info);
+ switch (ftype) {
+ case FType.FILE:
+ notify_file_attributes_altered(file);
+ break;
+
+ case FType.DIRECTORY:
+ notify_directory_attributes_altered(file);
+ break;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+ break;
+ }
+ break;
+
+ case FileMonitorEvent.PRE_UNMOUNT:
+ case FileMonitorEvent.UNMOUNTED:
+ // not currently handling these events
+ break;
+
+ default:
+ warning("Unknown directory monitor event %s", event.to_string());
+ break;
+ }
+ }
+
+ // Returns true if a move occurred. Internal state is modified to recognize the
+ // situation (i.e. the move should be reported).
+ private bool is_file_create_move(File file, FileInfo info, out File old_file,
+ out FileInfo old_file_info) {
+ // look for created file whose parent was actually moved
+ File? match = parent_moved.find_match(info);
+ if (match != null) {
+ old_file = match;
+ old_file_info = parent_moved.get_info(match);
+
+ parent_moved.remove(match, info);
+
+ return true;
+ }
+
+ old_file = null;
+ old_file_info = null;
+
+ return false;
+ }
+
+ private bool check_for_expired_delete_events() {
+ ulong expiration = now_ms() - DELETED_EXPIRATION_MSEC;
+
+ bool any_deleted = false;
+ bool any_expired = false;
+ foreach (QueryInfoQueueElement element in query_info_queue) {
+ if (element.event != FileMonitorEvent.DELETED)
+ continue;
+
+ any_deleted = true;
+
+ if (element.time_created_msec > expiration)
+ continue;
+
+ // synthesize the completion
+ element.completed = true;
+ any_expired = true;
+ }
+
+ if (any_expired)
+ process_query_queue(null);
+
+ if (!any_deleted)
+ delete_timer_id = 0;
+
+ return any_deleted;
+ }
+
+ // This method does its best to return FileInfo for the file. It performs no I/O.
+ public FileInfo? get_file_info(File file) {
+ return files.get_info(file);
+ }
+
+ // This method returns all files and directories that the DirectoryMonitor knows of. This
+ // call is only useful when runtime monitoring is enabled. It performs no I/O.
+ public Gee.Collection<File> get_files() {
+ return files.get_all();
+ }
+
+ // This method will attempt to find the in-memory FileInfo for the file, but if it cannot
+ // be found it will query the file for it's ID and obtain in-memory file information from
+ // there.
+ public FileInfo? query_file_info(File file) {
+ return files.query_info(file, cancellable);
+ }
+
+ // This checks if the FileInfo is for a symlinked file/directory and if symlinks for the file
+ // type are supported by DirectoryMonitor. Note that this requires the FileInfo have support
+ // for the "standard::is-symlink" and "standard::type" file attributes, which SUPPLIED_ATTRIBUTES
+ // provides.
+ //
+ // Returns true if the file is not a symlink or if symlinks are supported for the file type,
+ // false otherwise. If an unsupported file type, returns false.
+ public static bool is_file_symlink_supported(FileInfo info) {
+ if (!info.get_is_symlink())
+ return true;
+
+ FType ftype = get_ftype(info);
+ switch (ftype) {
+ case FType.DIRECTORY:
+ return SUPPORT_DIR_SYMLINKS;
+
+ case FType.FILE:
+ return SUPPORT_FILE_SYMLINKS;
+
+ default:
+ assert(ftype == FType.UNSUPPORTED);
+
+ return false;
+ }
+ }
+}
+
diff --git a/src/Event.vala b/src/Event.vala
new file mode 100644
index 0000000..ed0af76
--- /dev/null
+++ b/src/Event.vala
@@ -0,0 +1,924 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class EventSourceCollection : ContainerSourceCollection {
+ public signal void no_event_collection_altered();
+
+ private ViewCollection no_event;
+
+ private class NoEventViewManager : ViewManager {
+ public override bool include_in_view(DataSource source) {
+ // Note: this is not threadsafe
+ return (((MediaSource) source).get_event_id().id != EventID.INVALID) ? false :
+ base.include_in_view(source);
+ }
+
+ public override DataView create_view(DataSource source) {
+ return new ThumbnailView((MediaSource) source);
+ }
+ }
+
+ public EventSourceCollection() {
+ base(Event.TYPENAME, "EventSourceCollection", get_event_key);
+
+ attach_collection(LibraryPhoto.global);
+ attach_collection(Video.global);
+ }
+
+ public void init() {
+ no_event = new ViewCollection("No Event View Collection");
+
+ NoEventViewManager view_manager = new NoEventViewManager();
+ Alteration filter_alteration = new Alteration("metadata", "event");
+
+ no_event.monitor_source_collection(LibraryPhoto.global, view_manager, filter_alteration);
+ no_event.monitor_source_collection(Video.global, view_manager, filter_alteration);
+
+ no_event.contents_altered.connect(on_no_event_collection_altered);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is Event;
+ }
+
+ private static int64 get_event_key(DataSource source) {
+ Event event = (Event) source;
+ EventID event_id = event.get_event_id();
+
+ return event_id.id;
+ }
+
+ public Event? fetch(EventID event_id) {
+ return (Event) fetch_by_key(event_id.id);
+ }
+
+ protected override Gee.Collection<ContainerSource>? get_containers_holding_source(DataSource source) {
+ Event? event = ((MediaSource) source).get_event();
+ if (event == null)
+ return null;
+
+ Gee.ArrayList<ContainerSource> list = new Gee.ArrayList<ContainerSource>();
+ list.add(event);
+
+ return list;
+ }
+
+ protected override ContainerSource? convert_backlink_to_container(SourceBacklink backlink) {
+ EventID event_id = EventID(backlink.instance_id);
+
+ Event? event = fetch(event_id);
+ if (event != null)
+ return event;
+
+ foreach (ContainerSource container in get_holding_tank()) {
+ if (((Event) container).get_event_id().id == event_id.id)
+ return container;
+ }
+
+ return null;
+ }
+
+ public Gee.Collection<DataObject> get_no_event_objects() {
+ return no_event.get_sources();
+ }
+
+ private void on_no_event_collection_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ no_event_collection_altered();
+ }
+}
+
+public class Event : EventSource, ContainerSource, Proxyable, Indexable {
+ public const string TYPENAME = "event";
+
+ // SHOW_COMMENTS (bool)
+ public const string PROP_SHOW_COMMENTS = "show-comments";
+
+ // In 24-hour time.
+ public const int EVENT_BOUNDARY_HOUR = 4;
+
+ private const time_t TIME_T_DAY = 24 * 60 * 60;
+
+ private class EventSnapshot : SourceSnapshot {
+ private EventRow row;
+ private MediaSource primary_source;
+ private Gee.ArrayList<MediaSource> attached_sources = new Gee.ArrayList<MediaSource>();
+
+ public EventSnapshot(Event event) {
+ // save current state of event
+ row = EventTable.get_instance().get_row(event.get_event_id());
+ primary_source = event.get_primary_source();
+
+ // stash all the media sources in the event ... these are not used when reconstituting
+ // the event, but need to know when they're destroyed, as that means the event cannot
+ // be restored
+ foreach (MediaSource source in event.get_media())
+ attached_sources.add(source);
+
+ LibraryPhoto.global.item_destroyed.connect(on_attached_source_destroyed);
+ Video.global.item_destroyed.connect(on_attached_source_destroyed);
+ }
+
+ ~EventSnapshot() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_attached_source_destroyed);
+ Video.global.item_destroyed.disconnect(on_attached_source_destroyed);
+ }
+
+ public EventRow get_row() {
+ return row;
+ }
+
+ public override void notify_broken() {
+ row = new EventRow();
+ primary_source = null;
+ attached_sources.clear();
+
+ base.notify_broken();
+ }
+
+ private void on_attached_source_destroyed(DataSource source) {
+ MediaSource media_source = (MediaSource) source;
+
+ // if one of the media sources in the event goes away, reconstitution is impossible
+ if (media_source != null && primary_source.equals(media_source))
+ notify_broken();
+ else if (attached_sources.contains(media_source))
+ notify_broken();
+ }
+ }
+
+ private class EventProxy : SourceProxy {
+ public EventProxy(Event event) {
+ base (event);
+ }
+
+ public override DataSource reconstitute(int64 object_id, SourceSnapshot snapshot) {
+ EventSnapshot event_snapshot = snapshot as EventSnapshot;
+ assert(event_snapshot != null);
+
+ return Event.reconstitute(object_id, event_snapshot.get_row());
+ }
+
+ }
+
+ public static EventSourceCollection global = null;
+
+ private static EventTable event_table = null;
+
+ private EventID event_id;
+ private string? raw_name;
+ private MediaSource primary_source;
+ private ViewCollection view;
+ private bool unlinking = false;
+ private bool relinking = false;
+ private string? indexable_keywords = null;
+ private string? comment = null;
+
+ private Event(EventRow event_row, int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+
+ // normalize user text
+ event_row.name = prep_event_name(event_row.name);
+
+ this.event_id = event_row.event_id;
+ this.raw_name = event_row.name;
+ this.comment = event_row.comment;
+
+ Gee.Collection<string> event_source_ids =
+ MediaCollectionRegistry.get_instance().get_source_ids_for_event_id(event_id);
+ Gee.ArrayList<ThumbnailView> event_thumbs = new Gee.ArrayList<ThumbnailView>();
+ foreach (string current_source_id in event_source_ids) {
+ MediaSource? media =
+ MediaCollectionRegistry.get_instance().fetch_media(current_source_id);
+ if (media != null)
+ event_thumbs.add(new ThumbnailView(media));
+ }
+
+ view = new ViewCollection("ViewCollection for Event %s".printf(event_id.id.to_string()));
+ view.set_comparator(view_comparator, view_comparator_predicate);
+ view.add_many(event_thumbs);
+
+ // need to do this manually here because only want to monitor ViewCollection contents after
+ // initial batch has been added, but need to keep EventSourceCollection apprised
+ if (event_thumbs.size > 0) {
+ global.notify_container_contents_added(this, event_thumbs, false);
+ global.notify_container_contents_altered(this, event_thumbs, false, null, false);
+ }
+
+ // get the primary source for monitoring; if not available, use the first unrejected
+ // source in the event
+ primary_source = MediaCollectionRegistry.get_instance().fetch_media(event_row.primary_source_id);
+ if (primary_source == null && view.get_count() > 0) {
+ primary_source = (MediaSource) ((DataView) view.get_first_unrejected()).get_source();
+ event_table.set_primary_source_id(event_id, primary_source.get_source_id());
+ }
+
+ // watch the primary source to reflect thumbnail changes
+ if (primary_source != null)
+ primary_source.thumbnail_altered.connect(on_primary_thumbnail_altered);
+
+ // watch for for addition, removal, and alteration of photos and videos
+ view.items_added.connect(on_media_added);
+ view.items_removed.connect(on_media_removed);
+ view.items_altered.connect(on_media_altered);
+
+ // because we're no longer using source monitoring (for performance reasons), need to watch
+ // for media destruction (but not removal, which is handled automatically in any case)
+ LibraryPhoto.global.item_destroyed.connect(on_media_destroyed);
+ Video.global.item_destroyed.connect(on_media_destroyed);
+
+ update_indexable_keywords();
+ }
+
+ ~Event() {
+ if (primary_source != null)
+ primary_source.thumbnail_altered.disconnect(on_primary_thumbnail_altered);
+
+ view.items_altered.disconnect(on_media_altered);
+ view.items_removed.disconnect(on_media_removed);
+ view.items_added.disconnect(on_media_added);
+
+ LibraryPhoto.global.item_destroyed.disconnect(on_media_destroyed);
+ Video.global.item_destroyed.disconnect(on_media_destroyed);
+ }
+
+ public override string get_typename() {
+ return TYPENAME;
+ }
+
+ public override int64 get_instance_id() {
+ return get_event_id().id;
+ }
+
+ public override string get_representative_id() {
+ return (primary_source != null) ? primary_source.get_source_id() : get_source_id();
+ }
+
+ public override PhotoFileFormat get_preferred_thumbnail_format() {
+ return (primary_source != null) ? primary_source.get_preferred_thumbnail_format() :
+ PhotoFileFormat.get_system_default_format();
+ }
+
+ public override Gdk.Pixbuf? create_thumbnail(int scale) throws Error {
+ return (primary_source != null) ? primary_source.create_thumbnail(scale) : null;
+ }
+
+ public static void init(ProgressMonitor? monitor = null) {
+ event_table = EventTable.get_instance();
+ global = new EventSourceCollection();
+ global.init();
+
+ // add all events to the global collection
+ Gee.ArrayList<Event> events = new Gee.ArrayList<Event>();
+ Gee.ArrayList<Event> unlinked = new Gee.ArrayList<Event>();
+
+ Gee.ArrayList<EventRow?> event_rows = event_table.get_events();
+ int count = event_rows.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ Event event = new Event(event_rows[ctr]);
+ if (monitor != null)
+ monitor(ctr, count);
+
+ if (event.get_media_count() != 0) {
+ events.add(event);
+
+ continue;
+ }
+
+ // TODO: If event has no backlinks, destroy (empty Event stored in database) ... this
+ // is expensive to check at startup time, however, should happen in background or
+ // during a "clean" operation
+ event.rehydrate_backlinks(global, null);
+ unlinked.add(event);
+ }
+
+ global.add_many(events);
+ global.init_add_many_unlinked(unlinked);
+ }
+
+ public static void terminate() {
+ }
+
+ private static int64 view_comparator(void *a, void *b) {
+ return ((MediaSource) ((ThumbnailView *) a)->get_source()).get_exposure_time()
+ - ((MediaSource) ((ThumbnailView *) b)->get_source()).get_exposure_time() ;
+ }
+
+ private static bool view_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "exposure-time");
+ }
+
+ public static string? prep_event_name(string? name) {
+ // Ticket #3218 - we tell prepare_input_text to
+ // allow empty strings, and if the rest of the app sees
+ // one, it already knows to rename it to
+ // one of the default event names.
+ return prepare_input_text(name,
+ PrepareInputTextOptions.NORMALIZE | PrepareInputTextOptions.VALIDATE |
+ PrepareInputTextOptions.INVALID_IS_NULL | PrepareInputTextOptions.STRIP |
+ PrepareInputTextOptions.STRIP_CRLF, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ }
+
+ // This is used by MediaSource to notify Event when it's joined. Don't use this to manually attach a
+ // a photo or video to an Event, use MediaSource.set_event().
+ public void attach(MediaSource source) {
+ view.add(new ThumbnailView(source));
+ }
+
+ public void attach_many(Gee.Collection<MediaSource> media) {
+ Gee.ArrayList<ThumbnailView> views = new Gee.ArrayList<ThumbnailView>();
+ foreach (MediaSource current_source in media)
+ views.add(new ThumbnailView(current_source));
+
+ view.add_many(views);
+ }
+
+ // This is used by internally by Photos and Videos to notify their parent Event as to when
+ // they're leaving. Don't use this manually to detach a MediaSource; instead use
+ // MediaSource.set_event( )
+ public void detach(MediaSource source) {
+ view.remove_marked(view.mark(view.get_view_for_source(source)));
+ }
+
+ public void detach_many(Gee.Collection<MediaSource> media) {
+ Gee.ArrayList<ThumbnailView> views = new Gee.ArrayList<ThumbnailView>();
+ foreach (MediaSource current_source in media) {
+ ThumbnailView? view = (ThumbnailView?) view.get_view_for_source(current_source);
+ if (view != null)
+ views.add(view);
+ }
+
+ view.remove_marked(view.mark_many(views));
+ }
+
+ // TODO: A preferred way to do this is for ContainerSource to have an abstract interface for
+ // obtaining the DataCollection in the ContainerSource of all the media objects. Then,
+ // ContinerSource could offer this helper class.
+ public bool contains_media_type(string media_type) {
+ foreach (MediaSource media in get_media()) {
+ if (media.get_typename() == media_type)
+ return true;
+ }
+
+ return false;
+ }
+
+ private Gee.ArrayList<MediaSource> views_to_media(Gee.Iterable<DataObject> views) {
+ Gee.ArrayList<MediaSource> media = new Gee.ArrayList<MediaSource>();
+ foreach (DataObject object in views)
+ media.add((MediaSource) ((DataView) object).get_source());
+
+ return media;
+ }
+
+ private void on_media_added(Gee.Iterable<DataObject> added) {
+ Gee.Collection<MediaSource> media = views_to_media(added);
+ global.notify_container_contents_added(this, media, relinking);
+ global.notify_container_contents_altered(this, media, relinking, null, false);
+
+ notify_altered(new Alteration.from_list("contents:added, metadata:time"));
+ }
+
+ // Event needs to know whenever a media source is removed from the system to update the event
+ private void on_media_removed(Gee.Iterable<DataObject> removed) {
+ Gee.ArrayList<MediaSource> media = views_to_media(removed);
+
+ global.notify_container_contents_removed(this, media, unlinking);
+ global.notify_container_contents_altered(this, null, false, media, unlinking);
+
+ // update primary source if it's been removed (and there's one to take its place)
+ foreach (MediaSource current_source in media) {
+ if (current_source == primary_source) {
+ if (get_media_count() > 0)
+ set_primary_source((MediaSource) view.get_first_unrejected().get_source());
+ else
+ release_primary_source();
+
+ break;
+ }
+ }
+
+ // evaporate event if no more media in it; do not touch thereafter
+ if (get_media_count() == 0) {
+ global.evaporate(this);
+
+ // as it's possible (highly likely, in fact) that all refs to the Event object have
+ // gone out of scope now, do NOT touch this, but exit immediately
+ return;
+ }
+
+ notify_altered(new Alteration.from_list("contents:removed, metadata:time"));
+ }
+
+ private void on_media_destroyed(DataSource source) {
+ ThumbnailView? thumbnail_view = (ThumbnailView) view.get_view_for_source(source);
+ if (thumbnail_view != null)
+ view.remove_marked(view.mark(thumbnail_view));
+ }
+
+ public override void notify_relinking(SourceCollection sources) {
+ assert(get_media_count() > 0);
+
+ // If the primary source was lost in the unlink, reestablish it now.
+ if (primary_source == null)
+ set_primary_source((MediaSource) view.get_first_unrejected().get_source());
+
+ base.notify_relinking(sources);
+ }
+
+ /** @brief This gets called when one or more media items inside this
+ * event gets modified in some fashion. If the media item's date changes
+ * and the event was previously undated, the name of the event needs to
+ * change as well; all of that happens automatically in here.
+ *
+ * In addition, if the _rating_ of one or more media items has changed,
+ * the thumbnail of this event may need to change, as the primary
+ * image may have been rejected and should not be the thumbnail anymore.
+ */
+ private void on_media_altered(Gee.Map<DataObject, Alteration> items) {
+ bool should_remake_thumb = false;
+
+ foreach (Alteration alteration in items.values) {
+ if (alteration.has_detail("metadata", "exposure-time")) {
+
+ string alt_list = "metadata:time";
+
+ if(!has_name())
+ alt_list += (", metadata:name");
+
+ notify_altered(new Alteration.from_list(alt_list));
+
+ break;
+ }
+
+ if (alteration.has_detail("metadata", "rating"))
+ should_remake_thumb = true;
+ }
+
+ if (should_remake_thumb) {
+ // check whether we actually need to remake this thumbnail...
+ if ((get_primary_source() == null) || (get_primary_source().get_rating() == Rating.REJECTED)) {
+ // yes, rejected - drop it and get a new one...
+ set_primary_source((MediaSource) view.get_first_unrejected().get_source());
+ }
+
+ // ...otherwise, if the primary source wasn't rejected, just leave it alone.
+ }
+ }
+
+ // This creates an empty event with a primary source. NOTE: This does not add the source to
+ // the event. That must be done manually.
+ public static Event? create_empty_event(MediaSource source) {
+ try {
+ Event event = new Event(EventTable.get_instance().create(source.get_source_id(), null));
+ global.add(event);
+
+ debug("Created empty event %s", event.to_string());
+
+ return event;
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+
+ return null;
+ }
+ }
+
+ // This will create an event using the fields supplied in EventRow. The event_id is ignored.
+ private static Event reconstitute(int64 object_id, EventRow row) {
+ row.event_id = EventTable.get_instance().create_from_row(row);
+ Event event = new Event(row, object_id);
+ global.add(event);
+ assert(global.contains(event));
+
+ debug("Reconstituted event %s", event.to_string());
+
+ return event;
+ }
+
+ public bool has_links() {
+ return (LibraryPhoto.global.has_backlink(get_backlink()) ||
+ Video.global.has_backlink(get_backlink()));
+ }
+
+ public SourceBacklink get_backlink() {
+ return new SourceBacklink.from_source(this);
+ }
+
+ public void break_link(DataSource source) {
+ unlinking = true;
+
+ ((MediaSource) source).set_event(null);
+
+ unlinking = false;
+ }
+
+ public void break_link_many(Gee.Collection<DataSource> sources) {
+ unlinking = true;
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media((Gee.Collection<MediaSource>) sources, photos, videos);
+
+ try {
+ MediaSource.set_many_to_event(photos, null, LibraryPhoto.global.transaction_controller);
+ } catch (Error err) {
+ AppWindow.error_message("%s".printf(err.message));
+ }
+
+ try {
+ MediaSource.set_many_to_event(videos, null, Video.global.transaction_controller);
+ } catch (Error err) {
+ AppWindow.error_message("%s".printf(err.message));
+ }
+
+ unlinking = false;
+ }
+
+ public void establish_link(DataSource source) {
+ relinking = true;
+
+ ((MediaSource) source).set_event(this);
+
+ relinking = false;
+ }
+
+ public void establish_link_many(Gee.Collection<DataSource> sources) {
+ relinking = true;
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media((Gee.Collection<MediaSource>) sources, photos, videos);
+
+ try {
+ MediaSource.set_many_to_event(photos, this, LibraryPhoto.global.transaction_controller);
+ } catch (Error err) {
+ AppWindow.error_message("%s".printf(err.message));
+ }
+
+ try {
+ MediaSource.set_many_to_event(videos, this, Video.global.transaction_controller);
+ } catch (Error err) {
+ AppWindow.error_message("%s".printf(err.message));
+ }
+
+ relinking = false;
+ }
+
+ private void update_indexable_keywords() {
+ string[] components = new string[3];
+ int i = 0;
+
+ string? rawname = get_raw_name();
+ if (rawname != null)
+ components[i++] = rawname;
+
+ string? comment = get_comment();
+ if (comment != null)
+ components[i++] = comment;
+
+ if (i == 0)
+ indexable_keywords = null;
+ else {
+ components[i] = null;
+ indexable_keywords = prepare_indexable_string(string.joinv(" ", components));
+ }
+ }
+
+ public unowned string? get_indexable_keywords() {
+ return indexable_keywords;
+ }
+
+ public bool is_in_starting_day(time_t time) {
+ // it's possible the Event ref is held although it's been emptied
+ // (such as the user removing items during an import, when events
+ // are being generate on-the-fly) ... return false here and let
+ // the caller make a new one
+ if (view.get_count() == 0)
+ return false;
+
+ // media sources are stored in ViewCollection from earliest to latest
+ MediaSource earliest_media = (MediaSource) ((DataView) view.get_at(0)).get_source();
+ Time earliest_tm = Time.local(earliest_media.get_exposure_time());
+
+ // use earliest to generate the boundary hour for that day
+ Time start_boundary_tm = Time();
+ start_boundary_tm.second = 0;
+ start_boundary_tm.minute = 0;
+ start_boundary_tm.hour = EVENT_BOUNDARY_HOUR;
+ start_boundary_tm.day = earliest_tm.day;
+ start_boundary_tm.month = earliest_tm.month;
+ start_boundary_tm.year = earliest_tm.year;
+ start_boundary_tm.isdst = -1;
+
+ time_t start_boundary = start_boundary_tm.mktime();
+
+ // if the earliest's exposure time was on the day but *before* the boundary hour,
+ // step it back a day to the prior day's boundary
+ if (earliest_tm.hour < EVENT_BOUNDARY_HOUR)
+ start_boundary -= TIME_T_DAY;
+
+ time_t end_boundary = (start_boundary + TIME_T_DAY - 1);
+
+ return time >= start_boundary && time <= end_boundary;
+ }
+
+ // This method attempts to add a media source to an event in the supplied list that it would
+ // naturally fit into (i.e. its exposure is within the boundary day of the earliest event
+ // photo). Otherwise, a new Event is generated and the source is added to it and the list.
+ private static Event? generate_event(MediaSource media, ViewCollection events_so_far,
+ string? event_name, out bool new_event) {
+ time_t exposure_time = media.get_exposure_time();
+
+ if (exposure_time == 0 && event_name == null) {
+ debug("Skipping event assignment to %s: no exposure time and no event name", media.to_string());
+ new_event = false;
+
+ return null;
+ }
+
+ int count = events_so_far.get_count();
+ for (int ctr = 0; ctr < count; ctr++) {
+ Event event = (Event) ((EventView) events_so_far.get_at(ctr)).get_source();
+
+ if ((event_name != null && event.has_name() && event_name == event.get_name())
+ || event.is_in_starting_day(exposure_time)) {
+ new_event = false;
+
+ return event;
+ }
+ }
+
+ // no Event so far fits the bill for this photo or video, so create a new one
+ try {
+ Event event = new Event(EventTable.get_instance().create(media.get_source_id(), null));
+ if (event_name != null)
+ event.rename(event_name);
+
+ events_so_far.add(new EventView(event));
+
+ new_event = true;
+ return event;
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ new_event = false;
+
+ return null;
+ }
+
+ public static void generate_single_event(MediaSource media, ViewCollection events_so_far,
+ string? event_name = null) {
+ // do not replace existing assignments
+ if (media.get_event() != null)
+ return;
+
+ bool new_event;
+ Event? event = generate_event(media, events_so_far, event_name, out new_event);
+ if (event == null)
+ return;
+
+ media.set_event(event);
+
+ if (new_event)
+ global.add(event);
+ }
+
+ public static void generate_many_events(Gee.Collection<MediaSource> sources, ViewCollection events_so_far) {
+ Gee.Collection<Event> to_add = new Gee.ArrayList<Event>();
+ foreach (MediaSource media in sources) {
+ // do not replace existing assignments
+ if (media.get_event() != null)
+ continue;
+
+ bool new_event;
+ Event? event = generate_event(media, events_so_far, null, out new_event);
+ if (event == null)
+ continue;
+
+ media.set_event(event);
+
+ if (new_event)
+ to_add.add(event);
+ }
+
+ if (to_add.size > 0)
+ global.add_many(to_add);
+ }
+
+ public EventID get_event_id() {
+ return event_id;
+ }
+
+ public override SourceSnapshot? save_snapshot() {
+ return new EventSnapshot(this);
+ }
+
+ public SourceProxy get_proxy() {
+ return new EventProxy(this);
+ }
+
+ public override bool equals(DataSource? source) {
+ // Validate primary key is unique, which is vital to all this working
+ Event? event = source as Event;
+ if (event != null) {
+ if (this != event) {
+ assert(event_id.id != event.event_id.id);
+ }
+ }
+
+ return base.equals(source);
+ }
+
+ public override string to_string() {
+ return "Event [%s/%s] %s".printf(event_id.id.to_string(), get_object_id().to_string(), get_name());
+ }
+
+ public bool has_name() {
+ return raw_name != null && raw_name.length > 0;
+ }
+
+ public override string get_name() {
+ if (has_name())
+ return get_raw_name();
+
+ // if no name, pretty up the start time
+ string? datestring = get_formatted_daterange();
+
+ return !is_string_empty(datestring) ? datestring : _("Event %s").printf(event_id.id.to_string());
+ }
+
+ public string? get_formatted_daterange() {
+ time_t start_time = get_start_time();
+ time_t end_time = get_end_time();
+
+ if (end_time == 0 && start_time == 0)
+ return null;
+
+ if (end_time == 0 && start_time != 0)
+ return format_local_date(Time.local(start_time));
+
+ Time start = Time.local(start_time);
+ Time end = Time.local(end_time);
+
+ if (start.day == end.day && start.month == end.month && start.day == end.day)
+ return format_local_date(Time.local(start_time));
+
+ return format_local_datespan(start, end);
+ }
+
+ public string? get_raw_name() {
+ return raw_name;
+ }
+
+ public override string? get_comment() {
+ return comment;
+ }
+
+ public bool rename(string? name) {
+ string? new_name = prep_event_name(name);
+
+ // Allow rename to date but it should go dynamic, so set name to ""
+ if (new_name == get_formatted_daterange()) {
+ new_name = "";
+ }
+
+ bool renamed = event_table.rename(event_id, new_name);
+ if (renamed) {
+ raw_name = new_name;
+ update_indexable_keywords();
+ notify_altered(new Alteration.from_list("metadata:name, indexable:keywords"));
+ }
+
+ return renamed;
+ }
+
+ public override bool set_comment(string? comment) {
+ string? new_comment = MediaSource.prep_comment(comment);
+
+ bool committed = event_table.set_comment(event_id, new_comment);
+ if (committed) {
+ this.comment = new_comment;
+ update_indexable_keywords();
+ notify_altered(new Alteration.from_list("metadata:comment, indexable:keywords"));
+ }
+
+ return committed;
+ }
+
+ public time_t get_creation_time() {
+ return event_table.get_time_created(event_id);
+ }
+
+ public override time_t get_start_time() {
+ // Because the ViewCollection is sorted by a DateComparator, the start time is the
+ // first item. However, we keep looking if it has no start time.
+ int count = view.get_count();
+ for (int i = 0; i < count; i++) {
+ time_t time = ((MediaSource) (((DataView) view.get_at(i)).get_source())).get_exposure_time();
+ if (time != 0)
+ return time;
+ }
+
+ return 0;
+ }
+
+ public override time_t get_end_time() {
+ int count = view.get_count();
+
+ // Because the ViewCollection is sorted by a DateComparator, the end time is the
+ // last item--no matter what.
+ if (count == 0)
+ return 0;
+
+ return ((MediaSource) (((DataView) view.get_at(count - 1)).get_source())).get_exposure_time();
+ }
+
+ public override uint64 get_total_filesize() {
+ uint64 total = 0;
+ foreach (MediaSource current_source in get_media()) {
+ total += current_source.get_filesize();
+ }
+
+ return total;
+ }
+
+ public override int get_media_count() {
+ return view.get_count();
+ }
+
+ public override Gee.Collection<MediaSource> get_media() {
+ return (Gee.Collection<MediaSource>) view.get_sources();
+ }
+
+ public void mirror_photos(ViewCollection view, CreateView mirroring_ctor) {
+ view.mirror(this.view, mirroring_ctor, null);
+ }
+
+ private void on_primary_thumbnail_altered() {
+ notify_thumbnail_altered();
+ }
+
+ public MediaSource get_primary_source() {
+ return primary_source;
+ }
+
+ public bool set_primary_source(MediaSource source) {
+ assert(view.has_view_for_source(source));
+
+ bool committed = event_table.set_primary_source_id(event_id, source.get_source_id());
+ if (committed) {
+ // switch to the new media source
+ if (primary_source != null)
+ primary_source.thumbnail_altered.disconnect(on_primary_thumbnail_altered);
+
+ primary_source = source;
+ primary_source.thumbnail_altered.connect(on_primary_thumbnail_altered);
+
+ notify_thumbnail_altered();
+ }
+
+ return committed;
+ }
+
+ private void release_primary_source() {
+ if (primary_source == null)
+ return;
+
+ primary_source.thumbnail_altered.disconnect(on_primary_thumbnail_altered);
+ primary_source = null;
+ }
+
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ return primary_source != null ? primary_source.get_thumbnail(scale) : null;
+ }
+
+ public Gdk.Pixbuf? get_preview_pixbuf(Scaling scaling) {
+ try {
+ return get_primary_source().get_preview_pixbuf(scaling);
+ } catch (Error err) {
+ return null;
+ }
+ }
+
+ public override void destroy() {
+ // stop monitoring the photos collection
+ view.halt_all_monitoring();
+
+ // remove from the database
+ try {
+ event_table.remove(event_id);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ // mark all photos and videos for this event as now event-less
+ PhotoTable.get_instance().drop_event(event_id);
+ VideoTable.get_instance().drop_event(event_id);
+
+ base.destroy();
+ }
+}
diff --git a/src/Exporter.vala b/src/Exporter.vala
new file mode 100644
index 0000000..a930c4c
--- /dev/null
+++ b/src/Exporter.vala
@@ -0,0 +1,343 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public enum ExportFormatMode {
+ UNMODIFIED,
+ CURRENT,
+ SPECIFIED, /* use an explicitly specified format like PNG or JPEG */
+ LAST /* use whatever format was used in the previous export operation */
+}
+
+public struct ExportFormatParameters {
+ public ExportFormatMode mode;
+ public PhotoFileFormat specified_format;
+ public Jpeg.Quality quality;
+ public bool export_metadata;
+
+ private ExportFormatParameters(ExportFormatMode mode, PhotoFileFormat specified_format,
+ Jpeg.Quality quality) {
+ this.mode = mode;
+ this.specified_format = specified_format;
+ this.quality = quality;
+ this.export_metadata = true;
+ }
+
+ public static ExportFormatParameters current() {
+ return ExportFormatParameters(ExportFormatMode.CURRENT,
+ PhotoFileFormat.get_system_default_format(), Jpeg.Quality.HIGH);
+ }
+
+ public static ExportFormatParameters unmodified() {
+ return ExportFormatParameters(ExportFormatMode.UNMODIFIED,
+ PhotoFileFormat.get_system_default_format(), Jpeg.Quality.HIGH);
+ }
+
+ public static ExportFormatParameters for_format(PhotoFileFormat format) {
+ return ExportFormatParameters(ExportFormatMode.SPECIFIED, format, Jpeg.Quality.HIGH);
+ }
+
+ public static ExportFormatParameters last() {
+ return ExportFormatParameters(ExportFormatMode.LAST,
+ PhotoFileFormat.get_system_default_format(), Jpeg.Quality.HIGH);
+ }
+
+ public static ExportFormatParameters for_JPEG(Jpeg.Quality quality) {
+ return ExportFormatParameters(ExportFormatMode.SPECIFIED, PhotoFileFormat.JFIF,
+ quality);
+ }
+}
+
+public class Exporter : Object {
+ public enum Overwrite {
+ YES,
+ NO,
+ CANCEL,
+ REPLACE_ALL
+ }
+
+ public delegate void CompletionCallback(Exporter exporter, bool is_cancelled);
+
+ public delegate Overwrite OverwriteCallback(Exporter exporter, File file);
+
+ public delegate bool ExportFailedCallback(Exporter exporter, File file, int remaining,
+ Error err);
+
+ private class ExportJob : BackgroundJob {
+ public MediaSource media;
+ public File dest;
+ public Scaling? scaling;
+ public Jpeg.Quality? quality;
+ public PhotoFileFormat? format;
+ public Error? err = null;
+ public bool direct_copy_unmodified = false;
+ public bool export_metadata = true;
+
+ public ExportJob(Exporter owner, MediaSource media, File dest, Scaling? scaling,
+ Jpeg.Quality? quality, PhotoFileFormat? format, Cancellable cancellable,
+ bool direct_copy_unmodified = false, bool export_metadata = true) {
+ base (owner, owner.on_exported, cancellable, owner.on_export_cancelled);
+
+ assert(media is Photo || media is Video);
+
+ this.media = media;
+ this.dest = dest;
+ this.scaling = scaling;
+ this.quality = quality;
+ this.format = format;
+ this.direct_copy_unmodified = direct_copy_unmodified;
+ this.export_metadata = export_metadata;
+ }
+
+ public override void execute() {
+ try {
+ if (media is Photo) {
+ ((Photo) media).export(dest, scaling, quality, format, direct_copy_unmodified, export_metadata);
+ } else if (media is Video) {
+ ((Video) media).export(dest);
+ }
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private Gee.Collection<MediaSource> to_export = new Gee.ArrayList<MediaSource>();
+ private File[] exported_files;
+ private File? dir;
+ private Scaling scaling;
+ private int completed_count = 0;
+ private Workers workers = new Workers(Workers.threads_per_cpu(1, 4), false);
+ private unowned CompletionCallback? completion_callback = null;
+ private unowned ExportFailedCallback? error_callback = null;
+ private unowned OverwriteCallback? overwrite_callback = null;
+ private unowned ProgressMonitor? monitor = null;
+ private Cancellable cancellable;
+ private bool replace_all = false;
+ private bool aborted = false;
+ private ExportFormatParameters export_params;
+
+ public Exporter(Gee.Collection<MediaSource> to_export, File? dir, Scaling scaling,
+ ExportFormatParameters export_params, bool auto_replace_all = false) {
+ this.to_export.add_all(to_export);
+ this.dir = dir;
+ this.scaling = scaling;
+ this.export_params = export_params;
+ this.replace_all = auto_replace_all;
+ }
+
+ public Exporter.for_temp_file(Gee.Collection<MediaSource> to_export, Scaling scaling,
+ ExportFormatParameters export_params) {
+ this.to_export.add_all(to_export);
+ this.dir = null;
+ this.scaling = scaling;
+ this.export_params = export_params;
+ }
+
+ // This should be called only once; the object does not reset its internal state when completed.
+ public void export(CompletionCallback completion_callback, ExportFailedCallback error_callback,
+ OverwriteCallback overwrite_callback, Cancellable? cancellable, ProgressMonitor? monitor) {
+ this.completion_callback = completion_callback;
+ this.error_callback = error_callback;
+ this.overwrite_callback = overwrite_callback;
+ this.monitor = monitor;
+ this.cancellable = cancellable ?? new Cancellable();
+
+ if (!process_queue())
+ export_completed(true);
+ }
+
+ private void on_exported(BackgroundJob j) {
+ ExportJob job = (ExportJob) j;
+
+ completed_count++;
+
+ // because the monitor spins the event loop, and so it's possible this function will be
+ // re-entered, decide now if this is the last job
+ bool completed = completed_count == to_export.size;
+
+ if (!aborted && job.err != null) {
+ if (!error_callback(this, job.dest, to_export.size - completed_count, job.err)) {
+ aborted = true;
+
+ if (!completed)
+ return;
+ }
+ }
+
+ if (!aborted && monitor != null) {
+ if (!monitor(completed_count, to_export.size, false)) {
+ aborted = true;
+
+ if (!completed)
+ return;
+ } else {
+ exported_files += job.dest;
+ }
+ }
+
+ if (completed)
+ export_completed(false);
+ }
+
+ private void on_export_cancelled(BackgroundJob j) {
+ if (++completed_count == to_export.size)
+ export_completed(true);
+ }
+
+ public File[] get_exported_files() {
+ return exported_files;
+ }
+
+ private bool process_queue() {
+ int submitted = 0;
+ foreach (MediaSource source in to_export) {
+ File? use_source_file = null;
+ PhotoFileFormat real_export_format = PhotoFileFormat.get_system_default_format();
+ string? basename = null;
+ if (source is Photo) {
+ Photo photo = (Photo) source;
+ real_export_format = photo.get_export_format_for_parameters(export_params);
+ basename = photo.get_export_basename_for_parameters(export_params);
+ } else if (source is Video) {
+ basename = ((Video) source).get_basename();
+ }
+ assert(basename != null);
+
+ if (use_source_file != null) {
+ exported_files += use_source_file;
+
+ completed_count++;
+ if (monitor != null) {
+ if (!monitor(completed_count, to_export.size)) {
+ cancellable.cancel();
+
+ return false;
+ }
+ }
+
+ continue;
+ }
+
+ File? export_dir = dir;
+ File? dest = null;
+
+ if (export_dir == null) {
+ try {
+ bool collision;
+ dest = generate_unique_file(AppDirs.get_temp_dir(), basename, out collision);
+ } catch (Error err) {
+ AppWindow.error_message(_("Unable to generate a temporary file for %s: %s").printf(
+ source.get_file().get_basename(), err.message));
+
+ break;
+ }
+ } else {
+ dest = dir.get_child(basename);
+
+ if (!replace_all && dest.query_exists(null)) {
+ switch (overwrite_callback(this, dest)) {
+ case Overwrite.YES:
+ // continue
+ break;
+
+ case Overwrite.REPLACE_ALL:
+ replace_all = true;
+ break;
+
+ case Overwrite.CANCEL:
+ cancellable.cancel();
+
+ return false;
+
+ case Overwrite.NO:
+ default:
+ completed_count++;
+ if (monitor != null) {
+ if (!monitor(completed_count, to_export.size)) {
+ cancellable.cancel();
+
+ return false;
+ }
+ }
+
+ continue;
+ }
+ }
+ }
+
+ workers.enqueue(new ExportJob(this, source, dest, scaling, export_params.quality,
+ real_export_format, cancellable, export_params.mode == ExportFormatMode.UNMODIFIED, export_params.export_metadata));
+ submitted++;
+ }
+
+ return submitted > 0;
+ }
+
+ private void export_completed(bool is_cancelled) {
+ completion_callback(this, is_cancelled);
+ }
+}
+
+public class ExporterUI {
+ private Exporter exporter;
+ private Cancellable cancellable = new Cancellable();
+ private ProgressDialog? progress_dialog = null;
+ private unowned Exporter.CompletionCallback? completion_callback = null;
+
+ public ExporterUI(Exporter exporter) {
+ this.exporter = exporter;
+ }
+
+ public void export(Exporter.CompletionCallback completion_callback) {
+ this.completion_callback = completion_callback;
+
+ AppWindow.get_instance().set_busy_cursor();
+
+ progress_dialog = new ProgressDialog(AppWindow.get_instance(), _("Exporting"), cancellable);
+ exporter.export(on_export_completed, on_export_failed, on_export_overwrite, cancellable,
+ progress_dialog.monitor);
+ }
+
+ private void on_export_completed(Exporter exporter, bool is_cancelled) {
+ if (progress_dialog != null) {
+ progress_dialog.close();
+ progress_dialog = null;
+ }
+
+ AppWindow.get_instance().set_normal_cursor();
+
+ completion_callback(exporter, is_cancelled);
+ }
+
+ private Exporter.Overwrite on_export_overwrite(Exporter exporter, File file) {
+ progress_dialog.set_modal(false);
+ string question = _("File %s already exists. Replace?").printf(file.get_basename());
+ Gtk.ResponseType response = AppWindow.negate_affirm_all_cancel_question(question,
+ _("_Skip"), _("_Replace"), _("Replace _All"), _("Export"));
+
+ progress_dialog.set_modal(true);
+
+ switch (response) {
+ case Gtk.ResponseType.APPLY:
+ return Exporter.Overwrite.REPLACE_ALL;
+
+ case Gtk.ResponseType.YES:
+ return Exporter.Overwrite.YES;
+
+ case Gtk.ResponseType.CANCEL:
+ return Exporter.Overwrite.CANCEL;
+
+ case Gtk.ResponseType.NO:
+ default:
+ return Exporter.Overwrite.NO;
+ }
+ }
+
+ private bool on_export_failed(Exporter exporter, File file, int remaining, Error err) {
+ return export_error_dialog(file, remaining > 0) != Gtk.ResponseType.CANCEL;
+ }
+}
+
diff --git a/src/International.vala b/src/International.vala
new file mode 100644
index 0000000..1bf242b
--- /dev/null
+++ b/src/International.vala
@@ -0,0 +1,32 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+extern const string _LANG_SUPPORT_DIR;
+
+public const string TRANSLATABLE = "translatable";
+
+namespace InternationalSupport {
+const string SYSTEM_LOCALE = "";
+const string LANGUAGE_SUPPORT_DIRECTORY = _LANG_SUPPORT_DIR;
+
+void init(string package_name, string[] args, string locale = SYSTEM_LOCALE) {
+ Intl.setlocale(LocaleCategory.ALL, locale);
+
+ Intl.bindtextdomain(package_name, get_langpack_dir_path(args));
+ Intl.bind_textdomain_codeset(package_name, "UTF-8");
+ Intl.textdomain(package_name);
+}
+
+private string get_langpack_dir_path(string[] args) {
+ File local_langpack_dir =
+ File.new_for_path(Environment.find_program_in_path(args[0])).get_parent().get_child(
+ "locale-langpack");
+
+ return (local_langpack_dir.query_exists(null)) ? local_langpack_dir.get_path() :
+ LANGUAGE_SUPPORT_DIRECTORY;
+}
+}
+
diff --git a/src/LibraryFiles.vala b/src/LibraryFiles.vala
new file mode 100644
index 0000000..4cffe94
--- /dev/null
+++ b/src/LibraryFiles.vala
@@ -0,0 +1,104 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace LibraryFiles {
+
+// This method uses global::generate_unique_file_at in order to "claim" a file in the filesystem.
+// Thus, when the method returns success a file may exist already, and should be overwritten.
+//
+// This function is thread safe.
+public File? generate_unique_file(string basename, MediaMetadata? metadata, time_t ts, out bool collision)
+ throws Error {
+ // use exposure timestamp over the supplied one (which probably comes from the file's
+ // modified time, or is simply time()), unless it's zero, in which case use current time
+
+ time_t timestamp = ts;
+ if (metadata != null) {
+ MetadataDateTime? date_time = metadata.get_creation_date_time();
+ if (date_time != null)
+ timestamp = date_time.get_timestamp();
+ else if (timestamp == 0)
+ timestamp = time_t();
+ }
+
+ // build a directory tree inside the library
+ File dir = AppDirs.get_baked_import_dir(timestamp);
+ try {
+ dir.make_directory_with_parents(null);
+ } catch (Error err) {
+ if (!(err is IOError.EXISTS))
+ throw err;
+
+ // silently ignore not creating a directory that already exists
+ }
+
+ // Optionally convert to lower-case.
+ string newbasename = basename;
+ if (Config.Facade.get_instance().get_use_lowercase_filenames())
+ newbasename = newbasename.down();
+
+ return global::generate_unique_file(dir, newbasename, out collision);
+}
+
+// This function is thread-safe.
+private File duplicate(File src, FileProgressCallback? progress_callback, bool blacklist) throws Error {
+ time_t timestamp = 0;
+ try {
+ timestamp = query_file_modified(src);
+ } catch (Error err) {
+ critical("Unable to access file modification for %s: %s", src.get_path(), err.message);
+ }
+
+ MediaMetadata? metadata = null;
+ if (VideoReader.is_supported_video_file(src)) {
+ VideoReader reader = new VideoReader(src);
+ try {
+ metadata = reader.read_metadata();
+ } catch (Error err) {
+ // ignored, leave metadata as null
+ }
+ } else {
+ PhotoFileReader reader = PhotoFileFormat.get_by_file_extension(src).create_reader(
+ src.get_path());
+ try {
+ metadata = reader.read_metadata();
+ } catch (Error err) {
+ // ignored, leave metadata as null
+ }
+ }
+
+ bool collision;
+ File? dest = generate_unique_file(src.get_basename(), metadata, timestamp, out collision);
+ if (dest == null)
+ throw new FileError.FAILED("Unable to generate unique pathname for destination");
+
+ if (blacklist)
+ LibraryMonitor.blacklist_file(dest, "LibraryFiles.duplicate");
+
+ try {
+ src.copy(dest, FileCopyFlags.ALL_METADATA | FileCopyFlags.OVERWRITE, null, progress_callback);
+ if (blacklist)
+ LibraryMonitor.unblacklist_file(dest);
+ } catch (Error err) {
+ message("There was a problem copying %s: %s", src.get_path(), err.message);
+ if (blacklist && (md5_file(src) != md5_file(dest)))
+ LibraryMonitor.unblacklist_file(dest);
+ }
+
+ // Make file writable by getting current Unix mode and or it with 600 (user read/write)
+ try {
+ FileInfo info = dest.query_info(FileAttribute.UNIX_MODE, FileQueryInfoFlags.NONE);
+ uint32 mode = info.get_attribute_uint32(FileAttribute.UNIX_MODE) | 0600;
+ if (!dest.set_attribute_uint32(FileAttribute.UNIX_MODE, mode, FileQueryInfoFlags.NONE)) {
+ warning("Could not make file writable");
+ }
+ } catch (Error err) {
+ warning("Could not make file writable: %s", err.message);
+ }
+
+ return dest;
+}
+}
diff --git a/src/LibraryMonitor.vala b/src/LibraryMonitor.vala
new file mode 100644
index 0000000..363213b
--- /dev/null
+++ b/src/LibraryMonitor.vala
@@ -0,0 +1,1013 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+//
+// LibraryMonitor uses DirectoryMonitor to track assets in the user's library directory and make
+// sure they're reflected in the application.
+//
+// NOTE: There appears to be a bug where prior versions of Shotwell (<= 0.6.x) were not
+// properly loading the file modification timestamp during import. This was no issue
+// before but becomes imperative now with file monitoring. A "proper" algorithm is
+// to reimport an entire photo if the modification time in the database is different
+// than the file's, but that's Real Bad when the user first turns on monitoring, as it
+// will cause a lot of reimports (think of a 10,000 photo database) and will blow away
+// ALL transformations, as they are now suspect.
+//
+// So: If the modification time is zero and filesize is the same, simply update the
+// timestamp in the database and move on.
+//
+// TODO: Although it seems highly unlikely that a file's timestamp could change but the file size
+// has not and the file really be "changed", it *is* possible, even in the case of complex little
+// animals like photo files. We could be more liberal and treat this case as a metadata-changed
+// situation (since that's a likely case).
+//
+
+public class LibraryMonitorPool {
+ private static LibraryMonitorPool? instance = null;
+
+ private LibraryMonitor? monitor = null;
+ private uint timer_id = 0;
+
+ public signal void monitor_installed(LibraryMonitor monitor);
+
+ public signal void monitor_destroyed(LibraryMonitor monitor);
+
+ private LibraryMonitorPool() {
+ }
+
+ public static void init() {
+ }
+
+ public static void terminate() {
+ if (instance != null)
+ instance.close();
+
+ instance = null;
+ }
+
+ public static LibraryMonitorPool get_instance() {
+ if (instance == null)
+ instance = new LibraryMonitorPool();
+
+ return instance;
+ }
+
+ public LibraryMonitor? get_monitor() {
+ return monitor;
+ }
+
+ // This closes and destroys the old monitor, if any, and replaces it with the new one.
+ public void replace(LibraryMonitor replacement, int start_msec_delay = 0) {
+ close();
+
+ monitor = replacement;
+ if (start_msec_delay > 0 && timer_id == 0)
+ timer_id = Timeout.add(start_msec_delay, on_start_monitor);
+
+ monitor_installed(monitor);
+ }
+
+ private void close() {
+ if (monitor == null)
+ return;
+
+ monitor.close();
+ LibraryMonitor closed = monitor;
+ monitor = null;
+
+ monitor_destroyed(closed);
+ }
+
+ private bool on_start_monitor() {
+ // can set to zero because this function always returns false
+ timer_id = 0;
+
+ if (monitor == null)
+ return false;
+
+ monitor.start_discovery();
+
+ return false;
+ }
+}
+
+public class LibraryMonitor : DirectoryMonitor {
+ private const int FLUSH_IMPORT_QUEUE_SEC = 3;
+ private const int IMPORT_ROLL_QUIET_SEC = 5 * 60;
+ private const int MIN_BLACKLIST_DURATION_MSEC = 5 * 1000;
+ private const int MAX_VERIFY_EXISTING_MEDIA_JOBS = 5;
+
+ private class FindMoveJob : BackgroundJob {
+ public File file;
+ public Gee.Collection<Monitorable> candidates;
+ public Monitorable? match = null;
+ public Gee.ArrayList<Monitorable>? losers = null;
+ public Error? err = null;
+
+ public FindMoveJob(LibraryMonitor owner, File file, Gee.Collection<Monitorable> candidates) {
+ base (owner, owner.on_find_move_completed, owner.cancellable, owner.on_find_move_cancelled);
+
+ this.file = file;
+ this.candidates = candidates;
+
+ set_completion_priority(Priority.LOW);
+ }
+
+ public override void execute() {
+ // weed out any candidates that already have a backing master
+ Gee.Iterator<Monitorable> iter = candidates.iterator();
+ while (iter.next()) {
+ if (iter.get().get_master_file().query_exists())
+ iter.remove();
+ }
+
+ // if no more, done
+ if (candidates.size == 0)
+ return;
+
+ string? md5 = null;
+ try {
+ md5 = md5_file(file);
+ } catch (Error err) {
+ this.err = err;
+
+ return;
+ }
+
+ foreach (Monitorable candidate in candidates) {
+ if (candidate.get_master_md5() != md5)
+ continue;
+
+ if (match != null) {
+ warning("Found more than one media match for %s: %s and %s", file.get_path(),
+ match.to_string(), candidate.to_string());
+
+ if (losers == null)
+ losers = new Gee.ArrayList<Monitorable>();
+
+ losers.add(candidate);
+
+ continue;
+ }
+
+ match = candidate;
+ }
+ }
+ }
+
+ private class RuntimeFindMoveJob : BackgroundJob {
+ public File file;
+ public Gee.Collection<Monitorable> candidates;
+ public Monitorable? match = null;
+ public Error? err = null;
+
+ public RuntimeFindMoveJob(LibraryMonitor owner, File file, Gee.Collection<Monitorable> candidates) {
+ base (owner, owner.on_runtime_find_move_completed, owner.cancellable);
+
+ this.file = file;
+ this.candidates = candidates;
+
+ set_completion_priority(Priority.LOW);
+ }
+
+ public override void execute() {
+ string? md5 = null;
+ try {
+ md5 = md5_file(file);
+ } catch (Error err) {
+ this.err = err;
+
+ return;
+ }
+
+ foreach (Monitorable candidate in candidates) {
+ if (candidate.get_master_md5() == md5) {
+ match = candidate;
+
+ break;
+ }
+ }
+ }
+ }
+
+ private class VerifyJob {
+ public Monitorable monitorable;
+ public MediaMonitor monitor;
+
+ public VerifyJob(Monitorable monitorable, MediaMonitor monitor) {
+ this.monitorable = monitorable;
+ this.monitor = monitor;
+ }
+ }
+
+ private static Gee.HashSet<File> blacklist = new Gee.HashSet<File>(file_hash, file_equal);
+ private static HashTimedQueue<File> to_unblacklist = new HashTimedQueue<File>(
+ MIN_BLACKLIST_DURATION_MSEC, on_unblacklist_file, file_hash, file_equal, Priority.LOW);
+
+ private Workers workers = new Workers(Workers.thread_per_cpu_minus_one(), false);
+ private Cancellable cancellable = new Cancellable();
+ private bool auto_import = false;
+ private Gee.HashSet<File> unknown_files = null;
+ private Gee.List<MediaMonitor> monitors = new Gee.ArrayList<MediaMonitor>();
+ private Gee.HashMap<MediaMonitor, Gee.Set<Monitorable>> discovered = null;
+ private Gee.HashSet<File> import_queue = new Gee.HashSet<File>(file_hash, file_equal);
+ private Gee.HashSet<File> pending_imports = new Gee.HashSet<File>(file_hash, file_equal);
+ private Gee.ArrayList<BatchImport> batch_import_queue = new Gee.ArrayList<BatchImport>();
+ private BatchImportRoll current_import_roll = null;
+ private time_t last_import_roll_use = 0;
+ private BatchImport current_batch_import = null;
+ private int checksums_completed = 0;
+ private int checksums_total = 0;
+ private uint import_queue_timer_id = 0;
+ private Gee.Queue<VerifyJob> verify_queue = new Gee.LinkedList<VerifyJob>();
+ private int outstanding_verify_jobs = 0;
+ private int completed_monitorable_verifies = 0;
+ private int total_monitorable_verifies = 0;
+
+ public signal void auto_update_progress(int completed_files, int total_files);
+
+ public signal void auto_import_preparing();
+
+ public signal void auto_import_progress(uint64 completed_bytes, uint64 total_bytes);
+
+ public LibraryMonitor(File root, bool recurse, bool monitoring) {
+ base (root, recurse, monitoring);
+
+ // synchronize with configuration system
+ auto_import = Config.Facade.get_instance().get_auto_import_from_library();
+ Config.Facade.get_instance().auto_import_from_library_changed.connect(on_config_changed);
+
+ import_queue_timer_id = Timeout.add_seconds(FLUSH_IMPORT_QUEUE_SEC, on_flush_import_queue);
+ }
+
+ ~LibraryMonitor() {
+ Config.Facade.get_instance().auto_import_from_library_changed.disconnect(on_config_changed);
+ }
+
+ public override void close() {
+ cancellable.cancel();
+
+ foreach (MediaMonitor monitor in monitors)
+ monitor.close();
+
+ if (import_queue_timer_id != 0) {
+ Source.remove(import_queue_timer_id);
+ import_queue_timer_id = 0;
+ }
+
+ base.close();
+ }
+
+ private void add_to_discovered_list(MediaMonitor monitor, Monitorable monitorable) {
+ if (!discovered.has_key(monitor))
+ discovered.set(monitor, new Gee.HashSet<Monitorable>());
+
+ discovered.get(monitor).add(monitorable);
+ }
+
+ private MediaMonitor get_monitor_for_monitorable(Monitorable monitorable) {
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.get_media_source_collection().holds_type_of_source(monitorable))
+ return monitor;
+ }
+
+ error("Unable to locate MediaMonitor for %s", monitorable.to_string());
+ }
+
+ public override void discovery_started() {
+ foreach (MediaSourceCollection collection in MediaCollectionRegistry.get_instance().get_all())
+ monitors.add(collection.create_media_monitor(workers, cancellable));
+
+ foreach (MediaMonitor monitor in monitors)
+ monitor.notify_discovery_started();
+
+ discovered = new Gee.HashMap<MediaMonitor, Gee.Set<Monitorable>>();
+ unknown_files = new Gee.HashSet<File>(file_hash, file_equal);
+
+ base.discovery_started();
+ }
+
+ public override void file_discovered(File file, FileInfo info) {
+ Monitorable? representation = null;
+ MediaMonitor representing = null;
+ bool ignore = false;
+ foreach (MediaMonitor monitor in monitors) {
+ MediaMonitor.DiscoveredFile result = monitor.notify_file_discovered(file, info,
+ out representation);
+ if (result == MediaMonitor.DiscoveredFile.REPRESENTED) {
+ representing = monitor;
+
+ break;
+ } else if (result == MediaMonitor.DiscoveredFile.IGNORE) {
+ // known but not to be worried about (for purposes of discovery)
+ ignore = true;
+
+ break;
+ }
+ }
+
+ if (representing != null) {
+ assert(representation != null && !ignore);
+ add_to_discovered_list(representing, representation);
+ } else if (!ignore && !Tombstone.global.matches(file) && is_supported_filetype(file)) {
+ unknown_files.add(file);
+ }
+
+ base.file_discovered(file, info);
+ }
+
+ public override void discovery_completed() {
+ async_discovery_completed.begin();
+ }
+
+ private async void async_discovery_completed() {
+ // before marking anything online/offline, reimporting changed files, or auto-importing new
+ // files, want to see if the unknown files are actually renamed files. Do this by examining
+ // their FileInfo and calculating their MD5 in the background ... when all this is sorted
+ // out, then go on and finish the other tasks
+ if (unknown_files.size == 0) {
+ discovery_stage_completed();
+
+ return;
+ }
+
+ Gee.ArrayList<Monitorable> all_candidates = new Gee.ArrayList<Monitorable>();
+ Gee.ArrayList<File> adopted = new Gee.ArrayList<File>(file_equal);
+ foreach (File file in unknown_files) {
+ FileInfo? info = get_file_info(file);
+ if (info == null)
+ continue;
+
+ // clear before using (reused as accumulator)
+ all_candidates.clear();
+
+ Gee.Collection<Monitorable>? candidates = null;
+ bool associated = false;
+ foreach (MediaMonitor monitor in monitors) {
+ MediaMonitor.DiscoveredFile result;
+ candidates = monitor.candidates_for_unknown_file(file, info, out result);
+ if (result == MediaMonitor.DiscoveredFile.REPRESENTED
+ || result == MediaMonitor.DiscoveredFile.IGNORE) {
+ associated = true;
+
+ break;
+ } else if (candidates != null) {
+ all_candidates.add_all(candidates);
+ }
+ }
+
+ if (associated) {
+ adopted.add(file);
+
+ continue;
+ }
+
+ // verify the matches with an MD5 comparison
+ if (all_candidates.size > 0) {
+ // copy for background thread
+ Gee.ArrayList<Monitorable> job_candidates = all_candidates;
+ all_candidates = new Gee.ArrayList<Monitorable>();
+
+ checksums_total++;
+ workers.enqueue(new FindMoveJob(this, file, job_candidates));
+ }
+
+ Idle.add(async_discovery_completed.callback);
+ yield;
+ }
+
+ // remove all adopted files from the unknown list
+ unknown_files.remove_all(adopted);
+
+ checksums_completed = 0;
+
+ if (checksums_total == 0) {
+ discovery_stage_completed();
+ } else {
+ mdbg("%d checksum jobs initiated to verify unknown photo files".printf(checksums_total));
+ auto_update_progress(checksums_completed, checksums_total);
+ }
+ }
+
+ private void report_checksum_job_completed() {
+ assert(checksums_completed < checksums_total);
+ checksums_completed++;
+
+ auto_update_progress(checksums_completed, checksums_total);
+
+ if (checksums_completed == checksums_total)
+ discovery_stage_completed();
+ }
+
+ private void on_find_move_completed(BackgroundJob j) {
+ FindMoveJob job = (FindMoveJob) j;
+
+ // if match was found, give file to the media and removed from both the unknown list and
+ // add to the discovered list ... do NOT mark losers as offline as other jobs may discover
+ // files that belong to them; discovery_stage_completed() will work this out in the end
+ if (job.match != null) {
+ mdbg("Found moved master file: %s matches %s".printf(job.file.get_path(),
+ job.match.to_string()));
+
+ MediaMonitor monitor = get_monitor_for_monitorable(job.match);
+ monitor.update_master_file(job.match, job.file);
+ unknown_files.remove(job.file);
+ add_to_discovered_list(monitor, job.match);
+ }
+
+ if (job.err != null)
+ warning("Unable to checksum unknown media file %s: %s", job.file.get_path(), job.err.message);
+
+ report_checksum_job_completed();
+ }
+
+ private void on_find_move_cancelled(BackgroundJob j) {
+ report_checksum_job_completed();
+ }
+
+ private void discovery_stage_completed() {
+ foreach (MediaMonitor monitor in monitors) {
+ Gee.Set<Monitorable>? monitorables = discovered.get(monitor);
+ if (monitorables != null) {
+ foreach (Monitorable monitorable in monitorables)
+ enqueue_verify_monitorable(monitorable, monitor);
+ }
+
+ foreach (DataObject object in monitor.get_media_source_collection().get_all()) {
+ Monitorable monitorable = (Monitorable) object;
+
+ if (monitorables != null && monitorables.contains(monitorable))
+ continue;
+
+ enqueue_verify_monitorable(monitorable, monitor);
+ }
+
+ foreach (DataSource source in
+ monitor.get_media_source_collection().get_offline_bin().get_all()) {
+ Monitorable monitorable = (Monitorable) source;
+
+ if (monitorables != null && monitorables.contains(monitorable))
+ continue;
+
+ enqueue_verify_monitorable(monitorable, monitor);
+ }
+ }
+
+ // enqueue all remaining unknown photo files for import
+ if (auto_import)
+ enqueue_import_many(unknown_files);
+
+ // release refs
+ discovered = null;
+ unknown_files = null;
+
+ // Now that the discovery is completed, launch a scan of the tombstoned files and see if
+ // they can be resurrected
+ Tombstone.global.launch_scan(this, cancellable);
+
+ // Only report discovery completed here, after all the other background work is done
+ base.discovery_completed();
+ }
+
+ private void enqueue_verify_monitorable(Monitorable monitorable, MediaMonitor monitor) {
+ bool offered = verify_queue.offer(new VerifyJob(monitorable, monitor));
+ assert(offered);
+
+ execute_next_verify_job();
+ }
+
+ private void execute_next_verify_job() {
+ if (outstanding_verify_jobs >= MAX_VERIFY_EXISTING_MEDIA_JOBS || verify_queue.size == 0)
+ return;
+
+ VerifyJob? job = verify_queue.poll();
+ assert(job != null);
+
+ outstanding_verify_jobs++;
+ verify_monitorable.begin(job.monitorable, job.monitor);
+ }
+
+ private async void verify_monitorable(Monitorable monitorable, MediaMonitor monitor) {
+ File[] files = new File[1];
+ files[0] = monitor.get_master_file(monitorable);
+
+ File[]? aux_files = monitor.get_auxilliary_backing_files(monitorable);
+ if (aux_files != null) {
+ foreach (File aux_file in aux_files)
+ files += aux_file;
+ }
+
+ for (int ctr = 0; ctr < files.length; ctr++) {
+ File file = files[ctr];
+
+ FileInfo? info = get_file_info(file);
+ if (info == null) {
+ try {
+ info = yield file.query_info_async(SUPPLIED_ATTRIBUTES, FILE_INFO_FLAGS,
+ DEFAULT_PRIORITY, cancellable);
+ } catch (Error err) {
+ // ignore, this happens when file is not found
+ }
+ }
+
+ // if master file, control online/offline state
+ if (ctr == 0) {
+ if (info != null && monitor.is_offline(monitorable))
+ monitor.update_online(monitorable);
+ else if (info == null && !monitor.is_offline(monitorable))
+ monitor.update_offline(monitorable);
+ }
+
+ monitor.update_backing_file_info(monitorable, file, info);
+ }
+
+ completed_monitorable_verifies++;
+ auto_update_progress(completed_monitorable_verifies, total_monitorable_verifies);
+
+ Idle.add(verify_monitorable.callback, DEFAULT_PRIORITY);
+ yield;
+
+ // finished, move on to the next job in the queue
+ assert(outstanding_verify_jobs > 0);
+ outstanding_verify_jobs--;
+
+ execute_next_verify_job();
+ }
+
+ private void on_config_changed() {
+ bool value = Config.Facade.get_instance().get_auto_import_from_library();
+
+ if (auto_import == value)
+ return;
+
+ auto_import = value;
+ if (auto_import) {
+ if (!CommandlineOptions.no_runtime_monitoring)
+ import_unrepresented_files();
+ } else {
+ cancel_batch_imports();
+ }
+ }
+
+ private void enqueue_import(File file) {
+ if (!pending_imports.contains(file) && is_supported_filetype(file) && !is_blacklisted(file))
+ import_queue.add(file);
+ }
+
+ private void enqueue_import_many(Gee.Collection<File> files) {
+ foreach (File file in files)
+ enqueue_import(file);
+ }
+
+ private void remove_queued_import(File file) {
+ import_queue.remove(file);
+ }
+
+ private bool on_flush_import_queue() {
+ if (cancellable.is_cancelled())
+ return false;
+
+ if (import_queue.size == 0)
+ return true;
+
+ // if currently importing, wait for it to finish before starting next one; this maximizes
+ // the number of items submitted each time
+ if (current_batch_import != null)
+ return true;
+
+ mdbg("Auto-importing %d files".printf(import_queue.size));
+
+ // If no import roll, or it's been over IMPORT_ROLL_QUIET_SEC since using the last one,
+ // create a new one. This allows for multiple files to come in back-to-back and be
+ // imported on the same roll.
+ time_t now = (time_t) now_sec();
+ if (current_import_roll == null || (now - last_import_roll_use) >= IMPORT_ROLL_QUIET_SEC)
+ current_import_roll = new BatchImportRoll();
+ last_import_roll_use = now;
+
+ Gee.ArrayList<BatchImportJob> jobs = new Gee.ArrayList<BatchImportJob>();
+ foreach (File file in import_queue) {
+ if (is_blacklisted(file))
+ continue;
+
+ jobs.add(new FileImportJob(file, false));
+ pending_imports.add(file);
+ }
+
+ import_queue.clear();
+
+ BatchImport importer = new BatchImport(jobs, "LibraryMonitor autoimport",
+ null, null, null, null, current_import_roll);
+ importer.set_untrash_duplicates(false);
+ importer.set_mark_duplicates_online(false);
+ batch_import_queue.add(importer);
+
+ schedule_next_batch_import();
+
+ return true;
+ }
+
+ private void schedule_next_batch_import() {
+ if (current_batch_import != null || batch_import_queue.size == 0)
+ return;
+
+ current_batch_import = batch_import_queue[0];
+ current_batch_import.preparing.connect(on_import_preparing);
+ current_batch_import.progress.connect(on_import_progress);
+ current_batch_import.import_complete.connect(on_import_complete);
+ current_batch_import.schedule();
+ }
+
+ private void discard_current_batch_import() {
+ assert(current_batch_import != null);
+
+ bool removed = batch_import_queue.remove(current_batch_import);
+ assert(removed);
+ current_batch_import.preparing.disconnect(on_import_preparing);
+ current_batch_import.progress.disconnect(on_import_progress);
+ current_batch_import.import_complete.disconnect(on_import_complete);
+ current_batch_import = null;
+
+ // a "proper" way to do this would be a complex data structure that stores the association
+ // of every file to its BatchImport and removes it from the pending_imports Set when
+ // the BatchImport completes, cancelled or not (the removal using manifest.all in
+ // on_import_completed doesn't catch files not imported due to cancellation) ... but, since
+ // individual BatchImports can't be cancelled, only all of them, this works
+ if (batch_import_queue.size == 0)
+ pending_imports.clear();
+ }
+
+ private void cancel_batch_imports() {
+ // clear everything queued up (that is not the current batch import)
+ int ctr = 0;
+ while (ctr < batch_import_queue.size) {
+ if (batch_import_queue[ctr] == current_batch_import) {
+ ctr++;
+
+ continue;
+ }
+
+ batch_import_queue.remove(batch_import_queue[ctr]);
+ }
+
+ // cancel the current import and remove it when the completion is called
+ if (current_batch_import != null)
+ current_batch_import.user_halt();
+
+ // remove all pending so if a new import comes in, it won't be skipped
+ pending_imports.clear();
+ }
+
+ private void on_import_preparing() {
+ auto_import_preparing();
+ }
+
+ private void on_import_progress(uint64 completed_bytes, uint64 total_bytes) {
+ auto_import_progress(completed_bytes, total_bytes);
+ }
+
+ private void on_import_complete(BatchImport batch_import, ImportManifest manifest,
+ BatchImportRoll import_roll) {
+ assert(batch_import == current_batch_import);
+
+ mdbg("auto-import batch completed %d".printf(manifest.all.size));
+ auto_import_progress(0, 0);
+
+ foreach (BatchImportResult result in manifest.all) {
+ // don't verify the pending_imports file is removed, it can be removed if the import
+ // was cancelled
+ if (result.file != null)
+ pending_imports.remove(result.file);
+ }
+
+ if (manifest.already_imported.size > 0) {
+ Gee.ArrayList<TombstonedFile> to_tombstone = new Gee.ArrayList<TombstonedFile>();
+ foreach (BatchImportResult result in manifest.already_imported) {
+ FileInfo? info = get_file_info(result.file);
+ if (info == null) {
+ warning("Unable to get info for duplicate file %s", result.file.get_path());
+
+ continue;
+ }
+
+ to_tombstone.add(new TombstonedFile(result.file, info.get_size(), null));
+ }
+
+ try {
+ Tombstone.entomb_many_files(to_tombstone, Tombstone.Reason.AUTO_DETECTED_DUPLICATE);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+
+ mdbg("%d files remain pending for auto-import".printf(pending_imports.size));
+
+ discard_current_batch_import();
+ schedule_next_batch_import();
+ }
+
+ //
+ // Real-time monitoring & auto-import
+ //
+
+ // USE WITH CARE. Because changes to the photo's state will not be updated as its backing
+ // file(s) change, it's possible for the library to diverge with what's on disk while the
+ // media source is blacklisted. If the media source is removed from the blacklist and
+ // unexpected state changes occur (such as file-altered being detected but not the file-create),
+ // the change will either be dropped on the floor or the state of the library will be
+ // indeterminate.
+ //
+ // Use of this method should be avoided at all costs (otherwise the point of the real-time
+ // monitor is negated).
+ public static void blacklist_file(File file, string reason) {
+ mdbg("[%s] Blacklisting %s".printf(reason, file.get_path()));
+ lock (blacklist) {
+ blacklist.add(file);
+ }
+ }
+
+ public static void unblacklist_file(File file) {
+ // don't want to immediately remove the blacklisted file because the monitoring events
+ // can come in much later
+ lock (blacklist) {
+ if (blacklist.contains(file) && !to_unblacklist.contains(file))
+ to_unblacklist.enqueue(file);
+ }
+ }
+
+ private static void on_unblacklist_file(File file) {
+ bool removed;
+ lock (blacklist) {
+ removed = blacklist.remove(file);
+ }
+
+ if (removed)
+ mdbg("Blacklist for %s removed".printf(file.get_path()));
+ else
+ warning("File %s was not blacklisted but unblacklisted", file.get_path());
+ }
+
+ public static bool is_blacklisted(File file) {
+ lock (blacklist) {
+ return blacklist.contains(file);
+ }
+ }
+
+ private bool is_supported_filetype(File file) {
+ return MediaCollectionRegistry.get_instance().get_collection_for_file(file) != null;
+ }
+
+ // NOTE: This only works when runtime monitoring is enabled. Otherwise, DirectoryMonitor will
+ // not be tracking files.
+ private void import_unrepresented_files() {
+ if (!auto_import)
+ return;
+
+ Gee.ArrayList<File> to_import = null;
+ foreach (File file in get_files()) {
+ FileInfo? info = get_file_info(file);
+ if (info == null || info.get_file_type() != FileType.REGULAR)
+ continue;
+
+ if (pending_imports.contains(file))
+ continue;
+
+ if (Tombstone.global.matches(file))
+ continue;
+
+ bool represented = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.is_file_represented(file)) {
+ represented = true;
+
+ break;
+ }
+ }
+
+ if (represented)
+ continue;
+
+ if (!is_supported_filetype(file))
+ continue;
+
+ if (to_import == null)
+ to_import = new Gee.ArrayList<File>(file_equal);
+
+ to_import.add(file);
+ }
+
+ if (to_import != null)
+ enqueue_import_many(to_import);
+ }
+
+ // It's possible for the monitor to miss a file create but report other activities, which we
+ // can use to pick up new files
+ private void runtime_unknown_file_discovered(File file) {
+ if (auto_import && is_supported_filetype(file) && !Tombstone.global.matches(file)) {
+ mdbg("Unknown file %s discovered, enqueuing for import".printf(file.get_path()));
+ enqueue_import(file);
+ }
+ }
+
+ protected override void notify_file_created(File file, FileInfo info) {
+ if (is_blacklisted(file)) {
+ base.notify_file_created(file, info);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_created(file, info)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known) {
+ // attempt to match the new file with a Monitorable that is offline
+ Gee.HashSet<Monitorable> all_candidates = null;
+ foreach (MediaMonitor monitor in monitors) {
+ MediaMonitor.DiscoveredFile result;
+ Gee.Collection<Monitorable>? candidates = monitor.candidates_for_unknown_file(file,
+ info, out result);
+ if (result == MediaMonitor.DiscoveredFile.REPRESENTED ||
+ result == MediaMonitor.DiscoveredFile.IGNORE) {
+ mdbg("%s %s created file %s".printf(monitor.to_string(), result.to_string(),
+ file.get_path()));
+
+ known = true;
+
+ break;
+ } else if (candidates != null && candidates.size > 0) {
+ mdbg("%s suggests %d candidates for created file %s".printf(monitor.to_string(),
+ candidates.size, file.get_path()));
+
+ if (all_candidates == null)
+ all_candidates = new Gee.HashSet<Monitorable>();
+
+ foreach (Monitorable candidate in candidates) {
+ if (monitor.is_offline(candidate))
+ all_candidates.add(candidate);
+ }
+ }
+ }
+
+ if (!known && all_candidates != null && all_candidates.size > 0) {
+ mdbg("%d candidates for created file %s being checksummed".printf(all_candidates.size,
+ file.get_path()));
+
+ workers.enqueue(new RuntimeFindMoveJob(this, file, all_candidates));
+ // mark as known to avoid adding file for possible import
+ known = true;
+ }
+ }
+
+ if (!known)
+ runtime_unknown_file_discovered(file);
+
+ base.notify_file_created(file, info);
+ }
+
+ private void on_runtime_find_move_completed(BackgroundJob j) {
+ RuntimeFindMoveJob job = (RuntimeFindMoveJob) j;
+
+ if (job.err != null) {
+ critical("Error attempting to find a match at runtime for %s: %s", job.file.get_path(),
+ job.err.message);
+ }
+
+ if (job.match != null) {
+ MediaMonitor monitor = get_monitor_for_monitorable(job.match);
+ monitor.update_master_file(job.match, job.file);
+ monitor.update_online(job.match);
+ } else {
+ // no match found, mark file for possible import
+ runtime_unknown_file_discovered(job.file);
+ }
+ }
+
+ protected override void notify_file_moved(File old_file, File new_file, FileInfo new_info) {
+ if (is_blacklisted(old_file) || is_blacklisted(new_file)) {
+ base.notify_file_moved(old_file, new_file, new_info);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_moved(old_file, new_file, new_info)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known)
+ runtime_unknown_file_discovered(new_file);
+
+ base.notify_file_moved(old_file, new_file, new_info);
+ }
+
+ protected override void notify_file_altered(File file) {
+ if (is_blacklisted(file)) {
+ base.notify_file_altered(file);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_altered(file)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known)
+ runtime_unknown_file_discovered(file);
+
+ base.notify_file_altered(file);
+ }
+
+ protected override void notify_file_attributes_altered(File file) {
+ if (is_blacklisted(file)) {
+ base.notify_file_attributes_altered(file);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_attributes_altered(file)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known)
+ runtime_unknown_file_discovered(file);
+
+ base.notify_file_attributes_altered(file);
+ }
+
+ protected override void notify_file_alteration_completed(File file, FileInfo info) {
+ if (is_blacklisted(file)) {
+ base.notify_file_alteration_completed(file, info);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_alteration_completed(file, info)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known)
+ runtime_unknown_file_discovered(file);
+
+ base.notify_file_alteration_completed(file, info);
+ }
+
+ protected override void notify_file_deleted(File file) {
+ if (is_blacklisted(file)) {
+ base.notify_file_deleted(file);
+
+ return;
+ }
+
+ bool known = false;
+ foreach (MediaMonitor monitor in monitors) {
+ if (monitor.notify_file_deleted(file)) {
+ known = true;
+
+ break;
+ }
+ }
+
+ if (!known) {
+ // ressurrect tombstone if deleted
+ Tombstone? tombstone = Tombstone.global.locate(file);
+ if (tombstone != null) {
+ debug("Resurrecting tombstoned file %s", file.get_path());
+ Tombstone.global.resurrect(tombstone);
+ }
+
+ // remove from import queue
+ remove_queued_import(file);
+ }
+
+ base.notify_file_deleted(file);
+ }
+}
+
diff --git a/src/MediaDataRepresentation.vala b/src/MediaDataRepresentation.vala
new file mode 100644
index 0000000..6a54718
--- /dev/null
+++ b/src/MediaDataRepresentation.vala
@@ -0,0 +1,899 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class BackingFileState {
+ public string filepath;
+ public int64 filesize;
+ public time_t modification_time;
+ public string? md5;
+
+ public BackingFileState(string filepath, int64 filesize, time_t modification_time, string? md5) {
+ this.filepath = filepath;
+ this.filesize = filesize;
+ this.modification_time = modification_time;
+ this.md5 = md5;
+ }
+
+ public BackingFileState.from_photo_row(BackingPhotoRow photo_row, string? md5) {
+ this.filepath = photo_row.filepath;
+ this.filesize = photo_row.filesize;
+ this.modification_time = photo_row.timestamp;
+ this.md5 = md5;
+ }
+
+ public File get_file() {
+ return File.new_for_path(filepath);
+ }
+}
+
+public abstract class MediaSource : ThumbnailSource, Indexable {
+ public virtual signal void master_replaced(File old_file, File new_file) {
+ }
+
+ private Event? event = null;
+ private string? indexable_keywords = null;
+
+ public MediaSource(int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+ }
+
+ protected static inline uint64 internal_add_flags(uint64 flags, uint64 selector) {
+ return (flags | selector);
+ }
+
+ protected static inline uint64 internal_remove_flags(uint64 flags, uint64 selector) {
+ return (flags & ~selector);
+ }
+
+ protected static inline bool internal_is_flag_set(uint64 flags, uint64 selector) {
+ return ((flags & selector) != 0);
+ }
+
+ protected virtual void notify_master_replaced(File old_file, File new_file) {
+ master_replaced(old_file, new_file);
+ }
+
+ protected override void notify_altered(Alteration alteration) {
+ Alteration local = alteration;
+
+ if (local.has_detail("metadata", "name") || local.has_detail("backing", "master")) {
+ update_indexable_keywords();
+ local = local.compress(new Alteration("indexable", "keywords"));
+ }
+
+ base.notify_altered(local);
+ }
+
+ // use this method as a kind of post-constructor initializer; it means the DataSource has been
+ // added or removed to a SourceCollection.
+ protected override void notify_membership_changed(DataCollection? collection) {
+ if (collection != null && indexable_keywords == null) {
+ // don't fire the alteration here, as the MediaSource is only being added to its
+ // SourceCollection
+ update_indexable_keywords();
+ }
+
+ base.notify_membership_changed(collection);
+ }
+
+ private void update_indexable_keywords() {
+ string[] indexables = new string[3];
+ indexables[0] = get_title();
+ indexables[1] = get_basename();
+ indexables[2] = get_comment();
+
+ indexable_keywords = prepare_indexable_strings(indexables);
+ }
+
+ public unowned string? get_indexable_keywords() {
+ return indexable_keywords;
+ }
+
+ protected abstract bool set_event_id(EventID id);
+
+ protected bool delete_original_file() {
+ bool ret = false;
+ File file = get_master_file();
+
+ try {
+ ret = file.trash(null);
+ } catch (Error err) {
+ // log error but don't abend, as this is not fatal to operation (also, could be
+ // the photo is removed because it could not be found during a verify)
+ message("Unable to move original photo %s to trash: %s", file.get_path(), err.message);
+ }
+
+ // remove empty directories corresponding to imported path, but only if file is located
+ // inside the user's Pictures directory
+ if (file.has_prefix(AppDirs.get_import_dir())) {
+ File parent = file;
+ while (!parent.equal(AppDirs.get_import_dir())) {
+ parent = parent.get_parent();
+ if ((parent == null) || (parent.equal(AppDirs.get_import_dir())))
+ break;
+
+ try {
+ if (!query_is_directory_empty(parent))
+ break;
+ } catch (Error err) {
+ warning("Unable to query file info for %s: %s", parent.get_path(), err.message);
+
+ break;
+ }
+
+ try {
+ parent.delete(null);
+ debug("Deleted empty directory %s", parent.get_path());
+ } catch (Error err) {
+ // again, log error but don't abend
+ message("Unable to delete empty directory %s: %s", parent.get_path(),
+ err.message);
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ public override string get_name() {
+ string? title = get_title();
+
+ return is_string_empty(title) ? get_basename() : title;
+ }
+
+ public virtual string get_basename() {
+ return get_file().get_basename();
+ }
+
+ public abstract File get_file();
+ public abstract File get_master_file();
+ public abstract uint64 get_master_filesize();
+ public abstract uint64 get_filesize();
+ public abstract time_t get_timestamp();
+
+ // Must return at least one, for the master file.
+ public abstract BackingFileState[] get_backing_files_state();
+
+ public abstract string? get_title();
+ public abstract string? get_comment();
+ public abstract void set_title(string? title);
+ public abstract bool set_comment(string? comment);
+
+ public static string? prep_title(string? title) {
+ return prepare_input_text(title,
+ PrepareInputTextOptions.DEFAULT & ~PrepareInputTextOptions.EMPTY_IS_NULL, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ }
+
+ public static string? prep_comment(string? comment) {
+ return prepare_input_text(comment,
+ PrepareInputTextOptions.DEFAULT & ~PrepareInputTextOptions.STRIP_CRLF & ~PrepareInputTextOptions.EMPTY_IS_NULL, -1);
+ }
+
+ public abstract Rating get_rating();
+ public abstract void set_rating(Rating rating);
+ public abstract void increase_rating();
+ public abstract void decrease_rating();
+
+ public abstract Dimensions get_dimensions(Photo.Exception disallowed_steps = Photo.Exception.NONE);
+
+ // A preview pixbuf is one that can be quickly generated and scaled as a preview. For media
+ // type that support transformations (i.e. photos) it is fully transformed.
+ //
+ // Note that an unscaled scaling is not considered a performance-killer for this method,
+ // although the quality of the pixbuf may be quite poor compared to the actual unscaled
+ // transformed pixbuf.
+ public abstract Gdk.Pixbuf get_preview_pixbuf(Scaling scaling) throws Error;
+
+ public abstract bool is_trashed();
+ public abstract void trash();
+ public abstract void untrash();
+
+ public abstract bool is_offline();
+ public abstract void mark_offline();
+ public abstract void mark_online();
+
+ public abstract string get_master_md5();
+
+ // WARNING: some child classes of MediaSource (e.g. Photo) implement this method in a
+ // non-thread safe manner for efficiency.
+ public abstract EventID get_event_id();
+
+ public Event? get_event() {
+ if (event != null)
+ return event;
+
+ EventID event_id = get_event_id();
+ if (!event_id.is_valid())
+ return null;
+
+ event = Event.global.fetch(event_id);
+
+ return event;
+ }
+
+ public bool set_event(Event? new_event) {
+ EventID event_id = (new_event != null) ? new_event.get_event_id() : EventID();
+ if (get_event_id().id == event_id.id)
+ return true;
+
+ bool committed = set_event_id(event_id);
+ if (committed) {
+ if (event != null)
+ event.detach(this);
+
+ if (new_event != null)
+ new_event.attach(this);
+
+ event = new_event;
+
+ notify_altered(new Alteration("metadata", "event"));
+ }
+
+ return committed;
+ }
+
+ public static void set_many_to_event(Gee.Collection<MediaSource> media_sources, Event? event,
+ TransactionController controller) throws Error {
+ EventID event_id = (event != null) ? event.get_event_id() : EventID();
+
+ controller.begin();
+
+ foreach (MediaSource media in media_sources) {
+ Event? old_event = media.get_event();
+ if (old_event != null)
+ old_event.detach(media);
+
+ media.set_event_id(event_id);
+ media.event = event;
+ }
+
+ if (event != null)
+ event.attach_many(media_sources);
+
+ Alteration alteration = new Alteration("metadata", "event");
+ foreach (MediaSource media in media_sources)
+ media.notify_altered(alteration);
+
+ controller.commit();
+ }
+
+ public abstract time_t get_exposure_time();
+
+ public abstract ImportID get_import_id();
+}
+
+public class MediaSourceHoldingTank : DatabaseSourceHoldingTank {
+ private Gee.HashMap<File, MediaSource> master_file_map = new Gee.HashMap<File, MediaSource>(
+ file_hash, file_equal);
+
+ public MediaSourceHoldingTank(MediaSourceCollection sources,
+ SourceHoldingTank.CheckToKeep check_to_keep, GetSourceDatabaseKey get_key) {
+ base (sources, check_to_keep, get_key);
+ }
+
+ public MediaSource? fetch_by_master_file(File file) {
+ return master_file_map.get(file);
+ }
+
+ public MediaSource? fetch_by_md5(string md5) {
+ foreach (MediaSource source in master_file_map.values) {
+ if (source.get_master_md5() == md5) {
+ return source;
+ }
+ }
+
+ return null;
+ }
+
+ protected override void notify_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ if (added != null) {
+ foreach (DataSource source in added) {
+ MediaSource media_source = (MediaSource) source;
+ master_file_map.set(media_source.get_master_file(), media_source);
+ media_source.master_replaced.connect(on_master_source_replaced);
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataSource source in removed) {
+ MediaSource media_source = (MediaSource) source;
+ bool is_removed = master_file_map.unset(media_source.get_master_file());
+ assert(is_removed);
+ media_source.master_replaced.disconnect(on_master_source_replaced);
+ }
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ private void on_master_source_replaced(MediaSource media_source, File old_file, File new_file) {
+ bool removed = master_file_map.unset(old_file);
+ assert(removed);
+
+ master_file_map.set(new_file, media_source);
+ }
+}
+
+// This class is good for any MediaSourceCollection that is backed by a DatabaseTable (which should
+// be all of them, but if not, they should construct their own implementation).
+public class MediaSourceTransactionController : TransactionController {
+ private MediaSourceCollection sources;
+
+ public MediaSourceTransactionController(MediaSourceCollection sources) {
+ this.sources = sources;
+ }
+
+ protected override void begin_impl() throws Error {
+ DatabaseTable.begin_transaction();
+ sources.freeze_notifications();
+ }
+
+ protected override void commit_impl() throws Error {
+ sources.thaw_notifications();
+ DatabaseTable.commit_transaction();
+ }
+}
+
+public abstract class MediaSourceCollection : DatabaseSourceCollection {
+ public abstract TransactionController transaction_controller { get; }
+
+ private MediaSourceHoldingTank trashcan = null;
+ private MediaSourceHoldingTank offline_bin = null;
+ private Gee.HashMap<File, MediaSource> by_master_file = new Gee.HashMap<File, MediaSource>(
+ file_hash, file_equal);
+ private Gee.MultiMap<ImportID?, MediaSource> import_rolls =
+ new Gee.TreeMultiMap<ImportID?, MediaSource>(ImportID.compare_func);
+ private Gee.TreeSet<ImportID?> sorted_import_ids = new Gee.TreeSet<ImportID?>(ImportID.compare_func);
+ private Gee.Set<MediaSource> flagged = new Gee.HashSet<MediaSource>();
+
+ // This signal is fired when MediaSources are added to the collection due to a successful import.
+ // "items-added" and "contents-altered" will follow.
+ public virtual signal void media_import_starting(Gee.Collection<MediaSource> media) {
+ }
+
+ // This signal is fired when MediaSources have been added to the collection due to a successful
+ // import and import postprocessing has completed (such as adding an import Photo to its Tags).
+ // Thus, signals that have already been fired (in this order) are "media-imported", "items-added",
+ // "contents-altered" before this signal.
+ public virtual signal void media_import_completed(Gee.Collection<MediaSource> media) {
+ }
+
+ public virtual signal void master_file_replaced(MediaSource media, File old_file, File new_file) {
+ }
+
+ public virtual signal void trashcan_contents_altered(Gee.Collection<MediaSource>? added,
+ Gee.Collection<MediaSource>? removed) {
+ }
+
+ public virtual signal void import_roll_altered() {
+ }
+
+ public virtual signal void offline_contents_altered(Gee.Collection<MediaSource>? added,
+ Gee.Collection<MediaSource>? removed) {
+ }
+
+ public virtual signal void flagged_contents_altered() {
+ }
+
+ public MediaSourceCollection(string name, GetSourceDatabaseKey source_key_func) {
+ base(name, source_key_func);
+
+ trashcan = create_trashcan();
+ offline_bin = create_offline_bin();
+ }
+
+ public static void filter_media(Gee.Collection<MediaSource> media,
+ Gee.Collection<LibraryPhoto>? photos, Gee.Collection<Video>? videos) {
+ foreach (MediaSource source in media) {
+ if (photos != null && source is LibraryPhoto)
+ photos.add((LibraryPhoto) source);
+ else if (videos != null && source is Video)
+ videos.add((Video) source);
+ else if (photos != null || videos != null)
+ warning("Unrecognized media: %s", source.to_string());
+ }
+ }
+
+ public static void count_media(Gee.Collection<MediaSource> media, out int photo_count,
+ out int video_count) {
+ Gee.ArrayList<MediaSource> photos = new Gee.ArrayList<MediaSource>();
+ Gee.ArrayList<MediaSource> videos = new Gee.ArrayList<MediaSource>();
+
+ filter_media(media, photos, videos);
+
+ photo_count = photos.size;
+ video_count = videos.size;
+ }
+
+ public static bool has_photo(Gee.Collection<MediaSource> media) {
+ foreach (MediaSource current_media in media) {
+ if (current_media is Photo) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static bool has_video(Gee.Collection<MediaSource> media) {
+ foreach (MediaSource current_media in media) {
+ if (current_media is Video) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected abstract MediaSourceHoldingTank create_trashcan();
+
+ protected abstract MediaSourceHoldingTank create_offline_bin();
+
+ public abstract MediaMonitor create_media_monitor(Workers workers, Cancellable cancellable);
+
+ public abstract string get_typename();
+
+ public abstract bool is_file_recognized(File file);
+
+ public MediaSourceHoldingTank get_trashcan() {
+ return trashcan;
+ }
+
+ public MediaSourceHoldingTank get_offline_bin() {
+ return offline_bin;
+ }
+
+ // NOTE: numeric id's are not unique throughout the system -- they're only unique
+ // per media type. So a MediaSourceCollection should only ever hold media
+ // of the same type.
+ protected abstract MediaSource? fetch_by_numeric_id(int64 numeric_id);
+
+ protected virtual void notify_import_roll_altered() {
+ import_roll_altered();
+ }
+
+ protected virtual void notify_flagged_contents_altered() {
+ flagged_contents_altered();
+ }
+
+ protected virtual void notify_media_import_starting(Gee.Collection<MediaSource> media) {
+ media_import_starting(media);
+ }
+
+ protected virtual void notify_media_import_completed(Gee.Collection<MediaSource> media) {
+ media_import_completed(media);
+ }
+
+ protected override void items_altered(Gee.Map<DataObject, Alteration> items) {
+ Gee.ArrayList<MediaSource> to_trashcan = null;
+ Gee.ArrayList<MediaSource> to_offline = null;
+ bool flagged_altered = false;
+ foreach (DataObject object in items.keys) {
+ Alteration alteration = items.get(object);
+ MediaSource source = (MediaSource) object;
+
+ if (!alteration.has_subject("metadata"))
+ continue;
+
+ if (source.is_trashed() && !get_trashcan().contains(source)) {
+ if (to_trashcan == null)
+ to_trashcan = new Gee.ArrayList<MediaSource>();
+
+ to_trashcan.add(source);
+
+ // sources can only be in trashcan or offline -- not both
+ continue;
+ }
+
+ if (source.is_offline() && !get_offline_bin().contains(source)) {
+ if (to_offline == null)
+ to_offline = new Gee.ArrayList<MediaSource>();
+
+ to_offline.add(source);
+ }
+
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null) {
+ if (flaggable.is_flagged())
+ flagged_altered = flagged.add(source) || flagged_altered;
+ else
+ flagged_altered = flagged.remove(source) || flagged_altered;
+ }
+ }
+
+ if (to_trashcan != null)
+ get_trashcan().unlink_and_hold(to_trashcan);
+
+ if (to_offline != null)
+ get_offline_bin().unlink_and_hold(to_offline);
+
+ if (flagged_altered)
+ notify_flagged_contents_altered();
+
+ base.items_altered(items);
+ }
+
+ protected override void notify_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ bool import_roll_changed = false;
+ bool flagged_altered = false;
+ if (added != null) {
+ foreach (DataObject object in added) {
+ MediaSource media = (MediaSource) object;
+
+ by_master_file.set(media.get_master_file(), media);
+ media.master_replaced.connect(on_master_replaced);
+
+ ImportID import_id = media.get_import_id();
+ if (import_id.is_valid()) {
+ sorted_import_ids.add(import_id);
+ import_rolls.set(import_id, media);
+
+ import_roll_changed = true;
+ }
+
+ Flaggable? flaggable = media as Flaggable;
+ if (flaggable != null ) {
+ if (flaggable.is_flagged())
+ flagged_altered = flagged.add(media) || flagged_altered;
+ else
+ flagged_altered = flagged.remove(media) || flagged_altered;
+ }
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ MediaSource media = (MediaSource) object;
+
+ bool is_removed = by_master_file.unset(media.get_master_file());
+ assert(is_removed);
+ media.master_replaced.disconnect(on_master_replaced);
+
+ ImportID import_id = media.get_import_id();
+ if (import_id.is_valid()) {
+ is_removed = import_rolls.remove(import_id, media);
+ assert(is_removed);
+ if (!import_rolls.contains(import_id))
+ sorted_import_ids.remove(import_id);
+
+ import_roll_changed = true;
+ }
+
+ flagged_altered = flagged.remove(media) || flagged_altered;
+ }
+ }
+
+ if (import_roll_changed)
+ notify_import_roll_altered();
+
+ if (flagged_altered)
+ notify_flagged_contents_altered();
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ private void on_master_replaced(MediaSource media, File old_file, File new_file) {
+ bool is_removed = by_master_file.unset(old_file);
+ assert(is_removed);
+
+ by_master_file.set(new_file, media);
+
+ master_file_replaced(media, old_file, new_file);
+ }
+
+ public MediaSource? fetch_by_master_file(File file) {
+ return by_master_file.get(file);
+ }
+
+ public virtual MediaSource? fetch_by_source_id(string source_id) {
+ string[] components = source_id.split("-");
+ assert(components.length == 2);
+
+ return fetch_by_numeric_id(parse_int64(components[1], 16));
+ }
+
+ public abstract Gee.Collection<string> get_event_source_ids(EventID event_id);
+
+ public Gee.Collection<MediaSource> get_trashcan_contents() {
+ return (Gee.Collection<MediaSource>) get_trashcan().get_all();
+ }
+
+ public Gee.Collection<MediaSource> get_offline_bin_contents() {
+ return (Gee.Collection<MediaSource>) get_offline_bin().get_all();
+ }
+
+ public Gee.Collection<MediaSource> get_flagged() {
+ return flagged.read_only_view;
+ }
+
+ // The returned set of ImportID's is sorted from oldest to newest.
+ public Gee.SortedSet<ImportID?> get_import_roll_ids() {
+ return sorted_import_ids;
+ }
+
+ public ImportID? get_last_import_id() {
+ return sorted_import_ids.size != 0 ? sorted_import_ids.last() : null;
+ }
+
+ public Gee.Collection<MediaSource?>? get_import_roll(ImportID import_id) {
+ return import_rolls.get(import_id);
+ }
+
+ public void add_many_to_trash(Gee.Collection<MediaSource> sources) {
+ get_trashcan().add_many(sources);
+ }
+
+ public void add_many_to_offline(Gee.Collection<MediaSource> sources) {
+ get_offline_bin().add_many(sources);
+ }
+
+ public int get_trashcan_count() {
+ return get_trashcan().get_count();
+ }
+
+ // This method should be used in place of add_many() when adding MediaSources due to a successful
+ // import. This function fires appropriate signals and calls add_many(), so the signals
+ // associated with that call will be fired too.
+ public virtual void import_many(Gee.Collection<MediaSource> media) {
+ notify_media_import_starting(media);
+
+ add_many(media);
+
+ postprocess_imported_media(media);
+
+ notify_media_import_completed(media);
+ }
+
+ // Child classes can override this method to perform postprocessing on a imported media, such
+ // as associating them with tags or events.
+ protected virtual void postprocess_imported_media(Gee.Collection<MediaSource> media) {
+ }
+
+ // This operation cannot be cancelled; the return value of the ProgressMonitor is ignored.
+ // Note that delete_backing dictates whether or not the photos are tombstoned (if deleted,
+ // tombstones are not created).
+ public void remove_from_app(Gee.Collection<MediaSource>? sources, bool delete_backing,
+ ProgressMonitor? monitor = null, Gee.List<MediaSource>? not_removed = null) {
+ assert(sources != null);
+ // only tombstone if the backing is not being deleted
+ Gee.HashSet<MediaSource> to_tombstone = !delete_backing ? new Gee.HashSet<MediaSource>() : null;
+
+ // separate photos into two piles: those in the trash and those not
+ Gee.ArrayList<MediaSource> trashed = new Gee.ArrayList<MediaSource>();
+ Gee.ArrayList<MediaSource> offlined = new Gee.ArrayList<MediaSource>();
+ Gee.ArrayList<MediaSource> not_trashed = new Gee.ArrayList<MediaSource>();
+ foreach (MediaSource source in sources) {
+ if (source.is_trashed())
+ trashed.add(source);
+ else if (source.is_offline())
+ offlined.add(source);
+ else
+ not_trashed.add(source);
+
+ if (to_tombstone != null)
+ to_tombstone.add(source);
+ }
+
+ int total_count = sources.size;
+ assert(total_count == (trashed.size + offlined.size + not_trashed.size));
+
+ // use an aggregate progress monitor, as it's possible there are three steps here
+ AggregateProgressMonitor agg_monitor = null;
+ if (monitor != null) {
+ agg_monitor = new AggregateProgressMonitor(total_count, monitor);
+ monitor = agg_monitor.monitor;
+ }
+
+ if (trashed.size > 0)
+ get_trashcan().destroy_orphans(trashed, delete_backing, monitor, not_removed);
+
+ if (offlined.size > 0)
+ get_offline_bin().destroy_orphans(offlined, delete_backing, monitor, not_removed);
+
+ // untrashed media sources may be destroyed outright
+ if (not_trashed.size > 0)
+ destroy_marked(mark_many(not_trashed), delete_backing, monitor, not_removed);
+
+ if (to_tombstone != null && to_tombstone.size > 0) {
+ try {
+ Tombstone.entomb_many_sources(to_tombstone, Tombstone.Reason.REMOVED_BY_USER);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+ }
+
+ // Deletes (i.e. not trashes) the backing files.
+ // Note: must be removed from DB first.
+ public void delete_backing_files(Gee.Collection<MediaSource> sources,
+ ProgressMonitor? monitor = null, Gee.List<MediaSource>? not_deleted = null) {
+ int total_count = sources.size;
+ int i = 1;
+
+ foreach (MediaSource source in sources) {
+ File file = source.get_file();
+ try {
+ file.delete(null);
+ } catch (Error err) {
+ // Note: we may get an exception even though the delete succeeded.
+ debug("Exception deleting file %s: %s", file.get_path(), err.message);
+ }
+
+ bool deleted = !file.query_exists();
+ if (!deleted && null != not_deleted) {
+ not_deleted.add(source);
+ }
+
+ if (monitor != null) {
+ monitor(i, total_count);
+ }
+ i++;
+ }
+ }
+}
+
+public class MediaCollectionRegistry {
+ private const int LIBRARY_MONITOR_START_DELAY_MSEC = 1000;
+
+ private static MediaCollectionRegistry? instance = null;
+
+ private Gee.ArrayList<MediaSourceCollection> all = new Gee.ArrayList<MediaSourceCollection>();
+ private Gee.HashMap<string, MediaSourceCollection> by_typename =
+ new Gee.HashMap<string, MediaSourceCollection>();
+
+ private MediaCollectionRegistry() {
+ Application.get_instance().init_done.connect(on_init_done);
+ }
+
+ ~MediaCollectionRegistry() {
+ Application.get_instance().init_done.disconnect(on_init_done);
+ }
+
+ private void on_init_done() {
+ // install the default library monitor
+ LibraryMonitor library_monitor = new LibraryMonitor(AppDirs.get_import_dir(), true,
+ !CommandlineOptions.no_runtime_monitoring);
+
+ LibraryMonitorPool.get_instance().replace(library_monitor, LIBRARY_MONITOR_START_DELAY_MSEC);
+ }
+
+ public static void init() {
+ instance = new MediaCollectionRegistry();
+ Config.Facade.get_instance().import_directory_changed.connect(on_import_directory_changed);
+ }
+
+ public static void terminate() {
+ Config.Facade.get_instance().import_directory_changed.disconnect(on_import_directory_changed);
+ }
+
+ private static void on_import_directory_changed() {
+ File import_dir = AppDirs.get_import_dir();
+
+ LibraryMonitor? current = LibraryMonitorPool.get_instance().get_monitor();
+ if (current != null && current.get_root().equal(import_dir))
+ return;
+
+ LibraryMonitor replacement = new LibraryMonitor(import_dir, true,
+ !CommandlineOptions.no_runtime_monitoring);
+ LibraryMonitorPool.get_instance().replace(replacement, LIBRARY_MONITOR_START_DELAY_MSEC);
+ }
+
+ public static MediaCollectionRegistry get_instance() {
+ return instance;
+ }
+
+ public static string get_typename_from_source_id(string source_id) {
+ // we have to special-case photos because their source id format is non-standard. this
+ // is due to a historical quirk.
+ if (source_id.has_prefix(Photo.TYPENAME)) {
+ return Photo.TYPENAME;
+ } else {
+ string[] components = source_id.split("-");
+ assert(components.length == 2);
+
+ return components[0];
+ }
+ }
+
+ public void register_collection(MediaSourceCollection collection) {
+ all.add(collection);
+ by_typename.set(collection.get_typename(), collection);
+ }
+
+ // NOTE: going forward, please use get_collection( ) and get_all_collections( ) to get the
+ // collection associated with a specific media type or to get all registered collections,
+ // respectively, instead of explicitly referencing Video.global and LibraryPhoto.global.
+ // This will make it *much* easier to add new media types in the future.
+ public MediaSourceCollection? get_collection(string typename) {
+ return by_typename.get(typename);
+ }
+
+ public Gee.Collection<MediaSourceCollection> get_all() {
+ return all.read_only_view;
+ }
+
+ public void freeze_all() {
+ foreach (MediaSourceCollection sources in get_all())
+ sources.freeze_notifications();
+ }
+
+ public void thaw_all() {
+ foreach (MediaSourceCollection sources in get_all())
+ sources.thaw_notifications();
+ }
+
+ public void begin_transaction_on_all() {
+ foreach (MediaSourceCollection sources in get_all())
+ sources.transaction_controller.begin();
+ }
+
+ public void commit_transaction_on_all() {
+ foreach (MediaSourceCollection sources in get_all())
+ sources.transaction_controller.commit();
+ }
+
+ public MediaSource? fetch_media(string source_id) {
+ string typename = get_typename_from_source_id(source_id);
+
+ MediaSourceCollection? collection = get_collection(typename);
+ if (collection == null) {
+ critical("source id '%s' has unrecognized media type '%s'", source_id, typename);
+ return null;
+ }
+
+ return collection.fetch_by_source_id(source_id);
+ }
+
+ public ImportID? get_last_import_id() {
+ ImportID last_import_id = ImportID();
+
+ foreach (MediaSourceCollection current_collection in get_all()) {
+ ImportID? current_import_id = current_collection.get_last_import_id();
+
+ if (current_import_id == null)
+ continue;
+
+ if (current_import_id.id > last_import_id.id)
+ last_import_id = current_import_id;
+ }
+
+ // VALA: can't use the ternary operator here because of bug 616897 : "Mixed nullability in
+ // ternary operator fails"
+ if (last_import_id.id == ImportID.INVALID)
+ return null;
+ else
+ return last_import_id;
+ }
+
+ public Gee.Collection<string> get_source_ids_for_event_id(EventID event_id) {
+ Gee.ArrayList<string> result = new Gee.ArrayList<string>();
+
+ foreach (MediaSourceCollection current_collection in get_all()) {
+ result.add_all(current_collection.get_event_source_ids(event_id));
+ }
+
+ return result;
+ }
+
+ public MediaSourceCollection? get_collection_for_file(File file) {
+ foreach (MediaSourceCollection collection in get_all()) {
+ if (collection.is_file_recognized(file))
+ return collection;
+ }
+
+ return null;
+ }
+
+ public bool is_valid_source_id(string? source_id) {
+ if (is_string_empty(source_id)) {
+ return false;
+ }
+ return (source_id.has_prefix(Photo.TYPENAME) || source_id.has_prefix(Video.TYPENAME + "-"));
+ }
+}
+
diff --git a/src/MediaInterfaces.vala b/src/MediaInterfaces.vala
new file mode 100644
index 0000000..96c5d49
--- /dev/null
+++ b/src/MediaInterfaces.vala
@@ -0,0 +1,215 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+//
+// Going forward, Shotwell will use MediaInterfaces, which allow for various operations and features
+// to be added only to the MediaSources that support them (or make sense for). For example, adding
+// a library-mode photo or video to an Event makes perfect sense, but does not make sense for a
+// direct-mode photo. All three are MediaSources, and to make DirectPhoto descend from another
+// base class is only inviting chaos and a tremendous amount of replicated code.
+//
+// A key point to make of all MediaInterfaces is that they require MediaSource as a base class.
+// Thus, any code dealing with one of these interfaces knows they are also dealing with a
+// MediaSource.
+//
+// TODO: Make Eventable and Taggable interfaces, which are the only types Event and Tag will deal
+// with (rather than MediaSources).
+//
+// TODO: Make Trashable interface, which are much like Flaggable.
+//
+// TODO: ContainerSources may also have specific needs in the future; an interface-based system
+// may make sense as well when that need arises.
+//
+
+//
+// TransactionController
+//
+// Because many operations in Shotwell need to be performed on collections of objects all at once,
+// and that most of these objects are backed by a database, the TransactionController object gives
+// a way to generically group a series of operations on one or more similar objects into a single
+// transaction. This class is listed here because it's used by the various media interfaces to offer
+// multiple operations.
+//
+// begin() and commit() may be called multiple times in layering fashion. The implementation
+// accounts for this. If either throws an exception it should be assumed that the object is in
+// a "clean" state; that is, if begin() throws an exception, there is no need to call commit(),
+// and if commit() throws an exception, it does not need to be called again to revert the object
+// state.
+//
+// This means that any user who calls begin() *must* match it with a corresponding commit(), even
+// if there is an error during the transaction. It is up to the user to back out any undesired
+// changes.
+//
+// Because of the nature of this object, it's assumed that every object type will share one
+// between all callers.
+//
+// The object is thread-safe. There is no guarantee that the underlying persistent store is,
+// however.
+public abstract class TransactionController {
+ private int count = 0;
+
+ public TransactionController() {
+ }
+
+ ~TransactionController() {
+ lock (count) {
+ assert(count == 0);
+ }
+ }
+
+ public void begin() {
+ lock (count) {
+ if (count++ != 0)
+ return;
+
+ try {
+ begin_impl();
+ } catch (Error err) {
+ // unwind
+ count--;
+
+ if (err is DatabaseError)
+ AppWindow.database_error((DatabaseError) err);
+ else
+ AppWindow.panic("%s".printf(err.message));
+ }
+ }
+ }
+
+ // For thread safety, this method will only be called under the protection of a mutex.
+ public abstract void begin_impl() throws Error;
+
+ public void commit() {
+ lock (count) {
+ assert(count > 0);
+ if (--count != 0)
+ return;
+
+ // no need to unwind the count here; it's already unwound.
+ try {
+ commit_impl();
+ } catch (Error err) {
+ if (err is DatabaseError)
+ AppWindow.database_error((DatabaseError) err);
+ else
+ AppWindow.panic("%s".printf(err.message));
+ }
+ }
+ }
+
+ // For thread safety, this method will only be called under the protection of a mutex.
+ public abstract void commit_impl() throws Error;
+}
+
+//
+// Flaggable
+//
+// Flaggable media can be marked for later use in batch operations.
+//
+// The mark_flagged() and mark_unflagged() methods should fire "metadata:flags" and "metadata:flagged"
+// alterations if the flag has changed.
+public interface Flaggable : MediaSource {
+ public abstract bool is_flagged();
+
+ public abstract void mark_flagged();
+
+ public abstract void mark_unflagged();
+
+ public static void mark_many_flagged_unflagged(Gee.Collection<Flaggable>? flag,
+ Gee.Collection<Flaggable>? unflag, TransactionController controller) throws Error {
+ controller.begin();
+
+ if (flag != null) {
+ foreach (Flaggable flaggable in flag)
+ flaggable.mark_flagged();
+ }
+
+ if (unflag != null) {
+ foreach (Flaggable flaggable in unflag)
+ flaggable.mark_unflagged();
+ }
+
+ controller.commit();
+ }
+}
+
+//
+// Monitorable
+//
+// Monitorable media can be updated at startup or run-time about changes to their backing file(s).
+//
+// The mark_online() and mark_offline() methods should fire "metadata:flags" and "metadata:online-state"
+// alterations if the flag has changed.
+//
+// The set_master_file() method should fire "backing:master" alteration and "metadata:name" if
+// the name of the file is determined by the filename (which is default behavior). It should also
+// call notify_master_file_replaced().
+//
+// The set_master_timestamp() method should fire "metadata:master-timestamp" alteration.
+public interface Monitorable : MediaSource {
+ public abstract bool is_offline();
+
+ public abstract void mark_online();
+
+ public abstract void mark_offline();
+
+ public static void mark_many_online_offline(Gee.Collection<Monitorable>? online,
+ Gee.Collection<Monitorable>? offline, TransactionController controller) throws Error {
+ controller.begin();
+
+ if (online != null) {
+ foreach (Monitorable monitorable in online)
+ monitorable.mark_online();
+ }
+
+ if (offline != null) {
+ foreach (Monitorable monitorable in offline)
+ monitorable.mark_offline();
+ }
+
+ controller.commit();
+ }
+
+ public abstract void set_master_file(File file);
+
+ public static void set_many_master_file(Gee.Map<Monitorable, File> map,
+ TransactionController controller) throws Error {
+ controller.begin();
+
+ Gee.MapIterator<Monitorable, File> map_iter = map.map_iterator();
+ while (map_iter.next())
+ map_iter.get_key().set_master_file(map_iter.get_value());
+
+ controller.commit();
+ }
+
+ public abstract void set_master_timestamp(FileInfo info);
+
+ public static void set_many_master_timestamp(Gee.Map<Monitorable, FileInfo> map,
+ TransactionController controller) throws Error {
+ controller.begin();
+
+ Gee.MapIterator<Monitorable, FileInfo> map_iter = map.map_iterator();
+ while (map_iter.next())
+ map_iter.get_key().set_master_timestamp(map_iter.get_value());
+
+ controller.commit();
+ }
+}
+
+//
+// Dateable
+//
+// Dateable media may have their exposure date and time set arbitrarily.
+//
+// The set_exposure_time() method refactors the existing set_exposure_time()
+// from Photo to here in order to add this capability to videos. It should
+// fire a "metadata:exposure-time" alteration when called.
+public interface Dateable : MediaSource {
+ public abstract void set_exposure_time(time_t target_time);
+
+ public abstract time_t get_exposure_time();
+}
diff --git a/src/MediaMetadata.vala b/src/MediaMetadata.vala
new file mode 100644
index 0000000..ad0d719
--- /dev/null
+++ b/src/MediaMetadata.vala
@@ -0,0 +1,128 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public abstract class MediaMetadata {
+ public MediaMetadata() {
+ }
+
+ public abstract void read_from_file(File file) throws Error;
+
+ public abstract MetadataDateTime? get_creation_date_time();
+
+ public abstract string? get_title();
+
+ public abstract string? get_comment();
+}
+
+public struct MetadataRational {
+ public int numerator;
+ public int denominator;
+
+ public MetadataRational(int numerator, int denominator) {
+ this.numerator = numerator;
+ this.denominator = denominator;
+ }
+
+ private bool is_component_valid(int component) {
+ return (component >= 0) && (component <= 1000000);
+ }
+
+ public bool is_valid() {
+ return (is_component_valid(numerator) && is_component_valid(denominator));
+ }
+
+ public string to_string() {
+ return (is_valid()) ? ("%d/%d".printf(numerator, denominator)) : "";
+ }
+}
+
+public errordomain MetadataDateTimeError {
+ INVALID_FORMAT,
+ UNSUPPORTED_FORMAT
+}
+
+public class MetadataDateTime {
+
+ private time_t timestamp;
+
+ public MetadataDateTime(time_t timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public MetadataDateTime.from_exif(string label) throws MetadataDateTimeError {
+ if (!from_exif_date_time(label, out timestamp))
+ throw new MetadataDateTimeError.INVALID_FORMAT("%s is not EXIF format date/time", label);
+ }
+
+ public MetadataDateTime.from_iptc(string date, string time) throws MetadataDateTimeError {
+ // TODO: Support IPTC date/time format
+ throw new MetadataDateTimeError.UNSUPPORTED_FORMAT("IPTC date/time format not currently supported");
+ }
+
+ public MetadataDateTime.from_xmp(string label) throws MetadataDateTimeError {
+ TimeVal time_val = TimeVal();
+ if (!time_val.from_iso8601(label))
+ throw new MetadataDateTimeError.INVALID_FORMAT("%s is not XMP format date/time", label);
+
+ timestamp = time_val.tv_sec;
+ }
+
+ public time_t get_timestamp() {
+ return timestamp;
+ }
+
+ public string get_exif_label() {
+ return to_exif_date_time(timestamp);
+ }
+
+ // TODO: get_iptc_date() and get_iptc_time()
+
+ public string get_xmp_label() {
+ TimeVal time_val = TimeVal();
+ time_val.tv_sec = timestamp;
+ time_val.tv_usec = 0;
+
+ return time_val.to_iso8601();
+ }
+
+ public static bool from_exif_date_time(string date_time, out time_t timestamp) {
+ timestamp = 0;
+
+ Time tm = Time();
+
+ // Check standard EXIF format
+ if (date_time.scanf("%d:%d:%d %d:%d:%d",
+ &tm.year, &tm.month, &tm.day, &tm.hour, &tm.minute, &tm.second) != 6) {
+ // Fallback in a more generic format
+ string tmp = date_time.dup();
+ tmp.canon("0123456789", ' ');
+ if (tmp.scanf("%4d%2d%2d%2d%2d%2d",
+ &tm.year, &tm.month, &tm.day, &tm.hour, &tm.minute,&tm.second) != 6)
+ return false;
+ }
+
+ // watch for bogosity
+ if (tm.year <= 1900 || tm.month <= 0 || tm.day < 0 || tm.hour < 0 || tm.minute < 0 || tm.second < 0)
+ return false;
+
+ tm.year -= 1900;
+ tm.month--;
+ tm.isdst = -1;
+
+ timestamp = tm.mktime();
+
+ return true;
+ }
+
+ public static string to_exif_date_time(time_t timestamp) {
+ return Time.local(timestamp).format("%Y:%m:%d %H:%M:%S");
+ }
+
+ public string to_string() {
+ return to_exif_date_time(timestamp);
+ }
+}
+
diff --git a/src/MediaMonitor.vala b/src/MediaMonitor.vala
new file mode 100644
index 0000000..aeb2952
--- /dev/null
+++ b/src/MediaMonitor.vala
@@ -0,0 +1,418 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class MonitorableUpdates {
+ public Monitorable monitorable;
+
+ private File? master_file = null;
+ private bool master_file_info_altered = false;
+ private FileInfo? master_file_info = null;
+ private bool master_in_alteration = false;
+ private bool online = false;
+ private bool offline = false;
+
+ public MonitorableUpdates(Monitorable monitorable) {
+ this.monitorable = monitorable;
+ }
+
+ public File? get_master_file() {
+ return master_file;
+ }
+
+ public FileInfo? get_master_file_info() {
+ return master_file_info;
+ }
+
+ public virtual bool is_in_alteration() {
+ return master_in_alteration;
+ }
+
+ public bool is_set_offline() {
+ return offline;
+ }
+
+ public bool is_set_online() {
+ return online;
+ }
+
+ public virtual void set_master_file(File? file) {
+ master_file = file;
+
+ if (file != null)
+ mark_online();
+ }
+
+ public virtual void set_master_file_info_altered(bool altered) {
+ master_file_info_altered = altered;
+
+ if (altered)
+ mark_online();
+ }
+
+ public virtual void set_master_file_info(FileInfo? info) {
+ master_file_info = info;
+
+ if (master_file_info == null)
+ set_master_file_info_altered(false);
+ }
+
+ public virtual void set_master_in_alteration(bool in_alteration) {
+ master_in_alteration = in_alteration;
+ }
+
+ public virtual void set_master_alterations_complete(FileInfo info) {
+ set_master_in_alteration(false);
+ set_master_file_info(info);
+ mark_online();
+ }
+
+ public virtual void mark_offline() {
+ online = false;
+ offline = true;
+
+ master_file_info_altered = false;
+ master_file_info = null;
+ master_in_alteration = false;
+ }
+
+ public virtual void mark_online() {
+ online = true;
+ offline = false;
+ }
+
+ public virtual void reset_online_offline() {
+ online = false;
+ offline = false;
+ }
+
+ public virtual bool is_all_updated() {
+ return master_file == null
+ && master_file_info_altered == false
+ && master_file_info == null
+ && master_in_alteration == false
+ && online == false
+ && offline == false;
+ }
+}
+
+public abstract class MediaMonitor : Object {
+ public enum DiscoveredFile {
+ REPRESENTED,
+ IGNORE,
+ UNKNOWN
+ }
+
+ protected const int MAX_OPERATIONS_PER_CYCLE = 100;
+
+ private const int FLUSH_PENDING_UPDATES_MSEC = 500;
+
+ private MediaSourceCollection sources;
+ private Cancellable cancellable;
+ private Gee.HashMap<Monitorable, MonitorableUpdates> pending_updates = new Gee.HashMap<Monitorable,
+ MonitorableUpdates>();
+ private uint pending_updates_timer_id = 0;
+
+ public MediaMonitor(MediaSourceCollection sources, Cancellable cancellable) {
+ this.sources = sources;
+ this.cancellable = cancellable;
+
+ sources.item_destroyed.connect(on_media_source_destroyed);
+ sources.unlinked_destroyed.connect(on_media_source_destroyed);
+
+ pending_updates_timer_id = Timeout.add(FLUSH_PENDING_UPDATES_MSEC, on_flush_pending_updates,
+ Priority.LOW);
+ }
+
+ ~MediaMonitor() {
+ sources.item_destroyed.disconnect(on_media_source_destroyed);
+ sources.unlinked_destroyed.disconnect(on_media_source_destroyed);
+ }
+
+ public abstract MediaSourceCollection get_media_source_collection();
+
+ public virtual void close() {
+ }
+
+ public virtual string to_string() {
+ return "MediaMonitor for %s".printf(get_media_source_collection().to_string());
+ }
+
+ protected virtual MonitorableUpdates create_updates(Monitorable monitorable) {
+ return new MonitorableUpdates(monitorable);
+ }
+
+ protected virtual void on_media_source_destroyed(DataSource source) {
+ remove_updates((Monitorable) source);
+ }
+
+ //
+ // The following are called when the startup scan is initiated.
+ //
+
+ public virtual void notify_discovery_started() {
+ }
+
+ // Returns the Monitorable represented in some form by the monitors' MediaSourceCollection.
+ // If DiscoveredFile.REPRESENTED is returns, monitorable should be set.
+ public abstract DiscoveredFile notify_file_discovered(File file, FileInfo info,
+ out Monitorable monitorable);
+
+ // Returns REPRESENTED if the file has been *definitively* associated with a Monitorable,
+ // in which case the file will no longer be considered unknown. Returns IGNORE if the file
+ // is known in some other case and should not be considered unknown. Returns UNKNOWN otherwise,
+ // with potentially a collection of candidates for the file. The collection may be zero-length.
+ //
+ // NOTE: This method may be called after the startup scan as well.
+ public abstract Gee.Collection<Monitorable>? candidates_for_unknown_file(File file, FileInfo info,
+ out DiscoveredFile result);
+
+ public virtual File[]? get_auxilliary_backing_files(Monitorable monitorable) {
+ return null;
+ }
+
+ // info is null if the file was not found. Note that master online/offline state is already
+ // set by LibraryMonitor.
+ public virtual void update_backing_file_info(Monitorable monitorable, File file, FileInfo? info) {
+ }
+
+ // Not that discovery has completed, but the MediaMonitor's role in it has finished.
+ public virtual void notify_discovery_completing() {
+ }
+
+ //
+ // The following are called after the startup scan for runtime monitoring.
+ //
+
+ public abstract bool is_file_represented(File file);
+
+ public abstract bool notify_file_created(File file, FileInfo info);
+
+ public abstract bool notify_file_moved(File old_file, File new_file, FileInfo new_file_info);
+
+ public abstract bool notify_file_altered(File file);
+
+ public abstract bool notify_file_attributes_altered(File file);
+
+ public abstract bool notify_file_alteration_completed(File file, FileInfo info);
+
+ public abstract bool notify_file_deleted(File file);
+
+ protected static void mdbg(string msg) {
+#if TRACE_MONITORING
+ debug("%s", msg);
+#endif
+ }
+
+ public bool has_pending_updates() {
+ return pending_updates.size > 0;
+ }
+
+ public Gee.Collection<Monitorable> get_monitorables() {
+ return pending_updates.keys;
+ }
+
+ // This will create a MonitorableUpdates and register it with this updater if not already
+ // exists.
+ public MonitorableUpdates fetch_updates(Monitorable monitorable) {
+ MonitorableUpdates? updates = pending_updates.get(monitorable);
+ if (updates != null)
+ return updates;
+
+ updates = create_updates(monitorable);
+ pending_updates.set(monitorable, updates);
+
+ return updates;
+ }
+
+ public MonitorableUpdates? get_existing_updates(Monitorable monitorable) {
+ return pending_updates.get(monitorable);
+ }
+
+ public void remove_updates(Monitorable monitorable) {
+ pending_updates.unset(monitorable);
+ }
+
+ public bool is_online(Monitorable monitorable) {
+ MonitorableUpdates? updates = get_existing_updates(monitorable);
+
+ return (updates != null) ? updates.is_set_online() : !monitorable.is_offline();
+ }
+
+ public bool is_offline(Monitorable monitorable) {
+ MonitorableUpdates? updates = get_existing_updates(monitorable);
+
+ return (updates != null) ? updates.is_set_offline() : monitorable.is_offline();
+ }
+
+ public File get_master_file(Monitorable monitorable) {
+ MonitorableUpdates? updates = get_existing_updates(monitorable);
+
+ return (updates != null && updates.get_master_file() != null) ? updates.get_master_file()
+ : monitorable.get_master_file();
+ }
+
+ public void update_master_file(Monitorable monitorable, File file) {
+ fetch_updates(monitorable).set_master_file(file);
+ }
+
+ public void update_master_file_info_altered(Monitorable monitorable) {
+ fetch_updates(monitorable).set_master_file_info_altered(true);
+ }
+
+ public void update_master_file_in_alteration(Monitorable monitorable, bool in_alteration) {
+ fetch_updates(monitorable).set_master_in_alteration(in_alteration);
+ }
+
+ public void update_master_file_alterations_completed(Monitorable monitorable, FileInfo info) {
+ fetch_updates(monitorable).set_master_alterations_complete(info);
+ }
+
+ public void update_online(Monitorable monitorable) {
+ fetch_updates(monitorable).mark_online();
+ }
+
+ public void update_offline(Monitorable monitorable) {
+ fetch_updates(monitorable).mark_offline();
+ }
+
+ // Children should call this method before doing their own processing. Every operation should
+ // be recorded by incrementing op_count. If it is greater than MAX_OPERATIONS_PER_CYCLE,
+ // the method should process what has been done and exit to let the operations be handled in
+ // the next cycle.
+ protected virtual void process_updates(Gee.Collection<MonitorableUpdates> all_updates,
+ TransactionController controller, ref int op_count) throws Error {
+ Gee.Map<Monitorable, File> set_master_file = null;
+ Gee.Map<Monitorable, FileInfo> set_master_file_info = null;
+ Gee.ArrayList<MediaSource> to_offline = null;
+ Gee.ArrayList<MediaSource> to_online = null;
+
+ foreach (MonitorableUpdates updates in all_updates) {
+ if (op_count >= MAX_OPERATIONS_PER_CYCLE)
+ break;
+
+ if (updates.get_master_file() != null) {
+ if (set_master_file == null)
+ set_master_file = new Gee.HashMap<Monitorable, File>();
+
+ set_master_file.set(updates.monitorable, updates.get_master_file());
+ updates.set_master_file(null);
+ op_count++;
+ }
+
+ if (updates.get_master_file_info() != null) {
+ if (set_master_file_info == null)
+ set_master_file_info = new Gee.HashMap<Monitorable, FileInfo>();
+
+ set_master_file_info.set(updates.monitorable, updates.get_master_file_info());
+ updates.set_master_file_info(null);
+ op_count++;
+ }
+
+ if (updates.is_set_offline()) {
+ if (to_offline == null)
+ to_offline = new Gee.ArrayList<LibraryPhoto>();
+
+ to_offline.add(updates.monitorable);
+ updates.reset_online_offline();
+ op_count++;
+ }
+
+ if (updates.is_set_online()) {
+ if (to_online == null)
+ to_online = new Gee.ArrayList<LibraryPhoto>();
+
+ to_online.add(updates.monitorable);
+ updates.reset_online_offline();
+ op_count++;
+ }
+ }
+
+ if (set_master_file != null) {
+ mdbg("Changing master file of %d objects in %s".printf(set_master_file.size, to_string()));
+
+ Monitorable.set_many_master_file(set_master_file, controller);
+ }
+
+ if (set_master_file_info != null) {
+ mdbg("Updating %d master files timestamps in %s".printf(set_master_file_info.size,
+ to_string()));
+
+ Monitorable.set_many_master_timestamp(set_master_file_info, controller);
+ }
+
+ if (to_offline != null || to_online != null) {
+ mdbg("Marking %d online, %d offline in %s".printf(
+ (to_online != null) ? to_online.size : 0,
+ (to_offline != null) ? to_offline.size : 0,
+ to_string()));
+
+ Monitorable.mark_many_online_offline(to_online, to_offline, controller);
+ }
+ }
+
+ private bool on_flush_pending_updates() {
+ if (cancellable.is_cancelled())
+ return false;
+
+ if (pending_updates.size == 0)
+ return true;
+
+ Timer timer = new Timer();
+
+ // build two lists: one, of MonitorableUpdates that are not in_alteration() (which
+ // simplifies matters), and two, of completed MonitorableUpdates that should be removed
+ // from the list (which would have happened after the last pass)
+ Gee.ArrayList<MonitorableUpdates> to_process = null;
+ Gee.ArrayList<Monitorable> to_remove = null;
+ foreach (MonitorableUpdates updates in pending_updates.values) {
+ if (updates.is_in_alteration())
+ continue;
+
+ if (updates.is_all_updated()) {
+ if (to_remove == null)
+ to_remove = new Gee.ArrayList<Monitorable>();
+
+ to_remove.add(updates.monitorable);
+ continue;
+ }
+
+ if (to_process == null)
+ to_process = new Gee.ArrayList<MonitorableUpdates>();
+
+ to_process.add(updates);
+ }
+
+ int op_count = 0;
+ if (to_process != null) {
+ TransactionController controller = get_media_source_collection().transaction_controller;
+
+ try {
+ controller.begin();
+ process_updates(to_process, controller, ref op_count);
+ controller.commit();
+ } catch (Error err) {
+ if (err is DatabaseError)
+ AppWindow.database_error((DatabaseError) err);
+ else
+ AppWindow.panic(_("Unable to process monitoring updates: %s").printf(err.message));
+ }
+ }
+
+ if (to_remove != null) {
+ foreach (Monitorable monitorable in to_remove)
+ remove_updates(monitorable);
+ }
+
+ double elapsed = timer.elapsed();
+ if (elapsed > 0.01 || op_count > 0) {
+ mdbg("Total pending queue time for %s: %lf (%d ops)".printf(to_string(), elapsed,
+ op_count));
+ }
+
+ return true;
+ }
+}
+
diff --git a/src/MediaPage.vala b/src/MediaPage.vala
new file mode 100644
index 0000000..4d7ee2a
--- /dev/null
+++ b/src/MediaPage.vala
@@ -0,0 +1,1308 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class MediaSourceItem : CheckerboardItem {
+ private static Gdk.Pixbuf basis_sprocket_pixbuf = null;
+ private static Gdk.Pixbuf current_sprocket_pixbuf = null;
+
+ private bool enable_sprockets = false;
+
+ // preserve the same constructor arguments and semantics as CheckerboardItem so that we're
+ // a drop-in replacement
+ public MediaSourceItem(ThumbnailSource source, Dimensions initial_pixbuf_dim, string title,
+ string? comment, bool marked_up = false, Pango.Alignment alignment = Pango.Alignment.LEFT) {
+ base(source, initial_pixbuf_dim, title, comment, marked_up, alignment);
+ if (basis_sprocket_pixbuf == null)
+ basis_sprocket_pixbuf = Resources.load_icon("sprocket.png", 0);
+ }
+
+ protected override void paint_image(Cairo.Context ctx, Gdk.Pixbuf pixbuf,
+ Gdk.Point origin) {
+ Dimensions pixbuf_dim = Dimensions.for_pixbuf(pixbuf);
+ // sprocket geometry calculation (and possible adjustment) has to occur before we call
+ // base.paint_image( ) because the base-class method needs the correct trinket horizontal
+ // offset
+
+ if (!enable_sprockets) {
+ set_horizontal_trinket_offset(0);
+ } else {
+ double reduction_factor = ((double) pixbuf_dim.major_axis()) /
+ ((double) ThumbnailCache.Size.LARGEST);
+ int reduced_size = (int) (reduction_factor * basis_sprocket_pixbuf.width);
+
+ if (current_sprocket_pixbuf == null || reduced_size != current_sprocket_pixbuf.width) {
+ current_sprocket_pixbuf = basis_sprocket_pixbuf.scale_simple(reduced_size,
+ reduced_size, Gdk.InterpType.HYPER);
+ }
+
+ set_horizontal_trinket_offset(current_sprocket_pixbuf.width);
+ }
+
+ base.paint_image(ctx, pixbuf, origin);
+
+ if (enable_sprockets) {
+ paint_sprockets(ctx, origin, pixbuf_dim);
+ }
+ }
+
+ protected void paint_one_sprocket(Cairo.Context ctx, Gdk.Point origin) {
+ ctx.save();
+ Gdk.cairo_set_source_pixbuf(ctx, current_sprocket_pixbuf, origin.x, origin.y);
+ ctx.paint();
+ ctx.restore();
+ }
+
+ protected void paint_sprockets(Cairo.Context ctx, Gdk.Point item_origin,
+ Dimensions item_dimensions) {
+ int num_sprockets = item_dimensions.height / current_sprocket_pixbuf.height;
+
+ Gdk.Point left_paint_location = item_origin;
+ Gdk.Point right_paint_location = item_origin;
+ right_paint_location.x += (item_dimensions.width - current_sprocket_pixbuf.width);
+ for (int i = 0; i < num_sprockets; i++) {
+ paint_one_sprocket(ctx, left_paint_location);
+ paint_one_sprocket(ctx, right_paint_location);
+
+ left_paint_location.y += current_sprocket_pixbuf.height;
+ right_paint_location.y += current_sprocket_pixbuf.height;
+ }
+
+ int straggler_pixels = item_dimensions.height % current_sprocket_pixbuf.height;
+ if (straggler_pixels > 0) {
+ ctx.save();
+
+ Gdk.cairo_set_source_pixbuf(ctx, current_sprocket_pixbuf, left_paint_location.x,
+ left_paint_location.y);
+ ctx.rectangle(left_paint_location.x, left_paint_location.y,
+ current_sprocket_pixbuf.get_width(), straggler_pixels);
+ ctx.fill();
+
+ Gdk.cairo_set_source_pixbuf(ctx, current_sprocket_pixbuf, right_paint_location.x,
+ right_paint_location.y);
+ ctx.rectangle(right_paint_location.x, right_paint_location.y,
+ current_sprocket_pixbuf.get_width(), straggler_pixels);
+ ctx.fill();
+
+ ctx.restore();
+ }
+ }
+
+ public void set_enable_sprockets(bool enable_sprockets) {
+ this.enable_sprockets = enable_sprockets;
+ }
+}
+
+public abstract class MediaPage : CheckerboardPage {
+ public const int SORT_ORDER_ASCENDING = 0;
+ public const int SORT_ORDER_DESCENDING = 1;
+
+ // steppings should divide evenly into (Thumbnail.MAX_SCALE - Thumbnail.MIN_SCALE)
+ public const int MANUAL_STEPPING = 16;
+ public const int SLIDER_STEPPING = 4;
+
+ public enum SortBy {
+ MIN = 1,
+ TITLE = 1,
+ EXPOSURE_DATE = 2,
+ RATING = 3,
+ MAX = 3
+ }
+
+ protected class ZoomSliderAssembly : Gtk.ToolItem {
+ private Gtk.Scale slider;
+ private Gtk.Adjustment adjustment;
+
+ public signal void zoom_changed();
+
+ public ZoomSliderAssembly() {
+ Gtk.Box zoom_group = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+
+ Gtk.Image zoom_out = new Gtk.Image.from_pixbuf(Resources.load_icon(
+ Resources.ICON_ZOOM_OUT, Resources.ICON_ZOOM_SCALE));
+ Gtk.EventBox zoom_out_box = new Gtk.EventBox();
+ zoom_out_box.set_above_child(true);
+ zoom_out_box.set_visible_window(false);
+ zoom_out_box.add(zoom_out);
+ zoom_out_box.button_press_event.connect(on_zoom_out_pressed);
+
+ zoom_group.pack_start(zoom_out_box, false, false, 0);
+
+ // virgin ZoomSliderAssemblies are created such that they have whatever value is
+ // persisted in the configuration system for the photo thumbnail scale
+ int persisted_scale = Config.Facade.get_instance().get_photo_thumbnail_scale();
+ adjustment = new Gtk.Adjustment(ZoomSliderAssembly.scale_to_slider(persisted_scale), 0,
+ ZoomSliderAssembly.scale_to_slider(Thumbnail.MAX_SCALE), 1, 10, 0);
+
+ slider = new Gtk.Scale(Gtk.Orientation.HORIZONTAL, adjustment);
+ slider.value_changed.connect(on_slider_changed);
+ slider.set_draw_value(false);
+ slider.set_size_request(200, -1);
+ slider.set_tooltip_text(_("Adjust the size of the thumbnails"));
+
+ zoom_group.pack_start(slider, false, false, 0);
+
+ Gtk.Image zoom_in = new Gtk.Image.from_pixbuf(Resources.load_icon(
+ Resources.ICON_ZOOM_IN, Resources.ICON_ZOOM_SCALE));
+ Gtk.EventBox zoom_in_box = new Gtk.EventBox();
+ zoom_in_box.set_above_child(true);
+ zoom_in_box.set_visible_window(false);
+ zoom_in_box.add(zoom_in);
+ zoom_in_box.button_press_event.connect(on_zoom_in_pressed);
+
+ zoom_group.pack_start(zoom_in_box, false, false, 0);
+
+ add(zoom_group);
+ }
+
+ public static double scale_to_slider(int value) {
+ assert(value >= Thumbnail.MIN_SCALE);
+ assert(value <= Thumbnail.MAX_SCALE);
+
+ return (double) ((value - Thumbnail.MIN_SCALE) / SLIDER_STEPPING);
+ }
+
+ public static int slider_to_scale(double value) {
+ int res = ((int) (value * SLIDER_STEPPING)) + Thumbnail.MIN_SCALE;
+
+ assert(res >= Thumbnail.MIN_SCALE);
+ assert(res <= Thumbnail.MAX_SCALE);
+
+ return res;
+ }
+
+ private bool on_zoom_out_pressed(Gdk.EventButton event) {
+ snap_to_min();
+ return true;
+ }
+
+ private bool on_zoom_in_pressed(Gdk.EventButton event) {
+ snap_to_max();
+ return true;
+ }
+
+ private void on_slider_changed() {
+ zoom_changed();
+ }
+
+ public void snap_to_min() {
+ slider.set_value(scale_to_slider(Thumbnail.MIN_SCALE));
+ }
+
+ public void snap_to_max() {
+ slider.set_value(scale_to_slider(Thumbnail.MAX_SCALE));
+ }
+
+ public void increase_step() {
+ int new_scale = compute_zoom_scale_increase(get_scale());
+
+ if (get_scale() == new_scale)
+ return;
+
+ slider.set_value(scale_to_slider(new_scale));
+ }
+
+ public void decrease_step() {
+ int new_scale = compute_zoom_scale_decrease(get_scale());
+
+ if (get_scale() == new_scale)
+ return;
+
+ slider.set_value(scale_to_slider(new_scale));
+ }
+
+ public int get_scale() {
+ return slider_to_scale(slider.get_value());
+ }
+
+ public void set_scale(int scale) {
+ if (get_scale() == scale)
+ return;
+
+ slider.set_value(scale_to_slider(scale));
+ }
+ }
+
+ private ZoomSliderAssembly? connected_slider = null;
+ private DragAndDropHandler dnd_handler = null;
+ private MediaViewTracker tracker;
+
+ public MediaPage(string page_name) {
+ base (page_name);
+
+ tracker = new MediaViewTracker(get_view());
+
+ get_view().items_altered.connect(on_media_altered);
+
+ get_view().freeze_notifications();
+ get_view().set_property(CheckerboardItem.PROP_SHOW_TITLES,
+ Config.Facade.get_instance().get_display_photo_titles());
+ get_view().set_property(CheckerboardItem.PROP_SHOW_COMMENTS,
+ Config.Facade.get_instance().get_display_photo_comments());
+ get_view().set_property(Thumbnail.PROP_SHOW_TAGS,
+ Config.Facade.get_instance().get_display_photo_tags());
+ get_view().set_property(Thumbnail.PROP_SIZE, get_thumb_size());
+ get_view().set_property(Thumbnail.PROP_SHOW_RATINGS,
+ Config.Facade.get_instance().get_display_photo_ratings());
+ get_view().thaw_notifications();
+
+ // enable drag-and-drop export of media
+ dnd_handler = new DragAndDropHandler(this);
+ }
+
+ private static int compute_zoom_scale_increase(int current_scale) {
+ int new_scale = current_scale + MANUAL_STEPPING;
+ return new_scale.clamp(Thumbnail.MIN_SCALE, Thumbnail.MAX_SCALE);
+ }
+
+ private static int compute_zoom_scale_decrease(int current_scale) {
+ int new_scale = current_scale - MANUAL_STEPPING;
+ return new_scale.clamp(Thumbnail.MIN_SCALE, Thumbnail.MAX_SCALE);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("media.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry export = { "Export", Gtk.Stock.SAVE_AS, TRANSLATABLE, "<Ctrl><Shift>E",
+ TRANSLATABLE, on_export };
+ export.label = Resources.EXPORT_MENU;
+ actions += export;
+
+ Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
+ TRANSLATABLE, on_send_to };
+ send_to.label = Resources.SEND_TO_MENU;
+ actions += send_to;
+
+ // This is identical to the above action, except that it has different
+ // mnemonics and is _only_ for use in the context menu.
+ Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
+ TRANSLATABLE, on_send_to };
+ send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
+ actions += send_to_context_menu;
+
+ Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Gtk.Stock.REMOVE, TRANSLATABLE,
+ "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
+ remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
+ actions += remove_from_library;
+
+ Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
+ TRANSLATABLE, on_move_to_trash };
+ move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
+ actions += move_to_trash;
+
+ Gtk.ActionEntry new_event = { "NewEvent", Gtk.Stock.NEW, TRANSLATABLE, "<Ctrl>N",
+ TRANSLATABLE, on_new_event };
+ new_event.label = Resources.NEW_EVENT_MENU;
+ actions += new_event;
+
+ Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE,
+ on_add_tags };
+ add_tags.label = Resources.ADD_TAGS_MENU;
+ actions += add_tags;
+
+ // This is identical to the above action, except that it has different
+ // mnemonics and is _only_ for use in the context menu.
+ Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A", TRANSLATABLE,
+ on_add_tags };
+ add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
+ actions += add_tags_context_menu;
+
+ Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE,
+ on_modify_tags };
+ modify_tags.label = Resources.MODIFY_TAGS_MENU;
+ actions += modify_tags;
+
+ Gtk.ActionEntry increase_size = { "IncreaseSize", Gtk.Stock.ZOOM_IN, TRANSLATABLE,
+ "<Ctrl>plus", TRANSLATABLE, on_increase_size };
+ increase_size.label = _("Zoom _In");
+ increase_size.tooltip = _("Increase the magnification of the thumbnails");
+ actions += increase_size;
+
+ Gtk.ActionEntry decrease_size = { "DecreaseSize", Gtk.Stock.ZOOM_OUT, TRANSLATABLE,
+ "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
+ decrease_size.label = _("Zoom _Out");
+ decrease_size.tooltip = _("Decrease the magnification of the thumbnails");
+ actions += decrease_size;
+
+ Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
+ flag.label = Resources.FLAG_MENU;
+ actions += flag;
+
+ Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
+ set_rating.label = Resources.RATING_MENU;
+ actions += set_rating;
+
+ Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE,
+ "greater", TRANSLATABLE, on_increase_rating };
+ increase_rating.label = Resources.INCREASE_RATING_MENU;
+ actions += increase_rating;
+
+ Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE,
+ "less", TRANSLATABLE, on_decrease_rating };
+ decrease_rating.label = Resources.DECREASE_RATING_MENU;
+ actions += decrease_rating;
+
+ Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE,
+ "9", TRANSLATABLE, on_rate_rejected };
+ rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
+ actions += rate_rejected;
+
+ Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE,
+ "0", TRANSLATABLE, on_rate_unrated };
+ rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
+ actions += rate_unrated;
+
+ Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE,
+ "1", TRANSLATABLE, on_rate_one };
+ rate_one.label = Resources.rating_menu(Rating.ONE);
+ actions += rate_one;
+
+ Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE,
+ "2", TRANSLATABLE, on_rate_two };
+ rate_two.label = Resources.rating_menu(Rating.TWO);
+ actions += rate_two;
+
+ Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE,
+ "3", TRANSLATABLE, on_rate_three };
+ rate_three.label = Resources.rating_menu(Rating.THREE);
+ actions += rate_three;
+
+ Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE,
+ "4", TRANSLATABLE, on_rate_four };
+ rate_four.label = Resources.rating_menu(Rating.FOUR);
+ actions += rate_four;
+
+ Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE,
+ "5", TRANSLATABLE, on_rate_five };
+ rate_five.label = Resources.rating_menu(Rating.FIVE);
+ actions += rate_five;
+
+ Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
+ on_edit_title };
+ edit_title.label = Resources.EDIT_TITLE_MENU;
+ actions += edit_title;
+
+ Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
+ on_edit_comment };
+ edit_comment.label = Resources.EDIT_COMMENT_MENU;
+ actions += edit_comment;
+
+ Gtk.ActionEntry sort_photos = { "SortPhotos", null, TRANSLATABLE, null, null, null };
+ sort_photos.label = _("Sort _Photos");
+ actions += sort_photos;
+
+ Gtk.ActionEntry filter_photos = { "FilterPhotos", null, TRANSLATABLE, null, null, null };
+ filter_photos.label = Resources.FILTER_PHOTOS_MENU;
+ actions += filter_photos;
+
+ Gtk.ActionEntry play = { "PlayVideo", Gtk.Stock.MEDIA_PLAY, TRANSLATABLE, "<Ctrl>Y",
+ TRANSLATABLE, on_play_video };
+ play.label = _("_Play Video");
+ play.tooltip = _("Open the selected videos in the system video player");
+ actions += play;
+
+ Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
+ raw_developer.label = _("_Developer");
+ actions += raw_developer;
+
+ // RAW developers.
+
+ Gtk.ActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
+ on_raw_developer_shotwell };
+ dev_shotwell.label = _("Shotwell");
+ actions += dev_shotwell;
+
+ Gtk.ActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
+ on_raw_developer_camera };
+ dev_camera.label = _("Camera");
+ actions += dev_camera;
+
+ return actions;
+ }
+
+ protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
+ Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
+
+ Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
+ TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
+ titles.label = _("_Titles");
+ titles.tooltip = _("Display the title of each photo");
+ toggle_actions += titles;
+
+ Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
+ TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_photo_comments() };
+ comments.label = _("_Comments");
+ comments.tooltip = _("Display the comment of each photo");
+ toggle_actions += comments;
+
+ Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
+ TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
+ ratings.label = Resources.VIEW_RATINGS_MENU;
+ ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
+ toggle_actions += ratings;
+
+ Gtk.ToggleActionEntry tags = { "ViewTags", null, TRANSLATABLE, "<Ctrl><Shift>G",
+ TRANSLATABLE, on_display_tags, Config.Facade.get_instance().get_display_photo_tags() };
+ tags.label = _("Ta_gs");
+ tags.tooltip = _("Display each photo's tags");
+ toggle_actions += tags;
+
+ return toggle_actions;
+ }
+
+ protected override void register_radio_actions(Gtk.ActionGroup action_group) {
+ bool sort_order;
+ int sort_by;
+ get_config_photos_sort(out sort_order, out sort_by);
+
+ // Sort criteria.
+ Gtk.RadioActionEntry[] sort_crit_actions = new Gtk.RadioActionEntry[0];
+
+ Gtk.RadioActionEntry by_title = { "SortByTitle", null, TRANSLATABLE, null, TRANSLATABLE,
+ SortBy.TITLE };
+ by_title.label = _("By _Title");
+ by_title.tooltip = _("Sort photos by title");
+ sort_crit_actions += by_title;
+
+ Gtk.RadioActionEntry by_date = { "SortByExposureDate", null, TRANSLATABLE, null,
+ TRANSLATABLE, SortBy.EXPOSURE_DATE };
+ by_date.label = _("By Exposure _Date");
+ by_date.tooltip = _("Sort photos by exposure date");
+ sort_crit_actions += by_date;
+
+ Gtk.RadioActionEntry by_rating = { "SortByRating", null, TRANSLATABLE, null,
+ TRANSLATABLE, SortBy.RATING };
+ by_rating.label = _("By _Rating");
+ by_rating.tooltip = _("Sort photos by rating");
+ sort_crit_actions += by_rating;
+
+ action_group.add_radio_actions(sort_crit_actions, sort_by, on_sort_changed);
+
+ // Sort order.
+ Gtk.RadioActionEntry[] sort_order_actions = new Gtk.RadioActionEntry[0];
+
+ Gtk.RadioActionEntry ascending = { "SortAscending", Gtk.Stock.SORT_ASCENDING,
+ TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_ASCENDING };
+ ascending.label = _("_Ascending");
+ ascending.tooltip = _("Sort photos in an ascending order");
+ sort_order_actions += ascending;
+
+ Gtk.RadioActionEntry descending = { "SortDescending", Gtk.Stock.SORT_DESCENDING,
+ TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_DESCENDING };
+ descending.label = _("D_escending");
+ descending.tooltip = _("Sort photos in a descending order");
+ sort_order_actions += descending;
+
+ action_group.add_radio_actions(sort_order_actions,
+ sort_order ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING, on_sort_changed);
+
+ base.register_radio_actions(action_group);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_sensitive("Export", selected_count > 0);
+ set_action_sensitive("EditTitle", selected_count > 0);
+ set_action_sensitive("EditComment", selected_count > 0);
+ set_action_sensitive("IncreaseSize", get_thumb_size() < Thumbnail.MAX_SCALE);
+ set_action_sensitive("DecreaseSize", get_thumb_size() > Thumbnail.MIN_SCALE);
+ set_action_sensitive("RemoveFromLibrary", selected_count > 0);
+ set_action_sensitive("MoveToTrash", selected_count > 0);
+
+ if (DesktopIntegration.is_send_to_installed())
+ set_action_sensitive("SendTo", selected_count > 0);
+ else
+ set_action_visible("SendTo", false);
+
+ set_action_sensitive("Rate", selected_count > 0);
+ update_rating_sensitivities();
+
+ update_development_menu_item_sensitivity();
+
+ set_action_sensitive("PlayVideo", selected_count == 1
+ && get_view().get_selected_source_at(0) is Video);
+
+ update_flag_action(selected_count);
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_media_altered(Gee.Map<DataObject, Alteration> altered) {
+ foreach (DataObject object in altered.keys) {
+ if (altered.get(object).has_detail("metadata", "flagged")) {
+ update_flag_action(get_view().get_selected_count());
+
+ break;
+ }
+ }
+ }
+
+ private void update_rating_sensitivities() {
+ set_action_sensitive("RateRejected", can_rate_selected(Rating.REJECTED));
+ set_action_sensitive("RateUnrated", can_rate_selected(Rating.UNRATED));
+ set_action_sensitive("RateOne", can_rate_selected(Rating.ONE));
+ set_action_sensitive("RateTwo", can_rate_selected(Rating.TWO));
+ set_action_sensitive("RateThree", can_rate_selected(Rating.THREE));
+ set_action_sensitive("RateFour", can_rate_selected(Rating.FOUR));
+ set_action_sensitive("RateFive", can_rate_selected(Rating.FIVE));
+ set_action_sensitive("IncreaseRating", can_increase_selected_rating());
+ set_action_sensitive("DecreaseRating", can_decrease_selected_rating());
+ }
+
+ private void update_development_menu_item_sensitivity() {
+ if (get_view().get_selected().size == 0) {
+ set_action_sensitive("RawDeveloper", false);
+ return;
+ }
+
+ // Collect some stats about what's selected.
+ bool avail_shotwell = false; // True if Shotwell developer is available.
+ bool avail_camera = false; // True if camera developer is available.
+ bool is_raw = false; // True if any RAW photos are selected
+ foreach (DataView view in get_view().get_selected()) {
+ Photo? photo = ((Thumbnail) view).get_media_source() as Photo;
+ if (photo != null && photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ is_raw = true;
+
+ if (!avail_shotwell && photo.is_raw_developer_available(RawDeveloper.SHOTWELL))
+ avail_shotwell = true;
+
+ if (!avail_camera && (photo.is_raw_developer_available(RawDeveloper.CAMERA) ||
+ photo.is_raw_developer_available(RawDeveloper.EMBEDDED)))
+ avail_camera = true;
+
+ if (avail_shotwell && avail_camera)
+ break; // optimization: break out of loop when all options available
+
+ }
+ }
+
+ // Enable/disable menu.
+ set_action_sensitive("RawDeveloper", is_raw);
+
+ if (is_raw) {
+ // Set which developers are available.
+ set_action_sensitive("RawDeveloperShotwell", avail_shotwell);
+ set_action_sensitive("RawDeveloperCamera", avail_camera);
+ }
+ }
+
+ private void update_flag_action(int selected_count) {
+ set_action_sensitive("Flag", selected_count > 0);
+
+ string flag_label = Resources.FLAG_MENU;
+
+ if (selected_count > 0) {
+ bool all_flagged = true;
+ foreach (DataSource source in get_view().get_selected_sources()) {
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && !flaggable.is_flagged()) {
+ all_flagged = false;
+
+ break;
+ }
+ }
+
+ if (all_flagged) {
+ flag_label = Resources.UNFLAG_MENU;
+ }
+ }
+
+ Gtk.Action? flag_action = get_action("Flag");
+ if (flag_action != null) {
+ flag_action.label = flag_label;
+ }
+ }
+
+ public override Core.ViewTracker? get_view_tracker() {
+ return tracker;
+ }
+
+ public void set_display_ratings(bool display) {
+ get_view().freeze_notifications();
+ get_view().set_property(Thumbnail.PROP_SHOW_RATINGS, display);
+ get_view().thaw_notifications();
+
+ Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ private bool can_rate_selected(Rating rating) {
+ foreach (DataView view in get_view().get_selected()) {
+ if(((Thumbnail) view).get_media_source().get_rating() != rating)
+ return true;
+ }
+
+ return false;
+ }
+
+ private bool can_increase_selected_rating() {
+ foreach (DataView view in get_view().get_selected()) {
+ if(((Thumbnail) view).get_media_source().get_rating().can_increase())
+ return true;
+ }
+
+ return false;
+ }
+
+ private bool can_decrease_selected_rating() {
+ foreach (DataView view in get_view().get_selected()) {
+ if(((Thumbnail) view).get_media_source().get_rating().can_decrease())
+ return true;
+ }
+
+ return false;
+ }
+
+ public ZoomSliderAssembly create_zoom_slider_assembly() {
+ return new ZoomSliderAssembly();
+ }
+
+ protected override bool on_mousewheel_up(Gdk.EventScroll event) {
+ if ((event.state & Gdk.ModifierType.CONTROL_MASK) != 0) {
+ increase_zoom_level();
+ return true;
+ } else {
+ return base.on_mousewheel_up(event);
+ }
+ }
+
+ protected override bool on_mousewheel_down(Gdk.EventScroll event) {
+ if ((event.state & Gdk.ModifierType.CONTROL_MASK) != 0) {
+ decrease_zoom_level();
+ return true;
+ } else {
+ return base.on_mousewheel_down(event);
+ }
+ }
+
+ private void on_send_to() {
+ DesktopIntegration.send_to((Gee.Collection<MediaSource>) get_view().get_selected_sources());
+ }
+
+ protected void on_play_video() {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ Video? video = get_view().get_selected_at(0).get_source() as Video;
+ if (video == null)
+ return;
+
+ try {
+ AppInfo.launch_default_for_uri(video.get_file().get_uri(), null);
+ } catch (Error e) {
+ AppWindow.error_message(_("Shotwell was unable to play the selected video:\n%s").printf(
+ e.message));
+ }
+ }
+
+ protected override bool on_app_key_pressed(Gdk.EventKey event) {
+ bool handled = true;
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "equal":
+ case "plus":
+ case "KP_Add":
+ activate_action("IncreaseSize");
+ break;
+
+ case "minus":
+ case "underscore":
+ case "KP_Subtract":
+ activate_action("DecreaseSize");
+ break;
+
+ case "period":
+ activate_action("IncreaseRating");
+ break;
+
+ case "comma":
+ activate_action("DecreaseRating");
+ break;
+
+ case "KP_1":
+ activate_action("RateOne");
+ break;
+
+ case "KP_2":
+ activate_action("RateTwo");
+ break;
+
+ case "KP_3":
+ activate_action("RateThree");
+ break;
+
+ case "KP_4":
+ activate_action("RateFour");
+ break;
+
+ case "KP_5":
+ activate_action("RateFive");
+ break;
+
+ case "KP_0":
+ activate_action("RateUnrated");
+ break;
+
+ case "KP_9":
+ activate_action("RateRejected");
+ break;
+
+ case "exclam":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.ONE_OR_HIGHER);
+ break;
+
+ case "at":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.TWO_OR_HIGHER);
+ break;
+
+ case "numbersign":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.THREE_OR_HIGHER);
+ break;
+
+ case "dollar":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.FOUR_OR_HIGHER);
+ break;
+
+ case "percent":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.FIVE_OR_HIGHER);
+ break;
+
+ case "parenright":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.UNRATED_OR_HIGHER);
+ break;
+
+ case "parenleft":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.REJECTED_OR_HIGHER);
+ break;
+
+ case "asterisk":
+ if (get_ctrl_pressed())
+ get_search_view_filter().set_rating_filter(RatingFilter.REJECTED_ONLY);
+ break;
+
+ case "slash":
+ activate_action("Flag");
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ return handled ? true : base.on_app_key_pressed(event);
+ }
+
+ public override void switched_to() {
+ base.switched_to();
+
+ // set display options to match Configuration toggles (which can change while switched away)
+ get_view().freeze_notifications();
+ set_display_titles(Config.Facade.get_instance().get_display_photo_titles());
+ set_display_comments(Config.Facade.get_instance().get_display_photo_comments());
+ set_display_ratings(Config.Facade.get_instance().get_display_photo_ratings());
+ set_display_tags(Config.Facade.get_instance().get_display_photo_tags());
+ get_view().thaw_notifications();
+
+ sync_sort();
+ }
+
+ public override void switching_from() {
+ disconnect_slider();
+
+ base.switching_from();
+ }
+
+ protected void connect_slider(ZoomSliderAssembly slider) {
+ connected_slider = slider;
+ connected_slider.zoom_changed.connect(on_zoom_changed);
+ load_persistent_thumbnail_scale();
+ }
+
+ private void save_persistent_thumbnail_scale() {
+ if (connected_slider == null)
+ return;
+
+ Config.Facade.get_instance().set_photo_thumbnail_scale(connected_slider.get_scale());
+ }
+
+ private void load_persistent_thumbnail_scale() {
+ if (connected_slider == null)
+ return;
+
+ int persistent_scale = Config.Facade.get_instance().get_photo_thumbnail_scale();
+
+ connected_slider.set_scale(persistent_scale);
+ set_thumb_size(persistent_scale);
+ }
+
+ protected void disconnect_slider() {
+ if (connected_slider == null)
+ return;
+
+ connected_slider.zoom_changed.disconnect(on_zoom_changed);
+ connected_slider = null;
+ }
+
+ protected virtual void on_zoom_changed() {
+ if (connected_slider != null)
+ set_thumb_size(connected_slider.get_scale());
+
+ save_persistent_thumbnail_scale();
+ }
+
+ protected abstract void on_export();
+
+ protected virtual void on_increase_size() {
+ increase_zoom_level();
+ }
+
+ protected virtual void on_decrease_size() {
+ decrease_zoom_level();
+ }
+
+ private void on_add_tags() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ AddTagsDialog dialog = new AddTagsDialog();
+ string[]? names = dialog.execute();
+
+ if (names != null) {
+ get_command_manager().execute(new AddTagsCommand(
+ HierarchicalTagIndex.get_global_index().get_paths_for_names_array(names),
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources()));
+ }
+ }
+
+ private void on_modify_tags() {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ MediaSource media = (MediaSource) get_view().get_selected_at(0).get_source();
+
+ ModifyTagsDialog dialog = new ModifyTagsDialog(media);
+ Gee.ArrayList<Tag>? new_tags = dialog.execute();
+
+ if (new_tags == null)
+ return;
+
+ get_command_manager().execute(new ModifyTagsCommand(media, new_tags));
+ }
+
+ private void set_display_tags(bool display) {
+ get_view().freeze_notifications();
+ get_view().set_property(Thumbnail.PROP_SHOW_TAGS, display);
+ get_view().thaw_notifications();
+
+ Gtk.ToggleAction? action = get_action("ViewTags") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ private void on_new_event() {
+ if (get_view().get_selected_count() > 0)
+ get_command_manager().execute(new NewEventCommand(get_view().get_selected()));
+ }
+
+ private void on_flag_unflag() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ Gee.Collection<MediaSource> sources =
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources_of_type(typeof(MediaSource));
+
+ // If all are flagged, then unflag, otherwise flag
+ bool flag = false;
+ foreach (MediaSource source in sources) {
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && !flaggable.is_flagged()) {
+ flag = true;
+
+ break;
+ }
+ }
+
+ get_command_manager().execute(new FlagUnflagCommand(sources, flag));
+ }
+
+ protected virtual void on_increase_rating() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ SetRatingCommand command = new SetRatingCommand.inc_dec(get_view().get_selected(), true);
+ get_command_manager().execute(command);
+
+ update_rating_sensitivities();
+ }
+
+ protected virtual void on_decrease_rating() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ SetRatingCommand command = new SetRatingCommand.inc_dec(get_view().get_selected(), false);
+ get_command_manager().execute(command);
+
+ update_rating_sensitivities();
+ }
+
+ protected virtual void on_set_rating(Rating rating) {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ SetRatingCommand command = new SetRatingCommand(get_view().get_selected(), rating);
+ get_command_manager().execute(command);
+
+ update_rating_sensitivities();
+ }
+
+ protected virtual void on_rate_rejected() {
+ on_set_rating(Rating.REJECTED);
+ }
+
+ protected virtual void on_rate_unrated() {
+ on_set_rating(Rating.UNRATED);
+ }
+
+ protected virtual void on_rate_one() {
+ on_set_rating(Rating.ONE);
+ }
+
+ protected virtual void on_rate_two() {
+ on_set_rating(Rating.TWO);
+ }
+
+ protected virtual void on_rate_three() {
+ on_set_rating(Rating.THREE);
+ }
+
+ protected virtual void on_rate_four() {
+ on_set_rating(Rating.FOUR);
+ }
+
+ protected virtual void on_rate_five() {
+ on_set_rating(Rating.FIVE);
+ }
+
+ private void on_remove_from_library() {
+ remove_photos_from_library((Gee.Collection<LibraryPhoto>) get_view().get_selected_sources());
+ }
+
+ protected virtual void on_move_to_trash() {
+ CheckerboardItem? restore_point = null;
+
+ if (cursor != null) {
+ restore_point = get_view().get_next(cursor) as CheckerboardItem;
+ }
+
+ if (get_view().get_selected_count() > 0) {
+ get_command_manager().execute(new TrashUntrashPhotosCommand(
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources(), true));
+ }
+
+ if ((restore_point != null) && (get_view().contains(restore_point))) {
+ set_cursor(restore_point);
+ }
+ }
+
+ protected virtual void on_edit_title() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ Gee.List<MediaSource> media_sources = (Gee.List<MediaSource>) get_view().get_selected_sources();
+
+ EditTitleDialog edit_title_dialog = new EditTitleDialog(media_sources[0].get_title());
+ string? new_title = edit_title_dialog.execute();
+ if (new_title != null)
+ get_command_manager().execute(new EditMultipleTitlesCommand(media_sources, new_title));
+ }
+
+ protected virtual void on_edit_comment() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ Gee.List<MediaSource> media_sources = (Gee.List<MediaSource>) get_view().get_selected_sources();
+
+ EditCommentDialog edit_comment_dialog = new EditCommentDialog(media_sources[0].get_comment());
+ string? new_comment = edit_comment_dialog.execute();
+ if (new_comment != null)
+ get_command_manager().execute(new EditMultipleCommentsCommand(media_sources, new_comment));
+ }
+
+ protected virtual void on_display_titles(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_titles(display);
+
+ Config.Facade.get_instance().set_display_photo_titles(display);
+ }
+
+ protected virtual void on_display_comments(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_comments(display);
+
+ Config.Facade.get_instance().set_display_photo_comments(display);
+ }
+
+ protected virtual void on_display_ratings(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_ratings(display);
+
+ Config.Facade.get_instance().set_display_photo_ratings(display);
+ }
+
+ protected virtual void on_display_tags(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_tags(display);
+
+ Config.Facade.get_instance().set_display_photo_tags(display);
+ }
+
+ protected abstract void get_config_photos_sort(out bool sort_order, out int sort_by);
+
+ protected abstract void set_config_photos_sort(bool sort_order, int sort_by);
+
+ public virtual void on_sort_changed() {
+ int sort_by = get_menu_sort_by();
+ bool sort_order = get_menu_sort_order();
+
+ set_view_comparator(sort_by, sort_order);
+ set_config_photos_sort(sort_order, sort_by);
+ }
+
+ public void on_raw_developer_shotwell(Gtk.Action action) {
+ developer_changed(RawDeveloper.SHOTWELL);
+ }
+
+ public void on_raw_developer_camera(Gtk.Action action) {
+ developer_changed(RawDeveloper.CAMERA);
+ }
+
+ protected virtual void developer_changed(RawDeveloper rd) {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ // Check if any photo has edits
+
+ // Display warning only when edits could be destroyed
+ bool need_warn = false;
+
+ // Make a list of all photos that need their developer changed.
+ Gee.ArrayList<DataView> to_set = new Gee.ArrayList<DataView>();
+ foreach (DataView view in get_view().get_selected()) {
+ Photo? p = view.get_source() as Photo;
+ if (p != null && (!rd.is_equivalent(p.get_raw_developer()))) {
+ to_set.add(view);
+
+ if (p.has_transformations()) {
+ need_warn = true;
+ }
+ }
+ }
+
+ if (!need_warn || Dialogs.confirm_warn_developer_changed(to_set.size)) {
+ SetRawDeveloperCommand command = new SetRawDeveloperCommand(to_set, rd);
+ get_command_manager().execute(command);
+
+ update_development_menu_item_sensitivity();
+ }
+ }
+
+ protected override void set_display_titles(bool display) {
+ base.set_display_titles(display);
+
+ Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ protected override void set_display_comments(bool display) {
+ base.set_display_comments(display);
+
+ Gtk.ToggleAction? action = get_action("ViewComment") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ private Gtk.RadioAction sort_by_title_action() {
+ Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortByTitle");
+ assert(action != null);
+ return action;
+ }
+
+ private Gtk.RadioAction sort_ascending_action() {
+ Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortAscending");
+ assert(action != null);
+ return action;
+ }
+
+ protected int get_menu_sort_by() {
+ // any member of the group knows the current value
+ return sort_by_title_action().get_current_value();
+ }
+
+ protected void set_menu_sort_by(int val) {
+ sort_by_title_action().set_current_value(val);
+ }
+
+ protected bool get_menu_sort_order() {
+ // any member of the group knows the current value
+ return sort_ascending_action().get_current_value() == SORT_ORDER_ASCENDING;
+ }
+
+ protected void set_menu_sort_order(bool ascending) {
+ sort_ascending_action().set_current_value(
+ ascending ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING);
+ }
+
+ void set_view_comparator(int sort_by, bool ascending) {
+ Comparator comparator;
+ ComparatorPredicate predicate;
+
+ switch (sort_by) {
+ case SortBy.TITLE:
+ if (ascending)
+ comparator = Thumbnail.title_ascending_comparator;
+ else comparator = Thumbnail.title_descending_comparator;
+ predicate = Thumbnail.title_comparator_predicate;
+ break;
+
+ case SortBy.EXPOSURE_DATE:
+ if (ascending)
+ comparator = Thumbnail.exposure_time_ascending_comparator;
+ else comparator = Thumbnail.exposure_time_desending_comparator;
+ predicate = Thumbnail.exposure_time_comparator_predicate;
+ break;
+
+ case SortBy.RATING:
+ if (ascending)
+ comparator = Thumbnail.rating_ascending_comparator;
+ else comparator = Thumbnail.rating_descending_comparator;
+ predicate = Thumbnail.rating_comparator_predicate;
+ break;
+
+ default:
+ debug("Unknown sort criteria: %s", get_menu_sort_by().to_string());
+ comparator = Thumbnail.title_descending_comparator;
+ predicate = Thumbnail.title_comparator_predicate;
+ break;
+ }
+
+ get_view().set_comparator(comparator, predicate);
+ }
+
+ protected string get_sortby_path(int sort_by) {
+ switch(sort_by) {
+ case SortBy.TITLE:
+ return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
+
+ case SortBy.EXPOSURE_DATE:
+ return "/MenuBar/ViewMenu/SortPhotos/SortByExposureDate";
+
+ case SortBy.RATING:
+ return "/MenuBar/ViewMenu/SortPhotos/SortByRating";
+
+ default:
+ debug("Unknown sort criteria: %d", sort_by);
+ return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
+ }
+ }
+
+ protected void sync_sort() {
+ // It used to be that the config and UI could both agree on what
+ // sort order and criteria were selected, but the sorting wouldn't
+ // match them, due to the current view's comparator not actually
+ // being set to match, and since there was a check to see if the
+ // config and UI matched that would frequently succeed in this case,
+ // the sorting was often wrong until the user went in and changed
+ // it. Because there is no tidy way to query the current view's
+ // comparator, we now set it any time we even think the sorting
+ // might have changed to force them to always stay in sync.
+ //
+ // Although this means we pay for a re-sort every time, in practice,
+ // this isn't terribly expensive - it _might_ take as long as .5 sec.
+ // with a media page containing over 15000 items on a modern CPU.
+
+ bool sort_ascending;
+ int sort_by;
+ get_config_photos_sort(out sort_ascending, out sort_by);
+
+ set_menu_sort_by(sort_by);
+ set_menu_sort_order(sort_ascending);
+
+ set_view_comparator(sort_by, sort_ascending);
+ }
+
+ public override void destroy() {
+ disconnect_slider();
+
+ base.destroy();
+ }
+
+ public void increase_zoom_level() {
+ if (connected_slider != null) {
+ connected_slider.increase_step();
+ } else {
+ int new_scale = compute_zoom_scale_increase(get_thumb_size());
+ save_persistent_thumbnail_scale();
+ set_thumb_size(new_scale);
+ }
+ }
+
+ public void decrease_zoom_level() {
+ if (connected_slider != null) {
+ connected_slider.decrease_step();
+ } else {
+ int new_scale = compute_zoom_scale_decrease(get_thumb_size());
+ save_persistent_thumbnail_scale();
+ set_thumb_size(new_scale);
+ }
+ }
+
+ public virtual DataView create_thumbnail(DataSource source) {
+ return new Thumbnail((MediaSource) source, get_thumb_size());
+ }
+
+ // this is a view-level operation on this page only; it does not affect the persistent global
+ // thumbnail scale
+ public void set_thumb_size(int new_scale) {
+ if (get_thumb_size() == new_scale || !is_in_view())
+ return;
+
+ new_scale = new_scale.clamp(Thumbnail.MIN_SCALE, Thumbnail.MAX_SCALE);
+ get_checkerboard_layout().set_scale(new_scale);
+
+ // when doing mass operations on LayoutItems, freeze individual notifications
+ get_view().freeze_notifications();
+ get_view().set_property(Thumbnail.PROP_SIZE, new_scale);
+ get_view().thaw_notifications();
+
+ set_action_sensitive("IncreaseSize", new_scale < Thumbnail.MAX_SCALE);
+ set_action_sensitive("DecreaseSize", new_scale > Thumbnail.MIN_SCALE);
+ }
+
+ public int get_thumb_size() {
+ if (get_checkerboard_layout().get_scale() <= 0)
+ get_checkerboard_layout().set_scale(Config.Facade.get_instance().get_photo_thumbnail_scale());
+
+ return get_checkerboard_layout().get_scale();
+ }
+}
+
diff --git a/src/MediaViewTracker.vala b/src/MediaViewTracker.vala
new file mode 100644
index 0000000..879dc84
--- /dev/null
+++ b/src/MediaViewTracker.vala
@@ -0,0 +1,114 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class MediaViewTracker : Core.ViewTracker {
+ public MediaAccumulator all = new MediaAccumulator();
+ public MediaAccumulator visible = new MediaAccumulator();
+ public MediaAccumulator selected = new MediaAccumulator();
+
+ public MediaViewTracker(ViewCollection collection) {
+ base (collection);
+
+ start(all, visible, selected);
+ }
+}
+
+public class MediaAccumulator : Object, Core.TrackerAccumulator {
+ public int total = 0;
+ public int photos = 0;
+ public int videos = 0;
+ public int raw = 0;
+ public int flagged = 0;
+
+ public bool include(DataObject object) {
+ DataSource source = ((DataView) object).get_source();
+
+ total++;
+
+ Photo? photo = source as Photo;
+ if (photo != null) {
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ raw++;
+ }
+
+ if (photo.get_master_file_format() != PhotoFileFormat.RAW ||
+ photo.is_raw_developer_available(RawDeveloper.CAMERA)) {
+ photos++;
+ }
+ } else if (source is VideoSource) {
+ videos++;
+ }
+
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && flaggable.is_flagged())
+ flagged++;
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool uninclude(DataObject object) {
+ DataSource source = ((DataView) object).get_source();
+
+ if (total < 1) {
+ warning("Tried to remove DataObject %s from empty %s (%s)".printf(object.to_string(),
+ get_type().name(), to_string()));
+ return false;
+ }
+ total--;
+
+ Photo? photo = source as Photo;
+ if (photo != null) {
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ assert(raw > 0);
+ raw--;
+ }
+
+ if (photo.get_master_file_format() != PhotoFileFormat.RAW ||
+ photo.is_raw_developer_available(RawDeveloper.CAMERA)) {
+ assert(photos > 0);
+ photos--;
+ }
+ } else if (source is Video) {
+ assert(videos > 0);
+ videos--;
+ }
+
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && flaggable.is_flagged()) {
+ assert(flagged > 0);
+ flagged--;
+ }
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool altered(DataObject object, Alteration alteration) {
+ // the only alteration that can happen to MediaSources this accumulator is concerned with is
+ // flagging; typeness and raw-ness don't change at runtime
+ if (!alteration.has_detail("metadata", "flagged"))
+ return false;
+
+ Flaggable? flaggable = ((DataView) object).get_source() as Flaggable;
+ if (flaggable == null)
+ return false;
+
+ if (flaggable.is_flagged()) {
+ flagged++;
+ } else {
+ assert(flagged > 0);
+ flagged--;
+ }
+
+ return true;
+ }
+
+ public string to_string() {
+ return "%d photos/%d videos/%d raw/%d flagged".printf(photos, videos, raw, flagged);
+ }
+}
+
diff --git a/src/MetadataWriter.vala b/src/MetadataWriter.vala
new file mode 100644
index 0000000..aee5855
--- /dev/null
+++ b/src/MetadataWriter.vala
@@ -0,0 +1,675 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// MetadataWriter tracks LibraryPhotos for alterations to their metadata and commits those changes
+// in a timely manner to their backing files. Because only the MetadataWriter knows when the
+// metadata has been properly committed, it is also responsible for updating the metadata-dirty
+// flag in Photo. Thus, MetadataWriter should *always* be running, even if the user has turned off
+// the feature, so if they turn it on MetadataWriter can properly go out and update the backing
+// files.
+
+public class MetadataWriter : Object {
+ public const uint COMMIT_DELAY_MSEC = 3000;
+ public const uint COMMIT_SPACING_MSEC = 50;
+
+ private const string[] INTERESTED_PHOTO_METADATA_DETAILS = { "name", "comment", "rating", "exposure-time" };
+
+ private class CommitJob : BackgroundJob {
+ public LibraryPhoto photo;
+ public Gee.Set<string>? current_keywords;
+ public Photo.ReimportMasterState reimport_master_state = null;
+ public Photo.ReimportEditableState reimport_editable_state = null;
+ public Error? err = null;
+
+ public CommitJob(MetadataWriter owner, LibraryPhoto photo, Gee.Set<string>? keywords) {
+ base (owner, owner.on_update_completed, new Cancellable(), owner.on_update_cancelled);
+
+ this.photo = photo;
+ current_keywords = keywords;
+ }
+
+ public override void execute() {
+ try {
+ commit_master();
+ commit_editable();
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+
+ private void commit_master() throws Error {
+ // If we have an editable, any orientation changes should be written only to it;
+ // otherwise, we'll end up ruining the original, and as such, breaking the
+ // ability to revert to it.
+ bool skip_orientation = photo.has_editable();
+
+ if (!photo.get_master_file_format().can_write_metadata())
+ return;
+
+ PhotoMetadata metadata = photo.get_master_metadata();
+ if (update_metadata(metadata, skip_orientation)) {
+ LibraryMonitor.blacklist_file(photo.get_master_file(), "MetadataWriter.commit_master");
+ try {
+ photo.persist_master_metadata(metadata, out reimport_master_state);
+ } finally {
+ LibraryMonitor.unblacklist_file(photo.get_master_file());
+ }
+ }
+ }
+
+ private void commit_editable() throws Error {
+ if (!photo.has_editable() || !photo.get_editable_file_format().can_write_metadata())
+ return;
+
+ PhotoMetadata? metadata = photo.get_editable_metadata();
+ assert(metadata != null);
+
+ if (update_metadata(metadata)) {
+ LibraryMonitor.blacklist_file(photo.get_editable_file(), "MetadataWriter.commit_editable");
+ try {
+ photo.persist_editable_metadata(metadata, out reimport_editable_state);
+ } finally {
+ LibraryMonitor.unblacklist_file(photo.get_editable_file());
+ }
+ }
+ }
+
+ private bool update_metadata(PhotoMetadata metadata, bool skip_orientation = false) {
+ bool changed = false;
+
+ // title (caption)
+ string? current_title = photo.get_title();
+ if (current_title != metadata.get_title()) {
+ metadata.set_title(current_title);
+ changed = true;
+ }
+
+ // comment
+ string? current_comment = photo.get_comment();
+ if (current_comment != metadata.get_comment()) {
+ metadata.set_comment(current_comment);
+ changed = true;
+ }
+
+ // rating
+ Rating current_rating = photo.get_rating();
+ if (current_rating != metadata.get_rating()) {
+ metadata.set_rating(current_rating);
+ changed = true;
+ }
+
+ // exposure date/time
+ time_t current_exposure_time = photo.get_exposure_time();
+ time_t metadata_exposure_time = 0;
+ MetadataDateTime? metadata_exposure_date_time = metadata.get_exposure_date_time();
+ if (metadata_exposure_date_time != null)
+ metadata_exposure_time = metadata_exposure_date_time.get_timestamp();
+ if (current_exposure_time != metadata_exposure_time) {
+ metadata.set_exposure_date_time(current_exposure_time != 0
+ ? new MetadataDateTime(current_exposure_time)
+ : null);
+ changed = true;
+ }
+
+ // tags (keywords) ... replace (or clear) entirely rather than union or intersection
+ Gee.Set<string> safe_keywords = new Gee.HashSet<string>();
+
+ // Since the tags are stored in an image file's `keywords' field in
+ // non-hierarchical format, before checking whether the tags that
+ // should be associated with this image have been written, we'll need
+ // to produce non-hierarchical versions of the tags to be tested.
+ // get_user_visible_name() does this by returning the most deeply-nested
+ // portion of a given hierarchical tag; that is, for a tag "/a/b/c",
+ // it'll return "c", which is exactly the form we want here.
+ if (current_keywords != null) {
+ foreach(string tmp in current_keywords) {
+ Tag tag = Tag.for_path(tmp);
+ safe_keywords.add(tag.get_user_visible_name());
+ }
+ }
+
+ if (!equal_sets(safe_keywords, metadata.get_keywords())) {
+ metadata.set_keywords(current_keywords);
+ changed = true;
+ }
+
+ // orientation
+ if (!skip_orientation) {
+ Orientation current_orientation = photo.get_orientation();
+ if (current_orientation != metadata.get_orientation()) {
+ metadata.set_orientation(current_orientation);
+ changed = true;
+ }
+ }
+
+ // add the software name/version only if updating the metadata in the file
+ if (changed)
+ metadata.set_software(Resources.APP_TITLE, Resources.APP_VERSION);
+
+ return changed;
+ }
+ }
+
+ private static MetadataWriter instance = null;
+
+ private Workers workers = new Workers(1, false);
+ private bool enabled = false;
+ private HashTimedQueue<LibraryPhoto> dirty;
+ private Gee.HashMap<LibraryPhoto, CommitJob> pending = new Gee.HashMap<LibraryPhoto, CommitJob>();
+ private Gee.HashSet<string> interested_photo_details = new Gee.HashSet<string>();
+ private LibraryPhoto? ignore_photo_alteration = null;
+ private uint outstanding_total = 0;
+ private uint outstanding_completed = 0;
+ private bool closed = false;
+ private int pause_count = 0;
+ private Gee.HashSet<LibraryPhoto> importing_photos = new Gee.HashSet<LibraryPhoto>();
+
+ public signal void progress(uint completed, uint total);
+
+ private MetadataWriter() {
+ dirty = new HashTimedQueue<LibraryPhoto>(COMMIT_DELAY_MSEC, on_photo_dequeued);
+ dirty.set_dequeue_spacing_msec(COMMIT_SPACING_MSEC);
+
+ // start with the writer paused, waiting for the LibraryMonitor initial discovery to
+ // complete (note that if the LibraryMonitor is ever disabled, the MetadataWriter will not
+ // start on its own)
+ pause();
+
+ // convert all interested metadata Alteration details into lookup hash
+ foreach (string detail in INTERESTED_PHOTO_METADATA_DETAILS)
+ interested_photo_details.add(detail);
+
+ // sync up with the configuration system
+ enabled = Config.Facade.get_instance().get_commit_metadata_to_masters();
+ Config.Facade.get_instance().commit_metadata_to_masters_changed.connect(on_config_changed);
+
+ // add all current photos to look for ones that are dirty and need updating
+ force_rescan();
+
+ LibraryPhoto.global.media_import_starting.connect(on_importing_photos);
+ LibraryPhoto.global.media_import_completed.connect(on_photos_imported);
+ LibraryPhoto.global.contents_altered.connect(on_photos_added_removed);
+ LibraryPhoto.global.items_altered.connect(on_photos_altered);
+ LibraryPhoto.global.frozen.connect(on_collection_frozen);
+ LibraryPhoto.global.thawed.connect(on_collection_thawed);
+ LibraryPhoto.global.items_destroyed.connect(on_photos_destroyed);
+
+ Tag.global.items_altered.connect(on_tags_altered);
+ Tag.global.container_contents_altered.connect(on_tag_contents_altered);
+ Tag.global.backlink_to_container_removed.connect(on_tag_backlink_removed);
+ Tag.global.frozen.connect(on_collection_frozen);
+ Tag.global.thawed.connect(on_collection_thawed);
+
+ Application.get_instance().exiting.connect(on_application_exiting);
+
+ LibraryMonitorPool.get_instance().monitor_installed.connect(on_monitor_installed);
+ LibraryMonitorPool.get_instance().monitor_destroyed.connect(on_monitor_destroyed);
+ }
+
+ ~MetadataWriter() {
+ Config.Facade.get_instance().commit_metadata_to_masters_changed.disconnect(on_config_changed);
+
+ LibraryPhoto.global.media_import_starting.disconnect(on_importing_photos);
+ LibraryPhoto.global.media_import_completed.disconnect(on_photos_imported);
+ LibraryPhoto.global.contents_altered.disconnect(on_photos_added_removed);
+ LibraryPhoto.global.items_altered.disconnect(on_photos_altered);
+ LibraryPhoto.global.frozen.disconnect(on_collection_frozen);
+ LibraryPhoto.global.thawed.disconnect(on_collection_thawed);
+ LibraryPhoto.global.items_destroyed.disconnect(on_photos_destroyed);
+
+ Tag.global.items_altered.disconnect(on_tags_altered);
+ Tag.global.container_contents_altered.disconnect(on_tag_contents_altered);
+ Tag.global.backlink_to_container_removed.disconnect(on_tag_backlink_removed);
+ Tag.global.frozen.disconnect(on_collection_frozen);
+ Tag.global.thawed.disconnect(on_collection_thawed);
+
+ Application.get_instance().exiting.disconnect(on_application_exiting);
+
+ LibraryMonitorPool.get_instance().monitor_installed.disconnect(on_monitor_installed);
+ LibraryMonitorPool.get_instance().monitor_destroyed.disconnect(on_monitor_destroyed);
+ }
+
+ public static void init() {
+ instance = new MetadataWriter();
+ }
+
+ public static void terminate() {
+ if (instance != null)
+ instance.close();
+
+ instance = null;
+ }
+
+ public static MetadataWriter get_instance() {
+ return instance;
+ }
+
+ // This will examine all photos for dirty metadata and schedule commits if enabled.
+ public void force_rescan() {
+ schedule_if_dirty((Gee.Collection<LibraryPhoto>) LibraryPhoto.global.get_all(), "force rescan");
+ }
+
+ public void pause() {
+ if (pause_count++ != 0)
+ return;
+
+ dirty.pause();
+
+ progress(0, 0);
+ }
+
+ public void unpause() {
+ if (pause_count == 0 || --pause_count != 0)
+ return;
+
+ dirty.unpause();
+ }
+
+ public void close() {
+ if (closed)
+ return;
+
+ cancel_all(true);
+
+ closed = true;
+ }
+
+ private void on_config_changed() {
+ bool value = Config.Facade.get_instance().get_commit_metadata_to_masters();
+
+ if (enabled == value)
+ return;
+
+ enabled = value;
+ if (enabled)
+ force_rescan();
+ else
+ cancel_all(false);
+ }
+
+ private void on_application_exiting() {
+ close();
+ }
+
+ private void on_monitor_installed(LibraryMonitor monitor) {
+ monitor.discovery_completed.connect(on_discovery_completed);
+ }
+
+ private void on_monitor_destroyed(LibraryMonitor monitor) {
+ monitor.discovery_completed.disconnect(on_discovery_completed);
+ }
+
+ private void on_discovery_completed() {
+ unpause();
+ }
+
+ private void on_collection_frozen() {
+ pause();
+ }
+
+ private void on_collection_thawed() {
+ unpause();
+ }
+
+ private void on_importing_photos(Gee.Collection<MediaSource> media_sources) {
+ importing_photos.add_all((Gee.Collection<LibraryPhoto>) media_sources);
+ }
+
+ private void on_photos_imported(Gee.Collection<MediaSource> media_sources) {
+ importing_photos.remove_all((Gee.Collection<LibraryPhoto>) media_sources);
+ }
+
+ private void on_photos_added_removed(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ // no reason to go through this exercise if auto-commit is disabled
+ if (added != null && enabled)
+ schedule_if_dirty((Gee.Iterable<LibraryPhoto>) added, "added to LibraryPhoto.global");
+
+ // want to cancel jobs no matter what, however
+ if (removed != null) {
+ bool cancelled = false;
+ foreach (DataObject object in removed)
+ cancelled = cancel_job((LibraryPhoto) object) || cancelled;
+
+ if (cancelled)
+ progress(outstanding_completed, outstanding_total);
+ }
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> items) {
+ Gee.HashSet<LibraryPhoto> photos = null;
+ foreach (DataObject object in items.keys) {
+ LibraryPhoto photo = (LibraryPhoto) object;
+
+ // ignore this signal on this photo (means it's coming up from completing the metadata
+ // update)
+ if (photo == ignore_photo_alteration)
+ continue;
+
+ Alteration alteration = items.get(object);
+
+ // if an image:orientation detail, write that out
+ if (alteration.has_detail("image", "orientation")) {
+ if (photos == null)
+ photos = new Gee.HashSet<LibraryPhoto>();
+
+ photos.add(photo);
+
+ continue;
+ }
+
+ // get all "metadata" details for this alteration
+ Gee.Collection<string>? details = alteration.get_details("metadata");
+ if (details == null)
+ continue;
+
+ // only enqueue an update if an alteration of metadata actually written out occurs
+ foreach (string detail in details) {
+ if (interested_photo_details.contains(detail)) {
+ if (photos == null)
+ photos = new Gee.HashSet<LibraryPhoto>();
+
+ photos.add(photo);
+
+ break;
+ }
+ }
+ }
+
+ if (photos != null)
+ photos_are_dirty(photos, "alteration", false);
+ }
+
+ private void on_photos_destroyed(Gee.Collection<DataSource> destroyed) {
+ foreach (DataSource source in destroyed) {
+ LibraryPhoto photo = (LibraryPhoto) source;
+ cancel_job(photo);
+ importing_photos.remove(photo);
+ }
+ }
+
+ private void on_tags_altered(Gee.Map<DataObject, Alteration> map) {
+ Gee.HashSet<LibraryPhoto>? photos = null;
+ foreach (DataObject object in map.keys) {
+ if (!map.get(object).has_detail("metadata", "name"))
+ continue;
+
+ if (photos == null)
+ photos = new Gee.HashSet<LibraryPhoto>();
+
+ foreach (MediaSource media in ((Tag) object).get_sources()) {
+ LibraryPhoto? photo = media as LibraryPhoto;
+ if (photo != null)
+ photos.add(photo);
+ }
+ }
+
+ if (photos != null)
+ photos_are_dirty(photos, "tag renamed", false);
+ }
+
+ private void on_tag_contents_altered(ContainerSource container, Gee.Collection<DataSource>? added,
+ bool relinking, Gee.Collection<DataSource>? removed, bool unlinking) {
+ Tag tag = (Tag) container;
+
+ if (added != null && !relinking) {
+ Gee.ArrayList<LibraryPhoto> added_photos = new Gee.ArrayList<LibraryPhoto>();
+ foreach (DataSource source in added) {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo != null && !importing_photos.contains(photo))
+ added_photos.add(photo);
+ }
+
+ photos_are_dirty(added_photos, "added to %s".printf(tag.to_string()), false);
+ }
+
+ if (removed != null && !unlinking) {
+ Gee.ArrayList<LibraryPhoto> removed_photos = new Gee.ArrayList<LibraryPhoto>();
+ foreach (DataSource source in removed) {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo != null)
+ removed_photos.add(photo);
+ }
+
+ photos_are_dirty(removed_photos, "removed from %s".printf(tag.to_string()), false);
+ }
+ }
+
+ private void on_tag_backlink_removed(ContainerSource container, Gee.Collection<DataSource> sources) {
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ foreach (DataSource source in sources) {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo != null)
+ photos.add(photo);
+ }
+
+ photos_are_dirty(photos, "backlink removed from %s".printf(container.to_string()), false);
+ }
+
+ private void count_enqueued_work(int count, bool report) {
+ outstanding_total += count;
+
+#if TRACE_METADATA_WRITER
+ debug("[%u/%u] %d metadata jobs enqueued", outstanding_completed, outstanding_total, count);
+#endif
+
+ if (report)
+ progress(outstanding_completed, outstanding_total);
+ }
+
+ private void count_cancelled_work(int count, bool report) {
+ outstanding_total = (outstanding_total >= count) ? outstanding_total - count : 0;
+ if (outstanding_completed >= outstanding_total) {
+ outstanding_completed = 0;
+ outstanding_total = 0;
+ }
+
+#if TRACE_METADATA_WRITER
+ debug("[%u/%u] %d metadata jobs cancelled", outstanding_completed, outstanding_total, count);
+#endif
+
+ if (report)
+ progress(outstanding_completed, outstanding_total);
+ }
+
+ private void count_completed_work(int count, bool report) {
+ outstanding_completed += count;
+ if (outstanding_completed >= outstanding_total) {
+ outstanding_completed = 0;
+ outstanding_total = 0;
+ }
+
+#if TRACE_METADATA_WRITER
+ debug("[%u/%u] %d metadata jobs completed", outstanding_completed, outstanding_total, count);
+#endif
+
+ if (report)
+ progress(outstanding_completed, outstanding_total);
+ }
+
+ private void schedule_if_dirty(Gee.Iterable<MediaSource> media_sources, string reason) {
+ Gee.ArrayList<LibraryPhoto> photos = null;
+ foreach (MediaSource media in media_sources) {
+ LibraryPhoto? photo = media as LibraryPhoto;
+ if (photo == null)
+ continue;
+
+ // if in the importing stage, do not schedule for commit
+ if (importing_photos.contains(photo))
+ continue;
+
+ if (photo.is_master_metadata_dirty()) {
+ if (photos == null)
+ photos = new Gee.ArrayList<LibraryPhoto>();
+
+ photos.add(photo);
+ }
+ }
+
+ if (photos != null)
+ photos_are_dirty(photos, reason, true);
+ }
+
+ // No photos are dirty. The human body is a thing of beauty and grace.
+ private void photos_are_dirty(Gee.Collection<LibraryPhoto> photos, string reason, bool already_marked) {
+ if (photos.size == 0)
+ return;
+
+ // cancel all outstanding and pending jobs
+ foreach (LibraryPhoto photo in photos)
+ cancel_job(photo);
+
+ // mark all the photos as dirty
+ if (!already_marked) {
+ try {
+ LibraryPhoto.global.transaction_controller.begin();
+
+ foreach (LibraryPhoto photo in photos)
+ photo.set_master_metadata_dirty(true);
+
+ LibraryPhoto.global.transaction_controller.commit();
+ } catch (Error err) {
+ if (err is DatabaseError)
+ AppWindow.database_error((DatabaseError) err);
+ else
+ error("Unable to mark metadata as dirty: %s", err.message);
+ }
+ }
+
+ // ok to drop this on the floor, now that they're marked dirty (will attempt to write them
+ // out the next time MetadataWriter runs)
+ if (closed || !enabled)
+ return;
+
+#if TRACE_METADATA_WRITER
+ debug("[%s] adding %d photos to dirty list", reason, photos.size);
+#endif
+
+ foreach (LibraryPhoto photo in photos) {
+ bool enqueued = dirty.enqueue(photo);
+ assert(enqueued);
+ }
+
+ count_enqueued_work(photos.size, true);
+ }
+
+ private void cancel_all(bool wait) {
+ dirty.clear();
+
+ foreach (CommitJob job in pending.values)
+ job.cancel();
+
+ if (wait)
+ workers.wait_for_empty_queue();
+
+ count_cancelled_work(int.MAX, true);
+ }
+
+ private bool cancel_job(LibraryPhoto photo) {
+ bool cancelled = false;
+
+ if (pending.has_key(photo)) {
+ pending.get(photo).cancel();
+ cancelled = true;
+ }
+
+ if (dirty.contains(photo)) {
+ bool removed = dirty.remove_first(photo);
+ assert(removed);
+
+ assert(!dirty.contains(photo));
+
+ count_cancelled_work(1, false);
+ cancelled = true;
+ }
+
+ return cancelled;
+ }
+
+ private void on_photo_dequeued(LibraryPhoto photo) {
+ if (!enabled) {
+ count_cancelled_work(1, true);
+
+ return;
+ }
+
+ Gee.Set<string>? keywords = null;
+ Gee.Collection<Tag>? tags = Tag.global.fetch_for_source(photo);
+ if (tags != null) {
+ keywords = new Gee.HashSet<string>();
+ foreach (Tag tag in tags)
+ keywords.add(tag.get_name());
+ }
+
+ CommitJob job = new CommitJob(this, photo, keywords);
+ pending.set(photo, job);
+
+#if TRACE_METADATA_WRITER
+ debug("%s dequeued for metadata commit, %d pending", photo.to_string(), pending.size);
+#endif
+
+ workers.enqueue(job);
+ }
+
+ private void on_update_completed(BackgroundJob j) {
+ CommitJob job = (CommitJob) j;
+
+ if (job.err != null)
+ warning("Unable to update metadata for %s: %s", job.photo.to_string(), job.err.message);
+ else
+ message("Completed writing metadata for %s", job.photo.to_string());
+
+ bool removed = pending.unset(job.photo);
+ assert(removed);
+
+ // since there's potentially multiple state-change operations here, use the transaction
+ // controller
+ LibraryPhoto.global.transaction_controller.begin();
+
+ if (job.reimport_master_state != null || job.reimport_editable_state != null) {
+ // finish_update_*_metadata are going to issue an "altered" signal, and we want to
+ // ignore it
+ assert(ignore_photo_alteration == null);
+ ignore_photo_alteration = job.photo;
+ try {
+ if (job.reimport_master_state != null)
+ job.photo.finish_update_master_metadata(job.reimport_master_state);
+
+ if (job.reimport_editable_state != null)
+ job.photo.finish_update_editable_metadata(job.reimport_editable_state);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ } finally {
+ // this assertion guards against reentrancy
+ assert(ignore_photo_alteration == job.photo);
+ ignore_photo_alteration = null;
+ }
+ } else {
+#if TRACE_METADATA_WRITER
+ debug("[%u/%u] No metadata changes for %s", outstanding_completed, outstanding_total,
+ job.photo.to_string());
+#endif
+ }
+
+ try {
+ job.photo.set_master_metadata_dirty(false);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ LibraryPhoto.global.transaction_controller.commit();
+
+ count_completed_work(1, true);
+ }
+
+ private void on_update_cancelled(BackgroundJob j) {
+ bool removed = pending.unset(((CommitJob) j).photo);
+ assert(removed);
+
+ count_cancelled_work(1, true);
+ }
+}
+
diff --git a/src/Orientation.vala b/src/Orientation.vala
new file mode 100644
index 0000000..b31c22d
--- /dev/null
+++ b/src/Orientation.vala
@@ -0,0 +1,493 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public enum Orientation {
+ MIN = 1,
+ TOP_LEFT = 1,
+ TOP_RIGHT = 2,
+ BOTTOM_RIGHT = 3,
+ BOTTOM_LEFT = 4,
+ LEFT_TOP = 5,
+ RIGHT_TOP = 6,
+ RIGHT_BOTTOM = 7,
+ LEFT_BOTTOM = 8,
+ MAX = 8;
+
+ public string to_string() {
+ switch (this) {
+ case TOP_LEFT:
+ return "top-left";
+
+ case TOP_RIGHT:
+ return "top-right";
+
+ case BOTTOM_RIGHT:
+ return "bottom-right";
+
+ case BOTTOM_LEFT:
+ return "bottom-left";
+
+ case LEFT_TOP:
+ return "left-top";
+
+ case RIGHT_TOP:
+ return "right-top";
+
+ case RIGHT_BOTTOM:
+ return "right-bottom";
+
+ case LEFT_BOTTOM:
+ return "left-bottom";
+
+ default:
+ return "unknown orientation %d".printf((int) this);
+ }
+ }
+
+ public Orientation rotate_clockwise() {
+ switch (this) {
+ case TOP_LEFT:
+ return RIGHT_TOP;
+
+ case TOP_RIGHT:
+ return RIGHT_BOTTOM;
+
+ case BOTTOM_RIGHT:
+ return LEFT_BOTTOM;
+
+ case BOTTOM_LEFT:
+ return LEFT_TOP;
+
+ case LEFT_TOP:
+ return TOP_RIGHT;
+
+ case RIGHT_TOP:
+ return BOTTOM_RIGHT;
+
+ case RIGHT_BOTTOM:
+ return BOTTOM_LEFT;
+
+ case LEFT_BOTTOM:
+ return TOP_LEFT;
+
+ default:
+ error("rotate_clockwise: %d", this);
+ }
+ }
+
+ public Orientation rotate_counterclockwise() {
+ switch (this) {
+ case TOP_LEFT:
+ return LEFT_BOTTOM;
+
+ case TOP_RIGHT:
+ return LEFT_TOP;
+
+ case BOTTOM_RIGHT:
+ return RIGHT_TOP;
+
+ case BOTTOM_LEFT:
+ return RIGHT_BOTTOM;
+
+ case LEFT_TOP:
+ return BOTTOM_LEFT;
+
+ case RIGHT_TOP:
+ return TOP_LEFT;
+
+ case RIGHT_BOTTOM:
+ return TOP_RIGHT;
+
+ case LEFT_BOTTOM:
+ return BOTTOM_RIGHT;
+
+ default:
+ error("rotate_counterclockwise: %d", this);
+ }
+ }
+
+ public Orientation flip_top_to_bottom() {
+ switch (this) {
+ case TOP_LEFT:
+ return BOTTOM_LEFT;
+
+ case TOP_RIGHT:
+ return BOTTOM_RIGHT;
+
+ case BOTTOM_RIGHT:
+ return TOP_RIGHT;
+
+ case BOTTOM_LEFT:
+ return TOP_LEFT;
+
+ case LEFT_TOP:
+ return LEFT_BOTTOM;
+
+ case RIGHT_TOP:
+ return RIGHT_BOTTOM;
+
+ case RIGHT_BOTTOM:
+ return RIGHT_TOP;
+
+ case LEFT_BOTTOM:
+ return LEFT_TOP;
+
+ default:
+ error("flip_top_to_bottom: %d", this);
+ }
+ }
+
+ public Orientation flip_left_to_right() {
+ switch (this) {
+ case TOP_LEFT:
+ return TOP_RIGHT;
+
+ case TOP_RIGHT:
+ return TOP_LEFT;
+
+ case BOTTOM_RIGHT:
+ return BOTTOM_LEFT;
+
+ case BOTTOM_LEFT:
+ return BOTTOM_RIGHT;
+
+ case LEFT_TOP:
+ return RIGHT_TOP;
+
+ case RIGHT_TOP:
+ return LEFT_TOP;
+
+ case RIGHT_BOTTOM:
+ return LEFT_BOTTOM;
+
+ case LEFT_BOTTOM:
+ return RIGHT_BOTTOM;
+
+ default:
+ error("flip_left_to_right: %d", this);
+ }
+ }
+
+ public Orientation perform(Rotation rotation) {
+ switch (rotation) {
+ case Rotation.CLOCKWISE:
+ return rotate_clockwise();
+
+ case Rotation.COUNTERCLOCKWISE:
+ return rotate_counterclockwise();
+
+ case Rotation.MIRROR:
+ return flip_left_to_right();
+
+ case Rotation.UPSIDE_DOWN:
+ return flip_top_to_bottom();
+
+ default:
+ error("perform: %d", (int) rotation);
+ }
+ }
+
+ public Rotation[] to_rotations() {
+ switch (this) {
+ case TOP_LEFT:
+ // identity orientation
+ return { };
+
+ case TOP_RIGHT:
+ return { Rotation.MIRROR };
+
+ case BOTTOM_RIGHT:
+ return { Rotation.UPSIDE_DOWN };
+
+ case BOTTOM_LEFT:
+ // flip top-to-bottom
+ return { Rotation.MIRROR, Rotation.UPSIDE_DOWN };
+
+ case LEFT_TOP:
+ return { Rotation.COUNTERCLOCKWISE, Rotation.UPSIDE_DOWN };
+
+ case RIGHT_TOP:
+ return { Rotation.CLOCKWISE };
+
+ case RIGHT_BOTTOM:
+ return { Rotation.CLOCKWISE, Rotation.UPSIDE_DOWN };
+
+ case LEFT_BOTTOM:
+ return { Rotation.COUNTERCLOCKWISE };
+
+ default:
+ error("to_rotations: %d", this);
+ }
+ }
+
+ public Dimensions rotate_dimensions(Dimensions dim) {
+ switch (this) {
+ case Orientation.TOP_LEFT:
+ case Orientation.TOP_RIGHT:
+ case Orientation.BOTTOM_RIGHT:
+ case Orientation.BOTTOM_LEFT:
+ // fine just as it is
+ return dim;
+
+ case Orientation.LEFT_TOP:
+ case Orientation.RIGHT_TOP:
+ case Orientation.RIGHT_BOTTOM:
+ case Orientation.LEFT_BOTTOM:
+ // swap
+ return Dimensions(dim.height, dim.width);
+
+ default:
+ error("rotate_dimensions: %d", this);
+ }
+ }
+
+ public Dimensions derotate_dimensions(Dimensions dim) {
+ return rotate_dimensions(dim);
+ }
+
+ public Gdk.Pixbuf rotate_pixbuf(Gdk.Pixbuf pixbuf) {
+ Gdk.Pixbuf rotated;
+ switch (this) {
+ case TOP_LEFT:
+ // fine just as it is
+ rotated = pixbuf;
+ break;
+
+ case TOP_RIGHT:
+ // mirror
+ rotated = pixbuf.flip(true);
+ break;
+
+ case BOTTOM_RIGHT:
+ rotated = pixbuf.rotate_simple(Gdk.PixbufRotation.UPSIDEDOWN);
+ break;
+
+ case BOTTOM_LEFT:
+ // flip top-to-bottom
+ rotated = pixbuf.flip(false);
+ break;
+
+ case LEFT_TOP:
+ rotated = pixbuf.rotate_simple(Gdk.PixbufRotation.COUNTERCLOCKWISE).flip(false);
+ break;
+
+ case RIGHT_TOP:
+ rotated = pixbuf.rotate_simple(Gdk.PixbufRotation.CLOCKWISE);
+ break;
+
+ case RIGHT_BOTTOM:
+ rotated = pixbuf.rotate_simple(Gdk.PixbufRotation.CLOCKWISE).flip(false);
+ break;
+
+ case LEFT_BOTTOM:
+ rotated = pixbuf.rotate_simple(Gdk.PixbufRotation.COUNTERCLOCKWISE);
+ break;
+
+ default:
+ error("rotate_pixbuf: %d", this);
+ }
+
+ return rotated;
+ }
+
+ // space is the unrotated dimensions the point is rotating with
+ public Gdk.Point rotate_point(Dimensions space, Gdk.Point point) {
+ assert(space.has_area());
+ assert(point.x >= 0);
+ assert(point.x < space.width);
+ assert(point.y >= 0);
+ assert(point.y < space.height);
+
+ Gdk.Point rotated = Gdk.Point();
+
+ switch (this) {
+ case TOP_LEFT:
+ // fine as-is
+ rotated = point;
+ break;
+
+ case TOP_RIGHT:
+ // mirror
+ rotated.x = space.width - point.x - 1;
+ rotated.y = point.y;
+ break;
+
+ case BOTTOM_RIGHT:
+ // rotate 180
+ rotated.x = space.width - point.x - 1;
+ rotated.y = space.height - point.y - 1;
+ break;
+
+ case BOTTOM_LEFT:
+ // flip top-to-bottom
+ rotated.x = point.x;
+ rotated.y = space.height - point.y - 1;
+ break;
+
+ case LEFT_TOP:
+ // rotate 90, flip top-to-bottom
+ rotated.x = point.y;
+ rotated.y = point.x;
+ break;
+
+ case RIGHT_TOP:
+ // rotate 270
+ rotated.x = space.height - point.y - 1;
+ rotated.y = point.x;
+ break;
+
+ case RIGHT_BOTTOM:
+ // rotate 270, flip top-to-bottom
+ rotated.x = space.height - point.y - 1;
+ rotated.y = space.width - point.x - 1;
+ break;
+
+ case LEFT_BOTTOM:
+ // rotate 90
+ rotated.x = point.y;
+ rotated.y = space.width - point.x - 1;
+ break;
+
+ default:
+ error("rotate_point: %d", this);
+ }
+
+ return rotated;
+ }
+
+ // space is the unrotated dimensions the point is return to
+ public Gdk.Point derotate_point(Dimensions space, Gdk.Point point) {
+ assert(space.has_area());
+
+ Gdk.Point derotated = Gdk.Point();
+
+ switch (this) {
+ case TOP_LEFT:
+ // fine as-is
+ derotated = point;
+ break;
+
+ case TOP_RIGHT:
+ // mirror
+ derotated.x = space.width - point.x - 1;
+ derotated.y = point.y;
+ break;
+
+ case BOTTOM_RIGHT:
+ // rotate 180
+ derotated.x = space.width - point.x - 1;
+ derotated.y = space.height - point.y - 1;
+ break;
+
+ case BOTTOM_LEFT:
+ // flip top-to-bottom
+ derotated.x = point.x;
+ derotated.y = space.height - point.y - 1;
+ break;
+
+ case LEFT_TOP:
+ // rotate 90, flip top-to-bottom
+ derotated.x = point.y;
+ derotated.y = point.x;
+ break;
+
+ case RIGHT_TOP:
+ // rotate 270
+ derotated.x = point.y;
+ derotated.y = space.height - point.x - 1;
+ break;
+
+ case RIGHT_BOTTOM:
+ // rotate 270, flip top-to-bottom
+ derotated.x = space.width - point.y - 1;
+ derotated.y = space.height - point.x - 1;
+ break;
+
+ case LEFT_BOTTOM:
+ // rotate 90
+ derotated.x = space.width - point.y - 1;
+ derotated.y = point.x;
+ break;
+
+ default:
+ error("rotate_point: %d", this);
+ }
+
+ return derotated;
+ }
+
+ // space is the unrotated dimensions the point is rotating with
+ public Box rotate_box(Dimensions space, Box box) {
+ Gdk.Point top_left, bottom_right;
+ box.get_points(out top_left, out bottom_right);
+
+ top_left.x = top_left.x.clamp(0, space.width - 1);
+ top_left.y = top_left.y.clamp(0, space.height - 1);
+
+ bottom_right.x = bottom_right.x.clamp(0, space.width - 1);
+ bottom_right.y = bottom_right.y.clamp(0, space.height - 1);
+
+ top_left = rotate_point(space, top_left);
+ bottom_right = rotate_point(space, bottom_right);
+
+ return Box.from_points(top_left, bottom_right);
+ }
+
+ // space is the unrotated dimensions the point is return to
+ public Box derotate_box(Dimensions space, Box box) {
+ Gdk.Point top_left, bottom_right;
+ box.get_points(out top_left, out bottom_right);
+
+ top_left = derotate_point(space, top_left);
+ bottom_right = derotate_point(space, bottom_right);
+
+ return Box.from_points(top_left, bottom_right);
+ }
+}
+
+public enum Rotation {
+ CLOCKWISE,
+ COUNTERCLOCKWISE,
+ MIRROR,
+ UPSIDE_DOWN;
+
+ public Gdk.Pixbuf perform(Gdk.Pixbuf pixbuf) {
+ switch (this) {
+ case CLOCKWISE:
+ return pixbuf.rotate_simple(Gdk.PixbufRotation.CLOCKWISE);
+
+ case COUNTERCLOCKWISE:
+ return pixbuf.rotate_simple(Gdk.PixbufRotation.COUNTERCLOCKWISE);
+
+ case MIRROR:
+ return pixbuf.flip(true);
+
+ case UPSIDE_DOWN:
+ return pixbuf.flip(false);
+
+ default:
+ error("Unknown rotation: %d", (int) this);
+ }
+ }
+
+ public Rotation opposite() {
+ switch (this) {
+ case CLOCKWISE:
+ return COUNTERCLOCKWISE;
+
+ case COUNTERCLOCKWISE:
+ return CLOCKWISE;
+
+ case MIRROR:
+ case UPSIDE_DOWN:
+ return this;
+
+ default:
+ error("Unknown rotation: %d", (int) this);
+ }
+ }
+}
+
diff --git a/src/Page.vala b/src/Page.vala
new file mode 100644
index 0000000..fd69431
--- /dev/null
+++ b/src/Page.vala
@@ -0,0 +1,2589 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class InjectionGroup {
+ public class Element {
+ public string name;
+ public string action;
+ public Gtk.UIManagerItemType kind;
+
+ public Element(string name, string? action, Gtk.UIManagerItemType kind) {
+ this.name = name;
+ this.action = action != null ? action : name;
+ this.kind = kind;
+ }
+ }
+
+ private string path;
+ private Gee.ArrayList<Element?> elements = new Gee.ArrayList<Element?>();
+ private int separator_id = 0;
+
+ public InjectionGroup(string path) {
+ this.path = path;
+ }
+
+ public string get_path() {
+ return path;
+ }
+
+ public Gee.List<Element?> get_elements() {
+ return elements;
+ }
+
+ public void add_menu_item(string name, string? action = null) {
+ elements.add(new Element(name, action, Gtk.UIManagerItemType.MENUITEM));
+ }
+
+ public void add_menu(string name, string? action = null) {
+ elements.add(new Element(name, action, Gtk.UIManagerItemType.MENU));
+ }
+
+ public void add_separator() {
+ elements.add(new Element("%d-separator".printf(separator_id++), null, Gtk.UIManagerItemType.SEPARATOR));
+ }
+}
+
+public abstract class Page : Gtk.ScrolledWindow {
+ private const int CONSIDER_CONFIGURE_HALTED_MSEC = 400;
+
+ protected Gtk.UIManager ui;
+ protected Gtk.Toolbar toolbar;
+ protected bool in_view = false;
+
+ private string page_name;
+ private ViewCollection view = null;
+ private Gtk.Window container = null;
+ private string toolbar_path;
+ private Gdk.Rectangle last_position = Gdk.Rectangle();
+ private Gtk.Widget event_source = null;
+ private bool dnd_enabled = false;
+ private ulong last_configure_ms = 0;
+ private bool report_move_finished = false;
+ private bool report_resize_finished = false;
+ private Gdk.Point last_down = Gdk.Point();
+ private bool is_destroyed = false;
+ private bool ctrl_pressed = false;
+ private bool alt_pressed = false;
+ private bool shift_pressed = false;
+ private bool super_pressed = false;
+ private Gdk.CursorType last_cursor = Gdk.CursorType.LEFT_PTR;
+ private bool cursor_hidden = false;
+ private int cursor_hide_msec = 0;
+ private uint last_timeout_id = 0;
+ private int cursor_hide_time_cached = 0;
+ private bool are_actions_attached = false;
+ private OneShotScheduler? update_actions_scheduler = null;
+ private Gtk.ActionGroup? action_group = null;
+ private Gtk.ActionGroup[]? common_action_groups = null;
+
+ private uint[] merge_ids = new uint[0];
+
+ protected Page(string page_name) {
+ this.page_name = page_name;
+
+ view = new ViewCollection("ViewCollection for Page %s".printf(page_name));
+
+ last_down = { -1, -1 };
+
+ set_can_focus(true);
+
+ popup_menu.connect(on_context_keypress);
+
+ init_ui();
+
+ realize.connect(attach_view_signals);
+
+ Resources.style_widget(this, Resources.SCROLL_FRAME_STYLESHEET);
+ }
+
+ ~Page() {
+#if TRACE_DTORS
+ debug("DTOR: Page %s", page_name);
+#endif
+ }
+
+ // This is called by the page controller when it has removed this page ... pages should override
+ // this (or the signal) to clean up
+ public override void destroy() {
+ if (is_destroyed)
+ return;
+
+ // untie signals
+ detach_event_source();
+ detach_view_signals();
+ view.close();
+
+ // remove refs to external objects which may be pointing to the Page
+ clear_container();
+
+ if (toolbar != null)
+ toolbar.destroy();
+
+ // halt any pending callbacks
+ if (update_actions_scheduler != null)
+ update_actions_scheduler.cancel();
+
+ is_destroyed = true;
+
+ base.destroy();
+
+ debug("Page %s Destroyed", get_page_name());
+ }
+
+ public string get_page_name() {
+ return page_name;
+ }
+
+ public virtual void set_page_name(string page_name) {
+ this.page_name = page_name;
+ }
+
+ public string to_string() {
+ return page_name;
+ }
+
+ public ViewCollection get_view() {
+ return view;
+ }
+
+ public Gtk.Window? get_container() {
+ return container;
+ }
+
+ public virtual void set_container(Gtk.Window container) {
+ assert(this.container == null);
+
+ this.container = container;
+ ui = ((PageWindow) container).get_ui_manager();
+ }
+
+ public virtual void clear_container() {
+ container = null;
+ }
+
+ public void set_event_source(Gtk.Widget event_source) {
+ assert(this.event_source == null);
+
+ this.event_source = event_source;
+ event_source.set_can_focus(true);
+
+ // interested in mouse button and motion events on the event source
+ event_source.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK
+ | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_HINT_MASK
+ | Gdk.EventMask.BUTTON_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK
+ | Gdk.EventMask.SCROLL_MASK);
+ event_source.button_press_event.connect(on_button_pressed_internal);
+ event_source.button_release_event.connect(on_button_released_internal);
+ event_source.motion_notify_event.connect(on_motion_internal);
+ event_source.leave_notify_event.connect(on_leave_notify_event);
+ event_source.scroll_event.connect(on_mousewheel_internal);
+ event_source.realize.connect(on_event_source_realize);
+ }
+
+ private void detach_event_source() {
+ if (event_source == null)
+ return;
+
+ event_source.button_press_event.disconnect(on_button_pressed_internal);
+ event_source.button_release_event.disconnect(on_button_released_internal);
+ event_source.motion_notify_event.disconnect(on_motion_internal);
+ event_source.leave_notify_event.disconnect(on_leave_notify_event);
+ event_source.scroll_event.disconnect(on_mousewheel_internal);
+
+ disable_drag_source();
+
+ event_source = null;
+ }
+
+ public Gtk.Widget? get_event_source() {
+ return event_source;
+ }
+
+ public virtual Gtk.MenuBar get_menubar() {
+ Gtk.MenuBar? menubar = ui.get_widget("/MenuBar") as Gtk.MenuBar;
+ assert(menubar != null);
+
+ return menubar;
+ }
+
+ public virtual unowned Gtk.Widget get_page_ui_widget(string path) {
+ return ui.get_widget(path);
+ }
+
+ public virtual Gtk.Toolbar get_toolbar() {
+ if (toolbar == null) {
+ toolbar = toolbar_path == null ? new Gtk.Toolbar() :
+ ui.get_widget(toolbar_path) as Gtk.Toolbar;
+ toolbar.get_style_context().add_class("bottom-toolbar"); // for elementary theme
+ }
+ return toolbar;
+ }
+
+ public virtual Gtk.Menu? get_page_context_menu() {
+ return null;
+ }
+
+ public virtual void switching_from() {
+ in_view = false;
+ remove_ui();
+ if (toolbar_path != null)
+ toolbar = null;
+ }
+
+ public virtual void switched_to() {
+ in_view = true;
+ add_ui();
+ update_modifiers();
+ }
+
+ public virtual void ready() {
+ }
+
+ public bool is_in_view() {
+ return in_view;
+ }
+
+ public virtual void switching_to_fullscreen(FullscreenWindow fsw) {
+ }
+
+ public virtual void returning_from_fullscreen(FullscreenWindow fsw) {
+ }
+
+ public Gtk.Action? get_action(string name) {
+ if (action_group == null)
+ return null;
+
+ Gtk.Action? action = action_group.get_action(name);
+ if (action == null)
+ action = get_common_action(name, false);
+
+ if (action == null)
+ warning("Page %s: Unable to locate action %s", get_page_name(), name);
+
+ return action;
+ }
+
+ public void set_action_sensitive(string name, bool sensitive) {
+ Gtk.Action? action = get_action(name);
+ if (action != null)
+ action.sensitive = sensitive;
+ }
+
+ public void set_action_important(string name, bool important) {
+ Gtk.Action? action = get_action(name);
+ if (action != null)
+ action.is_important = important;
+ }
+
+ public void set_action_visible(string name, bool visible) {
+ Gtk.Action? action = get_action(name);
+ if (action == null)
+ return;
+
+ action.visible = visible;
+ action.sensitive = visible;
+ }
+
+ public void set_action_short_label(string name, string short_label) {
+ Gtk.Action? action = get_action(name);
+ if (action != null)
+ action.short_label = short_label;
+ }
+
+ public void set_action_details(string name, string? label, string? tooltip, bool sensitive) {
+ Gtk.Action? action = get_action(name);
+ if (action == null)
+ return;
+
+ if (label != null)
+ action.label = label;
+
+ if (tooltip != null)
+ action.tooltip = tooltip;
+
+ action.sensitive = sensitive;
+ }
+
+ public void activate_action(string name) {
+ Gtk.Action? action = get_action(name);
+ if (action != null)
+ action.activate();
+ }
+
+ public Gtk.Action? get_common_action(string name, bool log_warning = true) {
+ if (common_action_groups == null)
+ return null;
+
+ foreach (Gtk.ActionGroup group in common_action_groups) {
+ Gtk.Action? action = group.get_action(name);
+ if (action != null)
+ return action;
+ }
+
+ if (log_warning)
+ warning("Page %s: Unable to locate common action %s", get_page_name(), name);
+
+ return null;
+ }
+
+ public void set_common_action_sensitive(string name, bool sensitive) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.sensitive = sensitive;
+ }
+
+ public void set_common_action_label(string name, string label) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.set_label(label);
+ }
+
+ public void set_common_action_important(string name, bool important) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.is_important = important;
+ }
+
+ public void activate_common_action(string name) {
+ Gtk.Action? action = get_common_action(name);
+ if (action != null)
+ action.activate();
+ }
+
+ public bool get_ctrl_pressed() {
+ return ctrl_pressed;
+ }
+
+ public bool get_alt_pressed() {
+ return alt_pressed;
+ }
+
+ public bool get_shift_pressed() {
+ return shift_pressed;
+ }
+
+ public bool get_super_pressed() {
+ return super_pressed;
+ }
+
+ private bool get_modifiers(out bool ctrl, out bool alt, out bool shift, out bool super) {
+ if (AppWindow.get_instance().get_window() == null) {
+ ctrl = false;
+ alt = false;
+ shift = false;
+ super = false;
+
+ return false;
+ }
+
+ int x, y;
+ Gdk.ModifierType mask;
+ AppWindow.get_instance().get_window().get_device_position(Gdk.Display.get_default().
+ get_device_manager().get_client_pointer(), out x, out y, out mask);
+
+ ctrl = (mask & Gdk.ModifierType.CONTROL_MASK) != 0;
+ alt = (mask & Gdk.ModifierType.MOD1_MASK) != 0;
+ shift = (mask & Gdk.ModifierType.SHIFT_MASK) != 0;
+ super = (mask & Gdk.ModifierType.MOD4_MASK) != 0; // not SUPER_MASK
+
+ return true;
+ }
+
+ private void update_modifiers() {
+ bool ctrl_currently_pressed, alt_currently_pressed, shift_currently_pressed,
+ super_currently_pressed;
+ if (!get_modifiers(out ctrl_currently_pressed, out alt_currently_pressed,
+ out shift_currently_pressed, out super_currently_pressed)) {
+ return;
+ }
+
+ if (ctrl_pressed && !ctrl_currently_pressed)
+ on_ctrl_released(null);
+ else if (!ctrl_pressed && ctrl_currently_pressed)
+ on_ctrl_pressed(null);
+
+ if (alt_pressed && !alt_currently_pressed)
+ on_alt_released(null);
+ else if (!alt_pressed && alt_currently_pressed)
+ on_alt_pressed(null);
+
+ if (shift_pressed && !shift_currently_pressed)
+ on_shift_released(null);
+ else if (!shift_pressed && shift_currently_pressed)
+ on_shift_pressed(null);
+
+ if(super_pressed && !super_currently_pressed)
+ on_super_released(null);
+ else if (!super_pressed && super_currently_pressed)
+ on_super_pressed(null);
+
+ ctrl_pressed = ctrl_currently_pressed;
+ alt_pressed = alt_currently_pressed;
+ shift_pressed = shift_currently_pressed;
+ super_pressed = super_currently_pressed;
+ }
+
+ public PageWindow? get_page_window() {
+ Gtk.Widget p = parent;
+ while (p != null) {
+ if (p is PageWindow)
+ return (PageWindow) p;
+
+ p = p.parent;
+ }
+
+ return null;
+ }
+
+ public CommandManager get_command_manager() {
+ return AppWindow.get_command_manager();
+ }
+
+ private void init_ui() {
+ action_group = new Gtk.ActionGroup("PageActionGroup");
+
+ // Collect all Gtk.Actions and add them to the Page's Gtk.ActionGroup
+ Gtk.ActionEntry[] action_entries = init_collect_action_entries();
+ if (action_entries.length > 0)
+ action_group.add_actions(action_entries, this);
+
+ // Collect all Gtk.ToggleActionEntries and add them to the Gtk.ActionGroup
+ Gtk.ToggleActionEntry[] toggle_entries = init_collect_toggle_action_entries();
+ if (toggle_entries.length > 0)
+ action_group.add_toggle_actions(toggle_entries, this);
+
+ // Collect all Gtk.RadioActionEntries and add them to the Gtk.ActionGroup
+ // (Would use a similar collection scheme as the other calls, but there is a binding
+ // problem with Gtk.RadioActionCallback that doesn't allow it to be stored in a struct)
+ register_radio_actions(action_group);
+
+ // Get global (common) action groups from the application window
+ common_action_groups = AppWindow.get_instance().get_common_action_groups();
+ }
+
+ private void add_ui() {
+ // Collect all UI filenames and load them into the UI manager
+ Gee.List<string> ui_filenames = new Gee.ArrayList<string>();
+ init_collect_ui_filenames(ui_filenames);
+ if (ui_filenames.size == 0)
+ message("No UI file specified for %s", get_page_name());
+
+ foreach (string ui_filename in ui_filenames)
+ init_load_ui(ui_filename);
+
+ ui.insert_action_group(action_group, 0);
+
+ // Collect injected UI elements and add them to the UI manager
+ InjectionGroup[] injection_groups = init_collect_injection_groups();
+ foreach (InjectionGroup group in injection_groups) {
+ foreach (InjectionGroup.Element element in group.get_elements()) {
+ uint merge_id = ui.new_merge_id();
+ ui.add_ui(merge_id, group.get_path(), element.name, element.action,
+ element.kind, false);
+ merge_ids += merge_id;
+ }
+ }
+
+ AppWindow.get_instance().replace_common_placeholders(ui);
+
+ ui.ensure_update();
+ }
+
+ private void remove_ui() {
+ for (int i = merge_ids.length - 1 ; i >= 0 ; --i)
+ ui.remove_ui(merge_ids[i]);
+ ui.remove_action_group(action_group);
+ merge_ids.resize(0);
+
+ ui.ensure_update();
+ }
+
+ public void init_toolbar(string path) {
+ toolbar_path = path;
+ }
+
+ // Called from "realize"
+ private void attach_view_signals() {
+ if (are_actions_attached)
+ return;
+
+ // initialize the Gtk.Actions according to current state
+ int selected_count = get_view().get_selected_count();
+ int count = get_view().get_count();
+ init_actions(selected_count, count);
+ update_actions(selected_count, count);
+
+ // monitor state changes to update actions
+ get_view().items_state_changed.connect(on_update_actions);
+ get_view().selection_group_altered.connect(on_update_actions);
+ get_view().items_visibility_changed.connect(on_update_actions);
+ get_view().contents_altered.connect(on_update_actions);
+
+ are_actions_attached = true;
+ }
+
+ // Called from destroy()
+ private void detach_view_signals() {
+ if (!are_actions_attached)
+ return;
+
+ get_view().items_state_changed.disconnect(on_update_actions);
+ get_view().selection_group_altered.disconnect(on_update_actions);
+ get_view().items_visibility_changed.disconnect(on_update_actions);
+ get_view().contents_altered.disconnect(on_update_actions);
+
+ are_actions_attached = false;
+ }
+
+ private void on_update_actions() {
+ if (update_actions_scheduler == null) {
+ update_actions_scheduler = new OneShotScheduler(
+ "Update actions scheduler for %s".printf(get_page_name()),
+ on_update_actions_on_idle);
+ }
+
+ update_actions_scheduler.at_priority_idle(Priority.LOW);
+ }
+
+ private void on_update_actions_on_idle() {
+ if (is_destroyed)
+ return;
+
+ update_actions(get_view().get_selected_count(), get_view().get_count());
+ }
+
+ private void init_load_ui(string ui_filename) {
+ File ui_file = Resources.get_ui(ui_filename);
+
+ try {
+ merge_ids += ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ AppWindow.error_message("Error loading UI file %s: %s".printf(
+ ui_file.get_path(), err.message));
+ Application.get_instance().panic();
+ }
+ }
+
+ // This is called during init_ui() to collect all the UI files to be loaded into the UI
+ // manager. Because order is important here, call the base method *first*, then add the
+ // classes' filename.
+ protected virtual void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ }
+
+ // This is called during init_ui() to collect all Gtk.ActionEntries for the page.
+ protected virtual Gtk.ActionEntry[] init_collect_action_entries() {
+ return new Gtk.ActionEntry[0];
+ }
+
+ // This is called during init_ui() to collect all Gtk.ToggleActionEntries for the page
+ protected virtual Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
+ return new Gtk.ToggleActionEntry[0];
+ }
+
+ // This is called during init_ui() to collect all Gtk.RadioActionEntries for the page
+ protected virtual void register_radio_actions(Gtk.ActionGroup action_group) {
+ }
+
+ // This is called during init_ui() to collect all Page.InjectedUIElements for the page. They
+ // should be added to the MultiSet using the injection path as the key.
+ protected virtual InjectionGroup[] init_collect_injection_groups() {
+ return new InjectionGroup[0];
+ }
+
+ // This is called during "map" allowing for Gtk.Actions to be updated at
+ // initialization time.
+ protected virtual void init_actions(int selected_count, int count) {
+ }
+
+ // This is called during "map" and during ViewCollection selection, visibility,
+ // and collection content altered events. This can be used to both initialize Gtk.Actions and
+ // update them when selection or visibility has been altered.
+ protected virtual void update_actions(int selected_count, int count) {
+ }
+
+ // This method enables drag-and-drop on the event source and routes its events through this
+ // object
+ public void enable_drag_source(Gdk.DragAction actions, Gtk.TargetEntry[] source_target_entries) {
+ if (dnd_enabled)
+ return;
+
+ assert(event_source != null);
+
+ Gtk.drag_source_set(event_source, Gdk.ModifierType.BUTTON1_MASK, source_target_entries, actions);
+
+ // hook up handlers which route the event_source's DnD signals to the Page's (necessary
+ // because Page is a NO_WINDOW widget and cannot support DnD on its own).
+ event_source.drag_begin.connect(on_drag_begin);
+ event_source.drag_data_get.connect(on_drag_data_get);
+ event_source.drag_data_delete.connect(on_drag_data_delete);
+ event_source.drag_end.connect(on_drag_end);
+ event_source.drag_failed.connect(on_drag_failed);
+
+ dnd_enabled = true;
+ }
+
+ public void disable_drag_source() {
+ if (!dnd_enabled)
+ return;
+
+ assert(event_source != null);
+
+ event_source.drag_begin.disconnect(on_drag_begin);
+ event_source.drag_data_get.disconnect(on_drag_data_get);
+ event_source.drag_data_delete.disconnect(on_drag_data_delete);
+ event_source.drag_end.disconnect(on_drag_end);
+ event_source.drag_failed.disconnect(on_drag_failed);
+ Gtk.drag_source_unset(event_source);
+
+ dnd_enabled = false;
+ }
+
+ public bool is_dnd_enabled() {
+ return dnd_enabled;
+ }
+
+ private void on_drag_begin(Gdk.DragContext context) {
+ drag_begin(context);
+ }
+
+ private void on_drag_data_get(Gdk.DragContext context, Gtk.SelectionData selection_data,
+ uint info, uint time) {
+ drag_data_get(context, selection_data, info, time);
+ }
+
+ private void on_drag_data_delete(Gdk.DragContext context) {
+ drag_data_delete(context);
+ }
+
+ private void on_drag_end(Gdk.DragContext context) {
+ drag_end(context);
+ }
+
+ // wierdly, Gtk 2.16.1 doesn't supply a drag_failed virtual method in the GtkWidget impl ...
+ // Vala binds to it, but it's not available in gtkwidget.h, and so gcc complains. Have to
+ // makeshift one for now.
+ // https://bugzilla.gnome.org/show_bug.cgi?id=584247
+ public virtual bool source_drag_failed(Gdk.DragContext context, Gtk.DragResult drag_result) {
+ return false;
+ }
+
+ private bool on_drag_failed(Gdk.DragContext context, Gtk.DragResult drag_result) {
+ return source_drag_failed(context, drag_result);
+ }
+
+ // Use this function rather than GDK or GTK's get_pointer, especially if called during a
+ // button-down mouse drag (i.e. a window grab).
+ //
+ // For more information, see: https://bugzilla.gnome.org/show_bug.cgi?id=599937
+ public bool get_event_source_pointer(out int x, out int y, out Gdk.ModifierType mask) {
+ if (event_source == null) {
+ x = 0;
+ y = 0;
+ mask = 0;
+
+ return false;
+ }
+
+ event_source.get_window().get_device_position(Gdk.Display.get_default().get_device_manager()
+ .get_client_pointer(), out x, out y, out mask);
+
+ if (last_down.x < 0 || last_down.y < 0)
+ return true;
+
+ // check for bogus values inside a drag which goes outside the window
+ // caused by (most likely) X windows signed 16-bit int overflow and fixup
+ // (https://bugzilla.gnome.org/show_bug.cgi?id=599937)
+
+ if ((x - last_down.x).abs() >= 0x7FFF)
+ x += 0xFFFF;
+
+ if ((y - last_down.y).abs() >= 0x7FFF)
+ y += 0xFFFF;
+
+ return true;
+ }
+
+ protected virtual bool on_left_click(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_middle_click(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_right_click(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_left_released(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_middle_released(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_right_released(Gdk.EventButton event) {
+ return false;
+ }
+
+ private bool on_button_pressed_internal(Gdk.EventButton event) {
+ switch (event.button) {
+ case 1:
+ if (event_source != null)
+ event_source.grab_focus();
+
+ // stash location of mouse down for drag fixups
+ last_down.x = (int) event.x;
+ last_down.y = (int) event.y;
+
+ return on_left_click(event);
+
+ case 2:
+ return on_middle_click(event);
+
+ case 3:
+ return on_right_click(event);
+
+ default:
+ return false;
+ }
+ }
+
+ private bool on_button_released_internal(Gdk.EventButton event) {
+ switch (event.button) {
+ case 1:
+ // clear when button released, only for drag fixups
+ last_down = { -1, -1 };
+
+ return on_left_released(event);
+
+ case 2:
+ return on_middle_released(event);
+
+ case 3:
+ return on_right_released(event);
+
+ default:
+ return false;
+ }
+ }
+
+ protected virtual bool on_ctrl_pressed(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_ctrl_released(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_alt_pressed(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_alt_released(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_shift_pressed(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_shift_released(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_super_pressed(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_super_released(Gdk.EventKey? event) {
+ return false;
+ }
+
+ protected virtual bool on_app_key_pressed(Gdk.EventKey event) {
+ return false;
+ }
+
+ protected virtual bool on_app_key_released(Gdk.EventKey event) {
+ return false;
+ }
+
+ public bool notify_app_key_pressed(Gdk.EventKey event) {
+ bool ctrl_currently_pressed, alt_currently_pressed, shift_currently_pressed,
+ super_currently_pressed;
+ get_modifiers(out ctrl_currently_pressed, out alt_currently_pressed,
+ out shift_currently_pressed, out super_currently_pressed);
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Control_L":
+ case "Control_R":
+ if (!ctrl_currently_pressed || ctrl_pressed)
+ return false;
+
+ ctrl_pressed = true;
+
+ return on_ctrl_pressed(event);
+
+ case "Meta_L":
+ case "Meta_R":
+ case "Alt_L":
+ case "Alt_R":
+ if (!alt_currently_pressed || alt_pressed)
+ return false;
+
+ alt_pressed = true;
+
+ return on_alt_pressed(event);
+
+ case "Shift_L":
+ case "Shift_R":
+ if (!shift_currently_pressed || shift_pressed)
+ return false;
+
+ shift_pressed = true;
+
+ return on_shift_pressed(event);
+
+ case "Super_L":
+ case "Super_R":
+ if (!super_currently_pressed || super_pressed)
+ return false;
+
+ super_pressed = true;
+
+ return on_super_pressed(event);
+ }
+
+ return on_app_key_pressed(event);
+ }
+
+ public bool notify_app_key_released(Gdk.EventKey event) {
+ bool ctrl_currently_pressed, alt_currently_pressed, shift_currently_pressed,
+ super_currently_pressed;
+ get_modifiers(out ctrl_currently_pressed, out alt_currently_pressed,
+ out shift_currently_pressed, out super_currently_pressed);
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Control_L":
+ case "Control_R":
+ if (ctrl_currently_pressed || !ctrl_pressed)
+ return false;
+
+ ctrl_pressed = false;
+
+ return on_ctrl_released(event);
+
+ case "Meta_L":
+ case "Meta_R":
+ case "Alt_L":
+ case "Alt_R":
+ if (alt_currently_pressed || !alt_pressed)
+ return false;
+
+ alt_pressed = false;
+
+ return on_alt_released(event);
+
+ case "Shift_L":
+ case "Shift_R":
+ if (shift_currently_pressed || !shift_pressed)
+ return false;
+
+ shift_pressed = false;
+
+ return on_shift_released(event);
+
+ case "Super_L":
+ case "Super_R":
+ if (super_currently_pressed || !super_pressed)
+ return false;
+
+ super_pressed = false;
+
+ return on_super_released(event);
+ }
+
+ return on_app_key_released(event);
+ }
+
+ public bool notify_app_focus_in(Gdk.EventFocus event) {
+ update_modifiers();
+
+ return false;
+ }
+
+ public bool notify_app_focus_out(Gdk.EventFocus event) {
+ return false;
+ }
+
+ protected virtual void on_move(Gdk.Rectangle rect) {
+ }
+
+ protected virtual void on_move_start(Gdk.Rectangle rect) {
+ }
+
+ protected virtual void on_move_finished(Gdk.Rectangle rect) {
+ }
+
+ protected virtual void on_resize(Gdk.Rectangle rect) {
+ }
+
+ protected virtual void on_resize_start(Gdk.Rectangle rect) {
+ }
+
+ protected virtual void on_resize_finished(Gdk.Rectangle rect) {
+ }
+
+ protected virtual bool on_configure(Gdk.EventConfigure event, Gdk.Rectangle rect) {
+ return false;
+ }
+
+ public bool notify_configure_event(Gdk.EventConfigure event) {
+ Gdk.Rectangle rect = Gdk.Rectangle();
+ rect.x = event.x;
+ rect.y = event.y;
+ rect.width = event.width;
+ rect.height = event.height;
+
+ // special case events, to report when a configure first starts (and appears to end)
+ if (last_configure_ms == 0) {
+ if (last_position.x != rect.x || last_position.y != rect.y) {
+ on_move_start(rect);
+ report_move_finished = true;
+ }
+
+ if (last_position.width != rect.width || last_position.height != rect.height) {
+ on_resize_start(rect);
+ report_resize_finished = true;
+ }
+
+ // need to check more often then the timeout, otherwise it could be up to twice the
+ // wait time before it's noticed
+ Timeout.add(CONSIDER_CONFIGURE_HALTED_MSEC / 8, check_configure_halted);
+ }
+
+ if (last_position.x != rect.x || last_position.y != rect.y)
+ on_move(rect);
+
+ if (last_position.width != rect.width || last_position.height != rect.height)
+ on_resize(rect);
+
+ last_position = rect;
+ last_configure_ms = now_ms();
+
+ return on_configure(event, rect);
+ }
+
+ private bool check_configure_halted() {
+ if (is_destroyed)
+ return false;
+
+ if ((now_ms() - last_configure_ms) < CONSIDER_CONFIGURE_HALTED_MSEC)
+ return true;
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ if (report_move_finished)
+ on_move_finished((Gdk.Rectangle) allocation);
+
+ if (report_resize_finished)
+ on_resize_finished((Gdk.Rectangle) allocation);
+
+ last_configure_ms = 0;
+ report_move_finished = false;
+ report_resize_finished = false;
+
+ return false;
+ }
+
+ protected virtual bool on_motion(Gdk.EventMotion event, int x, int y, Gdk.ModifierType mask) {
+ check_cursor_hiding();
+
+ return false;
+ }
+
+ protected virtual bool on_leave_notify_event() {
+ return false;
+ }
+
+ private bool on_motion_internal(Gdk.EventMotion event) {
+ int x, y;
+ Gdk.ModifierType mask;
+ if (event.is_hint == 1) {
+ get_event_source_pointer(out x, out y, out mask);
+ } else {
+ x = (int) event.x;
+ y = (int) event.y;
+ mask = event.state;
+ }
+
+ return on_motion(event, x, y, mask);
+ }
+
+ private bool on_mousewheel_internal(Gdk.EventScroll event) {
+ switch (event.direction) {
+ case Gdk.ScrollDirection.UP:
+ return on_mousewheel_up(event);
+
+ case Gdk.ScrollDirection.DOWN:
+ return on_mousewheel_down(event);
+
+ case Gdk.ScrollDirection.LEFT:
+ return on_mousewheel_left(event);
+
+ case Gdk.ScrollDirection.RIGHT:
+ return on_mousewheel_right(event);
+
+ default:
+ return false;
+ }
+ }
+
+ protected virtual bool on_mousewheel_up(Gdk.EventScroll event) {
+ return false;
+ }
+
+ protected virtual bool on_mousewheel_down(Gdk.EventScroll event) {
+ return false;
+ }
+
+ protected virtual bool on_mousewheel_left(Gdk.EventScroll event) {
+ return false;
+ }
+
+ protected virtual bool on_mousewheel_right(Gdk.EventScroll event) {
+ return false;
+ }
+
+ protected virtual bool on_context_keypress() {
+ return false;
+ }
+
+ protected virtual bool on_context_buttonpress(Gdk.EventButton event) {
+ return false;
+ }
+
+ protected virtual bool on_context_invoked() {
+ return true;
+ }
+
+ protected bool popup_context_menu(Gtk.Menu? context_menu,
+ Gdk.EventButton? event = null) {
+
+ if (context_menu == null || !on_context_invoked())
+ return false;
+
+ if (event == null)
+ context_menu.popup(null, null, null, 0, Gtk.get_current_event_time());
+ else
+ context_menu.popup(null, null, null, event.button, event.time);
+
+ return true;
+ }
+
+ protected void on_event_source_realize() {
+ assert(event_source.get_window() != null); // the realize event means the Widget has a window
+
+ if (event_source.get_window().get_cursor() != null) {
+ last_cursor = event_source.get_window().get_cursor().get_cursor_type();
+ return;
+ }
+
+ // no custom cursor defined, check parents
+ Gdk.Window? parent_window = event_source.get_window();
+ do {
+ parent_window = parent_window.get_parent();
+ } while (parent_window != null && parent_window.get_cursor() == null);
+
+ if (parent_window != null)
+ last_cursor = parent_window.get_cursor().get_cursor_type();
+ }
+
+ public void set_cursor_hide_time(int hide_time) {
+ cursor_hide_msec = hide_time;
+ }
+
+ public void start_cursor_hiding() {
+ check_cursor_hiding();
+ }
+
+ public void stop_cursor_hiding() {
+ if (last_timeout_id != 0)
+ Source.remove(last_timeout_id);
+ }
+
+ public void suspend_cursor_hiding() {
+ cursor_hide_time_cached = cursor_hide_msec;
+
+ if (last_timeout_id != 0)
+ Source.remove(last_timeout_id);
+
+ cursor_hide_msec = 0;
+ }
+
+ public void restore_cursor_hiding() {
+ cursor_hide_msec = cursor_hide_time_cached;
+ check_cursor_hiding();
+ }
+
+ // Use this method to set the cursor for a page, NOT window.set_cursor(...)
+ protected virtual void set_page_cursor(Gdk.CursorType cursor_type) {
+ last_cursor = cursor_type;
+
+ if (!cursor_hidden && event_source != null)
+ event_source.get_window().set_cursor(new Gdk.Cursor(cursor_type));
+ }
+
+ private void check_cursor_hiding() {
+ if (cursor_hidden) {
+ cursor_hidden = false;
+ set_page_cursor(last_cursor);
+ }
+
+ if (cursor_hide_msec != 0) {
+ if (last_timeout_id != 0)
+ Source.remove(last_timeout_id);
+ last_timeout_id = Timeout.add(cursor_hide_msec, on_hide_cursor);
+ }
+ }
+
+ private bool on_hide_cursor() {
+ cursor_hidden = true;
+
+ if (event_source != null)
+ event_source.get_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.BLANK_CURSOR));
+
+ return false;
+ }
+}
+
+public abstract class CheckerboardPage : Page {
+ private const int AUTOSCROLL_PIXELS = 50;
+ private const int AUTOSCROLL_TICKS_MSEC = 50;
+
+ private CheckerboardLayout layout;
+ private string item_context_menu_path = null;
+ private string page_context_menu_path = null;
+ private Gtk.Viewport viewport = new Gtk.Viewport(null, null);
+ protected CheckerboardItem anchor = null;
+ protected CheckerboardItem cursor = null;
+ private CheckerboardItem highlighted = null;
+ private bool autoscroll_scheduled = false;
+ private CheckerboardItem activated_item = null;
+ private Gee.ArrayList<CheckerboardItem> previously_selected = null;
+
+ public enum Activator {
+ KEYBOARD,
+ MOUSE
+ }
+
+ public struct KeyboardModifiers {
+ public KeyboardModifiers(Page page) {
+ ctrl_pressed = page.get_ctrl_pressed();
+ alt_pressed = page.get_alt_pressed();
+ shift_pressed = page.get_shift_pressed();
+ super_pressed = page.get_super_pressed();
+ }
+
+ public bool ctrl_pressed;
+ public bool alt_pressed;
+ public bool shift_pressed;
+ public bool super_pressed;
+ }
+
+ public CheckerboardPage(string page_name) {
+ base (page_name);
+
+ layout = new CheckerboardLayout(get_view());
+ layout.set_name(page_name);
+
+ set_event_source(layout);
+
+ set_border_width(0);
+ set_shadow_type(Gtk.ShadowType.NONE);
+
+ viewport.set_border_width(0);
+ viewport.set_shadow_type(Gtk.ShadowType.NONE);
+
+ Resources.style_widget(viewport, Resources.VIEWPORT_STYLESHEET);
+
+ viewport.add(layout);
+
+ // want to set_adjustments before adding to ScrolledWindow to let our signal handlers
+ // run first ... otherwise, the thumbnails draw late
+ layout.set_adjustments(get_hadjustment(), get_vadjustment());
+
+ add(viewport);
+
+ // need to monitor items going hidden when dealing with anchor/cursor/highlighted items
+ get_view().items_hidden.connect(on_items_hidden);
+ get_view().contents_altered.connect(on_contents_altered);
+ get_view().items_state_changed.connect(on_items_state_changed);
+ get_view().items_visibility_changed.connect(on_items_visibility_changed);
+
+ // scrollbar policy
+ set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+
+ Resources.style_widget(this, Resources.PAGE_STYLESHEET);
+ }
+
+ public void init_item_context_menu(string path) {
+ item_context_menu_path = path;
+ }
+
+ public void init_page_context_menu(string path) {
+ page_context_menu_path = path;
+ }
+
+ public Gtk.Menu? get_context_menu() {
+ // show page context menu if nothing is selected
+ return (get_view().get_selected_count() != 0) ? get_item_context_menu() :
+ get_page_context_menu();
+ }
+
+ public virtual Gtk.Menu? get_item_context_menu() {
+ Gtk.Menu menu = (Gtk.Menu) ui.get_widget(item_context_menu_path);
+ assert(menu != null);
+ return menu;
+ }
+
+ public override Gtk.Menu? get_page_context_menu() {
+ if (page_context_menu_path == null)
+ return null;
+ Gtk.Menu menu = (Gtk.Menu) ui.get_widget(page_context_menu_path);
+ assert(menu != null);
+ return menu;
+ }
+
+ protected override bool on_context_keypress() {
+ return popup_context_menu(get_context_menu());
+ }
+
+ protected virtual string get_view_empty_message() {
+ return _("No photos/videos");
+ }
+
+ protected virtual string get_filter_no_match_message() {
+ return _("No photos/videos found");
+ }
+
+ protected virtual void on_item_activated(CheckerboardItem item, Activator activator,
+ KeyboardModifiers modifiers) {
+ }
+
+ public CheckerboardLayout get_checkerboard_layout() {
+ return layout;
+ }
+
+ // Gets the search view filter for this page.
+ public abstract SearchViewFilter get_search_view_filter();
+
+ public virtual Core.ViewTracker? get_view_tracker() {
+ return null;
+ }
+
+ public override void switching_from() {
+ layout.set_in_view(false);
+ get_search_view_filter().refresh.disconnect(on_view_filter_refresh);
+
+ // unselect everything so selection won't persist after page loses focus
+ get_view().unselect_all();
+
+ base.switching_from();
+ }
+
+ public override void switched_to() {
+ layout.set_in_view(true);
+ get_search_view_filter().refresh.connect(on_view_filter_refresh);
+ on_view_filter_refresh();
+
+ if (get_view().get_selected_count() > 0) {
+ CheckerboardItem? item = (CheckerboardItem?) get_view().get_selected_at(0);
+
+ // if item is in any way out of view, scroll to it
+ Gtk.Adjustment vadj = get_vadjustment();
+ if (!(get_adjustment_relation(vadj, item.allocation.y) == AdjustmentRelation.IN_RANGE
+ && (get_adjustment_relation(vadj, item.allocation.y + item.allocation.height) == AdjustmentRelation.IN_RANGE))) {
+
+ // scroll to see the new item
+ int top = 0;
+ if (item.allocation.y < vadj.get_value()) {
+ top = item.allocation.y;
+ top -= CheckerboardLayout.ROW_GUTTER_PADDING / 2;
+ } else {
+ top = item.allocation.y + item.allocation.height - (int) vadj.get_page_size();
+ top += CheckerboardLayout.ROW_GUTTER_PADDING / 2;
+ }
+
+ vadj.set_value(top);
+
+ }
+ }
+
+ base.switched_to();
+ }
+
+ private void on_view_filter_refresh() {
+ update_view_filter_message();
+ }
+
+ private void on_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ update_view_filter_message();
+ }
+
+ private void on_items_state_changed(Gee.Iterable<DataView> changed) {
+ update_view_filter_message();
+ }
+
+ private void on_items_visibility_changed(Gee.Collection<DataView> changed) {
+ update_view_filter_message();
+ }
+
+ private void update_view_filter_message() {
+ if (get_view().are_items_filtered_out() && get_view().get_count() == 0) {
+ set_page_message(get_filter_no_match_message());
+ } else if (get_view().get_count() == 0) {
+ set_page_message(get_view_empty_message());
+ } else {
+ unset_page_message();
+ }
+ }
+
+ public void set_page_message(string message) {
+ layout.set_message(message);
+ if (is_in_view())
+ layout.queue_draw();
+ }
+
+ public void unset_page_message() {
+ layout.unset_message();
+ if (is_in_view())
+ layout.queue_draw();
+ }
+
+ public override void set_page_name(string name) {
+ base.set_page_name(name);
+
+ layout.set_name(name);
+ }
+
+ public CheckerboardItem? get_item_at_pixel(double x, double y) {
+ return layout.get_item_at_pixel(x, y);
+ }
+
+ private void on_items_hidden(Gee.Iterable<DataView> hidden) {
+ foreach (DataView view in hidden) {
+ CheckerboardItem item = (CheckerboardItem) view;
+
+ if (anchor == item)
+ anchor = null;
+
+ if (cursor == item)
+ cursor = null;
+
+ if (highlighted == item)
+ highlighted = null;
+ }
+ }
+
+ protected override bool key_press_event(Gdk.EventKey event) {
+ bool handled = true;
+
+ // mask out the modifiers we're interested in
+ uint state = event.state & Gdk.ModifierType.SHIFT_MASK;
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Up":
+ case "KP_Up":
+ move_cursor(CompassPoint.NORTH);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "Down":
+ case "KP_Down":
+ move_cursor(CompassPoint.SOUTH);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "Left":
+ case "KP_Left":
+ move_cursor(CompassPoint.WEST);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "Right":
+ case "KP_Right":
+ move_cursor(CompassPoint.EAST);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "Home":
+ case "KP_Home":
+ CheckerboardItem? first = (CheckerboardItem?) get_view().get_first();
+ if (first != null)
+ cursor_to_item(first);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "End":
+ case "KP_End":
+ CheckerboardItem? last = (CheckerboardItem?) get_view().get_last();
+ if (last != null)
+ cursor_to_item(last);
+ select_anchor_to_cursor(state);
+ break;
+
+ case "Return":
+ case "KP_Enter":
+ if (get_view().get_selected_count() == 1)
+ on_item_activated((CheckerboardItem) get_view().get_selected_at(0),
+ Activator.KEYBOARD, KeyboardModifiers(this));
+ else
+ handled = false;
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ if (handled)
+ return true;
+
+ return (base.key_press_event != null) ? base.key_press_event(event) : true;
+ }
+
+ protected override bool on_left_click(Gdk.EventButton event) {
+ // only interested in single-click and double-clicks for now
+ if ((event.type != Gdk.EventType.BUTTON_PRESS) && (event.type != Gdk.EventType.2BUTTON_PRESS))
+ return false;
+
+ // mask out the modifiers we're interested in
+ uint state = event.state & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK);
+
+ // use clicks for multiple selection and activation only; single selects are handled by
+ // button release, to allow for multiple items to be selected then dragged
+ CheckerboardItem item = get_item_at_pixel(event.x, event.y);
+ if (item != null) {
+ switch (state) {
+ case Gdk.ModifierType.CONTROL_MASK:
+ // with only Ctrl pressed, multiple selections are possible ... chosen item
+ // is toggled
+ Marker marker = get_view().mark(item);
+ get_view().toggle_marked(marker);
+
+ if (item.is_selected()) {
+ anchor = item;
+ cursor = item;
+ }
+ break;
+
+ case Gdk.ModifierType.SHIFT_MASK:
+ get_view().unselect_all();
+
+ if (anchor == null)
+ anchor = item;
+
+ select_between_items(anchor, item);
+
+ cursor = item;
+ break;
+
+ case Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK:
+ // Ticket #853 - Make Ctrl + Shift + Mouse Button 1 able to start a new run
+ // of contiguous selected items without unselecting previously-selected items
+ // a la Nautilus.
+ // Same as the case for SHIFT_MASK, but don't unselect anything first.
+ if (anchor == null)
+ anchor = item;
+
+ select_between_items(anchor, item);
+
+ cursor = item;
+ break;
+
+ default:
+ if (event.type == Gdk.EventType.2BUTTON_PRESS) {
+ activated_item = item;
+ } else {
+ // if the user has selected one or more items and is preparing for a drag,
+ // don't want to blindly unselect: if they've clicked on an unselected item
+ // unselect all and select that one; if they've clicked on a previously
+ // selected item, do nothing
+ if (!item.is_selected()) {
+ Marker all = get_view().start_marking();
+ all.mark_many(get_view().get_selected());
+
+ get_view().unselect_and_select_marked(all, get_view().mark(item));
+ }
+ }
+
+ anchor = item;
+ cursor = item;
+ break;
+ }
+ } else {
+ // user clicked on "dead" area; only unselect if control is not pressed
+ // do we want similar behavior for shift as well?
+ if (state != Gdk.ModifierType.CONTROL_MASK)
+ get_view().unselect_all();
+
+ // grab previously marked items
+ previously_selected = new Gee.ArrayList<CheckerboardItem>();
+ foreach (DataView view in get_view().get_selected())
+ previously_selected.add((CheckerboardItem) view);
+
+ layout.set_drag_select_origin((int) event.x, (int) event.y);
+
+ return true;
+ }
+
+ // need to determine if the signal should be passed to the DnD handlers
+ // Return true to block the DnD handler, false otherwise
+
+ return get_view().get_selected_count() == 0;
+ }
+
+ protected override bool on_left_released(Gdk.EventButton event) {
+ previously_selected = null;
+
+ // if drag-selecting, stop here and do nothing else
+ if (layout.is_drag_select_active()) {
+ layout.clear_drag_select();
+ anchor = cursor;
+
+ return true;
+ }
+
+ // only interested in non-modified button releases
+ if ((event.state & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK)) != 0)
+ return false;
+
+ // if the item was activated in the double-click, report it now
+ if (activated_item != null) {
+ on_item_activated(activated_item, Activator.MOUSE, KeyboardModifiers(this));
+ activated_item = null;
+
+ return true;
+ }
+
+ CheckerboardItem item = get_item_at_pixel(event.x, event.y);
+ if (item == null) {
+ // released button on "dead" area
+ return true;
+ }
+
+ if (cursor != item) {
+ // user released mouse button after moving it off the initial item, or moved from dead
+ // space onto one. either way, unselect everything
+ get_view().unselect_all();
+ } else {
+ // the idea is, if a user single-clicks on an item with no modifiers, then all other items
+ // should be deselected, however, if they single-click in order to drag one or more items,
+ // they should remain selected, hence performing this here rather than on_left_click
+ // (item may not be selected if an unimplemented modifier key was used)
+ if (item.is_selected())
+ get_view().unselect_all_but(item);
+ }
+
+ return true;
+ }
+
+ protected override bool on_right_click(Gdk.EventButton event) {
+ // only interested in single-clicks for now
+ if (event.type != Gdk.EventType.BUTTON_PRESS)
+ return false;
+
+ // get what's right-clicked upon
+ CheckerboardItem item = get_item_at_pixel(event.x, event.y);
+ if (item != null) {
+ // mask out the modifiers we're interested in
+ switch (event.state & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK)) {
+ case Gdk.ModifierType.CONTROL_MASK:
+ // chosen item is toggled
+ Marker marker = get_view().mark(item);
+ get_view().toggle_marked(marker);
+ break;
+
+ case Gdk.ModifierType.SHIFT_MASK:
+ // TODO
+ break;
+
+ case Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK:
+ // TODO
+ break;
+
+ default:
+ // if the item is already selected, proceed; if item is not selected, a bare right
+ // click unselects everything else but it
+ if (!item.is_selected()) {
+ Marker all = get_view().start_marking();
+ all.mark_many(get_view().get_selected());
+
+ get_view().unselect_and_select_marked(all, get_view().mark(item));
+ }
+ break;
+ }
+ } else {
+ // clicked in "dead" space, unselect everything
+ get_view().unselect_all();
+ }
+
+ Gtk.Menu context_menu = get_context_menu();
+ return popup_context_menu(context_menu, event);
+ }
+
+ protected virtual bool on_mouse_over(CheckerboardItem? item, int x, int y, Gdk.ModifierType mask) {
+ // if hovering over the last hovered item, or both are null (nothing highlighted and
+ // hovering over empty space), do nothing
+ if (item == highlighted)
+ return true;
+
+ // either something new is highlighted or now hovering over empty space, so dim old item
+ if (highlighted != null) {
+ highlighted.unbrighten();
+ highlighted = null;
+ }
+
+ // if over empty space, done
+ if (item == null)
+ return true;
+
+ // brighten the new item
+ item.brighten();
+ highlighted = item;
+
+ return true;
+ }
+
+ protected override bool on_motion(Gdk.EventMotion event, int x, int y, Gdk.ModifierType mask) {
+ // report what item the mouse is hovering over
+ if (!on_mouse_over(get_item_at_pixel(x, y), x, y, mask))
+ return false;
+
+ // go no further if not drag-selecting
+ if (!layout.is_drag_select_active())
+ return false;
+
+ // set the new endpoint of the drag selection
+ layout.set_drag_select_endpoint(x, y);
+
+ updated_selection_band();
+
+ // if out of bounds, schedule a check to auto-scroll the viewport
+ if (!autoscroll_scheduled
+ && get_adjustment_relation(get_vadjustment(), y) != AdjustmentRelation.IN_RANGE) {
+ Timeout.add(AUTOSCROLL_TICKS_MSEC, selection_autoscroll);
+ autoscroll_scheduled = true;
+ }
+
+ // return true to stop a potential drag-and-drop operation
+ return true;
+ }
+
+ private void updated_selection_band() {
+ assert(layout.is_drag_select_active());
+
+ // get all items inside the selection
+ Gee.List<CheckerboardItem>? intersection = layout.items_in_selection_band();
+ if (intersection == null)
+ return;
+
+ Marker to_unselect = get_view().start_marking();
+ Marker to_select = get_view().start_marking();
+
+ // mark all selected items to be unselected
+ to_unselect.mark_many(get_view().get_selected());
+
+ // except for the items that were selected before the drag began
+ assert(previously_selected != null);
+ to_unselect.unmark_many(previously_selected);
+ to_select.mark_many(previously_selected);
+
+ // toggle selection on everything in the intersection and update the cursor
+ cursor = null;
+
+ foreach (CheckerboardItem item in intersection) {
+ if (to_select.toggle(item))
+ to_unselect.unmark(item);
+ else
+ to_unselect.mark(item);
+
+ if (cursor == null)
+ cursor = item;
+ }
+
+ get_view().select_marked(to_select);
+ get_view().unselect_marked(to_unselect);
+ }
+
+ private bool selection_autoscroll() {
+ if (!layout.is_drag_select_active()) {
+ autoscroll_scheduled = false;
+
+ return false;
+ }
+
+ // as the viewport never scrolls horizontally, only interested in vertical
+ Gtk.Adjustment vadj = get_vadjustment();
+
+ int x, y;
+ Gdk.ModifierType mask;
+ get_event_source_pointer(out x, out y, out mask);
+
+ int new_value = (int) vadj.get_value();
+ switch (get_adjustment_relation(vadj, y)) {
+ case AdjustmentRelation.BELOW:
+ // pointer above window, scroll up
+ new_value -= AUTOSCROLL_PIXELS;
+ layout.set_drag_select_endpoint(x, new_value);
+ break;
+
+ case AdjustmentRelation.ABOVE:
+ // pointer below window, scroll down, extend selection to bottom of page
+ new_value += AUTOSCROLL_PIXELS;
+ layout.set_drag_select_endpoint(x, new_value + (int) vadj.get_page_size());
+ break;
+
+ case AdjustmentRelation.IN_RANGE:
+ autoscroll_scheduled = false;
+
+ return false;
+
+ default:
+ warn_if_reached();
+ break;
+ }
+
+ // It appears that in GTK+ 2.18, the adjustment is not clamped the way it was in 2.16.
+ // This may have to do with how adjustments are different w/ scrollbars, that they're upper
+ // clamp is upper - page_size ... either way, enforce these limits here
+ vadj.set_value(new_value.clamp((int) vadj.get_lower(),
+ (int) vadj.get_upper() - (int) vadj.get_page_size()));
+
+ updated_selection_band();
+
+ return true;
+ }
+
+ public void cursor_to_item(CheckerboardItem item) {
+ assert(get_view().contains(item));
+
+ cursor = item;
+
+ get_view().unselect_all();
+
+ Marker marker = get_view().mark(item);
+ get_view().select_marked(marker);
+
+ // if item is in any way out of view, scroll to it
+ Gtk.Adjustment vadj = get_vadjustment();
+ if (get_adjustment_relation(vadj, item.allocation.y) == AdjustmentRelation.IN_RANGE
+ && (get_adjustment_relation(vadj, item.allocation.y + item.allocation.height) == AdjustmentRelation.IN_RANGE))
+ return;
+
+ // scroll to see the new item
+ int top = 0;
+ if (item.allocation.y < vadj.get_value()) {
+ top = item.allocation.y;
+ top -= CheckerboardLayout.ROW_GUTTER_PADDING / 2;
+ } else {
+ top = item.allocation.y + item.allocation.height - (int) vadj.get_page_size();
+ top += CheckerboardLayout.ROW_GUTTER_PADDING / 2;
+ }
+
+ vadj.set_value(top);
+ }
+
+ public void move_cursor(CompassPoint point) {
+ // if no items, nothing to do
+ if (get_view().get_count() == 0)
+ return;
+
+ // if nothing is selected, simply select the first and exit
+ if (get_view().get_selected_count() == 0 || cursor == null) {
+ CheckerboardItem item = layout.get_item_at_coordinate(0, 0);
+ cursor_to_item(item);
+ anchor = item;
+
+ return;
+ }
+
+ // move the cursor relative to the "first" item
+ CheckerboardItem? item = layout.get_item_relative_to(cursor, point);
+ if (item != null)
+ cursor_to_item(item);
+ }
+
+ public void set_cursor(CheckerboardItem item) {
+ Marker marker = get_view().mark(item);
+ get_view().select_marked(marker);
+
+ cursor = item;
+ anchor = item;
+ }
+
+ public void select_between_items(CheckerboardItem item_start, CheckerboardItem item_end) {
+ Marker marker = get_view().start_marking();
+
+ bool passed_start = false;
+ bool passed_end = false;
+
+ foreach (DataObject object in get_view().get_all()) {
+ CheckerboardItem item = (CheckerboardItem) object;
+
+ if (item_start == item)
+ passed_start = true;
+
+ if (item_end == item)
+ passed_end = true;
+
+ if (passed_start || passed_end)
+ marker.mark((DataView) object);
+
+ if (passed_start && passed_end)
+ break;
+ }
+
+ get_view().select_marked(marker);
+ }
+
+ public void select_anchor_to_cursor(uint state) {
+ if (cursor == null || anchor == null)
+ return;
+
+ if (state == Gdk.ModifierType.SHIFT_MASK) {
+ get_view().unselect_all();
+ select_between_items(anchor, cursor);
+ } else {
+ anchor = cursor;
+ }
+ }
+
+ protected virtual void set_display_titles(bool display) {
+ get_view().freeze_notifications();
+ get_view().set_property(CheckerboardItem.PROP_SHOW_TITLES, display);
+ get_view().thaw_notifications();
+ }
+
+ protected virtual void set_display_comments(bool display) {
+ get_view().freeze_notifications();
+ get_view().set_property(CheckerboardItem.PROP_SHOW_COMMENTS, display);
+ get_view().thaw_notifications();
+ }
+}
+
+public abstract class SinglePhotoPage : Page {
+ public const Gdk.InterpType FAST_INTERP = Gdk.InterpType.NEAREST;
+ public const Gdk.InterpType QUALITY_INTERP = Gdk.InterpType.BILINEAR;
+ public const int KEY_REPEAT_INTERVAL_MSEC = 200;
+
+ public enum UpdateReason {
+ NEW_PIXBUF,
+ QUALITY_IMPROVEMENT,
+ RESIZED_CANVAS
+ }
+
+ protected Gtk.DrawingArea canvas = new Gtk.DrawingArea();
+ protected Gtk.Viewport viewport = new Gtk.Viewport(null, null);
+
+ private bool scale_up_to_viewport;
+ private TransitionClock transition_clock;
+ private int transition_duration_msec = 0;
+ private Cairo.Surface pixmap = null;
+ private Cairo.Context pixmap_ctx = null;
+ private Cairo.Context text_ctx = null;
+ private Dimensions pixmap_dim = Dimensions();
+ private Gdk.Pixbuf unscaled = null;
+ private Dimensions max_dim = Dimensions();
+ private Gdk.Pixbuf scaled = null;
+ private Gdk.Pixbuf old_scaled = null; // previous scaled image
+ private Gdk.Rectangle scaled_pos = Gdk.Rectangle();
+ private ZoomState static_zoom_state;
+ private bool zoom_high_quality = true;
+ private ZoomState saved_zoom_state;
+ private bool has_saved_zoom_state = false;
+ private uint32 last_nav_key = 0;
+
+ public SinglePhotoPage(string page_name, bool scale_up_to_viewport) {
+ base(page_name);
+
+ this.scale_up_to_viewport = scale_up_to_viewport;
+
+ transition_clock = TransitionEffectsManager.get_instance().create_null_transition_clock();
+
+ // With the current code automatically resizing the image to the viewport, scrollbars
+ // should never be shown, but this may change if/when zooming is supported
+ set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+
+ set_border_width(0);
+ set_shadow_type(Gtk.ShadowType.NONE);
+
+ viewport.set_shadow_type(Gtk.ShadowType.NONE);
+ viewport.set_border_width(0);
+ viewport.add(canvas);
+
+ add(viewport);
+
+ // We used to disable GTK double buffering here. We've had to reenable it
+ // due to this bug: http://redmine.yorba.org/issues/4775 .
+ //
+ // all painting happens in pixmap, and is sent to the window wholesale in on_canvas_expose
+ // canvas.set_double_buffered(false);
+
+ canvas.add_events(Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.STRUCTURE_MASK
+ | Gdk.EventMask.SUBSTRUCTURE_MASK);
+
+ viewport.size_allocate.connect(on_viewport_resize);
+ canvas.draw.connect(on_canvas_exposed);
+
+ set_event_source(canvas);
+
+ // style the viewport
+ Resources.style_widget(viewport, Resources.VIEWPORT_STYLESHEET);
+ }
+
+ public bool is_transition_in_progress() {
+ return transition_clock.is_in_progress();
+ }
+
+ public void cancel_transition() {
+ if (transition_clock.is_in_progress())
+ transition_clock.cancel();
+ }
+
+ public void set_transition(string effect_id, int duration_msec) {
+ cancel_transition();
+
+ transition_clock = TransitionEffectsManager.get_instance().create_transition_clock(effect_id);
+ if (transition_clock == null)
+ transition_clock = TransitionEffectsManager.get_instance().create_null_transition_clock();
+
+ transition_duration_msec = duration_msec;
+ }
+
+ // This method includes a call to pixmap_ctx.paint().
+ private void render_zoomed_to_pixmap(ZoomState zoom_state) {
+ assert(is_zoom_supported());
+
+ Gdk.Rectangle view_rect = zoom_state.get_viewing_rectangle_wrt_content();
+
+ Gdk.Pixbuf zoomed;
+ if (get_zoom_buffer() != null) {
+ zoomed = (zoom_high_quality) ? get_zoom_buffer().get_zoomed_image(zoom_state) :
+ get_zoom_buffer().get_zoom_preview_image(zoom_state);
+ } else {
+ Gdk.Rectangle view_rect_proj = zoom_state.get_viewing_rectangle_projection(unscaled);
+
+ Gdk.Pixbuf proj_subpixbuf = new Gdk.Pixbuf.subpixbuf(unscaled, view_rect_proj.x,
+ view_rect_proj.y, view_rect_proj.width, view_rect_proj.height);
+
+ zoomed = proj_subpixbuf.scale_simple(view_rect.width, view_rect.height,
+ Gdk.InterpType.BILINEAR);
+ }
+
+ if (zoomed == null) {
+ return;
+ }
+
+ int draw_x = (pixmap_dim.width - view_rect.width) / 2;
+ draw_x = draw_x.clamp(0, int.MAX);
+
+ int draw_y = (pixmap_dim.height - view_rect.height) / 2;
+ draw_y = draw_y.clamp(0, int.MAX);
+
+ Gdk.cairo_set_source_pixbuf(pixmap_ctx, zoomed, draw_x, draw_y);
+ pixmap_ctx.paint();
+ }
+
+ protected void on_interactive_zoom(ZoomState interactive_zoom_state) {
+ assert(is_zoom_supported());
+ Cairo.Context canvas_ctx = Gdk.cairo_create(canvas.get_window());
+
+ set_source_color_from_string(pixmap_ctx, "#000");
+ pixmap_ctx.paint();
+
+ bool old_quality_setting = zoom_high_quality;
+ zoom_high_quality = false;
+ render_zoomed_to_pixmap(interactive_zoom_state);
+ zoom_high_quality = old_quality_setting;
+
+ canvas_ctx.set_source_surface(pixmap, 0, 0);
+ canvas_ctx.paint();
+ }
+
+ protected void on_interactive_pan(ZoomState interactive_zoom_state) {
+ assert(is_zoom_supported());
+ Cairo.Context canvas_ctx = Gdk.cairo_create(canvas.get_window());
+
+ set_source_color_from_string(pixmap_ctx, "#000");
+ pixmap_ctx.paint();
+
+ bool old_quality_setting = zoom_high_quality;
+ zoom_high_quality = true;
+ render_zoomed_to_pixmap(interactive_zoom_state);
+ zoom_high_quality = old_quality_setting;
+
+ canvas_ctx.set_source_surface(pixmap, 0, 0);
+ canvas_ctx.paint();
+ }
+
+ protected virtual bool is_zoom_supported() {
+ return false;
+ }
+
+ protected virtual void cancel_zoom() {
+ if (pixmap != null) {
+ set_source_color_from_string(pixmap_ctx, "#000");
+ pixmap_ctx.paint();
+ }
+ }
+
+ protected virtual void save_zoom_state() {
+ saved_zoom_state = static_zoom_state;
+ has_saved_zoom_state = true;
+ }
+
+ protected virtual void restore_zoom_state() {
+ if (!has_saved_zoom_state)
+ return;
+
+ static_zoom_state = saved_zoom_state;
+ repaint();
+ has_saved_zoom_state = false;
+ }
+
+ protected virtual ZoomBuffer? get_zoom_buffer() {
+ return null;
+ }
+
+ protected ZoomState get_saved_zoom_state() {
+ return saved_zoom_state;
+ }
+
+ protected void set_zoom_state(ZoomState zoom_state) {
+ assert(is_zoom_supported());
+
+ static_zoom_state = zoom_state;
+ }
+
+ protected ZoomState get_zoom_state() {
+ assert(is_zoom_supported());
+
+ return static_zoom_state;
+ }
+
+ public override void switched_to() {
+ base.switched_to();
+
+ if (unscaled != null)
+ repaint();
+ }
+
+ public override void set_container(Gtk.Window container) {
+ base.set_container(container);
+
+ // scrollbar policy in fullscreen mode needs to be auto/auto, else the pixbuf will shift
+ // off the screen
+ if (container is FullscreenWindow)
+ set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
+ }
+
+ // max_dim represents the maximum size of the original pixbuf (i.e. pixbuf may be scaled and
+ // the caller capable of producing larger ones depending on the viewport size). max_dim
+ // is used when scale_up_to_viewport is set to true. Pass a Dimensions with no area if
+ // max_dim should be ignored (i.e. scale_up_to_viewport is false).
+ public void set_pixbuf(Gdk.Pixbuf unscaled, Dimensions max_dim, Direction? direction = null) {
+ static_zoom_state = ZoomState(max_dim, pixmap_dim,
+ static_zoom_state.get_interpolation_factor(),
+ static_zoom_state.get_viewport_center());
+
+ cancel_transition();
+
+ this.unscaled = unscaled;
+ this.max_dim = max_dim;
+ this.old_scaled = scaled;
+ scaled = null;
+
+ // need to make sure this has happened
+ canvas.realize();
+
+ repaint(direction);
+ }
+
+ public void blank_display() {
+ unscaled = null;
+ max_dim = Dimensions();
+ scaled = null;
+ pixmap = null;
+
+ // this has to have happened
+ canvas.realize();
+
+ // force a redraw
+ invalidate_all();
+ }
+
+ public Cairo.Surface? get_surface() {
+ return pixmap;
+ }
+
+ public Dimensions get_surface_dim() {
+ return pixmap_dim;
+ }
+
+ public Cairo.Context get_cairo_context() {
+ return pixmap_ctx;
+ }
+
+ public void paint_text(Pango.Layout pango_layout, int x, int y) {
+ text_ctx.move_to(x, y);
+ Pango.cairo_show_layout(text_ctx, pango_layout);
+ }
+
+ public Scaling get_canvas_scaling() {
+ return (get_container() is FullscreenWindow) ? Scaling.for_screen(get_container(), scale_up_to_viewport)
+ : Scaling.for_widget(viewport, scale_up_to_viewport);
+ }
+
+ public Gdk.Pixbuf? get_unscaled_pixbuf() {
+ return unscaled;
+ }
+
+ public Gdk.Pixbuf? get_scaled_pixbuf() {
+ return scaled;
+ }
+
+ // Returns a rectangle describing the pixbuf in relation to the canvas
+ public Gdk.Rectangle get_scaled_pixbuf_position() {
+ return scaled_pos;
+ }
+
+ public bool is_inside_pixbuf(int x, int y) {
+ return coord_in_rectangle(x, y, scaled_pos);
+ }
+
+ public void invalidate(Gdk.Rectangle rect) {
+ if (canvas.get_window() != null)
+ canvas.get_window().invalidate_rect(rect, false);
+ }
+
+ public void invalidate_all() {
+ if (canvas.get_window() != null)
+ canvas.get_window().invalidate_rect(null, false);
+ }
+
+ private void on_viewport_resize() {
+ // do fast repaints while resizing
+ internal_repaint(true, null);
+ }
+
+ protected override void on_resize_finished(Gdk.Rectangle rect) {
+ base.on_resize_finished(rect);
+
+ // when the resize is completed, do a high-quality repaint
+ repaint();
+ }
+
+ private bool on_canvas_exposed(Cairo.Context exposed_ctx) {
+ // draw pixmap onto canvas unless it's not been instantiated, in which case draw black
+ // (so either old image or contents of another page is not left on screen)
+ if (pixmap != null)
+ exposed_ctx.set_source_surface(pixmap, 0, 0);
+ else
+ set_source_color_from_string(exposed_ctx, "#000");
+
+ exposed_ctx.rectangle(0, 0, get_allocated_width(), get_allocated_height());
+ exposed_ctx.paint();
+
+ return true;
+ }
+
+ protected virtual void new_surface(Cairo.Context ctx, Dimensions ctx_dim) {
+ }
+
+ protected virtual void updated_pixbuf(Gdk.Pixbuf pixbuf, UpdateReason reason, Dimensions old_dim) {
+ }
+
+ protected virtual void paint(Cairo.Context ctx, Dimensions ctx_dim) {
+ if (is_zoom_supported() && (!static_zoom_state.is_default())) {
+ set_source_color_from_string(ctx, "#000");
+ ctx.rectangle(0, 0, pixmap_dim.width, pixmap_dim.height);
+ ctx.fill();
+
+ render_zoomed_to_pixmap(static_zoom_state);
+ } else if (!transition_clock.paint(ctx, ctx_dim.width, ctx_dim.height)) {
+ // transition is not running, so paint the full image on a black background
+ set_source_color_from_string(ctx, "#000");
+
+ ctx.rectangle(0, 0, pixmap_dim.width, pixmap_dim.height);
+ ctx.fill();
+
+ Gdk.cairo_set_source_pixbuf(ctx, scaled, scaled_pos.x, scaled_pos.y);
+ ctx.paint();
+ }
+ }
+
+ private void repaint_pixmap() {
+ if (pixmap_ctx == null)
+ return;
+
+ paint(pixmap_ctx, pixmap_dim);
+ invalidate_all();
+ }
+
+ public void repaint(Direction? direction = null) {
+ internal_repaint(false, direction);
+ }
+
+ private void internal_repaint(bool fast, Direction? direction) {
+ // if not in view, assume a full repaint needed in future but do nothing more
+ if (!is_in_view()) {
+ pixmap = null;
+ scaled = null;
+
+ return;
+ }
+
+ // no image or window, no painting
+ if (unscaled == null || canvas.get_window() == null)
+ return;
+
+ Gtk.Allocation allocation;
+ viewport.get_allocation(out allocation);
+
+ int width = allocation.width;
+ int height = allocation.height;
+
+ if (width <= 0 || height <= 0)
+ return;
+
+ bool new_pixbuf = (scaled == null);
+
+ // save if reporting an image being rescaled
+ Dimensions old_scaled_dim = Dimensions.for_rectangle(scaled_pos);
+ Gdk.Rectangle old_scaled_pos = scaled_pos;
+
+ // attempt to reuse pixmap
+ if (pixmap_dim.width != width || pixmap_dim.height != height)
+ pixmap = null;
+
+ // if necessary, create a pixmap as large as the entire viewport
+ bool new_pixmap = false;
+ if (pixmap == null) {
+ init_pixmap(width, height);
+ new_pixmap = true;
+ }
+
+ if (new_pixbuf || new_pixmap) {
+ Dimensions unscaled_dim = Dimensions.for_pixbuf(unscaled);
+
+ // determine scaled size of pixbuf ... if a max dimensions is set and not scaling up,
+ // respect it
+ Dimensions scaled_dim = Dimensions();
+ if (!scale_up_to_viewport && max_dim.has_area() && max_dim.width < width && max_dim.height < height)
+ scaled_dim = max_dim;
+ else
+ scaled_dim = unscaled_dim.get_scaled_proportional(pixmap_dim);
+
+ assert(width >= scaled_dim.width);
+ assert(height >= scaled_dim.height);
+
+ // center pixbuf on the canvas
+ scaled_pos.x = (width - scaled_dim.width) / 2;
+ scaled_pos.y = (height - scaled_dim.height) / 2;
+ scaled_pos.width = scaled_dim.width;
+ scaled_pos.height = scaled_dim.height;
+ }
+
+ Gdk.InterpType interp = (fast) ? FAST_INTERP : QUALITY_INTERP;
+
+ // rescale if canvas rescaled or better quality is requested
+ if (scaled == null) {
+ scaled = resize_pixbuf(unscaled, Dimensions.for_rectangle(scaled_pos), interp);
+
+ UpdateReason reason = UpdateReason.RESIZED_CANVAS;
+ if (new_pixbuf)
+ reason = UpdateReason.NEW_PIXBUF;
+ else if (!new_pixmap && interp == QUALITY_INTERP)
+ reason = UpdateReason.QUALITY_IMPROVEMENT;
+
+ static_zoom_state = ZoomState(max_dim, pixmap_dim,
+ static_zoom_state.get_interpolation_factor(),
+ static_zoom_state.get_viewport_center());
+
+ updated_pixbuf(scaled, reason, old_scaled_dim);
+ }
+
+ zoom_high_quality = !fast;
+
+ if (direction != null && !transition_clock.is_in_progress()) {
+ Spit.Transitions.Visuals visuals = new Spit.Transitions.Visuals(old_scaled,
+ old_scaled_pos, scaled, scaled_pos, parse_color("#000"));
+
+ transition_clock.start(visuals, direction.to_transition_direction(), transition_duration_msec,
+ repaint_pixmap);
+ }
+
+ if (!transition_clock.is_in_progress())
+ repaint_pixmap();
+ }
+
+ private void init_pixmap(int width, int height) {
+ assert(unscaled != null);
+ assert(canvas.get_window() != null);
+
+ // Cairo backing surface (manual double-buffering)
+ pixmap = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height);
+ pixmap_dim = Dimensions(width, height);
+
+ // Cairo context for drawing on the pixmap
+ pixmap_ctx = new Cairo.Context(pixmap);
+
+ // need a new pixbuf to fit this scale
+ scaled = null;
+
+ // Cairo context for drawing text on the pixmap
+ text_ctx = new Cairo.Context(pixmap);
+ set_source_color_from_string(text_ctx, "#fff");
+
+
+ // no need to resize canvas, viewport does that automatically
+
+ new_surface(pixmap_ctx, pixmap_dim);
+ }
+
+ protected override bool on_context_keypress() {
+ return popup_context_menu(get_page_context_menu());
+ }
+
+ protected virtual void on_previous_photo() {
+ }
+
+ protected virtual void on_next_photo() {
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ // if the user holds the arrow keys down, we will receive a steady stream of key press
+ // events for an operation that isn't designed for a rapid succession of output ...
+ // we staunch the supply of new photos to under a quarter second (#533)
+ bool nav_ok = (event.time - last_nav_key) > KEY_REPEAT_INTERVAL_MSEC;
+
+ bool handled = true;
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Left":
+ case "KP_Left":
+ case "BackSpace":
+ if (nav_ok) {
+ on_previous_photo();
+ last_nav_key = event.time;
+ }
+ break;
+
+ case "Right":
+ case "KP_Right":
+ case "space":
+ if (nav_ok) {
+ on_next_photo();
+ last_nav_key = event.time;
+ }
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ if (handled)
+ return true;
+
+ return (base.key_press_event != null) ? base.key_press_event(event) : true;
+ }
+}
+
+//
+// DragAndDropHandler attaches signals to a Page to properly handle drag-and-drop requests for the
+// Page as a DnD Source. (DnD Destination handling is handled by the appropriate AppWindow, i.e.
+// LibraryWindow and DirectWindow). Assumes the Page's ViewCollection holds MediaSources.
+//
+public class DragAndDropHandler {
+ private enum TargetType {
+ XDS,
+ MEDIA_LIST
+ }
+
+ private const Gtk.TargetEntry[] SOURCE_TARGET_ENTRIES = {
+ { "XdndDirectSave0", Gtk.TargetFlags.OTHER_APP, TargetType.XDS },
+ { "shotwell/media-id-atom", Gtk.TargetFlags.SAME_APP, TargetType.MEDIA_LIST }
+ };
+
+ private static Gdk.Atom? XDS_ATOM = null;
+ private static Gdk.Atom? TEXT_ATOM = null;
+ private static uint8[]? XDS_FAKE_TARGET = null;
+
+ private weak Page page;
+ private Gtk.Widget event_source;
+ private File? drag_destination = null;
+ private ExporterUI exporter = null;
+
+ public DragAndDropHandler(Page page) {
+ this.page = page;
+ this.event_source = page.get_event_source();
+ assert(event_source != null);
+ assert(event_source.get_has_window());
+
+ // Need to do this because static member variables are not properly handled
+ if (XDS_ATOM == null)
+ XDS_ATOM = Gdk.Atom.intern_static_string("XdndDirectSave0");
+
+ if (TEXT_ATOM == null)
+ TEXT_ATOM = Gdk.Atom.intern_static_string("text/plain");
+
+ if (XDS_FAKE_TARGET == null)
+ XDS_FAKE_TARGET = string_to_uchar_array("shotwell.txt");
+
+ // register what's available on this DnD Source
+ Gtk.drag_source_set(event_source, Gdk.ModifierType.BUTTON1_MASK, SOURCE_TARGET_ENTRIES,
+ Gdk.DragAction.COPY);
+
+ // attach to the event source's DnD signals, not the Page's, which is a NO_WINDOW widget
+ // and does not emit them
+ event_source.drag_begin.connect(on_drag_begin);
+ event_source.drag_data_get.connect(on_drag_data_get);
+ event_source.drag_end.connect(on_drag_end);
+ event_source.drag_failed.connect(on_drag_failed);
+ }
+
+ ~DragAndDropHandler() {
+ if (event_source != null) {
+ event_source.drag_begin.disconnect(on_drag_begin);
+ event_source.drag_data_get.disconnect(on_drag_data_get);
+ event_source.drag_end.disconnect(on_drag_end);
+ event_source.drag_failed.disconnect(on_drag_failed);
+ }
+
+ page = null;
+ event_source = null;
+ }
+
+ private void on_drag_begin(Gdk.DragContext context) {
+ debug("on_drag_begin (%s)", page.get_page_name());
+
+ if (page == null || page.get_view().get_selected_count() == 0 || exporter != null)
+ return;
+
+ drag_destination = null;
+
+ // use the first media item as the icon
+ ThumbnailSource thumb = (ThumbnailSource) page.get_view().get_selected_at(0).get_source();
+
+ try {
+ Gdk.Pixbuf icon = thumb.get_thumbnail(AppWindow.DND_ICON_SCALE);
+ Gtk.drag_source_set_icon_pixbuf(event_source, icon);
+ } catch (Error err) {
+ warning("Unable to fetch icon for drag-and-drop from %s: %s", thumb.to_string(),
+ err.message);
+ }
+
+ // set the XDS property to indicate an XDS save is available
+#if VALA_0_20
+ Gdk.property_change(context.get_source_window(), XDS_ATOM, TEXT_ATOM, 8, Gdk.PropMode.REPLACE,
+ XDS_FAKE_TARGET, 1);
+#else
+ Gdk.property_change(context.get_source_window(), XDS_ATOM, TEXT_ATOM, 8, Gdk.PropMode.REPLACE,
+ XDS_FAKE_TARGET);
+#endif
+ }
+
+ private void on_drag_data_get(Gdk.DragContext context, Gtk.SelectionData selection_data,
+ uint target_type, uint time) {
+ debug("on_drag_data_get (%s)", page.get_page_name());
+
+ if (page == null || page.get_view().get_selected_count() == 0)
+ return;
+
+ switch (target_type) {
+ case TargetType.XDS:
+ // Fetch the XDS property that has been set with the destination path
+ uchar[] data = new uchar[4096];
+ Gdk.Atom actual_type;
+ int actual_format = 0;
+ bool fetched = Gdk.property_get(context.get_source_window(), XDS_ATOM, TEXT_ATOM,
+ 0, data.length, 0, out actual_type, out actual_format, out data);
+
+ // the destination path is actually for our XDS_FAKE_TARGET, use its parent
+ // to determine where the file(s) should go
+ if (fetched && data != null && data.length > 0)
+ drag_destination = File.new_for_uri(uchar_array_to_string(data)).get_parent();
+
+ debug("on_drag_data_get (%s): %s", page.get_page_name(),
+ (drag_destination != null) ? drag_destination.get_path() : "(no path)");
+
+ // Set the property to "S" for Success or "E" for Error
+ selection_data.set(XDS_ATOM, 8,
+ string_to_uchar_array((drag_destination != null) ? "S" : "E"));
+ break;
+
+ case TargetType.MEDIA_LIST:
+ Gee.Collection<MediaSource> sources =
+ (Gee.Collection<MediaSource>) page.get_view().get_selected_sources();
+
+ // convert the selected media sources to Gdk.Atom-encoded sourceID strings for
+ // internal drag-and-drop
+ selection_data.set(Gdk.Atom.intern_static_string("SourceIDAtom"), (int) sizeof(Gdk.Atom),
+ serialize_media_sources(sources));
+ break;
+
+ default:
+ warning("on_drag_data_get (%s): unknown target type %u", page.get_page_name(),
+ target_type);
+ break;
+ }
+ }
+
+ private void on_drag_end() {
+ debug("on_drag_end (%s)", page.get_page_name());
+
+ if (page == null || page.get_view().get_selected_count() == 0 || drag_destination == null
+ || exporter != null) {
+ return;
+ }
+
+ debug("Exporting to %s", drag_destination.get_path());
+
+ // drag-and-drop export doesn't pop up an export dialog, so use what are likely the
+ // most common export settings (the current -- or "working" -- file format, with
+ // all transformations applied, at the image's original size).
+ if (drag_destination.get_path() != null) {
+ exporter = new ExporterUI(new Exporter(
+ (Gee.Collection<Photo>) page.get_view().get_selected_sources(),
+ drag_destination, Scaling.for_original(), ExportFormatParameters.current()));
+ exporter.export(on_export_completed);
+ } else {
+ AppWindow.error_message(_("Photos cannot be exported to this directory."));
+ }
+
+ drag_destination = null;
+ }
+
+ private bool on_drag_failed(Gdk.DragContext context, Gtk.DragResult drag_result) {
+ debug("on_drag_failed (%s): %d", page.get_page_name(), (int) drag_result);
+
+ if (page == null)
+ return false;
+
+ drag_destination = null;
+
+ return false;
+ }
+
+ private void on_export_completed() {
+ exporter = null;
+ }
+}
diff --git a/src/Photo.vala b/src/Photo.vala
new file mode 100644
index 0000000..ab449dc
--- /dev/null
+++ b/src/Photo.vala
@@ -0,0 +1,5381 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Specifies how pixel data is fetched from the backing file on disk. MASTER is the original
+// backing photo of any supported photo file format; SOURCE is either the master or the editable
+// file, that is, the appropriate reference file for user display; BASELINE is an appropriate
+// file with the proviso that it may be a suitable substitute for the master and/or the editable.
+// UNMODIFIED represents the photo with no edits, i.e. the head of the pipeline.
+//
+// In general, callers want to use the BASELINE unless requirements are specific.
+public enum BackingFetchMode {
+ SOURCE,
+ BASELINE,
+ MASTER,
+ UNMODIFIED
+}
+
+public class PhotoImportParams {
+ // IN:
+ public File file;
+ public File final_associated_file = null;
+ public ImportID import_id;
+ public PhotoFileSniffer.Options sniffer_options;
+ public string? exif_md5;
+ public string? thumbnail_md5;
+ public string? full_md5;
+
+ // IN/OUT:
+ public Thumbnails? thumbnails;
+
+ // OUT:
+ public PhotoRow row = new PhotoRow();
+ public Gee.Collection<string>? keywords = null;
+
+ public PhotoImportParams(File file, File? final_associated_file, ImportID import_id,
+ PhotoFileSniffer.Options sniffer_options, string? exif_md5, string? thumbnail_md5, string? full_md5,
+ Thumbnails? thumbnails = null) {
+ this.file = file;
+ this.final_associated_file = final_associated_file;
+ this.import_id = import_id;
+ this.sniffer_options = sniffer_options;
+ this.exif_md5 = exif_md5;
+ this.thumbnail_md5 = thumbnail_md5;
+ this.full_md5 = full_md5;
+ this.thumbnails = thumbnails;
+ }
+
+ // Creates a placeholder import.
+ public PhotoImportParams.create_placeholder(File file, ImportID import_id) {
+ this.file = file;
+ this.import_id = import_id;
+ this.sniffer_options = PhotoFileSniffer.Options.NO_MD5;
+ this.exif_md5 = null;
+ this.thumbnail_md5 = null;
+ this.full_md5 = null;
+ this.thumbnails = null;
+ }
+}
+
+public abstract class PhotoTransformationState : Object {
+ private bool is_broke = false;
+
+ // This signal is fired when the Photo object can no longer accept it and reliably return to
+ // this state.
+ public virtual signal void broken() {
+ is_broke = true;
+ }
+
+ protected PhotoTransformationState() {
+ }
+
+ public bool is_broken() {
+ return is_broke;
+ }
+}
+
+public enum Rating {
+ REJECTED = -1,
+ UNRATED = 0,
+ ONE = 1,
+ TWO = 2,
+ THREE = 3,
+ FOUR = 4,
+ FIVE = 5;
+
+ public bool can_increase() {
+ return this < FIVE;
+ }
+
+ public bool can_decrease() {
+ return this > REJECTED;
+ }
+
+ public bool is_valid() {
+ return this >= REJECTED && this <= FIVE;
+ }
+
+ public Rating increase() {
+ return can_increase() ? this + 1 : this;
+ }
+
+ public Rating decrease() {
+ return can_decrease() ? this - 1 : this;
+ }
+
+ public int serialize() {
+ switch (this) {
+ case REJECTED:
+ return -1;
+ case UNRATED:
+ return 0;
+ case ONE:
+ return 1;
+ case TWO:
+ return 2;
+ case THREE:
+ return 3;
+ case FOUR:
+ return 4;
+ case FIVE:
+ return 5;
+ default:
+ return 0;
+ }
+ }
+
+ public static Rating unserialize(int value) {
+ if (value > FIVE)
+ return FIVE;
+ else if (value < REJECTED)
+ return REJECTED;
+
+ switch (value) {
+ case -1:
+ return REJECTED;
+ case 0:
+ return UNRATED;
+ case 1:
+ return ONE;
+ case 2:
+ return TWO;
+ case 3:
+ return THREE;
+ case 4:
+ return FOUR;
+ case 5:
+ return FIVE;
+ default:
+ return UNRATED;
+ }
+ }
+}
+
+// Photo is an abstract class that allows for applying transformations on-the-fly to a
+// particular photo without modifying the backing image file. The interface allows for
+// transformations to be stored persistently elsewhere or in memory until they're committed en
+// masse to an image file.
+public abstract class Photo : PhotoSource, Dateable {
+ // Need to use "thumb" rather than "photo" for historical reasons -- this name is used
+ // directly to load thumbnails from disk by already-existing filenames
+ public const string TYPENAME = "thumb";
+
+ private const string[] IMAGE_EXTENSIONS = {
+ // raster formats
+ "jpg", "jpeg", "jpe",
+ "tiff", "tif",
+ "png",
+ "gif",
+ "bmp",
+ "ppm", "pgm", "pbm", "pnm",
+
+ // THM are JPEG thumbnails produced by some RAW cameras ... want to support the RAW
+ // image but not import their thumbnails
+ "thm",
+
+ // less common
+ "tga", "ilbm", "pcx", "ecw", "img", "sid", "cd5", "fits", "pgf",
+
+ // vector
+ "cgm", "svg", "odg", "eps", "pdf", "swf", "wmf", "emf", "xps",
+
+ // 3D
+ "pns", "jps", "mpo",
+
+ // RAW extensions
+ "3fr", "arw", "srf", "sr2", "bay", "crw", "cr2", "cap", "iiq", "eip", "dcs", "dcr", "drf",
+ "k25", "kdc", "dng", "erf", "fff", "mef", "mos", "mrw", "nef", "nrw", "orf", "ptx", "pef",
+ "pxn", "r3d", "raf", "raw", "rw2", "rwl", "rwz", "x3f", "srw"
+ };
+
+ // There are assertions in the photo pipeline to verify that the generated (or loaded) pixbuf
+ // is scaled properly. We have to allow for some wobble here because of rounding errors and
+ // precision limitations of various subsystems. Pixel-accuracy would be best, but barring that,
+ // need to just make sure the pixbuf is in the ballpark.
+ private const int SCALING_FUDGE = 64;
+
+ // The number of seconds we should hold onto a precached copy of the original image; if
+ // it hasn't been accessed in this many seconds, discard it to conserve memory.
+ private const int PRECACHE_TIME_TO_LIVE = 180;
+
+ // Minimum raw embedded preview size we're willing to accept; any smaller than this, and
+ // it's probably intended primarily for use only as a thumbnail and won't look good on the
+ // PhotoPage.
+ private const int MIN_EMBEDDED_SIZE = 1024;
+
+ // Here, we cache the exposure time to avoid paying to access the row every time we
+ // need to know it. This is initially set in the constructor, and updated whenever
+ // the exposure time is set (please see set_exposure_time() for details).
+ private time_t cached_exposure_time;
+
+ public enum Exception {
+ NONE = 0,
+ ORIENTATION = 1 << 0,
+ CROP = 1 << 1,
+ REDEYE = 1 << 2,
+ ADJUST = 1 << 3,
+ STRAIGHTEN = 1 << 4,
+ ALL = 0xFFFFFFFF;
+
+ public bool prohibits(Exception exception) {
+ return ((this & exception) != 0);
+ }
+
+ public bool allows(Exception exception) {
+ return ((this & exception) == 0);
+ }
+ }
+
+ // NOTE: This class should only be instantiated when row is locked.
+ private class PhotoTransformationStateImpl : PhotoTransformationState {
+ private Photo photo;
+ private Orientation orientation;
+ private Gee.HashMap<string, KeyValueMap>? transformations;
+ private PixelTransformer? transformer;
+ private PixelTransformationBundle? adjustments;
+
+ public PhotoTransformationStateImpl(Photo photo, Orientation orientation,
+ Gee.HashMap<string, KeyValueMap>? transformations, PixelTransformer? transformer,
+ PixelTransformationBundle? adjustments) {
+ this.photo = photo;
+ this.orientation = orientation;
+ this.transformations = copy_transformations(transformations);
+ this.transformer = transformer;
+ this.adjustments = adjustments;
+
+ photo.baseline_replaced.connect(on_photo_baseline_replaced);
+ }
+
+ ~PhotoTransformationStateImpl() {
+ photo.baseline_replaced.disconnect(on_photo_baseline_replaced);
+ }
+
+ public Orientation get_orientation() {
+ return orientation;
+ }
+
+ public Gee.HashMap<string, KeyValueMap>? get_transformations() {
+ return copy_transformations(transformations);
+ }
+
+ public PixelTransformer? get_transformer() {
+ return (transformer != null) ? transformer.copy() : null;
+ }
+
+ public PixelTransformationBundle? get_color_adjustments() {
+ return (adjustments != null) ? adjustments.copy() : null;
+ }
+
+ private static Gee.HashMap<string, KeyValueMap>? copy_transformations(
+ Gee.HashMap<string, KeyValueMap>? original) {
+ if (original == null)
+ return null;
+
+ Gee.HashMap<string, KeyValueMap>? clone = new Gee.HashMap<string, KeyValueMap>();
+ foreach (string object in original.keys)
+ clone.set(object, original.get(object).copy());
+
+ return clone;
+ }
+
+ private void on_photo_baseline_replaced() {
+ if (!is_broken())
+ broken();
+ }
+ }
+
+ private class BackingReaders {
+ public PhotoFileReader master;
+ public PhotoFileReader developer;
+ public PhotoFileReader editable;
+ }
+
+ // because fetching individual items from the database is high-overhead, store all of
+ // the photo row in memory
+ protected PhotoRow row;
+ private BackingPhotoRow editable = new BackingPhotoRow();
+ private BackingReaders readers = new BackingReaders();
+ private PixelTransformer transformer = null;
+ private PixelTransformationBundle adjustments = null;
+ // because file_title is determined by data in row, it should only be accessed when row is locked
+ private string file_title = null;
+ private FileMonitor editable_monitor = null;
+ private OneShotScheduler reimport_editable_scheduler = null;
+ private OneShotScheduler update_editable_attributes_scheduler = null;
+ private OneShotScheduler remove_editable_scheduler = null;
+
+ protected bool can_rotate_now = true;
+
+ // The first time we have to run the pipeline on an image, we'll precache
+ // a copy of the unscaled, unmodified version; this allows us to operate
+ // directly on the image data quickly without re-fetching it at the top
+ // of the pipeline, which can cause significant lag with larger images.
+ //
+ // This adds a small amount of (automatically garbage-collected) memory
+ // overhead, but greatly simplifies the pipeline, since scaling can now
+ // be blithely ignored, and most of the pixel operations are fast enough
+ // that the app remains responsive, even with 10MP images.
+ //
+ // In order to make sure we discard unneeded precaches in a timely fashion,
+ // we spawn a timer when the unmodified pixbuf is first precached; if the
+ // timer elapses and the pixbuf hasn't been needed again since then, we'll
+ // discard it and free up the memory.
+ private Gdk.Pixbuf unmodified_precached = null;
+ private GLib.Timer secs_since_access = null;
+
+ // RAW only: developed backing photos.
+ private Gee.HashMap<RawDeveloper, BackingPhotoRow?>? developments = null;
+
+ // Set to true if we want to develop RAW photos into new files.
+ public static bool develop_raw_photos_to_files { get; set; default = false; }
+
+ // This pointer is used to determine which BackingPhotoRow in the PhotoRow to be using at
+ // any time. It should only be accessed -- read or write -- when row is locked.
+ protected BackingPhotoRow? backing_photo_row = null;
+
+ // This is fired when the photo's editable file is replaced. The image it generates may or
+ // may not be the same; the altered signal is best for that. null is passed if the editable
+ // is being added, replaced, or removed (in the appropriate places)
+ public virtual signal void editable_replaced(File? old_file, File? new_file) {
+ }
+
+ // Fired when one or more of the photo's RAW developments has been changed. This will only
+ // be fired on RAW photos, and only when a development has been added or removed.
+ public virtual signal void raw_development_modified() {
+ }
+
+ // This is fired when the photo's baseline file (the file that generates images at the head
+ // of the pipeline) is replaced. Photo will make every sane effort to only fire this signal
+ // if the new baseline is the same image-wise (i.e. the pixbufs it generates are essentially
+ // the same).
+ public virtual signal void baseline_replaced() {
+ }
+
+ // This is fired when the photo's master is reimported in place. It's fired after all changes
+ // to the Photo's state have been incorporated into the object and the "altered" signal has
+ // been fired notifying of the various details that have changed.
+ public virtual signal void master_reimported(PhotoMetadata? metadata) {
+ }
+
+ // Like "master-reimported", but when a photo's editable has been reimported.
+ public virtual signal void editable_reimported(PhotoMetadata? metadata) {
+ }
+
+ // Like "master-reimported" but when the baseline file has been reimported. Note that this
+ // could be the master file OR the editable file.
+ //
+ // See BackingFetchMode for more details.
+ public virtual signal void baseline_reimported(PhotoMetadata? metadata) {
+ }
+
+ // Like "master-reimported" but when the source file has been reimported. Note that this could
+ // be the master file OR the editable file.
+ //
+ // See BackingFetchMode for more details.
+ public virtual signal void source_reimported(PhotoMetadata? metadata) {
+ }
+
+ // The key to this implementation is that multiple instances of Photo with the
+ // same PhotoID cannot exist; it is up to the subclasses to ensure this.
+ protected Photo(PhotoRow row) {
+ this.row = row;
+
+ // normalize user text
+ this.row.title = prep_title(this.row.title);
+ this.row.comment = prep_comment(this.row.comment);
+
+ // don't need to lock the struct in the constructor (and to do so would hurt startup
+ // time)
+ readers.master = row.master.file_format.create_reader(row.master.filepath);
+
+ // get the file title of the Photo without using a File object, skipping the separator itself
+ string? basename = String.sliced_at_last_char(row.master.filepath, Path.DIR_SEPARATOR);
+ if (basename != null)
+ file_title = String.sliced_at(basename, 1);
+
+ if (is_string_empty(file_title))
+ file_title = row.master.filepath;
+
+ if (row.editable_id.id != BackingPhotoID.INVALID) {
+ BackingPhotoRow? e = get_backing_row(row.editable_id);
+ if (e != null) {
+ editable = e;
+ readers.editable = editable.file_format.create_reader(editable.filepath);
+ } else {
+ try {
+ PhotoTable.get_instance().detach_editable(this.row);
+ } catch (DatabaseError err) {
+ // ignored
+ }
+
+ // need to remove all transformations as they're keyed to the editable's
+ // coordinate system
+ internal_remove_all_transformations(false);
+ }
+ }
+
+ if (row.master.file_format == PhotoFileFormat.RAW) {
+ // Fetch development backing photos for RAW.
+ developments = new Gee.HashMap<RawDeveloper, BackingPhotoRow?>();
+ foreach (RawDeveloper d in RawDeveloper.as_array()) {
+ BackingPhotoID id = row.development_ids[d];
+ if (id.id != BackingPhotoID.INVALID) {
+ BackingPhotoRow? bpr = get_backing_row(id);
+ if (bpr != null)
+ developments.set(d, bpr);
+ }
+ }
+ }
+
+ // Set up reader for developer.
+ if (row.master.file_format == PhotoFileFormat.RAW && developments.has_key(row.developer)) {
+ BackingPhotoRow r = developments.get(row.developer);
+ readers.developer = r.file_format.create_reader(r.filepath);
+ }
+
+ // Set the backing photo state appropriately.
+ if (readers.editable != null) {
+ backing_photo_row = this.editable;
+ } else if (row.master.file_format != PhotoFileFormat.RAW) {
+ backing_photo_row = this.row.master;
+ } else {
+ // For RAW photos, the backing photo is either the editable (above) or
+ // the selected raw development.
+ if (developments.has_key(row.developer)) {
+ backing_photo_row = developments.get(row.developer);
+ } else {
+ // Use row's backing photo.
+ backing_photo_row = this.row.master;
+ }
+ }
+
+ cached_exposure_time = this.row.exposure_time;
+ }
+
+ protected virtual void notify_editable_replaced(File? old_file, File? new_file) {
+ editable_replaced(old_file, new_file);
+ }
+
+ protected virtual void notify_raw_development_modified() {
+ raw_development_modified();
+ }
+
+ protected virtual void notify_baseline_replaced() {
+ baseline_replaced();
+ }
+
+ protected virtual void notify_master_reimported(PhotoMetadata? metadata) {
+ master_reimported(metadata);
+ }
+
+ protected virtual void notify_editable_reimported(PhotoMetadata? metadata) {
+ editable_reimported(metadata);
+ }
+
+ protected virtual void notify_source_reimported(PhotoMetadata? metadata) {
+ source_reimported(metadata);
+ }
+
+ protected virtual void notify_baseline_reimported(PhotoMetadata? metadata) {
+ baseline_reimported(metadata);
+ }
+
+ public override bool internal_delete_backing() throws Error {
+ bool ret = true;
+ File file = null;
+ lock (readers) {
+ if (readers.editable != null)
+ file = readers.editable.get_file();
+ }
+
+ detach_editable(true, false);
+
+ if (get_master_file_format() == PhotoFileFormat.RAW) {
+ foreach (RawDeveloper d in RawDeveloper.as_array()) {
+ delete_raw_development(d);
+ }
+ }
+
+ if (file != null) {
+ try {
+ ret = file.trash(null);
+ } catch (Error err) {
+ ret = false;
+ message("Unable to move editable %s for %s to trash: %s", file.get_path(),
+ to_string(), err.message);
+ }
+ }
+
+ // Return false if parent method failed.
+ return base.internal_delete_backing() && ret;
+ }
+
+ // Fetches the backing state. If it can't be read, the ID is flushed from the database
+ // for safety. If the ID is invalid or any error occurs, null is returned.
+ private BackingPhotoRow? get_backing_row(BackingPhotoID id) {
+ if (id.id == BackingPhotoID.INVALID)
+ return null;
+
+ BackingPhotoRow? backing_row = null;
+ try {
+ backing_row = BackingPhotoTable.get_instance().fetch(id);
+ } catch (DatabaseError err) {
+ warning("Unable to fetch backing state for %s: %s", to_string(), err.message);
+ }
+
+ if (backing_row == null) {
+ try {
+ BackingPhotoTable.get_instance().remove(id);
+ } catch (DatabaseError err) {
+ // ignored
+ }
+ return null;
+ }
+
+ return backing_row;
+ }
+
+ // Returns true if the given raw development was already made and the developed image
+ // exists on disk.
+ public bool is_raw_developer_complete(RawDeveloper d) {
+ lock (developments) {
+ return developments.has_key(d) &&
+ FileUtils.test(developments.get(d).filepath, FileTest.EXISTS);
+ }
+ }
+
+ // Determines whether a given RAW developer is available for this photo.
+ public bool is_raw_developer_available(RawDeveloper d) {
+ lock (developments) {
+ if (developments.has_key(d))
+ return true;
+ }
+
+ switch (d) {
+ case RawDeveloper.SHOTWELL:
+ return true;
+
+ case RawDeveloper.CAMERA:
+ return false;
+
+ case RawDeveloper.EMBEDDED:
+ try {
+ PhotoMetadata meta = get_master_metadata();
+ uint num_previews = meta.get_preview_count();
+
+ if (num_previews > 0) {
+ PhotoPreview? prev = meta.get_preview(num_previews - 1);
+
+ // Embedded preview could not be fetched?
+ if (prev == null)
+ return false;
+
+ Dimensions dims = prev.get_pixel_dimensions();
+
+ // Largest embedded preview was an unacceptable size?
+ int preview_major_axis = (dims.width > dims.height) ? dims.width : dims.height;
+ if (preview_major_axis < MIN_EMBEDDED_SIZE)
+ return false;
+
+ // Preview was a supported size, use it.
+ return true;
+ }
+
+ // Image has no embedded preview at all.
+ return false;
+ } catch (Error e) {
+ debug("Error accessing embedded preview. Message: %s", e.message);
+ }
+ return false;
+
+ default:
+ assert_not_reached();
+ }
+ }
+
+ // Reads info on a backing photo and adds it.
+ // Note: this function was created for importing new photos. It will not
+ // notify of changes to the developments.
+ public void add_backing_photo_for_development(RawDeveloper d, BackingPhotoRow bpr) throws Error {
+ import_developed_backing_photo(row, d, bpr);
+ lock (developments) {
+ developments.set(d, bpr);
+ }
+ notify_altered(new Alteration("image", "developer"));
+ }
+
+ public static void import_developed_backing_photo(PhotoRow row, RawDeveloper d,
+ BackingPhotoRow bpr) throws Error {
+ File file = File.new_for_path(bpr.filepath);
+ FileInfo info = file.query_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ TimeVal timestamp = info.get_modification_time();
+
+ PhotoFileInterrogator interrogator = new PhotoFileInterrogator(
+ file, PhotoFileSniffer.Options.GET_ALL);
+ interrogator.interrogate();
+
+ DetectedPhotoInformation? detected = interrogator.get_detected_photo_information();
+ bpr.dim = detected.image_dim;
+ bpr.filesize = info.get_size();
+ bpr.timestamp = timestamp.tv_sec;
+ bpr.original_orientation = detected.metadata != null ? detected.metadata.get_orientation() :
+ Orientation.TOP_LEFT;
+
+ // Add to DB.
+ BackingPhotoTable.get_instance().add(bpr);
+ PhotoTable.get_instance().update_raw_development(row, d, bpr.id);
+ }
+
+ // "Develops" a raw photo
+ // Not thread-safe.
+ private void develop_photo(RawDeveloper d) {
+ bool wrote_img_to_disk = false;
+ BackingPhotoRow bps = null;
+
+ switch (d) {
+ case RawDeveloper.SHOTWELL:
+ try {
+ // Create file and prep.
+ bps = d.create_backing_row_for_development(row.master.filepath);
+ Gdk.Pixbuf? pix = null;
+ lock (readers) {
+ // Don't rotate this pixbuf before writing it out. We don't
+ // need to because we'll display it using the orientation
+ // from the parent raw file, so rotating it here would cause
+ // portrait images to rotate _twice_...
+ pix = get_master_pixbuf(Scaling.for_original(), false);
+ }
+
+ if (pix == null) {
+ debug("Could not get preview pixbuf");
+ return;
+ }
+
+ // Write out the JPEG.
+ PhotoFileWriter writer = PhotoFileFormat.JFIF.create_writer(bps.filepath);
+ writer.write(pix, Jpeg.Quality.HIGH);
+
+ // Remember that we wrote it (we'll only get here if writing
+ // the jpeg doesn't throw an exception). We do this because
+ // some cameras' output has non-spec-compliant exif segments
+ // larger than 64k (exiv2 can't cope with this), so saving
+ // metadata to the development could fail, but we want to use
+ // it anyway since the image portion is still valid...
+ wrote_img_to_disk = true;
+
+ // Write out metadata. An exception could get thrown here as
+ // well, hence the separate check for being able to save the
+ // image above...
+ PhotoMetadata meta = get_master_metadata();
+ PhotoFileMetadataWriter mwriter = PhotoFileFormat.JFIF.create_metadata_writer(bps.filepath);
+ mwriter.write_metadata(meta);
+ } catch (Error err) {
+ debug("Error developing photo: %s", err.message);
+ } finally {
+ if (wrote_img_to_disk) {
+ try {
+ // Read in backing photo info, add to DB.
+ add_backing_photo_for_development(d, bps);
+
+ notify_raw_development_modified();
+ } catch (Error e) {
+ debug("Error adding backing photo as development. Message: %s",
+ e.message);
+ }
+ }
+ }
+
+ break;
+
+ case RawDeveloper.CAMERA:
+ // No development needed.
+ break;
+
+ case RawDeveloper.EMBEDDED:
+ try {
+ // Read in embedded JPEG.
+ PhotoMetadata meta = get_master_metadata();
+ uint c = meta.get_preview_count();
+ if (c <= 0)
+ return;
+ PhotoPreview? prev = meta.get_preview(c - 1);
+ if (prev == null) {
+ debug("Could not get preview from metadata");
+ return;
+ }
+
+ Gdk.Pixbuf? pix = prev.get_pixbuf();
+ if (pix == null) {
+ debug("Could not get preview pixbuf");
+ return;
+ }
+
+ // Write out file.
+ bps = d.create_backing_row_for_development(row.master.filepath);
+ PhotoFileWriter writer = PhotoFileFormat.JFIF.create_writer(bps.filepath);
+ writer.write(pix, Jpeg.Quality.HIGH);
+
+ // Remember that we wrote it (see above
+ // case for why this is necessary).
+ wrote_img_to_disk = true;
+
+ // Write out metadata
+ PhotoFileMetadataWriter mwriter = PhotoFileFormat.JFIF.create_metadata_writer(bps.filepath);
+ mwriter.write_metadata(meta);
+ } catch (Error e) {
+ debug("Error accessing embedded preview. Message: %s", e.message);
+ return;
+ } finally {
+ if (wrote_img_to_disk) {
+ try {
+ // Read in backing photo info, add to DB.
+ add_backing_photo_for_development(d, bps);
+
+ notify_raw_development_modified();
+ } catch (Error e) {
+ debug("Error adding backing photo as development. Message: %s",
+ e.message);
+ }
+ }
+ }
+ break;
+
+ default:
+ assert_not_reached();
+ }
+ }
+
+ // Sets the developer internally, but does not actually develop the backing file.
+ public void set_default_raw_developer(RawDeveloper d) {
+ lock (row) {
+ row.developer = d;
+ }
+ }
+
+ // Sets the developer and develops the photo.
+ public void set_raw_developer(RawDeveloper d) {
+ if (get_master_file_format() != PhotoFileFormat.RAW)
+ return;
+
+ // If the caller has asked for 'embedded', but there's a camera development
+ // available, always prefer that instead, as it's likely to be of higher
+ // quality and resolution.
+ if (is_raw_developer_available(RawDeveloper.CAMERA) && (d == RawDeveloper.EMBEDDED))
+ d = RawDeveloper.CAMERA;
+
+ // If the embedded preview is too small to be used in the PhotoPage, don't
+ // allow EMBEDDED to be chosen.
+ if (!is_raw_developer_available(RawDeveloper.EMBEDDED))
+ d = RawDeveloper.SHOTWELL;
+
+ lock (developments) {
+ RawDeveloper stale_raw_developer = row.developer;
+
+ // Perform development, bail out if it doesn't work.
+ if (!is_raw_developer_complete(d)) {
+ develop_photo(d);
+ try {
+ populate_prefetched();
+ } catch (Error e) {
+ // couldn't reload the freshly-developed image, nothing to display
+ return;
+ }
+ }
+ if (!developments.has_key(d))
+ return; // we tried!
+
+ // Disgard changes.
+ revert_to_master(false);
+
+ // Switch master to the new photo.
+ row.developer = d;
+ backing_photo_row = developments.get(d);
+ readers.developer = backing_photo_row.file_format.create_reader(backing_photo_row.filepath);
+
+ set_orientation(backing_photo_row.original_orientation);
+
+ try {
+ PhotoTable.get_instance().update_raw_development(row, d, backing_photo_row.id);
+ } catch (Error e) {
+ warning("Error updating database: %s", e.message);
+ }
+
+ // Is the 'stale' development _NOT_ a camera-supplied one?
+ //
+ // NOTE: When a raw is first developed, both 'stale' and 'incoming' developers
+ // will be the same, so the second test is required for correct operation.
+ if ((stale_raw_developer != RawDeveloper.CAMERA) &&
+ (stale_raw_developer != row.developer)) {
+ // The 'stale' non-Shotwell development we're using was
+ // created by us, not the camera, so discard it...
+ delete_raw_development(stale_raw_developer);
+ }
+
+ // Otherwise, don't delete the paired JPEG, since it is user/camera-created
+ // and is to be preserved.
+ }
+
+ notify_altered(new Alteration("image", "developer"));
+ discard_prefetched(true);
+ }
+
+ public RawDeveloper get_raw_developer() {
+ return row.developer;
+ }
+
+ // Removes a development from the database, filesystem, etc.
+ // Returns true if a development was removed, otherwise false.
+ private bool delete_raw_development(RawDeveloper d) {
+ bool ret = false;
+
+ lock (developments) {
+ if (!developments.has_key(d))
+ return false;
+
+ // Remove file. If this is a camera-generated JPEG, we trash it;
+ // otherwise, it was generated by us and should be deleted outright.
+ debug("Delete raw development: %s %s", this.to_string(), d.to_string());
+ BackingPhotoRow bpr = developments.get(d);
+ if (bpr.filepath != null) {
+ File f = File.new_for_path(bpr.filepath);
+ try {
+ if (d == RawDeveloper.CAMERA)
+ f.trash();
+ else
+ f.delete();
+ } catch (Error e) {
+ warning("Unable to delete RAW development: %s error: %s", bpr.filepath, e.message);
+ }
+ }
+
+ // Delete references in DB.
+ try {
+ PhotoTable.get_instance().remove_development(row, d);
+ BackingPhotoTable.get_instance().remove(bpr.id);
+ } catch (Error e) {
+ warning("Database error while deleting RAW development: %s", e.message);
+ }
+
+ ret = developments.unset(d);
+ }
+
+ notify_raw_development_modified();
+ return ret;
+ }
+
+ // Re-do development for photo.
+ public void redevelop_raw(RawDeveloper d) {
+ lock (developments) {
+ delete_raw_development(d);
+ RawDeveloper dev = d;
+ if (dev == RawDeveloper.CAMERA)
+ dev = RawDeveloper.EMBEDDED;
+
+ set_raw_developer(dev);
+ }
+ }
+
+ public override BackingFileState[] get_backing_files_state() {
+ BackingFileState[] backing = new BackingFileState[0];
+ lock (row) {
+ backing += new BackingFileState.from_photo_row(row.master, row.md5);
+ if (has_editable())
+ backing += new BackingFileState.from_photo_row(editable, null);
+
+ if (is_developed()) {
+ Gee.Collection<BackingPhotoRow>? dev_rows = get_raw_development_photo_rows();
+ if (dev_rows != null) {
+ foreach (BackingPhotoRow r in dev_rows) {
+ debug("adding: %s", r.filepath);
+ backing += new BackingFileState.from_photo_row(r, null);
+ }
+ }
+ }
+ }
+
+ return backing;
+ }
+
+ private PhotoFileReader get_backing_reader(BackingFetchMode mode) {
+ switch (mode) {
+ case BackingFetchMode.MASTER:
+ return get_master_reader();
+
+ case BackingFetchMode.BASELINE:
+ return get_baseline_reader();
+
+ case BackingFetchMode.SOURCE:
+ return get_source_reader();
+
+ case BackingFetchMode.UNMODIFIED:
+ if (this.get_master_file_format() == PhotoFileFormat.RAW)
+ return get_raw_developer_reader();
+ else
+ return get_master_reader();
+
+ default:
+ error("Unknown backing fetch mode %s", mode.to_string());
+ }
+ }
+
+ private PhotoFileReader get_master_reader() {
+ lock (readers) {
+ return readers.master;
+ }
+ }
+
+ protected PhotoFileReader? get_editable_reader() {
+ lock (readers) {
+ return readers.editable;
+ }
+ }
+
+ // Returns a reader for the head of the pipeline.
+ private PhotoFileReader get_baseline_reader() {
+ lock (readers) {
+ if (readers.editable != null)
+ return readers.editable;
+
+ if (readers.developer != null)
+ return readers.developer;
+
+ return readers.master;
+ }
+ }
+
+ // Returns a reader for the photo file that is the source of the image.
+ private PhotoFileReader get_source_reader() {
+ lock (readers) {
+ if (readers.editable != null)
+ return readers.editable;
+
+ if (readers.developer != null)
+ return readers.developer;
+
+ return readers.master;
+ }
+ }
+
+ // Returns the reader used for reading the RAW development.
+ private PhotoFileReader get_raw_developer_reader() {
+ lock (readers) {
+ return readers.developer;
+ }
+ }
+
+ public bool is_developed() {
+ lock (readers) {
+ return readers.developer != null;
+ }
+ }
+
+ public bool has_editable() {
+ lock (readers) {
+ return readers.editable != null;
+ }
+ }
+
+ public bool does_master_exist() {
+ lock (readers) {
+ return readers.master.file_exists();
+ }
+ }
+
+ // Returns false if the backing editable does not exist OR the photo does not have an editable
+ public bool does_editable_exist() {
+ lock (readers) {
+ return readers.editable != null ? readers.editable.file_exists() : false;
+ }
+ }
+
+ public bool is_master_baseline() {
+ lock (readers) {
+ return readers.editable == null;
+ }
+ }
+
+ public bool is_master_source() {
+ return !has_editable();
+ }
+
+ public bool is_editable_baseline() {
+ lock (readers) {
+ return readers.editable != null;
+ }
+ }
+
+ public bool is_editable_source() {
+ return has_editable();
+ }
+
+ public BackingPhotoRow get_master_photo_row() {
+ lock (row) {
+ return row.master;
+ }
+ }
+
+ public BackingPhotoRow? get_editable_photo_row() {
+ lock (row) {
+ // ternary doesn't work here
+ if (row.editable_id.is_valid())
+ return editable;
+ else
+ return null;
+ }
+ }
+
+ public Gee.Collection<BackingPhotoRow>? get_raw_development_photo_rows() {
+ lock (row) {
+ return developments != null ? developments.values : null;
+ }
+ }
+
+ public BackingPhotoRow? get_raw_development_photo_row(RawDeveloper d) {
+ lock (row) {
+ return developments != null ? developments.get(d) : null;
+ }
+ }
+
+ public PhotoFileFormat? get_editable_file_format() {
+ PhotoFileReader? reader = get_editable_reader();
+ if (reader == null)
+ return null;
+
+ // ternary operator doesn't work here
+ return reader.get_file_format();
+ }
+
+ public PhotoFileFormat get_export_format_for_parameters(ExportFormatParameters params) {
+ PhotoFileFormat result = PhotoFileFormat.get_system_default_format();
+
+ switch (params.mode) {
+ case ExportFormatMode.UNMODIFIED:
+ result = get_master_file_format();
+ break;
+
+ case ExportFormatMode.CURRENT:
+ result = get_best_export_file_format();
+ break;
+
+ case ExportFormatMode.SPECIFIED:
+ result = params.specified_format;
+ break;
+
+ default:
+ error("get_export_format_for_parameters: unsupported export format mode");
+ }
+
+ return result;
+ }
+
+ public string get_export_basename_for_parameters(ExportFormatParameters params) {
+ string? result = null;
+
+ switch (params.mode) {
+ case ExportFormatMode.UNMODIFIED:
+ result = get_master_file().get_basename();
+ break;
+
+ case ExportFormatMode.CURRENT:
+ case ExportFormatMode.SPECIFIED:
+ return get_export_basename(get_export_format_for_parameters(params));
+
+ default:
+ error("get_export_basename_for_parameters: unsupported export format mode");
+ }
+
+ assert (result != null);
+ return result;
+ }
+
+ // This method interrogates the specified file and returns a PhotoRow with all relevant
+ // information about it. It uses the PhotoFileInterrogator to do so. The caller should create
+ // a PhotoFileInterrogator with the proper options prior to calling. prepare_for_import()
+ // will determine what's been discovered and fill out in the PhotoRow or return the relevant
+ // objects and information. If Thumbnails is not null, thumbnails suitable for caching or
+ // framing will be returned as well. Note that this method will call interrogate() and
+ // perform all error-handling; the caller simply needs to construct the object.
+ //
+ // This is the acid-test; if unable to generate a pixbuf or thumbnails, that indicates the
+ // photo itself is bogus and should be discarded.
+ //
+ // NOTE: This method is thread-safe.
+ public static ImportResult prepare_for_import(PhotoImportParams params) {
+#if MEASURE_IMPORT
+ Timer total_time = new Timer();
+#endif
+ File file = params.file;
+
+ FileInfo info = null;
+ try {
+ info = file.query_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ } catch (Error err) {
+ return ImportResult.FILE_ERROR;
+ }
+
+ if (info.get_file_type() != FileType.REGULAR)
+ return ImportResult.NOT_A_FILE;
+
+ if (!is_file_image(file)) {
+ message("Not importing %s: Not an image file", file.get_path());
+
+ return ImportResult.NOT_AN_IMAGE;
+ }
+
+ if (!PhotoFileFormat.is_file_supported(file)) {
+ message("Not importing %s: Unsupported extension", file.get_path());
+
+ return ImportResult.UNSUPPORTED_FORMAT;
+ }
+
+ TimeVal timestamp = info.get_modification_time();
+
+ // if all MD5s supplied, don't sniff for them
+ if (params.exif_md5 != null && params.thumbnail_md5 != null && params.full_md5 != null)
+ params.sniffer_options |= PhotoFileSniffer.Options.NO_MD5;
+
+ // interrogate file for photo information
+ PhotoFileInterrogator interrogator = new PhotoFileInterrogator(file, params.sniffer_options);
+ try {
+ interrogator.interrogate();
+ } catch (Error err) {
+ warning("Unable to interrogate photo file %s: %s", file.get_path(), err.message);
+
+ return ImportResult.DECODE_ERROR;
+ }
+
+ // if not detected photo information, unsupported
+ DetectedPhotoInformation? detected = interrogator.get_detected_photo_information();
+ if (detected == null)
+ return ImportResult.UNSUPPORTED_FORMAT;
+
+ // copy over supplied MD5s if provided
+ if ((params.sniffer_options & PhotoFileSniffer.Options.NO_MD5) != 0) {
+ detected.exif_md5 = params.exif_md5;
+ detected.thumbnail_md5 = params.thumbnail_md5;
+ detected.md5 = params.full_md5;
+ }
+
+ Orientation orientation = Orientation.TOP_LEFT;
+ time_t exposure_time = 0;
+ string title = "";
+ string comment = "";
+ Rating rating = Rating.UNRATED;
+
+#if TRACE_MD5
+ debug("importing MD5 %s: exif=%s preview=%s full=%s", file.get_path(), detected.exif_md5,
+ detected.thumbnail_md5, detected.md5);
+#endif
+
+ if (detected.metadata != null) {
+ MetadataDateTime? date_time = detected.metadata.get_exposure_date_time();
+ if (date_time != null)
+ exposure_time = date_time.get_timestamp();
+
+ orientation = detected.metadata.get_orientation();
+ title = detected.metadata.get_title();
+ comment = detected.metadata.get_comment();
+ params.keywords = detected.metadata.get_keywords();
+ rating = detected.metadata.get_rating();
+ }
+
+ // verify basic mechanics of photo: RGB 8-bit encoding
+ if (detected.colorspace != Gdk.Colorspace.RGB
+ || detected.channels < 3
+ || detected.bits_per_channel != 8) {
+ message("Not importing %s: Unsupported color format", file.get_path());
+
+ return ImportResult.UNSUPPORTED_FORMAT;
+ }
+
+ // photo information is initially stored in database in raw, non-modified format ... this is
+ // especially important dealing with dimensions and orientation ... Don't trust EXIF
+ // dimensions, they can lie or not be present
+ params.row.photo_id = PhotoID();
+ params.row.master.filepath = file.get_path();
+ params.row.master.dim = detected.image_dim;
+ params.row.master.filesize = info.get_size();
+ params.row.master.timestamp = timestamp.tv_sec;
+ params.row.exposure_time = exposure_time;
+ params.row.orientation = orientation;
+ params.row.master.original_orientation = orientation;
+ params.row.import_id = params.import_id;
+ params.row.event_id = EventID();
+ params.row.transformations = null;
+ params.row.md5 = detected.md5;
+ params.row.thumbnail_md5 = detected.thumbnail_md5;
+ params.row.exif_md5 = detected.exif_md5;
+ params.row.time_created = 0;
+ params.row.flags = 0;
+ params.row.master.file_format = detected.file_format;
+ params.row.title = title;
+ params.row.comment = comment;
+ params.row.rating = rating;
+
+ if (params.thumbnails != null) {
+ PhotoFileReader reader = params.row.master.file_format.create_reader(
+ params.row.master.filepath);
+ try {
+ ThumbnailCache.generate_for_photo(params.thumbnails, reader, params.row.orientation,
+ params.row.master.dim);
+ } catch (Error err) {
+ return ImportResult.convert_error(err, ImportResult.FILE_ERROR);
+ }
+ }
+
+#if MEASURE_IMPORT
+ debug("IMPORT: total=%lf", total_time.elapsed());
+#endif
+ return ImportResult.SUCCESS;
+ }
+
+ public static void create_pre_import(PhotoImportParams params) {
+ File file = params.file;
+ params.row.photo_id = PhotoID();
+ params.row.master.filepath = file.get_path();
+ params.row.master.dim = Dimensions(0,0);
+ params.row.master.filesize = 0;
+ params.row.master.timestamp = 0;
+ params.row.exposure_time = 0;
+ params.row.orientation = Orientation.TOP_LEFT;
+ params.row.master.original_orientation = Orientation.TOP_LEFT;
+ params.row.import_id = params.import_id;
+ params.row.event_id = EventID();
+ params.row.transformations = null;
+ params.row.md5 = null;
+ params.row.thumbnail_md5 = null;
+ params.row.exif_md5 = null;
+ params.row.time_created = 0;
+ params.row.flags = 0;
+ params.row.master.file_format = PhotoFileFormat.JFIF;
+ params.row.title = null;
+ params.row.comment = null;
+ params.row.rating = Rating.UNRATED;
+
+ PhotoFileInterrogator interrogator = new PhotoFileInterrogator(params.file, params.sniffer_options);
+ try {
+ interrogator.interrogate();
+ DetectedPhotoInformation? detected = interrogator.get_detected_photo_information();
+ if (detected != null)
+ params.row.master.file_format = detected.file_format;
+ } catch (Error err) {
+ debug("Unable to interrogate photo file %s: %s", file.get_path(), err.message);
+ }
+ }
+
+ protected BackingPhotoRow? query_backing_photo_row(File file, PhotoFileSniffer.Options options,
+ out DetectedPhotoInformation detected) throws Error {
+ detected = null;
+
+ BackingPhotoRow backing = new BackingPhotoRow();
+ // get basic file information
+ FileInfo info = null;
+ try {
+ info = file.query_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ } catch (Error err) {
+ critical("Unable to read file information for %s: %s", file.get_path(), err.message);
+
+ return null;
+ }
+
+ // sniff photo information
+ PhotoFileInterrogator interrogator = new PhotoFileInterrogator(file, options);
+ interrogator.interrogate();
+ detected = interrogator.get_detected_photo_information();
+ if (detected == null) {
+ critical("Photo update: %s no longer a recognized image", to_string());
+
+ return null;
+ }
+
+ TimeVal modification_time = info.get_modification_time();
+
+ backing.filepath = file.get_path();
+ backing.timestamp = modification_time.tv_sec;
+ backing.filesize = info.get_size();
+ backing.file_format = detected.file_format;
+ backing.dim = detected.image_dim;
+ backing.original_orientation = detected.metadata != null
+ ? detected.metadata.get_orientation() : Orientation.TOP_LEFT;
+
+ return backing;
+ }
+
+ public abstract class ReimportMasterState {
+ }
+
+ private class ReimportMasterStateImpl : ReimportMasterState {
+ public PhotoRow row = new PhotoRow();
+ public PhotoMetadata? metadata;
+ public string[] alterations;
+ public bool metadata_only = false;
+
+ public ReimportMasterStateImpl(PhotoRow row, PhotoMetadata? metadata, string[] alterations) {
+ this.row = row;
+ this.metadata = metadata;
+ this.alterations = alterations;
+ }
+ }
+
+ public abstract class ReimportEditableState {
+ }
+
+ private class ReimportEditableStateImpl : ReimportEditableState {
+ public BackingPhotoRow backing_state = new BackingPhotoRow();
+ public PhotoMetadata? metadata;
+ public bool metadata_only = false;
+
+ public ReimportEditableStateImpl(BackingPhotoRow backing_state, PhotoMetadata? metadata) {
+ this.backing_state = backing_state;
+ this.metadata = metadata;
+ }
+ }
+
+ public abstract class ReimportRawDevelopmentState {
+ }
+
+ private class ReimportRawDevelopmentStateImpl : ReimportRawDevelopmentState {
+ public class DevToReimport {
+ public BackingPhotoRow backing = new BackingPhotoRow();
+ public PhotoMetadata? metadata;
+
+ public DevToReimport(BackingPhotoRow backing, PhotoMetadata? metadata) {
+ this.backing = backing;
+ this.metadata = metadata;
+ }
+ }
+
+ public Gee.Collection<DevToReimport> list = new Gee.ArrayList<DevToReimport>();
+ public bool metadata_only = false;
+
+ public ReimportRawDevelopmentStateImpl() {
+ }
+
+ public void add(BackingPhotoRow backing, PhotoMetadata? metadata) {
+ list.add(new DevToReimport(backing, metadata));
+ }
+
+ public int get_size() {
+ return list.size;
+ }
+ }
+
+ // This method is thread-safe. If returns false the photo should be marked offline (in the
+ // main UI thread).
+ public bool prepare_for_reimport_master(out ReimportMasterState reimport_state) throws Error {
+ reimport_state = null;
+
+ File file = get_master_reader().get_file();
+
+ DetectedPhotoInformation detected;
+ BackingPhotoRow? backing = query_backing_photo_row(file, PhotoFileSniffer.Options.GET_ALL,
+ out detected);
+ if (backing == null) {
+ warning("Unable to retrieve photo state from %s for reimport", file.get_path());
+ return false;
+ }
+
+ // verify basic mechanics of photo: RGB 8-bit encoding
+ if (detected.colorspace != Gdk.Colorspace.RGB
+ || detected.channels < 3
+ || detected.bits_per_channel != 8) {
+ warning("Not re-importing %s: Unsupported color format", file.get_path());
+
+ return false;
+ }
+
+ // start with existing row and update appropriate fields
+ PhotoRow updated_row = new PhotoRow();
+ lock (row) {
+ updated_row = row;
+ }
+
+ // build an Alteration list for the relevant changes
+ string[] list = new string[0];
+
+ if (updated_row.md5 != detected.md5)
+ list += "metadata:md5";
+
+ if (updated_row.master.original_orientation != backing.original_orientation) {
+ list += "image:orientation";
+ updated_row.master.original_orientation = backing.original_orientation;
+ }
+
+ if (detected.metadata != null) {
+ MetadataDateTime? date_time = detected.metadata.get_exposure_date_time();
+ if (date_time != null && updated_row.exposure_time != date_time.get_timestamp())
+ list += "metadata:exposure-time";
+
+ if (updated_row.title != detected.metadata.get_title())
+ list += "metadata:name";
+
+ if (updated_row.comment != detected.metadata.get_comment())
+ list += "metadata:comment";
+
+ if (updated_row.rating != detected.metadata.get_rating())
+ list += "metadata:rating";
+ }
+
+ updated_row.master = backing;
+ updated_row.md5 = detected.md5;
+ updated_row.exif_md5 = detected.exif_md5;
+ updated_row.thumbnail_md5 = detected.thumbnail_md5;
+
+ PhotoMetadata? metadata = null;
+ if (detected.metadata != null) {
+ metadata = detected.metadata;
+
+ MetadataDateTime? date_time = detected.metadata.get_exposure_date_time();
+ if (date_time != null)
+ updated_row.exposure_time = date_time.get_timestamp();
+
+ updated_row.title = detected.metadata.get_title();
+ updated_row.comment = detected.metadata.get_comment();
+ updated_row.rating = detected.metadata.get_rating();
+ }
+
+ reimport_state = new ReimportMasterStateImpl(updated_row, metadata, list);
+
+ return true;
+ }
+
+ protected abstract void apply_user_metadata_for_reimport(PhotoMetadata metadata);
+
+ // This method is not thread-safe and should be called in the main thread.
+ public void finish_reimport_master(ReimportMasterState state) throws DatabaseError {
+ ReimportMasterStateImpl reimport_state = (ReimportMasterStateImpl) state;
+
+ PhotoTable.get_instance().reimport(reimport_state.row);
+
+ lock (row) {
+ // Copy row while preserving reference to master.
+ BackingPhotoRow original_master = row.master;
+ row = reimport_state.row;
+ row.master = original_master;
+ row.master.copy_from(reimport_state.row.master);
+ if (!reimport_state.metadata_only)
+ internal_remove_all_transformations(false);
+ }
+
+ if (reimport_state.metadata != null)
+ apply_user_metadata_for_reimport(reimport_state.metadata);
+
+ if (!reimport_state.metadata_only) {
+ reimport_state.alterations += "image:master";
+ if (is_master_baseline())
+ reimport_state.alterations += "image:baseline";
+ }
+
+ if (reimport_state.alterations.length > 0)
+ notify_altered(new Alteration.from_array(reimport_state.alterations));
+
+ notify_master_reimported(reimport_state.metadata);
+
+ if (is_master_baseline())
+ notify_baseline_reimported(reimport_state.metadata);
+
+ if (is_master_source())
+ notify_source_reimported(reimport_state.metadata);
+ }
+
+ // Verifies a file for reimport. Returns the file's detected photo info.
+ private bool verify_file_for_reimport(File file, out BackingPhotoRow backing,
+ out DetectedPhotoInformation detected) throws Error {
+ backing = query_backing_photo_row(file, PhotoFileSniffer.Options.NO_MD5,
+ out detected);
+ if (backing == null) {
+ return false;
+ }
+
+ // verify basic mechanics of photo: RGB 8-bit encoding
+ if (detected.colorspace != Gdk.Colorspace.RGB
+ || detected.channels < 3
+ || detected.bits_per_channel != 8) {
+ warning("Not re-importing %s: Unsupported color format", file.get_path());
+
+ return false;
+ }
+
+ return true;
+ }
+
+ // This method is thread-safe. Returns false if the photo has no associated editable.
+ public bool prepare_for_reimport_editable(out ReimportEditableState state) throws Error {
+ state = null;
+
+ File? file = get_editable_file();
+ if (file == null)
+ return false;
+
+ DetectedPhotoInformation detected;
+ BackingPhotoRow backing;
+ if (!verify_file_for_reimport(file, out backing, out detected))
+ return false;
+
+ state = new ReimportEditableStateImpl(backing, detected.metadata);
+
+ return true;
+ }
+
+ // This method is not thread-safe. It should be called by the main thread.
+ public void finish_reimport_editable(ReimportEditableState state) throws DatabaseError {
+ BackingPhotoID editable_id = get_editable_id();
+ if (editable_id.is_invalid())
+ return;
+
+ ReimportEditableStateImpl reimport_state = (ReimportEditableStateImpl) state;
+
+ if (!reimport_state.metadata_only) {
+ BackingPhotoTable.get_instance().update(reimport_state.backing_state);
+
+ lock (row) {
+ editable = reimport_state.backing_state;
+ set_orientation(reimport_state.backing_state.original_orientation);
+ internal_remove_all_transformations(false);
+ }
+ } else {
+ set_orientation(reimport_state.backing_state.original_orientation);
+ }
+
+ if (reimport_state.metadata != null) {
+ set_title(reimport_state.metadata.get_title());
+ set_comment(reimport_state.metadata.get_comment());
+ set_rating(reimport_state.metadata.get_rating());
+ apply_user_metadata_for_reimport(reimport_state.metadata);
+ }
+
+ string list = "metadata:name,image:orientation,metadata:rating,metadata:exposure-time";
+ if (!reimport_state.metadata_only)
+ list += "image:editable,image:baseline";
+
+ notify_altered(new Alteration.from_list(list));
+
+ notify_editable_reimported(reimport_state.metadata);
+
+ if (is_editable_baseline())
+ notify_baseline_reimported(reimport_state.metadata);
+
+ if (is_editable_source())
+ notify_source_reimported(reimport_state.metadata);
+ }
+
+ // This method is thread-safe. Returns false if the photo has no associated RAW developments.
+ public bool prepare_for_reimport_raw_development(out ReimportRawDevelopmentState state) throws Error {
+ state = null;
+
+ Gee.Collection<File>? files = get_raw_developer_files();
+ if (files == null)
+ return false;
+
+ ReimportRawDevelopmentStateImpl reimport_state = new ReimportRawDevelopmentStateImpl();
+
+ foreach (File file in files) {
+ DetectedPhotoInformation detected;
+ BackingPhotoRow backing;
+ if (!verify_file_for_reimport(file, out backing, out detected))
+ continue;
+
+ reimport_state.add(backing, detected.metadata);
+ }
+
+ state = reimport_state;
+ return reimport_state.get_size() > 0;
+ }
+
+ // This method is not thread-safe. It should be called by the main thread.
+ public void finish_reimport_raw_development(ReimportRawDevelopmentState state) throws DatabaseError {
+ if (this.get_master_file_format() != PhotoFileFormat.RAW)
+ return;
+
+ ReimportRawDevelopmentStateImpl reimport_state = (ReimportRawDevelopmentStateImpl) state;
+
+ foreach (ReimportRawDevelopmentStateImpl.DevToReimport dev in reimport_state.list) {
+ if (!reimport_state.metadata_only) {
+ BackingPhotoTable.get_instance().update(dev.backing);
+
+ lock (row) {
+ // Refresh raw developments.
+ foreach (RawDeveloper d in RawDeveloper.as_array()) {
+ BackingPhotoID id = row.development_ids[d];
+ if (id.id != BackingPhotoID.INVALID) {
+ BackingPhotoRow? bpr = get_backing_row(id);
+ if (bpr != null)
+ developments.set(d, bpr);
+ }
+ }
+ }
+ }
+ }
+
+ string list = "metadata:name,image:orientation,metadata:rating,metadata:exposure-time";
+ if (!reimport_state.metadata_only)
+ list += "image:editable,image:baseline";
+
+ notify_altered(new Alteration.from_list(list));
+
+ notify_raw_development_modified();
+ }
+
+ public override string get_typename() {
+ return TYPENAME;
+ }
+
+ public override int64 get_instance_id() {
+ return get_photo_id().id;
+ }
+
+ public override string get_source_id() {
+ // Because of historical reasons, need to format Photo's source ID without a dash for
+ // ThumbnailCache. Note that any future routine designed to tear a source ID apart and
+ // locate by typename will need to account for this exception.
+ return ("%s%016" + int64.FORMAT_MODIFIER + "x").printf(get_typename(), get_instance_id());
+ }
+
+ // Use this only if the master file's modification time has been changed (i.e. touched)
+ public void set_master_timestamp(FileInfo info) {
+ TimeVal modification = info.get_modification_time();
+
+ try {
+ lock (row) {
+ if (row.master.timestamp == modification.tv_sec)
+ return;
+
+ PhotoTable.get_instance().update_timestamp(row.photo_id, modification.tv_sec);
+ row.master.timestamp = modification.tv_sec;
+ }
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+
+ return;
+ }
+
+ if (is_master_baseline())
+ notify_altered(new Alteration.from_list("metadata:master-timestamp,metadata:baseline-timestamp"));
+ else
+ notify_altered(new Alteration("metadata", "master-timestamp"));
+ }
+
+ // Use this only if the editable file's modification time has been changed (i.e. touched)
+ public void update_editable_modification_time(FileInfo info) throws DatabaseError {
+ TimeVal modification = info.get_modification_time();
+
+ bool altered = false;
+ lock (row) {
+ if (row.editable_id.is_valid() && editable.timestamp != modification.tv_sec) {
+ BackingPhotoTable.get_instance().update_timestamp(row.editable_id,
+ modification.tv_sec);
+ editable.timestamp = modification.tv_sec;
+ altered = true;
+ }
+ }
+
+ if (altered)
+ notify_altered(new Alteration.from_list("metadata:editable-timestamp,metadata:baseline-timestamp"));
+ }
+
+ // Most useful if the appropriate SourceCollection is frozen while calling this.
+ public static void update_many_editable_timestamps(Gee.Map<Photo, FileInfo> map)
+ throws DatabaseError {
+ DatabaseTable.begin_transaction();
+ foreach (Photo photo in map.keys)
+ photo.update_editable_modification_time(map.get(photo));
+ DatabaseTable.commit_transaction();
+ }
+
+ public override PhotoFileFormat get_preferred_thumbnail_format() {
+ return (get_file_format().can_write_image()) ? get_file_format() :
+ PhotoFileFormat.get_system_default_format();
+ }
+
+ public override Gdk.Pixbuf? create_thumbnail(int scale) throws Error {
+ return get_pixbuf(Scaling.for_best_fit(scale, true));
+ }
+
+ public static bool is_file_image(File file) {
+ // if it's a supported image file, by definition it's an image file, otherwise check the
+ // master list of common image extensions (checking this way allows for extensions to be
+ // added to various PhotoFileFormats without having to also add them to IMAGE_EXTENSIONS)
+ return PhotoFileFormat.is_file_supported(file)
+ ? true : is_extension_found(file.get_basename(), IMAGE_EXTENSIONS);
+ }
+
+ private static bool is_extension_found(string basename, string[] extensions) {
+ string name, ext;
+ disassemble_filename(basename, out name, out ext);
+ if (ext == null)
+ return false;
+
+ // treat extensions as case-insensitive
+ ext = ext.down();
+
+ // search supported list
+ foreach (string extension in extensions) {
+ if (ext == extension)
+ return true;
+ }
+
+ return false;
+ }
+
+ // This is not thread-safe. Obviously, at least one field must be non-null for this to be
+ // effective, although there is no guarantee that any one will be sufficient. file_format
+ // should be UNKNOWN if not to require matching file formats.
+ public static bool is_duplicate(File? file, string? thumbnail_md5, string? full_md5,
+ PhotoFileFormat file_format) {
+#if !NO_DUPE_DETECTION
+ return PhotoTable.get_instance().has_duplicate(file, thumbnail_md5, full_md5, file_format);
+#else
+ return false;
+#endif
+ }
+
+ protected static PhotoID[]? get_duplicate_ids(File? file, string? thumbnail_md5, string? full_md5,
+ PhotoFileFormat file_format) {
+#if !NO_DUPE_DETECTION
+ return PhotoTable.get_instance().get_duplicate_ids(file, thumbnail_md5, full_md5, file_format);
+#else
+ return null;
+#endif
+ }
+
+ // Conforms to GetDatabaseSourceKey
+ public static int64 get_photo_key(DataSource source) {
+ return ((LibraryPhoto) source).get_photo_id().id;
+ }
+
+ // Data element accessors ... by making these thread-safe, and by the remainder of this class
+ // (and subclasses) accessing row *only* through these, helps ensure this object is suitable
+ // for threads. This implementation is specifically for PixbufCache to work properly.
+ //
+ // Much of the setter's thread-safety (especially in regard to writing to the database) is
+ // that there is a single Photo object per row of the database. The PhotoTable is accessed
+ // elsewhere in the system (usually for aggregate and search functions). Those would need to
+ // be factored and locked in order to guarantee full thread safety.
+ //
+ // Also note there is a certain amount of paranoia here. Many of PhotoRow's elements are
+ // currently static, with no setters to change them. However, since some of these may become
+ // mutable in the future, the entire structure is locked. If performance becomes an issue,
+ // more fine-tuned locking may be implemented -- another reason to *only* use these getters
+ // and setters inside this class.
+
+ public override File get_file() {
+ return get_source_reader().get_file();
+ }
+
+ // This should only be used when the photo's master backing file has been renamed; if it's been
+ // altered, use update().
+ public void set_master_file(File file) {
+ string filepath = file.get_path();
+
+ bool altered = false;
+ bool is_baseline = false;
+ bool is_source = false;
+ bool name_changed = false;
+ File? old_file = null;
+ try {
+ lock (row) {
+ lock (readers) {
+ old_file = readers.master.get_file();
+ if (!file.equal(old_file)) {
+ PhotoTable.get_instance().set_filepath(get_photo_id(), filepath);
+
+ row.master.filepath = filepath;
+ file_title = file.get_basename();
+ readers.master = row.master.file_format.create_reader(filepath);
+
+ altered = true;
+ is_baseline = is_master_baseline();
+ is_source = is_master_source();
+ name_changed = is_string_empty(row.title)
+ && old_file.get_basename() != file.get_basename();
+ }
+ }
+ }
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ if (altered) {
+ notify_master_replaced(old_file, file);
+
+ if (is_baseline)
+ notify_baseline_replaced();
+
+ string[] alteration_list = new string[0];
+ alteration_list += "backing:master";
+
+ // because the name of the photo is determined by its file title if no user title is present,
+ // signal metadata has altered
+ if (name_changed)
+ alteration_list += "metadata:name";
+
+ if (is_source)
+ alteration_list += "backing:source";
+
+ if (is_baseline)
+ alteration_list += "backing:baseline";
+
+ notify_altered(new Alteration.from_array(alteration_list));
+ }
+ }
+
+ // This should only be used when the photo's editable file has been renamed. If it's been
+ // altered, use update(). DO NOT USE THIS TO ATTACH A NEW EDITABLE FILE TO THE PHOTO.
+ public void set_editable_file(File file) {
+ string filepath = file.get_path();
+
+ bool altered = false;
+ bool is_baseline = false;
+ bool is_source = false;
+ File? old_file = null;
+ try {
+ lock (row) {
+ lock (readers) {
+ old_file = (readers.editable != null) ? readers.editable.get_file() : null;
+ if (old_file != null && !old_file.equal(file)) {
+ BackingPhotoTable.get_instance().set_filepath(row.editable_id, filepath);
+
+ editable.filepath = filepath;
+ readers.editable = editable.file_format.create_reader(filepath);
+
+ altered = true;
+ is_baseline = is_editable_baseline();
+ is_source = is_editable_source();
+ }
+ }
+ }
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ if (altered) {
+ notify_editable_replaced(old_file, file);
+
+ if (is_baseline)
+ notify_baseline_replaced();
+
+ string[] alteration_list = new string[0];
+ alteration_list += "backing:editable";
+
+ if (is_baseline)
+ alteration_list += "backing:baseline";
+
+ if (is_source)
+ alteration_list += "backing:source";
+
+ notify_altered(new Alteration.from_array(alteration_list));
+ }
+ }
+
+ // Also makes sense to freeze the SourceCollection during this operation.
+ public static void set_many_editable_file(Gee.Map<Photo, File> map) throws DatabaseError {
+ DatabaseTable.begin_transaction();
+
+ Gee.MapIterator<Photo, File> map_iter = map.map_iterator();
+ while (map_iter.next())
+ map_iter.get_key().set_editable_file(map_iter.get_value());
+
+ DatabaseTable.commit_transaction();
+ }
+
+ // Returns the file generating pixbufs, that is, the baseline if present, the backing
+ // file if not.
+ public File get_actual_file() {
+ return get_baseline_reader().get_file();
+ }
+
+ public override File get_master_file() {
+ return get_master_reader().get_file();
+ }
+
+ public File? get_editable_file() {
+ PhotoFileReader? reader = get_editable_reader();
+
+ return reader != null ? reader.get_file() : null;
+ }
+
+ public Gee.Collection<File>? get_raw_developer_files() {
+ if (get_master_file_format() != PhotoFileFormat.RAW)
+ return null;
+
+ Gee.ArrayList<File> ret = new Gee.ArrayList<File>();
+ lock (row) {
+ foreach (BackingPhotoRow row in developments.values)
+ ret.add(File.new_for_path(row.filepath));
+ }
+
+ return ret;
+ }
+
+ public File get_source_file() {
+ return get_source_reader().get_file();
+ }
+
+ public PhotoFileFormat get_file_format() {
+ lock (row) {
+ return backing_photo_row.file_format;
+ }
+ }
+
+ public PhotoFileFormat get_best_export_file_format() {
+ PhotoFileFormat file_format = get_file_format();
+ if (!file_format.can_write())
+ file_format = PhotoFileFormat.get_system_default_format();
+
+ return file_format;
+ }
+
+ public PhotoFileFormat get_master_file_format() {
+ lock (row) {
+ return readers.master.get_file_format();
+ }
+ }
+
+ public override time_t get_timestamp() {
+ lock (row) {
+ return backing_photo_row.timestamp;
+ }
+ }
+
+ public PhotoID get_photo_id() {
+ lock (row) {
+ return row.photo_id;
+ }
+ }
+
+ // This is NOT thread-safe.
+ public override inline EventID get_event_id() {
+ return row.event_id;
+ }
+
+ // This is NOT thread-safe.
+ public inline int64 get_raw_event_id() {
+ return row.event_id.id;
+ }
+
+ public override ImportID get_import_id() {
+ lock (row) {
+ return row.import_id;
+ }
+ }
+
+ protected BackingPhotoID get_editable_id() {
+ lock (row) {
+ return row.editable_id;
+ }
+ }
+
+ public override string get_master_md5() {
+ lock (row) {
+ return row.md5;
+ }
+ }
+
+ // Flags' meanings are determined by subclasses. Top 16 flags (0xFFFF000000000000) reserved
+ // for Photo.
+ public uint64 get_flags() {
+ lock (row) {
+ return row.flags;
+ }
+ }
+
+ private void notify_flags_altered(Alteration? additional_alteration) {
+ Alteration alteration = new Alteration("metadata", "flags");
+ if (additional_alteration != null)
+ alteration = alteration.compress(additional_alteration);
+
+ notify_altered(alteration);
+ }
+
+ public uint64 replace_flags(uint64 flags, Alteration? additional_alteration = null) {
+ bool committed;
+ lock (row) {
+ committed = PhotoTable.get_instance().replace_flags(get_photo_id(), flags);
+ if (committed)
+ row.flags = flags;
+ }
+
+ if (committed)
+ notify_flags_altered(additional_alteration);
+
+ return flags;
+ }
+
+ public bool is_flag_set(uint64 mask) {
+ lock (row) {
+ return internal_is_flag_set(row.flags, mask);
+ }
+ }
+
+ public uint64 add_flags(uint64 mask, Alteration? additional_alteration = null) {
+ uint64 flags = 0;
+
+ bool committed = false;
+ lock (row) {
+ flags = internal_add_flags(row.flags, mask);
+ if (row.flags != flags) {
+ committed = PhotoTable.get_instance().replace_flags(get_photo_id(), flags);
+ if (committed)
+ row.flags = flags;
+ }
+ }
+
+ if (committed)
+ notify_flags_altered(additional_alteration);
+
+ return flags;
+ }
+
+ public uint64 remove_flags(uint64 mask, Alteration? additional_alteration = null) {
+ uint64 flags = 0;
+
+ bool committed = false;
+ lock (row) {
+ flags = internal_remove_flags(row.flags, mask);
+ if (row.flags != flags) {
+ committed = PhotoTable.get_instance().replace_flags(get_photo_id(), flags);
+ if (committed)
+ row.flags = flags;
+ }
+ }
+
+ if (committed)
+ notify_flags_altered(additional_alteration);
+
+ return flags;
+ }
+
+ public uint64 add_remove_flags(uint64 add, uint64 remove, Alteration? additional_alteration = null) {
+ uint64 flags = 0;
+
+ bool committed = false;
+ lock (row) {
+ flags = (row.flags | add) & ~remove;
+ if (row.flags != flags) {
+ committed = PhotoTable.get_instance().replace_flags(get_photo_id(), flags);
+ if (committed)
+ row.flags = flags;
+ }
+ }
+
+ if (committed)
+ notify_flags_altered(additional_alteration);
+
+ return flags;
+ }
+
+ public static void add_remove_many_flags(Gee.Collection<Photo>? add, uint64 add_mask,
+ Alteration? additional_add_alteration, Gee.Collection<Photo>? remove, uint64 remove_mask,
+ Alteration? additional_remove_alteration) throws DatabaseError {
+ DatabaseTable.begin_transaction();
+
+ if (add != null) {
+ foreach (Photo photo in add)
+ photo.add_flags(add_mask, additional_add_alteration);
+ }
+
+ if (remove != null) {
+ foreach (Photo photo in remove)
+ photo.remove_flags(remove_mask, additional_remove_alteration);
+ }
+
+ DatabaseTable.commit_transaction();
+ }
+
+ public uint64 toggle_flags(uint64 mask, Alteration? additional_alteration = null) {
+ uint64 flags = 0;
+
+ bool committed = false;
+ lock (row) {
+ flags = row.flags ^ mask;
+ if (row.flags != flags) {
+ committed = PhotoTable.get_instance().replace_flags(get_photo_id(), flags);
+ if (committed)
+ row.flags = flags;
+ }
+ }
+
+ if (committed)
+ notify_flags_altered(additional_alteration);
+
+ return flags;
+ }
+
+ public bool is_master_metadata_dirty() {
+ lock (row) {
+ return row.metadata_dirty;
+ }
+ }
+
+ public void set_master_metadata_dirty(bool dirty) throws DatabaseError {
+ bool committed = false;
+ lock (row) {
+ if (row.metadata_dirty != dirty) {
+ PhotoTable.get_instance().set_metadata_dirty(get_photo_id(), dirty);
+ row.metadata_dirty = dirty;
+ committed = true;
+ }
+ }
+
+ if (committed)
+ notify_altered(new Alteration("metadata", "master-dirty"));
+ }
+
+ public override Rating get_rating() {
+ lock (row) {
+ return row.rating;
+ }
+ }
+
+ public override void set_rating(Rating rating) {
+ bool committed = false;
+
+ lock (row) {
+ if (rating != row.rating && rating.is_valid()) {
+ committed = PhotoTable.get_instance().set_rating(get_photo_id(), rating);
+ if (committed)
+ row.rating = rating;
+ }
+ }
+
+ if (committed)
+ notify_altered(new Alteration("metadata", "rating"));
+ }
+
+ public override void increase_rating() {
+ lock (row) {
+ set_rating(row.rating.increase());
+ }
+ }
+
+ public override void decrease_rating() {
+ lock (row) {
+ set_rating(row.rating.decrease());
+ }
+ }
+
+ protected override void commit_backlinks(SourceCollection? sources, string? backlinks) {
+ // For now, only one link state may be stored in the database ... if this turns into a
+ // problem, will use SourceCollection to determine where to store it.
+
+ try {
+ PhotoTable.get_instance().update_backlinks(get_photo_id(), backlinks);
+ lock (row) {
+ row.backlinks = backlinks;
+ }
+ } catch (DatabaseError err) {
+ warning("Unable to update link state for %s: %s", to_string(), err.message);
+ }
+
+ // Note: *Not* firing altered or metadata_altered signal because link_state is not a
+ // property that's available to users of Photo. Persisting it as a mechanism for deaing
+ // with unlink/relink properly.
+ }
+
+ protected override bool set_event_id(EventID event_id) {
+ lock (row) {
+ bool committed = PhotoTable.get_instance().set_event(row.photo_id, event_id);
+
+ if (committed)
+ row.event_id = event_id;
+
+ return committed;
+ }
+ }
+
+ public override string to_string() {
+ return "[%s] %s%s".printf(get_photo_id().id.to_string(), get_master_reader().get_filepath(),
+ !is_master_baseline() ? " (" + get_actual_file().get_path() + ")" : "");
+ }
+
+ public override bool equals(DataSource? source) {
+ // Primary key is where the rubber hits the road
+ Photo? photo = source as Photo;
+ if (photo != null) {
+ PhotoID photo_id = get_photo_id();
+ PhotoID other_photo_id = photo.get_photo_id();
+
+ if (this != photo && photo_id.id != PhotoID.INVALID) {
+ assert(photo_id.id != other_photo_id.id);
+ }
+ }
+
+ return base.equals(source);
+ }
+
+ // used to update the database after an internal metadata exif write
+ private void file_exif_updated() {
+ File file = get_file();
+
+ FileInfo info = null;
+ try {
+ info = file.query_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ } catch (Error err) {
+ error("Unable to read file information for %s: %s", to_string(), err.message);
+ }
+
+ TimeVal timestamp = info.get_modification_time();
+
+ // interrogate file for photo information
+ PhotoFileInterrogator interrogator = new PhotoFileInterrogator(file);
+ try {
+ interrogator.interrogate();
+ } catch (Error err) {
+ warning("Unable to interrogate photo file %s: %s", file.get_path(), err.message);
+ }
+
+ DetectedPhotoInformation? detected = interrogator.get_detected_photo_information();
+ if (detected == null) {
+ critical("file_exif_updated: %s no longer an image", to_string());
+
+ return;
+ }
+
+ bool success;
+ lock (row) {
+ success = PhotoTable.get_instance().master_exif_updated(get_photo_id(), info.get_size(),
+ timestamp.tv_sec, detected.md5, detected.exif_md5, detected.thumbnail_md5, row);
+ }
+
+ if (success)
+ notify_altered(new Alteration.from_list("metadata:exif,metadata:md5"));
+ }
+
+ // PhotoSource
+
+ public override uint64 get_filesize() {
+ lock (row) {
+ return backing_photo_row.filesize;
+ }
+ }
+
+ public override uint64 get_master_filesize() {
+ lock (row) {
+ return row.master.filesize;
+ }
+ }
+
+ public uint64 get_editable_filesize() {
+ lock (row) {
+ return editable.filesize;
+ }
+ }
+
+ public override time_t get_exposure_time() {
+ return cached_exposure_time;
+ }
+
+ public override string get_basename() {
+ lock (row) {
+ return file_title;
+ }
+ }
+
+ public override string? get_title() {
+ lock (row) {
+ return row.title;
+ }
+ }
+
+ public override string? get_comment() {
+ lock (row) {
+ return row.comment;
+ }
+ }
+
+ public override void set_title(string? title) {
+ string? new_title = prep_title(title);
+
+ bool committed = false;
+ lock (row) {
+ if (new_title == row.title)
+ return;
+
+ committed = PhotoTable.get_instance().set_title(row.photo_id, new_title);
+ if (committed)
+ row.title = new_title;
+ }
+
+ if (committed)
+ notify_altered(new Alteration("metadata", "name"));
+ }
+
+ public override bool set_comment(string? comment) {
+ string? new_comment = prep_comment(comment);
+
+ bool committed = false;
+ lock (row) {
+ if (new_comment == row.comment)
+ return true;
+
+ committed = PhotoTable.get_instance().set_comment(row.photo_id, new_comment);
+ if (committed)
+ row.comment = new_comment;
+ }
+
+ if (committed)
+ notify_altered(new Alteration("metadata", "comment"));
+
+ return committed;
+ }
+
+ public void set_import_id(ImportID import_id) {
+ DatabaseError dberr = null;
+ lock (row) {
+ try {
+ PhotoTable.get_instance().set_import_id(row.photo_id, import_id);
+ row.import_id = import_id;
+ } catch (DatabaseError err) {
+ dberr = err;
+ }
+ }
+
+ if (dberr == null)
+ notify_altered(new Alteration("metadata", "import-id"));
+ else
+ warning("Unable to write import ID for %s: %s", to_string(), dberr.message);
+ }
+
+ public void set_title_persistent(string? title) throws Error {
+ PhotoFileReader source = get_source_reader();
+
+ // Try to write to backing file
+ if (!source.get_file_format().can_write_metadata()) {
+ warning("No photo file writer available for %s", source.get_filepath());
+
+ set_title(title);
+
+ return;
+ }
+
+ PhotoMetadata metadata = source.read_metadata();
+ metadata.set_title(title);
+
+ PhotoFileMetadataWriter writer = source.create_metadata_writer();
+ LibraryMonitor.blacklist_file(source.get_file(), "Photo.set_persistent_title");
+ try {
+ writer.write_metadata(metadata);
+ } finally {
+ LibraryMonitor.unblacklist_file(source.get_file());
+ }
+
+ set_title(title);
+
+ file_exif_updated();
+ }
+
+ public void set_comment_persistent(string? comment) throws Error {
+ PhotoFileReader source = get_source_reader();
+
+ // Try to write to backing file
+ if (!source.get_file_format().can_write_metadata()) {
+ warning("No photo file writer available for %s", source.get_filepath());
+
+ set_comment(comment);
+
+ return;
+ }
+
+ PhotoMetadata metadata = source.read_metadata();
+ metadata.set_comment(comment);
+
+ PhotoFileMetadataWriter writer = source.create_metadata_writer();
+ LibraryMonitor.blacklist_file(source.get_file(), "Photo.set_persistent_comment");
+ try {
+ writer.write_metadata(metadata);
+ } finally {
+ LibraryMonitor.unblacklist_file(source.get_file());
+ }
+
+ set_comment(comment);
+
+ file_exif_updated();
+ }
+
+ public void set_exposure_time(time_t time) {
+ bool committed;
+ lock (row) {
+ committed = PhotoTable.get_instance().set_exposure_time(row.photo_id, time);
+ if (committed) {
+ row.exposure_time = time;
+ cached_exposure_time = time;
+ }
+ }
+
+ if (committed)
+ notify_altered(new Alteration("metadata", "exposure-time"));
+ }
+
+ public void set_exposure_time_persistent(time_t time) throws Error {
+ PhotoFileReader source = get_source_reader();
+
+ // Try to write to backing file
+ if (!source.get_file_format().can_write_metadata()) {
+ warning("No photo file writer available for %s", source.get_filepath());
+
+ set_exposure_time(time);
+
+ return;
+ }
+
+ PhotoMetadata metadata = source.read_metadata();
+ metadata.set_exposure_date_time(new MetadataDateTime(time));
+
+ PhotoFileMetadataWriter writer = source.create_metadata_writer();
+ LibraryMonitor.blacklist_file(source.get_file(), "Photo.set_exposure_time_persistent");
+ try {
+ writer.write_metadata(metadata);
+ } finally {
+ LibraryMonitor.unblacklist_file(source.get_file());
+ }
+
+ set_exposure_time(time);
+
+ file_exif_updated();
+ }
+
+ /**
+ * @brief Returns the width and height of the Photo after various
+ * arbitrary stages of the pipeline have been applied in
+ * the same order they're applied in get_pixbuf_with_options.
+ * With no argument passed, it works exactly like the
+ * previous incarnation did.
+ *
+ * @param disallowed_steps Which pipeline steps should NOT
+ * be taken into account when computing image dimensions
+ * (matching the convention set by get_pixbuf_with_options()).
+ * Pipeline steps that do not affect the image geometry are
+ * ignored.
+ */
+ public override Dimensions get_dimensions(Exception disallowed_steps = Exception.NONE) {
+ // The raw dimensions of the incoming image prior to the pipeline.
+ Dimensions returned_dims = get_raw_dimensions();
+
+ // Compute how much the image would be resized by after rotating and/or mirroring.
+ if (disallowed_steps.allows(Exception.ORIENTATION)) {
+ Orientation ori_tmp = get_orientation();
+
+ // Is this image rotated 90 or 270 degrees?
+ switch (ori_tmp) {
+ case Orientation.LEFT_TOP:
+ case Orientation.RIGHT_TOP:
+ case Orientation.LEFT_BOTTOM:
+ case Orientation.RIGHT_BOTTOM:
+ // Yes, swap width and height of raw dimensions.
+ int width_tmp = returned_dims.width;
+
+ returned_dims.width = returned_dims.height;
+ returned_dims.height = width_tmp;
+ break;
+
+ default:
+ // No, only mirrored or rotated 180; do nothing.
+ break;
+ }
+ }
+
+ // Compute how much the image would be resized by after straightening.
+ if (disallowed_steps.allows(Exception.STRAIGHTEN)) {
+ double x_size, y_size;
+ double angle = 0.0;
+
+ get_straighten(out angle);
+
+ compute_arb_rotated_size(returned_dims.width, returned_dims.height, angle, out x_size, out y_size);
+
+ returned_dims.width = (int) (x_size);
+ returned_dims.height = (int) (y_size);
+ }
+
+ // Compute how much the image would be resized by after cropping.
+ if (disallowed_steps.allows(Exception.CROP)) {
+ Box crop;
+ if (get_crop(out crop, disallowed_steps)) {
+ returned_dims = crop.get_dimensions();
+ }
+ }
+ return returned_dims;
+ }
+
+ // This method *must* be called with row locked.
+ private void locked_create_adjustments_from_data() {
+ adjustments = new PixelTransformationBundle();
+
+ KeyValueMap map = get_transformation("adjustments");
+ if (map == null)
+ adjustments.set_to_identity();
+ else
+ adjustments.load(map);
+
+ transformer = adjustments.generate_transformer();
+ }
+
+ // Returns a copy of the color adjustments array. Use set_color_adjustments to persist.
+ public PixelTransformationBundle get_color_adjustments() {
+ lock (row) {
+ if (adjustments == null)
+ locked_create_adjustments_from_data();
+
+ return adjustments.copy();
+ }
+ }
+
+ public PixelTransformer get_pixel_transformer() {
+ lock (row) {
+ if (transformer == null)
+ locked_create_adjustments_from_data();
+
+ return transformer.copy();
+ }
+ }
+
+ public bool has_color_adjustments() {
+ return has_transformation("adjustments");
+ }
+
+ public PixelTransformation? get_color_adjustment(PixelTransformationType type) {
+ return get_color_adjustments().get_transformation(type);
+ }
+
+ public void set_color_adjustments(PixelTransformationBundle new_adjustments) {
+ /* if every transformation in 'new_adjustments' is the identity, then just remove all
+ adjustments from the database */
+ if (new_adjustments.is_identity()) {
+ bool result;
+ lock (row) {
+ result = remove_transformation("adjustments");
+ adjustments = null;
+ transformer = null;
+ }
+
+ if (result)
+ notify_altered(new Alteration("image", "color-adjustments"));
+
+ return;
+ }
+
+ // convert bundle to KeyValueMap, which can be saved in the database
+ KeyValueMap map = new_adjustments.save("adjustments");
+
+ bool committed;
+ lock (row) {
+ if (transformer == null || adjustments == null) {
+ // create new
+ adjustments = new_adjustments.copy();
+ transformer = new_adjustments.generate_transformer();
+ } else {
+ // replace existing
+ foreach (PixelTransformation transformation in new_adjustments.get_transformations()) {
+ transformer.replace_transformation(
+ adjustments.get_transformation(transformation.get_transformation_type()),
+ transformation);
+ }
+
+ adjustments = new_adjustments.copy();
+ }
+
+ committed = set_transformation(map);
+ }
+
+ if (committed)
+ notify_altered(new Alteration("image", "color-adjustments"));
+ }
+
+ // This is thread-safe. Returns the source file's metadata.
+ public override PhotoMetadata? get_metadata() {
+ try {
+ return get_source_reader().read_metadata();
+ } catch (Error err) {
+ warning("Unable to load metadata: %s", err.message);
+
+ return null;
+ }
+ }
+
+ public PhotoMetadata get_master_metadata() throws Error {
+ return get_master_reader().read_metadata();
+ }
+
+ public PhotoMetadata? get_editable_metadata() throws Error {
+ PhotoFileReader? reader = get_editable_reader();
+
+ return (reader != null) ? reader.read_metadata() : null;
+ }
+
+ // This is thread-safe. This must be followed by a call to finish_update_master_metadata() in
+ // the main thread. Returns false if unable to write metadata (because operation is
+ // unsupported) or the file is unavailable.
+ public bool persist_master_metadata(PhotoMetadata metadata, out ReimportMasterState state)
+ throws Error {
+ state = null;
+
+ PhotoFileReader master_reader = get_master_reader();
+
+ if (!master_reader.get_file_format().can_write_metadata())
+ return false;
+
+ master_reader.create_metadata_writer().write_metadata(metadata);
+
+ if (!prepare_for_reimport_master(out state))
+ return false;
+
+ ((ReimportMasterStateImpl) state).metadata_only = true;
+
+ return true;
+ }
+
+ public void finish_update_master_metadata(ReimportMasterState state) throws DatabaseError {
+ finish_reimport_master(state);
+ }
+
+ public bool persist_editable_metadata(PhotoMetadata metadata, out ReimportEditableState state)
+ throws Error {
+ state = null;
+
+ PhotoFileReader? editable_reader = get_editable_reader();
+ if (editable_reader == null)
+ return false;
+
+ if (!editable_reader.get_file_format().can_write_metadata())
+ return false;
+
+ editable_reader.create_metadata_writer().write_metadata(metadata);
+
+ if (!prepare_for_reimport_editable(out state))
+ return false;
+
+ ((ReimportEditableStateImpl) state).metadata_only = true;
+
+ return true;
+ }
+
+ public void finish_update_editable_metadata(ReimportEditableState state) throws DatabaseError {
+ finish_reimport_editable(state);
+ }
+
+ // Transformation storage and exporting
+
+ public Dimensions get_raw_dimensions() {
+ lock (row) {
+ return backing_photo_row.dim;
+ }
+ }
+
+ public bool has_transformations() {
+ lock (row) {
+ return (row.orientation != backing_photo_row.original_orientation)
+ ? true
+ : (row.transformations != null);
+ }
+ }
+
+ public bool only_metadata_changed() {
+ MetadataDateTime? date_time = null;
+
+ PhotoMetadata? metadata = get_metadata();
+ if (metadata != null)
+ date_time = metadata.get_exposure_date_time();
+
+ lock (row) {
+ return row.transformations == null
+ && (row.orientation != backing_photo_row.original_orientation
+ || (date_time != null && row.exposure_time != date_time.get_timestamp()));
+ }
+ }
+
+ public bool has_alterations() {
+ MetadataDateTime? date_time = null;
+ string? title = null;
+ string? comment = null;
+
+ PhotoMetadata? metadata = get_metadata();
+ if (metadata != null) {
+ date_time = metadata.get_exposure_date_time();
+ title = metadata.get_title();
+ comment = metadata.get_comment();
+ }
+
+ // Does this photo contain any date/time info?
+ if (date_time == null) {
+ // No, use file timestamp as date/time.
+ lock (row) {
+ // Did we manually set an exposure date?
+ if(backing_photo_row.timestamp != row.exposure_time) {
+ // Yes, we need to save this.
+ return true;
+ }
+ }
+ }
+
+ lock (row) {
+ return row.transformations != null
+ || row.orientation != backing_photo_row.original_orientation
+ || (date_time != null && row.exposure_time != date_time.get_timestamp())
+ || (get_comment() != comment)
+ || (get_title() != title);
+ }
+
+ }
+
+ public PhotoTransformationState save_transformation_state() {
+ lock (row) {
+ return new PhotoTransformationStateImpl(this, row.orientation,
+ row.transformations,
+ transformer != null ? transformer.copy() : null,
+ adjustments != null ? adjustments.copy() : null);
+ }
+ }
+
+ public bool load_transformation_state(PhotoTransformationState state) {
+ PhotoTransformationStateImpl state_impl = state as PhotoTransformationStateImpl;
+ if (state_impl == null)
+ return false;
+
+ Orientation saved_orientation = state_impl.get_orientation();
+ Gee.HashMap<string, KeyValueMap>? saved_transformations = state_impl.get_transformations();
+ PixelTransformer? saved_transformer = state_impl.get_transformer();
+ PixelTransformationBundle? saved_adjustments = state_impl.get_color_adjustments();
+
+ bool committed;
+ lock (row) {
+ committed = PhotoTable.get_instance().set_transformation_state(row.photo_id,
+ saved_orientation, saved_transformations);
+ if (committed) {
+ row.orientation = saved_orientation;
+ row.transformations = saved_transformations;
+ transformer = saved_transformer;
+ adjustments = saved_adjustments;
+ }
+ }
+
+ if (committed)
+ notify_altered(new Alteration("image", "transformation-state"));
+
+ return committed;
+ }
+
+ public void remove_all_transformations() {
+ internal_remove_all_transformations(true);
+ }
+
+ private void internal_remove_all_transformations(bool notify) {
+ bool is_altered = false;
+ lock (row) {
+ is_altered = PhotoTable.get_instance().remove_all_transformations(row.photo_id);
+ row.transformations = null;
+
+ transformer = null;
+ adjustments = null;
+
+ if (row.orientation != backing_photo_row.original_orientation) {
+ PhotoTable.get_instance().set_orientation(row.photo_id,
+ backing_photo_row.original_orientation);
+ row.orientation = backing_photo_row.original_orientation;
+ is_altered = true;
+ }
+ }
+
+ if (is_altered && notify)
+ notify_altered(new Alteration("image", "revert"));
+ }
+
+ public Orientation get_original_orientation() {
+ lock (row) {
+ return backing_photo_row.original_orientation;
+ }
+ }
+
+ public Orientation get_orientation() {
+ lock (row) {
+ return row.orientation;
+ }
+ }
+
+ public bool set_orientation(Orientation orientation) {
+ bool committed = false;
+ lock (row) {
+ if (row.orientation != orientation) {
+ committed = PhotoTable.get_instance().set_orientation(row.photo_id, orientation);
+ if (committed)
+ row.orientation = orientation;
+ }
+ }
+
+ if (committed)
+ notify_altered(new Alteration("image", "orientation"));
+
+ return committed;
+ }
+
+ public bool check_can_rotate() {
+ return can_rotate_now;
+ }
+
+ public virtual void rotate(Rotation rotation) {
+ lock (row) {
+ set_orientation(get_orientation().perform(rotation));
+ }
+ }
+
+ private bool has_transformation(string name) {
+ lock (row) {
+ return (row.transformations != null) ? row.transformations.has_key(name) : false;
+ }
+ }
+
+ // Note that obtaining the proper map is thread-safe here. The returned map is a copy of
+ // the original, so it is thread-safe as well. However: modifying the returned map
+ // does not modify the original; set_transformation() must be used.
+ private KeyValueMap? get_transformation(string name) {
+ KeyValueMap map = null;
+ lock (row) {
+ if (row.transformations != null) {
+ map = row.transformations.get(name);
+ if (map != null)
+ map = map.copy();
+ }
+ }
+
+ return map;
+ }
+
+ private bool set_transformation(KeyValueMap trans) {
+ lock (row) {
+ if (row.transformations == null)
+ row.transformations = new Gee.HashMap<string, KeyValueMap>();
+
+ row.transformations.set(trans.get_group(), trans);
+
+ return PhotoTable.get_instance().set_transformation(row.photo_id, trans);
+ }
+ }
+
+ private bool remove_transformation(string name) {
+ bool altered_cache, altered_persistent;
+ lock (row) {
+ if (row.transformations != null) {
+ altered_cache = row.transformations.unset(name);
+ if (row.transformations.size == 0)
+ row.transformations = null;
+ } else {
+ altered_cache = false;
+ }
+
+ altered_persistent = PhotoTable.get_instance().remove_transformation(row.photo_id,
+ name);
+ }
+
+ return (altered_cache || altered_persistent);
+ }
+
+ public bool has_crop() {
+ return has_transformation("crop");
+ }
+
+ // Returns the crop in the raw photo's coordinate system
+ public bool get_raw_crop(out Box crop) {
+ crop = Box();
+
+ KeyValueMap map = get_transformation("crop");
+ if (map == null)
+ return false;
+
+ int left = map.get_int("left", -1);
+ int top = map.get_int("top", -1);
+ int right = map.get_int("right", -1);
+ int bottom = map.get_int("bottom", -1);
+
+ if (left == -1 || top == -1 || right == -1 || bottom == -1)
+ return false;
+
+ crop = Box(left, top, right, bottom);
+
+ return true;
+ }
+
+ // Sets the crop using the raw photo's unrotated coordinate system
+ private void set_raw_crop(Box crop) {
+ KeyValueMap map = new KeyValueMap("crop");
+ map.set_int("left", crop.left);
+ map.set_int("top", crop.top);
+ map.set_int("right", crop.right);
+ map.set_int("bottom", crop.bottom);
+
+ if (set_transformation(map))
+ notify_altered(new Alteration("image", "crop"));
+ }
+
+ private bool get_raw_straighten(out double angle) {
+ KeyValueMap map = get_transformation("straighten");
+ if (map == null) {
+ angle = 0.0;
+
+ return false;
+ }
+
+ angle = map.get_double("angle", 0.0);
+
+ return true;
+ }
+
+ private void set_raw_straighten(double theta) {
+ KeyValueMap map = new KeyValueMap("straighten");
+ map.set_double("angle", theta);
+
+ if (set_transformation(map)) {
+ notify_altered(new Alteration("image", "straighten"));
+ }
+ }
+
+ // All instances are against the coordinate system of the unscaled, unrotated photo.
+ private EditingTools.RedeyeInstance[] get_raw_redeye_instances() {
+ KeyValueMap map = get_transformation("redeye");
+ if (map == null)
+ return new EditingTools.RedeyeInstance[0];
+
+ int num_points = map.get_int("num_points", -1);
+ assert(num_points > 0);
+
+ EditingTools.RedeyeInstance[] res = new EditingTools.RedeyeInstance[num_points];
+
+ Gdk.Point default_point = {0};
+ default_point.x = -1;
+ default_point.y = -1;
+
+ for (int i = 0; i < num_points; i++) {
+ string center_key = "center%d".printf(i);
+ string radius_key = "radius%d".printf(i);
+
+ res[i].center = map.get_point(center_key, default_point);
+ assert(res[i].center.x != default_point.x);
+ assert(res[i].center.y != default_point.y);
+
+ res[i].radius = map.get_int(radius_key, -1);
+ assert(res[i].radius != -1);
+ }
+
+ return res;
+ }
+
+ public bool has_redeye_transformations() {
+ return has_transformation("redeye");
+ }
+
+ // All instances are against the coordinate system of the unrotated photo.
+ public void add_redeye_instance(EditingTools.RedeyeInstance redeye) {
+ KeyValueMap map = get_transformation("redeye");
+ if (map == null) {
+ map = new KeyValueMap("redeye");
+ map.set_int("num_points", 0);
+ }
+
+ int num_points = map.get_int("num_points", -1);
+ assert(num_points >= 0);
+
+ num_points++;
+
+ string radius_key = "radius%d".printf(num_points - 1);
+ string center_key = "center%d".printf(num_points - 1);
+
+ map.set_int(radius_key, redeye.radius);
+ map.set_point(center_key, redeye.center);
+
+ map.set_int("num_points", num_points);
+
+ if (set_transformation(map))
+ notify_altered(new Alteration("image", "redeye"));
+ }
+
+ // Pixbuf generation
+
+ // Returns dimensions for the pixbuf at various stages of the pipeline.
+ //
+ // scaled_image is the dimensions of the image after a scaled load-and-decode.
+ // scaled_to_viewport is the dimensions of the image sized according to the scaling parameter.
+ // scaled_image and scaled_to_viewport may be different if the photo is cropped.
+ //
+ // Returns true if scaling is to occur, false otherwise. If false, scaled_image will be set to
+ // the raw image dimensions and scaled_to_viewport will be the dimensions of the image scaled
+ // to the Scaling viewport.
+ private bool calculate_pixbuf_dimensions(Scaling scaling, Exception exceptions,
+ out Dimensions scaled_image, out Dimensions scaled_to_viewport) {
+ lock (row) {
+ // this function needs to access various elements of the Photo atomically
+ return locked_calculate_pixbuf_dimensions(scaling, exceptions,
+ out scaled_image, out scaled_to_viewport);
+ }
+ }
+
+ // Must be called with row locked.
+ private bool locked_calculate_pixbuf_dimensions(Scaling scaling, Exception exceptions,
+ out Dimensions scaled_image, out Dimensions scaled_to_viewport) {
+ Dimensions raw = get_raw_dimensions();
+
+ if (scaling.is_unscaled()) {
+ scaled_image = raw;
+ scaled_to_viewport = raw;
+
+ return false;
+ }
+
+ Orientation orientation = get_orientation();
+
+ // If no crop, the scaled_image is simply raw scaled to fit into the viewport. Otherwise,
+ // the image is scaled enough so the cropped region fits the viewport.
+
+ scaled_image = Dimensions();
+ scaled_to_viewport = Dimensions();
+
+ if (exceptions.allows(Exception.CROP)) {
+ Box crop;
+ if (get_raw_crop(out crop)) {
+ // rotate the crop and raw space accordingly ... order is important here, rotate_box
+ // works with the unrotated dimensions in space
+ Dimensions rotated_raw = raw;
+ if (exceptions.allows(Exception.ORIENTATION)) {
+ crop = orientation.rotate_box(raw, crop);
+ rotated_raw = orientation.rotate_dimensions(raw);
+ }
+
+ // scale the rotated crop to fit in the viewport
+ Box scaled_crop = crop.get_scaled(scaling.get_scaled_dimensions(crop.get_dimensions()));
+
+ // the viewport size is the size of the scaled crop
+ scaled_to_viewport = scaled_crop.get_dimensions();
+
+ // only scale the image if the crop is larger than the viewport
+ if (crop.get_width() <= scaled_crop.get_width()
+ && crop.get_height() <= scaled_crop.get_height()) {
+ scaled_image = raw;
+ scaled_to_viewport = crop.get_dimensions();
+
+ return false;
+ }
+ // resize the total pixbuf so the crop slices directly from the scaled pixbuf,
+ // with no need for resizing thereafter. The decoded size is determined by the
+ // proportion of the actual size to the crop size
+ scaled_image = rotated_raw.get_scaled_similar(crop.get_dimensions(),
+ scaled_crop.get_dimensions());
+
+ // derotate, as the loader knows nothing about orientation
+ if (exceptions.allows(Exception.ORIENTATION))
+ scaled_image = orientation.derotate_dimensions(scaled_image);
+ }
+ }
+
+ // if scaled_image not set, merely scale the raw pixbuf
+ if (!scaled_image.has_area()) {
+ // rotate for the scaler
+ Dimensions rotated_raw = raw;
+ if (exceptions.allows(Exception.ORIENTATION))
+ rotated_raw = orientation.rotate_dimensions(raw);
+
+ scaled_image = scaling.get_scaled_dimensions(rotated_raw);
+ scaled_to_viewport = scaled_image;
+
+ // derotate the scaled dimensions, as the loader knows nothing about orientation
+ if (exceptions.allows(Exception.ORIENTATION))
+ scaled_image = orientation.derotate_dimensions(scaled_image);
+ }
+
+ // do not scale up
+ if (scaled_image.width >= raw.width && scaled_image.height >= raw.height) {
+ scaled_image = raw;
+
+ return false;
+ }
+
+ assert(scaled_image.has_area());
+ assert(scaled_to_viewport.has_area());
+
+ return true;
+ }
+
+ // Returns a raw, untransformed, unrotated pixbuf directly from the source. Scaling provides
+ // asked for a scaled-down image, which has certain performance benefits if the resized
+ // JPEG is scaled down by a factor of a power of two (one-half, one-fourth, etc.).
+ private Gdk.Pixbuf load_raw_pixbuf(Scaling scaling, Exception exceptions,
+ BackingFetchMode fetch_mode = BackingFetchMode.BASELINE) throws Error {
+
+ PhotoFileReader loader = get_backing_reader(fetch_mode);
+
+ // no scaling, load and get out
+ if (scaling.is_unscaled()) {
+#if MEASURE_PIPELINE
+ debug("LOAD_RAW_PIXBUF UNSCALED %s: requested", loader.get_filepath());
+#endif
+
+ return loader.unscaled_read();
+ }
+
+ // Need the dimensions of the image to load
+ Dimensions scaled_image, scaled_to_viewport;
+ bool is_scaled = calculate_pixbuf_dimensions(scaling, exceptions, out scaled_image,
+ out scaled_to_viewport);
+ if (!is_scaled) {
+#if MEASURE_PIPELINE
+ debug("LOAD_RAW_PIXBUF UNSCALED %s: scaling unavailable", loader.get_filepath());
+#endif
+
+ return loader.unscaled_read();
+ }
+
+ Gdk.Pixbuf pixbuf = loader.scaled_read(get_raw_dimensions(), scaled_image);
+
+#if MEASURE_PIPELINE
+ debug("LOAD_RAW_PIXBUF %s %s: %s -> %s (actual: %s)", scaling.to_string(), loader.get_filepath(),
+ get_raw_dimensions().to_string(), scaled_image.to_string(),
+ Dimensions.for_pixbuf(pixbuf).to_string());
+#endif
+
+ assert(scaled_image.approx_equals(Dimensions.for_pixbuf(pixbuf), SCALING_FUDGE));
+
+ return pixbuf;
+ }
+
+ // Returns a raw, untransformed, scaled pixbuf from the master that has been optionally rotated
+ // according to its original EXIF settings.
+ public Gdk.Pixbuf get_master_pixbuf(Scaling scaling, bool rotate = true) throws Error {
+ return get_untransformed_pixbuf(scaling, rotate, BackingFetchMode.MASTER);
+ }
+
+ // Returns a pixbuf that hasn't been modified (head of the pipeline.)
+ public Gdk.Pixbuf get_unmodified_pixbuf(Scaling scaling, bool rotate = true) throws Error {
+ return get_untransformed_pixbuf(scaling, rotate, BackingFetchMode.UNMODIFIED);
+ }
+
+ // Returns an untransformed pixbuf with optional scaling, rotation, and fetch mode.
+ private Gdk.Pixbuf get_untransformed_pixbuf(Scaling scaling, bool rotate, BackingFetchMode fetch_mode)
+ throws Error {
+#if MEASURE_PIPELINE
+ Timer timer = new Timer();
+ Timer total_timer = new Timer();
+ double orientation_time = 0.0;
+
+ total_timer.start();
+#endif
+
+ // get required fields all at once, to avoid holding the row lock
+ Dimensions scaled_image, scaled_to_viewport;
+ Orientation original_orientation;
+
+ lock (row) {
+ calculate_pixbuf_dimensions(scaling, Exception.NONE, out scaled_image,
+ out scaled_to_viewport);
+ original_orientation = get_original_orientation();
+ }
+
+ // load-and-decode and scale
+ Gdk.Pixbuf pixbuf = load_raw_pixbuf(scaling, Exception.NONE, fetch_mode);
+
+ // orientation
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ if (rotate)
+ pixbuf = original_orientation.rotate_pixbuf(pixbuf);
+
+#if MEASURE_PIPELINE
+ orientation_time = timer.elapsed();
+
+ debug("MASTER PIPELINE %s (%s): orientation=%lf total=%lf", to_string(), scaling.to_string(),
+ orientation_time, total_timer.elapsed());
+#endif
+
+ return pixbuf;
+ }
+
+ public override Gdk.Pixbuf get_pixbuf(Scaling scaling) throws Error {
+ return get_pixbuf_with_options(scaling);
+ }
+
+ /**
+ * @brief Populates the cached version of the unmodified image.
+ */
+ public void populate_prefetched() throws Error {
+ lock (unmodified_precached) {
+ // If we don't have it already, precache the original...
+ if (unmodified_precached == null) {
+ unmodified_precached = load_raw_pixbuf(Scaling.for_original(), Exception.ALL, BackingFetchMode.SOURCE);
+ secs_since_access = new GLib.Timer();
+ GLib.Timeout.add_seconds(5, (GLib.SourceFunc)discard_prefetched);
+ debug("spawning new precache timeout for %s", this.to_string());
+ }
+ }
+ }
+
+ /**
+ * @brief Get a copy of what's in the cache.
+ *
+ * @return A Pixbuf with the image data from unmodified_precached.
+ */
+ public Gdk.Pixbuf? get_prefetched_copy() {
+ lock (unmodified_precached) {
+ if (unmodified_precached == null) {
+ try {
+ populate_prefetched();
+ } catch (Error e) {
+ warning("raw pixbuf for %s could not be loaded", this.to_string());
+ return null;
+ }
+ }
+
+ return unmodified_precached.copy();
+ }
+ }
+
+ /**
+ * @brief Discards the cached version of the unmodified image.
+ *
+ * @param immed Whether the cached version should be discarded now, or not.
+ */
+ public bool discard_prefetched(bool immed = false) {
+ lock (unmodified_precached) {
+ if (secs_since_access == null)
+ return false;
+
+ double tmp;
+ if ((secs_since_access.elapsed(out tmp) > PRECACHE_TIME_TO_LIVE) || (immed)) {
+ debug("pipeline not run in over %d seconds or got immediate command, discarding " +
+ "cached original for %s",
+ PRECACHE_TIME_TO_LIVE, to_string());
+ unmodified_precached = null;
+ secs_since_access = null;
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * @brief Returns a fully transformed and scaled pixbuf. Transformations may be excluded via
+ * the mask. If the image is smaller than the scaling, it will be returned in its actual size.
+ * The caller is responsible for scaling thereafter.
+ *
+ * @param scaling A scaling object that describes the size the output pixbuf should be.
+ * @param exceptions The parts of the pipeline that should be skipped; defaults to NONE if
+ * left unset.
+ * @param fetch_mode The fetch mode; if left unset, defaults to BASELINE so that
+ * we get the image exactly as it is in the file.
+ */
+ public Gdk.Pixbuf get_pixbuf_with_options(Scaling scaling, Exception exceptions =
+ Exception.NONE, BackingFetchMode fetch_mode = BackingFetchMode.BASELINE) throws Error {
+
+#if MEASURE_PIPELINE
+ Timer timer = new Timer();
+ Timer total_timer = new Timer();
+ double redeye_time = 0.0, crop_time = 0.0, adjustment_time = 0.0, orientation_time = 0.0,
+ straighten_time = 0.0;
+
+ total_timer.start();
+#endif
+
+ // If this is a RAW photo, ensure the development is ready.
+ if (Photo.develop_raw_photos_to_files &&
+ get_master_file_format() == PhotoFileFormat.RAW &&
+ (fetch_mode == BackingFetchMode.BASELINE || fetch_mode == BackingFetchMode.UNMODIFIED
+ || fetch_mode == BackingFetchMode.SOURCE) &&
+ !is_raw_developer_complete(get_raw_developer()))
+ set_raw_developer(get_raw_developer());
+
+ // to minimize holding the row lock, fetch everything needed for the pipeline up-front
+ bool is_scaled, is_cropped, is_straightened;
+ Dimensions scaled_to_viewport;
+ Dimensions original = Dimensions();
+ Dimensions scaled = Dimensions();
+ EditingTools.RedeyeInstance[] redeye_instances = null;
+ Box crop;
+ double straightening_angle;
+ PixelTransformer transformer = null;
+ Orientation orientation;
+
+ lock (row) {
+ original = get_dimensions(Exception.ALL);
+ scaled = scaling.get_scaled_dimensions(get_dimensions(exceptions));
+ scaled_to_viewport = scaled;
+
+ is_scaled = !(get_dimensions().equals(scaled));
+
+ redeye_instances = get_raw_redeye_instances();
+
+ is_cropped = get_raw_crop(out crop);
+
+ is_straightened = get_raw_straighten(out straightening_angle);
+
+ if (has_color_adjustments())
+ transformer = get_pixel_transformer();
+
+ orientation = get_orientation();
+ }
+
+ //
+ // Image load-and-decode
+ //
+ populate_prefetched();
+
+ Gdk.Pixbuf pixbuf = get_prefetched_copy();
+
+ // remember to delete the cached copy if it isn't being used.
+ secs_since_access.start();
+ debug("pipeline being run against %s, timer restarted.", this.to_string());
+
+ assert(pixbuf != null);
+
+ //
+ // Image transformation pipeline
+ //
+
+ // redeye reduction
+ if (exceptions.allows(Exception.REDEYE)) {
+
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ foreach (EditingTools.RedeyeInstance instance in redeye_instances) {
+ pixbuf = do_redeye(pixbuf, instance);
+ }
+#if MEASURE_PIPELINE
+ redeye_time = timer.elapsed();
+#endif
+ }
+
+ // angle photograph so in-image horizon is aligned with horizontal
+ if (exceptions.allows(Exception.STRAIGHTEN)) {
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ if (is_straightened) {
+ pixbuf = rotate_arb(pixbuf, straightening_angle);
+ }
+
+#if MEASURE_PIPELINE
+ straighten_time = timer.elapsed();
+#endif
+ }
+
+ // crop
+ if (exceptions.allows(Exception.CROP)) {
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ if (is_cropped) {
+
+ // ensure the crop region stays inside the scaled image boundaries and is
+ // at least 1 px by 1 px; this is needed as a work-around for inaccuracies
+ // which can occur when zooming.
+ crop.left = crop.left.clamp(0, pixbuf.width - 2);
+ crop.top = crop.top.clamp(0, pixbuf.height - 2);
+
+ crop.right = crop.right.clamp(crop.left + 1, pixbuf.width - 1);
+ crop.bottom = crop.bottom.clamp(crop.top + 1, pixbuf.height - 1);
+
+ pixbuf = new Gdk.Pixbuf.subpixbuf(pixbuf, crop.left, crop.top, crop.get_width(),
+ crop.get_height());
+ }
+
+#if MEASURE_PIPELINE
+ crop_time = timer.elapsed();
+#endif
+ }
+
+ // orientation (all modifications are stored in unrotated coordinate system)
+ if (exceptions.allows(Exception.ORIENTATION)) {
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ pixbuf = orientation.rotate_pixbuf(pixbuf);
+#if MEASURE_PIPELINE
+ orientation_time = timer.elapsed();
+#endif
+ }
+
+#if MEASURE_PIPELINE
+ debug("PIPELINE %s (%s): redeye=%lf crop=%lf adjustment=%lf orientation=%lf total=%lf",
+ to_string(), scaling.to_string(), redeye_time, crop_time, adjustment_time,
+ orientation_time, total_timer.elapsed());
+#endif
+
+ // scale the scratch image, as needed.
+ if (is_scaled) {
+ pixbuf = pixbuf.scale_simple(scaled_to_viewport.width, scaled_to_viewport.height, Gdk.InterpType.BILINEAR);
+ }
+
+ // color adjustment; we do this dead last, since, if an image has been scaled down,
+ // it may allow us to reduce the amount of pixel arithmetic, increasing responsiveness.
+ if (exceptions.allows(Exception.ADJUST)) {
+#if MEASURE_PIPELINE
+ timer.start();
+#endif
+ if (transformer != null)
+ transformer.transform_pixbuf(pixbuf);
+#if MEASURE_PIPELINE
+ adjustment_time = timer.elapsed();
+#endif
+ }
+
+ // This is to verify the generated pixbuf matches the scale requirements; crop, straighten
+ // and orientation are all transformations that change the dimensions or aspect ratio of
+ // the pixbuf, and must be accounted for the test to be valid.
+ if ((is_scaled) && (!is_straightened))
+ assert(scaled_to_viewport.approx_equals(Dimensions.for_pixbuf(pixbuf), SCALING_FUDGE));
+
+ return pixbuf;
+ }
+
+
+ //
+ // File export
+ //
+
+ protected abstract bool has_user_generated_metadata();
+
+ // Sets the metadata values for any user generated metadata, only called if
+ // has_user_generated_metadata returns true
+ protected abstract void set_user_metadata_for_export(PhotoMetadata metadata);
+
+ // Returns the basename of the file if it were to be exported in format 'file_format'; if
+ // 'file_format' is null, then return the basename of the file if it were to be exported in the
+ // native backing format of the photo (i.e. no conversion is performed). If 'file_format' is
+ // null and the native backing format is not writeable (i.e. RAW), then use the system
+ // default file format, as defined in PhotoFileFormat
+ public string get_export_basename(PhotoFileFormat? file_format = null) {
+ if (file_format != null) {
+ return file_format.get_properties().convert_file_extension(get_master_file()).get_basename();
+ } else {
+ if (get_file_format().can_write()) {
+ return get_file_format().get_properties().convert_file_extension(
+ get_master_file()).get_basename();
+ } else {
+ return PhotoFileFormat.get_system_default_format().get_properties().convert_file_extension(
+ get_master_file()).get_basename();
+ }
+ }
+ }
+
+ private bool export_fullsized_backing(File file, bool export_metadata = true) throws Error {
+ // See if the native reader supports writing ... if no matches, need to fall back
+ // on a "regular" export, which requires decoding then encoding
+ PhotoFileReader export_reader = null;
+ bool is_master = true;
+ lock (readers) {
+ if (readers.editable != null && readers.editable.get_file_format().can_write_metadata()) {
+ export_reader = readers.editable;
+ is_master = false;
+ } else if (readers.developer != null && readers.developer.get_file_format().can_write_metadata()) {
+ export_reader = readers.developer;
+ is_master = false;
+ } else if (readers.master.get_file_format().can_write_metadata()) {
+ export_reader = readers.master;
+ }
+ }
+
+ if (export_reader == null)
+ return false;
+
+ PhotoFileFormatProperties format_properties = export_reader.get_file_format().get_properties();
+
+ // Build a destination file with the caller's name but the appropriate extension
+ File dest_file = format_properties.convert_file_extension(file);
+
+ // Create a PhotoFileMetadataWriter that matches the PhotoFileReader's file format
+ PhotoFileMetadataWriter writer = export_reader.get_file_format().create_metadata_writer(
+ dest_file.get_path());
+
+ debug("Exporting full-sized copy of %s to %s", to_string(), writer.get_filepath());
+
+ export_reader.get_file().copy(dest_file,
+ FileCopyFlags.OVERWRITE | FileCopyFlags.TARGET_DEFAULT_PERMS, null, null);
+
+ // If asking for an full-sized file and there are no alterations (transformations or EXIF)
+ // *and* this is a copy of the original backing *and* there's no user metadata or title *and* metadata should be exported, then done
+ if (!has_alterations() && is_master && !has_user_generated_metadata() &&
+ (get_title() == null) && (get_comment() == null) && export_metadata)
+ return true;
+
+ // copy over relevant metadata if possible, otherwise generate new metadata
+ PhotoMetadata? metadata = export_reader.read_metadata();
+ if (metadata == null)
+ metadata = export_reader.get_file_format().create_metadata();
+
+ debug("Updating metadata of %s", writer.get_filepath());
+
+ if (get_exposure_time() != 0)
+ metadata.set_exposure_date_time(new MetadataDateTime(get_exposure_time()));
+ else
+ metadata.set_exposure_date_time(null);
+
+ if(export_metadata) {
+ //set metadata
+ metadata.set_title(get_title());
+ metadata.set_comment(get_comment());
+ metadata.set_pixel_dimensions(get_dimensions()); // created by sniffing pixbuf not metadata
+ metadata.set_orientation(get_orientation());
+ metadata.set_software(Resources.APP_TITLE, Resources.APP_VERSION);
+
+ if (get_orientation() != get_original_orientation())
+ metadata.remove_exif_thumbnail();
+
+ set_user_metadata_for_export(metadata);
+ }
+ else
+ //delete metadata
+ metadata.clear();
+
+ writer.write_metadata(metadata);
+
+ return true;
+ }
+
+ // Returns true if there's any reason that an export is required to fully represent the photo
+ // on disk. False essentially means that the source file (NOT NECESSARILY the master file)
+ // *is* the full representation of the photo and its metadata.
+ public bool is_export_required(Scaling scaling, PhotoFileFormat export_format) {
+ return (!scaling.is_unscaled() || has_alterations() || has_user_generated_metadata()
+ || export_format != get_file_format());
+ }
+
+ // TODO: Lossless transformations, especially for mere rotations of JFIF files.
+ //
+ // This method is thread-safe.
+ public void export(File dest_file, Scaling scaling, Jpeg.Quality quality,
+ PhotoFileFormat export_format, bool direct_copy_unmodified = false, bool export_metadata = true) throws Error {
+ if (direct_copy_unmodified) {
+ get_master_file().copy(dest_file, FileCopyFlags.OVERWRITE |
+ FileCopyFlags.TARGET_DEFAULT_PERMS, null, null);
+ return;
+ }
+
+ // Attempt to avoid decode/encoding cycle when exporting original-sized photos for lossy
+ // formats, as that degrades image quality. If alterations exist, but only EXIF has
+ // changed and the user hasn't requested conversion between image formats, then just copy
+ // the original file and update relevant EXIF.
+ if (scaling.is_unscaled() && (!has_alterations() || only_metadata_changed()) &&
+ (export_format == get_file_format()) && (get_file_format() == PhotoFileFormat.JFIF)) {
+ if (export_fullsized_backing(dest_file, export_metadata))
+ return;
+ }
+
+ // Copy over existing metadata from source if available, or create new metadata and
+ // save it for later export below. This has to happen before the format writer writes
+ // out the modified image, as that write will strip the existing exif data.
+ PhotoMetadata? metadata = get_metadata();
+ if (metadata == null)
+ metadata = export_format.create_metadata();
+
+ if (!export_format.can_write())
+ export_format = PhotoFileFormat.get_system_default_format();
+
+ PhotoFileWriter writer = export_format.create_writer(dest_file.get_path());
+
+ debug("Saving transformed version of %s to %s in file format %s", to_string(),
+ writer.get_filepath(), export_format.to_string());
+
+ Gdk.Pixbuf pixbuf;
+
+ // Since JPEGs can store their own orientation, we save the pixels
+ // directly and let the orientation field do the rotation...
+ if ((get_file_format() == PhotoFileFormat.JFIF) ||
+ (get_file_format() == PhotoFileFormat.RAW)) {
+ pixbuf = get_pixbuf_with_options(scaling, Exception.ORIENTATION,
+ BackingFetchMode.SOURCE);
+ } else {
+ // Non-JPEG image - we'll need to save the rotated pixels.
+ pixbuf = get_pixbuf_with_options(scaling, Exception.NONE,
+ BackingFetchMode.SOURCE);
+ }
+
+ writer.write(pixbuf, quality);
+
+ debug("Setting EXIF for %s", writer.get_filepath());
+
+ // Do we need to save metadata to this file?
+ if (export_metadata) {
+ //Yes, set metadata obtained above.
+ metadata.set_title(get_title());
+ metadata.set_comment(get_comment());
+ metadata.set_software(Resources.APP_TITLE, Resources.APP_VERSION);
+
+ if (get_exposure_time() != 0)
+ metadata.set_exposure_date_time(new MetadataDateTime(get_exposure_time()));
+ else
+ metadata.set_exposure_date_time(null);
+
+ metadata.remove_tag("Exif.Iop.RelatedImageWidth");
+ metadata.remove_tag("Exif.Iop.RelatedImageHeight");
+ metadata.remove_exif_thumbnail();
+
+ if (has_user_generated_metadata())
+ set_user_metadata_for_export(metadata);
+ }
+ else {
+ //No, delete metadata.
+ metadata.clear();
+ }
+
+ // Even if we were told to trash camera-identifying data, we need
+ // to make sure the orientation propagates. Also, because JPEGs
+ // can store their own orientation, we'll save the original dimensions
+ // directly and let the orientation field do the rotation there.
+ if ((get_file_format() == PhotoFileFormat.JFIF) ||
+ (get_file_format() == PhotoFileFormat.RAW)) {
+ metadata.set_pixel_dimensions(get_dimensions(Exception.ORIENTATION));
+ metadata.set_orientation(get_orientation());
+ } else {
+ // Non-JPEG image - we'll need to save the rotated dimensions.
+ metadata.set_pixel_dimensions(Dimensions.for_pixbuf(pixbuf));
+ metadata.set_orientation(Orientation.TOP_LEFT);
+ }
+
+ export_format.create_metadata_writer(dest_file.get_path()).write_metadata(metadata);
+ }
+
+ private File generate_new_editable_file(out PhotoFileFormat file_format) throws Error {
+ File backing;
+ lock (row) {
+ file_format = get_file_format();
+ backing = get_file();
+ }
+
+ if (!file_format.can_write())
+ file_format = PhotoFileFormat.get_system_default_format();
+
+ string name, ext;
+ disassemble_filename(backing.get_basename(), out name, out ext);
+
+ if (ext == null || !file_format.get_properties().is_recognized_extension(ext))
+ ext = file_format.get_properties().get_default_extension();
+
+ string editable_basename = "%s_%s.%s".printf(name, _("modified"), ext);
+
+ bool collision;
+ return generate_unique_file(backing.get_parent(), editable_basename, out collision);
+ }
+
+ private static bool launch_editor(File file, PhotoFileFormat file_format) throws Error {
+ string commandline = file_format == PhotoFileFormat.RAW ? Config.Facade.get_instance().get_external_raw_app() :
+ Config.Facade.get_instance().get_external_photo_app();
+
+ if (is_string_empty(commandline))
+ return false;
+
+ AppInfo? app;
+ try {
+ app = AppInfo.create_from_commandline(commandline, "",
+ AppInfoCreateFlags.NONE);
+ } catch (Error er) {
+ app = null;
+ }
+
+ List<File> files = new List<File>();
+ files.insert(file, -1);
+
+ if (app != null)
+ return app.launch(files, null);
+
+ string[] argv = new string[2];
+ argv[0] = commandline;
+ argv[1] = file.get_path();
+
+ Pid child_pid;
+
+ return Process.spawn_async(
+ "/",
+ argv,
+ null, // environment
+ SpawnFlags.SEARCH_PATH,
+ null, // child setup
+ out child_pid);
+ }
+
+ // Opens with Ufraw, etc.
+ public void open_with_raw_external_editor() throws Error {
+ launch_editor(get_master_file(), get_master_file_format());
+ }
+
+ // Opens with GIMP, etc.
+ public void open_with_external_editor() throws Error {
+ File current_editable_file = null;
+ File create_editable_file = null;
+ PhotoFileFormat editable_file_format;
+ lock (readers) {
+ if (readers.editable != null)
+ current_editable_file = readers.editable.get_file();
+
+ if (current_editable_file == null)
+ create_editable_file = generate_new_editable_file(out editable_file_format);
+ else
+ editable_file_format = readers.editable.get_file_format();
+ }
+
+ // if this isn't the first time but the file does not exist OR there are transformations
+ // that need to be represented there, create a new one
+ if (create_editable_file == null && current_editable_file != null &&
+ (!current_editable_file.query_exists(null) || has_transformations()))
+ create_editable_file = current_editable_file;
+
+ // if creating a new edited file and can write to it, stop watching the old one
+ if (create_editable_file != null && editable_file_format.can_write()) {
+ halt_monitoring_editable();
+
+ try {
+ export(create_editable_file, Scaling.for_original(), Jpeg.Quality.MAXIMUM,
+ editable_file_format);
+ } catch (Error err) {
+ // if an error is thrown creating the file, clean it up
+ try {
+ create_editable_file.delete(null);
+ } catch (Error delete_err) {
+ // ignored
+ warning("Unable to delete editable file %s after export error: %s",
+ create_editable_file.get_path(), delete_err.message);
+ }
+
+ throw err;
+ }
+
+ // attach the editable file to the photo
+ attach_editable(editable_file_format, create_editable_file);
+
+ current_editable_file = create_editable_file;
+ }
+
+ assert(current_editable_file != null);
+
+ // if not already monitoring, monitor now
+ if (editable_monitor == null)
+ start_monitoring_editable(current_editable_file);
+
+ launch_editor(current_editable_file, get_file_format());
+ }
+
+ public void revert_to_master(bool notify = true) {
+ detach_editable(true, true, notify);
+ }
+
+ private void start_monitoring_editable(File file) throws Error {
+ halt_monitoring_editable();
+
+ // tell the LibraryMonitor not to monitor this file
+ LibraryMonitor.blacklist_file(file, "Photo.start_monitoring_editable");
+
+ editable_monitor = file.monitor(FileMonitorFlags.NONE, null);
+ editable_monitor.changed.connect(on_editable_file_changed);
+ }
+
+ private void halt_monitoring_editable() {
+ if (editable_monitor == null)
+ return;
+
+ // tell the LibraryMonitor a-ok to watch this file again
+ File? file = get_editable_file();
+ if (file != null)
+ LibraryMonitor.unblacklist_file(file);
+
+ editable_monitor.changed.disconnect(on_editable_file_changed);
+ editable_monitor.cancel();
+ editable_monitor = null;
+ }
+
+ private void attach_editable(PhotoFileFormat file_format, File file) throws Error {
+ // remove the transformations ... this must be done before attaching the editable, as these
+ // transformations are in the master's coordinate system, not the editable's ... don't
+ // notify photo is altered *yet* because update_editable will notify, and want to avoid
+ // stacking them up
+ internal_remove_all_transformations(false);
+ update_editable(false, file_format.create_reader(file.get_path()));
+ }
+
+ private void update_editable_attributes() throws Error {
+ update_editable(true, null);
+ }
+
+ public void reimport_editable() throws Error {
+ update_editable(false, null);
+ }
+
+ // In general, because of the fragility of the order of operations and what's required where,
+ // use one of the above wrapper functions to call this rather than call this directly.
+ private void update_editable(bool only_attributes, PhotoFileReader? new_reader = null) throws Error {
+ // only_attributes only available for updating existing editable
+ assert((only_attributes && new_reader == null) || (!only_attributes));
+
+ PhotoFileReader? old_reader = get_editable_reader();
+
+ PhotoFileReader reader = new_reader ?? old_reader;
+ if (reader == null) {
+ detach_editable(false, true);
+
+ return;
+ }
+
+ bool timestamp_changed = false;
+ bool filesize_changed = false;
+ bool is_new_editable = false;
+
+ BackingPhotoID editable_id = get_editable_id();
+ File file = reader.get_file();
+
+ DetectedPhotoInformation detected;
+ BackingPhotoRow? backing = query_backing_photo_row(file, PhotoFileSniffer.Options.NO_MD5,
+ out detected);
+
+ // Have we _not_ got an editable attached yet?
+ if (editable_id.is_invalid()) {
+ // Yes, try to create and attach one.
+ if (backing != null) {
+ BackingPhotoTable.get_instance().add(backing);
+ lock (row) {
+ timestamp_changed = true;
+ filesize_changed = true;
+
+ PhotoTable.get_instance().attach_editable(row, backing.id);
+ editable = backing;
+ backing_photo_row = editable;
+ set_orientation(backing_photo_row.original_orientation);
+ }
+ }
+ is_new_editable = true;
+ }
+
+ if (only_attributes) {
+ // This should only be possible if the editable exists already.
+ assert(editable_id.is_valid());
+
+ FileInfo info;
+ try {
+ info = file.query_filesystem_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES, null);
+ } catch (Error err) {
+ warning("Unable to read editable filesystem info for %s: %s", to_string(), err.message);
+ detach_editable(false, true);
+
+ return;
+ }
+
+ TimeVal timestamp = info.get_modification_time();
+
+ BackingPhotoTable.get_instance().update_attributes(editable_id, timestamp.tv_sec,
+ info.get_size());
+ lock (row) {
+ timestamp_changed = editable.timestamp != timestamp.tv_sec;
+ filesize_changed = editable.filesize != info.get_size();
+
+ editable.timestamp = timestamp.tv_sec;
+ editable.filesize = info.get_size();
+ }
+ } else {
+ // Not just a file-attribute-only change.
+ if (editable_id.is_valid() && !is_new_editable) {
+ // Only check these if we didn't just have to create
+ // this editable, since, with a newly-created editable,
+ // the file size and modification time are by definition
+ // freshly-changed.
+ backing.id = editable_id;
+ BackingPhotoTable.get_instance().update(backing);
+ lock (row) {
+ timestamp_changed = editable.timestamp != backing.timestamp;
+ filesize_changed = editable.filesize != backing.filesize;
+
+ editable = backing;
+ backing_photo_row = editable;
+ set_orientation(backing_photo_row.original_orientation);
+ }
+ }
+ }
+
+ // if a new reader was specified, install that and begin using it
+ if (new_reader != null) {
+ lock (readers) {
+ readers.editable = new_reader;
+ }
+ }
+
+ if (!only_attributes && reader != old_reader) {
+ notify_baseline_replaced();
+ notify_editable_replaced(old_reader != null ? old_reader.get_file() : null,
+ new_reader != null ? new_reader.get_file() : null);
+ }
+
+ string[] alteration_list = new string[0];
+ if (timestamp_changed) {
+ alteration_list += "metadata:editable-timestamp";
+ alteration_list += "metadata:baseline-timestamp";
+
+ if (is_editable_source())
+ alteration_list += "metadata:source-timestamp";
+ }
+
+ if (filesize_changed || new_reader != null) {
+ alteration_list += "image:editable";
+ alteration_list += "image:baseline";
+
+ if (is_editable_source())
+ alteration_list += "image:source";
+ }
+
+ if (alteration_list.length > 0)
+ notify_altered(new Alteration.from_array(alteration_list));
+ }
+
+ private void detach_editable(bool delete_editable, bool remove_transformations, bool notify = true) {
+ halt_monitoring_editable();
+
+ bool has_editable = false;
+ File? editable_file = null;
+ lock (readers) {
+ if (readers.editable != null) {
+ editable_file = readers.editable.get_file();
+ readers.editable = null;
+ has_editable = true;
+ }
+ }
+
+ if (has_editable) {
+ BackingPhotoID editable_id = BackingPhotoID();
+ try {
+ lock (row) {
+ editable_id = row.editable_id;
+ if (editable_id.is_valid())
+ PhotoTable.get_instance().detach_editable(row);
+ backing_photo_row = row.master;
+ }
+ } catch (DatabaseError err) {
+ warning("Unable to remove editable from PhotoTable: %s", err.message);
+ }
+
+ try {
+ if (editable_id.is_valid())
+ BackingPhotoTable.get_instance().remove(editable_id);
+ } catch (DatabaseError err) {
+ warning("Unable to remove editable from BackingPhotoTable: %s", err.message);
+ }
+ }
+
+ if (remove_transformations)
+ internal_remove_all_transformations(false);
+
+ if (has_editable) {
+ notify_baseline_replaced();
+ notify_editable_replaced(editable_file, null);
+ }
+
+ if (delete_editable && editable_file != null) {
+ try {
+ editable_file.trash(null);
+ } catch (Error err) {
+ warning("Unable to trash editable %s for %s: %s", editable_file.get_path(), to_string(),
+ err.message);
+ }
+ }
+
+ if ((has_editable || remove_transformations) && notify)
+ notify_altered(new Alteration("image", "revert"));
+ }
+
+ private void on_editable_file_changed(File file, File? other_file, FileMonitorEvent event) {
+ // This has some expense, but this assertion is important for a lot of sanity reasons.
+ lock (readers) {
+ assert(readers.editable != null && file.equal(readers.editable.get_file()));
+ }
+
+ debug("EDITABLE %s: %s", event.to_string(), file.get_path());
+
+ switch (event) {
+ case FileMonitorEvent.CHANGED:
+ case FileMonitorEvent.CREATED:
+ if (reimport_editable_scheduler == null) {
+ reimport_editable_scheduler = new OneShotScheduler("Photo.reimport_editable",
+ on_reimport_editable);
+ }
+
+ reimport_editable_scheduler.after_timeout(1000, true);
+ break;
+
+ case FileMonitorEvent.ATTRIBUTE_CHANGED:
+ if (update_editable_attributes_scheduler == null) {
+ update_editable_attributes_scheduler = new OneShotScheduler(
+ "Photo.update_editable_attributes", on_update_editable_attributes);
+ }
+
+ update_editable_attributes_scheduler.after_timeout(1000, true);
+ break;
+
+ case FileMonitorEvent.DELETED:
+ if (remove_editable_scheduler == null) {
+ remove_editable_scheduler = new OneShotScheduler("Photo.remove_editable",
+ on_remove_editable);
+ }
+
+ remove_editable_scheduler.after_timeout(3000, true);
+ break;
+
+ case FileMonitorEvent.CHANGES_DONE_HINT:
+ default:
+ // ignored
+ break;
+ }
+
+ // at this point, any image date we have cached is stale,
+ // so delete it and force the pipeline to re-fetch it
+ discard_prefetched(true);
+ }
+
+ private void on_reimport_editable() {
+ // delete old image data and force the pipeline to load new from file.
+ discard_prefetched(true);
+
+ debug("Reimporting editable for %s", to_string());
+ try {
+ reimport_editable();
+ } catch (Error err) {
+ warning("Unable to reimport photo %s changed by external editor: %s",
+ to_string(), err.message);
+ }
+ }
+
+ private void on_update_editable_attributes() {
+ debug("Updating editable attributes for %s", to_string());
+ try {
+ update_editable_attributes();
+ } catch (Error err) {
+ warning("Unable to update editable attributes: %s", err.message);
+ }
+ }
+
+ private void on_remove_editable() {
+ PhotoFileReader? reader = get_editable_reader();
+ if (reader == null)
+ return;
+
+ File file = reader.get_file();
+ if (file.query_exists(null)) {
+ debug("Not removing editable for %s: file exists", to_string());
+
+ return;
+ }
+
+ debug("Removing editable for %s: file no longer exists", to_string());
+ detach_editable(false, true);
+ }
+
+ //
+ // Aggregate/helper/translation functions
+ //
+
+ // Returns uncropped (but rotated) dimensions
+ public Dimensions get_original_dimensions() {
+ Dimensions dim = get_raw_dimensions();
+ Orientation orientation = get_orientation();
+
+ return orientation.rotate_dimensions(dim);
+ }
+
+ // Returns uncropped dimensions rotated only to reflect the original orientation
+ public Dimensions get_master_dimensions() {
+ return get_original_orientation().rotate_dimensions(get_raw_dimensions());
+ }
+
+ // Returns the crop against the coordinate system of the rotated photo
+ public bool get_crop(out Box crop, Exception exceptions = Exception.NONE) {
+ Box raw;
+ if (!get_raw_crop(out raw)) {
+ crop = Box();
+
+ return false;
+ }
+
+ Dimensions dim = get_dimensions(Exception.CROP | Exception.ORIENTATION);
+ Orientation orientation = get_orientation();
+
+ if(exceptions.allows(Exception.ORIENTATION))
+ crop = orientation.rotate_box(dim, raw);
+ else
+ crop = raw;
+
+ return true;
+ }
+
+ // Sets the crop against the coordinate system of the rotated photo
+ public void set_crop(Box crop) {
+ Dimensions dim = get_dimensions(Exception.CROP | Exception.ORIENTATION);
+ Orientation orientation = get_orientation();
+
+ Box derotated = orientation.derotate_box(dim, crop);
+
+ derotated.left = derotated.left.clamp(0, dim.width - 2);
+ derotated.right = derotated.right.clamp(derotated.left, dim.width - 1);
+
+ derotated.top = derotated.top.clamp(0, dim.height - 2);
+ derotated.bottom = derotated.bottom.clamp(derotated.top, dim.height - 1);
+
+ set_raw_crop(derotated);
+ }
+
+ public bool get_straighten(out double theta) {
+ if (!get_raw_straighten(out theta))
+ return false;
+
+ return true;
+ }
+
+ public void set_straighten(double theta) {
+ set_raw_straighten(theta);
+ }
+
+ private Gdk.Pixbuf do_redeye(Gdk.Pixbuf pixbuf, EditingTools.RedeyeInstance inst) {
+ /* we remove redeye within a circular region called the "effect
+ extent." the effect extent is inscribed within its "bounding
+ rectangle." */
+
+ /* for each scanline in the top half-circle of the effect extent,
+ compute the number of pixels by which the effect extent is inset
+ from the edges of its bounding rectangle. note that we only have
+ to do this for the first quadrant because the second quadrant's
+ insets can be derived by symmetry */
+ double r = (double) inst.radius;
+ int[] x_insets_first_quadrant = new int[inst.radius + 1];
+
+ int i = 0;
+ for (double y = r; y >= 0.0; y -= 1.0) {
+ double theta = Math.asin(y / r);
+ int x = (int)((r * Math.cos(theta)) + 0.5);
+ x_insets_first_quadrant[i] = inst.radius - x;
+
+ i++;
+ }
+
+ int x_bounds_min = inst.center.x - inst.radius;
+ int x_bounds_max = inst.center.x + inst.radius;
+ int ymin = inst.center.y - inst.radius;
+ ymin = (ymin < 0) ? 0 : ymin;
+ int ymax = inst.center.y;
+ ymax = (ymax > (pixbuf.height - 1)) ? (pixbuf.height - 1) : ymax;
+
+ /* iterate over all the pixels in the top half-circle of the effect
+ extent from top to bottom */
+ int inset_index = 0;
+ for (int y_it = ymin; y_it <= ymax; y_it++) {
+ int xmin = x_bounds_min + x_insets_first_quadrant[inset_index];
+ xmin = (xmin < 0) ? 0 : xmin;
+ int xmax = x_bounds_max - x_insets_first_quadrant[inset_index];
+ xmax = (xmax > (pixbuf.width - 1)) ? (pixbuf.width - 1) : xmax;
+
+ for (int x_it = xmin; x_it <= xmax; x_it++) {
+ red_reduce_pixel(pixbuf, x_it, y_it);
+ }
+ inset_index++;
+ }
+
+ /* iterate over all the pixels in the top half-circle of the effect
+ extent from top to bottom */
+ ymin = inst.center.y;
+ ymax = inst.center.y + inst.radius;
+ inset_index = x_insets_first_quadrant.length - 1;
+ for (int y_it = ymin; y_it <= ymax; y_it++) {
+ int xmin = x_bounds_min + x_insets_first_quadrant[inset_index];
+ xmin = (xmin < 0) ? 0 : xmin;
+ int xmax = x_bounds_max - x_insets_first_quadrant[inset_index];
+ xmax = (xmax > (pixbuf.width - 1)) ? (pixbuf.width - 1) : xmax;
+
+ for (int x_it = xmin; x_it <= xmax; x_it++) {
+ red_reduce_pixel(pixbuf, x_it, y_it);
+ }
+ inset_index--;
+ }
+
+ return pixbuf;
+ }
+
+ private Gdk.Pixbuf red_reduce_pixel(Gdk.Pixbuf pixbuf, int x, int y) {
+ int px_start_byte_offset = (y * pixbuf.get_rowstride()) +
+ (x * pixbuf.get_n_channels());
+
+ /* Due to inaccuracies in the scaler, we can occasionally
+ * get passed a coordinate pair outside the image, causing
+ * us to walk off the array and into segfault territory.
+ * Check coords prior to drawing to prevent this... */
+ if ((x >= 0) && (y >= 0) && (x < pixbuf.width) && (y < pixbuf.height)) {
+ unowned uchar[] pixel_data = pixbuf.get_pixels();
+
+ /* The pupil of the human eye has no pigment, so we expect all
+ color channels to be of about equal intensity. This means that at
+ any point within the effects region, the value of the red channel
+ should be about the same as the values of the green and blue
+ channels. So set the value of the red channel to be the mean of the
+ values of the red and blue channels. This preserves achromatic
+ intensity across all channels while eliminating any extraneous flare
+ affecting the red channel only (i.e. the red-eye effect). */
+ uchar g = pixel_data[px_start_byte_offset + 1];
+ uchar b = pixel_data[px_start_byte_offset + 2];
+
+ uchar r = (g + b) / 2;
+
+ pixel_data[px_start_byte_offset] = r;
+ }
+
+ return pixbuf;
+ }
+
+ public Gdk.Point unscaled_to_raw_point(Gdk.Point unscaled_point) {
+ Orientation unscaled_orientation = get_orientation();
+
+ Dimensions unscaled_dims =
+ unscaled_orientation.rotate_dimensions(get_dimensions());
+
+ int unscaled_x_offset_raw = 0;
+ int unscaled_y_offset_raw = 0;
+
+ Box crop_box;
+ if (get_raw_crop(out crop_box)) {
+ unscaled_x_offset_raw = crop_box.left;
+ unscaled_y_offset_raw = crop_box.top;
+ }
+
+ Gdk.Point derotated_point =
+ unscaled_orientation.derotate_point(unscaled_dims,
+ unscaled_point);
+
+ derotated_point.x += unscaled_x_offset_raw;
+ derotated_point.y += unscaled_y_offset_raw;
+
+ return derotated_point;
+ }
+
+ public Gdk.Rectangle unscaled_to_raw_rect(Gdk.Rectangle unscaled_rect) {
+ Gdk.Point upper_left = {0};
+ Gdk.Point lower_right = {0};
+ upper_left.x = unscaled_rect.x;
+ upper_left.y = unscaled_rect.y;
+ lower_right.x = upper_left.x + unscaled_rect.width;
+ lower_right.y = upper_left.y + unscaled_rect.height;
+
+ upper_left = unscaled_to_raw_point(upper_left);
+ lower_right = unscaled_to_raw_point(lower_right);
+
+ if (upper_left.x > lower_right.x) {
+ int temp = upper_left.x;
+ upper_left.x = lower_right.x;
+ lower_right.x = temp;
+ }
+ if (upper_left.y > lower_right.y) {
+ int temp = upper_left.y;
+ upper_left.y = lower_right.y;
+ lower_right.y = temp;
+ }
+
+ Gdk.Rectangle raw_rect = Gdk.Rectangle();
+ raw_rect.x = upper_left.x;
+ raw_rect.y = upper_left.y;
+ raw_rect.width = lower_right.x - upper_left.x;
+ raw_rect.height = lower_right.y - upper_left.y;
+
+ return raw_rect;
+ }
+
+ public PixelTransformationBundle? get_enhance_transformations() {
+ Gdk.Pixbuf pixbuf = null;
+
+#if MEASURE_ENHANCE
+ Timer fetch_timer = new Timer();
+#endif
+
+ try {
+ pixbuf = get_pixbuf_with_options(Scaling.for_best_fit(360, false),
+ Photo.Exception.ALL);
+
+#if MEASURE_ENHANCE
+ fetch_timer.stop();
+#endif
+ } catch (Error e) {
+ warning("Photo: get_enhance_transformations: couldn't obtain pixbuf to build " +
+ "transform histogram");
+ return null;
+ }
+
+#if MEASURE_ENHANCE
+ Timer analyze_timer = new Timer();
+#endif
+
+ PixelTransformationBundle transformations = AutoEnhance.create_auto_enhance_adjustments(pixbuf);
+
+#if MEASURE_ENHANCE
+ analyze_timer.stop();
+ debug("Auto-Enhance fetch time: %f sec; analyze time: %f sec", fetch_timer.elapsed(),
+ analyze_timer.elapsed());
+#endif
+
+ return transformations;
+ }
+
+ public bool enhance() {
+ PixelTransformationBundle transformations = get_enhance_transformations();
+
+ if (transformations == null)
+ return false;
+
+#if MEASURE_ENHANCE
+ Timer apply_timer = new Timer();
+#endif
+ lock (row) {
+ set_color_adjustments(transformations);
+ }
+
+#if MEASURE_ENHANCE
+ apply_timer.stop();
+ debug("Auto-Enhance apply time: %f sec", apply_timer.elapsed());
+#endif
+ return true;
+ }
+}
+
+public class LibraryPhotoSourceCollection : MediaSourceCollection {
+ public enum State {
+ UNKNOWN,
+ ONLINE,
+ OFFLINE,
+ TRASH,
+ EDITABLE,
+ DEVELOPER
+ }
+
+ public override TransactionController transaction_controller {
+ get {
+ if (_transaction_controller == null)
+ _transaction_controller = new MediaSourceTransactionController(this);
+
+ return _transaction_controller;
+ }
+ }
+
+ private TransactionController? _transaction_controller = null;
+ private Gee.HashMap<File, LibraryPhoto> by_editable_file = new Gee.HashMap<File, LibraryPhoto>(
+ file_hash, file_equal);
+ private Gee.HashMap<File, LibraryPhoto> by_raw_development_file = new Gee.HashMap<File, LibraryPhoto>(
+ file_hash, file_equal);
+ private Gee.MultiMap<int64?, LibraryPhoto> filesize_to_photo =
+ new Gee.TreeMultiMap<int64?, LibraryPhoto>(int64_compare);
+ private Gee.HashMap<LibraryPhoto, int64?> photo_to_master_filesize =
+ new Gee.HashMap<LibraryPhoto, int64?>(null, null, int64_equal);
+ private Gee.HashMap<LibraryPhoto, int64?> photo_to_editable_filesize =
+ new Gee.HashMap<LibraryPhoto, int64?>(null, null, int64_equal);
+ private Gee.MultiMap<LibraryPhoto, int64?> photo_to_raw_development_filesize =
+ new Gee.TreeMultiMap<LibraryPhoto, int64?>();
+
+ public virtual signal void master_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ }
+
+ public virtual signal void editable_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ }
+
+ public virtual signal void baseline_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ }
+
+ public virtual signal void source_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ }
+
+ public LibraryPhotoSourceCollection() {
+ base ("LibraryPhotoSourceCollection", Photo.get_photo_key);
+
+ get_trashcan().contents_altered.connect(on_trashcan_contents_altered);
+ get_offline_bin().contents_altered.connect(on_offline_contents_altered);
+ }
+
+ protected override MediaSourceHoldingTank create_trashcan() {
+ return new LibraryPhotoSourceHoldingTank(this, check_if_trashed_photo, Photo.get_photo_key);
+ }
+
+ protected override MediaSourceHoldingTank create_offline_bin() {
+ return new LibraryPhotoSourceHoldingTank(this, check_if_offline_photo, Photo.get_photo_key);
+ }
+
+ public override MediaMonitor create_media_monitor(Workers workers, Cancellable cancellable) {
+ return new PhotoMonitor(workers, cancellable);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is LibraryPhoto;
+ }
+
+ public override string get_typename() {
+ return Photo.TYPENAME;
+ }
+
+ public override bool is_file_recognized(File file) {
+ return PhotoFileFormat.is_file_supported(file);
+ }
+
+ protected override void notify_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ if (added != null) {
+ foreach (DataObject object in added) {
+ LibraryPhoto photo = (LibraryPhoto) object;
+
+ File? editable = photo.get_editable_file();
+ if (editable != null)
+ by_editable_file.set(editable, photo);
+ photo.editable_replaced.connect(on_editable_replaced);
+
+ Gee.Collection<File> raw_list = photo.get_raw_developer_files();
+ if (raw_list != null)
+ foreach (File f in raw_list)
+ by_raw_development_file.set(f, photo);
+ photo.raw_development_modified.connect(on_raw_development_modified);
+
+ int64 master_filesize = photo.get_master_photo_row().filesize;
+ int64 editable_filesize = photo.get_editable_photo_row() != null
+ ? photo.get_editable_photo_row().filesize
+ : -1;
+ filesize_to_photo.set(master_filesize, photo);
+ photo_to_master_filesize.set(photo, master_filesize);
+ if (editable_filesize >= 0) {
+ filesize_to_photo.set(editable_filesize, photo);
+ photo_to_editable_filesize.set(photo, editable_filesize);
+ }
+
+ Gee.Collection<BackingPhotoRow>? raw_rows = photo.get_raw_development_photo_rows();
+ if (raw_rows != null) {
+ foreach (BackingPhotoRow row in raw_rows) {
+ if (row.filesize >= 0) {
+ filesize_to_photo.set(row.filesize, photo);
+ photo_to_raw_development_filesize.set(photo, row.filesize);
+ }
+ }
+ }
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ LibraryPhoto photo = (LibraryPhoto) object;
+
+ File? editable = photo.get_editable_file();
+ if (editable != null) {
+ bool is_removed = by_editable_file.unset(photo.get_editable_file());
+ assert(is_removed);
+ }
+ photo.editable_replaced.disconnect(on_editable_replaced);
+
+ Gee.Collection<File> raw_list = photo.get_raw_developer_files();
+ if (raw_list != null)
+ foreach (File f in raw_list)
+ by_raw_development_file.unset(f);
+ photo.raw_development_modified.disconnect(on_raw_development_modified);
+
+ int64 master_filesize = photo.get_master_photo_row().filesize;
+ int64 editable_filesize = photo.get_editable_photo_row() != null
+ ? photo.get_editable_photo_row().filesize
+ : -1;
+ filesize_to_photo.remove(master_filesize, photo);
+ photo_to_master_filesize.unset(photo);
+ if (editable_filesize >= 0) {
+ filesize_to_photo.remove(editable_filesize, photo);
+ photo_to_editable_filesize.unset(photo);
+ }
+
+ Gee.Collection<BackingPhotoRow>? raw_rows = photo.get_raw_development_photo_rows();
+ if (raw_rows != null) {
+ foreach (BackingPhotoRow row in raw_rows) {
+ if (row.filesize >= 0) {
+ filesize_to_photo.remove(row.filesize, photo);
+ photo_to_raw_development_filesize.remove(photo, row.filesize);
+ }
+ }
+ }
+ }
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ private void on_editable_replaced(Photo photo, File? old_file, File? new_file) {
+ if (old_file != null) {
+ bool is_removed = by_editable_file.unset(old_file);
+ assert(is_removed);
+ }
+
+ if (new_file != null)
+ by_editable_file.set(new_file, (LibraryPhoto) photo);
+ }
+
+ private void on_raw_development_modified(Photo _photo) {
+ LibraryPhoto? photo = _photo as LibraryPhoto;
+ if (photo == null)
+ return;
+
+ // Unset existing files.
+ if (photo_to_raw_development_filesize.contains(photo)) {
+ foreach (int64 s in photo_to_raw_development_filesize.get(photo))
+ filesize_to_photo.remove(s, photo);
+ photo_to_raw_development_filesize.remove_all(photo);
+ }
+
+ // Add new ones.
+ Gee.Collection<File> raw_list = photo.get_raw_developer_files();
+ if (raw_list != null)
+ foreach (File f in raw_list)
+ by_raw_development_file.set(f, photo);
+
+ Gee.Collection<BackingPhotoRow>? raw_rows = photo.get_raw_development_photo_rows();
+ if (raw_rows != null) {
+ foreach (BackingPhotoRow row in raw_rows) {
+ if (row.filesize > 0) {
+ filesize_to_photo.set(row.filesize, photo);
+ photo_to_raw_development_filesize.set(photo, row.filesize);
+ }
+ }
+ }
+ }
+
+ protected override void items_altered(Gee.Map<DataObject, Alteration> items) {
+ foreach (DataObject object in items.keys) {
+ Alteration alteration = items.get(object);
+
+ LibraryPhoto photo = (LibraryPhoto) object;
+
+ if (alteration.has_detail("image", "master") || alteration.has_detail("image", "editable")) {
+ int64 old_master_filesize = photo_to_master_filesize.get(photo);
+ int64 old_editable_filesize = photo_to_editable_filesize.has_key(photo)
+ ? photo_to_editable_filesize.get(photo)
+ : -1;
+
+ photo_to_master_filesize.unset(photo);
+ filesize_to_photo.remove(old_master_filesize, photo);
+ if (old_editable_filesize >= 0) {
+ photo_to_editable_filesize.unset(photo);
+ filesize_to_photo.remove(old_editable_filesize, photo);
+ }
+
+ int64 master_filesize = photo.get_master_photo_row().filesize;
+ int64 editable_filesize = photo.get_editable_photo_row() != null
+ ? photo.get_editable_photo_row().filesize
+ : -1;
+ photo_to_master_filesize.set(photo, master_filesize);
+ filesize_to_photo.set(master_filesize, photo);
+ if (editable_filesize >= 0) {
+ photo_to_editable_filesize.set(photo, editable_filesize);
+ filesize_to_photo.set(editable_filesize, photo);
+ }
+ }
+ }
+
+ base.items_altered(items);
+ }
+
+ // This method adds the photos to the Tags (keywords) that were discovered during import.
+ public override void postprocess_imported_media(Gee.Collection<MediaSource> media_sources) {
+ Gee.HashMultiMap<Tag, LibraryPhoto> map = new Gee.HashMultiMap<Tag, LibraryPhoto>();
+ foreach (MediaSource media in media_sources) {
+ LibraryPhoto photo = (LibraryPhoto) media;
+ PhotoMetadata metadata = photo.get_metadata();
+
+ // get an index of all the htags in the application
+ HierarchicalTagIndex global_index = HierarchicalTagIndex.get_global_index();
+
+ // if any hierarchical tag information is available, process it first. hierarchical tag
+ // information must be processed first to avoid tag duplication, since most photo
+ // management applications that support hierarchical tags also "flatten" the
+ // hierarchical tag information as plain old tags. If a tag name appears as part of
+ // a hierarchical path, it needs to be excluded from being processed as a flat tag
+ HierarchicalTagIndex? htag_index = null;
+ if (metadata.has_hierarchical_keywords()) {
+ htag_index = HierarchicalTagUtilities.process_hierarchical_import_keywords(
+ metadata.get_hierarchical_keywords());
+ }
+
+ if (photo.get_import_keywords() != null) {
+ foreach (string keyword in photo.get_import_keywords()) {
+ if (htag_index != null && htag_index.is_tag_in_index(keyword))
+ continue;
+
+ string? name = Tag.prep_tag_name(keyword);
+
+ if (global_index.is_tag_in_index(name)) {
+ string most_derived_path = global_index.get_path_for_name(name);
+ map.set(Tag.for_path(most_derived_path), photo);
+ continue;
+ }
+
+ if (name != null)
+ map.set(Tag.for_path(name), photo);
+ }
+ }
+
+ if (metadata.has_hierarchical_keywords()) {
+ foreach (string path in htag_index.get_all_paths()) {
+ string? name = Tag.prep_tag_name(path);
+ if (name != null)
+ map.set(Tag.for_path(name), photo);
+ }
+ }
+ }
+
+ foreach (MediaSource media in media_sources) {
+ LibraryPhoto photo = (LibraryPhoto) media;
+ photo.clear_import_keywords();
+ }
+
+ foreach (Tag tag in map.get_keys())
+ tag.attach_many(map.get(tag));
+
+ base.postprocess_imported_media(media_sources);
+ }
+
+ // This is only called by LibraryPhoto.
+ public virtual void notify_master_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ master_reimported(photo, metadata);
+ }
+
+ // This is only called by LibraryPhoto.
+ public virtual void notify_editable_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ editable_reimported(photo, metadata);
+ }
+
+ // This is only called by LibraryPhoto.
+ public virtual void notify_source_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ source_reimported(photo, metadata);
+ }
+
+ // This is only called by LibraryPhoto.
+ public virtual void notify_baseline_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ baseline_reimported(photo, metadata);
+ }
+
+ protected override MediaSource? fetch_by_numeric_id(int64 numeric_id) {
+ return fetch(PhotoID(numeric_id));
+ }
+
+ private void on_trashcan_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ trashcan_contents_altered((Gee.Collection<LibraryPhoto>?) added,
+ (Gee.Collection<LibraryPhoto>?) removed);
+ }
+
+ private bool check_if_trashed_photo(DataSource source, Alteration alteration) {
+ return ((LibraryPhoto) source).is_trashed();
+ }
+
+ private void on_offline_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ offline_contents_altered((Gee.Collection<LibraryPhoto>?) added,
+ (Gee.Collection<LibraryPhoto>?) removed);
+ }
+
+ private bool check_if_offline_photo(DataSource source, Alteration alteration) {
+ return ((LibraryPhoto) source).is_offline();
+ }
+
+ public override MediaSource? fetch_by_source_id(string source_id) {
+ assert(source_id.has_prefix(Photo.TYPENAME));
+ string numeric_only = source_id.substring(Photo.TYPENAME.length, -1);
+
+ return fetch_by_numeric_id(parse_int64(numeric_only, 16));
+ }
+
+ public override Gee.Collection<string> get_event_source_ids(EventID event_id){
+ return PhotoTable.get_instance().get_event_source_ids(event_id);
+ }
+
+ public LibraryPhoto fetch(PhotoID photo_id) {
+ return (LibraryPhoto) fetch_by_key(photo_id.id);
+ }
+
+ public LibraryPhoto? fetch_by_editable_file(File file) {
+ return by_editable_file.get(file);
+ }
+
+ public LibraryPhoto? fetch_by_raw_development_file(File file) {
+ return by_raw_development_file.get(file);
+ }
+
+ private void compare_backing(LibraryPhoto photo, FileInfo info,
+ Gee.Collection<LibraryPhoto> matches_master, Gee.Collection<LibraryPhoto> matches_editable,
+ Gee.Collection<LibraryPhoto> matches_development) {
+ if (photo.get_master_photo_row().matches_file_info(info))
+ matches_master.add(photo);
+
+ BackingPhotoRow? editable = photo.get_editable_photo_row();
+ if (editable != null && editable.matches_file_info(info))
+ matches_editable.add(photo);
+
+ Gee.Collection<BackingPhotoRow>? development = photo.get_raw_development_photo_rows();
+ if (development != null) {
+ foreach (BackingPhotoRow row in development) {
+ if (row.matches_file_info(info)) {
+ matches_development.add(photo);
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Adds photos to both collections if their filesize and timestamp match. Note that it's possible
+ // for a single photo to be added to both collections.
+ public void fetch_by_matching_backing(FileInfo info, Gee.Collection<LibraryPhoto> matches_master,
+ Gee.Collection<LibraryPhoto> matches_editable, Gee.Collection<LibraryPhoto> matched_development) {
+ foreach (LibraryPhoto photo in filesize_to_photo.get(info.get_size()))
+ compare_backing(photo, info, matches_master, matches_editable, matched_development);
+
+ foreach (MediaSource media in get_offline_bin_contents())
+ compare_backing((LibraryPhoto) media, info, matches_master, matches_editable, matched_development);
+ }
+
+ public PhotoID get_basename_filesize_duplicate(string basename, int64 filesize) {
+ foreach (LibraryPhoto photo in filesize_to_photo.get(filesize)) {
+ if (utf8_ci_compare(photo.get_master_file().get_basename(), basename) == 0)
+ return photo.get_photo_id();
+ }
+
+ return PhotoID(); // default constructor for PhotoIDs will create an invalid ID --
+ // this is just the behavior that we want
+ }
+
+ public bool has_basename_filesize_duplicate(string basename, int64 filesize) {
+ return get_basename_filesize_duplicate(basename, filesize).is_valid();
+ }
+
+ public LibraryPhoto? get_trashed_by_file(File file) {
+ LibraryPhoto? photo = (LibraryPhoto?) get_trashcan().fetch_by_master_file(file);
+ if (photo == null)
+ photo = (LibraryPhoto?) ((LibraryPhotoSourceHoldingTank) get_trashcan()).
+ fetch_by_backing_file(file);
+
+ return photo;
+ }
+
+ public LibraryPhoto? get_trashed_by_md5(string md5) {
+ return (LibraryPhoto?) get_trashcan().fetch_by_md5(md5);
+ }
+
+ public LibraryPhoto? get_offline_by_file(File file) {
+ LibraryPhoto? photo = (LibraryPhoto?) get_offline_bin().fetch_by_master_file(file);
+ if (photo == null)
+ photo = (LibraryPhoto?) ((LibraryPhotoSourceHoldingTank) get_offline_bin()).
+ fetch_by_backing_file(file);
+
+ return photo;
+ }
+
+ public LibraryPhoto? get_offline_by_md5(string md5) {
+ return (LibraryPhoto?) get_offline_bin().fetch_by_md5(md5);
+ }
+
+ public int get_offline_count() {
+ return get_offline_bin().get_count();
+ }
+
+ public LibraryPhoto? get_state_by_file(File file, out State state) {
+ LibraryPhoto? photo = (LibraryPhoto?) fetch_by_master_file(file);
+ if (photo != null) {
+ state = State.ONLINE;
+
+ return photo;
+ }
+
+ photo = fetch_by_editable_file(file);
+ if (photo != null) {
+ state = State.EDITABLE;
+
+ return photo;
+ }
+
+ photo = fetch_by_raw_development_file(file);
+ if (photo != null) {
+ state = State.DEVELOPER;
+
+ return photo;
+ }
+
+ photo = get_trashed_by_file(file) as LibraryPhoto;
+ if (photo != null) {
+ state = State.TRASH;
+
+ return photo;
+ }
+
+ photo = get_offline_by_file(file) as LibraryPhoto;
+ if (photo != null) {
+ state = State.OFFLINE;
+
+ return photo;
+ }
+
+ state = State.UNKNOWN;
+
+ return null;
+ }
+
+ public override bool has_backlink(SourceBacklink backlink) {
+ if (base.has_backlink(backlink))
+ return true;
+
+ if (get_trashcan().has_backlink(backlink))
+ return true;
+
+ if (get_offline_bin().has_backlink(backlink))
+ return true;
+
+ return false;
+ }
+
+ public override void remove_backlink(SourceBacklink backlink) {
+ get_trashcan().remove_backlink(backlink);
+ get_offline_bin().remove_backlink(backlink);
+
+ base.remove_backlink(backlink);
+ }
+}
+
+//
+// LibraryPhoto
+//
+
+public class LibraryPhoto : Photo, Flaggable, Monitorable {
+ // Top 16 bits are reserved for Photo
+ // Warning: FLAG_HIDDEN and FLAG_FAVORITE have been deprecated for ratings and rating filters.
+ private const uint64 FLAG_HIDDEN = 0x0000000000000001;
+ private const uint64 FLAG_FAVORITE = 0x0000000000000002;
+ private const uint64 FLAG_TRASH = 0x0000000000000004;
+ private const uint64 FLAG_OFFLINE = 0x0000000000000008;
+ private const uint64 FLAG_FLAGGED = 0x0000000000000010;
+
+ public static LibraryPhotoSourceCollection global = null;
+
+ private bool block_thumbnail_generation = false;
+ private OneShotScheduler thumbnail_scheduler = null;
+ private Gee.Collection<string>? import_keywords;
+
+ private LibraryPhoto(PhotoRow row) {
+ base (row);
+
+ this.import_keywords = null;
+
+ thumbnail_scheduler = new OneShotScheduler("LibraryPhoto", generate_thumbnails);
+
+ // if marked in a state where they're held in an orphanage, rehydrate their backlinks
+ if ((row.flags & (FLAG_TRASH | FLAG_OFFLINE)) != 0)
+ rehydrate_backlinks(global, row.backlinks);
+
+ if ((row.flags & (FLAG_HIDDEN | FLAG_FAVORITE)) != 0)
+ upgrade_rating_flags(row.flags);
+ }
+
+ private LibraryPhoto.from_import_params(PhotoImportParams import_params) {
+ base (import_params.row);
+
+ this.import_keywords = import_params.keywords;
+ thumbnail_scheduler = new OneShotScheduler("LibraryPhoto", generate_thumbnails);
+
+ // if marked in a state where they're held in an orphanage, rehydrate their backlinks
+ if ((import_params.row.flags & (FLAG_TRASH | FLAG_OFFLINE)) != 0)
+ rehydrate_backlinks(global, import_params.row.backlinks);
+
+ if ((import_params.row.flags & (FLAG_HIDDEN | FLAG_FAVORITE)) != 0)
+ upgrade_rating_flags(import_params.row.flags);
+ }
+
+ public static void init(ProgressMonitor? monitor = null) {
+ global = new LibraryPhotoSourceCollection();
+
+ // prefetch all the photos from the database and add them to the global collection ...
+ // do in batches to take advantage of add_many()
+ Gee.ArrayList<PhotoRow?> all = PhotoTable.get_instance().get_all();
+ Gee.ArrayList<LibraryPhoto> all_photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<LibraryPhoto> trashed_photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<LibraryPhoto> offline_photos = new Gee.ArrayList<LibraryPhoto>();
+ int count = all.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ PhotoRow row = all.get(ctr);
+ LibraryPhoto photo = new LibraryPhoto(row);
+ uint64 flags = row.flags;
+
+ if ((flags & FLAG_TRASH) != 0)
+ trashed_photos.add(photo);
+ else if ((flags & FLAG_OFFLINE) != 0)
+ offline_photos.add(photo);
+ else
+ all_photos.add(photo);
+
+ if (monitor != null)
+ monitor(ctr, count);
+ }
+
+ global.add_many(all_photos);
+ global.add_many_to_trash(trashed_photos);
+ global.add_many_to_offline(offline_photos);
+ }
+
+ public static void terminate() {
+ }
+
+ // This accepts a PhotoRow that was prepared with Photo.prepare_for_import and
+ // has not already been inserted in the database. See PhotoTable.add() for which fields are
+ // used and which are ignored. The PhotoRow itself will be modified with the remaining values
+ // as they are stored in the database.
+ public static ImportResult import_create(PhotoImportParams params, out LibraryPhoto photo) {
+ // add to the database
+ PhotoID photo_id = PhotoTable.get_instance().add(params.row);
+ if (photo_id.is_invalid()) {
+ photo = null;
+
+ return ImportResult.DATABASE_ERROR;
+ }
+
+ // create local object but don't add to global until thumbnails generated
+ photo = new LibraryPhoto.from_import_params(params);
+
+ return ImportResult.SUCCESS;
+ }
+
+ public static void import_failed(LibraryPhoto photo) {
+ try {
+ PhotoTable.get_instance().remove(photo.get_photo_id());
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+
+ protected override void notify_master_reimported(PhotoMetadata? metadata) {
+ base.notify_master_reimported(metadata);
+
+ global.notify_master_reimported(this, metadata);
+ }
+
+ protected override void notify_editable_reimported(PhotoMetadata? metadata) {
+ base.notify_editable_reimported(metadata);
+
+ global.notify_editable_reimported(this, metadata);
+ }
+
+ protected override void notify_source_reimported(PhotoMetadata? metadata) {
+ base.notify_source_reimported(metadata);
+
+ global.notify_source_reimported(this, metadata);
+ }
+
+ protected override void notify_baseline_reimported(PhotoMetadata? metadata) {
+ base.notify_baseline_reimported(metadata);
+
+ global.notify_baseline_reimported(this, metadata);
+ }
+
+ private void generate_thumbnails() {
+ try {
+ ThumbnailCache.import_from_source(this, true);
+ } catch (Error err) {
+ warning("Unable to generate thumbnails for %s: %s", to_string(), err.message);
+ }
+
+ // fire signal that thumbnails have changed
+ notify_thumbnail_altered();
+ }
+
+ // These keywords are only used during import and should not be relied upon elsewhere.
+ public Gee.Collection<string>? get_import_keywords() {
+ return import_keywords;
+ }
+
+ public void clear_import_keywords() {
+ import_keywords = null;
+ }
+
+ public override void notify_altered(Alteration alteration) {
+ // generate new thumbnails in the background
+ if (!block_thumbnail_generation && alteration.has_subject("image"))
+ thumbnail_scheduler.at_priority_idle(Priority.LOW);
+
+ base.notify_altered(alteration);
+ }
+
+ public override Gdk.Pixbuf get_preview_pixbuf(Scaling scaling) throws Error {
+ Gdk.Pixbuf pixbuf = get_thumbnail(ThumbnailCache.Size.BIG);
+
+ return scaling.perform_on_pixbuf(pixbuf, Gdk.InterpType.BILINEAR, true);
+ }
+
+ public override void rotate(Rotation rotation) {
+ // block thumbnail generation for this operation; taken care of below
+ block_thumbnail_generation = true;
+ base.rotate(rotation);
+ block_thumbnail_generation = false;
+
+ // because rotations are (a) common and available everywhere in the app, (b) the user expects
+ // a level of responsiveness not necessarily required by other modifications, (c) can be
+ // performed on multiple images simultaneously, and (d) can't cache a lot of full-sized
+ // pixbufs for rotate-and-scale ops, perform the rotation directly on the already-modified
+ // thumbnails.
+ try {
+ ThumbnailCache.rotate(this, rotation);
+ } catch (Error err) {
+ // TODO: Mark thumbnails as dirty in database
+ warning("Unable to update thumbnails for %s: %s", to_string(), err.message);
+ }
+
+ notify_thumbnail_altered();
+ }
+
+ // Returns unscaled thumbnail with all modifications applied applicable to the scale
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ return ThumbnailCache.fetch(this, scale);
+ }
+
+ // Duplicates a backing photo row, returning the ID.
+ // An invalid ID will be returned if the backing photo row is not set or is invalid.
+ private BackingPhotoID duplicate_backing_photo(BackingPhotoRow? backing) throws Error {
+ BackingPhotoID backing_id = BackingPhotoID();
+ if (backing == null || backing.filepath == null)
+ return backing_id; // empty, invalid ID
+
+ File file = File.new_for_path(backing.filepath);
+ if (file.query_exists()) {
+ File dupe_file = LibraryFiles.duplicate(file, on_duplicate_progress, true);
+
+ DetectedPhotoInformation detected;
+ BackingPhotoRow? state = query_backing_photo_row(dupe_file, PhotoFileSniffer.Options.NO_MD5,
+ out detected);
+ if (state != null) {
+ BackingPhotoTable.get_instance().add(state);
+ backing_id = state.id;
+ }
+ }
+
+ return backing_id;
+ }
+
+ public LibraryPhoto duplicate() throws Error {
+ // clone the master file
+ File dupe_file = LibraryFiles.duplicate(get_master_file(), on_duplicate_progress, true);
+
+ // Duplicate editable and raw developments (if they exist)
+ BackingPhotoID dupe_editable_id = duplicate_backing_photo(get_editable_photo_row());
+ BackingPhotoID dupe_raw_shotwell_id = duplicate_backing_photo(
+ get_raw_development_photo_row(RawDeveloper.SHOTWELL));
+ BackingPhotoID dupe_raw_camera_id = duplicate_backing_photo(
+ get_raw_development_photo_row(RawDeveloper.CAMERA));
+ BackingPhotoID dupe_raw_embedded_id = duplicate_backing_photo(
+ get_raw_development_photo_row(RawDeveloper.EMBEDDED));
+
+ // clone the row in the database for these new backing files
+ PhotoID dupe_id = PhotoTable.get_instance().duplicate(get_photo_id(), dupe_file.get_path(),
+ dupe_editable_id, dupe_raw_shotwell_id, dupe_raw_camera_id, dupe_raw_embedded_id);
+ PhotoRow dupe_row = PhotoTable.get_instance().get_row(dupe_id);
+
+ // build the DataSource for the duplicate
+ LibraryPhoto dupe = new LibraryPhoto(dupe_row);
+
+ // clone thumbnails
+ ThumbnailCache.duplicate(this, dupe);
+
+ // add it to the SourceCollection; this notifies everyone interested of its presence
+ global.add(dupe);
+
+ // if it is not in "No Event" attach to event
+ if (dupe.get_event() != null)
+ dupe.get_event().attach(dupe);
+
+ // attach tags
+ Gee.Collection<Tag>? tags = Tag.global.fetch_for_source(this);
+ if (tags != null) {
+ foreach (Tag tag in tags) {
+ tag.attach(dupe);
+ }
+ }
+
+ return dupe;
+ }
+
+ private void on_duplicate_progress(int64 current, int64 total) {
+ spin_event_loop();
+ }
+
+ private void upgrade_rating_flags(uint64 flags) {
+ if ((flags & FLAG_HIDDEN) != 0) {
+ set_rating(Rating.REJECTED);
+ remove_flags(FLAG_HIDDEN);
+ }
+
+ if ((flags & FLAG_FAVORITE) != 0) {
+ set_rating(Rating.FIVE);
+ remove_flags(FLAG_FAVORITE);
+ }
+ }
+
+ // Blotto even!
+ public override bool is_trashed() {
+ return is_flag_set(FLAG_TRASH);
+ }
+
+ public override void trash() {
+ add_flags(FLAG_TRASH);
+ }
+
+ public override void untrash() {
+ remove_flags(FLAG_TRASH);
+ }
+
+ public override bool is_offline() {
+ return is_flag_set(FLAG_OFFLINE);
+ }
+
+ public override void mark_offline() {
+ add_flags(FLAG_OFFLINE);
+ }
+
+ public override void mark_online() {
+ remove_flags(FLAG_OFFLINE);
+ }
+
+ public bool is_flagged() {
+ return is_flag_set(FLAG_FLAGGED);
+ }
+
+ public void mark_flagged() {
+ add_flags(FLAG_FLAGGED, new Alteration("metadata", "flagged"));
+ }
+
+ public void mark_unflagged() {
+ remove_flags(FLAG_FLAGGED, new Alteration("metadata", "flagged"));
+ }
+
+ public override bool internal_delete_backing() throws Error {
+ // allow the base classes to work first because delete_original_file() will attempt to
+ // remove empty directories as well
+ if (!base.internal_delete_backing())
+ return false;
+
+ return delete_original_file();
+ }
+
+ public override void destroy() {
+ PhotoID photo_id = get_photo_id();
+
+ // remove all cached thumbnails
+ ThumbnailCache.remove(this);
+
+ // remove from photo table -- should be wiped from storage now (other classes may have added
+ // photo_id to other parts of the database ... it's their responsibility to remove them
+ // when removed() is called)
+ try {
+ PhotoTable.get_instance().remove(photo_id);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ base.destroy();
+ }
+
+ public static bool has_nontrash_duplicate(File? file, string? thumbnail_md5, string? full_md5,
+ PhotoFileFormat file_format) {
+ return get_nontrash_duplicate(file, thumbnail_md5, full_md5, file_format).is_valid();
+ }
+
+ public static PhotoID get_nontrash_duplicate(File? file, string? thumbnail_md5,
+ string? full_md5, PhotoFileFormat file_format) {
+ PhotoID[]? ids = get_duplicate_ids(file, thumbnail_md5, full_md5, file_format);
+
+ if (ids == null || ids.length == 0)
+ return PhotoID(); // return an invalid PhotoID
+
+ foreach (PhotoID id in ids) {
+ LibraryPhoto photo = LibraryPhoto.global.fetch(id);
+ if (photo != null && !photo.is_trashed())
+ return id;
+ }
+
+ return PhotoID();
+ }
+
+ protected override bool has_user_generated_metadata() {
+ Gee.List<Tag>? tags = Tag.global.fetch_for_source(this);
+
+ PhotoMetadata? metadata = get_metadata();
+ if (metadata == null)
+ return tags != null || tags.size > 0 || get_rating() != Rating.UNRATED;
+
+ if (get_rating() != metadata.get_rating())
+ return true;
+
+ Gee.Set<string>? keywords = metadata.get_keywords();
+ int tags_count = (tags != null) ? tags.size : 0;
+ int keywords_count = (keywords != null) ? keywords.size : 0;
+
+ if (tags_count != keywords_count)
+ return true;
+
+ if (tags != null && keywords != null) {
+ foreach (Tag tag in tags) {
+ if (!keywords.contains(tag.get_name().normalize()))
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected override void set_user_metadata_for_export(PhotoMetadata metadata) {
+ Gee.List<Tag>? photo_tags = Tag.global.fetch_for_source(this);
+ if(photo_tags != null) {
+ Gee.Collection<string> string_tags = new Gee.ArrayList<string>();
+ foreach (Tag tag in photo_tags) {
+ string_tags.add(tag.get_name());
+ }
+ metadata.set_keywords(string_tags);
+ } else
+ metadata.set_keywords(null);
+
+ metadata.set_rating(get_rating());
+ }
+
+ protected override void apply_user_metadata_for_reimport(PhotoMetadata metadata) {
+ HierarchicalTagIndex? new_htag_index = null;
+
+ if (metadata.has_hierarchical_keywords()) {
+ new_htag_index = HierarchicalTagUtilities.process_hierarchical_import_keywords(
+ metadata.get_hierarchical_keywords());
+ }
+
+ Gee.Collection<string>? keywords = metadata.get_keywords();
+ if (keywords != null) {
+ foreach (string keyword in keywords) {
+ if (new_htag_index != null && new_htag_index.is_tag_in_index(keyword))
+ continue;
+
+ string safe_keyword = HierarchicalTagUtilities.make_flat_tag_safe(keyword);
+ string promoted_keyword = HierarchicalTagUtilities.flat_to_hierarchical(
+ safe_keyword);
+
+ if (Tag.global.exists(safe_keyword)) {
+ Tag.for_path(safe_keyword).attach(this);
+ continue;
+ }
+
+ if (Tag.global.exists(promoted_keyword)) {
+ Tag.for_path(promoted_keyword).attach(this);
+ continue;
+ }
+
+ Tag.for_path(keyword).attach(this);
+ }
+ }
+
+ if (new_htag_index != null) {
+ foreach (string path in new_htag_index.get_all_paths())
+ Tag.for_path(path).attach(this);
+ }
+ }
+}
+
+// Used for trash and offline bin of LibraryPhotoSourceCollection
+public class LibraryPhotoSourceHoldingTank : MediaSourceHoldingTank {
+ private Gee.HashMap<File, LibraryPhoto> editable_file_map = new Gee.HashMap<File, LibraryPhoto>(
+ file_hash, file_equal);
+ private Gee.HashMap<File, LibraryPhoto> development_file_map = new Gee.HashMap<File, LibraryPhoto>(
+ file_hash, file_equal);
+ private Gee.MultiMap<LibraryPhoto, File> reverse_editable_file_map
+ = new Gee.HashMultiMap<LibraryPhoto, File>(null, null, file_hash, file_equal);
+ private Gee.MultiMap<LibraryPhoto, File> reverse_development_file_map
+ = new Gee.HashMultiMap<LibraryPhoto, File>(null, null, file_hash, file_equal);
+
+ public LibraryPhotoSourceHoldingTank(LibraryPhotoSourceCollection sources,
+ SourceHoldingTank.CheckToKeep check_to_keep, GetSourceDatabaseKey get_key) {
+ base (sources, check_to_keep, get_key);
+ }
+
+ public LibraryPhoto? fetch_by_backing_file(File file) {
+ LibraryPhoto? ret = null;
+ ret = editable_file_map.get(file);
+ if (ret != null)
+ return ret;
+
+ return development_file_map.get(file);
+ }
+
+ protected override void notify_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ if (added != null) {
+ foreach (DataSource source in added) {
+ LibraryPhoto photo = (LibraryPhoto) source;
+
+ // Editable files.
+ if (photo.get_editable_file() != null) {
+ editable_file_map.set(photo.get_editable_file(), photo);
+ reverse_editable_file_map.set(photo, photo.get_editable_file());
+ }
+
+ // RAW developments.
+ Gee.Collection<File>? raw_files = photo.get_raw_developer_files();
+ if (raw_files != null) {
+ foreach (File f in raw_files) {
+ development_file_map.set(f, photo);
+ reverse_development_file_map.set(photo, f);
+ }
+ }
+
+ photo.editable_replaced.connect(on_editable_replaced);
+ photo.raw_development_modified.connect(on_raw_development_modified);
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataSource source in removed) {
+ LibraryPhoto photo = (LibraryPhoto) source;
+ foreach (File f in reverse_editable_file_map.get(photo))
+ editable_file_map.unset(f);
+
+ foreach (File f in reverse_development_file_map.get(photo))
+ development_file_map.unset(f);
+
+ reverse_editable_file_map.remove_all(photo);
+ reverse_development_file_map.remove_all(photo);
+
+ photo.editable_replaced.disconnect(on_editable_replaced);
+ photo.raw_development_modified.disconnect(on_raw_development_modified);
+ }
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ private void on_editable_replaced(Photo _photo, File? old_file, File? new_file) {
+ LibraryPhoto? photo = _photo as LibraryPhoto;
+ assert(photo != null);
+
+ if (old_file != null) {
+ editable_file_map.unset(old_file);
+ reverse_editable_file_map.remove(photo, old_file);
+ }
+
+ if (new_file != null)
+ editable_file_map.set(new_file, photo);
+ reverse_editable_file_map.set(photo, new_file);
+ }
+
+ private void on_raw_development_modified(Photo _photo) {
+ LibraryPhoto? photo = _photo as LibraryPhoto;
+ assert(photo != null);
+
+ // Unset existing files.
+ if (reverse_development_file_map.contains(photo)) {
+ foreach (File f in reverse_development_file_map.get(photo))
+ development_file_map.unset(f);
+ reverse_development_file_map.remove_all(photo);
+ }
+
+ // Add new ones.
+ Gee.Collection<File> raw_list = photo.get_raw_developer_files();
+ if (raw_list != null) {
+ foreach (File f in raw_list) {
+ development_file_map.set(f, photo);
+ reverse_development_file_map.set(photo, f);
+ }
+ }
+ }
+}
+
diff --git a/src/PhotoMonitor.vala b/src/PhotoMonitor.vala
new file mode 100644
index 0000000..d7f2929
--- /dev/null
+++ b/src/PhotoMonitor.vala
@@ -0,0 +1,1156 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+private class PhotoUpdates : MonitorableUpdates {
+ public LibraryPhoto photo;
+
+ public bool reimport_master = false;
+ public bool reimport_editable = false;
+ public bool reimport_raw_developments = false;
+ public File? editable_file = null;
+ public bool editable_file_info_altered = false;
+ public bool raw_developer_file_info_altered = false;
+ public FileInfo? editable_file_info = null;
+ public bool editable_in_alteration = false;
+ public bool raw_development_in_alteration = false;
+ public bool revert_to_master = false;
+ public Gee.Collection<File> developer_files = new Gee.ArrayList<File>();
+
+ public PhotoUpdates(LibraryPhoto photo) {
+ base (photo);
+
+ this.photo = photo;
+ }
+
+ public override void mark_offline() {
+ base.mark_offline();
+
+ reimport_master = false;
+ reimport_editable = false;
+ reimport_raw_developments = false;
+ }
+
+ public bool is_reimport_master() {
+ return reimport_master;
+ }
+
+ public bool is_reimport_editable() {
+ return reimport_editable;
+ }
+
+ public File? get_editable_file() {
+ return editable_file;
+ }
+
+ public FileInfo? get_editable_file_info() {
+ return editable_file_info;
+ }
+
+ public Gee.Collection<File> get_raw_developer_files() {
+ return developer_files;
+ }
+
+ public override bool is_in_alteration() {
+ return base.is_in_alteration() || editable_in_alteration;
+ }
+
+ public bool is_revert_to_master() {
+ return revert_to_master;
+ }
+
+ public virtual void set_editable_file(File? file) {
+ // if reverting, don't bother
+ if (file != null && revert_to_master)
+ return;
+
+ editable_file = file;
+ }
+
+ public virtual void set_editable_file_info(FileInfo? info) {
+ // if reverting, don't bother
+ if (info != null && revert_to_master)
+ return;
+
+ editable_file_info = info;
+ if (info == null)
+ editable_file_info_altered = false;
+ }
+
+ public virtual void set_editable_file_info_altered(bool altered) {
+ // if reverting, don't bother
+ if (altered && revert_to_master)
+ return;
+
+ editable_file_info_altered = altered;
+ }
+
+ public virtual void set_editable_in_alteration(bool in_alteration) {
+ editable_in_alteration = in_alteration;
+ }
+
+ public virtual void set_raw_development_in_alteration(bool in_alteration) {
+ raw_development_in_alteration = in_alteration;
+ }
+
+ public virtual void set_raw_developer_file_info_altered(bool altered) {
+ raw_developer_file_info_altered = altered;
+ }
+
+ public virtual void set_revert_to_master(bool revert) {
+ if (revert) {
+ // this means nothing any longer
+ reimport_editable = false;
+ editable_file = null;
+ editable_file_info = null;
+ }
+
+ revert_to_master = revert;
+ }
+
+ public virtual void add_raw_developer_file(File file) {
+ developer_files.add(file);
+ }
+
+ public virtual void clear_raw_developer_files() {
+ developer_files.clear();
+ }
+
+ public virtual void set_reimport_master(bool reimport) {
+ reimport_master = reimport;
+
+ if (reimport)
+ mark_online();
+ }
+
+ public virtual void set_reimport_editable(bool reimport) {
+ // if reverting or going offline, don't bother
+ if (reimport && (revert_to_master || is_set_offline()))
+ return;
+
+ reimport_editable = reimport;
+ }
+
+ public virtual void set_reimport_raw_developments(bool reimport) {
+ reimport_raw_developments = reimport;
+
+ if (reimport)
+ mark_online();
+ }
+
+ public override bool is_all_updated() {
+ return base.is_all_updated()
+ && reimport_master == false
+ && reimport_editable == false
+ && editable_file == null
+ && editable_file_info_altered == false
+ && editable_file_info == null
+ && editable_in_alteration == false
+ && developer_files.size == 0
+ && raw_developer_file_info_altered == false
+ && revert_to_master == false;
+ }
+}
+
+private class PhotoMonitor : MediaMonitor {
+ private const int MAX_REIMPORT_JOBS_PER_CYCLE = 20;
+ private const int MAX_REVERTS_PER_CYCLE = 5;
+
+ private class ReimportMasterJob : BackgroundJob {
+ public LibraryPhoto photo;
+ public Photo.ReimportMasterState reimport_state = null;
+ public bool mark_online = false;
+ public Error err = null;
+
+ public ReimportMasterJob(PhotoMonitor owner, LibraryPhoto photo) {
+ base (owner, owner.on_master_reimported, new Cancellable(),
+ owner.on_master_reimport_cancelled);
+
+ this.photo = photo;
+ }
+
+ public override void execute() {
+ try {
+ mark_online = photo.prepare_for_reimport_master(out reimport_state);
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private class ReimportEditableJob : BackgroundJob {
+ public LibraryPhoto photo;
+ public Photo.ReimportEditableState state = null;
+ public bool success = false;
+ public Error err = null;
+
+ public ReimportEditableJob(PhotoMonitor owner, LibraryPhoto photo) {
+ base (owner, owner.on_editable_reimported, new Cancellable(),
+ owner.on_editable_reimport_cancelled);
+
+ this.photo = photo;
+ }
+
+ public override void execute() {
+ try {
+ success = photo.prepare_for_reimport_editable(out state);
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private class ReimportRawDevelopmentJob : BackgroundJob {
+ public LibraryPhoto photo;
+ public Photo.ReimportRawDevelopmentState state = null;
+ public bool success = false;
+ public Error err = null;
+
+ public ReimportRawDevelopmentJob(PhotoMonitor owner, LibraryPhoto photo) {
+ base (owner, owner.on_raw_development_reimported, new Cancellable(),
+ owner.on_raw_development_reimport_cancelled);
+
+ this.photo = photo;
+ }
+
+ public override void execute() {
+ try {
+ success = photo.prepare_for_reimport_raw_development(out state);
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private Workers workers;
+ private Gee.ArrayList<LibraryPhoto> matched_editables = new Gee.ArrayList<LibraryPhoto>();
+ private Gee.ArrayList<LibraryPhoto> matched_developments = new Gee.ArrayList<LibraryPhoto>();
+ private Gee.HashMap<LibraryPhoto, ReimportMasterJob> master_reimport_pending = new Gee.HashMap<
+ LibraryPhoto, ReimportMasterJob>();
+ private Gee.HashMap<LibraryPhoto, ReimportEditableJob> editable_reimport_pending =
+ new Gee.HashMap<LibraryPhoto, ReimportEditableJob>();
+ private Gee.HashMap<LibraryPhoto, ReimportRawDevelopmentJob> raw_developments_reimport_pending =
+ new Gee.HashMap<LibraryPhoto, ReimportRawDevelopmentJob>();
+
+ public PhotoMonitor(Workers workers, Cancellable cancellable) {
+ base (LibraryPhoto.global, cancellable);
+
+ this.workers = workers;
+ }
+
+ protected override MonitorableUpdates create_updates(Monitorable monitorable) {
+ assert(monitorable is LibraryPhoto);
+
+ return new PhotoUpdates((LibraryPhoto) monitorable);
+ }
+
+ public override MediaSourceCollection get_media_source_collection() {
+ return LibraryPhoto.global;
+ }
+
+ public override bool is_file_represented(File file) {
+ LibraryPhotoSourceCollection.State state;
+ return get_photo_state_by_file(file, out state) != null;
+ }
+
+ public override void close() {
+ foreach (ReimportMasterJob job in master_reimport_pending.values)
+ job.cancel();
+
+ foreach (ReimportEditableJob job in editable_reimport_pending.values)
+ job.cancel();
+
+ foreach (ReimportRawDevelopmentJob job in raw_developments_reimport_pending.values)
+ job.cancel();
+
+ base.close();
+ }
+
+ private void cancel_reimports(LibraryPhoto photo) {
+ ReimportMasterJob? master_job = master_reimport_pending.get(photo);
+ if (master_job != null)
+ master_job.cancel();
+
+ ReimportEditableJob? editable_job = editable_reimport_pending.get(photo);
+ if (editable_job != null)
+ editable_job.cancel();
+ }
+
+ public override MediaMonitor.DiscoveredFile notify_file_discovered(File file, FileInfo info,
+ out Monitorable monitorable) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null) {
+ monitorable = null;
+
+ return MediaMonitor.DiscoveredFile.UNKNOWN;
+ }
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ monitorable = photo;
+
+ return MediaMonitor.DiscoveredFile.REPRESENTED;
+
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ default:
+ // ignored ... trash always stays in trash, offline or not, and editables are
+ // simply attached to online/offline photos
+ monitorable = null;
+
+ return MediaMonitor.DiscoveredFile.IGNORE;
+ }
+ }
+
+ public override Gee.Collection<Monitorable>? candidates_for_unknown_file(File file, FileInfo info,
+ out MediaMonitor.DiscoveredFile result) {
+ // reset with each call
+ matched_editables.clear();
+ matched_developments.clear();
+
+ Gee.Collection<LibraryPhoto> matched_masters = new Gee.ArrayList<LibraryPhoto>();
+ LibraryPhoto.global.fetch_by_matching_backing(info, matched_masters, matched_editables,
+ matched_developments);
+ if (matched_masters.size > 0) {
+ result = MediaMonitor.DiscoveredFile.UNKNOWN;
+
+ return matched_masters;
+ }
+
+ if (matched_editables.size == 0 && matched_developments.size == 0) {
+ result = MediaMonitor.DiscoveredFile.UNKNOWN;
+
+ return null;
+ }
+
+ // for editable files and raw developments, trust file characteristics alone
+ if (matched_editables.size > 0) {
+ LibraryPhoto match = matched_editables[0];
+ if (matched_editables.size > 1) {
+ warning("Unknown file %s could be matched with %d photos; giving to %s, dropping others",
+ file.get_path(), matched_editables.size, match.to_string());
+ for (int ctr = 1; ctr < matched_editables.size; ctr++) {
+ if (!matched_editables[ctr].does_editable_exist())
+ matched_editables[ctr].revert_to_master();
+ }
+ }
+
+ update_editable_file(match, file);
+ }
+
+ if (matched_developments.size > 0) {
+ LibraryPhoto match_raw = matched_developments[0];
+ if (matched_developments.size > 1) {
+ warning("Unknown file %s could be matched with %d photos; giving to %s, dropping others",
+ file.get_path(), matched_developments.size, match_raw.to_string());
+ }
+
+ update_raw_development_file(match_raw, file);
+ }
+
+ result = MediaMonitor.DiscoveredFile.IGNORE;
+
+ return null;
+ }
+
+ public override File[]? get_auxilliary_backing_files(Monitorable monitorable) {
+ LibraryPhoto photo = (LibraryPhoto) monitorable;
+ File[] files = new File[0];
+
+ // Editable.
+ if (photo.has_editable())
+ files += photo.get_editable_file();
+
+ // Raw developments.
+ Gee.Collection<File>? raw_files = photo.get_raw_developer_files();
+ if (raw_files != null)
+ foreach (File f in raw_files)
+ files += f;
+
+ // Return null if no files.
+ return files.length > 0 ? files : null;
+ }
+
+ public override void update_backing_file_info(Monitorable monitorable, File file, FileInfo? info) {
+ LibraryPhoto photo = (LibraryPhoto) monitorable;
+
+ if (get_master_file(photo).equal(file))
+ check_for_master_changes(photo, info);
+ else if (get_editable_file(photo) != null && get_editable_file(photo).equal(file))
+ check_for_editable_changes(photo, info);
+ else if (get_raw_development_files(photo) != null) {
+ foreach (File f in get_raw_development_files(photo)) {
+ if (f.equal(file))
+ check_for_raw_development_changes(photo, info);
+ }
+ }
+ }
+
+ public override void notify_discovery_completing() {
+ matched_editables.clear();
+ }
+
+ // If filesize has changed, treat that as a full-blown modification
+ // and reimport ... this is problematic if only the metadata has changed, but so be it.
+ //
+ // TODO: We could do an MD5 check for more accuracy.
+ private void check_for_master_changes(LibraryPhoto photo, FileInfo? info) {
+ // if not present, offline state is already taken care of by LibraryMonitor
+ if (info == null)
+ return;
+
+ BackingPhotoRow state = photo.get_master_photo_row();
+ if (state.matches_file_info(info))
+ return;
+
+ if (state.is_touched(info)) {
+ update_master_file_info_altered(photo);
+ update_master_file_alterations_completed(photo, info);
+ } else {
+ update_reimport_master(photo);
+ }
+ }
+
+ private void check_for_editable_changes(LibraryPhoto photo, FileInfo? info) {
+ if (info == null) {
+ update_revert_to_master(photo);
+
+ return;
+ }
+
+ // If state matches, done -- editables have no bearing on a photo's offline status.
+ BackingPhotoRow? state = photo.get_editable_photo_row();
+ if (state == null || state.matches_file_info(info))
+ return;
+
+ if (state.is_touched(info)) {
+ update_editable_file_info_altered(photo);
+ update_editable_file_alterations_completed(photo, info);
+ } else {
+ update_reimport_editable(photo);
+ }
+ }
+
+ private void check_for_raw_development_changes(LibraryPhoto photo, FileInfo? info) {
+ if (info == null) {
+ // Switch back to default for safety.
+ photo.set_raw_developer(RawDeveloper.SHOTWELL);
+
+ return;
+ }
+
+ Gee.Collection<BackingPhotoRow>? rows = photo.get_raw_development_photo_rows();
+ if (rows == null)
+ return;
+
+ // Look through all possible rows, if we find a file with a matching name or info,
+ // assume we found our man.
+ foreach (BackingPhotoRow row in rows) {
+ if (row.matches_file_info(info))
+ return;
+ if (info.get_name() == row.filepath) {
+ if (row.is_touched(info)) {
+ update_raw_development_file_info_altered(photo);
+ update_raw_development_file_alterations_completed(photo);
+ } else {
+ update_reimport_raw_developments(photo);
+ }
+
+ break;
+ }
+ }
+ }
+
+ public override bool notify_file_created(File file, FileInfo info) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null)
+ return false;
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ // do nothing, although this is unexpected
+ warning("File %s created in %s state", file.get_path(), state.to_string());
+ break;
+
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ mdbg("Will mark %s online".printf(photo.to_string()));
+ update_online(photo);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", state.to_string());
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_moved(File old_file, File new_file, FileInfo info) {
+ LibraryPhotoSourceCollection.State old_state;
+ LibraryPhoto? old_photo = get_photo_state_by_file(old_file, out old_state);
+
+ LibraryPhotoSourceCollection.State new_state;
+ LibraryPhoto? new_photo = get_photo_state_by_file(new_file, out new_state);
+
+ // Four possibilities:
+ //
+ // 1. Moving an existing photo file to a location where no photo is represented
+ // Operation: have the Photo object move with the file.
+ // 2. Moving a file with no representative photo to a location where a photo is represented
+ // (i.e. is offline). Operation: Update the photo (backing has changed).
+ // 3. Moving a file with no representative photo to a location with no representative
+ // photo. Operation: Enqueue for import (if appropriate).
+ // 4. Move a file with a representative photo to a location where a photo is represented
+ // Operation: Mark the old photo as offline (or drop editable) and update new photo
+ // (the backing has changed).
+
+ if (old_photo != null && new_photo == null) {
+ // 1.
+ switch (old_state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ mdbg("Will set new master file for %s to %s".printf(old_photo.to_string(),
+ new_file.get_path()));
+ update_master_file(old_photo, new_file);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will set new editable file for %s to %s".printf(old_photo.to_string(),
+ new_file.get_path()));
+ update_editable_file(old_photo, new_file);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will set new raw development file for %s to %s".printf(old_photo.to_string(),
+ new_file.get_path()));
+ update_raw_development_file(old_photo, new_file);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", old_state.to_string());
+ }
+ } else if (old_photo == null && new_photo != null) {
+ // 2.
+ switch (new_state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ mdbg("Will reimport master file for %s".printf(new_photo.to_string()));
+ update_reimport_master(new_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will reimport editable file for %s".printf(new_photo.to_string()));
+ update_reimport_editable(new_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will reimport raw development file for %s".printf(new_photo.to_string()));
+ update_reimport_raw_developments(new_photo);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", new_state.to_string());
+ }
+ } else if (old_photo == null && new_photo == null) {
+ // 3.
+ return false;
+ } else {
+ assert(old_photo != null && new_photo != null);
+ // 4.
+ switch (old_state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ mdbg("Will mark offline %s".printf(old_photo.to_string()));
+ update_offline(old_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ // do nothing
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will revert %s to master".printf(old_photo.to_string()));
+ update_revert_to_master(old_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ // do nothing
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", old_state.to_string());
+ }
+
+ switch (new_state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ mdbg("Will reimport master file for %s".printf(new_photo.to_string()));
+ update_reimport_master(new_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will reimport editable file for %s".printf(new_photo.to_string()));
+ update_reimport_editable(new_photo);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will reimport raw development file for %s".printf(new_photo.to_string()));
+ update_reimport_raw_developments(new_photo);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", new_state.to_string());
+ }
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_altered(File file) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null)
+ return false;
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ mdbg("Will reimport master for %s".printf(photo.to_string()));
+ update_reimport_master(photo);
+ update_master_file_in_alteration(photo, true);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will reimport editable for %s".printf(photo.to_string()));
+ update_reimport_editable(photo);
+ update_editable_file_in_alteration(photo, true);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will reimport raw development for %s".printf(photo.to_string()));
+ update_reimport_raw_developments(photo);
+ update_raw_development_file_in_alteration(photo, true);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", state.to_string());
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_attributes_altered(File file) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null)
+ return false;
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ mdbg("Will update master file info for %s".printf(photo.to_string()));
+ update_master_file_info_altered(photo);
+ update_master_file_in_alteration(photo, true);
+ break;
+
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ // do nothing, but unexpected
+ warning("File %s attributes altered in %s state", file.get_path(),
+ state.to_string());
+ update_master_file_in_alteration(photo, true);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will update editable file info for %s".printf(photo.to_string()));
+ update_editable_file_info_altered(photo);
+ update_editable_file_in_alteration(photo, true);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will update raw development file info for %s".printf(photo.to_string()));
+ update_raw_development_file_info_altered(photo);
+ update_raw_development_file_in_alteration(photo, true);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", state.to_string());
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_alteration_completed(File file, FileInfo info) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null)
+ return false;
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ update_master_file_alterations_completed(photo, info);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ update_editable_file_alterations_completed(photo, info);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ update_raw_development_file_alterations_completed(photo);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", state.to_string());
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_deleted(File file) {
+ LibraryPhotoSourceCollection.State state;
+ LibraryPhoto? photo = get_photo_state_by_file(file, out state);
+ if (photo == null)
+ return false;
+
+ switch (state) {
+ case LibraryPhotoSourceCollection.State.ONLINE:
+ mdbg("Will mark %s offline".printf(photo.to_string()));
+ update_offline(photo);
+ update_master_file_in_alteration(photo, false);
+ break;
+
+ case LibraryPhotoSourceCollection.State.TRASH:
+ case LibraryPhotoSourceCollection.State.OFFLINE:
+ // do nothing / already knew this
+ update_master_file_in_alteration(photo, false);
+ break;
+
+ case LibraryPhotoSourceCollection.State.EDITABLE:
+ mdbg("Will revert %s to master".printf(photo.to_string()));
+ update_revert_to_master(photo);
+ update_editable_file_in_alteration(photo, false);
+ break;
+
+ case LibraryPhotoSourceCollection.State.DEVELOPER:
+ mdbg("Will revert %s to master".printf(photo.to_string()));
+ update_revert_to_master(photo);
+ update_editable_file_in_alteration(photo, false);
+ update_raw_development_file_in_alteration(photo, false);
+ break;
+
+ default:
+ error("Unknown LibraryPhoto collection state %s", state.to_string());
+ }
+
+ return true;
+ }
+
+ protected override void on_media_source_destroyed(DataSource source) {
+ base.on_media_source_destroyed(source);
+
+ cancel_reimports((LibraryPhoto) source);
+ }
+
+ private LibraryPhoto? get_photo_state_by_file(File file, out LibraryPhotoSourceCollection.State state) {
+ File? real_file = null;
+ if (has_pending_updates()) {
+ foreach (Monitorable monitorable in get_monitorables()) {
+ LibraryPhoto photo = (LibraryPhoto) monitorable;
+
+ PhotoUpdates? updates = get_existing_photo_updates(photo);
+ if (updates == null)
+ continue;
+
+ if (updates.get_master_file() != null && updates.get_master_file().equal(file)) {
+ real_file = photo.get_master_file();
+
+ break;
+ }
+
+ if (updates.get_editable_file() != null && updates.get_editable_file().equal(file)) {
+ real_file = photo.get_editable_file();
+
+ // if the photo's "real" editable file is null, then this file hasn't been
+ // associated with it (yet) so fake the call
+ if (real_file == null) {
+ state = LibraryPhotoSourceCollection.State.EDITABLE;
+
+ return photo;
+ }
+
+ break;
+ }
+
+ if (updates.get_raw_developer_files() != null) {
+ bool found = false;
+ foreach (File raw in updates.get_raw_developer_files()) {
+ if (raw.equal(file)) {
+ found = true;
+
+ break;
+ }
+ }
+
+ if (found) {
+ Gee.Collection<File>? developed = photo.get_raw_developer_files();
+ if (developed != null) {
+ foreach (File f in developed) {
+ if (f.equal(file)) {
+ real_file = f;
+ state = LibraryPhotoSourceCollection.State.DEVELOPER;
+
+ break;
+ }
+ }
+
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ return LibraryPhoto.global.get_state_by_file(real_file ?? file, out state);
+ }
+
+ public PhotoUpdates fetch_photo_updates(LibraryPhoto photo) {
+ return (PhotoUpdates) fetch_updates(photo);
+ }
+
+ public PhotoUpdates? get_existing_photo_updates(LibraryPhoto photo) {
+ return get_existing_updates(photo) as PhotoUpdates;
+ }
+
+ public void update_reimport_master(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_reimport_master(true);
+
+ // cancel outstanding reimport
+ if (master_reimport_pending.has_key(photo))
+ master_reimport_pending.get(photo).cancel();
+ }
+
+ public void update_reimport_editable(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_reimport_editable(true);
+
+ // cancel outstanding reimport
+ if (editable_reimport_pending.has_key(photo))
+ editable_reimport_pending.get(photo).cancel();
+ }
+
+ public void update_reimport_raw_developments(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_reimport_raw_developments(true);
+
+ // cancel outstanding reimport
+ if (raw_developments_reimport_pending.has_key(photo))
+ raw_developments_reimport_pending.get(photo).cancel();
+ }
+
+ public File? get_editable_file(LibraryPhoto photo) {
+ PhotoUpdates? updates = get_existing_photo_updates(photo);
+
+ return (updates != null && updates.get_editable_file() != null) ? updates.get_editable_file()
+ : photo.get_editable_file();
+ }
+
+ public Gee.Collection<File>? get_raw_development_files(LibraryPhoto photo) {
+ PhotoUpdates? updates = get_existing_photo_updates(photo);
+
+ return (updates != null && updates.get_raw_developer_files() != null) ?
+ updates.get_raw_developer_files() : photo.get_raw_developer_files();
+ }
+
+ public void update_editable_file(LibraryPhoto photo, File file) {
+ fetch_photo_updates(photo).set_editable_file(file);
+ }
+
+ public void update_editable_file_info_altered(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_editable_file_info_altered(true);
+ }
+
+ public void update_raw_development_file(LibraryPhoto photo, File file) {
+ fetch_photo_updates(photo).add_raw_developer_file(file);
+ }
+
+ public void update_raw_development_file_info_altered(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_raw_developer_file_info_altered(true);
+ }
+
+ public void update_editable_file_in_alteration(LibraryPhoto photo, bool in_alteration) {
+ fetch_photo_updates(photo).set_editable_in_alteration(in_alteration);
+ }
+
+ public void update_editable_file_alterations_completed(LibraryPhoto photo, FileInfo info) {
+ fetch_photo_updates(photo).set_editable_file_info(info);
+ fetch_photo_updates(photo).set_editable_in_alteration(false);
+ }
+
+ public void update_raw_development_file_in_alteration(LibraryPhoto photo, bool in_alteration) {
+ fetch_photo_updates(photo).set_raw_development_in_alteration(in_alteration);
+ }
+
+ public void update_raw_development_file_alterations_completed(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_raw_development_in_alteration(false);
+ }
+
+ public void update_revert_to_master(LibraryPhoto photo) {
+ fetch_photo_updates(photo).set_revert_to_master(true);
+ }
+
+ protected override void process_updates(Gee.Collection<MonitorableUpdates> all_updates,
+ TransactionController controller, ref int op_count) throws Error {
+ base.process_updates(all_updates, controller, ref op_count);
+
+ Gee.Map<LibraryPhoto, File> set_editable_file = null;
+ Gee.Map<LibraryPhoto, FileInfo> set_editable_file_info = null;
+ Gee.Map<LibraryPhoto, Gee.Collection<File>> set_raw_developer_files = null;
+ Gee.ArrayList<LibraryPhoto> revert_to_master = null;
+ Gee.ArrayList<LibraryPhoto> reimport_master = null;
+ Gee.ArrayList<LibraryPhoto> reimport_editable = null;
+ Gee.ArrayList<LibraryPhoto> reimport_raw_developments = null;
+ int reimport_job_count = 0;
+
+ foreach (MonitorableUpdates monitorable_updates in all_updates) {
+ if (op_count >= MAX_OPERATIONS_PER_CYCLE)
+ break;
+
+ PhotoUpdates? updates = monitorable_updates as PhotoUpdates;
+ if (updates == null)
+ continue;
+
+ if (updates.get_editable_file() != null) {
+ if (set_editable_file == null)
+ set_editable_file = new Gee.HashMap<LibraryPhoto, File>();
+
+ set_editable_file.set(updates.photo, updates.get_editable_file());
+ updates.set_editable_file(null);
+ op_count++;
+ }
+
+ if (updates.get_editable_file_info() != null) {
+ if (set_editable_file_info == null)
+ set_editable_file_info = new Gee.HashMap<LibraryPhoto, FileInfo>();
+
+ set_editable_file_info.set(updates.photo, updates.get_editable_file_info());
+ updates.set_editable_file_info(null);
+ op_count++;
+ }
+
+ if (updates.get_raw_developer_files() != null) {
+ if (set_raw_developer_files == null)
+ set_raw_developer_files = new Gee.HashMap<LibraryPhoto, Gee.Collection<File>>();
+
+ set_raw_developer_files.set(updates.photo, updates.get_raw_developer_files());
+ updates.clear_raw_developer_files();
+ op_count++;
+ }
+
+ if (updates.is_revert_to_master()) {
+ if (revert_to_master == null)
+ revert_to_master = new Gee.ArrayList<LibraryPhoto>();
+
+ if (revert_to_master.size < MAX_REVERTS_PER_CYCLE) {
+ revert_to_master.add(updates.photo);
+ updates.set_revert_to_master(false);
+ }
+ op_count++;
+ }
+
+ if (updates.is_reimport_master() && reimport_job_count < MAX_REIMPORT_JOBS_PER_CYCLE) {
+ if (reimport_master == null)
+ reimport_master = new Gee.ArrayList<LibraryPhoto>();
+
+ reimport_master.add(updates.photo);
+ updates.set_reimport_master(false);
+ reimport_job_count++;
+ op_count++;
+ }
+
+ if (updates.is_reimport_editable() && reimport_job_count < MAX_REIMPORT_JOBS_PER_CYCLE) {
+ if (reimport_editable == null)
+ reimport_editable = new Gee.ArrayList<LibraryPhoto>();
+
+ reimport_editable.add(updates.photo);
+ updates.set_reimport_editable(false);
+ reimport_job_count++;
+ op_count++;
+ }
+ }
+
+ if (set_editable_file != null) {
+ mdbg("Changing editable file of %d photos".printf(set_editable_file.size));
+
+ try {
+ Photo.set_many_editable_file(set_editable_file);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+
+ if (set_editable_file_info != null) {
+ mdbg("Updating %d editable files timestamps".printf(set_editable_file_info.size));
+
+ try {
+ Photo.update_many_editable_timestamps(set_editable_file_info);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+
+ if (revert_to_master != null) {
+ mdbg("Reverting %d photos to master".printf(revert_to_master.size));
+
+ foreach (LibraryPhoto photo in revert_to_master)
+ photo.revert_to_master();
+ }
+
+ //
+ // Now that the metadata has been updated, deal with imports and reimports
+ //
+
+ if (reimport_master != null) {
+ mdbg("Reimporting %d masters".printf(reimport_master.size));
+
+ foreach (LibraryPhoto photo in reimport_master) {
+ assert(!master_reimport_pending.has_key(photo));
+
+ ReimportMasterJob job = new ReimportMasterJob(this, photo);
+ master_reimport_pending.set(photo, job);
+ workers.enqueue(job);
+ }
+ }
+
+ if (reimport_editable != null) {
+ mdbg("Reimporting %d editables".printf(reimport_editable.size));
+
+ foreach (LibraryPhoto photo in reimport_editable) {
+ assert(!editable_reimport_pending.has_key(photo));
+
+ ReimportEditableJob job = new ReimportEditableJob(this, photo);
+ editable_reimport_pending.set(photo, job);
+ workers.enqueue(job);
+ }
+ }
+
+ if (reimport_raw_developments != null) {
+ mdbg("Reimporting %d raw developments".printf(reimport_raw_developments.size));
+
+ foreach (LibraryPhoto photo in reimport_raw_developments) {
+ assert(!raw_developments_reimport_pending.has_key(photo));
+
+ ReimportRawDevelopmentJob job = new ReimportRawDevelopmentJob(this, photo);
+ raw_developments_reimport_pending.set(photo, job);
+ workers.enqueue(job);
+ }
+ }
+ }
+
+ private void on_master_reimported(BackgroundJob j) {
+ ReimportMasterJob job = (ReimportMasterJob) j;
+
+ // no longer pending
+ bool removed = master_reimport_pending.unset(job.photo);
+ assert(removed);
+
+ if (job.err != null) {
+ critical("Unable to reimport %s due to master file changing: %s", job.photo.to_string(),
+ job.err.message);
+
+ update_offline(job.photo);
+
+ return;
+ }
+
+ if (!job.mark_online) {
+ // the prepare_for_reimport_master failed, photo is now considered offline
+ update_offline(job.photo);
+
+ return;
+ }
+
+ try {
+ job.photo.finish_reimport_master(job.reimport_state);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ // now considered online
+ if (job.photo.is_offline())
+ update_online(job.photo);
+
+ mdbg("Reimported master for %s".printf(job.photo.to_string()));
+ }
+
+ private void on_master_reimport_cancelled(BackgroundJob j) {
+ bool removed = master_reimport_pending.unset(((ReimportMasterJob) j).photo);
+ assert(removed);
+ }
+
+ private void on_editable_reimported(BackgroundJob j) {
+ ReimportEditableJob job = (ReimportEditableJob) j;
+
+ // no longer pending
+ bool removed = editable_reimport_pending.unset(job.photo);
+ assert(removed);
+
+ if (job.err != null) {
+ critical("Unable to reimport editable %s: %s", job.photo.to_string(), job.err.message);
+
+ return;
+ }
+
+ try {
+ job.photo.finish_reimport_editable(job.state);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ mdbg("Reimported editable for %s".printf(job.photo.to_string()));
+ }
+
+ private void on_editable_reimport_cancelled(BackgroundJob j) {
+ bool removed = editable_reimport_pending.unset(((ReimportEditableJob) j).photo);
+ assert(removed);
+ }
+
+ private void on_raw_development_reimported(BackgroundJob j) {
+ ReimportRawDevelopmentJob job = (ReimportRawDevelopmentJob) j;
+
+ // no longer pending
+ bool removed = raw_developments_reimport_pending.unset(job.photo);
+ assert(removed);
+
+ if (job.err != null) {
+ critical("Unable to reimport raw development %s: %s", job.photo.to_string(), job.err.message);
+
+ return;
+ }
+
+ try {
+ job.photo.finish_reimport_raw_development(job.state);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ mdbg("Reimported raw development for %s".printf(job.photo.to_string()));
+ }
+
+ private void on_raw_development_reimport_cancelled(BackgroundJob j) {
+ bool removed = raw_developments_reimport_pending.unset(((ReimportRawDevelopmentJob) j).photo);
+ assert(removed);
+ }
+}
+
diff --git a/src/PhotoPage.vala b/src/PhotoPage.vala
new file mode 100644
index 0000000..d74d004
--- /dev/null
+++ b/src/PhotoPage.vala
@@ -0,0 +1,3361 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class ZoomBuffer : Object {
+ private enum ObjectState {
+ SOURCE_NOT_LOADED,
+ SOURCE_LOAD_IN_PROGRESS,
+ SOURCE_NOT_TRANSFORMED,
+ TRANSFORMED_READY
+ }
+
+ private class IsoSourceFetchJob : BackgroundJob {
+ private Photo to_fetch;
+
+ public Gdk.Pixbuf? fetched = null;
+
+ public IsoSourceFetchJob(ZoomBuffer owner, Photo to_fetch,
+ CompletionCallback completion_callback) {
+ base(owner, completion_callback);
+
+ this.to_fetch = to_fetch;
+ }
+
+ public override void execute() {
+ try {
+ fetched = to_fetch.get_pixbuf_with_options(Scaling.for_original(),
+ Photo.Exception.ADJUST);
+ } catch (Error fetch_error) {
+ critical("IsoSourceFetchJob: execute( ): can't get pixbuf from backing photo");
+ }
+ }
+ }
+
+ // it's worth noting that there are two different kinds of transformation jobs (though this
+ // single class supports them both). There are "isomorphic" (or "iso") transformation jobs that
+ // operate over full-size pixbufs and are relatively long-running and then there are
+ // "demand" transformation jobs that occur over much smaller pixbufs as needed; these are
+ // relatively quick to run.
+ private class TransformationJob : BackgroundJob {
+ private Gdk.Pixbuf to_transform;
+ private PixelTransformer? transformer;
+ private Cancellable cancellable;
+
+ public Gdk.Pixbuf transformed = null;
+
+ public TransformationJob(ZoomBuffer owner, Gdk.Pixbuf to_transform, PixelTransformer?
+ transformer, CompletionCallback completion_callback, Cancellable cancellable) {
+ base(owner, completion_callback, cancellable);
+
+ this.cancellable = cancellable;
+ this.to_transform = to_transform;
+ this.transformer = transformer;
+ this.transformed = to_transform.copy();
+ }
+
+ public override void execute() {
+ if (transformer != null) {
+ transformer.transform_to_other_pixbuf(to_transform, transformed, cancellable);
+ }
+ }
+ }
+
+ private const int MEGAPIXEL = 1048576;
+ private const int USE_REDUCED_THRESHOLD = (int) 2.0 * MEGAPIXEL;
+
+ private Gdk.Pixbuf iso_source_image = null;
+ private Gdk.Pixbuf? reduced_source_image = null;
+ private Gdk.Pixbuf iso_transformed_image = null;
+ private Gdk.Pixbuf? reduced_transformed_image = null;
+ private Gdk.Pixbuf preview_image = null;
+ private Photo backing_photo = null;
+ private ObjectState object_state = ObjectState.SOURCE_NOT_LOADED;
+ private Gdk.Pixbuf? demand_transform_cached_pixbuf = null;
+ private ZoomState demand_transform_zoom_state;
+ private TransformationJob? demand_transform_job = null; // only 1 demand transform job can be
+ // active at a time
+ private Workers workers = null;
+ private SinglePhotoPage parent_page;
+ private bool is_interactive_redraw_in_progress = false;
+
+ public ZoomBuffer(SinglePhotoPage parent_page, Photo backing_photo,
+ Gdk.Pixbuf preview_image) {
+ this.parent_page = parent_page;
+ this.preview_image = preview_image;
+ this.backing_photo = backing_photo;
+ this.workers = new Workers(2, false);
+ }
+
+ private void on_iso_source_fetch_complete(BackgroundJob job) {
+ IsoSourceFetchJob fetch_job = (IsoSourceFetchJob) job;
+ if (fetch_job.fetched == null) {
+ critical("ZoomBuffer: iso_source_fetch_complete( ): fetch job has null image member");
+ return;
+ }
+
+ iso_source_image = fetch_job.fetched;
+ if ((iso_source_image.width * iso_source_image.height) > USE_REDUCED_THRESHOLD) {
+ reduced_source_image = iso_source_image.scale_simple(iso_source_image.width / 2,
+ iso_source_image.height / 2, Gdk.InterpType.BILINEAR);
+ }
+ object_state = ObjectState.SOURCE_NOT_TRANSFORMED;
+
+ if (!is_interactive_redraw_in_progress)
+ parent_page.repaint();
+
+ BackgroundJob transformation_job = new TransformationJob(this, iso_source_image,
+ backing_photo.get_pixel_transformer(), on_iso_transformation_complete,
+ new Cancellable());
+ workers.enqueue(transformation_job);
+ }
+
+ private void on_iso_transformation_complete(BackgroundJob job) {
+ TransformationJob transform_job = (TransformationJob) job;
+ if (transform_job.transformed == null) {
+ critical("ZoomBuffer: on_iso_transformation_complete( ): completed job has null " +
+ "image");
+ return;
+ }
+
+ iso_transformed_image = transform_job.transformed;
+ if ((iso_transformed_image.width * iso_transformed_image.height) > USE_REDUCED_THRESHOLD) {
+ reduced_transformed_image = iso_transformed_image.scale_simple(
+ iso_transformed_image.width / 2, iso_transformed_image.height / 2,
+ Gdk.InterpType.BILINEAR);
+ }
+ object_state = ObjectState.TRANSFORMED_READY;
+ }
+
+ private void on_demand_transform_complete(BackgroundJob job) {
+ TransformationJob transform_job = (TransformationJob) job;
+ if (transform_job.transformed == null) {
+ critical("ZoomBuffer: on_demand_transform_complete( ): completed job has null " +
+ "image");
+ return;
+ }
+
+ demand_transform_cached_pixbuf = transform_job.transformed;
+ demand_transform_job = null;
+
+ parent_page.repaint();
+ }
+
+ // passing a 'reduced_pixbuf' that has one-quarter the number of pixels as the 'iso_pixbuf' is
+ // optional, but including one can dramatically increase performance obtaining projection
+ // pixbufs at for ZoomStates with zoom factors less than 0.5
+ private Gdk.Pixbuf get_view_projection_pixbuf(ZoomState zoom_state, Gdk.Pixbuf iso_pixbuf,
+ Gdk.Pixbuf? reduced_pixbuf = null) {
+ Gdk.Rectangle view_rect = zoom_state.get_viewing_rectangle_wrt_content();
+ Gdk.Rectangle view_rect_proj = zoom_state.get_viewing_rectangle_projection(
+ iso_pixbuf);
+ Gdk.Pixbuf sample_source_pixbuf = iso_pixbuf;
+
+ if ((reduced_pixbuf != null) && (zoom_state.get_zoom_factor() < 0.5)) {
+ sample_source_pixbuf = reduced_pixbuf;
+ view_rect_proj.x /= 2;
+ view_rect_proj.y /= 2;
+ view_rect_proj.width /= 2;
+ view_rect_proj.height /= 2;
+ }
+
+ // On very small images, it's possible for these to
+ // be 0, and GTK doesn't like sampling a region 0 px
+ // across.
+ view_rect_proj.width = view_rect_proj.width.clamp(1, int.MAX);
+ view_rect_proj.height = view_rect_proj.height.clamp(1, int.MAX);
+
+ view_rect.width = view_rect.width.clamp(1, int.MAX);
+ view_rect.height = view_rect.height.clamp(1, int.MAX);
+
+ Gdk.Pixbuf proj_subpixbuf = new Gdk.Pixbuf.subpixbuf(sample_source_pixbuf, view_rect_proj.x,
+ view_rect_proj.y, view_rect_proj.width, view_rect_proj.height);
+
+ Gdk.Pixbuf zoomed = proj_subpixbuf.scale_simple(view_rect.width, view_rect.height,
+ Gdk.InterpType.BILINEAR);
+
+ assert(zoomed != null);
+
+ return zoomed;
+ }
+
+ private Gdk.Pixbuf get_zoomed_image_source_not_transformed(ZoomState zoom_state) {
+ if (demand_transform_cached_pixbuf != null) {
+ if (zoom_state.equals(demand_transform_zoom_state)) {
+ // if a cached pixbuf from a previous on-demand transform operation exists and
+ // its zoom state is the same as the currently requested zoom state, then we
+ // don't need to do any work -- just return the cached copy
+ return demand_transform_cached_pixbuf;
+ } else if (zoom_state.get_zoom_factor() ==
+ demand_transform_zoom_state.get_zoom_factor()) {
+ // if a cached pixbuf from a previous on-demand transform operation exists and
+ // its zoom state is different from the currently requested zoom state, then we
+ // can't just use the cached pixbuf as-is. However, we might be able to use *some*
+ // of the information in the previously cached pixbuf. Specifically, if the zoom
+ // state of the previously cached pixbuf is merely a translation of the currently
+ // requested zoom state (the zoom states are not equal but the zoom factors are the
+ // same), then all that has happened is that the user has panned the viewing
+ // window. So keep all the pixels from the cached pixbuf that are still on-screen
+ // in the current view.
+ Gdk.Rectangle curr_rect = zoom_state.get_viewing_rectangle_wrt_content();
+ Gdk.Rectangle pre_rect =
+ demand_transform_zoom_state.get_viewing_rectangle_wrt_content();
+ Gdk.Rectangle transfer_src_rect = Gdk.Rectangle();
+ Gdk.Rectangle transfer_dest_rect = Gdk.Rectangle();
+
+ transfer_src_rect.x = (curr_rect.x - pre_rect.x).clamp(0, pre_rect.width);
+ transfer_src_rect.y = (curr_rect.y - pre_rect.y).clamp(0, pre_rect.height);
+ int transfer_src_right = ((curr_rect.x + curr_rect.width) - pre_rect.width).clamp(0,
+ pre_rect.width);
+ transfer_src_rect.width = transfer_src_right - transfer_src_rect.x;
+ int transfer_src_bottom = ((curr_rect.y + curr_rect.height) - pre_rect.width).clamp(
+ 0, pre_rect.height);
+ transfer_src_rect.height = transfer_src_bottom - transfer_src_rect.y;
+
+ transfer_dest_rect.x = (pre_rect.x - curr_rect.x).clamp(0, curr_rect.width);
+ transfer_dest_rect.y = (pre_rect.y - curr_rect.y).clamp(0, curr_rect.height);
+ int transfer_dest_right = (transfer_dest_rect.x + transfer_src_rect.width).clamp(0,
+ curr_rect.width);
+ transfer_dest_rect.width = transfer_dest_right - transfer_dest_rect.x;
+ int transfer_dest_bottom = (transfer_dest_rect.y + transfer_src_rect.height).clamp(0,
+ curr_rect.height);
+ transfer_dest_rect.height = transfer_dest_bottom - transfer_dest_rect.y;
+
+ Gdk.Pixbuf composited_result = get_zoom_preview_image_internal(zoom_state);
+ demand_transform_cached_pixbuf.copy_area (transfer_src_rect.x,
+ transfer_src_rect.y, transfer_dest_rect.width, transfer_dest_rect.height,
+ composited_result, transfer_dest_rect.x, transfer_dest_rect.y);
+
+ return composited_result;
+ }
+ }
+
+ // ok -- the cached pixbuf didn't help us -- so check if there is a demand
+ // transformation background job currently in progress. if such a job is in progress,
+ // then check if it's for the same zoom state as the one requested here. If the
+ // zoom states are the same, then just return the preview image for now -- we won't
+ // get a crisper one until the background job completes. If the zoom states are not the
+ // same however, then cancel the existing background job and initiate a new one for the
+ // currently requested zoom state.
+ if (demand_transform_job != null) {
+ if (zoom_state.equals(demand_transform_zoom_state)) {
+ return get_zoom_preview_image_internal(zoom_state);
+ } else {
+ demand_transform_job.cancel();
+ demand_transform_job = null;
+
+ Gdk.Pixbuf zoomed = get_view_projection_pixbuf(zoom_state, iso_source_image,
+ reduced_source_image);
+
+ demand_transform_job = new TransformationJob(this, zoomed,
+ backing_photo.get_pixel_transformer(), on_demand_transform_complete,
+ new Cancellable());
+ demand_transform_zoom_state = zoom_state;
+ workers.enqueue(demand_transform_job);
+
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+ }
+
+ // if no on-demand background transform job is in progress at all, then start one
+ if (demand_transform_job == null) {
+ Gdk.Pixbuf zoomed = get_view_projection_pixbuf(zoom_state, iso_source_image,
+ reduced_source_image);
+
+ demand_transform_job = new TransformationJob(this, zoomed,
+ backing_photo.get_pixel_transformer(), on_demand_transform_complete,
+ new Cancellable());
+
+ demand_transform_zoom_state = zoom_state;
+
+ workers.enqueue(demand_transform_job);
+
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+
+ // execution should never reach this point -- the various nested conditionals above should
+ // account for every possible case that can occur when the ZoomBuffer is in the
+ // SOURCE-NOT-TRANSFORMED state. So if execution does reach this point, print a critical
+ // warning to the console and just zoom using the preview image (the preview image, since
+ // it's managed by the SinglePhotoPage that created us, is assumed to be good).
+ critical("ZoomBuffer: get_zoomed_image( ): in SOURCE-NOT-TRANSFORMED but can't transform " +
+ "on-screen projection on-demand; using preview image");
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+
+ public Gdk.Pixbuf get_zoom_preview_image_internal(ZoomState zoom_state) {
+ if (object_state == ObjectState.SOURCE_NOT_LOADED) {
+ BackgroundJob iso_source_fetch_job = new IsoSourceFetchJob(this, backing_photo,
+ on_iso_source_fetch_complete);
+ workers.enqueue(iso_source_fetch_job);
+
+ object_state = ObjectState.SOURCE_LOAD_IN_PROGRESS;
+ }
+ Gdk.Rectangle view_rect = zoom_state.get_viewing_rectangle_wrt_content();
+ Gdk.Rectangle view_rect_proj = zoom_state.get_viewing_rectangle_projection(
+ preview_image);
+
+ view_rect_proj.width = view_rect_proj.width.clamp(1, int.MAX);
+ view_rect_proj.height = view_rect_proj.height.clamp(1, int.MAX);
+
+ Gdk.Pixbuf proj_subpixbuf = new Gdk.Pixbuf.subpixbuf(preview_image,
+ view_rect_proj.x, view_rect_proj.y, view_rect_proj.width, view_rect_proj.height);
+
+ Gdk.Pixbuf zoomed = proj_subpixbuf.scale_simple(view_rect.width, view_rect.height,
+ Gdk.InterpType.BILINEAR);
+
+ return zoomed;
+ }
+
+ public Photo get_backing_photo() {
+ return backing_photo;
+ }
+
+ public void update_preview_image(Gdk.Pixbuf preview_image) {
+ this.preview_image = preview_image;
+ }
+
+ // invoke with no arguments or with null to merely flush the cache or alternatively pass in a
+ // single zoom state argument to re-seed the cache for that zoom state after it's been flushed
+ public void flush_demand_cache(ZoomState? initial_zoom_state = null) {
+ demand_transform_cached_pixbuf = null;
+ if (initial_zoom_state != null)
+ get_zoomed_image(initial_zoom_state);
+ }
+
+ public Gdk.Pixbuf get_zoomed_image(ZoomState zoom_state) {
+ is_interactive_redraw_in_progress = false;
+ // if request is for a zoomed image with an interpolation factor of zero (i.e., no zooming
+ // needs to be performed since the zoom slider is all the way to the left), then just
+ // return the zoom preview image
+ if (zoom_state.get_interpolation_factor() == 0.0) {
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+
+ switch (object_state) {
+ case ObjectState.SOURCE_NOT_LOADED:
+ case ObjectState.SOURCE_LOAD_IN_PROGRESS:
+ return get_zoom_preview_image_internal(zoom_state);
+
+ case ObjectState.SOURCE_NOT_TRANSFORMED:
+ return get_zoomed_image_source_not_transformed(zoom_state);
+
+ case ObjectState.TRANSFORMED_READY:
+ // if an isomorphic, transformed pixbuf is ready, then just sample the projection of
+ // current viewing window from it and return that.
+ return get_view_projection_pixbuf(zoom_state, iso_transformed_image,
+ reduced_transformed_image);
+
+ default:
+ critical("ZoomBuffer: get_zoomed_image( ): object is an inconsistent state");
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+ }
+
+ public Gdk.Pixbuf get_zoom_preview_image(ZoomState zoom_state) {
+ is_interactive_redraw_in_progress = true;
+
+ return get_zoom_preview_image_internal(zoom_state);
+ }
+}
+
+public abstract class EditingHostPage : SinglePhotoPage {
+ public const int TRINKET_SCALE = 20;
+ public const int TRINKET_PADDING = 1;
+
+ public const double ZOOM_INCREMENT_SIZE = 0.1;
+ public const int PAN_INCREMENT_SIZE = 64; /* in pixels */
+ public const int TOOL_WINDOW_SEPARATOR = 8;
+ public const int PIXBUF_CACHE_COUNT = 5;
+ public const int ORIGINAL_PIXBUF_CACHE_COUNT = 5;
+
+ private class EditingHostCanvas : EditingTools.PhotoCanvas {
+ private EditingHostPage host_page;
+
+ public EditingHostCanvas(EditingHostPage host_page) {
+ base(host_page.get_container(), host_page.canvas.get_window(), host_page.get_photo(),
+ host_page.get_cairo_context(), host_page.get_surface_dim(), host_page.get_scaled_pixbuf(),
+ host_page.get_scaled_pixbuf_position());
+
+ this.host_page = host_page;
+ }
+
+ public override void repaint() {
+ host_page.repaint();
+ }
+ }
+
+ private SourceCollection sources;
+ private ViewCollection? parent_view = null;
+ private Gdk.Pixbuf swapped = null;
+ private bool pixbuf_dirty = true;
+ private Gtk.ToolButton rotate_button = null;
+ private Gtk.ToggleToolButton crop_button = null;
+ private Gtk.ToggleToolButton redeye_button = null;
+ private Gtk.ToggleToolButton adjust_button = null;
+ private Gtk.ToggleToolButton straighten_button = null;
+ private Gtk.ToolButton enhance_button = null;
+ private Gtk.Scale zoom_slider = null;
+ private Gtk.ToolButton prev_button = new Gtk.ToolButton.from_stock(Gtk.Stock.GO_BACK);
+ private Gtk.ToolButton next_button = new Gtk.ToolButton.from_stock(Gtk.Stock.GO_FORWARD);
+ private EditingTools.EditingTool current_tool = null;
+ private Gtk.ToggleToolButton current_editing_toggle = null;
+ private Gdk.Pixbuf cancel_editing_pixbuf = null;
+ private bool photo_missing = false;
+ private PixbufCache cache = null;
+ private PixbufCache master_cache = null;
+ private DragAndDropHandler dnd_handler = null;
+ private bool enable_interactive_zoom_refresh = false;
+ private Gdk.Point zoom_pan_start_point;
+ private bool is_pan_in_progress = false;
+ private double saved_slider_val = 0.0;
+ private ZoomBuffer? zoom_buffer = null;
+ private Gee.HashMap<string, int> last_locations = new Gee.HashMap<string, int>();
+
+ public EditingHostPage(SourceCollection sources, string name) {
+ base(name, false);
+
+ this.sources = sources;
+
+ // when photo is altered need to update it here
+ sources.items_altered.connect(on_photos_altered);
+
+ // monitor when the ViewCollection's contents change
+ get_view().contents_altered.connect(on_view_contents_ordering_altered);
+ get_view().ordering_changed.connect(on_view_contents_ordering_altered);
+
+ // the viewport can change size independent of the window being resized (when the searchbar
+ // disappears, for example)
+ viewport.size_allocate.connect(on_viewport_resized);
+
+ // set up page's toolbar (used by AppWindow for layout and FullscreenWindow as a popup)
+ Gtk.Toolbar toolbar = get_toolbar();
+
+ // rotate tool
+ rotate_button = new Gtk.ToolButton.from_stock("");
+ rotate_button.set_icon_name(Resources.CLOCKWISE);
+ rotate_button.set_label(Resources.ROTATE_CW_LABEL);
+ rotate_button.set_tooltip_text(Resources.ROTATE_CW_TOOLTIP);
+ rotate_button.clicked.connect(on_rotate_clockwise);
+ rotate_button.is_important = true;
+ toolbar.insert(rotate_button, -1);
+
+ // crop tool
+ crop_button = new Gtk.ToggleToolButton.from_stock(Resources.CROP);
+ crop_button.set_label(Resources.CROP_LABEL);
+ crop_button.set_tooltip_text(Resources.CROP_TOOLTIP);
+ crop_button.toggled.connect(on_crop_toggled);
+ crop_button.is_important = true;
+ toolbar.insert(crop_button, -1);
+
+ // straightening tool
+ straighten_button = new Gtk.ToggleToolButton.from_stock(Resources.STRAIGHTEN);
+ straighten_button.set_label(Resources.STRAIGHTEN_LABEL);
+ straighten_button.set_tooltip_text(Resources.STRAIGHTEN_TOOLTIP);
+ straighten_button.toggled.connect(on_straighten_toggled);
+ straighten_button.is_important = true;
+ toolbar.insert(straighten_button, -1);
+
+ // redeye reduction tool
+ redeye_button = new Gtk.ToggleToolButton.from_stock(Resources.REDEYE);
+ redeye_button.set_label(Resources.RED_EYE_LABEL);
+ redeye_button.set_tooltip_text(Resources.RED_EYE_TOOLTIP);
+ redeye_button.toggled.connect(on_redeye_toggled);
+ redeye_button.is_important = true;
+ toolbar.insert(redeye_button, -1);
+
+ // adjust tool
+ adjust_button = new Gtk.ToggleToolButton.from_stock(Resources.ADJUST);
+ adjust_button.set_label(Resources.ADJUST_LABEL);
+ adjust_button.set_tooltip_text(Resources.ADJUST_TOOLTIP);
+ adjust_button.toggled.connect(on_adjust_toggled);
+ adjust_button.is_important = true;
+ toolbar.insert(adjust_button, -1);
+
+ // enhance tool
+ enhance_button = new Gtk.ToolButton.from_stock(Resources.ENHANCE);
+ enhance_button.set_label(Resources.ENHANCE_LABEL);
+ enhance_button.set_tooltip_text(Resources.ENHANCE_TOOLTIP);
+ enhance_button.clicked.connect(on_enhance);
+ enhance_button.is_important = true;
+ toolbar.insert(enhance_button, -1);
+
+ // separator to force next/prev buttons to right side of toolbar
+ Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
+ separator.set_expand(true);
+ separator.set_draw(false);
+ toolbar.insert(separator, -1);
+
+ Gtk.Box zoom_group = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+
+ Gtk.Image zoom_out = new Gtk.Image.from_pixbuf(Resources.load_icon(Resources.ICON_ZOOM_OUT,
+ Resources.ICON_ZOOM_SCALE));
+ Gtk.EventBox zoom_out_box = new Gtk.EventBox();
+ zoom_out_box.set_above_child(true);
+ zoom_out_box.set_visible_window(false);
+ zoom_out_box.add(zoom_out);
+
+ zoom_out_box.button_press_event.connect(on_zoom_out_pressed);
+
+ zoom_group.pack_start(zoom_out_box, false, false, 0);
+
+ // zoom slider
+ zoom_slider = new Gtk.Scale(Gtk.Orientation.HORIZONTAL, new Gtk.Adjustment(0.0, 0.0, 1.1, 0.1, 0.1, 0.1));
+ zoom_slider.set_draw_value(false);
+ zoom_slider.set_size_request(120, -1);
+ zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+ zoom_slider.button_press_event.connect(on_zoom_slider_drag_begin);
+ zoom_slider.button_release_event.connect(on_zoom_slider_drag_end);
+ zoom_slider.key_press_event.connect(on_zoom_slider_key_press);
+
+ zoom_group.pack_start(zoom_slider, false, false, 0);
+
+ Gtk.Image zoom_in = new Gtk.Image.from_pixbuf(Resources.load_icon(Resources.ICON_ZOOM_IN,
+ Resources.ICON_ZOOM_SCALE));
+ Gtk.EventBox zoom_in_box = new Gtk.EventBox();
+ zoom_in_box.set_above_child(true);
+ zoom_in_box.set_visible_window(false);
+ zoom_in_box.add(zoom_in);
+
+ zoom_in_box.button_press_event.connect(on_zoom_in_pressed);
+
+ zoom_group.pack_start(zoom_in_box, false, false, 0);
+
+ Gtk.ToolItem group_wrapper = new Gtk.ToolItem();
+ group_wrapper.add(zoom_group);
+
+ toolbar.insert(group_wrapper, -1);
+
+ // previous button
+ prev_button.set_tooltip_text(_("Previous photo"));
+ prev_button.clicked.connect(on_previous_photo);
+ toolbar.insert(prev_button, -1);
+
+ // next button
+ next_button.set_tooltip_text(_("Next photo"));
+ next_button.clicked.connect(on_next_photo);
+ toolbar.insert(next_button, -1);
+ }
+
+ ~EditingHostPage() {
+ sources.items_altered.disconnect(on_photos_altered);
+
+ get_view().contents_altered.disconnect(on_view_contents_ordering_altered);
+ get_view().ordering_changed.disconnect(on_view_contents_ordering_altered);
+ }
+
+ private void on_zoom_slider_value_changed() {
+ ZoomState new_zoom_state = ZoomState.rescale(get_zoom_state(), zoom_slider.get_value());
+
+ if (enable_interactive_zoom_refresh) {
+ on_interactive_zoom(new_zoom_state);
+
+ if (new_zoom_state.is_default())
+ set_zoom_state(new_zoom_state);
+ } else {
+ if (new_zoom_state.is_default()) {
+ cancel_zoom();
+ } else {
+ set_zoom_state(new_zoom_state);
+ }
+ repaint();
+ }
+
+ update_cursor_for_zoom_context();
+ }
+
+ private bool on_zoom_slider_drag_begin(Gdk.EventButton event) {
+ enable_interactive_zoom_refresh = true;
+
+ if (get_container() is FullscreenWindow)
+ ((FullscreenWindow) get_container()).disable_toolbar_dismissal();
+
+ return false;
+ }
+
+ private bool on_zoom_slider_drag_end(Gdk.EventButton event) {
+ enable_interactive_zoom_refresh = false;
+
+ if (get_container() is FullscreenWindow)
+ ((FullscreenWindow) get_container()).update_toolbar_dismissal();
+
+ ZoomState zoom_state = ZoomState.rescale(get_zoom_state(), zoom_slider.get_value());
+ set_zoom_state(zoom_state);
+
+ repaint();
+
+ return false;
+ }
+
+ private bool on_zoom_out_pressed(Gdk.EventButton event) {
+ snap_zoom_to_min();
+ return true;
+ }
+
+ private bool on_zoom_in_pressed(Gdk.EventButton event) {
+ snap_zoom_to_max();
+ return true;
+ }
+
+ private Gdk.Point get_cursor_wrt_viewport(Gdk.EventScroll event) {
+ Gdk.Point cursor_wrt_canvas = {0};
+ cursor_wrt_canvas.x = (int) event.x;
+ cursor_wrt_canvas.y = (int) event.y;
+
+ Gdk.Rectangle viewport_wrt_canvas = get_zoom_state().get_viewing_rectangle_wrt_screen();
+ Gdk.Point result = {0};
+ result.x = cursor_wrt_canvas.x - viewport_wrt_canvas.x;
+ result.x = result.x.clamp(0, viewport_wrt_canvas.width);
+ result.y = cursor_wrt_canvas.y - viewport_wrt_canvas.y;
+ result.y = result.y.clamp(0, viewport_wrt_canvas.height);
+
+ return result;
+ }
+
+ private Gdk.Point get_cursor_wrt_viewport_center(Gdk.EventScroll event) {
+ Gdk.Point cursor_wrt_viewport = get_cursor_wrt_viewport(event);
+ Gdk.Rectangle viewport_wrt_canvas = get_zoom_state().get_viewing_rectangle_wrt_screen();
+
+ Gdk.Point viewport_center = {0};
+ viewport_center.x = viewport_wrt_canvas.width / 2;
+ viewport_center.y = viewport_wrt_canvas.height / 2;
+
+ return subtract_points(cursor_wrt_viewport, viewport_center);
+ }
+
+ private Gdk.Point get_iso_pixel_under_cursor(Gdk.EventScroll event) {
+ Gdk.Point viewport_center_iso = scale_point(get_zoom_state().get_viewport_center(),
+ 1.0 / get_zoom_state().get_zoom_factor());
+
+ Gdk.Point cursor_wrt_center_iso = scale_point(get_cursor_wrt_viewport_center(event),
+ 1.0 / get_zoom_state().get_zoom_factor());
+
+ return add_points(viewport_center_iso, cursor_wrt_center_iso);
+ }
+
+ private double snap_interpolation_factor(double interp) {
+ if (interp < 0.03)
+ interp = 0.0;
+ else if (interp > 0.97)
+ interp = 1.0;
+
+ return interp;
+ }
+
+ private double adjust_interpolation_factor(double adjustment) {
+ return snap_interpolation_factor(get_zoom_state().get_interpolation_factor() + adjustment);
+ }
+
+ private void zoom_about_event_cursor_point(Gdk.EventScroll event, double zoom_increment) {
+ if (photo_missing)
+ return;
+
+ Gdk.Point cursor_wrt_viewport_center = get_cursor_wrt_viewport_center(event);
+ Gdk.Point iso_pixel_under_cursor = get_iso_pixel_under_cursor(event);
+
+ double interp = adjust_interpolation_factor(zoom_increment);
+ zoom_slider.value_changed.disconnect(on_zoom_slider_value_changed);
+ zoom_slider.set_value(interp);
+ zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+
+ ZoomState new_zoom_state = ZoomState.rescale(get_zoom_state(), interp);
+
+ if (new_zoom_state.is_min()) {
+ cancel_zoom();
+ update_cursor_for_zoom_context();
+ repaint();
+ return;
+ }
+
+ Gdk.Point new_zoomed_old_cursor = scale_point(iso_pixel_under_cursor,
+ new_zoom_state.get_zoom_factor());
+ Gdk.Point desired_new_viewport_center = subtract_points(new_zoomed_old_cursor,
+ cursor_wrt_viewport_center);
+
+ new_zoom_state = ZoomState.pan(new_zoom_state, desired_new_viewport_center);
+
+ set_zoom_state(new_zoom_state);
+ repaint();
+
+ update_cursor_for_zoom_context();
+ }
+
+ protected void snap_zoom_to_min() {
+ zoom_slider.set_value(0.0);
+ }
+
+ protected void snap_zoom_to_max() {
+ zoom_slider.set_value(1.0);
+ }
+
+ protected void snap_zoom_to_isomorphic() {
+ ZoomState iso_state = ZoomState.rescale_to_isomorphic(get_zoom_state());
+ zoom_slider.set_value(iso_state.get_interpolation_factor());
+ }
+
+ protected virtual bool on_zoom_slider_key_press(Gdk.EventKey event) {
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "equal":
+ case "plus":
+ case "KP_Add":
+ activate_action("IncreaseSize");
+ return true;
+
+ case "minus":
+ case "underscore":
+ case "KP_Subtract":
+ activate_action("DecreaseSize");
+ return true;
+
+ case "KP_Divide":
+ activate_action("Zoom100");
+ return true;
+
+ case "KP_Multiply":
+ activate_action("ZoomFit");
+ return true;
+ }
+
+ return false;
+ }
+
+ protected virtual void on_increase_size() {
+ zoom_slider.set_value(adjust_interpolation_factor(ZOOM_INCREMENT_SIZE));
+ }
+
+ protected virtual void on_decrease_size() {
+ zoom_slider.set_value(adjust_interpolation_factor(-ZOOM_INCREMENT_SIZE));
+ }
+
+ protected override void save_zoom_state() {
+ base.save_zoom_state();
+ saved_slider_val = zoom_slider.get_value();
+ }
+
+ protected override ZoomBuffer? get_zoom_buffer() {
+ return zoom_buffer;
+ }
+
+ protected override bool on_mousewheel_up(Gdk.EventScroll event) {
+ if (get_zoom_state().is_max() || !zoom_slider.get_sensitive())
+ return false;
+
+ zoom_about_event_cursor_point(event, ZOOM_INCREMENT_SIZE);
+ return false;
+ }
+
+ protected override bool on_mousewheel_down(Gdk.EventScroll event) {
+ if (get_zoom_state().is_min() || !zoom_slider.get_sensitive())
+ return false;
+
+ zoom_about_event_cursor_point(event, -ZOOM_INCREMENT_SIZE);
+ return false;
+ }
+
+ protected override void restore_zoom_state() {
+ base.restore_zoom_state();
+
+ zoom_slider.value_changed.disconnect(on_zoom_slider_value_changed);
+ zoom_slider.set_value(saved_slider_val);
+ zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+ }
+
+ public override bool is_zoom_supported() {
+ return true;
+ }
+
+ public override void set_container(Gtk.Window container) {
+ base.set_container(container);
+
+ // DnD not available in fullscreen mode
+ if (!(container is FullscreenWindow))
+ dnd_handler = new DragAndDropHandler(this);
+ }
+
+ public ViewCollection? get_parent_view() {
+ return parent_view;
+ }
+
+ public bool has_photo() {
+ return get_photo() != null;
+ }
+
+ public Photo? get_photo() {
+ // If there is currently no selected photo, return null.
+ if (get_view().get_selected_count() == 0)
+ return null;
+
+ // Use the selected photo. There should only ever be one selected photo,
+ // which is the currently displayed photo.
+ assert(get_view().get_selected_count() == 1);
+ return (Photo) get_view().get_selected_at(0).get_source();
+ }
+
+ // Called before the photo changes.
+ protected virtual void photo_changing(Photo new_photo) {
+ // If this is a raw image with a missing development, we can regenerate it,
+ // so don't mark it as missing.
+ if (new_photo.get_file_format() == PhotoFileFormat.RAW)
+ set_photo_missing(false);
+ else
+ set_photo_missing(!new_photo.get_file().query_exists());
+
+ update_ui(photo_missing);
+ }
+
+ private void set_photo(Photo photo) {
+ zoom_slider.value_changed.disconnect(on_zoom_slider_value_changed);
+ zoom_slider.set_value(0.0);
+ zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+
+ photo_changing(photo);
+ DataView view = get_view().get_view_for_source(photo);
+ assert(view != null);
+
+ // Select photo.
+ get_view().unselect_all();
+ Marker marker = get_view().mark(view);
+ get_view().select_marked(marker);
+
+ // also select it in the parent view's collection, so when the user returns to that view
+ // it's apparent which one was being viewed here
+ if (parent_view != null) {
+ parent_view.unselect_all();
+ DataView? view_in_parent = parent_view.get_view_for_source_filtered(photo);
+ if (null != view_in_parent)
+ parent_view.select_marked(parent_view.mark(view_in_parent));
+ }
+ }
+
+ public override void realize() {
+ base.realize();
+
+ rebuild_caches("realize");
+ }
+
+ public override void switched_to() {
+ base.switched_to();
+
+ rebuild_caches("switched_to");
+
+ // check if the photo altered while away
+ if (has_photo() && pixbuf_dirty)
+ replace_photo(get_photo());
+ }
+
+ public override void switching_from() {
+ base.switching_from();
+
+ cancel_zoom();
+ is_pan_in_progress = false;
+
+ deactivate_tool();
+
+ // Ticket #3255 - Checkerboard page didn't `remember` what was selected
+ // when the user went into and out of the photo page without navigating
+ // to next or previous.
+ // Since the base class intentionally unselects everything in the parent
+ // view, reselect the currently marked photo here...
+ if ((has_photo()) && (parent_view != null)) {
+ parent_view.select_marked(parent_view.mark(parent_view.get_view_for_source(get_photo())));
+ }
+
+ parent_view = null;
+ get_view().clear();
+ }
+
+ public override void switching_to_fullscreen(FullscreenWindow fsw) {
+ base.switching_to_fullscreen(fsw);
+
+ deactivate_tool();
+
+ cancel_zoom();
+ is_pan_in_progress = false;
+
+ Page page = fsw.get_current_page();
+ if (page != null)
+ page.get_view().items_selected.connect(on_selection_changed);
+ }
+
+ public override void returning_from_fullscreen(FullscreenWindow fsw) {
+ base.returning_from_fullscreen(fsw);
+
+ repaint();
+
+ Page page = fsw.get_current_page();
+ if (page != null)
+ page.get_view().items_selected.disconnect(on_selection_changed);
+ }
+
+ private void on_selection_changed(Gee.Iterable<DataView> selected) {
+ foreach (DataView view in selected) {
+ replace_photo((Photo) view.get_source());
+ break;
+ }
+ }
+
+ protected void enable_rotate(bool should_enable) {
+ rotate_button.set_sensitive(should_enable);
+ }
+
+ // This function should be called if the viewport has changed and the pixbuf cache needs to be
+ // regenerated. Use refresh_caches() if the contents of the ViewCollection have changed
+ // but not the viewport.
+ private void rebuild_caches(string caller) {
+ Scaling scaling = get_canvas_scaling();
+
+ // only rebuild if not the same scaling
+ if (cache != null && cache.get_scaling().equals(scaling))
+ return;
+
+ debug("Rebuild pixbuf caches: %s (%s)", caller, scaling.to_string());
+
+ // if dropping an old cache, clear the signal handler so currently executing requests
+ // don't complete and cancel anything queued up
+ if (cache != null) {
+ cache.fetched.disconnect(on_pixbuf_fetched);
+ cache.cancel_all();
+ }
+
+ cache = new PixbufCache(sources, PixbufCache.PhotoType.BASELINE, scaling, PIXBUF_CACHE_COUNT);
+ cache.fetched.connect(on_pixbuf_fetched);
+
+ master_cache = new PixbufCache(sources, PixbufCache.PhotoType.MASTER, scaling,
+ ORIGINAL_PIXBUF_CACHE_COUNT, master_cache_filter);
+
+ refresh_caches(caller);
+ }
+
+ // See note at rebuild_caches() for usage.
+ private void refresh_caches(string caller) {
+ if (has_photo()) {
+ debug("Refresh pixbuf caches (%s): prefetching neighbors of %s", caller,
+ get_photo().to_string());
+ prefetch_neighbors(get_view(), get_photo());
+ } else {
+ debug("Refresh pixbuf caches (%s): (no photo)", caller);
+ }
+ }
+
+ private bool master_cache_filter(Photo photo) {
+ return photo.has_transformations() || photo.has_editable();
+ }
+
+ private void on_pixbuf_fetched(Photo photo, Gdk.Pixbuf? pixbuf, Error? err) {
+ // if not of the current photo, nothing more to do
+ if (!photo.equals(get_photo()))
+ return;
+
+ if (pixbuf != null) {
+ // update the preview image in the zoom buffer
+ if ((zoom_buffer != null) && (zoom_buffer.get_backing_photo() == photo))
+ zoom_buffer = new ZoomBuffer(this, photo, pixbuf);
+
+ // if no tool, use the pixbuf directly, otherwise, let the tool decide what should be
+ // displayed
+ Dimensions max_dim = photo.get_dimensions();
+ if (current_tool != null) {
+ try {
+ Dimensions tool_pixbuf_dim;
+ Gdk.Pixbuf? tool_pixbuf = current_tool.get_display_pixbuf(get_canvas_scaling(),
+ photo, out tool_pixbuf_dim);
+
+ if (tool_pixbuf != null) {
+ pixbuf = tool_pixbuf;
+ max_dim = tool_pixbuf_dim;
+ }
+ } catch(Error err) {
+ warning("Unable to fetch tool pixbuf for %s: %s", photo.to_string(), err.message);
+ set_photo_missing(true);
+
+ return;
+ }
+ }
+
+ set_pixbuf(pixbuf, max_dim);
+ pixbuf_dirty = false;
+
+ notify_photo_backing_missing((Photo) photo, false);
+ } else if (err != null) {
+ // this call merely updates the UI, and can be called indiscriminantly, whether or not
+ // the photo is actually missing
+ set_photo_missing(true);
+
+ // this call should only be used when we're sure the photo is missing
+ notify_photo_backing_missing((Photo) photo, true);
+ }
+ }
+
+ private void prefetch_neighbors(ViewCollection controller, Photo photo) {
+ PixbufCache.PixbufCacheBatch normal_batch = new PixbufCache.PixbufCacheBatch();
+ PixbufCache.PixbufCacheBatch master_batch = new PixbufCache.PixbufCacheBatch();
+
+ normal_batch.set(BackgroundJob.JobPriority.HIGHEST, photo);
+ master_batch.set(BackgroundJob.JobPriority.LOW, photo);
+
+ DataSource next_source, prev_source;
+ if (!controller.get_immediate_neighbors(photo, out next_source, out prev_source, Photo.TYPENAME))
+ return;
+
+ Photo next = (Photo) next_source;
+ Photo prev = (Photo) prev_source;
+
+ // prefetch the immediate neighbors and their outer neighbors, for plenty of readahead
+ foreach (DataSource neighbor_source in controller.get_extended_neighbors(photo, Photo.TYPENAME)) {
+ Photo neighbor = (Photo) neighbor_source;
+
+ BackgroundJob.JobPriority priority = BackgroundJob.JobPriority.NORMAL;
+ if (neighbor.equals(next) || neighbor.equals(prev))
+ priority = BackgroundJob.JobPriority.HIGH;
+
+ normal_batch.set(priority, neighbor);
+ master_batch.set(BackgroundJob.JobPriority.LOWEST, neighbor);
+ }
+
+ cache.prefetch_batch(normal_batch);
+ master_cache.prefetch_batch(master_batch);
+ }
+
+ // Cancels prefetches of old neighbors, but does not cancel them if they are the new
+ // neighbors
+ private void cancel_prefetch_neighbors(ViewCollection old_controller, Photo old_photo,
+ ViewCollection new_controller, Photo new_photo) {
+ Gee.Set<Photo> old_neighbors = (Gee.Set<Photo>)
+ old_controller.get_extended_neighbors(old_photo, Photo.TYPENAME);
+ Gee.Set<Photo> new_neighbors = (Gee.Set<Photo>)
+ new_controller.get_extended_neighbors(new_photo, Photo.TYPENAME);
+
+ foreach (Photo old_neighbor in old_neighbors) {
+ // cancel prefetch and drop from cache if old neighbor is not part of the new
+ // neighborhood
+ if (!new_neighbors.contains(old_neighbor) && !new_photo.equals(old_neighbor)) {
+ cache.drop(old_neighbor);
+ master_cache.drop(old_neighbor);
+ }
+ }
+
+ // do same for old photo
+ if (!new_neighbors.contains(old_photo) && !new_photo.equals(old_photo)) {
+ cache.drop(old_photo);
+ master_cache.drop(old_photo);
+ }
+ }
+
+ protected virtual DataView create_photo_view(DataSource source) {
+ return new PhotoView((PhotoSource) source);
+ }
+
+ private bool is_photo(DataSource source) {
+ return source is PhotoSource;
+ }
+
+ protected void display_copy_of(ViewCollection controller, Photo starting_photo) {
+ assert(controller.get_view_for_source(starting_photo) != null);
+
+ if (controller != get_view() && controller != parent_view) {
+ get_view().clear();
+ get_view().copy_into(controller, create_photo_view, is_photo);
+ parent_view = controller;
+ }
+
+ replace_photo(starting_photo);
+ }
+
+ protected void display_mirror_of(ViewCollection controller, Photo starting_photo) {
+ assert(controller.get_view_for_source(starting_photo) != null);
+
+ if (controller != get_view() && controller != parent_view) {
+ get_view().clear();
+ get_view().mirror(controller, create_photo_view, is_photo);
+ parent_view = controller;
+ }
+
+ replace_photo(starting_photo);
+ }
+
+ protected virtual void update_ui(bool missing) {
+ bool sensitivity = !missing;
+
+ rotate_button.sensitive = sensitivity;
+ crop_button.sensitive = sensitivity;
+ straighten_button.sensitive = sensitivity;
+ redeye_button.sensitive = sensitivity;
+ adjust_button.sensitive = sensitivity;
+ enhance_button.sensitive = sensitivity;
+ zoom_slider.sensitive = sensitivity;
+
+ deactivate_tool();
+ }
+
+ // This should only be called when it's known that the photo is actually missing.
+ protected virtual void notify_photo_backing_missing(Photo photo, bool missing) {
+ }
+
+ private void draw_message(string message) {
+ // draw the message in the center of the window
+ Pango.Layout pango_layout = create_pango_layout(message);
+ int text_width, text_height;
+ pango_layout.get_pixel_size(out text_width, out text_height);
+
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
+
+ int x = allocation.width - text_width;
+ x = (x > 0) ? x / 2 : 0;
+
+ int y = allocation.height - text_height;
+ y = (y > 0) ? y / 2 : 0;
+
+ paint_text(pango_layout, x, y);
+ }
+
+ // This method can be called indiscriminantly, whether or not the backing is actually present.
+ protected void set_photo_missing(bool missing) {
+ if (photo_missing == missing)
+ return;
+
+ photo_missing = missing;
+
+ Photo? photo = get_photo();
+ if (photo == null)
+ return;
+
+ update_ui(missing);
+
+ if (photo_missing) {
+ try {
+ Gdk.Pixbuf pixbuf = photo.get_preview_pixbuf(get_canvas_scaling());
+
+ pixbuf = pixbuf.composite_color_simple(pixbuf.get_width(), pixbuf.get_height(),
+ Gdk.InterpType.NEAREST, 100, 2, 0, 0);
+
+ set_pixbuf(pixbuf, photo.get_dimensions());
+ } catch (GLib.Error err) {
+ warning("%s", err.message);
+ }
+ }
+ }
+
+ public bool get_photo_missing() {
+ return photo_missing;
+ }
+
+ protected virtual bool confirm_replace_photo(Photo? old_photo, Photo new_photo) {
+ return true;
+ }
+
+ private Gdk.Pixbuf get_zoom_pixbuf(Photo new_photo) {
+ Gdk.Pixbuf? pixbuf = cache.get_ready_pixbuf(new_photo);
+ if (pixbuf == null) {
+ try {
+ pixbuf = new_photo.get_preview_pixbuf(get_canvas_scaling());
+ } catch (Error err) {
+ warning("%s", err.message);
+ }
+ }
+ if (pixbuf == null) {
+ // Create empty pixbuf.
+ pixbuf = AppWindow.get_instance().render_icon(Gtk.Stock.MISSING_IMAGE,
+ Gtk.IconSize.DIALOG, null);
+ get_canvas_scaling().perform_on_pixbuf(pixbuf, Gdk.InterpType.NEAREST, true);
+
+ }
+ return pixbuf;
+ }
+
+ private void replace_photo(Photo new_photo) {
+ // if it's the same Photo object, the scaling hasn't changed, and the photo's file
+ // has not gone missing or re-appeared, there's nothing to do otherwise,
+ // just need to reload the image for the proper scaling. Of course, the photo's pixels
+ // might've changed, so rebuild the zoom buffer.
+ if (new_photo.equals(get_photo()) && !pixbuf_dirty && !photo_missing) {
+ zoom_buffer = new ZoomBuffer(this, new_photo, get_zoom_pixbuf(new_photo));
+ return;
+ }
+
+ // only check if okay to replace if there's something to replace and someone's concerned
+ if (has_photo() && !new_photo.equals(get_photo()) && confirm_replace_photo != null) {
+ if (!confirm_replace_photo(get_photo(), new_photo))
+ return;
+ }
+
+ deactivate_tool();
+
+ // swap out new photo and old photo and process change
+ Photo old_photo = get_photo();
+ set_photo(new_photo);
+ set_page_name(new_photo.get_name());
+
+ // clear out the swap buffer
+ swapped = null;
+
+ // reset flags
+ set_photo_missing(!new_photo.get_file().query_exists());
+ pixbuf_dirty = true;
+
+ // it's possible for this to be called prior to the page being realized, however, the
+ // underlying canvas has a scaling, so use that (hence rebuild rather than refresh)
+ rebuild_caches("replace_photo");
+
+ if (old_photo != null)
+ cancel_prefetch_neighbors(get_view(), old_photo, get_view(), new_photo);
+
+ cancel_zoom();
+
+ zoom_buffer = new ZoomBuffer(this, new_photo, get_zoom_pixbuf(new_photo));
+
+ quick_update_pixbuf();
+
+ // now refresh the caches, which ensures that the neighbors get pulled into memory
+ refresh_caches("replace_photo");
+ }
+
+ protected override void cancel_zoom() {
+ base.cancel_zoom();
+
+ zoom_slider.value_changed.disconnect(on_zoom_slider_value_changed);
+ zoom_slider.set_value(0.0);
+ zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+
+ if (get_photo() != null)
+ set_zoom_state(ZoomState(get_photo().get_dimensions(), get_surface_dim(), 0.0));
+
+ // when cancelling zoom, panning becomes impossible, so set the cursor back to
+ // a left pointer in case it had been a hand-grip cursor indicating that panning
+ // was possible; the null guards are required because zoom can be cancelled at
+ // any time
+ if (canvas != null && canvas.get_window() != null)
+ set_page_cursor(Gdk.CursorType.LEFT_PTR);
+
+ repaint();
+ }
+
+ private void quick_update_pixbuf() {
+ Gdk.Pixbuf? pixbuf = cache.get_ready_pixbuf(get_photo());
+ if (pixbuf != null) {
+ set_pixbuf(pixbuf, get_photo().get_dimensions());
+ pixbuf_dirty = false;
+
+ return;
+ }
+
+ Scaling scaling = get_canvas_scaling();
+
+ debug("Using progressive load for %s (%s)", get_photo().to_string(), scaling.to_string());
+
+ // throw a resized large thumbnail up to get an image on the screen quickly,
+ // and when ready decode and display the full image
+ try {
+ set_pixbuf(get_photo().get_preview_pixbuf(scaling), get_photo().get_dimensions());
+ } catch (Error err) {
+ warning("%s", err.message);
+ }
+
+ cache.prefetch(get_photo(), BackgroundJob.JobPriority.HIGHEST);
+
+ // although final pixbuf not in place, it's on its way, so set this to clean so later calls
+ // don't reload again
+ pixbuf_dirty = false;
+ }
+
+ private bool update_pixbuf() {
+#if MEASURE_PIPELINE
+ Timer timer = new Timer();
+#endif
+
+ Photo? photo = get_photo();
+ if (photo == null)
+ return false;
+
+ Gdk.Pixbuf pixbuf = null;
+ Dimensions max_dim = photo.get_dimensions();
+
+ try {
+ Dimensions tool_pixbuf_dim = {0};
+ if (current_tool != null)
+ pixbuf = current_tool.get_display_pixbuf(get_canvas_scaling(), photo, out tool_pixbuf_dim);
+
+ if (pixbuf != null)
+ max_dim = tool_pixbuf_dim;
+ } catch (Error err) {
+ warning("%s", err.message);
+ set_photo_missing(true);
+ }
+
+ if (!photo_missing) {
+ // if no pixbuf, see if it's waiting in the cache
+ if (pixbuf == null)
+ pixbuf = cache.get_ready_pixbuf(photo);
+
+ // if still no pixbuf, background fetch and let the signal handler update the display
+ if (pixbuf == null)
+ cache.prefetch(photo);
+ }
+
+ if (!photo_missing && pixbuf != null) {
+ set_pixbuf(pixbuf, max_dim);
+ pixbuf_dirty = false;
+ }
+
+#if MEASURE_PIPELINE
+ debug("UPDATE_PIXBUF: total=%lf", timer.elapsed());
+#endif
+
+ return false;
+ }
+
+ protected override void on_resize(Gdk.Rectangle rect) {
+ base.on_resize(rect);
+
+ track_tool_window();
+ }
+
+ protected override void on_resize_finished(Gdk.Rectangle rect) {
+ // because we've loaded SinglePhotoPage with an image scaled to window size, as the window
+ // is resized it scales that, which pixellates, especially scaling upward. Once the window
+ // resize is complete, we get a fresh image for the new window's size
+ rebuild_caches("on_resize_finished");
+ pixbuf_dirty = true;
+
+ update_pixbuf();
+ }
+
+ private void on_viewport_resized() {
+ // this means the viewport (the display area) has changed, but not necessarily the
+ // toplevel window's dimensions
+ rebuild_caches("on_viewport_resized");
+ pixbuf_dirty = true;
+
+ update_pixbuf();
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ bool multiple_photos = get_view().get_sources_of_type_count(typeof(Photo)) > 1;
+
+ prev_button.sensitive = multiple_photos;
+ next_button.sensitive = multiple_photos;
+
+ Photo? photo = get_photo();
+ Scaling scaling = get_canvas_scaling();
+
+ rotate_button.sensitive = ((photo != null) && (!photo_missing) && photo.check_can_rotate()) ?
+ is_rotate_available(photo) : false;
+ crop_button.sensitive = ((photo != null) && (!photo_missing)) ?
+ EditingTools.CropTool.is_available(photo, scaling) : false;
+ redeye_button.sensitive = ((photo != null) && (!photo_missing)) ?
+ EditingTools.RedeyeTool.is_available(photo, scaling) : false;
+ adjust_button.sensitive = ((photo != null) && (!photo_missing)) ?
+ EditingTools.AdjustTool.is_available(photo, scaling) : false;
+ enhance_button.sensitive = ((photo != null) && (!photo_missing)) ?
+ is_enhance_available(photo) : false;
+ straighten_button.sensitive = ((photo != null) && (!photo_missing)) ?
+ EditingTools.StraightenTool.is_available(photo, scaling) : false;
+
+ base.update_actions(selected_count, count);
+ }
+
+ protected override bool on_shift_pressed(Gdk.EventKey? event) {
+ // show quick compare of original only if no tool is in use, the original pixbuf is handy
+ if (current_tool == null && !get_ctrl_pressed() && !get_alt_pressed())
+ swap_in_original();
+
+ return base.on_shift_pressed(event);
+ }
+
+ protected override bool on_shift_released(Gdk.EventKey? event) {
+ if (current_tool == null)
+ swap_out_original();
+
+ return base.on_shift_released(event);
+ }
+
+ protected override bool on_alt_pressed(Gdk.EventKey? event) {
+ if (current_tool == null)
+ swap_out_original();
+
+ return base.on_alt_pressed(event);
+ }
+
+ protected override bool on_alt_released(Gdk.EventKey? event) {
+ if (current_tool == null && get_shift_pressed() && !get_ctrl_pressed())
+ swap_in_original();
+
+ return base.on_alt_released(event);
+ }
+
+ private void swap_in_original() {
+ Gdk.Pixbuf? original;
+
+ original =
+ get_photo().get_original_orientation().rotate_pixbuf(get_photo().get_prefetched_copy());
+
+ if (original == null)
+ return;
+
+ // store what's currently displayed only for the duration of the shift pressing
+ swapped = get_unscaled_pixbuf();
+
+ // save the zoom state and cancel zoom so that the user can see all of the original
+ // photo
+ if (zoom_slider.get_value() != 0.0) {
+ save_zoom_state();
+ cancel_zoom();
+ }
+
+ set_pixbuf(original, get_photo().get_master_dimensions());
+ }
+
+ private void swap_out_original() {
+ if (swapped != null) {
+ set_pixbuf(swapped, get_photo().get_dimensions());
+
+ restore_zoom_state();
+ update_cursor_for_zoom_context();
+
+ // only store swapped once; it'll be set the next on_shift_pressed
+ swapped = null;
+ }
+ }
+
+ private void activate_tool(EditingTools.EditingTool tool) {
+ // cancel any zoom -- we don't currently allow tools to be used when an image is zoomed,
+ // though we may at some point in the future.
+ save_zoom_state();
+ cancel_zoom();
+
+ // deactivate current tool ... current implementation is one tool at a time. In the future,
+ // tools may be allowed to be executing at the same time.
+ deactivate_tool();
+
+ // save current pixbuf to use if user cancels operation
+ cancel_editing_pixbuf = get_unscaled_pixbuf();
+
+ // see if the tool wants a different pixbuf displayed and what its max dimensions should be
+ Gdk.Pixbuf unscaled;
+ Dimensions max_dim = get_photo().get_dimensions();
+ try {
+ Dimensions tool_pixbuf_dim = {0};
+ unscaled = tool.get_display_pixbuf(get_canvas_scaling(), get_photo(), out tool_pixbuf_dim);
+
+ if (unscaled != null)
+ max_dim = tool_pixbuf_dim;
+ } catch (Error err) {
+ warning("%s", err.message);
+ set_photo_missing(true);
+
+ // untoggle tool button (usually done after deactivate, but tool never deactivated)
+ assert(current_editing_toggle != null);
+ current_editing_toggle.active = false;
+
+ return;
+ }
+
+ if (unscaled != null)
+ set_pixbuf(unscaled, max_dim);
+
+ // create the PhotoCanvas object for a two-way interface to the tool
+ EditingTools.PhotoCanvas photo_canvas = new EditingHostCanvas(this);
+
+ // hook tool into event system and activate it
+ current_tool = tool;
+ current_tool.activate(photo_canvas);
+
+ // if the tool has an auxiliary window, move it properly on the screen
+ place_tool_window();
+
+ // repaint entire view, with the tool now hooked in
+ repaint();
+ }
+
+ private void deactivate_tool(Command? command = null, Gdk.Pixbuf? new_pixbuf = null,
+ Dimensions new_max_dim = Dimensions(), bool needs_improvement = false) {
+ if (current_tool == null)
+ return;
+
+ EditingTools.EditingTool tool = current_tool;
+ current_tool = null;
+
+ // save the position of the tool
+ EditingTools.EditingToolWindow? tool_window = tool.get_tool_window();
+ if (tool_window != null && tool_window.has_user_moved()) {
+ int last_location_x, last_location_y;
+ tool_window.get_position(out last_location_x, out last_location_y);
+ last_locations[tool.name + "_x"] = last_location_x;
+ last_locations[tool.name + "_y"] = last_location_y;
+ }
+
+ // deactivate with the tool taken out of the hooks and
+ // disconnect any signals we may have connected on activating
+ tool.deactivate();
+
+ tool.activated.disconnect(on_tool_activated);
+ tool.deactivated.disconnect(on_tool_deactivated);
+ tool.applied.disconnect(on_tool_applied);
+ tool.cancelled.disconnect(on_tool_cancelled);
+ tool.aborted.disconnect(on_tool_aborted);
+
+ tool = null;
+
+ // only null the toggle when the tool is completely deactivated; that is, deactive the tool
+ // before updating the UI
+ current_editing_toggle = null;
+
+ // display the (possibly) new photo
+ Gdk.Pixbuf replacement = null;
+ if (new_pixbuf != null) {
+ replacement = new_pixbuf;
+ } else if (cancel_editing_pixbuf != null) {
+ replacement = cancel_editing_pixbuf;
+ new_max_dim = Dimensions.for_pixbuf(replacement);
+ needs_improvement = false;
+ } else {
+ needs_improvement = true;
+ }
+
+ if (replacement != null)
+ set_pixbuf(replacement, new_max_dim);
+ cancel_editing_pixbuf = null;
+
+ // if this is a rough pixbuf, schedule an improvement
+ if (needs_improvement) {
+ pixbuf_dirty = true;
+ Idle.add(update_pixbuf);
+ }
+
+ // execute the tool's command
+ if (command != null)
+ get_command_manager().execute(command);
+ }
+
+ // This virtual method is called only when the user double-clicks on the page and no tool
+ // is active
+ protected virtual bool on_double_click(Gdk.EventButton event) {
+ return false;
+ }
+
+ // Return true to block the DnD handler from activating a drag
+ protected override bool on_left_click(Gdk.EventButton event) {
+ // report double-click if no tool is active, otherwise all double-clicks are eaten
+ if (event.type == Gdk.EventType.2BUTTON_PRESS)
+ return (current_tool == null) ? on_double_click(event) : false;
+
+ int x = (int) event.x;
+ int y = (int) event.y;
+
+ // if no editing tool, then determine whether we should start a pan operation over the
+ // zoomed photo or fall through to the default DnD behavior if we're not zoomed
+ if ((current_tool == null) && (zoom_slider.get_value() != 0.0)) {
+ zoom_pan_start_point.x = (int) event.x;
+ zoom_pan_start_point.y = (int) event.y;
+ is_pan_in_progress = true;
+ suspend_cursor_hiding();
+
+ return true;
+ }
+
+ // default behavior when photo isn't zoomed -- return false to start DnD operation
+ if (current_tool == null) {
+ return false;
+ }
+
+ // only concerned about mouse-downs on the pixbuf ... return true prevents DnD when the
+ // user drags outside the displayed photo
+ if (!is_inside_pixbuf(x, y))
+ return true;
+
+ current_tool.on_left_click(x, y);
+
+ // block DnD handlers if tool is enabled
+ return true;
+ }
+
+ protected override bool on_left_released(Gdk.EventButton event) {
+ if (is_pan_in_progress) {
+ Gdk.Point viewport_center = get_zoom_state().get_viewport_center();
+ int delta_x = ((int) event.x) - zoom_pan_start_point.x;
+ int delta_y = ((int) event.y) - zoom_pan_start_point.y;
+ viewport_center.x -= delta_x;
+ viewport_center.y -= delta_y;
+
+ ZoomState zoom_state = ZoomState.pan(get_zoom_state(), viewport_center);
+ set_zoom_state(zoom_state);
+ get_zoom_buffer().flush_demand_cache(zoom_state);
+
+ is_pan_in_progress = false;
+ restore_cursor_hiding();
+ }
+
+ // report all releases, as it's possible the user click and dragged from inside the
+ // pixbuf to the gutters
+ if (current_tool == null)
+ return false;
+
+ current_tool.on_left_released((int) event.x, (int) event.y);
+
+ if (current_tool.get_tool_window() != null)
+ current_tool.get_tool_window().present();
+
+ return false;
+ }
+
+ protected override bool on_right_click(Gdk.EventButton event) {
+ return on_context_buttonpress(event);
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> map) {
+ if (!map.has_key(get_photo()))
+ return;
+
+ pixbuf_dirty = true;
+
+ // if transformed, want to prefetch the original pixbuf for this photo, but after the
+ // signal is completed as PixbufCache may remove it in this round of fired signals
+ if (get_photo().has_transformations())
+ Idle.add(on_fetch_original);
+
+ update_actions(get_view().get_selected_count(), get_view().get_count());
+ }
+
+ private void on_view_contents_ordering_altered() {
+ refresh_caches("on_view_contents_ordering_altered");
+ }
+
+ private bool on_fetch_original() {
+ if (has_photo())
+ master_cache.prefetch(get_photo(), BackgroundJob.JobPriority.LOW);
+
+ return false;
+ }
+
+ private bool is_panning_possible() {
+ // panning is impossible if all the content to be drawn completely fits on the drawing
+ // canvas
+ Dimensions content_dim = {0};
+ content_dim.width = get_zoom_state().get_zoomed_width();
+ content_dim.height = get_zoom_state().get_zoomed_height();
+ Dimensions canvas_dim = get_surface_dim();
+
+ return (!(canvas_dim.width >= content_dim.width && canvas_dim.height >= content_dim.height));
+ }
+
+ private void update_cursor_for_zoom_context() {
+ if (is_panning_possible())
+ set_page_cursor(Gdk.CursorType.FLEUR);
+ else
+ set_page_cursor(Gdk.CursorType.LEFT_PTR);
+ }
+
+ // Return true to block the DnD handler from activating a drag
+ protected override bool on_motion(Gdk.EventMotion event, int x, int y, Gdk.ModifierType mask) {
+ if (current_tool != null) {
+ current_tool.on_motion(x, y, mask);
+
+ // this requests more events after "hints"
+ Gdk.Event.request_motions(event);
+
+ return true;
+ }
+
+ update_cursor_for_zoom_context();
+
+ if (is_pan_in_progress) {
+ int delta_x = ((int) event.x) - zoom_pan_start_point.x;
+ int delta_y = ((int) event.y) - zoom_pan_start_point.y;
+
+ Gdk.Point viewport_center = get_zoom_state().get_viewport_center();
+ viewport_center.x -= delta_x;
+ viewport_center.y -= delta_y;
+
+ ZoomState zoom_state = ZoomState.pan(get_zoom_state(), viewport_center);
+
+ on_interactive_pan(zoom_state);
+ return true;
+ }
+
+ return base.on_motion(event, x, y, mask);
+ }
+
+ protected override bool on_leave_notify_event() {
+ if (current_tool != null)
+ return current_tool.on_leave_notify_event();
+
+ return base.on_leave_notify_event();
+ }
+
+ private void track_tool_window() {
+ // if editing tool window is present and the user hasn't touched it, it moves with the window
+ if (current_tool != null) {
+ EditingTools.EditingToolWindow tool_window = current_tool.get_tool_window();
+ if (tool_window != null && !tool_window.has_user_moved())
+ place_tool_window();
+ }
+ }
+
+ protected override void on_move(Gdk.Rectangle rect) {
+ track_tool_window();
+
+ base.on_move(rect);
+ }
+
+ protected override void on_move_finished(Gdk.Rectangle rect) {
+ last_locations.clear();
+
+ base.on_move_finished(rect);
+ }
+
+ private bool on_keyboard_pan_event(Gdk.EventKey event) {
+ ZoomState current_zoom_state = get_zoom_state();
+ Gdk.Point viewport_center = current_zoom_state.get_viewport_center();
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Left":
+ case "KP_Left":
+ case "KP_4":
+ viewport_center.x -= PAN_INCREMENT_SIZE;
+ break;
+
+ case "Right":
+ case "KP_Right":
+ case "KP_6":
+ viewport_center.x += PAN_INCREMENT_SIZE;
+ break;
+
+ case "Down":
+ case "KP_Down":
+ case "KP_2":
+ viewport_center.y += PAN_INCREMENT_SIZE;
+ break;
+
+ case "Up":
+ case "KP_Up":
+ case "KP_8":
+ viewport_center.y -= PAN_INCREMENT_SIZE;
+ break;
+
+ default:
+ return false;
+ }
+
+ ZoomState new_zoom_state = ZoomState.pan(current_zoom_state, viewport_center);
+ set_zoom_state(new_zoom_state);
+ repaint();
+
+ return true;
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ // editing tool gets first crack at the keypress
+ if (current_tool != null) {
+ if (current_tool.on_keypress(event))
+ return true;
+ }
+
+ // if panning is possible, the pan handler (on MUNI?) gets second crack at the keypress
+ if (is_panning_possible()) {
+ if (on_keyboard_pan_event(event))
+ return true;
+ }
+
+ // if the user pressed the "0", "1" or "2" keys then handle the event as if were
+ // directed at the zoom slider ("0", "1" and "2" are hotkeys that jump to preset
+ // zoom levels
+ if (on_zoom_slider_key_press(event))
+ return true;
+
+ bool handled = true;
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ // this block is only here to prevent base from moving focus to toolbar
+ case "Down":
+ case "KP_Down":
+ ;
+ break;
+
+ case "equal":
+ case "plus":
+ case "KP_Add":
+ activate_action("IncreaseSize");
+ break;
+
+ // underscore is the keysym generated by SHIFT-[minus sign] -- this means zoom out
+ case "minus":
+ case "underscore":
+ case "KP_Subtract":
+ activate_action("DecreaseSize");
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ if (handled)
+ return true;
+
+ return (base.key_press_event != null) ? base.key_press_event(event) : true;
+ }
+
+ protected override void new_surface(Cairo.Context default_ctx, Dimensions dim) {
+ // if tool is open, update its canvas object
+ if (current_tool != null)
+ current_tool.canvas.set_surface(default_ctx, dim);
+ }
+
+ protected override void updated_pixbuf(Gdk.Pixbuf pixbuf, SinglePhotoPage.UpdateReason reason,
+ Dimensions old_dim) {
+ // only purpose here is to inform editing tool of change and drop the cancelled
+ // pixbuf, which is now sized incorrectly
+ if (current_tool != null && reason != SinglePhotoPage.UpdateReason.QUALITY_IMPROVEMENT) {
+ current_tool.canvas.resized_pixbuf(old_dim, pixbuf, get_scaled_pixbuf_position());
+ cancel_editing_pixbuf = null;
+ }
+ }
+
+ protected virtual Gdk.Pixbuf? get_bottom_left_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_top_left_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_top_right_trinket(int scale) {
+ return null;
+ }
+
+ protected virtual Gdk.Pixbuf? get_bottom_right_trinket(int scale) {
+ return null;
+ }
+
+ protected override void paint(Cairo.Context ctx, Dimensions ctx_dim) {
+ if (current_tool != null) {
+ current_tool.paint(ctx);
+
+ return;
+ }
+
+ if (photo_missing && has_photo()) {
+ set_source_color_from_string(ctx, "#000");
+ ctx.rectangle(0, 0, get_surface_dim().width, get_surface_dim().height);
+ ctx.fill();
+ ctx.paint();
+ draw_message(_("Photo source file missing: %s").printf(get_photo().get_file().get_path()));
+ return;
+ }
+
+ base.paint(ctx, ctx_dim);
+
+ if (!get_zoom_state().is_default())
+ return;
+
+ // paint trinkets last
+ Gdk.Rectangle scaled_rect = get_scaled_pixbuf_position();
+
+ Gdk.Pixbuf? trinket = get_bottom_left_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = scaled_rect.x + TRINKET_PADDING;
+ int y = scaled_rect.y + scaled_rect.height - trinket.height - TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.width, trinket.height);
+ ctx.fill();
+ }
+
+ trinket = get_top_left_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = scaled_rect.x + TRINKET_PADDING;
+ int y = scaled_rect.y + TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.width, trinket.height);
+ ctx.fill();
+ }
+
+ trinket = get_top_right_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = scaled_rect.x + scaled_rect.width - trinket.width - TRINKET_PADDING;
+ int y = scaled_rect.y + TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.width, trinket.height);
+ ctx.fill();
+ }
+
+ trinket = get_bottom_right_trinket(TRINKET_SCALE);
+ if (trinket != null) {
+ int x = scaled_rect.x + scaled_rect.width - trinket.width - TRINKET_PADDING;
+ int y = scaled_rect.y + scaled_rect.height - trinket.height - TRINKET_PADDING;
+ Gdk.cairo_set_source_pixbuf(ctx, trinket, x, y);
+ ctx.rectangle(x, y, trinket.width, trinket.height);
+ ctx.fill();
+ }
+ }
+
+ public bool is_rotate_available(Photo photo) {
+ return !photo_missing;
+ }
+
+ private void rotate(Rotation rotation, string name, string description) {
+ cancel_zoom();
+
+ deactivate_tool();
+
+ if (!has_photo())
+ return;
+
+ RotateSingleCommand command = new RotateSingleCommand(get_photo(), rotation, name,
+ description);
+ get_command_manager().execute(command);
+ }
+
+ public void on_rotate_clockwise() {
+ rotate(Rotation.CLOCKWISE, Resources.ROTATE_CW_FULL_LABEL, Resources.ROTATE_CW_TOOLTIP);
+ }
+
+ public void on_rotate_counterclockwise() {
+ rotate(Rotation.COUNTERCLOCKWISE, Resources.ROTATE_CCW_FULL_LABEL, Resources.ROTATE_CCW_TOOLTIP);
+ }
+
+ public void on_flip_horizontally() {
+ rotate(Rotation.MIRROR, Resources.HFLIP_LABEL, "");
+ }
+
+ public void on_flip_vertically() {
+ rotate(Rotation.UPSIDE_DOWN, Resources.VFLIP_LABEL, "");
+ }
+
+ public void on_revert() {
+ if (photo_missing)
+ return;
+
+ deactivate_tool();
+
+ if (!has_photo())
+ return;
+
+ if (get_photo().has_editable()) {
+ if (!revert_editable_dialog(AppWindow.get_instance(),
+ (Gee.Collection<Photo>) get_view().get_sources())) {
+ return;
+ }
+
+ get_photo().revert_to_master();
+ }
+
+ cancel_zoom();
+
+ set_photo_missing(false);
+
+ RevertSingleCommand command = new RevertSingleCommand(get_photo());
+ get_command_manager().execute(command);
+ }
+
+ public void on_edit_title() {
+ LibraryPhoto item;
+ if (get_photo() is LibraryPhoto)
+ item = get_photo() as LibraryPhoto;
+ else
+ return;
+
+ EditTitleDialog edit_title_dialog = new EditTitleDialog(item.get_title());
+ string? new_title = edit_title_dialog.execute();
+ if (new_title == null)
+ return;
+
+ EditTitleCommand command = new EditTitleCommand(item, new_title);
+ get_command_manager().execute(command);
+ }
+
+ public void on_edit_comment() {
+ LibraryPhoto item;
+ if (get_photo() is LibraryPhoto)
+ item = get_photo() as LibraryPhoto;
+ else
+ return;
+
+ EditCommentDialog edit_comment_dialog = new EditCommentDialog(item.get_comment());
+ string? new_comment = edit_comment_dialog.execute();
+ if (new_comment == null)
+ return;
+
+ EditCommentCommand command = new EditCommentCommand(item, new_comment);
+ get_command_manager().execute(command);
+ }
+
+ public void on_adjust_date_time() {
+ if (!has_photo())
+ return;
+
+ AdjustDateTimeDialog dialog = new AdjustDateTimeDialog(get_photo(), 1, !(this is DirectPhotoPage));
+
+ int64 time_shift;
+ bool keep_relativity, modify_originals;
+ if (dialog.execute(out time_shift, out keep_relativity, out modify_originals)) {
+ get_view().get_selected();
+
+ AdjustDateTimePhotoCommand command = new AdjustDateTimePhotoCommand(get_photo(),
+ time_shift, modify_originals);
+ get_command_manager().execute(command);
+ }
+ }
+
+ public void on_set_background() {
+ if (has_photo())
+ DesktopIntegration.set_background(get_photo());
+ }
+
+ protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
+ rotate_button.set_icon_name(Resources.COUNTERCLOCKWISE);
+ rotate_button.set_label(Resources.ROTATE_CCW_LABEL);
+ rotate_button.set_tooltip_text(Resources.ROTATE_CCW_TOOLTIP);
+ rotate_button.clicked.disconnect(on_rotate_clockwise);
+ rotate_button.clicked.connect(on_rotate_counterclockwise);
+
+ if (current_tool == null)
+ swap_out_original();
+
+ return base.on_ctrl_pressed(event);
+ }
+
+ protected override bool on_ctrl_released(Gdk.EventKey? event) {
+ rotate_button.set_icon_name(Resources.CLOCKWISE);
+ rotate_button.set_label(Resources.ROTATE_CW_LABEL);
+ rotate_button.set_tooltip_text(Resources.ROTATE_CW_TOOLTIP);
+ rotate_button.clicked.disconnect(on_rotate_counterclockwise);
+ rotate_button.clicked.connect(on_rotate_clockwise);
+
+ if (current_tool == null && get_shift_pressed() && !get_alt_pressed())
+ swap_in_original();
+
+ return base.on_ctrl_released(event);
+ }
+
+ protected void on_tool_button_toggled(Gtk.ToggleToolButton toggle, EditingTools.EditingTool.Factory factory) {
+ // if the button is an activate, deactivate any current tool running; if the button is
+ // a deactivate, deactivate the current tool and exit
+ bool deactivating_only = (!toggle.active && current_editing_toggle == toggle);
+ deactivate_tool();
+
+ if (deactivating_only) {
+ restore_cursor_hiding();
+ return;
+ }
+
+ suspend_cursor_hiding();
+
+ current_editing_toggle = toggle;
+
+ // create the tool, hook its signals, and activate
+ EditingTools.EditingTool tool = factory();
+ tool.activated.connect(on_tool_activated);
+ tool.deactivated.connect(on_tool_deactivated);
+ tool.applied.connect(on_tool_applied);
+ tool.cancelled.connect(on_tool_cancelled);
+ tool.aborted.connect(on_tool_aborted);
+
+ activate_tool(tool);
+ }
+
+ private void on_tool_activated() {
+ assert(current_editing_toggle != null);
+ zoom_slider.set_sensitive(false);
+ current_editing_toggle.active = true;
+ }
+
+ private void on_tool_deactivated() {
+ assert(current_editing_toggle != null);
+ zoom_slider.set_sensitive(true);
+ current_editing_toggle.active = false;
+ }
+
+ private void on_tool_applied(Command? command, Gdk.Pixbuf? new_pixbuf, Dimensions new_max_dim,
+ bool needs_improvement) {
+ deactivate_tool(command, new_pixbuf, new_max_dim, needs_improvement);
+ }
+
+ private void on_tool_cancelled() {
+ deactivate_tool();
+
+ restore_zoom_state();
+ repaint();
+ }
+
+ private void on_tool_aborted() {
+ deactivate_tool();
+ set_photo_missing(true);
+ }
+
+ protected void toggle_crop() {
+ crop_button.set_active(!crop_button.get_active());
+ }
+
+ protected void toggle_straighten() {
+ straighten_button.set_active(!straighten_button.get_active());
+ }
+
+ protected void toggle_redeye() {
+ redeye_button.set_active(!redeye_button.get_active());
+ }
+
+ protected void toggle_adjust() {
+ adjust_button.set_active(!adjust_button.get_active());
+ }
+
+ private void on_straighten_toggled() {
+ on_tool_button_toggled(straighten_button, EditingTools.StraightenTool.factory);
+ }
+
+ private void on_crop_toggled() {
+ on_tool_button_toggled(crop_button, EditingTools.CropTool.factory);
+ }
+
+ private void on_redeye_toggled() {
+ on_tool_button_toggled(redeye_button, EditingTools.RedeyeTool.factory);
+ }
+
+ private void on_adjust_toggled() {
+ on_tool_button_toggled(adjust_button, EditingTools.AdjustTool.factory);
+ }
+
+ public bool is_enhance_available(Photo photo) {
+ return !photo_missing;
+ }
+
+ public void on_enhance() {
+ // because running multiple tools at once is not currently supported, deactivate any current
+ // tool; however, there is a special case of running enhancement while the AdjustTool is
+ // open, so allow for that
+ if (!(current_tool is EditingTools.AdjustTool)) {
+ deactivate_tool();
+
+ cancel_zoom();
+ }
+
+ if (!has_photo())
+ return;
+
+ EditingTools.AdjustTool adjust_tool = current_tool as EditingTools.AdjustTool;
+ if (adjust_tool != null) {
+ adjust_tool.enhance();
+
+ return;
+ }
+
+ EnhanceSingleCommand command = new EnhanceSingleCommand(get_photo());
+ get_command_manager().execute(command);
+ }
+
+ public void on_copy_adjustments() {
+ if (!has_photo())
+ return;
+ PixelTransformationBundle.set_copied_color_adjustments(get_photo().get_color_adjustments());
+ set_action_sensitive("PasteColorAdjustments", true);
+ }
+
+ public void on_paste_adjustments() {
+ PixelTransformationBundle? copied_adjustments = PixelTransformationBundle.get_copied_color_adjustments();
+ if (!has_photo() || copied_adjustments == null)
+ return;
+
+ AdjustColorsSingleCommand command = new AdjustColorsSingleCommand(get_photo(), copied_adjustments,
+ Resources.PASTE_ADJUSTMENTS_LABEL, Resources.PASTE_ADJUSTMENTS_TOOLTIP);
+ get_command_manager().execute(command);
+ }
+
+ private void place_tool_window() {
+ if (current_tool == null)
+ return;
+
+ EditingTools.EditingToolWindow tool_window = current_tool.get_tool_window();
+ if (tool_window == null)
+ return;
+
+ // do this so window size is properly allocated, but window not shown
+ tool_window.show_all();
+ tool_window.hide();
+
+ Gtk.Allocation tool_alloc;
+ tool_window.get_allocation(out tool_alloc);
+ int x, y;
+
+ // Check if the last location of the adjust tool is stored.
+ if (last_locations.has_key(current_tool.name + "_x")) {
+ x = last_locations[current_tool.name + "_x"];
+ y = last_locations[current_tool.name + "_y"];
+ } else {
+ // No stored position
+ if (get_container() == AppWindow.get_instance()) {
+
+ // Normal: position crop tool window centered on viewport/canvas at the bottom,
+ // straddling the canvas and the toolbar
+ int rx, ry;
+ get_container().get_window().get_root_origin(out rx, out ry);
+
+ Gtk.Allocation viewport_allocation;
+ viewport.get_allocation(out viewport_allocation);
+
+ int cx, cy, cwidth, cheight;
+ cx = viewport_allocation.x;
+ cy = viewport_allocation.y;
+ cwidth = viewport_allocation.width;
+ cheight = viewport_allocation.height;
+
+ // it isn't clear why, but direct mode seems to want to position tool windows
+ // differently than library mode...
+ x = (this is DirectPhotoPage) ? (rx + cx + (cwidth / 2) - (tool_alloc.width / 2)) :
+ (rx + cx + (cwidth / 2));
+ y = ry + cy + cheight - ((tool_alloc.height / 4) * 3);
+ } else {
+ assert(get_container() is FullscreenWindow);
+
+ // Fullscreen: position crop tool window centered on screen at the bottom, just above the
+ // toolbar
+ Gtk.Allocation toolbar_alloc;
+ get_toolbar().get_allocation(out toolbar_alloc);
+
+ Gdk.Screen screen = get_container().get_screen();
+ x = screen.get_width();
+ y = screen.get_height() - toolbar_alloc.height -
+ tool_alloc.height - TOOL_WINDOW_SEPARATOR;
+
+ // put larger adjust tool off to the side
+ if (current_tool is EditingTools.AdjustTool) {
+ x = x * 3 / 4;
+ } else {
+ x = (x - tool_alloc.width) / 2;
+ }
+ }
+ }
+
+ // however, clamp the window so it's never off-screen initially
+ Gdk.Screen screen = get_container().get_screen();
+ x = x.clamp(0, screen.get_width() - tool_alloc.width);
+ y = y.clamp(0, screen.get_height() - tool_alloc.height);
+
+ tool_window.move(x, y);
+ tool_window.show();
+ tool_window.present();
+ }
+
+ protected override void on_next_photo() {
+ deactivate_tool();
+
+ if (!has_photo())
+ return;
+
+ Photo? current_photo = get_photo();
+ assert(current_photo != null);
+
+ DataView current = get_view().get_view_for_source(get_photo());
+ if (current == null)
+ return;
+
+ // search through the collection until the next photo is found or back at the starting point
+ DataView? next = current;
+ for (;;) {
+ next = get_view().get_next(next);
+ if (next == null)
+ break;
+
+ Photo? next_photo = next.get_source() as Photo;
+ if (next_photo == null)
+ continue;
+
+ if (next_photo == current_photo)
+ break;
+
+ replace_photo(next_photo);
+
+ break;
+ }
+ }
+
+ protected override void on_previous_photo() {
+ deactivate_tool();
+
+ if (!has_photo())
+ return;
+
+ Photo? current_photo = get_photo();
+ assert(current_photo != null);
+
+ DataView current = get_view().get_view_for_source(get_photo());
+ if (current == null)
+ return;
+
+ // loop until a previous photo is found or back at the starting point
+ DataView? previous = current;
+ for (;;) {
+ previous = get_view().get_previous(previous);
+ if (previous == null)
+ break;
+
+ Photo? previous_photo = previous.get_source() as Photo;
+ if (previous_photo == null)
+ continue;
+
+ if (previous_photo == current_photo)
+ break;
+
+ replace_photo(previous_photo);
+
+ break;
+ }
+ }
+
+ public bool has_current_tool() {
+ return (current_tool != null);
+ }
+
+ protected void unset_view_collection() {
+ parent_view = null;
+ }
+}
+
+//
+// LibraryPhotoPage
+//
+
+public class LibraryPhotoPage : EditingHostPage {
+
+ private class LibraryPhotoPageViewFilter : ViewFilter {
+ public override bool predicate (DataView view) {
+ return !((MediaSource) view.get_source()).is_trashed();
+ }
+ }
+
+ private CollectionPage? return_page = null;
+ private bool return_to_collection_on_release = false;
+ private LibraryPhotoPageViewFilter filter = new LibraryPhotoPageViewFilter();
+
+ public LibraryPhotoPage() {
+ base(LibraryPhoto.global, "Photo");
+
+ // monitor view to update UI elements
+ get_view().items_altered.connect(on_photos_altered);
+
+ // watch for photos being destroyed or altered, either here or in other pages
+ LibraryPhoto.global.item_destroyed.connect(on_photo_destroyed);
+ LibraryPhoto.global.items_altered.connect(on_metadata_altered);
+
+ // watch for updates to the external app settings
+ Config.Facade.get_instance().external_app_changed.connect(on_external_app_changed);
+
+ // Filter out trashed files.
+ get_view().install_view_filter(filter);
+ LibraryPhoto.global.items_unlinking.connect(on_photo_unlinking);
+ LibraryPhoto.global.items_relinked.connect(on_photo_relinked);
+ }
+
+ ~LibraryPhotoPage() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_photo_destroyed);
+ LibraryPhoto.global.items_altered.disconnect(on_metadata_altered);
+ Config.Facade.get_instance().external_app_changed.disconnect(on_external_app_changed);
+ }
+
+ public bool not_trashed_view_filter(DataView view) {
+ return !((MediaSource) view.get_source()).is_trashed();
+ }
+
+ private void on_photo_unlinking(Gee.Collection<DataSource> unlinking) {
+ filter.refresh();
+ }
+
+ private void on_photo_relinked(Gee.Collection<DataSource> relinked) {
+ filter.refresh();
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("photo_context.ui");
+ ui_filenames.add("photo.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry export = { "Export", Gtk.Stock.SAVE_AS, TRANSLATABLE, "<Ctrl><Shift>E",
+ TRANSLATABLE, on_export };
+ export.label = Resources.EXPORT_MENU;
+ actions += export;
+
+ Gtk.ActionEntry print = { "Print", Gtk.Stock.PRINT, TRANSLATABLE, "<Ctrl>P",
+ TRANSLATABLE, on_print };
+ print.label = Resources.PRINT_MENU;
+ actions += print;
+
+ Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
+ TRANSLATABLE, on_publish };
+ publish.label = Resources.PUBLISH_MENU;
+ publish.tooltip = Resources.PUBLISH_TOOLTIP;
+ actions += publish;
+
+ Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Gtk.Stock.REMOVE, TRANSLATABLE,
+ "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
+ remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
+ actions += remove_from_library;
+
+ Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
+ TRANSLATABLE, on_move_to_trash };
+ move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
+ actions += move_to_trash;
+
+ Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, on_view_menu };
+ view.label = _("_View");
+ actions += view;
+
+ Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
+ tools.label = _("T_ools");
+ actions += tools;
+
+ Gtk.ActionEntry prev = { "PrevPhoto", Gtk.Stock.GO_BACK, TRANSLATABLE, null,
+ TRANSLATABLE, on_previous_photo };
+ prev.label = _("_Previous Photo");
+ prev.tooltip = _("Previous Photo");
+ actions += prev;
+
+ Gtk.ActionEntry next = { "NextPhoto", Gtk.Stock.GO_FORWARD, TRANSLATABLE, null,
+ TRANSLATABLE, on_next_photo };
+ next.label = _("_Next Photo");
+ next.tooltip = _("Next Photo");
+ actions += next;
+
+ Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE, TRANSLATABLE,
+ "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
+ rotate_right.label = Resources.ROTATE_CW_MENU;
+ rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
+ actions += rotate_right;
+
+ Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
+ TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
+ rotate_left.label = Resources.ROTATE_CCW_MENU;
+ rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
+ actions += rotate_left;
+
+ Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_horizontally };
+ hflip.label = Resources.HFLIP_MENU;
+ actions += hflip;
+
+ Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_vertically };
+ vflip.label = Resources.VFLIP_MENU;
+ actions += vflip;
+
+ Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
+ TRANSLATABLE, on_enhance };
+ enhance.label = Resources.ENHANCE_MENU;
+ enhance.tooltip = Resources.ENHANCE_TOOLTIP;
+ actions += enhance;
+
+ Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
+ "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
+ copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
+ copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
+ actions += copy_adjustments;
+
+ Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
+ "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
+ paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
+ paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
+ actions += paste_adjustments;
+
+ Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
+ TRANSLATABLE, toggle_crop };
+ crop.label = Resources.CROP_MENU;
+ crop.tooltip = Resources.CROP_TOOLTIP;
+ actions += crop;
+
+ Gtk.ActionEntry straighten = { "Straighten", Gtk.Stock.REFRESH, TRANSLATABLE, "<Ctrl>A",
+ TRANSLATABLE, toggle_straighten };
+ straighten.label = Resources.STRAIGHTEN_MENU;
+ straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
+ actions += straighten;
+
+ Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
+ TRANSLATABLE, toggle_redeye };
+ red_eye.label = Resources.RED_EYE_MENU;
+ red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
+ actions += red_eye;
+
+ Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
+ TRANSLATABLE, toggle_adjust };
+ adjust.label = Resources.ADJUST_MENU;
+ adjust.tooltip = Resources.ADJUST_TOOLTIP;
+ actions += adjust;
+
+ Gtk.ActionEntry revert = { "Revert", Gtk.Stock.REVERT_TO_SAVED, TRANSLATABLE,
+ null, TRANSLATABLE, on_revert };
+ revert.label = Resources.REVERT_MENU;
+ actions += revert;
+
+ Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
+ on_edit_title };
+ edit_title.label = Resources.EDIT_TITLE_MENU;
+ actions += edit_title;
+
+ Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
+ on_edit_comment };
+ edit_comment.label = Resources.EDIT_COMMENT_MENU;
+ actions += edit_comment;
+
+ Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_adjust_date_time };
+ adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
+ actions += adjust_date_time;
+
+ Gtk.ActionEntry external_edit = { "ExternalEdit", Gtk.Stock.EDIT, TRANSLATABLE,
+ "<Ctrl>Return", TRANSLATABLE, on_external_edit };
+ external_edit.label = Resources.EXTERNAL_EDIT_MENU;
+ actions += external_edit;
+
+ Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return",
+ TRANSLATABLE, on_external_edit_raw };
+ edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
+ actions += edit_raw;
+
+ Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
+ TRANSLATABLE, on_send_to };
+ send_to.label = Resources.SEND_TO_MENU;
+ actions += send_to;
+
+ Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
+ TRANSLATABLE, on_set_background };
+ set_background.label = Resources.SET_BACKGROUND_MENU;
+ set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
+ actions += set_background;
+
+ Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
+ flag.label = Resources.FLAG_MENU;
+ actions += flag;
+
+ Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
+ set_rating.label = Resources.RATING_MENU;
+ actions += set_rating;
+
+ Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE,
+ "greater", TRANSLATABLE, on_increase_rating };
+ increase_rating.label = Resources.INCREASE_RATING_MENU;
+ actions += increase_rating;
+
+ Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE,
+ "less", TRANSLATABLE, on_decrease_rating };
+ decrease_rating.label = Resources.DECREASE_RATING_MENU;
+ actions += decrease_rating;
+
+ Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE,
+ "9", TRANSLATABLE, on_rate_rejected };
+ rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
+ actions += rate_rejected;
+
+ Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE,
+ "0", TRANSLATABLE, on_rate_unrated };
+ rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
+ actions += rate_unrated;
+
+ Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE,
+ "1", TRANSLATABLE, on_rate_one };
+ rate_one.label = Resources.rating_menu(Rating.ONE);
+ actions += rate_one;
+
+ Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE,
+ "2", TRANSLATABLE, on_rate_two };
+ rate_two.label = Resources.rating_menu(Rating.TWO);
+ actions += rate_two;
+
+ Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE,
+ "3", TRANSLATABLE, on_rate_three };
+ rate_three.label = Resources.rating_menu(Rating.THREE);
+ actions += rate_three;
+
+ Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE,
+ "4", TRANSLATABLE, on_rate_four };
+ rate_four.label = Resources.rating_menu(Rating.FOUR);
+ actions += rate_four;
+
+ Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE,
+ "5", TRANSLATABLE, on_rate_five };
+ rate_five.label = Resources.rating_menu(Rating.FIVE);
+ actions += rate_five;
+
+ Gtk.ActionEntry increase_size = { "IncreaseSize", Gtk.Stock.ZOOM_IN, TRANSLATABLE,
+ "<Ctrl>plus", TRANSLATABLE, on_increase_size };
+ increase_size.label = _("Zoom _In");
+ increase_size.tooltip = _("Increase the magnification of the photo");
+ actions += increase_size;
+
+ Gtk.ActionEntry decrease_size = { "DecreaseSize", Gtk.Stock.ZOOM_OUT, TRANSLATABLE,
+ "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
+ decrease_size.label = _("Zoom _Out");
+ decrease_size.tooltip = _("Decrease the magnification of the photo");
+ actions += decrease_size;
+
+ Gtk.ActionEntry best_fit = { "ZoomFit", Gtk.Stock.ZOOM_FIT, TRANSLATABLE,
+ "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
+ best_fit.label = _("Fit to _Page");
+ best_fit.tooltip = _("Zoom the photo to fit on the screen");
+ actions += best_fit;
+
+ Gtk.ActionEntry actual_size = { "Zoom100", Gtk.Stock.ZOOM_100, TRANSLATABLE,
+ "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
+ /// xgettext:no-c-format
+ actual_size.label = _("Zoom _100%");
+ /// xgettext:no-c-format
+ actual_size.tooltip = _("Zoom the photo to 100% magnification");
+ actions += actual_size;
+
+ Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
+ "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
+ /// xgettext:no-c-format
+ max_size.label = _("Zoom _200%");
+ /// xgettext:no-c-format
+ max_size.tooltip = _("Zoom the photo to 200% magnification");
+ actions += max_size;
+
+ Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE,
+ on_add_tags };
+ add_tags.label = Resources.ADD_TAGS_MENU;
+ actions += add_tags;
+
+ Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE,
+ on_modify_tags };
+ modify_tags.label = Resources.MODIFY_TAGS_MENU;
+ actions += modify_tags;
+
+ Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
+ on_slideshow };
+ slideshow.label = _("S_lideshow");
+ slideshow.tooltip = _("Play a slideshow");
+ actions += slideshow;
+
+ Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
+ raw_developer.label = _("_Developer");
+ actions += raw_developer;
+
+ // These are identical to add_tags and send_to, except that they have
+ // different mnemonics and are _only_ for use in the context menu.
+ Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
+ TRANSLATABLE, on_send_to };
+ send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
+ actions += send_to_context_menu;
+
+ Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A", TRANSLATABLE,
+ on_add_tags };
+ add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
+ actions += add_tags_context_menu;
+
+ return actions;
+ }
+
+ protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
+ Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
+
+ Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
+ TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
+ ratings.label = Resources.VIEW_RATINGS_MENU;
+ ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
+ toggle_actions += ratings;
+
+ return toggle_actions;
+ }
+
+ protected override InjectionGroup[] init_collect_injection_groups() {
+ InjectionGroup[] groups = base.init_collect_injection_groups();
+
+ InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
+ print_group.add_menu_item("Print");
+
+ groups += print_group;
+
+ InjectionGroup publish_group = new InjectionGroup("/MenuBar/FileMenu/PublishPlaceholder");
+ publish_group.add_menu_item("Publish");
+
+ groups += publish_group;
+
+ InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
+ bg_group.add_menu_item("SetBackground");
+
+ groups += bg_group;
+
+ return groups;
+ }
+
+ protected override void register_radio_actions(Gtk.ActionGroup action_group) {
+ // RAW developer.
+ //get_config_photos_sort(out sort_order, out sort_by); // TODO: fetch default from config
+
+ Gtk.RadioActionEntry[] developer_actions = new Gtk.RadioActionEntry[0];
+
+ Gtk.RadioActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
+ RawDeveloper.SHOTWELL };
+ string label_shotwell = RawDeveloper.SHOTWELL.get_label();
+ dev_shotwell.label = label_shotwell;
+ developer_actions += dev_shotwell;
+
+ Gtk.RadioActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
+ RawDeveloper.CAMERA };
+ string label_camera = RawDeveloper.CAMERA.get_label();
+ dev_camera.label = label_camera;
+ developer_actions += dev_camera;
+
+ action_group.add_radio_actions(developer_actions, RawDeveloper.SHOTWELL, on_raw_developer_changed);
+
+ base.register_radio_actions(action_group);
+ }
+
+ private void on_display_ratings(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_ratings(display);
+
+ Config.Facade.get_instance().set_display_photo_ratings(display);
+ repaint();
+ }
+
+ private void set_display_ratings(bool display) {
+ Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ bool multiple = get_view().get_count() > 1;
+ bool rotate_possible = has_photo() ? is_rotate_available(get_photo()) : false;
+ bool is_raw = has_photo() && get_photo().get_master_file_format() == PhotoFileFormat.RAW;
+
+ set_action_sensitive("ExternalEdit",
+ has_photo() && Config.Facade.get_instance().get_external_photo_app() != "");
+
+ set_action_sensitive("Revert", has_photo() ?
+ (get_photo().has_transformations() || get_photo().has_editable()) : false);
+
+ if (has_photo() && !get_photo_missing()) {
+ update_rating_menu_item_sensitivity();
+ update_development_menu_item_sensitivity();
+ }
+
+ set_action_sensitive("SetBackground", has_photo());
+
+ set_action_sensitive("CopyColorAdjustments", (has_photo() && get_photo().has_color_adjustments()));
+ set_action_sensitive("PasteColorAdjustments", PixelTransformationBundle.has_copied_color_adjustments());
+
+ set_action_sensitive("PrevPhoto", multiple);
+ set_action_sensitive("NextPhoto", multiple);
+ set_action_sensitive("RotateClockwise", rotate_possible);
+ set_action_sensitive("RotateCounterclockwise", rotate_possible);
+ set_action_sensitive("FlipHorizontally", rotate_possible);
+ set_action_sensitive("FlipVertically", rotate_possible);
+
+ if (has_photo()) {
+ set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), Scaling.for_original()));
+ set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(),
+ Scaling.for_original()));
+ }
+
+ update_flag_action();
+
+ set_action_visible("ExternalEditRAW",
+ is_raw && Config.Facade.get_instance().get_external_raw_app() != "");
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_photos_altered() {
+ set_action_sensitive("Revert", has_photo() ?
+ (get_photo().has_transformations() || get_photo().has_editable()) : false);
+ update_flag_action();
+ }
+
+ private void on_raw_developer_changed(Gtk.Action action, Gtk.Action current) {
+ developer_changed((RawDeveloper) ((Gtk.RadioAction) current).get_current_value());
+ }
+
+ protected virtual void developer_changed(RawDeveloper rd) {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ Photo? photo = get_view().get_selected().get(0).get_source() as Photo;
+ if (photo == null || rd.is_equivalent(photo.get_raw_developer()))
+ return;
+
+ // Check if any photo has edits
+ // Display warning only when edits could be destroyed
+ if (!photo.has_transformations() || Dialogs.confirm_warn_developer_changed(1)) {
+ SetRawDeveloperCommand command = new SetRawDeveloperCommand(get_view().get_selected(),
+ rd);
+ get_command_manager().execute(command);
+
+ update_development_menu_item_sensitivity();
+ }
+ }
+
+ private void update_flag_action() {
+ if (has_photo()) {
+ Gtk.Action? action = get_action("Flag");
+ assert(action != null);
+
+ bool is_flagged = ((LibraryPhoto) get_photo()).is_flagged();
+
+ action.label = is_flagged ? Resources.UNFLAG_MENU : Resources.FLAG_MENU;
+ action.sensitive = true;
+ } else {
+ set_action_sensitive("Flag", false);
+ }
+ }
+
+ // Displays a photo from a specific CollectionPage. When the user exits this view,
+ // they will be sent back to the return_page. The optional view paramters is for using
+ // a ViewCollection other than the one inside return_page; this is necessary if the
+ // view and return_page have different filters.
+ public void display_for_collection(CollectionPage return_page, Photo photo,
+ ViewCollection? view = null) {
+ this.return_page = return_page;
+ return_page.destroy.connect(on_page_destroyed);
+
+ display_copy_of(view != null ? view : return_page.get_view(), photo);
+ }
+
+ public void on_page_destroyed() {
+ // The parent page was removed, so drop the reference to the page and
+ // its view collection.
+ return_page = null;
+ unset_view_collection();
+ }
+
+ public CollectionPage? get_controller_page() {
+ return return_page;
+ }
+
+ public override void switched_to() {
+ // since LibraryPhotoPages often rest in the background, their stored photo can be deleted by
+ // another page. this checks to make sure a display photo has been established before the
+ // switched_to call.
+ assert(get_photo() != null);
+
+ base.switched_to();
+
+ update_zoom_menu_item_sensitivity();
+ update_rating_menu_item_sensitivity();
+
+ set_display_ratings(Config.Facade.get_instance().get_display_photo_ratings());
+ }
+
+ protected override Gdk.Pixbuf? get_bottom_left_trinket(int scale) {
+ if (!has_photo() || !Config.Facade.get_instance().get_display_photo_ratings())
+ return null;
+
+ return Resources.get_rating_trinket(((LibraryPhoto) get_photo()).get_rating(), scale);
+ }
+
+ protected override Gdk.Pixbuf? get_top_right_trinket(int scale) {
+ if (!has_photo() || !((LibraryPhoto) get_photo()).is_flagged())
+ return null;
+
+ return Resources.get_icon(Resources.ICON_FLAGGED_TRINKET);
+ }
+
+ private void on_slideshow() {
+ LibraryPhoto? photo = (LibraryPhoto?) get_photo();
+ if (photo == null)
+ return;
+
+ AppWindow.get_instance().go_fullscreen(new SlideshowPage(LibraryPhoto.global, get_view(),
+ photo));
+ }
+
+ private void update_zoom_menu_item_sensitivity() {
+ set_action_sensitive("IncreaseSize", !get_zoom_state().is_max() && !get_photo_missing());
+ set_action_sensitive("DecreaseSize", !get_zoom_state().is_default() && !get_photo_missing());
+ }
+
+ protected override void on_increase_size() {
+ base.on_increase_size();
+
+ update_zoom_menu_item_sensitivity();
+ }
+
+ protected override void on_decrease_size() {
+ base.on_decrease_size();
+
+ update_zoom_menu_item_sensitivity();
+ }
+
+ protected override bool on_zoom_slider_key_press(Gdk.EventKey event) {
+ if (base.on_zoom_slider_key_press(event))
+ return true;
+
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ return_to_collection();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ protected override void update_ui(bool missing) {
+ bool sensitivity = !missing;
+
+ set_action_sensitive("SendTo", sensitivity);
+ set_action_sensitive("Publish", sensitivity);
+ set_action_sensitive("Print", sensitivity);
+ set_action_sensitive("CommonJumpToFile", sensitivity);
+
+ set_action_sensitive("CommonUndo", sensitivity);
+ set_action_sensitive("CommonRedo", sensitivity);
+
+ set_action_sensitive("IncreaseSize", sensitivity);
+ set_action_sensitive("DecreaseSize", sensitivity);
+ set_action_sensitive("ZoomFit", sensitivity);
+ set_action_sensitive("Zoom100", sensitivity);
+ set_action_sensitive("Zoom200", sensitivity);
+ set_action_sensitive("Slideshow", sensitivity);
+
+ set_action_sensitive("RotateClockwise", sensitivity);
+ set_action_sensitive("RotateCounterclockwise", sensitivity);
+ set_action_sensitive("FlipHorizontally", sensitivity);
+ set_action_sensitive("FlipVertically", sensitivity);
+ set_action_sensitive("Enhance", sensitivity);
+ set_action_sensitive("Crop", sensitivity);
+ set_action_sensitive("RedEye", sensitivity);
+ set_action_sensitive("Adjust", sensitivity);
+ set_action_sensitive("EditTitle", sensitivity);
+ set_action_sensitive("AdjustDateTime", sensitivity);
+ set_action_sensitive("ExternalEdit", sensitivity);
+ set_action_sensitive("ExternalEditRAW", sensitivity);
+ set_action_sensitive("Revert", sensitivity);
+
+ set_action_sensitive("Rate", sensitivity);
+ set_action_sensitive("Flag", sensitivity);
+ set_action_sensitive("AddTags", sensitivity);
+ set_action_sensitive("ModifyTags", sensitivity);
+
+ set_action_sensitive("SetBackground", sensitivity);
+
+ base.update_ui(missing);
+ }
+
+ protected override void notify_photo_backing_missing(Photo photo, bool missing) {
+ if (missing)
+ ((LibraryPhoto) photo).mark_offline();
+ else
+ ((LibraryPhoto) photo).mark_online();
+
+ base.notify_photo_backing_missing(photo, missing);
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ if (base.key_press_event != null && base.key_press_event(event) == true)
+ return true;
+
+ bool handled = true;
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Escape":
+ case "Return":
+ case "KP_Enter":
+ if (!(get_container() is FullscreenWindow))
+ return_to_collection();
+ break;
+
+ case "Delete":
+ // although bound as an accelerator in the menu, accelerators are currently
+ // unavailable in fullscreen mode (a variant of #324), so we do this manually
+ // here
+ activate_action("MoveToTrash");
+ break;
+
+ case "period":
+ case "greater":
+ activate_action("IncreaseRating");
+ break;
+
+ case "comma":
+ case "less":
+ activate_action("DecreaseRating");
+ break;
+
+ case "KP_1":
+ activate_action("RateOne");
+ break;
+
+ case "KP_2":
+ activate_action("RateTwo");
+ break;
+
+ case "KP_3":
+ activate_action("RateThree");
+ break;
+
+ case "KP_4":
+ activate_action("RateFour");
+ break;
+
+ case "KP_5":
+ activate_action("RateFive");
+ break;
+
+ case "KP_0":
+ activate_action("RateUnrated");
+ break;
+
+ case "KP_9":
+ activate_action("RateRejected");
+ break;
+
+ case "bracketright":
+ activate_action("RotateClockwise");
+ break;
+
+ case "bracketleft":
+ activate_action("RotateCounterclockwise");
+ break;
+
+ case "slash":
+ activate_action("Flag");
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ return handled;
+ }
+
+ protected override bool on_double_click(Gdk.EventButton event) {
+ if (!(get_container() is FullscreenWindow)) {
+ return_to_collection_on_release = true;
+
+ return true;
+ }
+
+ AppWindow.get_instance().end_fullscreen();
+
+ return base.on_double_click(event);
+ }
+
+ protected override bool on_left_released(Gdk.EventButton event) {
+ if (return_to_collection_on_release) {
+ return_to_collection_on_release = false;
+ return_to_collection();
+
+ return true;
+ }
+
+ return base.on_left_released(event);
+ }
+
+ private Gtk.Menu get_context_menu() {
+ Gtk.Menu menu = (Gtk.Menu) ui.get_widget("/PhotoContextMenu");
+ assert(menu != null);
+ return menu;
+ }
+
+ protected override bool on_context_buttonpress(Gdk.EventButton event) {
+ popup_context_menu(get_context_menu(), event);
+
+ return true;
+ }
+
+ protected override bool on_context_keypress() {
+ popup_context_menu(get_context_menu());
+
+ return true;
+ }
+
+ private void return_to_collection() {
+ // Return to the previous page if it exists.
+ if (null != return_page)
+ LibraryWindow.get_app().switch_to_page(return_page);
+ else
+ LibraryWindow.get_app().switch_to_library_page();
+ }
+
+ private void on_remove_from_library() {
+ LibraryPhoto photo = (LibraryPhoto) get_photo();
+
+ Gee.Collection<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ photos.add(photo);
+
+ remove_from_app(photos, _("Remove From Library"), _("Removing Photo From Library"));
+ }
+
+ private void on_move_to_trash() {
+ if (!has_photo())
+ return;
+
+ // Temporarily prevent the application from switching pages if we're viewing
+ // the current photo from within an Event page. This is needed because the act of
+ // trashing images from an Event causes it to be renamed, which causes it to change
+ // positions in the sidebar, and the selection moves with it, causing the app to
+ // inappropriately switch to the Event page.
+ if (return_page is EventPage) {
+ LibraryWindow.get_app().set_page_switching_enabled(false);
+ }
+
+ LibraryPhoto photo = (LibraryPhoto) get_photo();
+
+ Gee.Collection<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ photos.add(photo);
+
+ // move on to next photo before executing
+ on_next_photo();
+
+ // this indicates there is only one photo in the controller, or about to be zero, so switch
+ // to the library page, which is guaranteed to be there when this disappears
+ if (photo.equals(get_photo())) {
+ // If this is the last photo in an Event, then trashing it
+ // _should_ cause us to switch pages, so re-enable it here.
+ LibraryWindow.get_app().set_page_switching_enabled(true);
+
+ if (get_container() is FullscreenWindow)
+ ((FullscreenWindow) get_container()).close();
+
+ LibraryWindow.get_app().switch_to_library_page();
+ }
+
+ get_command_manager().execute(new TrashUntrashPhotosCommand(photos, true));
+ LibraryWindow.get_app().set_page_switching_enabled(true);
+ }
+
+ private void on_flag_unflag() {
+ if (has_photo()) {
+ Gee.ArrayList<DataSource> photo_list = new Gee.ArrayList<DataSource>();
+ photo_list.add(get_photo());
+ get_command_manager().execute(new FlagUnflagCommand(photo_list,
+ !((LibraryPhoto) get_photo()).is_flagged()));
+ }
+ }
+
+ private void on_photo_destroyed(DataSource source) {
+ on_photo_removed((LibraryPhoto) source);
+ }
+
+ private void on_photo_removed(LibraryPhoto photo) {
+ // only interested in current photo
+ if (photo == null || !photo.equals(get_photo()))
+ return;
+
+ // move on to the next one in the collection
+ on_next_photo();
+ if (photo.equals(get_photo())) {
+ // this indicates there is only one photo in the controller, or now zero, so switch
+ // to the Photos page, which is guaranteed to be there
+ LibraryWindow.get_app().switch_to_library_page();
+ }
+ }
+
+ private void on_print() {
+ if (get_view().get_selected_count() > 0) {
+ PrintManager.get_instance().spool_photo(
+ (Gee.Collection<Photo>) get_view().get_selected_sources_of_type(typeof(Photo)));
+ }
+ }
+
+ private void on_external_app_changed() {
+ set_action_sensitive("ExternalEdit", has_photo() &&
+ Config.Facade.get_instance().get_external_photo_app() != "");
+ }
+
+ private void on_external_edit() {
+ if (!has_photo())
+ return;
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ get_photo().open_with_external_editor();
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ open_external_editor_error_dialog(err, get_photo());
+ }
+
+ }
+
+ private void on_external_edit_raw() {
+ if (!has_photo())
+ return;
+
+ if (get_photo().get_master_file_format() != PhotoFileFormat.RAW)
+ return;
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ get_photo().open_with_raw_external_editor();
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ AppWindow.error_message(Resources.launch_editor_failed(err));
+ }
+ }
+
+ private void on_send_to() {
+ if (has_photo())
+ DesktopIntegration.send_to((Gee.Collection<Photo>) get_view().get_selected_sources());
+ }
+
+ private void on_export() {
+ if (!has_photo())
+ return;
+
+ ExportDialog export_dialog = new ExportDialog(_("Export Photo"));
+
+ int scale;
+ ScaleConstraint constraint;
+ ExportFormatParameters export_params = ExportFormatParameters.last();
+ if (!export_dialog.execute(out scale, out constraint, ref export_params))
+ return;
+
+ File save_as =
+ ExportUI.choose_file(get_photo().get_export_basename_for_parameters(export_params));
+ if (save_as == null)
+ return;
+
+ Scaling scaling = Scaling.for_constraint(constraint, scale, false);
+
+ try {
+ get_photo().export(save_as, scaling, export_params.quality,
+ get_photo().get_export_format_for_parameters(export_params),
+ export_params.mode == ExportFormatMode.UNMODIFIED, export_params.export_metadata);
+ } catch (Error err) {
+ AppWindow.error_message(_("Unable to export %s: %s").printf(save_as.get_path(), err.message));
+ }
+ }
+
+ private void on_publish() {
+ if (get_view().get_count() > 0)
+ PublishingUI.PublishingDialog.go(
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources());
+ }
+
+ private void on_view_menu() {
+ update_zoom_menu_item_sensitivity();
+ }
+
+ private void on_increase_rating() {
+ if (!has_photo() || get_photo_missing())
+ return;
+
+ SetRatingSingleCommand command = new SetRatingSingleCommand.inc_dec(get_photo(), true);
+ get_command_manager().execute(command);
+
+ update_rating_menu_item_sensitivity();
+ }
+
+ private void on_decrease_rating() {
+ if (!has_photo() || get_photo_missing())
+ return;
+
+ SetRatingSingleCommand command = new SetRatingSingleCommand.inc_dec(get_photo(), false);
+ get_command_manager().execute(command);
+
+ update_rating_menu_item_sensitivity();
+ }
+
+ private void on_set_rating(Rating rating) {
+ if (!has_photo() || get_photo_missing())
+ return;
+
+ SetRatingSingleCommand command = new SetRatingSingleCommand(get_photo(), rating);
+ get_command_manager().execute(command);
+
+ update_rating_menu_item_sensitivity();
+ }
+
+ private void on_rate_rejected() {
+ on_set_rating(Rating.REJECTED);
+ }
+
+ private void on_rate_unrated() {
+ on_set_rating(Rating.UNRATED);
+ }
+
+ private void on_rate_one() {
+ on_set_rating(Rating.ONE);
+ }
+
+ private void on_rate_two() {
+ on_set_rating(Rating.TWO);
+ }
+
+ private void on_rate_three() {
+ on_set_rating(Rating.THREE);
+ }
+
+ private void on_rate_four() {
+ on_set_rating(Rating.FOUR);
+ }
+
+ private void on_rate_five() {
+ on_set_rating(Rating.FIVE);
+ }
+
+ private void update_rating_menu_item_sensitivity() {
+ set_action_sensitive("RateRejected", get_photo().get_rating() != Rating.REJECTED);
+ set_action_sensitive("RateUnrated", get_photo().get_rating() != Rating.UNRATED);
+ set_action_sensitive("RateOne", get_photo().get_rating() != Rating.ONE);
+ set_action_sensitive("RateTwo", get_photo().get_rating() != Rating.TWO);
+ set_action_sensitive("RateThree", get_photo().get_rating() != Rating.THREE);
+ set_action_sensitive("RateFour", get_photo().get_rating() != Rating.FOUR);
+ set_action_sensitive("RateFive", get_photo().get_rating() != Rating.FIVE);
+ set_action_sensitive("IncreaseRating", get_photo().get_rating().can_increase());
+ set_action_sensitive("DecreaseRating", get_photo().get_rating().can_decrease());
+ }
+
+ private void update_development_menu_item_sensitivity() {
+ PhotoFileFormat format = get_photo().get_master_file_format() ;
+ set_action_sensitive("RawDeveloper", format == PhotoFileFormat.RAW);
+
+ if (format == PhotoFileFormat.RAW) {
+ // Set which developers are available.
+ set_action_sensitive("RawDeveloperShotwell",
+ get_photo().is_raw_developer_available(RawDeveloper.SHOTWELL));
+ set_action_sensitive("RawDeveloperCamera",
+ get_photo().is_raw_developer_available(RawDeveloper.EMBEDDED) ||
+ get_photo().is_raw_developer_available(RawDeveloper.CAMERA));;
+
+ // Set active developer in menu.
+ switch (get_photo().get_raw_developer()) {
+ case RawDeveloper.SHOTWELL:
+ activate_action("RawDeveloperShotwell");
+ break;
+
+ case RawDeveloper.CAMERA:
+ case RawDeveloper.EMBEDDED:
+ activate_action("RawDeveloperCamera");
+ break;
+
+ default:
+ assert_not_reached();
+ }
+ }
+ }
+
+ private void on_metadata_altered(Gee.Map<DataObject, Alteration> map) {
+ if (map.has_key(get_photo()) && map.get(get_photo()).has_subject("metadata"))
+ repaint();
+ }
+
+ private void on_add_tags() {
+ AddTagsDialog dialog = new AddTagsDialog();
+ string[]? names = dialog.execute();
+ if (names != null) {
+ get_command_manager().execute(new AddTagsCommand(
+ HierarchicalTagIndex.get_global_index().get_paths_for_names_array(names),
+ (Gee.Collection<LibraryPhoto>) get_view().get_selected_sources()));
+ }
+ }
+
+ private void on_modify_tags() {
+ LibraryPhoto photo = (LibraryPhoto) get_view().get_selected_at(0).get_source();
+
+ ModifyTagsDialog dialog = new ModifyTagsDialog(photo);
+ Gee.ArrayList<Tag>? new_tags = dialog.execute();
+
+ if (new_tags == null)
+ return;
+
+ get_command_manager().execute(new ModifyTagsCommand(photo, new_tags));
+ }
+
+}
+
diff --git a/src/PixbufCache.vala b/src/PixbufCache.vala
new file mode 100644
index 0000000..8b8f276
--- /dev/null
+++ b/src/PixbufCache.vala
@@ -0,0 +1,360 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class PixbufCache : Object {
+ public delegate bool CacheFilter(Photo photo);
+
+ public enum PhotoType {
+ BASELINE,
+ MASTER
+ }
+
+ public class PixbufCacheBatch : Gee.TreeMultiMap<BackgroundJob.JobPriority, Photo> {
+ public PixbufCacheBatch() {
+ base (BackgroundJob.JobPriority.compare_func);
+ }
+ }
+
+ private abstract class FetchJob : BackgroundJob {
+ public BackgroundJob.JobPriority priority;
+ public Photo photo;
+ public Scaling scaling;
+ public Gdk.Pixbuf pixbuf = null;
+ public Error err = null;
+
+ public FetchJob(PixbufCache owner, BackgroundJob.JobPriority priority, Photo photo,
+ Scaling scaling, CompletionCallback callback) {
+ base(owner, callback, new Cancellable(), null, new Semaphore());
+
+ this.priority = priority;
+ this.photo = photo;
+ this.scaling = scaling;
+ }
+
+ public override BackgroundJob.JobPriority get_priority() {
+ return priority;
+ }
+ }
+
+ private class BaselineFetchJob : FetchJob {
+ public BaselineFetchJob(PixbufCache owner, BackgroundJob.JobPriority priority, Photo photo,
+ Scaling scaling, CompletionCallback callback) {
+ base(owner, priority, photo, scaling, callback);
+ }
+
+ public override void execute() {
+ try {
+ pixbuf = photo.get_pixbuf(scaling);
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private class MasterFetchJob : FetchJob {
+ public MasterFetchJob(PixbufCache owner, BackgroundJob.JobPriority priority, Photo photo,
+ Scaling scaling, CompletionCallback callback) {
+ base(owner, priority, photo, scaling, callback);
+ }
+
+ public override void execute() {
+ try {
+ pixbuf = photo.get_master_pixbuf(scaling);
+ } catch (Error err) {
+ this.err = err;
+ }
+ }
+ }
+
+ private static Workers background_workers = null;
+
+ private SourceCollection sources;
+ private PhotoType type;
+ private int max_count;
+ private Scaling scaling;
+ private unowned CacheFilter? filter;
+ private Gee.HashMap<Photo, Gdk.Pixbuf> cache = new Gee.HashMap<Photo, Gdk.Pixbuf>();
+ private Gee.ArrayList<Photo> lru = new Gee.ArrayList<Photo>();
+ private Gee.HashMap<Photo, FetchJob> in_progress = new Gee.HashMap<Photo, FetchJob>();
+
+ public signal void fetched(Photo photo, Gdk.Pixbuf? pixbuf, Error? err);
+
+ public PixbufCache(SourceCollection sources, PhotoType type, Scaling scaling, int max_count,
+ CacheFilter? filter = null) {
+ this.sources = sources;
+ this.type = type;
+ this.scaling = scaling;
+ this.max_count = max_count;
+ this.filter = filter;
+
+ assert(max_count > 0);
+
+ if (background_workers == null)
+ background_workers = new Workers(Workers.thread_per_cpu_minus_one(), false);
+
+ // monitor changes in the photos to discard from cache ... only interested in changes if
+ // not master files
+ if (type != PhotoType.MASTER)
+ sources.items_altered.connect(on_sources_altered);
+ sources.items_removed.connect(on_sources_removed);
+ }
+
+ ~PixbufCache() {
+#if TRACE_PIXBUF_CACHE
+ debug("Freeing %d pixbufs and cancelling %d jobs", cache.size, in_progress.size);
+#endif
+
+ if (type != PhotoType.MASTER)
+ sources.items_altered.disconnect(on_sources_altered);
+ sources.items_removed.disconnect(on_sources_removed);
+
+ foreach (FetchJob job in in_progress.values)
+ job.cancel();
+ }
+
+ public Scaling get_scaling() {
+ return scaling;
+ }
+
+ // This call never blocks. Returns null if the pixbuf is not present.
+ public Gdk.Pixbuf? get_ready_pixbuf(Photo photo) {
+ return get_cached(photo);
+ }
+
+ // This call can potentially block if the pixbuf is not in the cache. Once loaded, it will
+ // be cached. No signal is fired.
+ public Gdk.Pixbuf? fetch(Photo photo) throws Error {
+ if (!photo.get_actual_file().query_exists(null))
+ decache(photo);
+
+ Gdk.Pixbuf pixbuf = get_cached(photo);
+ if (pixbuf != null) {
+#if TRACE_PIXBUF_CACHE
+ debug("Fetched in-memory pixbuf for %s @ %s", photo.to_string(), scaling.to_string());
+#endif
+
+ return pixbuf;
+ }
+
+ FetchJob? job = in_progress.get(photo);
+ if (job != null) {
+ job.wait_for_completion();
+ if (job.err != null)
+ throw job.err;
+
+ return job.pixbuf;
+ }
+
+#if TRACE_PIXBUF_CACHE
+ debug("Forced to make a blocking fetch of %s @ %s", photo.to_string(), scaling.to_string());
+#endif
+
+ pixbuf = photo.get_pixbuf(scaling);
+
+ encache(photo, pixbuf);
+
+ return pixbuf;
+ }
+
+ // This can be used to clear specific pixbufs from the cache, allowing finer control over what
+ // pixbufs remain and avoid being dropped when other fetches follow. It implicitly cancels
+ // any outstanding prefetches for the photo.
+ public void drop(Photo photo) {
+ cancel_prefetch(photo);
+ decache(photo);
+ }
+
+ // This call signals the cache to pre-load the pixbuf for the photo. When loaded the fetched
+ // signal is fired.
+ public void prefetch(Photo photo,
+ BackgroundJob.JobPriority priority = BackgroundJob.JobPriority.NORMAL, bool force = false) {
+ if (!photo.get_actual_file().query_exists(null))
+ decache(photo);
+
+ if (!force && cache.has_key(photo)) {
+ prioritize(photo);
+
+ return;
+ }
+
+ if (in_progress.has_key(photo))
+ return;
+
+ if (filter != null && !filter(photo))
+ return;
+
+ FetchJob job = null;
+ switch (type) {
+ case PhotoType.BASELINE:
+ job = new BaselineFetchJob(this, priority, photo, scaling, on_fetched);
+ break;
+
+ case PhotoType.MASTER:
+ job = new MasterFetchJob(this, priority, photo, scaling, on_fetched);
+ break;
+
+ default:
+ error("Unknown photo type: %d", (int) type);
+ }
+
+ in_progress.set(photo, job);
+
+ background_workers.enqueue(job);
+ }
+
+ // This call signals the cache to pre-load the pixbufs for all supplied photos. Each fires
+ // the fetch signal as they arrive.
+ public void prefetch_many(Gee.Collection<Photo> photos,
+ BackgroundJob.JobPriority priority = BackgroundJob.JobPriority.NORMAL, bool force = false) {
+ foreach (Photo photo in photos)
+ prefetch(photo, priority, force);
+ }
+
+ // Like prefetch_many, but allows for priorities to be set for each photo
+ public void prefetch_batch(PixbufCacheBatch batch, bool force = false) {
+ foreach (BackgroundJob.JobPriority priority in batch.get_keys()) {
+ foreach (Photo photo in batch.get(priority))
+ prefetch(photo, priority, force);
+ }
+ }
+
+ public bool cancel_prefetch(Photo photo) {
+ FetchJob job = in_progress.get(photo);
+ if (job == null)
+ return false;
+
+ // remove here because if fully cancelled the callback is never called
+ bool removed = in_progress.unset(photo);
+ assert(removed);
+
+ job.cancel();
+
+#if TRACE_PIXBUF_CACHE
+ debug("Cancelled prefetch of %s @ %s", photo.to_string(), scaling.to_string());
+#endif
+
+ return true;
+ }
+
+ public void cancel_all() {
+#if TRACE_PIXBUF_CACHE
+ debug("Cancelling prefetch of %d photos at %s", in_progress.values.size, scaling.to_string());
+#endif
+ foreach (FetchJob job in in_progress.values)
+ job.cancel();
+
+ in_progress.clear();
+ }
+
+ private void on_fetched(BackgroundJob j) {
+ FetchJob job = (FetchJob) j;
+
+ // remove Cancellable from in_progress list, but don't assert on it because it's possible
+ // the cancel was called after the task completed
+ in_progress.unset(job.photo);
+
+ if (job.err != null) {
+ assert(job.pixbuf == null);
+
+ critical("Unable to readahead %s: %s", job.photo.to_string(), job.err.message);
+ fetched(job.photo, null, job.err);
+
+ return;
+ }
+
+ encache(job.photo, job.pixbuf);
+
+ // fire signal
+ fetched(job.photo, job.pixbuf, null);
+ }
+
+ private void on_sources_altered(Gee.Map<DataObject, Alteration> map) {
+ foreach (DataObject object in map.keys) {
+ if (!map.get(object).has_subject("image"))
+ continue;
+
+ Photo photo = (Photo) object;
+
+ if (in_progress.has_key(photo)) {
+ // Load is in progress, must cancel.
+ in_progress.get(photo).cancel();
+ in_progress.unset(photo);
+ continue;
+ }
+
+ // only interested if in this cache
+ if (!cache.has_key(photo))
+ continue;
+
+ decache(photo);
+
+#if TRACE_PIXBUF_CACHE
+ debug("Re-fetching altered pixbuf from cache: %s @ %s", photo.to_string(),
+ scaling.to_string());
+#endif
+
+ prefetch(photo, BackgroundJob.JobPriority.HIGH);
+ }
+ }
+
+ private void on_sources_removed(Gee.Iterable<DataObject> removed) {
+ foreach (DataObject object in removed) {
+ Photo photo = object as Photo;
+ assert(photo != null);
+
+ decache(photo);
+ }
+ }
+
+ private Gdk.Pixbuf? get_cached(Photo photo) {
+ Gdk.Pixbuf pixbuf = cache.get(photo);
+ if (pixbuf != null)
+ prioritize(photo);
+
+ return pixbuf;
+ }
+
+ // Moves the photo up in the cache LRU. Assumes photo is actually in cache.
+ private void prioritize(Photo photo) {
+ int index = lru.index_of(photo);
+ assert(index >= 0);
+
+ if (index > 0) {
+ lru.remove_at(index);
+ lru.insert(0, photo);
+ }
+ }
+
+ private void encache(Photo photo, Gdk.Pixbuf pixbuf) {
+ // if already in cache, remove (means it was re-fetched, probably due to modification)
+ decache(photo);
+
+ cache.set(photo, pixbuf);
+ lru.insert(0, photo);
+
+ while (lru.size > max_count) {
+ Photo cached_photo = lru.remove_at(lru.size - 1);
+ assert(cached_photo != null);
+
+ bool removed = cache.unset(cached_photo);
+ assert(removed);
+ }
+
+ assert(lru.size == cache.size);
+ }
+
+ private void decache(Photo photo) {
+ if (!cache.unset(photo)) {
+ assert(!lru.contains(photo));
+
+ return;
+ }
+
+ bool removed = lru.remove(photo);
+ assert(removed);
+ }
+}
+
diff --git a/src/Printing.vala b/src/Printing.vala
new file mode 100644
index 0000000..8e37997
--- /dev/null
+++ b/src/Printing.vala
@@ -0,0 +1,1156 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public enum ContentLayout {
+ STANDARD_SIZE,
+ CUSTOM_SIZE,
+ IMAGE_PER_PAGE
+}
+
+public class PrintSettings {
+ public const int MIN_CONTENT_PPI = 72; /* 72 ppi is the pixel resolution of a 14" VGA
+ display -- it's standard for historical reasons */
+ public const int MAX_CONTENT_PPI = 1200; /* 1200 ppi is appropriate for a 3600 dpi imagesetter
+ used to produce photographic plates for commercial
+ printing -- it's the highest pixel resolution
+ commonly used */
+ private ContentLayout content_layout;
+ private Measurement content_width;
+ private Measurement content_height;
+ private int content_ppi;
+ private int image_per_page_selection;
+ private int size_selection;
+ private bool match_aspect_ratio;
+ private bool print_titles;
+ private string print_titles_font;
+
+ public PrintSettings() {
+ Config.Facade config = Config.Facade.get_instance();
+
+ MeasurementUnit units = (MeasurementUnit) config.get_printing_content_units();
+
+ content_width = Measurement(config.get_printing_content_width(), units);
+ content_height = Measurement(config.get_printing_content_height(), units);
+ size_selection = config.get_printing_size_selection();
+ content_layout = (ContentLayout) config.get_printing_content_layout();
+ match_aspect_ratio = config.get_printing_match_aspect_ratio();
+ print_titles = config.get_printing_print_titles();
+ print_titles_font = config.get_printing_titles_font();
+ image_per_page_selection = config.get_printing_images_per_page();
+ content_ppi = config.get_printing_content_ppi();
+ }
+
+ public void save() {
+ Config.Facade config = Config.Facade.get_instance();
+
+ config.set_printing_content_units(content_width.unit);
+ config.set_printing_content_width(content_width.value);
+ config.set_printing_content_height(content_height.value);
+ config.set_printing_size_selection(size_selection);
+ config.set_printing_content_layout(content_layout);
+ config.set_printing_match_aspect_ratio(match_aspect_ratio);
+ config.set_printing_print_titles(print_titles);
+ config.set_printing_titles_font(print_titles_font);
+ config.set_printing_images_per_page(image_per_page_selection);
+ config.set_printing_content_ppi(content_ppi);
+ }
+
+
+ public Measurement get_content_width() {
+ switch (get_content_layout()) {
+ case ContentLayout.STANDARD_SIZE:
+ case ContentLayout.IMAGE_PER_PAGE:
+ return (PrintManager.get_instance().get_standard_sizes()[
+ get_size_selection()]).width;
+
+ case ContentLayout.CUSTOM_SIZE:
+ return content_width;
+
+ default:
+ error("unknown ContentLayout enumeration value");
+ }
+ }
+
+ public Measurement get_content_height() {
+ switch (get_content_layout()) {
+ case ContentLayout.STANDARD_SIZE:
+ case ContentLayout.IMAGE_PER_PAGE:
+ return (PrintManager.get_instance().get_standard_sizes()[
+ get_size_selection()]).height;
+
+ case ContentLayout.CUSTOM_SIZE:
+ return content_height;
+
+ default:
+ error("unknown ContentLayout enumeration value");
+ }
+ }
+
+ public Measurement get_minimum_content_dimension() {
+ return Measurement(0.5, MeasurementUnit.INCHES);
+ }
+
+ public Measurement get_maximum_content_dimension() {
+ return Measurement(30, MeasurementUnit.INCHES);
+ }
+
+ public bool is_match_aspect_ratio_enabled() {
+ return match_aspect_ratio;
+ }
+
+ public bool is_print_titles_enabled() {
+ return print_titles;
+ }
+
+ public int get_content_ppi() {
+ return content_ppi;
+ }
+
+ public int get_image_per_page_selection() {
+ return image_per_page_selection;
+ }
+
+ public int get_size_selection() {
+ return size_selection;
+ }
+
+ public ContentLayout get_content_layout() {
+ return content_layout;
+ }
+
+ public void set_content_layout(ContentLayout content_layout) {
+ this.content_layout = content_layout;
+ }
+
+ public void set_content_width(Measurement content_width) {
+ this.content_width = content_width;
+ }
+
+ public void set_content_height(Measurement content_height) {
+ this.content_height = content_height;
+ }
+
+ public void set_content_ppi(int content_ppi) {
+ this.content_ppi = content_ppi;
+ }
+
+ public void set_image_per_page_selection(int image_per_page_selection) {
+ this.image_per_page_selection = image_per_page_selection;
+ }
+
+ public void set_size_selection(int size_selection) {
+ this.size_selection = size_selection;
+ }
+
+ public void set_match_aspect_ratio_enabled(bool enable_state) {
+ this.match_aspect_ratio = enable_state;
+ }
+
+ public void set_print_titles_enabled(bool print_titles) {
+ this.print_titles = print_titles;
+ }
+
+ public void set_print_titles_font(string fontname) {
+ this.print_titles_font = fontname;
+ }
+
+ public string get_print_titles_font() {
+ return this.print_titles_font;
+ }
+}
+
+/* we define our own measurement enum instead of using the Gtk.Unit enum
+ provided by Gtk+ 2.0 because Gtk.Unit doesn't define a CENTIMETERS
+ constant (thout it does define an MM for millimeters). This is
+ unfortunate, because in metric countries people like to think about
+ paper sizes for printing in CM not MM. so, to avoid having to
+ multiply and divide everything by 10 (which is error prone) to convert
+ from CM to MM and vice-versa whenever we read or write measurements, we
+ eschew Gtk.Unit and substitute our own */
+public enum MeasurementUnit {
+ INCHES,
+ CENTIMETERS
+}
+
+public struct Measurement {
+ private const double CENTIMETERS_PER_INCH = 2.54;
+ private const double INCHES_PER_CENTIMETER = (1.0 / 2.54);
+
+ public double value;
+ public MeasurementUnit unit;
+
+ public Measurement(double value, MeasurementUnit unit) {
+ this.value = value;
+ this.unit = unit;
+ }
+
+ public Measurement convert_to(MeasurementUnit to_unit) {
+ if (unit == to_unit)
+ return this;
+
+ if (to_unit == MeasurementUnit.INCHES) {
+ return Measurement(value * INCHES_PER_CENTIMETER, MeasurementUnit.INCHES);
+ } else if (to_unit == MeasurementUnit.CENTIMETERS) {
+ return Measurement(value * CENTIMETERS_PER_INCH, MeasurementUnit.CENTIMETERS);
+ } else {
+ error("unrecognized unit");
+ }
+ }
+
+ public bool is_less_than(Measurement rhs) {
+ Measurement converted_rhs = (unit == rhs.unit) ? rhs : rhs.convert_to(unit);
+ return (value < converted_rhs.value);
+ }
+
+ public bool is_greater_than(Measurement rhs) {
+ Measurement converted_rhs = (unit == rhs.unit) ? rhs : rhs.convert_to(unit);
+ return (value > converted_rhs.value);
+ }
+}
+
+private enum PrintLayout {
+ ENTIRE_PAGE,
+ TWO_PER_PAGE,
+ FOUR_PER_PAGE,
+ SIX_PER_PAGE,
+ EIGHT_PER_PAGE,
+ SIXTEEN_PER_PAGE,
+ THIRTY_TWO_PER_PAGE;
+
+ public static PrintLayout[] get_all() {
+ return {
+ ENTIRE_PAGE,
+ TWO_PER_PAGE,
+ FOUR_PER_PAGE,
+ SIX_PER_PAGE,
+ EIGHT_PER_PAGE,
+ SIXTEEN_PER_PAGE,
+ THIRTY_TWO_PER_PAGE
+ };
+ }
+
+ public int get_per_page() {
+ int[] per_page = { 1, 2, 4, 6, 8, 16, 32 };
+
+ return per_page[this];
+ }
+
+ public int get_x() {
+ int[] x = { 1, 1, 2, 2, 2, 4, 4 };
+
+ return x[this];
+ }
+
+ public int get_y() {
+ int[] y = { 1, 2, 2, 3, 4, 4, 8 };
+
+ return y[this];
+ }
+
+ public string to_string() {
+ string[] labels = {
+ _("Fill the entire page"),
+ _("2 images per page"),
+ _("4 images per page"),
+ _("6 images per page"),
+ _("8 images per page"),
+ _("16 images per page"),
+ _("32 images per page")
+ };
+
+ return labels[this];
+ }
+}
+
+public class CustomPrintTab : Gtk.Fixed {
+ private const int INCHES_COMBO_CHOICE = 0;
+ private const int CENTIMETERS_COMBO_CHOICE = 1;
+
+ private Gtk.Box custom_image_settings_pane = null;
+ private Gtk.RadioButton standard_size_radio = null;
+ private Gtk.RadioButton custom_size_radio = null;
+ private Gtk.RadioButton image_per_page_radio = null;
+ private Gtk.ComboBox image_per_page_combo = null;
+ private Gtk.ComboBox standard_sizes_combo = null;
+ private Gtk.ComboBoxText units_combo = null;
+ private Gtk.Entry custom_width_entry = null;
+ private Gtk.Entry custom_height_entry = null;
+ private Gtk.Entry ppi_entry;
+ private Gtk.CheckButton aspect_ratio_check = null;
+ private Gtk.CheckButton title_print_check = null;
+ private Gtk.FontButton title_print_font = null;
+ private Measurement local_content_width = Measurement(5.0, MeasurementUnit.INCHES);
+ private Measurement local_content_height = Measurement(5.0, MeasurementUnit.INCHES);
+ private int local_content_ppi;
+ private bool is_text_insertion_in_progress = false;
+ private PrintJob source_job;
+
+ public CustomPrintTab(PrintJob source_job) {
+ this.source_job = source_job;
+ Gtk.Builder builder = AppWindow.create_builder();
+
+ // an enclosing box for every widget on this tab...
+ custom_image_settings_pane = builder.get_object("box_ImgSettingsPane") as Gtk.Box;
+
+ standard_size_radio = builder.get_object("radio_UseStandardSize") as Gtk.RadioButton;
+ standard_size_radio.clicked.connect(on_radio_group_click);
+
+ custom_size_radio = builder.get_object("radio_UseCustomSize") as Gtk.RadioButton;
+ custom_size_radio.clicked.connect(on_radio_group_click);
+
+ image_per_page_radio = builder.get_object("radio_Autosize") as Gtk.RadioButton;
+ image_per_page_radio.clicked.connect(on_radio_group_click);
+
+ image_per_page_combo = builder.get_object("combo_Autosize") as Gtk.ComboBox;
+ Gtk.CellRendererText image_per_page_combo_text_renderer =
+ new Gtk.CellRendererText();
+ image_per_page_combo.pack_start(image_per_page_combo_text_renderer, true);
+ image_per_page_combo.add_attribute(image_per_page_combo_text_renderer,
+ "text", 0);
+ Gtk.ListStore image_per_page_combo_store = new Gtk.ListStore(2, typeof(string),
+ typeof(string));
+ foreach (PrintLayout layout in PrintLayout.get_all()) {
+ Gtk.TreeIter iter;
+ image_per_page_combo_store.append(out iter);
+ image_per_page_combo_store.set_value(iter, 0, layout.to_string());
+ }
+ image_per_page_combo.set_model(image_per_page_combo_store);
+
+ StandardPrintSize[] standard_sizes = PrintManager.get_instance().get_standard_sizes();
+ standard_sizes_combo = builder.get_object("combo_StdSizes") as Gtk.ComboBox;
+ Gtk.CellRendererText standard_sizes_combo_text_renderer =
+ new Gtk.CellRendererText();
+ standard_sizes_combo.pack_start(standard_sizes_combo_text_renderer, true);
+ standard_sizes_combo.add_attribute(standard_sizes_combo_text_renderer,
+ "text", 0);
+ standard_sizes_combo.set_row_separator_func(standard_sizes_combo_separator_func);
+ Gtk.ListStore standard_sizes_combo_store = new Gtk.ListStore(1, typeof(string),
+ typeof(string));
+ foreach (StandardPrintSize size in standard_sizes) {
+ Gtk.TreeIter iter;
+ standard_sizes_combo_store.append(out iter);
+ standard_sizes_combo_store.set_value(iter, 0, size.name);
+ }
+ standard_sizes_combo.set_model(standard_sizes_combo_store);
+
+ custom_width_entry = builder.get_object("entry_CustomWidth") as Gtk.Entry;
+ custom_width_entry.insert_text.connect(on_entry_insert_text);
+ custom_width_entry.focus_out_event.connect(on_width_entry_focus_out);
+
+ custom_height_entry = builder.get_object("entry_CustomHeight") as Gtk.Entry;
+ custom_height_entry.insert_text.connect(on_entry_insert_text);
+ custom_height_entry.focus_out_event.connect(on_height_entry_focus_out);
+
+ units_combo = builder.get_object("combo_Units") as Gtk.ComboBoxText;
+ units_combo.append_text(_("in."));
+ units_combo.append_text(_("cm"));
+ units_combo.set_active(0);
+ units_combo.changed.connect(on_units_combo_changed);
+
+ aspect_ratio_check = builder.get_object("check_MatchAspectRatio") as Gtk.CheckButton;
+ title_print_check = builder.get_object("check_PrintImageTitle") as Gtk.CheckButton;
+ title_print_font = builder.get_object("fntbn_TitleFont") as Gtk.FontButton;
+
+ ppi_entry = builder.get_object("entry_PixelsPerInch") as Gtk.Entry;
+ ppi_entry.insert_text.connect(on_ppi_entry_insert_text);
+ ppi_entry.focus_out_event.connect(on_ppi_entry_focus_out);
+
+ this.add(custom_image_settings_pane);
+
+ sync_state_from_job(source_job);
+
+ show_all();
+
+ /* connect this signal after state is sync'd */
+ aspect_ratio_check.clicked.connect(on_aspect_ratio_check_clicked);
+ }
+
+ private void on_aspect_ratio_check_clicked() {
+ if (aspect_ratio_check.get_active()) {
+ local_content_width =
+ Measurement(local_content_height.value * source_job.get_source_aspect_ratio(),
+ local_content_height.unit);
+ custom_width_entry.set_text(format_measurement(local_content_width));
+ }
+ }
+
+ private bool on_width_entry_focus_out(Gdk.EventFocus event) {
+ if (custom_width_entry.get_text() == (format_measurement_as(local_content_width,
+ get_user_unit_choice())))
+ return false;
+
+ Measurement new_width = get_width_entry_value();
+ Measurement min_width = source_job.get_local_settings().get_minimum_content_dimension();
+ Measurement max_width = source_job.get_local_settings().get_maximum_content_dimension();
+
+ if (new_width.is_less_than(min_width) || new_width.is_greater_than(max_width)) {
+ custom_width_entry.set_text(format_measurement(local_content_width));
+ return false;
+ }
+
+ if (is_match_aspect_ratio_enabled()) {
+ Measurement new_height =
+ Measurement(new_width.value / source_job.get_source_aspect_ratio(),
+ new_width.unit);
+ local_content_height = new_height;
+ custom_height_entry.set_text(format_measurement(new_height));
+ }
+
+ local_content_width = new_width;
+ custom_width_entry.set_text(format_measurement(new_width));
+ return false;
+ }
+
+ private string format_measurement(Measurement measurement) {
+ return "%.2f".printf(measurement.value);
+ }
+
+ private string format_measurement_as(Measurement measurement, MeasurementUnit to_unit) {
+ Measurement converted_measurement = (measurement.unit == to_unit) ? measurement :
+ measurement.convert_to(to_unit);
+ return format_measurement(converted_measurement);
+ }
+
+ private bool on_ppi_entry_focus_out(Gdk.EventFocus event) {
+ set_content_ppi(int.parse(ppi_entry.get_text()));
+ return false;
+ }
+
+ private void on_ppi_entry_insert_text(Gtk.Editable editable, string text, int length,
+ ref int position) {
+ Gtk.Entry sender = (Gtk.Entry) editable;
+
+ if (is_text_insertion_in_progress)
+ return;
+
+ is_text_insertion_in_progress = true;
+
+ if (length == -1)
+ length = (int) text.length;
+
+ string new_text = "";
+ for (int ctr = 0; ctr < length; ctr++) {
+ if (text[ctr].isdigit())
+ new_text += ((char) text[ctr]).to_string();
+ }
+
+ if (new_text.length > 0)
+ sender.insert_text(new_text, (int) new_text.length, ref position);
+
+ Signal.stop_emission_by_name(sender, "insert-text");
+
+ is_text_insertion_in_progress = false;
+ }
+
+ private bool on_height_entry_focus_out(Gdk.EventFocus event) {
+ if (custom_height_entry.get_text() == (format_measurement_as(local_content_height,
+ get_user_unit_choice())))
+ return false;
+
+ Measurement new_height = get_height_entry_value();
+ Measurement min_height = source_job.get_local_settings().get_minimum_content_dimension();
+ Measurement max_height = source_job.get_local_settings().get_maximum_content_dimension();
+
+ if (new_height.is_less_than(min_height) || new_height.is_greater_than(max_height)) {
+ custom_height_entry.set_text(format_measurement(local_content_height));
+ return false;
+ }
+
+ if (is_match_aspect_ratio_enabled()) {
+ Measurement new_width =
+ Measurement(new_height.value * source_job.get_source_aspect_ratio(),
+ new_height.unit);
+ local_content_width = new_width;
+ custom_width_entry.set_text(format_measurement(new_width));
+ }
+
+ local_content_height = new_height;
+ custom_height_entry.set_text(format_measurement(new_height));
+ return false;
+ }
+
+ private MeasurementUnit get_user_unit_choice() {
+ if (units_combo.get_active() == INCHES_COMBO_CHOICE) {
+ return MeasurementUnit.INCHES;
+ } else if (units_combo.get_active() == CENTIMETERS_COMBO_CHOICE) {
+ return MeasurementUnit.CENTIMETERS;
+ } else {
+ error("unknown unit combo box choice");
+ }
+ }
+
+ private void set_user_unit_choice(MeasurementUnit unit) {
+ if (unit == MeasurementUnit.INCHES) {
+ units_combo.set_active(INCHES_COMBO_CHOICE);
+ } else if (unit == MeasurementUnit.CENTIMETERS) {
+ units_combo.set_active(CENTIMETERS_COMBO_CHOICE);
+ } else {
+ error("unknown MeasurementUnit enumeration");
+ }
+ }
+
+ private Measurement get_width_entry_value() {
+ return Measurement(double.parse(custom_width_entry.get_text()), get_user_unit_choice());
+ }
+
+ private Measurement get_height_entry_value() {
+ return Measurement(double.parse(custom_height_entry.get_text()), get_user_unit_choice());
+ }
+
+ private void on_entry_insert_text(Gtk.Editable editable, string text, int length,
+ ref int position) {
+
+ Gtk.Entry sender = (Gtk.Entry) editable;
+
+ if (is_text_insertion_in_progress)
+ return;
+
+ is_text_insertion_in_progress = true;
+
+ if (length == -1)
+ length = (int) text.length;
+
+ string decimal_point = Intl.localeconv().decimal_point;
+ bool contains_decimal_point = sender.get_text().contains(decimal_point);
+
+ string new_text = "";
+ for (int ctr = 0; ctr < length; ctr++) {
+ if (text[ctr].isdigit()) {
+ new_text += ((char) text[ctr]).to_string();
+ } else if ((!contains_decimal_point) && (text[ctr] == decimal_point[0])) {
+ new_text += ((char) text[ctr]).to_string();
+ }
+ }
+
+ if (new_text.length > 0)
+ sender.insert_text(new_text, (int) new_text.length, ref position);
+
+ Signal.stop_emission_by_name(sender, "insert-text");
+
+ is_text_insertion_in_progress = false;
+ }
+
+ private void sync_state_from_job(PrintJob job) {
+ assert(job.get_local_settings().get_content_width().unit ==
+ job.get_local_settings().get_content_height().unit);
+
+ Measurement constrained_width = job.get_local_settings().get_content_width();
+ if (job.get_local_settings().is_match_aspect_ratio_enabled())
+ constrained_width = Measurement(job.get_local_settings().get_content_height().value *
+ job.get_source_aspect_ratio(), job.get_local_settings().get_content_height().unit);
+ set_content_width(constrained_width);
+ set_content_height(job.get_local_settings().get_content_height());
+ set_content_layout(job.get_local_settings().get_content_layout());
+ set_content_ppi(job.get_local_settings().get_content_ppi());
+ set_image_per_page_selection(job.get_local_settings().get_image_per_page_selection());
+ set_size_selection(job.get_local_settings().get_size_selection());
+ set_match_aspect_ratio_enabled(job.get_local_settings().is_match_aspect_ratio_enabled());
+ set_print_titles_enabled(job.get_local_settings().is_print_titles_enabled());
+ set_print_titles_font(job.get_local_settings().get_print_titles_font());
+ }
+
+ private void on_radio_group_click(Gtk.Button b) {
+ Gtk.RadioButton sender = (Gtk.RadioButton) b;
+
+ if (sender == standard_size_radio) {
+ set_content_layout_control_state(ContentLayout.STANDARD_SIZE);
+ standard_sizes_combo.grab_focus();
+ } else if (sender == custom_size_radio) {
+ set_content_layout_control_state(ContentLayout.CUSTOM_SIZE);
+ custom_height_entry.grab_focus();
+ } else if (sender == image_per_page_radio) {
+ set_content_layout_control_state(ContentLayout.IMAGE_PER_PAGE);
+ }
+ }
+
+ private void on_units_combo_changed() {
+ custom_height_entry.set_text(format_measurement_as(local_content_height,
+ get_user_unit_choice()));
+ custom_width_entry.set_text(format_measurement_as(local_content_width,
+ get_user_unit_choice()));
+ }
+
+ private void set_content_layout_control_state(ContentLayout layout) {
+ switch (layout) {
+ case ContentLayout.STANDARD_SIZE:
+ standard_sizes_combo.set_sensitive(true);
+ units_combo.set_sensitive(false);
+ custom_width_entry.set_sensitive(false);
+ custom_height_entry.set_sensitive(false);
+ aspect_ratio_check.set_sensitive(false);
+ image_per_page_combo.set_sensitive(false);
+ break;
+
+ case ContentLayout.CUSTOM_SIZE:
+ standard_sizes_combo.set_sensitive(false);
+ units_combo.set_sensitive(true);
+ custom_width_entry.set_sensitive(true);
+ custom_height_entry.set_sensitive(true);
+ aspect_ratio_check.set_sensitive(true);
+ image_per_page_combo.set_sensitive(false);
+ break;
+
+ case ContentLayout.IMAGE_PER_PAGE:
+ standard_sizes_combo.set_sensitive(false);
+ units_combo.set_sensitive(false);
+ custom_width_entry.set_sensitive(false);
+ custom_height_entry.set_sensitive(false);
+ aspect_ratio_check.set_sensitive(false);
+ image_per_page_combo.set_sensitive(true);
+ break;
+
+ default:
+ error("unknown ContentLayout enumeration value");
+ }
+ }
+
+ private static bool standard_sizes_combo_separator_func(Gtk.TreeModel model,
+ Gtk.TreeIter iter) {
+ Value val;
+ model.get_value(iter, 0, out val);
+
+ return (val.dup_string() == "-");
+ }
+
+ private void set_content_layout(ContentLayout content_layout) {
+ set_content_layout_control_state(content_layout);
+ switch (content_layout) {
+ case ContentLayout.STANDARD_SIZE:
+ standard_size_radio.set_active(true);
+ break;
+
+ case ContentLayout.CUSTOM_SIZE:
+ custom_size_radio.set_active(true);
+ break;
+
+ case ContentLayout.IMAGE_PER_PAGE:
+ image_per_page_radio.set_active(true);
+ break;
+
+ default:
+ error("unknown ContentLayout enumeration value");
+ }
+ }
+
+ private ContentLayout get_content_layout() {
+ if (standard_size_radio.get_active())
+ return ContentLayout.STANDARD_SIZE;
+ if (custom_size_radio.get_active())
+ return ContentLayout.CUSTOM_SIZE;
+ if (image_per_page_radio.get_active())
+ return ContentLayout.IMAGE_PER_PAGE;
+
+ error("inconsistent content layout radio button group state");
+ }
+
+ private void set_content_width(Measurement content_width) {
+ if (content_width.unit != local_content_height.unit) {
+ set_user_unit_choice(content_width.unit);
+ local_content_height = local_content_height.convert_to(content_width.unit);
+ custom_height_entry.set_text(format_measurement(local_content_height));
+ }
+ local_content_width = content_width;
+ custom_width_entry.set_text(format_measurement(content_width));
+ }
+
+ private Measurement get_content_width() {
+ return local_content_width;
+ }
+
+ private void set_content_height(Measurement content_height) {
+ if (content_height.unit != local_content_width.unit) {
+ set_user_unit_choice(content_height.unit);
+ local_content_width = local_content_width.convert_to(content_height.unit);
+ custom_width_entry.set_text(format_measurement(local_content_width));
+ }
+ local_content_height = content_height;
+ custom_height_entry.set_text(format_measurement(content_height));
+ }
+
+ private Measurement get_content_height() {
+ return local_content_height;
+ }
+
+ private void set_content_ppi(int content_ppi) {
+ local_content_ppi = content_ppi.clamp(PrintSettings.MIN_CONTENT_PPI,
+ PrintSettings.MAX_CONTENT_PPI);
+
+ ppi_entry.set_text("%d".printf(local_content_ppi));
+ }
+
+ private int get_content_ppi() {
+ return local_content_ppi;
+ }
+
+ private void set_image_per_page_selection(int image_per_page) {
+ image_per_page_combo.set_active(image_per_page);
+ }
+
+ private int get_image_per_page_selection() {
+ return image_per_page_combo.get_active();
+ }
+
+ private void set_size_selection(int size_selection) {
+ standard_sizes_combo.set_active(size_selection);
+ }
+
+ private int get_size_selection() {
+ return standard_sizes_combo.get_active();
+ }
+
+ private void set_match_aspect_ratio_enabled(bool enable_state) {
+ aspect_ratio_check.set_active(enable_state);
+ }
+
+ private void set_print_titles_enabled(bool print_titles) {
+ title_print_check.set_active(print_titles);
+ }
+
+ private void set_print_titles_font(string fontname) {
+ title_print_font.set_font_name(fontname);
+ }
+
+
+ private bool is_match_aspect_ratio_enabled() {
+ return aspect_ratio_check.get_active();
+ }
+
+ private bool is_print_titles_enabled() {
+ return title_print_check.get_active();
+ }
+
+ private string get_print_titles_font() {
+ return title_print_font.get_font_name();
+ }
+
+ public PrintJob get_source_job() {
+ return source_job;
+ }
+
+ public PrintSettings get_local_settings() {
+ PrintSettings result = new PrintSettings();
+
+ result.set_content_width(get_content_width());
+ result.set_content_height(get_content_height());
+ result.set_content_layout(get_content_layout());
+ result.set_content_ppi(get_content_ppi());
+ result.set_image_per_page_selection(get_image_per_page_selection());
+ result.set_size_selection(get_size_selection());
+ result.set_match_aspect_ratio_enabled(is_match_aspect_ratio_enabled());
+ result.set_print_titles_enabled(is_print_titles_enabled());
+ result.set_print_titles_font(get_print_titles_font());
+
+ return result;
+ }
+}
+
+public class PrintJob : Gtk.PrintOperation {
+ private PrintSettings settings;
+ private Gee.ArrayList<Photo> photos = new Gee.ArrayList<Photo>();
+
+ public PrintJob(Gee.Collection<Photo> to_print) {
+ this.settings = PrintManager.get_instance().get_global_settings();
+ photos.add_all(to_print);
+
+ set_embed_page_setup (true);
+ double photo_aspect_ratio = photos[0].get_dimensions().get_aspect_ratio();
+ if (photo_aspect_ratio < 1.0)
+ photo_aspect_ratio = 1.0 / photo_aspect_ratio;
+ }
+
+ public Gee.List<Photo> get_photos() {
+ return photos;
+ }
+
+ public Photo get_source_photo() {
+ return photos[0];
+ }
+
+ public double get_source_aspect_ratio() {
+ double aspect_ratio = photos[0].get_dimensions().get_aspect_ratio();
+ return (aspect_ratio < 1.0) ? (1.0 / aspect_ratio) : aspect_ratio;
+ }
+
+ public PrintSettings get_local_settings() {
+ return settings;
+ }
+
+ public void set_local_settings(PrintSettings settings) {
+ this.settings = settings;
+ }
+}
+
+public class StandardPrintSize {
+ public StandardPrintSize(string name, Measurement width, Measurement height) {
+ this.name = name;
+ this.width = width;
+ this.height = height;
+ }
+
+ public string name;
+ public Measurement width;
+ public Measurement height;
+}
+
+public class PrintManager {
+ private const double IMAGE_DISTANCE = 0.24;
+
+ private static PrintManager instance = null;
+
+ private PrintSettings settings;
+ private Gtk.PageSetup user_page_setup;
+ private CustomPrintTab custom_tab;
+ private ProgressDialog? progress_dialog = null;
+ private Cancellable? cancellable = null;
+
+ private PrintManager() {
+ user_page_setup = new Gtk.PageSetup();
+ settings = new PrintSettings();
+ }
+
+ public StandardPrintSize[] get_standard_sizes() {
+ StandardPrintSize[] result = new StandardPrintSize[0];
+
+ result += new StandardPrintSize(_("Wallet (2 x 3 in.)"),
+ Measurement(3, MeasurementUnit.INCHES),
+ Measurement(2, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("Notecard (3 x 5 in.)"),
+ Measurement(5, MeasurementUnit.INCHES),
+ Measurement(3, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("4 x 6 in."),
+ Measurement(6, MeasurementUnit.INCHES),
+ Measurement(4, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("5 x 7 in."),
+ Measurement(7, MeasurementUnit.INCHES),
+ Measurement(5, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("8 x 10 in."),
+ Measurement(10, MeasurementUnit.INCHES),
+ Measurement(8, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("11 x 14 in."),
+ Measurement(14, MeasurementUnit.INCHES),
+ Measurement(11, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("16 x 20 in."),
+ Measurement(20, MeasurementUnit.INCHES),
+ Measurement(16, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(("-"),
+ Measurement(0, MeasurementUnit.INCHES),
+ Measurement(0, MeasurementUnit.INCHES));
+ result += new StandardPrintSize(_("Metric Wallet (9 x 13 cm)"),
+ Measurement(13, MeasurementUnit.CENTIMETERS),
+ Measurement(9, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("Postcard (10 x 15 cm)"),
+ Measurement(15, MeasurementUnit.CENTIMETERS),
+ Measurement(10, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("13 x 18 cm"),
+ Measurement(18, MeasurementUnit.CENTIMETERS),
+ Measurement(13, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("18 x 24 cm"),
+ Measurement(24, MeasurementUnit.CENTIMETERS),
+ Measurement(18, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("20 x 30 cm"),
+ Measurement(30, MeasurementUnit.CENTIMETERS),
+ Measurement(20, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("24 x 40 cm"),
+ Measurement(40, MeasurementUnit.CENTIMETERS),
+ Measurement(24, MeasurementUnit.CENTIMETERS));
+ result += new StandardPrintSize(_("30 x 40 cm"),
+ Measurement(40, MeasurementUnit.CENTIMETERS),
+ Measurement(30, MeasurementUnit.CENTIMETERS));
+
+ return result;
+ }
+
+ public static PrintManager get_instance() {
+ if (instance == null)
+ instance = new PrintManager();
+
+ return instance;
+ }
+
+ public void spool_photo(Gee.Collection<Photo> to_print) {
+ PrintJob job = new PrintJob(to_print);
+ job.set_custom_tab_label(_("Image Settings"));
+ job.set_unit(Gtk.Unit.INCH);
+ job.set_n_pages(1);
+ job.set_job_name(job.get_source_photo().get_name());
+ job.set_default_page_setup(user_page_setup);
+ job.begin_print.connect(on_begin_print);
+ job.draw_page.connect(on_draw_page);
+ job.create_custom_widget.connect(on_create_custom_widget);
+ job.status_changed.connect(on_status_changed);
+
+ AppWindow.get_instance().set_busy_cursor();
+
+ cancellable = new Cancellable();
+ progress_dialog = new ProgressDialog(AppWindow.get_instance(), _("Printing..."), cancellable);
+
+ string? err_msg = null;
+ try {
+ Gtk.PrintOperationResult result = job.run(Gtk.PrintOperationAction.PRINT_DIALOG,
+ AppWindow.get_instance());
+ if (result == Gtk.PrintOperationResult.APPLY)
+ user_page_setup = job.get_default_page_setup();
+ } catch (Error e) {
+ job.cancel();
+ err_msg = e.message;
+ }
+
+ progress_dialog.close();
+ progress_dialog = null;
+ cancellable = null;
+
+ AppWindow.get_instance().set_normal_cursor();
+
+ if (err_msg != null)
+ AppWindow.error_message(_("Unable to print photo:\n\n%s").printf(err_msg));
+ }
+
+ private void on_begin_print(Gtk.PrintOperation emitting_object, Gtk.PrintContext job_context) {
+ debug("on_begin_print");
+
+ PrintJob job = (PrintJob) emitting_object;
+
+ // cancel() can only be called from "begin-print", "paginate", or "draw-page"
+ if (cancellable != null && cancellable.is_cancelled()) {
+ job.cancel();
+
+ return;
+ }
+
+ Gee.List<Photo> photos = job.get_photos();
+ if (job.get_local_settings().get_content_layout() == ContentLayout.IMAGE_PER_PAGE){
+ PrintLayout layout = (PrintLayout) job.get_local_settings().get_image_per_page_selection();
+ job.set_n_pages((int) Math.ceil((double) photos.size / (double) layout.get_per_page()));
+ } else {
+ job.set_n_pages(photos.size);
+ }
+
+ spin_event_loop();
+ }
+
+ private void on_status_changed(Gtk.PrintOperation job) {
+ debug("on_status_changed: %s", job.get_status_string());
+
+ if (progress_dialog != null) {
+ progress_dialog.set_status(job.get_status_string());
+ spin_event_loop();
+ }
+ }
+
+ private void on_draw_page(Gtk.PrintOperation emitting_object, Gtk.PrintContext job_context,
+ int page_num) {
+ debug("on_draw_page");
+
+ PrintJob job = (PrintJob) emitting_object;
+
+ // cancel() can only be called from "begin-print", "paginate", or "draw-page"
+ if (cancellable != null && cancellable.is_cancelled()) {
+ job.cancel();
+
+ return;
+ }
+
+ spin_event_loop();
+
+ Gtk.PageSetup page_setup = job_context.get_page_setup();
+ double page_width = page_setup.get_page_width(Gtk.Unit.INCH);
+ double page_height = page_setup.get_page_height(Gtk.Unit.INCH);
+
+ double dpi = job.get_local_settings().get_content_ppi();
+ double inv_dpi = 1.0 / dpi;
+ Cairo.Context dc = job_context.get_cairo_context();
+ dc.scale(inv_dpi, inv_dpi);
+ Gee.List<Photo> photos = job.get_photos();
+
+ ContentLayout content_layout = job.get_local_settings().get_content_layout();
+ switch (content_layout) {
+ case ContentLayout.STANDARD_SIZE:
+ case ContentLayout.CUSTOM_SIZE:
+ double canvas_width, canvas_height;
+ if (content_layout == ContentLayout.STANDARD_SIZE) {
+ canvas_width = get_standard_sizes()[job.get_local_settings().get_size_selection()].width.convert_to(
+ MeasurementUnit.INCHES).value;
+ canvas_height = get_standard_sizes()[job.get_local_settings().get_size_selection()].height.convert_to(
+ MeasurementUnit.INCHES).value;
+ } else {
+ assert(content_layout == ContentLayout.CUSTOM_SIZE);
+ canvas_width = job.get_local_settings().get_content_width().convert_to(
+ MeasurementUnit.INCHES).value;
+ canvas_height = job.get_local_settings().get_content_height().convert_to(
+ MeasurementUnit.INCHES).value;
+ }
+
+ if (page_num < photos.size) {
+ Dimensions photo_dimensions = photos[page_num].get_dimensions();
+ double photo_aspect_ratio = photo_dimensions.get_aspect_ratio();
+ double canvas_aspect_ratio = ((double) canvas_width) / canvas_height;
+ if (Math.floor(canvas_aspect_ratio) != Math.floor(photo_aspect_ratio)) {
+ double canvas_tmp = canvas_width;
+ canvas_width = canvas_height;
+ canvas_height = canvas_tmp;
+ }
+
+ double dx = (page_width - canvas_width) / 2.0;
+ double dy = (page_height - canvas_height) / 2.0;
+ fit_image_to_canvas(photos[page_num], dx, dy, canvas_width, canvas_height, true,
+ job, job_context);
+ if (job.get_local_settings().is_print_titles_enabled()) {
+ add_title_to_canvas(page_width / 2, page_height, photos[page_num].get_name(),
+ job, job_context);
+ }
+ }
+
+ if (progress_dialog != null)
+ progress_dialog.monitor(page_num, photos.size);
+ break;
+
+ case ContentLayout.IMAGE_PER_PAGE:
+ PrintLayout layout = (PrintLayout) job.get_local_settings().get_image_per_page_selection();
+ int nx = layout.get_x();
+ int ny = layout.get_y();
+ int start = page_num * layout.get_per_page();
+ double canvas_width = (double) (page_width - IMAGE_DISTANCE * (nx - 1)) / nx;
+ double canvas_height = (double) (page_height - IMAGE_DISTANCE * (ny - 1)) / ny;
+ for (int y = 0; y < ny; y++){
+ for (int x = 0; x < nx; x++){
+ int i = start + y * nx + x;
+ if (i < photos.size) {
+ double dx = x * (canvas_width) + x * IMAGE_DISTANCE;
+ double dy = y * (canvas_height) + y * IMAGE_DISTANCE;
+ fit_image_to_canvas(photos[i], dx, dy, canvas_width, canvas_height, false,
+ job, job_context);
+ if (job.get_local_settings().is_print_titles_enabled()) {
+ add_title_to_canvas(dx + canvas_width / 2, dy + canvas_height,
+ photos[i].get_name(), job, job_context);
+ }
+ }
+
+ if (progress_dialog != null)
+ progress_dialog.monitor(i, photos.size);
+ }
+ }
+ break;
+
+ default:
+ error("unknown or unsupported layout mode");
+ }
+ }
+
+ private unowned Object on_create_custom_widget(Gtk.PrintOperation emitting_object) {
+ custom_tab = new CustomPrintTab((PrintJob) emitting_object);
+ ((PrintJob) emitting_object).custom_widget_apply.connect(on_custom_widget_apply);
+ return custom_tab;
+ }
+
+ private void on_custom_widget_apply(Gtk.Widget custom_widget) {
+ CustomPrintTab tab = (CustomPrintTab) custom_widget;
+ tab.get_source_job().set_local_settings(tab.get_local_settings());
+ set_global_settings(tab.get_local_settings());
+ }
+
+ private void fit_image_to_canvas(Photo photo, double x, double y, double canvas_width, double canvas_height, bool crop, PrintJob job, Gtk.PrintContext job_context) {
+ Cairo.Context dc = job_context.get_cairo_context();
+ Dimensions photo_dimensions = photo.get_dimensions();
+ double photo_aspect_ratio = photo_dimensions.get_aspect_ratio();
+ double canvas_aspect_ratio = ((double) canvas_width) / canvas_height;
+
+ double target_width = 0.0;
+ double target_height = 0.0;
+ double dpi = job.get_local_settings().get_content_ppi();
+
+ if (!crop) {
+ if (canvas_aspect_ratio < photo_aspect_ratio) {
+ target_width = canvas_width;
+ target_height = target_width * (1.0 / photo_aspect_ratio);
+ } else {
+ target_height = canvas_height;
+ target_width = target_height * photo_aspect_ratio;
+ }
+ x += (canvas_width - target_width) / 2.0;
+ y += (canvas_height - target_height) / 2.0;
+ }
+
+ double x_offset = dpi * x;
+ double y_offset = dpi * y;
+ dc.save();
+ dc.translate(x_offset, y_offset);
+
+ int w = (int) (dpi * canvas_width);
+ int h = (int) (dpi * canvas_height);
+ Dimensions viewport = Dimensions(w, h);
+
+ try {
+ if (crop && !are_approximately_equal(canvas_aspect_ratio, photo_aspect_ratio)) {
+ Scaling pixbuf_scaling = Scaling.to_fill_viewport(viewport);
+ Gdk.Pixbuf photo_pixbuf = photo.get_pixbuf(pixbuf_scaling);
+ Dimensions scaled_photo_dimensions = Dimensions.for_pixbuf(photo_pixbuf);
+ int shave_vertical = 0;
+ int shave_horizontal = 0;
+ if (canvas_aspect_ratio < photo_aspect_ratio) {
+ shave_vertical = (int) ((scaled_photo_dimensions.width - (scaled_photo_dimensions.height * canvas_aspect_ratio)) / 2.0);
+ } else {
+ shave_horizontal = (int) ((scaled_photo_dimensions.height - (scaled_photo_dimensions.width * (1.0 / canvas_aspect_ratio))) / 2.0);
+ }
+ Gdk.Pixbuf shaved_pixbuf = new Gdk.Pixbuf.subpixbuf(photo_pixbuf, shave_vertical,shave_horizontal, scaled_photo_dimensions.width - (2 * shave_vertical), scaled_photo_dimensions.height - (2 * shave_horizontal));
+
+ photo_pixbuf = pixbuf_scaling.perform_on_pixbuf(shaved_pixbuf, Gdk.InterpType.HYPER, true);
+ Gdk.cairo_set_source_pixbuf(dc, photo_pixbuf, 0.0, 0.0);
+ } else {
+ Scaling pixbuf_scaling = Scaling.for_viewport(viewport, true);
+ Gdk.Pixbuf photo_pixbuf = photo.get_pixbuf(pixbuf_scaling);
+ photo_pixbuf = pixbuf_scaling.perform_on_pixbuf(photo_pixbuf, Gdk.InterpType.HYPER, true);
+ Gdk.cairo_set_source_pixbuf(dc, photo_pixbuf, 0.0, 0.0);
+ }
+ dc.paint();
+
+ } catch (Error e) {
+ job.cancel();
+ AppWindow.error_message(_("Unable to print photo:\n\n%s").printf(e.message));
+ }
+ dc.restore();
+ }
+
+ private void add_title_to_canvas(double x, double y, string title, PrintJob job, Gtk.PrintContext job_context) {
+ Cairo.Context dc = job_context.get_cairo_context();
+ double dpi = job.get_local_settings().get_content_ppi();
+ var title_font_description = Pango.FontDescription.from_string(job.get_local_settings().get_print_titles_font());
+ var title_layout = Pango.cairo_create_layout(dc);
+ Pango.Context context = title_layout.get_context();
+ Pango.cairo_context_set_resolution (context, dpi);
+ title_layout.set_font_description(title_font_description);
+ title_layout.set_text(title, -1);
+ int title_width, title_height;
+ title_layout.get_pixel_size(out title_width, out title_height);
+ double tx = dpi * x - title_width / 2;
+ double ty = dpi * y - title_height;
+
+ // Transparent title text background
+ dc.rectangle(tx - 10, ty + 2, title_width + 20, title_height);
+ dc.set_source_rgba(1, 1, 1, 1);
+ dc.set_line_width(2);
+ dc.stroke_preserve();
+ dc.set_source_rgba(1, 1, 1, 0.5);
+ dc.fill();
+ dc.set_source_rgba(0, 0, 0, 1);
+
+ dc.move_to(tx, ty + 2);
+ Pango.cairo_show_layout(dc, title_layout);
+ }
+
+ private bool are_approximately_equal(double val1, double val2) {
+ double accept_err = 0.005;
+ return (Math.fabs(val1 - val2) <= accept_err);
+ }
+
+ public PrintSettings get_global_settings() {
+ return settings;
+ }
+
+ public void set_global_settings(PrintSettings settings) {
+ this.settings = settings;
+ settings.save();
+ }
+}
diff --git a/src/Properties.vala b/src/Properties.vala
new file mode 100644
index 0000000..9edb4fb
--- /dev/null
+++ b/src/Properties.vala
@@ -0,0 +1,700 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+private abstract class Properties : Gtk.Grid {
+ uint line_count = 0;
+
+ public Properties() {
+ row_spacing = 0;
+ column_spacing = 6;
+ }
+
+ protected void add_line(string label_text, string info_text, bool multi_line = false) {
+ Gtk.Label label = new Gtk.Label("");
+ Gtk.Widget info;
+
+ label.set_justify(Gtk.Justification.RIGHT);
+
+ label.set_markup(GLib.Markup.printf_escaped("<span font_weight=\"bold\">%s</span>", label_text));
+
+ if (multi_line) {
+ Gtk.ScrolledWindow info_scroll = new Gtk.ScrolledWindow(null, null);
+ info_scroll.shadow_type = Gtk.ShadowType.ETCHED_IN;
+ Gtk.TextView view = new Gtk.TextView();
+ // by default TextView widgets have a white background, which
+ // makes sense during editing. In this instance we only *show*
+ // the content and thus want that the parent's background color
+ // is inherited to the TextView
+ Gtk.StyleContext context = info_scroll.get_style_context();
+ view.override_background_color (Gtk.StateFlags.NORMAL,
+ context.get_background_color(Gtk.StateFlags.NORMAL));
+ view.set_wrap_mode(Gtk.WrapMode.WORD);
+ view.set_cursor_visible(false);
+ view.set_editable(false);
+ view.buffer.text = is_string_empty(info_text) ? "" : info_text;
+ info_scroll.add(view);
+ label.set_alignment(1, 0);
+ info = (Gtk.Widget) info_scroll;
+ } else {
+ Gtk.Label info_label = new Gtk.Label("");
+ info_label.set_markup(is_string_empty(info_text) ? "" : info_text);
+ info_label.set_alignment(0, (float) 5e-1);
+ info_label.set_ellipsize(Pango.EllipsizeMode.END);
+ info_label.set_selectable(true);
+ label.set_alignment(1, (float) 5e-1);
+ info = (Gtk.Widget) info_label;
+ }
+
+ attach(label, 0, (int) line_count, 1, 1);
+
+ if (multi_line) {
+ attach(info, 1, (int) line_count, 1, 2);
+ } else {
+ attach(info, 1, (int) line_count, 1, 1);
+ }
+
+ line_count++;
+ }
+
+ protected string get_prettyprint_time(Time time) {
+ string timestring = time.format(Resources.get_hh_mm_format_string());
+
+ if (timestring[0] == '0')
+ timestring = timestring.substring(1, -1);
+
+ return timestring;
+ }
+
+ protected string get_prettyprint_time_with_seconds(Time time) {
+ string timestring = time.format(Resources.get_hh_mm_ss_format_string());
+
+ if (timestring[0] == '0')
+ timestring = timestring.substring(1, -1);
+
+ return timestring;
+ }
+
+ protected string get_prettyprint_date(Time date) {
+ string date_string = null;
+ Time today = Time.local(time_t());
+ if (date.day_of_year == today.day_of_year && date.year == today.year) {
+ date_string = _("Today");
+ } else if (date.day_of_year == (today.day_of_year - 1) && date.year == today.year) {
+ date_string = _("Yesterday");
+ } else {
+ date_string = format_local_date(date);
+ }
+
+ return date_string;
+ }
+
+ protected virtual void get_single_properties(DataView view) {
+ }
+
+ protected virtual void get_multiple_properties(Gee.Iterable<DataView>? iter) {
+ }
+
+ protected virtual void get_properties(Page current_page) {
+ ViewCollection view = current_page.get_view();
+ if (view == null)
+ return;
+
+ // summarize selected items, if none selected, summarize all
+ int count = view.get_selected_count();
+ Gee.Iterable<DataView> iter = null;
+ if (count != 0) {
+ iter = view.get_selected();
+ } else {
+ count = view.get_count();
+ iter = (Gee.Iterable<DataView>) view.get_all();
+ }
+
+ if (iter == null || count == 0)
+ return;
+
+ if (count == 1) {
+ foreach (DataView item in iter) {
+ get_single_properties(item);
+ break;
+ }
+ } else {
+ get_multiple_properties(iter);
+ }
+ }
+
+ protected virtual void clear_properties() {
+ foreach (Gtk.Widget child in get_children())
+ remove(child);
+
+ line_count = 0;
+ }
+
+ public void update_properties(Page page) {
+ clear_properties();
+ internal_update_properties(page);
+ show_all();
+ }
+
+ public virtual void internal_update_properties(Page page) {
+ get_properties(page);
+ }
+
+ public void unselect_text() {
+ foreach (Gtk.Widget child in get_children()) {
+ if (child is Gtk.Label)
+ ((Gtk.Label) child).select_region(0, 0);
+ }
+ }
+}
+
+private class BasicProperties : Properties {
+ private string title;
+ private time_t start_time = time_t();
+ private time_t end_time = time_t();
+ private Dimensions dimensions;
+ private int photo_count;
+ private int event_count;
+ private int video_count;
+ private string exposure;
+ private string aperture;
+ private string iso;
+ private double clip_duration;
+ private string raw_developer;
+ private string raw_assoc;
+
+ public BasicProperties() {
+ }
+
+ protected override void clear_properties() {
+ base.clear_properties();
+ title = "";
+ start_time = 0;
+ end_time = 0;
+ dimensions = Dimensions(0,0);
+ photo_count = -1;
+ event_count = -1;
+ video_count = -1;
+ exposure = "";
+ aperture = "";
+ iso = "";
+ clip_duration = 0.0;
+ raw_developer = "";
+ raw_assoc = "";
+ }
+
+ protected override void get_single_properties(DataView view) {
+ base.get_single_properties(view);
+
+ DataSource source = view.get_source();
+
+ title = source.get_name();
+
+ if (source is PhotoSource || source is PhotoImportSource) {
+ start_time = (source is PhotoSource) ? ((PhotoSource) source).get_exposure_time() :
+ ((PhotoImportSource) source).get_exposure_time();
+ end_time = start_time;
+
+ PhotoMetadata? metadata = (source is PhotoSource) ? ((PhotoSource) source).get_metadata() :
+ ((PhotoImportSource) source).get_metadata();
+
+ if (metadata != null) {
+ exposure = metadata.get_exposure_string();
+ if (exposure == null)
+ exposure = "";
+
+ aperture = metadata.get_aperture_string(true);
+ if (aperture == null)
+ aperture = "";
+
+ iso = metadata.get_iso_string();
+ if (iso == null)
+ iso = "";
+
+ dimensions = (metadata.get_pixel_dimensions() != null) ?
+ metadata.get_orientation().rotate_dimensions(metadata.get_pixel_dimensions()) :
+ Dimensions(0, 0);
+ }
+
+ if (source is PhotoSource)
+ dimensions = ((PhotoSource) source).get_dimensions();
+
+ if (source is Photo && ((Photo) source).get_master_file_format() == PhotoFileFormat.RAW) {
+ Photo photo = source as Photo;
+ raw_developer = photo.get_raw_developer().get_label();
+ raw_assoc = photo.is_raw_developer_available(RawDeveloper.CAMERA) ? _("RAW+JPEG") : "";
+ }
+ } else if (source is EventSource) {
+ EventSource event_source = (EventSource) source;
+
+ start_time = event_source.get_start_time();
+ end_time = event_source.get_end_time();
+
+ int event_photo_count;
+ int event_video_count;
+ MediaSourceCollection.count_media(event_source.get_media(), out event_photo_count,
+ out event_video_count);
+
+ photo_count = event_photo_count;
+ video_count = event_video_count;
+ } else if (source is VideoSource || source is VideoImportSource) {
+ if (source is VideoSource) {
+ Video video = (Video) source;
+ clip_duration = video.get_clip_duration();
+
+ if (video.get_is_interpretable())
+ dimensions = video.get_frame_dimensions();
+
+ start_time = video.get_exposure_time();
+ } else {
+ start_time = ((VideoImportSource) source).get_exposure_time();
+ }
+ end_time = start_time;
+ }
+ }
+
+ protected override void get_multiple_properties(Gee.Iterable<DataView>? iter) {
+ base.get_multiple_properties(iter);
+
+ photo_count = 0;
+ video_count = 0;
+ foreach (DataView view in iter) {
+ DataSource source = view.get_source();
+
+ if (source is PhotoSource || source is PhotoImportSource) {
+ time_t exposure_time = (source is PhotoSource) ?
+ ((PhotoSource) source).get_exposure_time() :
+ ((PhotoImportSource) source).get_exposure_time();
+
+ if (exposure_time != 0) {
+ if (start_time == 0 || exposure_time < start_time)
+ start_time = exposure_time;
+
+ if (end_time == 0 || exposure_time > end_time)
+ end_time = exposure_time;
+ }
+
+ photo_count++;
+ } else if (source is EventSource) {
+ EventSource event_source = (EventSource) source;
+
+ if (event_count == -1)
+ event_count = 0;
+
+ if ((start_time == 0 || event_source.get_start_time() < start_time) &&
+ event_source.get_start_time() != 0 ) {
+ start_time = event_source.get_start_time();
+ }
+ if ((end_time == 0 || event_source.get_end_time() > end_time) &&
+ event_source.get_end_time() != 0 ) {
+ end_time = event_source.get_end_time();
+ } else if (end_time == 0 || event_source.get_start_time() > end_time) {
+ end_time = event_source.get_start_time();
+ }
+
+ int event_photo_count;
+ int event_video_count;
+ MediaSourceCollection.count_media(event_source.get_media(), out event_photo_count,
+ out event_video_count);
+
+ photo_count += event_photo_count;
+ video_count += event_video_count;
+ event_count++;
+ } else if (source is VideoSource || source is VideoImportSource) {
+ time_t exposure_time = (source is VideoSource) ?
+ ((VideoSource) source).get_exposure_time() :
+ ((VideoImportSource) source).get_exposure_time();
+
+ if (exposure_time != 0) {
+ if (start_time == 0 || exposure_time < start_time)
+ start_time = exposure_time;
+
+ if (end_time == 0 || exposure_time > end_time)
+ end_time = exposure_time;
+ }
+
+ video_count++;
+ }
+ }
+ }
+
+ protected override void get_properties(Page current_page) {
+ base.get_properties(current_page);
+
+ if (end_time == 0)
+ end_time = start_time;
+ if (start_time == 0)
+ start_time = end_time;
+ }
+
+ protected override void internal_update_properties(Page page) {
+ base.internal_update_properties(page);
+
+ // display the title if a Tag page
+ if (title == "" && page is TagPage)
+ title = ((TagPage) page).get_tag().get_user_visible_name();
+
+ if (title != "")
+ add_line(_("Title:"), guarded_markup_escape_text(title));
+
+ if (photo_count >= 0 || video_count >= 0) {
+ string label = _("Items:");
+
+ if (event_count >= 0) {
+ string event_num_string = (ngettext("%d Event", "%d Events", event_count)).printf(
+ event_count);
+
+ add_line(label, event_num_string);
+ label = "";
+ }
+
+ string photo_num_string = (ngettext("%d Photo", "%d Photos", photo_count)).printf(
+ photo_count);
+ string video_num_string = (ngettext("%d Video", "%d Videos", video_count)).printf(
+ video_count);
+
+ if (photo_count == 0 && video_count > 0) {
+ add_line(label, video_num_string);
+ return;
+ }
+
+ add_line(label, photo_num_string);
+
+ if (video_count > 0)
+ add_line("", video_num_string);
+ }
+
+ if (start_time != 0) {
+ string start_date = get_prettyprint_date(Time.local(start_time));
+ string start_time = get_prettyprint_time(Time.local(start_time));
+ string end_date = get_prettyprint_date(Time.local(end_time));
+ string end_time = get_prettyprint_time(Time.local(end_time));
+
+ if (start_date == end_date) {
+ // display only one date if start and end are the same
+ add_line(_("Date:"), start_date);
+
+ if (start_time == end_time) {
+ // display only one time if start and end are the same
+ add_line(_("Time:"), start_time);
+ } else {
+ // display time range
+ add_line(_("From:"), start_time);
+ add_line(_("To:"), end_time);
+ }
+ } else {
+ // display date range
+ add_line(_("From:"), start_date);
+ add_line(_("To:"), end_date);
+ }
+ }
+
+ if (dimensions.has_area()) {
+ string label = _("Size:");
+
+ if (dimensions.has_area()) {
+ add_line(label, "%d &#215; %d".printf(dimensions.width, dimensions.height));
+ label = "";
+ }
+ }
+
+ if (clip_duration > 0.0) {
+ add_line(_("Duration:"), _("%.1f seconds").printf(clip_duration));
+ }
+
+ if (raw_developer != "") {
+ add_line(_("Developer:"), raw_developer);
+ }
+
+ // RAW+JPEG flag.
+ if (raw_assoc != "")
+ add_line("", raw_assoc);
+
+ if (exposure != "" || aperture != "" || iso != "") {
+ string line = null;
+
+ // attempt to put exposure and aperture on the same line
+ if (exposure != "")
+ line = exposure;
+
+ if (aperture != "") {
+ if (line != null)
+ line += ", " + aperture;
+ else
+ line = aperture;
+ }
+
+ // if not both available but ISO is, add it to the first line
+ if ((exposure == "" || aperture == "") && iso != "") {
+ if (line != null)
+ line += ", " + "ISO " + iso;
+ else
+ line = "ISO " + iso;
+
+ add_line(_("Exposure:"), line);
+ } else {
+ // fit both on the top line, emit and move on
+ if (line != null)
+ add_line(_("Exposure:"), line);
+
+ // emit ISO on a second unadorned line
+ if (iso != "") {
+ if (line != null)
+ add_line("","ISO " + iso);
+ else
+ add_line(_("Exposure:"), "ISO " + iso);
+ }
+ }
+ }
+ }
+}
+
+private class ExtendedPropertiesWindow : Gtk.Dialog {
+ private ExtendedProperties properties = null;
+ private const int FRAME_BORDER = 6;
+ private Gtk.Button close_button;
+
+ private class ExtendedProperties : Properties {
+ private const string NO_VALUE = "";
+ // Photo stuff
+ private string file_path;
+ private uint64 filesize;
+ private Dimensions? original_dim;
+ private string camera_make;
+ private string camera_model;
+ private string flash;
+ private string focal_length;
+ private double gps_lat;
+ private string gps_lat_ref;
+ private double gps_long;
+ private string gps_long_ref;
+ private double gps_alt;
+ private string artist;
+ private string copyright;
+ private string software;
+ private string exposure_bias;
+ private string exposure_date;
+ private string exposure_time;
+ private bool is_raw;
+ private string? development_path;
+
+ // Event stuff
+ // nothing here which is not already shown in the BasicProperties but
+ // comments, which are common, see below
+
+ // common stuff
+ private string comment;
+
+ protected override void clear_properties() {
+ base.clear_properties();
+
+ file_path = "";
+ development_path = "";
+ is_raw = false;
+ filesize = 0;
+ original_dim = Dimensions(0, 0);
+ camera_make = "";
+ camera_model = "";
+ flash = "";
+ focal_length = "";
+ gps_lat = -1;
+ gps_lat_ref = "";
+ gps_long = -1;
+ gps_long_ref = "";
+ artist = "";
+ copyright = "";
+ software = "";
+ exposure_bias = "";
+ exposure_date = "";
+ exposure_time = "";
+ comment = "";
+ }
+
+ protected override void get_single_properties(DataView view) {
+ base.get_single_properties(view);
+
+ DataSource source = view.get_source();
+ if (source == null)
+ return;
+
+ if (source is MediaSource) {
+ MediaSource media = (MediaSource) source;
+ file_path = media.get_master_file().get_path();
+ development_path = media.get_file().get_path();
+ filesize = media.get_master_filesize();
+
+ // as of right now, all extended properties other than filesize, filepath & comment aren't
+ // applicable to non-photo media types, so if the current media source isn't a photo,
+ // just do a short-circuit return
+ Photo photo = media as Photo;
+ if (photo == null)
+ return;
+
+ PhotoMetadata? metadata;
+
+ try {
+ // For some raw files, the developments may not contain metadata (please
+ // see the comment about cameras generating 'crazy' exif segments in
+ // Photo.develop_photo() for why), and so we'll want to display what was
+ // in the original raw file instead.
+ metadata = photo.get_master_metadata();
+ } catch (Error e) {
+ metadata = photo.get_metadata();
+ }
+
+ if (metadata == null)
+ return;
+
+ // Fix up any timestamp weirdness.
+ //
+ // If the exposure date wasn't properly set (the most likely cause of this
+ // is a raw with a metadataless development), use the one from the photo
+ // row.
+ if (metadata.get_exposure_date_time() == null)
+ metadata.set_exposure_date_time(new MetadataDateTime(photo.get_timestamp()));
+
+ is_raw = (photo.get_master_file_format() == PhotoFileFormat.RAW);
+ original_dim = metadata.get_pixel_dimensions();
+ camera_make = metadata.get_camera_make();
+ camera_model = metadata.get_camera_model();
+ flash = metadata.get_flash_string();
+ focal_length = metadata.get_focal_length_string();
+ metadata.get_gps(out gps_long, out gps_long_ref, out gps_lat, out gps_lat_ref, out gps_alt);
+ artist = metadata.get_artist();
+ copyright = metadata.get_copyright();
+ software = metadata.get_software();
+ exposure_bias = metadata.get_exposure_bias();
+ time_t exposure_time_obj = metadata.get_exposure_date_time().get_timestamp();
+ exposure_date = get_prettyprint_date(Time.local(exposure_time_obj));
+ exposure_time = get_prettyprint_time_with_seconds(Time.local(exposure_time_obj));
+ comment = media.get_comment();
+ } else if (source is EventSource) {
+ Event event = (Event) source;
+ comment = event.get_comment();
+ }
+ }
+
+ public override void internal_update_properties(Page page) {
+ base.internal_update_properties(page);
+
+ if (page is EventsDirectoryPage) {
+ // nothing special to be done for now for Events
+ } else {
+ add_line(_("Location:"), (file_path != "" && file_path != null) ?
+ file_path.replace("&", "&amp;") : NO_VALUE);
+
+ add_line(_("File size:"), (filesize > 0) ?
+ format_size((int64) filesize) : NO_VALUE);
+
+ if (is_raw)
+ add_line(_("Current Development:"), development_path);
+
+ add_line(_("Original dimensions:"), (original_dim != null && original_dim.has_area()) ?
+ "%d &#215; %d".printf(original_dim.width, original_dim.height) : NO_VALUE);
+
+ add_line(_("Camera make:"), (camera_make != "" && camera_make != null) ?
+ camera_make : NO_VALUE);
+
+ add_line(_("Camera model:"), (camera_model != "" && camera_model != null) ?
+ camera_model : NO_VALUE);
+
+ add_line(_("Flash:"), (flash != "" && flash != null) ? flash : NO_VALUE);
+
+ add_line(_("Focal length:"), (focal_length != "" && focal_length != null) ?
+ focal_length : NO_VALUE);
+
+ add_line(_("Exposure date:"), (exposure_date != "" && exposure_date != null) ?
+ exposure_date : NO_VALUE);
+
+ add_line(_("Exposure time:"), (exposure_time != "" && exposure_time != null) ?
+ exposure_time : NO_VALUE);
+
+ add_line(_("Exposure bias:"), (exposure_bias != "" && exposure_bias != null) ? exposure_bias : NO_VALUE);
+
+ add_line(_("GPS latitude:"), (gps_lat != -1 && gps_lat_ref != "" &&
+ gps_lat_ref != null) ? "%f °%s".printf(gps_lat, gps_lat_ref) : NO_VALUE);
+
+ add_line(_("GPS longitude:"), (gps_long != -1 && gps_long_ref != "" &&
+ gps_long_ref != null) ? "%f °%s".printf(gps_long, gps_long_ref) : NO_VALUE);
+
+ add_line(_("Artist:"), (artist != "" && artist != null) ? artist : NO_VALUE);
+
+ add_line(_("Copyright:"), (copyright != "" && copyright != null) ? copyright : NO_VALUE);
+
+ add_line(_("Software:"), (software != "" && software != null) ? software : NO_VALUE);
+ }
+
+ bool has_comment = (comment != "" && comment != null);
+ add_line(_("Comment:"), has_comment ? comment : NO_VALUE, has_comment);
+ }
+ }
+
+ public ExtendedPropertiesWindow(Gtk.Window owner) {
+ add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.KEY_PRESS_MASK);
+ focus_on_map = true;
+ set_accept_focus(true);
+ set_can_focus(true);
+ set_title(_("Extended Information"));
+ set_size_request(300,-1);
+ set_default_size(520, -1);
+ set_position(Gtk.WindowPosition.CENTER);
+ set_transient_for(owner);
+ set_type_hint(Gdk.WindowTypeHint.DIALOG);
+
+ delete_event.connect(hide_on_delete);
+
+ properties = new ExtendedProperties();
+ Gtk.Alignment alignment = new Gtk.Alignment(0.5f,0.5f,1,1);
+ alignment.add(properties);
+ alignment.set_padding(4, 4, 4, 4);
+ ((Gtk.Box) get_content_area()).add(alignment);
+ close_button = new Gtk.Button.from_stock(Gtk.Stock.CLOSE);
+ close_button.clicked.connect(on_close_clicked);
+
+ Gtk.Alignment action_alignment = new Gtk.Alignment(1, 0.5f, 1, 1);
+ action_alignment.add(close_button);
+ ((Gtk.Container) get_action_area()).add(action_alignment);
+
+ set_has_resize_grip(false);
+ }
+
+ ~ExtendedPropertiesWindow() {
+ close_button.clicked.disconnect(on_close_clicked);
+ }
+
+ public override bool button_press_event(Gdk.EventButton event) {
+ // LMB only
+ if (event.button != 1)
+ return (base.button_press_event != null) ? base.button_press_event(event) : true;
+
+ begin_move_drag((int) event.button, (int) event.x_root, (int) event.y_root, event.time);
+
+ return true;
+ }
+
+ private void on_close_clicked() {
+ hide();
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ // hide properties
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ hide();
+ return true;
+ }
+ // or send through to AppWindow
+ return AppWindow.get_instance().key_press_event(event);
+ }
+
+ public void update_properties(Page page) {
+ properties.update_properties(page);
+ }
+
+ public override void show_all() {
+ base.show_all();
+ properties.unselect_text();
+ grab_focus();
+ }
+}
diff --git a/src/Resources.vala b/src/Resources.vala
new file mode 100644
index 0000000..c8f02c4
--- /dev/null
+++ b/src/Resources.vala
@@ -0,0 +1,1143 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// defined by ./configure or Makefile and included by gcc -D
+extern const string _PREFIX;
+extern const string _VERSION;
+extern const string GETTEXT_PACKAGE;
+extern const string _LIB;
+extern const string _LIBEXECDIR;
+extern const string? _GIT_VERSION;
+
+namespace Resources {
+ public const string APP_TITLE = "Shotwell";
+ public const string APP_LIBRARY_ROLE = _("Photo Manager");
+ public const string APP_DIRECT_ROLE = _("Photo Viewer");
+ public const string APP_VERSION = _VERSION;
+
+#if _GITVERSION
+ public const string? GIT_VERSION = _GIT_VERSION;
+#else
+ public const string? GIT_VERSION = null;
+#endif
+
+ public const string COPYRIGHT = _("Copyright 2009-2014 Yorba Foundation");
+ public const string APP_GETTEXT_PACKAGE = GETTEXT_PACKAGE;
+
+ public const string HOME_URL = "https://wiki.gnome.org/Apps/Shotwell";
+ public const string FAQ_URL = "https://wiki.gnome.org/Apps/Shotwell/FAQ";
+ public const string BUG_DB_URL = "https://wiki.gnome.org/Apps/Shotwell/ReportingABug";
+ public const string DIR_PATTERN_URI_SYSWIDE = "ghelp:shotwell?other-files";
+
+ private const string LIB = _LIB;
+ private const string LIBEXECDIR = _LIBEXECDIR;
+
+ public const string PREFIX = _PREFIX;
+
+ public const double TRANSIENT_WINDOW_OPACITY = 0.90;
+
+ public const int DEFAULT_ICON_SCALE = 24;
+
+ public const string[] AUTHORS = {
+ "Jim Nelson <jim@yorba.org>",
+ "Lucas Beeler <lucas@yorba.org>",
+ "Allison Barlow <allison@yorba.org>",
+ "Eric Gregory <eric@yorba.org>",
+ "Clinton Rogers <clinton@yorba.org>",
+ null
+ };
+
+ public const string LICENSE = """
+Shotwell is free software; you can redistribute it and/or modify it under the
+terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or (at your option)
+any later version.
+
+Shotwell is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with Shotwell; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+""";
+
+ public const string CLOCKWISE = "object-rotate-right";
+ public const string COUNTERCLOCKWISE = "object-rotate-left";
+ public const string HFLIP = "object-flip-horizontal";
+ public const string VFLIP = "object-flip-vertical";
+ public const string CROP = "shotwell-crop";
+ public const string STRAIGHTEN = "shotwell-straighten";
+ public const string REDEYE = "shotwell-redeye";
+ public const string ADJUST = "shotwell-adjust";
+ public const string PIN_TOOLBAR = "shotwell-pin-toolbar";
+ public const string MAKE_PRIMARY = "shotwell-make-primary";
+ public const string IMPORT = "shotwell-import";
+ public const string IMPORT_ALL = "shotwell-import-all";
+ public const string ENHANCE = "shotwell-auto-enhance";
+ public const string CROP_PIVOT_RETICLE = "shotwell-crop-pivot-reticle";
+ public const string PUBLISH = "applications-internet";
+ public const string MERGE = "shotwell-merge-events";
+
+ public const string ICON_APP = "shotwell.svg";
+ public const string ICON_APP16 = "shotwell-16.svg";
+ public const string ICON_APP24 = "shotwell-24.svg";
+
+ public const string APP_ICONS[] = { ICON_APP, ICON_APP16, ICON_APP24 };
+
+ public const string ICON_ABOUT_LOGO = "shotwell-street.jpg";
+ public const string ICON_GENERIC_PLUGIN = "generic-plugin.png";
+ public const string ICON_SLIDESHOW_EXTENSION_POINT = "slideshow-extension-point";
+ public const string ICON_RATING_REJECTED = "rejected.svg";
+ public const string ICON_RATING_ONE = "one-star.svg";
+ public const string ICON_RATING_TWO = "two-stars.svg";
+ public const string ICON_RATING_THREE = "three-stars.svg";
+ public const string ICON_RATING_FOUR = "four-stars.svg";
+ public const string ICON_RATING_FIVE = "five-stars.svg";
+ public const string ICON_FILTER_REJECTED_OR_BETTER = "all-rejected.png";
+ public const int ICON_FILTER_REJECTED_OR_BETTER_FIXED_SIZE = 32;
+ public const string ICON_FILTER_UNRATED_OR_BETTER = "shotwell-16.svg";
+ public const int ICON_FILTER_UNRATED_OR_BETTER_FIXED_SIZE = 16;
+ public const string ICON_FILTER_ONE_OR_BETTER = "one-star-filter-plus.svg";
+ public const string ICON_FILTER_TWO_OR_BETTER = "two-star-filter-plus.svg";
+ public const string ICON_FILTER_THREE_OR_BETTER = "three-star-filter-plus.svg";
+ public const string ICON_FILTER_FOUR_OR_BETTER = "four-star-filter-plus.svg";
+ public const string ICON_FILTER_FIVE = "five-star-filter.svg";
+ public const string ICON_ZOOM_IN = "zoom-in.png";
+ public const string ICON_ZOOM_OUT = "zoom-out.png";
+ public const int ICON_ZOOM_SCALE = 16;
+
+ public const string ICON_CAMERAS = "camera-photo";
+ public const string ICON_EVENTS = "multiple-events";
+ public const string ICON_ONE_EVENT = "one-event";
+ public const string ICON_NO_EVENT = "no-event";
+ public const string ICON_ONE_TAG = "one-tag";
+ public const string ICON_TAGS = "multiple-tags";
+ public const string ICON_FOLDER_CLOSED = "folder";
+ public const string ICON_FOLDER_OPEN = "folder-open";
+ public const string ICON_FOLDER_DOCUMENTS = "folder-documents";
+ public const string ICON_IMPORTING = "go-down";
+ public const string ICON_LAST_IMPORT = "document-open-recent";
+ public const string ICON_MISSING_FILES = "process-stop";
+ public const string ICON_PHOTOS = "shotwell-16";
+ public const string ICON_SINGLE_PHOTO = "image-x-generic";
+ public const string ICON_FILTER_PHOTOS = "filter-photos";
+ public const string ICON_FILTER_PHOTOS_DISABLED = "filter-photos-disabled";
+ public const string ICON_FILTER_VIDEOS = "filter-videos";
+ public const string ICON_FILTER_VIDEOS_DISABLED = "filter-videos-disabled";
+ public const string ICON_FILTER_RAW = "filter-raw";
+ public const string ICON_FILTER_RAW_DISABLED = "filter-raw-disabled";
+ public const string ICON_FILTER_FLAGGED = "filter-flagged";
+ public const string ICON_FILTER_FLAGGED_DISABLED = "filter-flagged-disabled";
+ public const string ICON_TRASH_EMPTY = "user-trash";
+ public const string ICON_TRASH_FULL = "user-trash-full";
+ public const string ICON_VIDEOS_PAGE = "videos-page";
+ public const string ICON_FLAGGED_PAGE = "flag-page";
+ public const string ICON_FLAGGED_TRINKET = "flag-trinket.png";
+
+ public const string ROTATE_CW_MENU = _("Rotate _Right");
+ public const string ROTATE_CW_LABEL = _("Rotate");
+ public const string ROTATE_CW_FULL_LABEL = _("Rotate Right");
+ public const string ROTATE_CW_TOOLTIP = _("Rotate the photos right (press Ctrl to rotate left)");
+
+ public const string ROTATE_CCW_MENU = _("Rotate _Left");
+ public const string ROTATE_CCW_LABEL = _("Rotate");
+ public const string ROTATE_CCW_FULL_LABEL = _("Rotate Left");
+ public const string ROTATE_CCW_TOOLTIP = _("Rotate the photos left");
+
+ public const string HFLIP_MENU = _("Flip Hori_zontally");
+ public const string HFLIP_LABEL = _("Flip Horizontally");
+
+ public const string VFLIP_MENU = _("Flip Verti_cally");
+ public const string VFLIP_LABEL = _("Flip Vertically");
+
+ public const string ENHANCE_MENU = _("_Enhance");
+ public const string ENHANCE_LABEL = _("Enhance");
+ public const string ENHANCE_TOOLTIP = _("Automatically improve the photo's appearance");
+
+ public const string COPY_ADJUSTMENTS_MENU = _("_Copy Color Adjustments");
+ public const string COPY_ADJUSTMENTS_LABEL = _("Copy Color Adjustments");
+ public const string COPY_ADJUSTMENTS_TOOLTIP = _("Copy the color adjustments applied to the photo");
+
+ public const string PASTE_ADJUSTMENTS_MENU = _("_Paste Color Adjustments");
+ public const string PASTE_ADJUSTMENTS_LABEL = _("Paste Color Adjustments");
+ public const string PASTE_ADJUSTMENTS_TOOLTIP = _("Apply copied color adjustments to the selected photos");
+
+ public const string CROP_MENU = _("_Crop");
+ public const string CROP_LABEL = _("Crop");
+ public const string CROP_TOOLTIP = _("Crop the photo's size");
+
+ public const string STRAIGHTEN_MENU = _("_Straighten");
+ public const string STRAIGHTEN_LABEL = _("Straighten");
+ public const string STRAIGHTEN_TOOLTIP = _("Straighten the photo");
+
+ public const string RED_EYE_MENU = _("_Red-eye");
+ public const string RED_EYE_LABEL = _("Red-eye");
+ public const string RED_EYE_TOOLTIP = _("Reduce or eliminate any red-eye effects in the photo");
+
+ public const string ADJUST_MENU = _("_Adjust");
+ public const string ADJUST_LABEL = _("Adjust");
+ public const string ADJUST_TOOLTIP = _("Adjust the photo's color and tone");
+
+ public const string REVERT_MENU = _("Re_vert to Original");
+ public const string REVERT_LABEL = _("Revert to Original");
+
+ public const string REVERT_EDITABLE_MENU = _("Revert External E_dits");
+ public const string REVERT_EDITABLE_TOOLTIP = _("Revert to the master photo");
+
+ public const string SET_BACKGROUND_MENU = _("Set as _Desktop Background");
+ public const string SET_BACKGROUND_TOOLTIP = _("Set selected image to be the new desktop background");
+ public const string SET_BACKGROUND_SLIDESHOW_MENU = _("Set as _Desktop Slideshow...");
+
+ public const string UNDO_MENU = _("_Undo");
+ public const string UNDO_LABEL = _("Undo");
+
+ public const string REDO_MENU = _("_Redo");
+ public const string REDO_LABEL = _("Redo");
+
+ public const string RENAME_EVENT_MENU = _("Re_name Event...");
+ public const string RENAME_EVENT_LABEL = _("Rename Event");
+
+ public const string MAKE_KEY_PHOTO_MENU = _("Make _Key Photo for Event");
+ public const string MAKE_KEY_PHOTO_LABEL = _("Make Key Photo for Event");
+
+ public const string NEW_EVENT_MENU = _("_New Event");
+ public const string NEW_EVENT_LABEL = _("New Event");
+
+ public const string SET_PHOTO_EVENT_LABEL = _("Move Photos");
+ public const string SET_PHOTO_EVENT_TOOLTIP = _("Move photos to an event");
+
+ public const string MERGE_MENU = _("_Merge Events");
+ public const string MERGE_LABEL = _("Merge");
+ public const string MERGE_TOOLTIP = _("Combine events into a single event");
+
+ public const string RATING_MENU = _("_Set Rating");
+ public const string RATING_LABEL = _("Set Rating");
+ public const string RATING_TOOLTIP = _("Change the rating of your photo");
+
+ public const string INCREASE_RATING_MENU = _("_Increase");
+ public const string INCREASE_RATING_LABEL = _("Increase Rating");
+
+ public const string DECREASE_RATING_MENU = _("_Decrease");
+ public const string DECREASE_RATING_LABEL = _("Decrease Rating");
+
+ public const string RATE_UNRATED_MENU = _("_Unrated");
+ public const string RATE_UNRATED_COMBO_BOX = _("Unrated");
+ public const string RATE_UNRATED_LABEL = _("Rate Unrated");
+ public const string RATE_UNRATED_PROGRESS = _("Setting as unrated");
+ public const string RATE_UNRATED_TOOLTIP = _("Remove any ratings");
+
+ public const string RATE_REJECTED_MENU = _("_Rejected");
+ public const string RATE_REJECTED_COMBO_BOX = _("Rejected");
+ public const string RATE_REJECTED_LABEL = _("Rate Rejected");
+ public const string RATE_REJECTED_PROGRESS = _("Setting as rejected");
+ public const string RATE_REJECTED_TOOLTIP = _("Set rating to rejected");
+
+ public const string DISPLAY_REJECTED_ONLY_MENU = _("Rejected _Only");
+ public const string DISPLAY_REJECTED_ONLY_LABEL = _("Rejected Only");
+ public const string DISPLAY_REJECTED_ONLY_TOOLTIP = _("Show only rejected photos");
+
+ public const string DISPLAY_REJECTED_OR_HIGHER_MENU = _("All + _Rejected");
+ public const string DISPLAY_REJECTED_OR_HIGHER_LABEL = _("Show all photos, including rejected");
+ public const string DISPLAY_REJECTED_OR_HIGHER_TOOLTIP = _("Show all photos, including rejected");
+
+ public const string DISPLAY_UNRATED_OR_HIGHER_MENU = _("_All Photos");
+ public const string DISPLAY_UNRATED_OR_HIGHER_LABEL = _("Show all photos");
+ public const string DISPLAY_UNRATED_OR_HIGHER_TOOLTIP = _("Show all photos");
+
+ public const string VIEW_RATINGS_MENU = _("_Ratings");
+ public const string VIEW_RATINGS_TOOLTIP = _("Display each photo's rating");
+
+ public const string FILTER_PHOTOS_MENU = _("_Filter Photos");
+ public const string FILTER_PHOTOS_LABEL = _("Filter Photos");
+ public const string FILTER_PHOTOS_TOOLTIP = _("Limit the number of photos displayed based on a filter");
+
+ public const string DUPLICATE_PHOTO_MENU = _("_Duplicate");
+ public const string DUPLICATE_PHOTO_LABEL = _("Duplicate");
+ public const string DUPLICATE_PHOTO_TOOLTIP = _("Make a duplicate of the photo");
+
+ public const string EXPORT_MENU = _("_Export...");
+
+ public const string PRINT_MENU = _("_Print...");
+
+ public const string PUBLISH_MENU = _("Pu_blish...");
+ public const string PUBLISH_LABEL = _("Publish");
+ public const string PUBLISH_TOOLTIP = _("Publish to various websites");
+
+ public const string EDIT_TITLE_MENU = _("Edit _Title...");
+ public const string EDIT_TITLE_LABEL = _("Edit Title");
+
+ public const string EDIT_COMMENT_MENU = _("Edit _Comment...");
+ public const string EDIT_COMMENT_LABEL = _("Edit Comment");
+
+ public const string EDIT_EVENT_COMMENT_MENU = _("Edit Event _Comment...");
+ public const string EDIT_EVENT_COMMENT_LABEL = _("Edit Event Comment");
+
+ public const string ADJUST_DATE_TIME_MENU = _("_Adjust Date and Time...");
+ public const string ADJUST_DATE_TIME_LABEL = _("Adjust Date and Time");
+
+ public const string ADD_TAGS_MENU = _("Add _Tags...");
+ public const string ADD_TAGS_CONTEXT_MENU = _("_Add Tags...");
+ public const string ADD_TAGS_TITLE = _("Add Tags");
+
+ public const string PREFERENCES_MENU = _("_Preferences");
+
+ public const string EXTERNAL_EDIT_MENU = _("Open With E_xternal Editor");
+
+ public const string EXTERNAL_EDIT_RAW_MENU = _("Open With RA_W Editor");
+
+ public const string SEND_TO_MENU = _("Send _To...");
+ public const string SEND_TO_CONTEXT_MENU = _("Send T_o...");
+
+ public const string FIND_MENU = _("_Find...");
+ public const string FIND_LABEL = _("Find");
+ public const string FIND_TOOLTIP = _("Find an image by typing text that appears in its name or tags");
+
+ public const string FLAG_MENU = _("_Flag");
+
+ public const string UNFLAG_MENU = _("Un_flag");
+
+ public string launch_editor_failed(Error err) {
+ return _("Unable to launch editor: %s").printf(err.message);
+ }
+
+ public string add_tags_label(string[] names) {
+ if (names.length == 1)
+ return _("Add Tag \"%s\"").printf(HierarchicalTagUtilities.get_basename(names[0]));
+ else if (names.length == 2)
+ return _("Add Tags \"%s\" and \"%s\"").printf(
+ HierarchicalTagUtilities.get_basename(names[0]),
+ HierarchicalTagUtilities.get_basename(names[1]));
+ else
+ return _("Add Tags");
+ }
+
+ public string delete_tag_menu(string name) {
+ return _("_Delete Tag \"%s\"").printf(name);
+ }
+
+ public string delete_tag_label(string name) {
+ return _("Delete Tag \"%s\"").printf(name);
+ }
+
+ public const string DELETE_TAG_TITLE = _("Delete Tag");
+ public const string DELETE_TAG_SIDEBAR_MENU = _("_Delete");
+
+ public const string NEW_CHILD_TAG_SIDEBAR_MENU = _("_New");
+
+ public string rename_tag_menu(string name) {
+ return _("Re_name Tag \"%s\"...").printf(name);
+ }
+
+ public string rename_tag_label(string old_name, string new_name) {
+ return _("Rename Tag \"%s\" to \"%s\"").printf(old_name, new_name);
+ }
+
+ public const string RENAME_TAG_SIDEBAR_MENU = _("_Rename...");
+
+ public const string MODIFY_TAGS_MENU = _("Modif_y Tags...");
+ public const string MODIFY_TAGS_LABEL = _("Modify Tags");
+
+ public string tag_photos_label(string name, int count) {
+ return ((count == 1) ? _("Tag Photo as \"%s\"") : _("Tag Photos as \"%s\"")).printf(name);
+ }
+
+ public string tag_photos_tooltip(string name, int count) {
+ return ((count == 1) ? _("Tag the selected photo as \"%s\"") :
+ _("Tag the selected photos as \"%s\"")).printf(name);
+ }
+
+ public string untag_photos_menu(string name, int count) {
+ return ((count == 1) ? _("Remove Tag \"%s\" From _Photo") :
+ _("Remove Tag \"%s\" From _Photos")).printf(name);
+ }
+
+ public string untag_photos_label(string name, int count) {
+ return ((count == 1) ? _("Remove Tag \"%s\" From Photo") :
+ _("Remove Tag \"%s\" From Photos")).printf(name);
+ }
+
+ public static string rename_tag_exists_message(string name) {
+ return _("Unable to rename tag to \"%s\" because the tag already exists.").printf(name);
+ }
+
+ public static string rename_search_exists_message(string name) {
+ return _("Unable to rename search to \"%s\" because the search already exists.").printf(name);
+ }
+
+ public const string DEFAULT_SAVED_SEARCH_NAME = _("Saved Search");
+
+ public const string DELETE_SAVED_SEARCH_DIALOG_TITLE = _("Delete Search");
+
+ public const string DELETE_SEARCH_MENU = _("_Delete");
+ public const string EDIT_SEARCH_MENU = _("_Edit...");
+ public const string RENAME_SEARCH_MENU = _("Re_name...");
+
+ public string rename_search_label(string old_name, string new_name) {
+ return _("Rename Search \"%s\" to \"%s\"").printf(old_name, new_name);
+ }
+
+ public string delete_search_label(string name) {
+ return _("Delete Search \"%s\"").printf(name);
+ }
+
+ private unowned string rating_menu(Rating rating) {
+ switch (rating) {
+ case Rating.REJECTED:
+ return RATE_REJECTED_MENU;
+ case Rating.UNRATED:
+ return RATE_UNRATED_MENU;
+ case Rating.ONE:
+ return RATE_ONE_MENU;
+ case Rating.TWO:
+ return RATE_TWO_MENU;
+ case Rating.THREE:
+ return RATE_THREE_MENU;
+ case Rating.FOUR:
+ return RATE_FOUR_MENU;
+ case Rating.FIVE:
+ return RATE_FIVE_MENU;
+ default:
+ return RATE_UNRATED_MENU;
+ }
+ }
+
+ private unowned string rating_label(Rating rating) {
+ switch (rating) {
+ case Rating.REJECTED:
+ return RATE_REJECTED_LABEL;
+ case Rating.UNRATED:
+ return RATE_UNRATED_LABEL;
+ case Rating.ONE:
+ return RATE_ONE_LABEL;
+ case Rating.TWO:
+ return RATE_TWO_LABEL;
+ case Rating.THREE:
+ return RATE_THREE_LABEL;
+ case Rating.FOUR:
+ return RATE_FOUR_LABEL;
+ case Rating.FIVE:
+ return RATE_FIVE_LABEL;
+ default:
+ return RATE_UNRATED_LABEL;
+ }
+ }
+
+ private unowned string rating_combo_box(Rating rating) {
+ switch (rating) {
+ case Rating.REJECTED:
+ return RATE_REJECTED_COMBO_BOX;
+ case Rating.UNRATED:
+ return RATE_UNRATED_COMBO_BOX;
+ case Rating.ONE:
+ return RATE_ONE_MENU;
+ case Rating.TWO:
+ return RATE_TWO_MENU;
+ case Rating.THREE:
+ return RATE_THREE_MENU;
+ case Rating.FOUR:
+ return RATE_FOUR_MENU;
+ case Rating.FIVE:
+ return RATE_FIVE_MENU;
+ default:
+ return RATE_UNRATED_MENU;
+ }
+ }
+
+ private string get_rating_filter_tooltip(RatingFilter filter) {
+ switch (filter) {
+ case RatingFilter.REJECTED_OR_HIGHER:
+ return Resources.DISPLAY_REJECTED_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.ONE_OR_HIGHER:
+ return Resources.DISPLAY_ONE_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.TWO_OR_HIGHER:
+ return Resources.DISPLAY_TWO_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.THREE_OR_HIGHER:
+ return Resources.DISPLAY_THREE_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.FOUR_OR_HIGHER:
+ return Resources.DISPLAY_FOUR_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.FIVE_ONLY:
+ case RatingFilter.FIVE_OR_HIGHER:
+ return Resources.DISPLAY_FIVE_OR_HIGHER_TOOLTIP;
+
+ case RatingFilter.REJECTED_ONLY:
+ return Resources.DISPLAY_REJECTED_ONLY_TOOLTIP;
+
+ case RatingFilter.UNRATED_OR_HIGHER:
+ default:
+ return Resources.DISPLAY_UNRATED_OR_HIGHER_TOOLTIP;
+ }
+ }
+
+ private string rating_progress(Rating rating) {
+ switch (rating) {
+ case Rating.REJECTED:
+ return RATE_REJECTED_PROGRESS;
+ case Rating.UNRATED:
+ return RATE_UNRATED_PROGRESS;
+ case Rating.ONE:
+ return RATE_ONE_PROGRESS;
+ case Rating.TWO:
+ return RATE_TWO_PROGRESS;
+ case Rating.THREE:
+ return RATE_THREE_PROGRESS;
+ case Rating.FOUR:
+ return RATE_FOUR_PROGRESS;
+ case Rating.FIVE:
+ return RATE_FIVE_PROGRESS;
+ default:
+ return RATE_UNRATED_PROGRESS;
+ }
+ }
+
+ private const int[] rating_thresholds = { 0, 1, 25, 50, 75, 99 };
+
+ private string get_stars(Rating rating) {
+ switch (rating) {
+ case Rating.ONE:
+ return "\xE2\x98\x85";
+ case Rating.TWO:
+ return "\xE2\x98\x85\xE2\x98\x85";
+ case Rating.THREE:
+ return "\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85";
+ case Rating.FOUR:
+ return "\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85";
+ case Rating.FIVE:
+ return "\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85\xE2\x98\x85";
+ default:
+ return "";
+ }
+ }
+
+ private Gdk.Pixbuf? get_rating_trinket(Rating rating, int scale) {
+ switch (rating) {
+ case Rating.REJECTED:
+ return Resources.get_icon(Resources.ICON_RATING_REJECTED, scale);
+ // case Rating.UNRATED needs no icon
+ case Rating.ONE:
+ return Resources.get_icon(Resources.ICON_RATING_ONE, scale);
+ case Rating.TWO:
+ return Resources.get_icon(Resources.ICON_RATING_TWO, scale*2);
+ case Rating.THREE:
+ return Resources.get_icon(Resources.ICON_RATING_THREE, scale*3);
+ case Rating.FOUR:
+ return Resources.get_icon(Resources.ICON_RATING_FOUR, scale*4);
+ case Rating.FIVE:
+ return Resources.get_icon(Resources.ICON_RATING_FIVE, scale*5);
+ default:
+ return null;
+ }
+ }
+
+ private void generate_rating_strings() {
+ string menu_base = "%s";
+ string label_base = _("Rate %s");
+ string tooltip_base = _("Set rating to %s");
+ string progress_base = _("Setting rating to %s");
+ string display_rating_menu_base = "%s";
+ string display_rating_label_base = _("Display %s");
+ string display_rating_tooltip_base = _("Only show photos with a rating of %s");
+ string display_rating_or_higher_menu_base = _("%s or Better");
+ string display_rating_or_higher_label_base = _("Display %s or Better");
+ string display_rating_or_higher_tooltip_base = _("Only show photos with a rating of %s or better");
+
+ RATE_ONE_MENU = menu_base.printf(get_stars(Rating.ONE));
+ RATE_TWO_MENU = menu_base.printf(get_stars(Rating.TWO));
+ RATE_THREE_MENU = menu_base.printf(get_stars(Rating.THREE));
+ RATE_FOUR_MENU = menu_base.printf(get_stars(Rating.FOUR));
+ RATE_FIVE_MENU = menu_base.printf(get_stars(Rating.FIVE));
+
+ RATE_ONE_LABEL = label_base.printf(get_stars(Rating.ONE));
+ RATE_TWO_LABEL = label_base.printf(get_stars(Rating.TWO));
+ RATE_THREE_LABEL = label_base.printf(get_stars(Rating.THREE));
+ RATE_FOUR_LABEL = label_base.printf(get_stars(Rating.FOUR));
+ RATE_FIVE_LABEL = label_base.printf(get_stars(Rating.FIVE));
+
+ RATE_ONE_TOOLTIP = tooltip_base.printf(get_stars(Rating.ONE));
+ RATE_TWO_TOOLTIP = tooltip_base.printf(get_stars(Rating.TWO));
+ RATE_THREE_TOOLTIP = tooltip_base.printf(get_stars(Rating.THREE));
+ RATE_FOUR_TOOLTIP = tooltip_base.printf(get_stars(Rating.FOUR));
+ RATE_FIVE_TOOLTIP = tooltip_base.printf(get_stars(Rating.FIVE));
+
+ RATE_ONE_PROGRESS = progress_base.printf(get_stars(Rating.ONE));
+ RATE_TWO_PROGRESS = progress_base.printf(get_stars(Rating.TWO));
+ RATE_THREE_PROGRESS = progress_base.printf(get_stars(Rating.THREE));
+ RATE_FOUR_PROGRESS = progress_base.printf(get_stars(Rating.FOUR));
+ RATE_FIVE_PROGRESS = progress_base.printf(get_stars(Rating.FIVE));
+
+ DISPLAY_ONE_OR_HIGHER_MENU = display_rating_or_higher_menu_base.printf(get_stars(Rating.ONE));
+ DISPLAY_TWO_OR_HIGHER_MENU = display_rating_or_higher_menu_base.printf(get_stars(Rating.TWO));
+ DISPLAY_THREE_OR_HIGHER_MENU = display_rating_or_higher_menu_base.printf(get_stars(Rating.THREE));
+ DISPLAY_FOUR_OR_HIGHER_MENU = display_rating_or_higher_menu_base.printf(get_stars(Rating.FOUR));
+ DISPLAY_FIVE_OR_HIGHER_MENU = display_rating_menu_base.printf(get_stars(Rating.FIVE));
+
+ DISPLAY_ONE_OR_HIGHER_LABEL = display_rating_or_higher_label_base.printf(get_stars(Rating.ONE));
+ DISPLAY_TWO_OR_HIGHER_LABEL = display_rating_or_higher_label_base.printf(get_stars(Rating.TWO));
+ DISPLAY_THREE_OR_HIGHER_LABEL = display_rating_or_higher_label_base.printf(get_stars(Rating.THREE));
+ DISPLAY_FOUR_OR_HIGHER_LABEL = display_rating_or_higher_label_base.printf(get_stars(Rating.FOUR));
+ DISPLAY_FIVE_OR_HIGHER_LABEL = display_rating_label_base.printf(get_stars(Rating.FIVE));
+
+ DISPLAY_ONE_OR_HIGHER_TOOLTIP = display_rating_or_higher_tooltip_base.printf(get_stars(Rating.ONE));
+ DISPLAY_TWO_OR_HIGHER_TOOLTIP = display_rating_or_higher_tooltip_base.printf(get_stars(Rating.TWO));
+ DISPLAY_THREE_OR_HIGHER_TOOLTIP = display_rating_or_higher_tooltip_base.printf(get_stars(Rating.THREE));
+ DISPLAY_FOUR_OR_HIGHER_TOOLTIP = display_rating_or_higher_tooltip_base.printf(get_stars(Rating.FOUR));
+ DISPLAY_FIVE_OR_HIGHER_TOOLTIP = display_rating_tooltip_base.printf(get_stars(Rating.FIVE));
+ }
+
+ private string RATE_ONE_MENU;
+ private string RATE_ONE_LABEL;
+ private string RATE_ONE_TOOLTIP;
+ private string RATE_ONE_PROGRESS;
+
+ private string RATE_TWO_MENU;
+ private string RATE_TWO_LABEL;
+ private string RATE_TWO_TOOLTIP;
+ private string RATE_TWO_PROGRESS;
+
+ private string RATE_THREE_MENU;
+ private string RATE_THREE_LABEL;
+ private string RATE_THREE_TOOLTIP;
+ private string RATE_THREE_PROGRESS;
+
+ private string RATE_FOUR_MENU;
+ private string RATE_FOUR_LABEL;
+ private string RATE_FOUR_TOOLTIP;
+ private string RATE_FOUR_PROGRESS;
+
+ private string RATE_FIVE_MENU;
+ private string RATE_FIVE_LABEL;
+ private string RATE_FIVE_TOOLTIP;
+ private string RATE_FIVE_PROGRESS;
+
+ private string DISPLAY_ONE_OR_HIGHER_MENU;
+ private string DISPLAY_ONE_OR_HIGHER_LABEL;
+ private string DISPLAY_ONE_OR_HIGHER_TOOLTIP;
+
+ private string DISPLAY_TWO_OR_HIGHER_MENU;
+ private string DISPLAY_TWO_OR_HIGHER_LABEL;
+ private string DISPLAY_TWO_OR_HIGHER_TOOLTIP;
+
+ private string DISPLAY_THREE_OR_HIGHER_MENU;
+ private string DISPLAY_THREE_OR_HIGHER_LABEL;
+ private string DISPLAY_THREE_OR_HIGHER_TOOLTIP;
+
+ private string DISPLAY_FOUR_OR_HIGHER_MENU;
+ private string DISPLAY_FOUR_OR_HIGHER_LABEL;
+ private string DISPLAY_FOUR_OR_HIGHER_TOOLTIP;
+
+ private string DISPLAY_FIVE_OR_HIGHER_MENU;
+ private string DISPLAY_FIVE_OR_HIGHER_LABEL;
+ private string DISPLAY_FIVE_OR_HIGHER_TOOLTIP;
+
+ public const string DELETE_PHOTOS_MENU = _("_Delete");
+ public const string DELETE_FROM_TRASH_TOOLTIP = _("Remove the selected photos from the trash");
+ public const string DELETE_FROM_LIBRARY_TOOLTIP = _("Remove the selected photos from the library");
+
+ public const string RESTORE_PHOTOS_MENU = _("_Restore");
+ public const string RESTORE_PHOTOS_TOOLTIP = _("Move the selected photos back into the library");
+
+ public const string JUMP_TO_FILE_MENU = _("Show in File Mana_ger");
+ public const string JUMP_TO_FILE_TOOLTIP = _("Open the selected photo's directory in the file manager");
+
+ public string jump_to_file_failed(Error err) {
+ return _("Unable to open in file manager: %s").printf(err.message);
+ }
+
+ public const string REMOVE_FROM_LIBRARY_MENU = _("R_emove From Library");
+
+ public const string MOVE_TO_TRASH_MENU = _("_Move to Trash");
+
+ public const string SELECT_ALL_MENU = _("Select _All");
+ public const string SELECT_ALL_TOOLTIP = _("Select all items");
+
+ private Gtk.IconFactory factory = null;
+ private Gee.HashMap<string, Gdk.Pixbuf> icon_cache = null;
+ Gee.HashMap<string, Gdk.Pixbuf> scaled_icon_cache = null;
+
+ private string HH_MM_FORMAT_STRING = null;
+ private string HH_MM_SS_FORMAT_STRING = null;
+ private string LONG_DATE_FORMAT_STRING = null;
+ private string START_MULTIDAY_DATE_FORMAT_STRING = null;
+ private string END_MULTIDAY_DATE_FORMAT_STRING = null;
+ private string START_MULTIMONTH_DATE_FORMAT_STRING = null;
+
+ public void init () {
+ // load application-wide stock icons as IconSets
+ factory = new Gtk.IconFactory();
+
+ File icons_dir = AppDirs.get_resources_dir().get_child("icons");
+ add_stock_icon(icons_dir.get_child("crop.svg"), CROP);
+ add_stock_icon(icons_dir.get_child("redeye.png"), REDEYE);
+ add_stock_icon(icons_dir.get_child("image-adjust.svg"), ADJUST);
+ add_stock_icon(icons_dir.get_child("pin-toolbar.svg"), PIN_TOOLBAR);
+ add_stock_icon(icons_dir.get_child("make-primary.svg"), MAKE_PRIMARY);
+ add_stock_icon(icons_dir.get_child("import.svg"), IMPORT);
+ add_stock_icon(icons_dir.get_child("straighten.svg"), STRAIGHTEN);
+ add_stock_icon(icons_dir.get_child("import-all.png"), IMPORT_ALL);
+ add_stock_icon(icons_dir.get_child("enhance.png"), ENHANCE);
+ add_stock_icon(icons_dir.get_child("crop-pivot-reticle.png"), CROP_PIVOT_RETICLE);
+ add_stock_icon(icons_dir.get_child("merge.svg"), MERGE);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_FLAGGED_PAGE), ICON_FLAGGED_PAGE);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_VIDEOS_PAGE), ICON_VIDEOS_PAGE);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_SINGLE_PHOTO), ICON_SINGLE_PHOTO);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_CAMERAS), ICON_CAMERAS);
+
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_FILTER_FLAGGED),
+ ICON_FILTER_FLAGGED_DISABLED, dim_pixbuf);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_FILTER_PHOTOS),
+ ICON_FILTER_PHOTOS_DISABLED, dim_pixbuf);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_FILTER_VIDEOS),
+ ICON_FILTER_VIDEOS_DISABLED, dim_pixbuf);
+ add_stock_icon_from_themed_icon(new GLib.ThemedIcon(ICON_FILTER_RAW),
+ ICON_FILTER_RAW_DISABLED, dim_pixbuf);
+
+ factory.add_default();
+
+ generate_rating_strings();
+ }
+
+ public void terminate() {
+ }
+
+ /**
+ * @brief Helper for getting a format string that matches the
+ * user's LC_TIME settings from the system. This is intended
+ * to help support the use case where a user wants the text
+ * from one locale, but the timestamp format of another.
+ *
+ * Stolen wholesale from code written for Geary by Jim Nelson
+ * and from Marcel Stimberg's original patch to Shotwell to
+ * try to fix this; both are graciously thanked for their help.
+ */
+ private void fetch_lc_time_format() {
+ // temporarily unset LANGUAGE, as it interferes with LC_TIME
+ // and friends.
+ string? old_language = Environment.get_variable("LANGUAGE");
+ if (old_language != null) {
+ Environment.unset_variable("LANGUAGE");
+ }
+
+ // switch LC_MESSAGES to LC_TIME...
+ string? old_messages = Intl.setlocale(LocaleCategory.MESSAGES, null);
+ string? lc_time = Intl.setlocale(LocaleCategory.TIME, null);
+
+ if (lc_time != null) {
+ Intl.setlocale(LocaleCategory.MESSAGES, lc_time);
+ }
+
+ // ...precache the timestamp string...
+ /// Locale-specific time format for 12-hour time, i.e. 8:31 PM
+ /// Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ HH_MM_FORMAT_STRING = _("%-I:%M %p");
+
+ /// Locale-specific time format for 12-hour time with seconds, i.e. 8:31:42 PM
+ /// Precede modifier with a dash ("-") to pad with spaces, otherwise will pad with zeroes
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ HH_MM_SS_FORMAT_STRING = _("%-I:%M:%S %p");
+
+ /// Locale-specific calendar date format, i.e. "Tue Mar 08, 2006"
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ LONG_DATE_FORMAT_STRING = _("%a %b %d, %Y");
+
+ /// Locale-specific starting date format for multi-date strings,
+ /// i.e. the "Tue Mar 08" in "Tue Mar 08 - 10, 2006"
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ START_MULTIDAY_DATE_FORMAT_STRING = _("%a %b %d");
+
+ /// Locale-specific ending date format for multi-date strings,
+ /// i.e. the "10, 2006" in "Tue Mar 08 - 10, 2006"
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ END_MULTIDAY_DATE_FORMAT_STRING = _("%d, %Y");
+
+ /// Locale-specific calendar date format for multi-month strings,
+ /// i.e. the "Tue Mar 08" in "Tue Mar 08 to Mon Apr 06, 2006"
+ /// See http://developer.gnome.org/glib/2.32/glib-GDateTime.html#g-date-time-format
+ START_MULTIMONTH_DATE_FORMAT_STRING = _("%a %b %d");
+
+ // ...put everything back like we found it.
+ if (old_messages != null) {
+ Intl.setlocale(LocaleCategory.MESSAGES, old_messages);
+ }
+
+ if (old_language != null) {
+ Environment.set_variable("LANGUAGE", old_language, true);
+ }
+ }
+
+ /**
+ * @brief Returns a precached format string that matches the
+ * user's LC_TIME settings.
+ */
+ public string get_hh_mm_format_string() {
+ if (HH_MM_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return HH_MM_FORMAT_STRING;
+ }
+
+ public string get_hh_mm_ss_format_string() {
+ if (HH_MM_SS_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return HH_MM_SS_FORMAT_STRING;
+ }
+
+ public string get_long_date_format_string() {
+ if (LONG_DATE_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return LONG_DATE_FORMAT_STRING;
+ }
+
+ public string get_start_multiday_span_format_string() {
+ if (START_MULTIDAY_DATE_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return START_MULTIDAY_DATE_FORMAT_STRING;
+ }
+
+ public string get_end_multiday_span_format_string() {
+ if (END_MULTIDAY_DATE_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return END_MULTIDAY_DATE_FORMAT_STRING;
+ }
+
+ public string get_start_multimonth_span_format_string() {
+ if (START_MULTIMONTH_DATE_FORMAT_STRING == null) {
+ fetch_lc_time_format();
+ }
+
+ return START_MULTIMONTH_DATE_FORMAT_STRING;
+ }
+
+ public string get_end_multimonth_span_format_string() {
+ return get_long_date_format_string();
+ }
+
+ public File get_ui(string filename) {
+ return AppDirs.get_resources_dir().get_child("ui").get_child(filename);
+ }
+
+ private const string NONINTERPRETABLE_BADGE_FILE = "noninterpretable-video.png";
+ private Gdk.Pixbuf? noninterpretable_badge_pixbuf = null;
+
+ public Gdk.Pixbuf? get_noninterpretable_badge_pixbuf() {
+ if (noninterpretable_badge_pixbuf == null) {
+ try {
+ noninterpretable_badge_pixbuf = new Gdk.Pixbuf.from_file(AppDirs.get_resources_dir().get_child(
+ "icons").get_child(NONINTERPRETABLE_BADGE_FILE).get_path());
+ } catch (Error err) {
+ error("VideoReader can't load noninterpretable badge image: %s", err.message);
+ }
+ }
+
+ return noninterpretable_badge_pixbuf;
+ }
+
+ public Gtk.IconTheme get_icon_theme_engine() {
+ Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default();
+ icon_theme.append_search_path(AppDirs.get_resources_dir().get_child("icons").get_path());
+
+ return icon_theme;
+ }
+
+ // This method returns a reference to a cached pixbuf that may be shared throughout the system.
+ // If the pixbuf is to be modified, make a copy of it.
+ public Gdk.Pixbuf? get_icon(string name, int scale = DEFAULT_ICON_SCALE) {
+ if (scaled_icon_cache != null) {
+ string scaled_name = "%s-%d".printf(name, scale);
+ if (scaled_icon_cache.has_key(scaled_name))
+ return scaled_icon_cache.get(scaled_name);
+ }
+
+ // stash icons not available through the UI Manager (i.e. used directly as pixbufs)
+ // in the local cache
+ if (icon_cache == null)
+ icon_cache = new Gee.HashMap<string, Gdk.Pixbuf>();
+
+ // fetch from cache and if not present, from disk
+ Gdk.Pixbuf? pixbuf = icon_cache.get(name);
+ if (pixbuf == null) {
+ pixbuf = load_icon(name, 0);
+ if (pixbuf == null)
+ return null;
+
+ icon_cache.set(name, pixbuf);
+ }
+
+ if (scale <= 0)
+ return pixbuf;
+
+ Gdk.Pixbuf scaled_pixbuf = scale_pixbuf(pixbuf, scale, Gdk.InterpType.BILINEAR, false);
+
+ if (scaled_icon_cache == null)
+ scaled_icon_cache = new Gee.HashMap<string, Gdk.Pixbuf>();
+
+ scaled_icon_cache.set("%s-%d".printf(name, scale), scaled_pixbuf);
+
+ return scaled_pixbuf;
+ }
+
+ public Gdk.Pixbuf? load_icon(string name, int scale = DEFAULT_ICON_SCALE) {
+ File icons_dir = AppDirs.get_resources_dir().get_child("icons");
+
+ Gdk.Pixbuf pixbuf = null;
+ try {
+ pixbuf = new Gdk.Pixbuf.from_file(icons_dir.get_child(name).get_path());
+ } catch (Error err) {
+ critical("Unable to load icon %s: %s", name, err.message);
+ }
+
+ if (pixbuf == null)
+ return null;
+
+ return (scale > 0) ? scale_pixbuf(pixbuf, scale, Gdk.InterpType.BILINEAR, false) : pixbuf;
+ }
+
+ private void add_stock_icon(File file, string stock_id) {
+ Gdk.Pixbuf pixbuf = null;
+ try {
+ pixbuf = new Gdk.Pixbuf.from_file(file.get_path());
+ } catch (Error err) {
+ critical("Unable to load stock icon %s: %s", stock_id, err.message);
+ }
+
+ Gtk.IconSet icon_set = new Gtk.IconSet.from_pixbuf(pixbuf);
+ factory.add(stock_id, icon_set);
+ }
+
+ public delegate void AddStockIconModify(Gdk.Pixbuf pixbuf);
+
+ private void add_stock_icon_from_themed_icon(GLib.ThemedIcon gicon, string stock_id,
+ AddStockIconModify? modify = null) {
+ Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default();
+ icon_theme.append_search_path(AppDirs.get_resources_dir().get_child("icons").get_path());
+
+ Gtk.IconInfo? info = icon_theme.lookup_by_gicon(gicon,
+ Resources.DEFAULT_ICON_SCALE, Gtk.IconLookupFlags.FORCE_SIZE);
+ if (info == null) {
+ debug("unable to load icon for: %s", stock_id);
+ return;
+ }
+
+ try {
+ Gdk.Pixbuf pix = info.load_icon();
+ if (modify != null) {
+ modify(pix);
+ }
+ Gtk.IconSet icon_set = new Gtk.IconSet.from_pixbuf(pix);
+ factory.add(stock_id, icon_set);
+ } catch (Error err) {
+ debug("%s", err.message);
+ }
+ }
+
+ // Get the directory where our help files live. Returns a string
+ // describing the help path we want, or, if we're installed system
+ // -wide already, returns null.
+ public static string? get_help_path() {
+ // Try looking for our 'index.page' in the build directory.
+ //
+ // TODO: Need to look for internationalized help before falling back on help/C
+
+ File help_dir = AppDirs.get_exec_dir().get_child("help").get_child("C");
+ File help_index = help_dir.get_child("index.page");
+
+ if (help_index.query_exists(null)) {
+ string help_path;
+
+ help_path = help_dir.get_path();
+
+ if (!help_path.has_suffix("/"))
+ help_path += "/";
+
+ // Found it.
+ return help_path;
+ }
+
+ // "./help/C/index.page" doesn't exist, so we're installed
+ // system-wide, and the caller should assume the default
+ // help location.
+ return null;
+ }
+
+ public static void launch_help(Gdk.Screen screen, string? anchor=null) throws Error {
+ string? help_path = get_help_path();
+
+ if(help_path != null) {
+ // We're running from the build directory; use local help.
+
+ // Allow the caller to request a specific page.
+ if (anchor != null) {
+ help_path +=anchor;
+ }
+
+ string[] argv = new string[3];
+ argv[0] = "gnome-help";
+ argv[1] = help_path;
+ argv[2] = null;
+
+ Pid pid;
+ if (Process.spawn_async(AppDirs.get_exec_dir().get_path(), argv, null,
+ SpawnFlags.SEARCH_PATH | SpawnFlags.STDERR_TO_DEV_NULL, null, out pid)) {
+ return;
+ }
+
+ warning("Unable to launch %s", argv[0]);
+ }
+
+ // launch from system-installed help
+ if (anchor != null) {
+ sys_show_uri(screen, "ghelp:shotwell" + anchor);
+ } else {
+ sys_show_uri(screen, "ghelp:shotwell");
+ }
+ }
+
+ public string to_css_color(Gdk.RGBA color) {
+ int r = (int) (color.red * 255);
+ int g = (int) (color.green * 255);
+ int b = (int) (color.blue * 255);
+
+ return "rgb(%d, %d, %d)".printf(r, g, b);
+ }
+
+ public const int ALL_DATA = -1;
+
+ private static Gee.Map<Gtk.Widget, Gtk.CssProvider> providers = null;
+
+ public static void style_widget(Gtk.Widget widget, string stylesheet) {
+ if (providers == null)
+ providers = new Gee.HashMap<Gtk.Widget, Gtk.CssProvider>();
+
+ if (providers.has_key(widget))
+ widget.get_style_context().remove_provider(providers.get(widget));
+
+ Gtk.CssProvider styler = new Gtk.CssProvider();
+
+ try {
+ styler.load_from_data(stylesheet, ALL_DATA);
+ } catch (Error e) {
+ warning("couldn't parse widget stylesheet '%s': %s", stylesheet,
+ e.message);
+ // short-circuit return -- if the stylesheet couldn't be interpreted
+ // then we can't do anything more
+ return;
+ }
+
+ widget.get_style_context().add_provider(styler,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+ providers.set(widget, styler);
+ }
+
+ public const string INSET_FRAME_STYLESHEET =
+ """ .frame {
+ border-style: inset;
+ border-width: 1px;
+ }""";
+
+ public const string SCROLL_FRAME_STYLESHEET =
+ """ GtkScrolledWindow {
+ border-width: 0;
+ border-style: none;
+ border-radius: 0;
+ padding: 0;
+ }
+
+ .frame {
+ border-width: 1px;
+ border-style: inset;
+ }""";
+
+ public const string PAGE_STYLESHEET =
+ """ .frame {
+ border-width: 1px;
+ border-style: inset;
+ border-radius: 0;
+
+ padding: 0;
+ }""";
+
+ public const string VIEWPORT_STYLESHEET =
+ """ GtkViewport {
+ border-width: 1px;
+ border-style: inset;
+ border-radius: 0;
+ padding: 0;
+ }""";
+
+ public const string TOOLBAR_STYLESHEET_TEMPLATE =
+ """
+ @define-color primary-bg %s;
+
+ .toolbar {
+ background-color: @primary-bg;
+ border-width: 1px;
+ border-color: shade (@primary-bg, 0.75);
+ border-style: solid;
+ }""";
+
+ public const string SEARCH_BUTTON_STYLESHEET_TEMPLATE =
+ """
+ @define-color primary-bg %s;
+
+ .button {
+ background-image: none;
+ background-color: @primary-bg;
+ border-image: none;
+ border-color: shade (@primary-bg, 0.75) @primary-bg shade (@primary-bg, 0.75) @primary-bg;
+ border-style: solid;
+ margin: 5px;
+
+ -unico-border-gradient: none;
+ -unico-outer-stroke-width: 0;
+ -unico-outer-stroke-gradient: none;
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-width: 0;
+ -unico-inner-stroke-color: shade (@primary-bg, 1.1);
+ }
+
+ .button:prelight {
+ border-style: solid;
+ border-width: 1px;
+ border-color: shade (@primary-bg, 1.1);
+
+ -unico-inner-stroke-color: shade (@primary-bg, 1.1);
+ -unico-inner-stroke-width: 0;
+
+ -unico-outer-stroke-width: 1px;
+ -unico-outer-stroke-color: shade (@primary-bg, 0.8);
+ }
+
+ .button:active {
+ background-image: none;
+ background-color: shade (@primary-bg, 0.75);
+ border-style: solid;
+ border-width: 1px;
+ border-color: shade (@primary-bg, 0.6);
+
+ -unico-outer-stroke-width: 1px;
+ -unico-outer-stroke-color: shade (@primary-bg, 1.1);
+ }""";
+
+ public const string ONIMAGE_FONT_COLOR = "#000000";
+ public const string ONIMAGE_FONT_BACKGROUND = "rgba(255,255,255,0.5)";
+}
+
diff --git a/src/Screensaver.vala b/src/Screensaver.vala
new file mode 100644
index 0000000..d00af21
--- /dev/null
+++ b/src/Screensaver.vala
@@ -0,0 +1,29 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class Screensaver {
+ private uint32 cookie = 0;
+
+ public Screensaver() {
+ }
+
+ public void inhibit(string reason) {
+ if (cookie != 0)
+ return;
+
+ cookie = Application.get_instance().inhibit(
+ Gtk.ApplicationInhibitFlags.IDLE | Gtk.ApplicationInhibitFlags.SUSPEND, _("Slideshow"));
+ }
+
+ public void uninhibit() {
+ if (cookie == 0)
+ return;
+
+ Application.get_instance().uninhibit(cookie);
+ cookie = 0;
+ }
+}
+
diff --git a/src/SearchFilter.vala b/src/SearchFilter.vala
new file mode 100644
index 0000000..9769195
--- /dev/null
+++ b/src/SearchFilter.vala
@@ -0,0 +1,1252 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Bitfield values used to specify which search bar features we want.
+[Flags]
+public enum SearchFilterCriteria {
+ NONE = 0,
+ RECURSIVE,
+ TEXT,
+ FLAG,
+ MEDIA,
+ RATING,
+ ALL = 0xFFFFFFFF
+}
+
+public enum RatingFilter {
+ NO_FILTER = 0,
+ REJECTED_OR_HIGHER = 1,
+ UNRATED_OR_HIGHER = 2,
+ ONE_OR_HIGHER = 3,
+ TWO_OR_HIGHER = 4,
+ THREE_OR_HIGHER = 5,
+ FOUR_OR_HIGHER = 6,
+ FIVE_OR_HIGHER = 7,
+ REJECTED_ONLY = 8,
+ UNRATED_ONLY = 9,
+ ONE_ONLY = 10,
+ TWO_ONLY = 11,
+ THREE_ONLY = 12,
+ FOUR_ONLY = 13,
+ FIVE_ONLY = 14
+}
+
+ // Handles filtering via rating and text.
+public abstract class SearchViewFilter : ViewFilter {
+ // If this is true, allow the current rating or higher.
+ private bool rating_allow_higher = true;
+
+ // Rating to filter by.
+ private Rating rating = Rating.UNRATED;
+ private RatingFilter rating_filter = RatingFilter.UNRATED_OR_HIGHER;
+
+ // Show flagged only if set to true.
+ public bool flagged { get; set; default = false; }
+
+ // Media types.
+ public bool show_media_video { get; set; default = true; }
+ public bool show_media_photos { get; set; default = true; }
+ public bool show_media_raw { get; set; default = true; }
+
+ // Search text filter. Should only be set to lower-case.
+ private string? search_filter = null;
+ private string[]? search_filter_words = null;
+
+ // Returns a bitmask of SearchFilterCriteria.
+ // IMPORTANT: There is no signal on this, changing this value after the
+ // view filter is installed will NOT update the GUI.
+ public abstract uint get_criteria();
+
+ public void set_rating_filter(RatingFilter rf) {
+ rating_filter = rf;
+ switch (rating_filter) {
+ case RatingFilter.REJECTED_ONLY:
+ rating = Rating.REJECTED;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.REJECTED_OR_HIGHER:
+ rating = Rating.REJECTED;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.ONE_OR_HIGHER:
+ rating = Rating.ONE;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.ONE_ONLY:
+ rating = Rating.ONE;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.TWO_OR_HIGHER:
+ rating = Rating.TWO;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.TWO_ONLY:
+ rating = Rating.TWO;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.THREE_OR_HIGHER:
+ rating = Rating.THREE;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.THREE_ONLY:
+ rating = Rating.THREE;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.FOUR_OR_HIGHER:
+ rating = Rating.FOUR;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.FOUR_ONLY:
+ rating = Rating.FOUR;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.FIVE_OR_HIGHER:
+ rating = Rating.FIVE;
+ rating_allow_higher = true;
+ break;
+
+ case RatingFilter.FIVE_ONLY:
+ rating = Rating.FIVE;
+ rating_allow_higher = false;
+ break;
+
+ case RatingFilter.UNRATED_OR_HIGHER:
+ default:
+ rating = Rating.UNRATED;
+ rating_allow_higher = true;
+ break;
+ }
+ }
+
+ public bool has_search_filter() {
+ return !is_string_empty(search_filter);
+ }
+
+ public unowned string? get_search_filter() {
+ return search_filter;
+ }
+
+ public unowned string[]? get_search_filter_words() {
+ return search_filter_words;
+ }
+
+ public void set_search_filter(string? text) {
+ search_filter = !is_string_empty(text) ? text.down() : null;
+ search_filter_words = search_filter != null ? search_filter.split(" ") : null;
+ }
+
+ public void clear_search_filter() {
+ search_filter = null;
+ search_filter_words = null;
+ }
+
+ public bool get_rating_allow_higher() {
+ return rating_allow_higher;
+ }
+
+ public Rating get_rating() {
+ return rating;
+ }
+
+ public bool filter_by_media_type() {
+ return ((show_media_video || show_media_photos || show_media_raw) &&
+ !(show_media_video && show_media_photos && show_media_raw));
+ }
+}
+
+// This class provides a default predicate implementation used for CollectionPage
+// as well as Trash and Offline.
+public abstract class DefaultSearchViewFilter : SearchViewFilter {
+ public override bool predicate(DataView view) {
+ MediaSource source = ((Thumbnail) view).get_media_source();
+ uint criteria = get_criteria();
+
+ // Ratings filter
+ if ((SearchFilterCriteria.RATING & criteria) != 0) {
+ if (get_rating_allow_higher() && source.get_rating() < get_rating())
+ return false;
+ else if (!get_rating_allow_higher() && source.get_rating() != get_rating())
+ return false;
+ }
+
+ // Flag state.
+ if ((SearchFilterCriteria.FLAG & criteria) != 0) {
+ if (flagged && source is Flaggable && !((Flaggable) source).is_flagged())
+ return false;
+ }
+
+ // Media type.
+ if (((SearchFilterCriteria.MEDIA & criteria) != 0) && filter_by_media_type()) {
+ if (source is VideoSource) {
+ if (!show_media_video)
+ return false;
+ } else if (source is Photo) {
+ Photo photo = source as Photo;
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ if (photo.is_raw_developer_available(RawDeveloper.CAMERA)) {
+ if (!show_media_photos && !show_media_raw)
+ return false;
+ } else if (!show_media_raw) {
+ return false;
+ }
+ } else if (!show_media_photos)
+ return false;
+ }
+ }
+
+ if (((SearchFilterCriteria.TEXT & criteria) != 0) && has_search_filter()) {
+ unowned string? media_keywords = source.get_indexable_keywords();
+
+ unowned string? event_keywords = null;
+ Event? event = source.get_event();
+ if (event != null)
+ event_keywords = event.get_indexable_keywords();
+
+ Gee.List<Tag>? tags = Tag.global.fetch_for_source(source);
+ int tags_size = (tags != null) ? tags.size : 0;
+
+ foreach (unowned string word in get_search_filter_words()) {
+ if (media_keywords != null && media_keywords.contains(word))
+ continue;
+
+ if (event_keywords != null && event_keywords.contains(word))
+ continue;
+
+ if (tags_size > 0) {
+ bool found = false;
+ for (int ctr = 0; ctr < tags_size; ctr++) {
+ unowned string? tag_keywords = tags[ctr].get_indexable_keywords();
+ if (tag_keywords != null && tag_keywords.contains(word)) {
+ found = true;
+
+ break;
+ }
+ }
+
+ if (found)
+ continue;
+ }
+
+ // failed all tests (this even works if none of the Indexables have strings,
+ // as they fail the implicit AND test)
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
+public class DisabledViewFilter : SearchViewFilter {
+ public override bool predicate(DataView view) {
+ return true;
+ }
+
+ public override uint get_criteria() {
+ return SearchFilterCriteria.RATING;
+ }
+}
+
+public class TextAction {
+ public string? value {
+ get {
+ return text;
+ }
+ }
+
+ private string? text = null;
+ private bool sensitive = true;
+ private bool visible = true;
+
+ public signal void text_changed(string? text);
+
+ public signal void sensitivity_changed(bool sensitive);
+
+ public signal void visibility_changed(bool visible);
+
+ public TextAction(string? init = null) {
+ text = init;
+ }
+
+ public void set_text(string? text) {
+ if (this.text != text) {
+ this.text = text;
+ text_changed(text);
+ }
+ }
+
+ public void clear() {
+ set_text(null);
+ }
+
+ public bool is_sensitive() {
+ return sensitive;
+ }
+
+ public void set_sensitive(bool sensitive) {
+ if (this.sensitive != sensitive) {
+ this.sensitive = sensitive;
+ sensitivity_changed(sensitive);
+ }
+ }
+
+ public bool is_visible() {
+ return visible;
+ }
+
+ public void set_visible(bool visible) {
+ if (this.visible != visible) {
+ this.visible = visible;
+ visibility_changed(visible);
+ }
+ }
+}
+
+
+public class SearchFilterActions {
+ public unowned Gtk.ToggleAction? flagged {
+ get {
+ return get_action("CommonDisplayFlagged") as Gtk.ToggleAction;
+ }
+ }
+
+ public unowned Gtk.ToggleAction? photos {
+ get {
+ return get_action("CommonDisplayPhotos") as Gtk.ToggleAction;
+ }
+ }
+
+ public unowned Gtk.ToggleAction? videos {
+ get {
+ return get_action("CommonDisplayVideos") as Gtk.ToggleAction;
+ }
+ }
+
+ public unowned Gtk.ToggleAction? raw {
+ get {
+ return get_action("CommonDisplayRaw") as Gtk.ToggleAction;
+ }
+ }
+
+ public unowned Gtk.RadioAction? rating {
+ get {
+ return get_action("CommonDisplayUnratedOrHigher") as Gtk.RadioAction;
+ }
+ }
+
+ public unowned TextAction text {
+ get {
+ assert(_text != null);
+ return _text;
+ }
+ }
+
+ private Gtk.ActionGroup action_group = new Gtk.ActionGroup("SearchFilterActionGroup");
+ private SearchFilterCriteria criteria = SearchFilterCriteria.ALL;
+ private TextAction? _text = null;
+ private bool has_flagged = true;
+ private bool has_photos = true;
+ private bool has_videos = true;
+ private bool has_raw = true;
+ private bool can_filter_by_stars = true;
+
+ public signal void flagged_toggled(bool on);
+
+ public signal void photos_toggled(bool on);
+
+ public signal void videos_toggled(bool on);
+
+ public signal void raw_toggled(bool on);
+
+ public signal void rating_changed(RatingFilter filter);
+
+ public signal void text_changed(string? text);
+
+ /**
+ * fired when the kinds of media present in the current view change (e.g., a video becomes
+ * available in the view through a new import operation or no raw photos are available in
+ * the view anymore because the last one was moved to the trash)
+ */
+ public signal void media_context_changed(bool has_photos, bool has_videos, bool has_raw,
+ bool has_flagged);
+
+ // Ticket #3290 - Hide some search bar fields when they
+ // cannot be used.
+ // Part 1 - we use this to announce when the criteria have changed,
+ // and the toolbar can listen for it and hide or show widgets accordingly.
+ public signal void criteria_changed();
+
+ public SearchFilterActions() {
+ // the getters defined above should not be used until register() returns
+ register();
+
+ text.text_changed.connect(on_text_changed);
+ }
+
+ public Gtk.ActionGroup get_action_group() {
+ return action_group;
+ }
+
+ public SearchFilterCriteria get_criteria() {
+ return criteria;
+ }
+
+ public unowned Gtk.Action? get_action(string name) {
+ return action_group.get_action(name);
+ }
+
+ public void set_action_sensitive(string name, bool sensitive) {
+ Gtk.Action? action = get_action(name);
+ if (action != null)
+ action.sensitive = sensitive;
+ }
+
+ public void reset() {
+ flagged.active = false;
+ photos.active = false;
+ raw.active = false;
+ videos.active = false;
+ rating.current_value = RatingFilter.UNRATED_OR_HIGHER;
+ text.set_text(null);
+ }
+
+ public void set_sensitive_for_search_criteria(SearchFilterCriteria criteria) {
+ this.criteria = criteria;
+ update_sensitivities();
+
+ // Announce that we've gotten a new criteria...
+ criteria_changed();
+ }
+
+ public void monitor_page_contents(Page? old_page, Page? new_page) {
+ CheckerboardPage? old_tracked_page = old_page as CheckerboardPage;
+ if (old_tracked_page != null) {
+ Core.ViewTracker? tracker = old_tracked_page.get_view_tracker();
+ if (tracker is MediaViewTracker)
+ tracker.updated.disconnect(on_media_tracker_updated);
+ else if (tracker is CameraViewTracker)
+ tracker.updated.disconnect(on_camera_tracker_updated);
+ }
+
+ CheckerboardPage? new_tracked_page = new_page as CheckerboardPage;
+ if (new_tracked_page != null) {
+ can_filter_by_stars = true;
+
+ Core.ViewTracker? tracker = new_tracked_page.get_view_tracker();
+ if (tracker is MediaViewTracker) {
+ tracker.updated.connect(on_media_tracker_updated);
+ on_media_tracker_updated(tracker);
+
+ return;
+ } else if (tracker is CameraViewTracker) {
+ tracker.updated.connect(on_camera_tracker_updated);
+ on_camera_tracker_updated(tracker);
+
+ return;
+ }
+ }
+
+ // go with default behavior of making none of the filters available.
+ has_flagged = false;
+ has_photos = false;
+ has_videos = false;
+ has_raw = false;
+ can_filter_by_stars = false;
+
+ update_sensitivities();
+ }
+
+ private void on_media_tracker_updated(Core.Tracker t) {
+ MediaViewTracker tracker = (MediaViewTracker) t;
+
+ has_flagged = tracker.all.flagged > 0;
+ has_photos = tracker.all.photos > 0;
+ has_videos = tracker.all.videos > 0;
+ has_raw = tracker.all.raw > 0;
+
+ update_sensitivities();
+ }
+
+ private void on_camera_tracker_updated(Core.Tracker t) {
+ CameraViewTracker tracker = (CameraViewTracker) t;
+
+ has_flagged = false;
+ has_photos = tracker.all.photos > 0;
+ has_videos = tracker.all.videos > 0;
+ has_raw = tracker.all.raw > 0;
+
+ update_sensitivities();
+ }
+
+ private void update_sensitivities() {
+ flagged.set_stock_id(((SearchFilterCriteria.FLAG & criteria) != 0 && has_flagged) ?
+ Resources.ICON_FILTER_FLAGGED : Resources.ICON_FILTER_FLAGGED_DISABLED);
+
+ bool allow_media = (SearchFilterCriteria.MEDIA & criteria) != 0;
+ videos.set_stock_id((allow_media && has_videos) ?
+ Resources.ICON_FILTER_VIDEOS : Resources.ICON_FILTER_VIDEOS_DISABLED);
+ photos.set_stock_id((allow_media && has_photos) ?
+ Resources.ICON_FILTER_PHOTOS : Resources.ICON_FILTER_PHOTOS_DISABLED);
+ raw.set_stock_id((allow_media && has_raw) ?
+ Resources.ICON_FILTER_RAW : Resources.ICON_FILTER_RAW_DISABLED);
+
+ bool allow_ratings = (SearchFilterCriteria.RATING & criteria) != 0;
+ set_action_sensitive("CommonDisplayRejectedOnly", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayRejectedOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayUnratedOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayOneOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayTwoOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayThreeOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayFourOrHigher", allow_ratings & can_filter_by_stars);
+ set_action_sensitive("CommonDisplayFiveOrHigher", allow_ratings & can_filter_by_stars);
+
+ // Ticket #3343 - Don't disable the text field, even
+ // when no searchable items are available.
+ text.set_sensitive(true);
+
+ media_context_changed(has_photos, has_videos, has_raw, has_flagged);
+ }
+
+ private void on_text_changed(TextAction action, string? text) {
+ text_changed(text);
+ }
+
+ private void register() {
+ _text = new TextAction();
+
+ Gtk.RadioActionEntry[] view_filter_actions = new Gtk.RadioActionEntry[0];
+
+ Gtk.RadioActionEntry rejected_only = { "CommonDisplayRejectedOnly", null, TRANSLATABLE,
+ "<Ctrl>8", TRANSLATABLE, RatingFilter.REJECTED_ONLY };
+ rejected_only.label = Resources.DISPLAY_REJECTED_ONLY_MENU;
+ rejected_only.tooltip = Resources.DISPLAY_REJECTED_ONLY_TOOLTIP;
+ view_filter_actions += rejected_only;
+
+ Gtk.RadioActionEntry rejected_or_higher = { "CommonDisplayRejectedOrHigher", null, TRANSLATABLE,
+ "<Ctrl>9", TRANSLATABLE, RatingFilter.REJECTED_OR_HIGHER };
+ rejected_or_higher.label = Resources.DISPLAY_REJECTED_OR_HIGHER_MENU;
+ rejected_or_higher.tooltip = Resources.DISPLAY_REJECTED_OR_HIGHER_TOOLTIP;
+ view_filter_actions += rejected_or_higher;
+
+ Gtk.RadioActionEntry unrated_or_higher = { "CommonDisplayUnratedOrHigher", null, TRANSLATABLE,
+ "<Ctrl>0", TRANSLATABLE, RatingFilter.UNRATED_OR_HIGHER };
+ unrated_or_higher.label = Resources.DISPLAY_UNRATED_OR_HIGHER_MENU;
+ unrated_or_higher.tooltip = Resources.DISPLAY_UNRATED_OR_HIGHER_TOOLTIP;
+ view_filter_actions += unrated_or_higher;
+
+ Gtk.RadioActionEntry one_or_higher = { "CommonDisplayOneOrHigher", null, TRANSLATABLE,
+ "<Ctrl>1", TRANSLATABLE, RatingFilter.ONE_OR_HIGHER };
+ one_or_higher.label = Resources.DISPLAY_ONE_OR_HIGHER_MENU;
+ one_or_higher.tooltip = Resources.DISPLAY_ONE_OR_HIGHER_TOOLTIP;
+ view_filter_actions += one_or_higher;
+
+ Gtk.RadioActionEntry two_or_higher = { "CommonDisplayTwoOrHigher", null, TRANSLATABLE,
+ "<Ctrl>2", TRANSLATABLE, RatingFilter.TWO_OR_HIGHER };
+ two_or_higher.label = Resources.DISPLAY_TWO_OR_HIGHER_MENU;
+ two_or_higher.tooltip = Resources.DISPLAY_TWO_OR_HIGHER_TOOLTIP;
+ view_filter_actions += two_or_higher;
+
+ Gtk.RadioActionEntry three_or_higher = { "CommonDisplayThreeOrHigher", null, TRANSLATABLE,
+ "<Ctrl>3", TRANSLATABLE, RatingFilter.THREE_OR_HIGHER };
+ three_or_higher.label = Resources.DISPLAY_THREE_OR_HIGHER_MENU;
+ three_or_higher.tooltip = Resources.DISPLAY_THREE_OR_HIGHER_TOOLTIP;
+ view_filter_actions += three_or_higher;
+
+ Gtk.RadioActionEntry four_or_higher = { "CommonDisplayFourOrHigher", null, TRANSLATABLE,
+ "<Ctrl>4", TRANSLATABLE, RatingFilter.FOUR_OR_HIGHER };
+ four_or_higher.label = Resources.DISPLAY_FOUR_OR_HIGHER_MENU;
+ four_or_higher.tooltip = Resources.DISPLAY_FOUR_OR_HIGHER_TOOLTIP;
+ view_filter_actions += four_or_higher;
+
+ Gtk.RadioActionEntry five_or_higher = { "CommonDisplayFiveOrHigher", null, TRANSLATABLE,
+ "<Ctrl>5", TRANSLATABLE, RatingFilter.FIVE_OR_HIGHER };
+ five_or_higher.label = Resources.DISPLAY_FIVE_OR_HIGHER_MENU;
+ five_or_higher.tooltip = Resources.DISPLAY_FIVE_OR_HIGHER_TOOLTIP;
+ view_filter_actions += five_or_higher;
+
+ action_group.add_radio_actions(view_filter_actions, RatingFilter.UNRATED_OR_HIGHER,
+ on_rating_changed);
+
+ Gtk.ToggleActionEntry[] toggle_actions = new Gtk.ToggleActionEntry[0];
+
+ Gtk.ToggleActionEntry flagged_action = { "CommonDisplayFlagged", Resources.ICON_FILTER_FLAGGED,
+ TRANSLATABLE, null, TRANSLATABLE, on_flagged_toggled, false };
+ flagged_action.label = _("Flagged");
+ flagged_action.tooltip = _("Flagged");
+ toggle_actions += flagged_action;
+
+ Gtk.ToggleActionEntry photos_action = { "CommonDisplayPhotos", Resources.ICON_FILTER_PHOTOS,
+ TRANSLATABLE, null, TRANSLATABLE, on_photos_toggled, false };
+ photos_action.label = _("Photos");
+ photos_action.tooltip = _("Photos");
+ toggle_actions += photos_action;
+
+ Gtk.ToggleActionEntry videos_action = { "CommonDisplayVideos", Resources.ICON_FILTER_VIDEOS,
+ TRANSLATABLE, null, TRANSLATABLE, on_videos_toggled, false };
+ videos_action.label = _("Videos");
+ videos_action.tooltip = _("Videos");
+ toggle_actions += videos_action;
+
+ Gtk.ToggleActionEntry raw_action = { "CommonDisplayRaw", Resources.ICON_FILTER_RAW, TRANSLATABLE,
+ null, TRANSLATABLE, on_raw_toggled, false };
+ raw_action.label = _("RAW Photos");
+ raw_action.tooltip = _("RAW photos");
+ toggle_actions += raw_action;
+
+ action_group.add_toggle_actions(toggle_actions, this);
+ }
+
+ private void on_rating_changed(Gtk.Action action, Gtk.Action current) {
+ rating_changed((RatingFilter) ((Gtk.RadioAction) current).get_current_value());
+ }
+
+ private void on_flagged_toggled(Gtk.Action action) {
+ flagged_toggled(((Gtk.ToggleAction) action).active);
+ }
+
+ private void on_photos_toggled(Gtk.Action action) {
+ photos_toggled(((Gtk.ToggleAction) action).active);
+ }
+
+ private void on_videos_toggled(Gtk.Action action) {
+ videos_toggled(((Gtk.ToggleAction) action).active);
+ }
+
+ private void on_raw_toggled(Gtk.Action action) {
+ raw_toggled(((Gtk.ToggleAction) action).active);
+ }
+
+ public bool get_has_photos() {
+ return has_photos;
+ }
+
+ public bool get_has_videos() {
+ return has_videos;
+ }
+
+ public bool get_has_raw() {
+ return has_raw;
+ }
+
+ public bool get_has_flagged() {
+ return has_flagged;
+ }
+}
+
+public class SearchFilterToolbar : Gtk.Toolbar {
+ private const int FILTER_BUTTON_MARGIN = 12; // the distance between icon and edge of button
+ private const float FILTER_ICON_STAR_SCALE = 0.65f; // changes the size of the filter icon
+ private const float FILTER_ICON_SCALE = 0.75f; // changes the size of the all photos icon
+
+ // filter_icon_base_width is the width (in px) of a single filter icon such as one star or an "X"
+ private const int FILTER_ICON_BASE_WIDTH = 30;
+ // filter_icon_plus_width is the width (in px) of the plus icon
+ private const int FILTER_ICON_PLUS_WIDTH = 20;
+
+ private class LabelToolItem : Gtk.ToolItem {
+ private Gtk.Label label;
+
+ public LabelToolItem(string s, int left_padding = 0, int right_padding = 0) {
+ label = new Gtk.Label(s);
+ if (left_padding != 0 || right_padding != 0) {
+ Gtk.Alignment alignment = new Gtk.Alignment(0, 0.5f, 0, 0);
+ alignment.add(label);
+ alignment.left_padding = left_padding;
+ alignment.right_padding = right_padding;
+ add(alignment);
+ } else {
+ add(label);
+ }
+ }
+
+ public void set_color(Gdk.RGBA color) {
+ label.override_color(Gtk.StateFlags.NORMAL, color);
+ }
+ }
+
+ private class ToggleActionToolButton : Gtk.ToolItem {
+ private Gtk.ToggleButton button;
+ private Gtk.ToggleAction action;
+
+ public ToggleActionToolButton(Gtk.ToggleAction action) {
+ this.action = action;
+ button = new Gtk.ToggleButton();
+ button.set_can_focus(false);
+ button.set_active(action.active);
+ button.clicked.connect(on_button_activate);
+ button.set_has_tooltip(true);
+
+ restyle();
+
+ this.add(button);
+ }
+
+ ~ToggleActionButton() {
+ button.clicked.disconnect(on_button_activate);
+ }
+
+ private void on_button_activate() {
+ action.activate();
+ }
+
+ public void set_icon_name(string icon_name) {
+ Gtk.Image? image = null;
+ if (icon_name.contains("disabled"))
+ image = new Gtk.Image.from_stock(icon_name, Gtk.IconSize.SMALL_TOOLBAR);
+ else
+ image = new Gtk.Image.from_icon_name(icon_name, Gtk.IconSize.SMALL_TOOLBAR);
+
+ button.set_image(image);
+ }
+
+ public void restyle() {
+ string bgcolorname =
+ Resources.to_css_color(Config.Facade.get_instance().get_bg_color());
+ string stylesheet = Resources.SEARCH_BUTTON_STYLESHEET_TEMPLATE.printf(bgcolorname);
+
+ Resources.style_widget(button, stylesheet);
+ }
+ }
+
+ // Ticket #3260 - Add a 'close' context menu to
+ // the searchbar.
+ // The close menu. Populated below in the constructor.
+ private Gtk.Menu close_menu = new Gtk.Menu();
+ private Gtk.ImageMenuItem close_item = new Gtk.ImageMenuItem.from_stock(Gtk.Stock.CLOSE, null);
+
+ // Text search box.
+ protected class SearchBox : Gtk.ToolItem {
+ private Gtk.SearchEntry search_entry;
+ private TextAction action;
+
+ public SearchBox(TextAction action) {
+ this.action = action;
+ search_entry = new Gtk.SearchEntry();
+
+ search_entry.width_chars = 23;
+ search_entry.key_press_event.connect(on_escape_key);
+ add(search_entry);
+
+ set_nullable_text(action.value);
+
+ action.text_changed.connect(on_action_text_changed);
+ action.sensitivity_changed.connect(on_sensitivity_changed);
+ action.visibility_changed.connect(on_visibility_changed);
+
+ search_entry.buffer.deleted_text.connect(on_entry_changed);
+ search_entry.buffer.inserted_text.connect(on_entry_changed);
+ }
+
+ ~SearchBox() {
+ action.text_changed.disconnect(on_action_text_changed);
+ action.sensitivity_changed.disconnect(on_sensitivity_changed);
+ action.visibility_changed.disconnect(on_visibility_changed);
+
+ search_entry.buffer.deleted_text.disconnect(on_entry_changed);
+ search_entry.buffer.inserted_text.disconnect(on_entry_changed);
+ }
+
+ public void get_focus() {
+ search_entry.has_focus = true;
+ }
+
+ // Ticket #3124 - user should be able to clear
+ // the search textbox by typing 'Esc'.
+ private bool on_escape_key(Gdk.EventKey e) {
+ if(Gdk.keyval_name(e.keyval) == "Escape")
+ action.clear();
+
+ // Continue processing this event, since the
+ // text entry functionality needs to see it too.
+ return false;
+ }
+
+ private void on_action_text_changed(string? text) {
+ search_entry.buffer.deleted_text.disconnect(on_entry_changed);
+ search_entry.buffer.inserted_text.disconnect(on_entry_changed);
+ set_nullable_text(text);
+ search_entry.buffer.deleted_text.connect(on_entry_changed);
+ search_entry.buffer.inserted_text.connect(on_entry_changed);
+ }
+
+ private void on_entry_changed() {
+ action.text_changed.disconnect(on_action_text_changed);
+ action.set_text(search_entry.get_text());
+ action.text_changed.connect(on_action_text_changed);
+ }
+
+ private void on_sensitivity_changed(bool sensitive) {
+ this.sensitive = sensitive;
+ }
+
+ private void on_visibility_changed(bool visible) {
+ ((Gtk.Widget) this).visible = visible;
+ }
+
+ private void set_nullable_text(string? text) {
+ search_entry.set_text(text != null ? text : "");
+ }
+ }
+
+ // Handles ratings filters.
+ protected class RatingFilterButton : Gtk.ToolItem {
+ public Gtk.Menu filter_popup = null;
+ public Gtk.Button button;
+
+ public signal void clicked();
+
+ public RatingFilterButton() {
+ button = new Gtk.Button();
+ button.set_image(get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
+ button.set_can_focus(false);
+
+ button.clicked.connect(on_clicked);
+
+ restyle();
+
+ set_homogeneous(false);
+
+ this.add(button);
+ }
+
+ ~RatingFilterButton() {
+ button.clicked.disconnect(on_clicked);
+ }
+
+ private void on_clicked() {
+ clicked();
+ }
+
+ private Gtk.Widget get_filter_icon(RatingFilter filter) {
+ string filename = null;
+
+ switch (filter) {
+ case RatingFilter.ONE_OR_HIGHER:
+ filename = Resources.ICON_FILTER_ONE_OR_BETTER;
+ break;
+
+ case RatingFilter.TWO_OR_HIGHER:
+ filename = Resources.ICON_FILTER_TWO_OR_BETTER;
+ break;
+
+ case RatingFilter.THREE_OR_HIGHER:
+ filename = Resources.ICON_FILTER_THREE_OR_BETTER;
+ break;
+
+ case RatingFilter.FOUR_OR_HIGHER:
+ filename = Resources.ICON_FILTER_FOUR_OR_BETTER;
+ break;
+
+ case RatingFilter.FIVE_OR_HIGHER:
+ filename = Resources.ICON_FILTER_FIVE;
+ break;
+
+ case RatingFilter.REJECTED_OR_HIGHER:
+ filename = Resources.ICON_FILTER_REJECTED_OR_BETTER;
+ break;
+
+ case RatingFilter.REJECTED_ONLY:
+ filename = Resources.ICON_RATING_REJECTED;
+ break;
+
+ case RatingFilter.UNRATED_OR_HIGHER:
+ default:
+ filename = Resources.ICON_FILTER_UNRATED_OR_BETTER;
+ break;
+ }
+
+ return new Gtk.Image.from_pixbuf(Resources.load_icon(filename,
+ get_filter_icon_size(filter)));
+ }
+
+ private int get_filter_icon_size(RatingFilter filter) {
+ int icon_base = (int) (FILTER_ICON_BASE_WIDTH * FILTER_ICON_SCALE);
+ int icon_star_base = (int) (FILTER_ICON_BASE_WIDTH * FILTER_ICON_STAR_SCALE);
+ int icon_plus = (int) (FILTER_ICON_PLUS_WIDTH * FILTER_ICON_STAR_SCALE);
+
+ switch (filter) {
+ case RatingFilter.ONE_OR_HIGHER:
+ return icon_star_base + icon_plus;
+ case RatingFilter.TWO_OR_HIGHER:
+ return icon_star_base * 2 + icon_plus;
+ case RatingFilter.THREE_OR_HIGHER:
+ return icon_star_base * 3 + icon_plus;
+ case RatingFilter.FOUR_OR_HIGHER:
+ return icon_star_base * 4 + icon_plus;
+ case RatingFilter.FIVE_OR_HIGHER:
+ case RatingFilter.FIVE_ONLY:
+ return icon_star_base * 5;
+ case RatingFilter.REJECTED_OR_HIGHER:
+ return Resources.ICON_FILTER_REJECTED_OR_BETTER_FIXED_SIZE;
+ case RatingFilter.UNRATED_OR_HIGHER:
+ return Resources.ICON_FILTER_UNRATED_OR_BETTER_FIXED_SIZE;
+ case RatingFilter.REJECTED_ONLY:
+ return icon_plus;
+ default:
+ return icon_base;
+ }
+ }
+
+ public void set_filter_icon(RatingFilter filter) {
+ button.set_image(get_filter_icon(filter));
+ set_size_request(get_filter_button_size(filter), -1);
+ set_tooltip_text(Resources.get_rating_filter_tooltip(filter));
+ set_has_tooltip(true);
+ show_all();
+ }
+
+ private int get_filter_button_size(RatingFilter filter) {
+ return get_filter_icon_size(filter) + 2 * FILTER_BUTTON_MARGIN;
+ }
+
+ public void restyle() {
+ string bgcolorname =
+ Resources.to_css_color(Config.Facade.get_instance().get_bg_color());
+ string stylesheet = Resources.SEARCH_BUTTON_STYLESHEET_TEMPLATE.printf(bgcolorname);
+
+ Resources.style_widget(button, stylesheet);
+ }
+ }
+
+ public Gtk.UIManager ui = new Gtk.UIManager();
+
+ private SearchFilterActions actions;
+ private SearchBox search_box;
+ private RatingFilterButton rating_button = new RatingFilterButton();
+ private SearchViewFilter? search_filter = null;
+ private LabelToolItem label_type;
+ private LabelToolItem label_flagged;
+ private LabelToolItem label_rating;
+ private ToggleActionToolButton toolbtn_photos;
+ private ToggleActionToolButton toolbtn_videos;
+ private ToggleActionToolButton toolbtn_raw;
+ private ToggleActionToolButton toolbtn_flag;
+ private Gtk.SeparatorToolItem sepr_mediatype_flagged;
+ private Gtk.SeparatorToolItem sepr_flagged_rating;
+
+ public SearchFilterToolbar(SearchFilterActions actions) {
+ this.actions = actions;
+ actions.media_context_changed.connect(on_media_context_changed);
+ search_box = new SearchBox(actions.text);
+
+ set_name("search-filter-toolbar");
+ set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
+
+ File ui_file = Resources.get_ui("search_bar.ui");
+ try {
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ AppWindow.panic(_("Error loading UI file %s: %s").printf(
+ ui_file.get_path(), err.message));
+ }
+
+ ui.insert_action_group(actions.get_action_group(), 0);
+
+ // Ticket #3260 - Add a 'close' context menu to
+ // the searchbar.
+ // Prepare the close menu for use, but don't
+ // display it yet; we'll connect it to secondary
+ // click later on.
+ ((Gtk.MenuItem) close_item).show();
+ close_item.always_show_image = true;
+ close_item.activate.connect(on_context_menu_close_chosen);
+ close_menu.append(close_item);
+
+ // Type label and toggles
+ label_type = new LabelToolItem(_("Type"), 10, 5);
+ insert(label_type, -1);
+
+ toolbtn_photos = new ToggleActionToolButton(actions.photos);
+ toolbtn_photos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayPhotos").tooltip);
+
+ toolbtn_videos = new ToggleActionToolButton(actions.videos);
+ toolbtn_videos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayVideos").tooltip);
+
+ toolbtn_raw = new ToggleActionToolButton(actions.raw);
+ toolbtn_raw.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayRaw").tooltip);
+
+ insert(toolbtn_photos, -1);
+ insert(toolbtn_videos, -1);
+ insert(toolbtn_raw, -1);
+
+ // separator
+ sepr_mediatype_flagged = new Gtk.SeparatorToolItem();
+ insert(sepr_mediatype_flagged, -1);
+
+ // Flagged label and toggle
+ label_flagged = new LabelToolItem(_("Flagged"));
+ insert(label_flagged, -1);
+
+ toolbtn_flag = new ToggleActionToolButton(actions.flagged);
+ toolbtn_flag.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayFlagged").tooltip);
+
+ insert(toolbtn_flag, -1);
+
+ // separator
+ sepr_flagged_rating = new Gtk.SeparatorToolItem();
+ insert(sepr_flagged_rating, -1);
+
+ // Rating label and button
+ label_rating = new LabelToolItem(_("Rating"));
+ insert(label_rating, -1);
+ rating_button.filter_popup = (Gtk.Menu) ui.get_widget("/FilterPopupMenu");
+ rating_button.set_expand(false);
+ rating_button.clicked.connect(on_filter_button_clicked);
+ insert(rating_button, -1);
+
+ // Separator to right-align the text box
+ Gtk.SeparatorToolItem separator_align = new Gtk.SeparatorToolItem();
+ separator_align.set_expand(true);
+ separator_align.set_draw(false);
+ insert(separator_align, -1);
+
+ // Search box.
+ insert(search_box, -1);
+
+ // Set background color of toolbar and update them when the configuration is updated
+ Config.Facade.get_instance().bg_color_name_changed.connect(on_bg_color_name_changed);
+ on_bg_color_name_changed();
+
+ // hook up signals to actions to be notified when they change
+ actions.flagged_toggled.connect(on_flagged_toggled);
+ actions.photos_toggled.connect(on_photos_toggled);
+ actions.videos_toggled.connect(on_videos_toggled);
+ actions.raw_toggled.connect(on_raw_toggled);
+ actions.rating_changed.connect(on_rating_changed);
+ actions.text_changed.connect(on_search_text_changed);
+ actions.criteria_changed.connect(on_criteria_changed);
+
+ // #3260 part II Hook up close menu.
+ popup_context_menu.connect(on_context_menu_requested);
+
+ on_media_context_changed(actions.get_has_photos(), actions.get_has_videos(),
+ actions.get_has_raw(), actions.get_has_flagged());
+ }
+
+ ~SearchFilterToolbar() {
+ Config.Facade.get_instance().bg_color_name_changed.disconnect(on_bg_color_name_changed);
+
+ actions.media_context_changed.disconnect(on_media_context_changed);
+
+ actions.flagged_toggled.disconnect(on_flagged_toggled);
+ actions.photos_toggled.disconnect(on_photos_toggled);
+ actions.videos_toggled.disconnect(on_videos_toggled);
+ actions.raw_toggled.disconnect(on_raw_toggled);
+ actions.rating_changed.disconnect(on_rating_changed);
+ actions.text_changed.disconnect(on_search_text_changed);
+ actions.criteria_changed.disconnect(on_criteria_changed);
+
+ popup_context_menu.disconnect(on_context_menu_requested);
+ }
+
+ private void on_media_context_changed(bool has_photos, bool has_videos, bool has_raw,
+ bool has_flagged) {
+ if (has_photos)
+ toolbtn_photos.set_icon_name(Resources.ICON_FILTER_PHOTOS);
+ else
+ toolbtn_photos.set_icon_name(Resources.ICON_FILTER_PHOTOS_DISABLED);
+
+ if (has_videos)
+ toolbtn_videos.set_icon_name(Resources.ICON_FILTER_VIDEOS);
+ else
+ toolbtn_videos.set_icon_name(Resources.ICON_FILTER_VIDEOS_DISABLED);
+
+ if (has_raw)
+ toolbtn_raw.set_icon_name(Resources.ICON_FILTER_RAW);
+ else
+ toolbtn_raw.set_icon_name(Resources.ICON_FILTER_RAW_DISABLED);
+
+ if (has_flagged)
+ toolbtn_flag.set_icon_name(Resources.ICON_FILTER_FLAGGED);
+ else
+ toolbtn_flag.set_icon_name(Resources.ICON_FILTER_FLAGGED_DISABLED);
+ }
+
+ private void on_bg_color_name_changed() {
+ string bgcolorname =
+ Resources.to_css_color(Config.Facade.get_instance().get_bg_color());
+ string toolbar_stylesheet = Resources.TOOLBAR_STYLESHEET_TEMPLATE.printf(bgcolorname);
+ Resources.style_widget(this, toolbar_stylesheet);
+
+ label_type.set_color(Config.Facade.get_instance().get_unselected_color());
+ label_flagged.set_color(Config.Facade.get_instance().get_unselected_color());
+ label_rating.set_color(Config.Facade.get_instance().get_unselected_color());
+
+ toolbtn_photos.restyle();
+ toolbtn_videos.restyle();
+ toolbtn_raw.restyle();
+ toolbtn_flag.restyle();
+ rating_button.restyle();
+
+ }
+
+ // Ticket #3260 part IV - display the context menu on secondary click
+ private bool on_context_menu_requested(int x, int y, int button) {
+ close_menu.popup(null, null, null, button, Gtk.get_current_event_time());
+ return false;
+ }
+
+ // Ticket #3260 part III - this runs whenever 'close'
+ // is chosen in the context menu.
+ private void on_context_menu_close_chosen() {
+ AppWindow aw = LibraryWindow.get_app();
+
+ // Try to obtain the action for toggling the searchbar. If
+ // it's null, then we're probably in direct edit mode, and
+ // shouldn't do anything anyway.
+ Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as Gtk.ToggleAction;
+
+ // Could we find the appropriate action?
+ if(searchbar_toggle != null) {
+ // Yes, hide the search bar.
+ searchbar_toggle.set_active(false);
+ }
+ }
+
+ private void on_flagged_toggled() {
+ update();
+ }
+
+ private void on_videos_toggled() {
+ update();
+ }
+
+ private void on_photos_toggled() {
+ update();
+ }
+
+ private void on_raw_toggled() {
+ update();
+ }
+
+ private void on_search_text_changed() {
+ update();
+ }
+
+ private void on_rating_changed() {
+ AppWindow aw = LibraryWindow.get_app();
+
+ if (aw == null)
+ return;
+
+ Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as Gtk.ToggleAction;
+ if(searchbar_toggle != null)
+ searchbar_toggle.set_active(true);
+
+ update();
+ }
+
+ // Ticket #3290, part II - listen for criteria change signals,
+ // and show or hide widgets based on the criteria we just
+ // changed to.
+ private void on_criteria_changed() {
+ update();
+ }
+
+ public void set_view_filter(SearchViewFilter search_filter) {
+ if (search_filter == this.search_filter)
+ return;
+
+ this.search_filter = search_filter;
+
+ // Enable/disable toolbar features depending on what the filter offers
+ actions.set_sensitive_for_search_criteria((SearchFilterCriteria) search_filter.get_criteria());
+ rating_button.sensitive = (SearchFilterCriteria.RATING & search_filter.get_criteria()) != 0;
+
+ update();
+ }
+
+ public void unset_view_filter() {
+ set_view_filter(new DisabledViewFilter());
+ }
+
+ // Forces an update of the search filter.
+ public void update() {
+ if (null == search_filter) {
+ // Search bar isn't being shown, need to toggle it.
+ LibraryWindow.get_app().show_search_bar(true);
+ }
+
+ assert(null != search_filter);
+
+ search_filter.set_search_filter(actions.text.value);
+ search_filter.flagged = actions.flagged.active;
+ search_filter.show_media_video = actions.videos.active;
+ search_filter.show_media_photos = actions.photos.active;
+ search_filter.show_media_raw = actions.raw.active;
+
+ RatingFilter filter = (RatingFilter) actions.rating.current_value;
+ search_filter.set_rating_filter(filter);
+ rating_button.set_filter_icon(filter);
+
+ // Ticket #3290, part III - check the current criteria
+ // and show or hide widgets as needed.
+ SearchFilterCriteria criteria = actions.get_criteria();
+
+ search_box.visible = ((criteria & SearchFilterCriteria.TEXT) != 0);
+
+ rating_button.visible = ((criteria & SearchFilterCriteria.RATING) != 0);
+ label_rating.visible = ((criteria & SearchFilterCriteria.RATING) != 0);
+
+ label_flagged.visible = ((criteria & SearchFilterCriteria.FLAG) != 0);
+ toolbtn_flag.visible = ((criteria & SearchFilterCriteria.FLAG) != 0);
+
+ label_type.visible = ((criteria & SearchFilterCriteria.MEDIA) != 0);
+ toolbtn_photos.visible = ((criteria & SearchFilterCriteria.MEDIA) != 0);
+ toolbtn_videos.visible = ((criteria & SearchFilterCriteria.MEDIA) != 0);
+ toolbtn_raw.visible = ((criteria & SearchFilterCriteria.MEDIA) != 0);
+
+ // Ticket #3290, part IV - ensure that the separators
+ // are shown and/or hidden as needed.
+ sepr_mediatype_flagged.visible = (label_type.visible && label_flagged.visible);
+
+ sepr_flagged_rating.visible = ((label_type.visible && label_rating.visible) ||
+ (label_flagged.visible && label_rating.visible));
+
+ // Send update to view collection.
+ search_filter.refresh();
+ }
+
+ private void position_filter_popup(Gtk.Menu menu, out int x, out int y, out bool push_in) {
+ menu.realize();
+ int rx, ry;
+ rating_button.get_window().get_root_origin(out rx, out ry);
+
+ Gtk.Allocation rating_button_allocation;
+ rating_button.get_allocation(out rating_button_allocation);
+
+ Gtk.Allocation menubar_allocation;
+ AppWindow.get_instance().get_current_page().get_menubar().get_allocation(out menubar_allocation);
+
+ int sidebar_w = Config.Facade.get_instance().get_sidebar_position();
+
+ x = rx + rating_button_allocation.x + sidebar_w;
+ y = ry + rating_button_allocation.y + rating_button_allocation.height +
+ menubar_allocation.height;
+
+ push_in = false;
+ }
+
+ private void on_filter_button_clicked() {
+ rating_button.filter_popup.popup(null, null, position_filter_popup, 0,
+ Gtk.get_current_event_time());
+ }
+
+ public void take_focus() {
+ search_box.get_focus();
+ }
+}
+
diff --git a/src/SlideshowPage.vala b/src/SlideshowPage.vala
new file mode 100644
index 0000000..f22fd53
--- /dev/null
+++ b/src/SlideshowPage.vala
@@ -0,0 +1,466 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+class SlideshowPage : SinglePhotoPage {
+ private const int READAHEAD_COUNT = 5;
+ private const int CHECK_ADVANCE_MSEC = 250;
+
+ private SourceCollection sources;
+ private ViewCollection controller;
+ private Photo current;
+ private Gtk.ToolButton play_pause_button;
+ private Gtk.ToolButton settings_button;
+ private PixbufCache cache = null;
+ private Timer timer = new Timer();
+ private bool playing = true;
+ private bool exiting = false;
+ private string[] transitions;
+
+ private Screensaver screensaver;
+
+ public signal void hide_toolbar();
+
+ private class SettingsDialog : Gtk.Dialog {
+ private Gtk.Builder builder = null;
+ Gtk.SpinButton delay_entry;
+ Gtk.Scale delay_hscale;
+ Gtk.ComboBoxText transition_effect_selector;
+ Gtk.Scale transition_effect_hscale;
+ Gtk.SpinButton transition_effect_entry;
+ Gtk.Adjustment transition_effect_adjustment;
+ Gtk.CheckButton show_title_button;
+ Gtk.Box pane;
+
+ public SettingsDialog() {
+ builder = AppWindow.create_builder();
+ pane = builder.get_object("slideshow_settings_pane") as Gtk.Box;
+ get_content_area().add(pane);
+
+ double delay = Config.Facade.get_instance().get_slideshow_delay();
+
+ set_modal(true);
+ set_transient_for(AppWindow.get_fullscreen());
+
+ add_buttons(Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.Stock.OK, Gtk.ResponseType.OK);
+ set_title(_("Settings"));
+
+ Gtk.Adjustment adjustment = new Gtk.Adjustment(delay, Config.Facade.SLIDESHOW_DELAY_MIN, Config.Facade.SLIDESHOW_DELAY_MAX, 0.1, 1, 0);
+ delay_hscale = builder.get_object("delay_hscale") as Gtk.Scale;
+ delay_hscale.adjustment = adjustment;
+
+ delay_entry = builder.get_object("delay_entry") as Gtk.SpinButton;
+ delay_entry.adjustment = adjustment;
+ delay_entry.set_value(delay);
+ delay_entry.set_numeric(true);
+ delay_entry.set_activates_default(true);
+
+ transition_effect_selector = builder.get_object("transition_effect_selector") as Gtk.ComboBoxText;
+
+ // get last effect id
+ string effect_id = Config.Facade.get_instance().get_slideshow_transition_effect_id();
+
+ // null effect first, always, and set active in case no other one is found
+ string null_display_name = TransitionEffectsManager.get_instance().get_effect_name(
+ TransitionEffectsManager.NULL_EFFECT_ID);
+ transition_effect_selector.append_text(null_display_name);
+ transition_effect_selector.set_active(0);
+
+ int i = 1;
+ foreach (string display_name in
+ TransitionEffectsManager.get_instance().get_effect_names(utf8_ci_compare)) {
+ if (display_name == null_display_name)
+ continue;
+
+ transition_effect_selector.append_text(display_name);
+ if (effect_id == TransitionEffectsManager.get_instance().get_id_for_effect_name(display_name))
+ transition_effect_selector.set_active(i);
+
+ ++i;
+ }
+ transition_effect_selector.changed.connect(on_transition_changed);
+
+ double transition_delay = Config.Facade.get_instance().get_slideshow_transition_delay();
+ transition_effect_adjustment = new Gtk.Adjustment(transition_delay,
+ Config.Facade.SLIDESHOW_TRANSITION_DELAY_MIN, Config.Facade.SLIDESHOW_TRANSITION_DELAY_MAX,
+ 0.1, 1, 0);
+ transition_effect_hscale = builder.get_object("transition_effect_hscale") as Gtk.Scale;
+ transition_effect_hscale.adjustment = transition_effect_adjustment;
+
+ transition_effect_entry = builder.get_object("transition_effect_entry") as Gtk.SpinButton;
+ transition_effect_entry.adjustment = transition_effect_adjustment;
+ transition_effect_entry.set_value(transition_delay);
+ transition_effect_entry.set_numeric(true);
+ transition_effect_entry.set_activates_default(true);
+
+ bool show_title = Config.Facade.get_instance().get_slideshow_show_title();
+ show_title_button = builder.get_object("show_title_button") as Gtk.CheckButton;
+ show_title_button.active = show_title;
+
+ set_default_response(Gtk.ResponseType.OK);
+
+ on_transition_changed();
+ }
+
+ private void on_transition_changed() {
+ string selected = transition_effect_selector.get_active_text();
+ bool sensitive = selected != null
+ && selected != TransitionEffectsManager.NULL_EFFECT_ID;
+
+ transition_effect_hscale.sensitive = sensitive;
+ transition_effect_entry.sensitive = sensitive;
+ }
+
+ public double get_delay() {
+ return delay_entry.get_value();
+ }
+
+ public double get_transition_delay() {
+ return transition_effect_entry.get_value();
+ }
+
+ public string get_transition_effect_id() {
+ string? active = transition_effect_selector.get_active_text();
+ if (active == null)
+ return TransitionEffectsManager.NULL_EFFECT_ID;
+
+ string? id = TransitionEffectsManager.get_instance().get_id_for_effect_name(active);
+
+ return (id != null) ? id : TransitionEffectsManager.NULL_EFFECT_ID;
+ }
+
+ public bool get_show_title() {
+ return show_title_button.active;
+ }
+ }
+
+ public SlideshowPage(SourceCollection sources, ViewCollection controller, Photo start) {
+ base(_("Slideshow"), true);
+
+ this.sources = sources;
+ this.controller = controller;
+
+ Gee.Collection<string> pluggables = TransitionEffectsManager.get_instance().get_effect_ids();
+ Gee.ArrayList<string> a = new Gee.ArrayList<string>();
+ a.add_all(pluggables);
+ a.remove(NullTransitionDescriptor.EFFECT_ID);
+ a.remove(RandomEffectDescriptor.EFFECT_ID);
+ transitions = a.to_array();
+ current = start;
+
+ update_transition_effect();
+
+ // Set up toolbar
+ Gtk.Toolbar toolbar = get_toolbar();
+
+ // add toolbar buttons
+ Gtk.ToolButton previous_button = new Gtk.ToolButton.from_stock(Gtk.Stock.GO_BACK);
+ previous_button.set_label(_("Back"));
+ previous_button.set_tooltip_text(_("Go to the previous photo"));
+ previous_button.clicked.connect(on_previous_photo);
+
+ toolbar.insert(previous_button, -1);
+
+ play_pause_button = new Gtk.ToolButton.from_stock(Gtk.Stock.MEDIA_PAUSE);
+ play_pause_button.set_label(_("Pause"));
+ play_pause_button.set_tooltip_text(_("Pause the slideshow"));
+ play_pause_button.clicked.connect(on_play_pause);
+
+ toolbar.insert(play_pause_button, -1);
+
+ Gtk.ToolButton next_button = new Gtk.ToolButton.from_stock(Gtk.Stock.GO_FORWARD);
+ next_button.set_label(_("Next"));
+ next_button.set_tooltip_text(_("Go to the next photo"));
+ next_button.clicked.connect(on_next_photo);
+
+ toolbar.insert(next_button, -1);
+
+ settings_button = new Gtk.ToolButton.from_stock(Gtk.Stock.PREFERENCES);
+ settings_button.set_label(_("Settings"));
+ settings_button.set_tooltip_text(_("Change slideshow settings"));
+ settings_button.clicked.connect(on_change_settings);
+ settings_button.is_important = true;
+
+ toolbar.insert(settings_button, -1);
+
+ screensaver = new Screensaver();
+ }
+
+ public override void switched_to() {
+ base.switched_to();
+
+ // create a cache for the size of this display
+ cache = new PixbufCache(sources, PixbufCache.PhotoType.BASELINE, get_canvas_scaling(),
+ READAHEAD_COUNT);
+
+ Gdk.Pixbuf pixbuf;
+ if (get_next_photo(current, Direction.FORWARD, out current, out pixbuf))
+ set_pixbuf(pixbuf, current.get_dimensions(), Direction.FORWARD);
+
+ // start the auto-advance timer
+ Timeout.add(CHECK_ADVANCE_MSEC, auto_advance);
+ timer.start();
+
+ screensaver.inhibit("Playing slideshow");
+ }
+
+ public override void switching_from() {
+ base.switching_from();
+
+ screensaver.uninhibit();
+ exiting = true;
+ }
+
+ private bool get_next_photo(Photo start, Direction direction, out Photo next,
+ out Gdk.Pixbuf next_pixbuf) {
+ next = start;
+
+ for (;;) {
+ try {
+ // Fails if a photo source file is missing.
+ next_pixbuf = cache.fetch(next);
+ } catch (Error err) {
+ warning("Unable to fetch pixbuf for %s: %s", next.to_string(), err.message);
+
+ // Look for the next good photo
+ DataView view = controller.get_view_for_source(next);
+ view = (direction == Direction.FORWARD)
+ ? controller.get_next(view)
+ : controller.get_previous(view);
+ next = (Photo) view.get_source();
+
+ // An entire slideshow set might be missing, so check for a loop.
+ if ((next == start && next != current) || next == current) {
+ AppWindow.error_message(_("All photo source files are missing."), get_container());
+ AppWindow.get_instance().end_fullscreen();
+
+ next = null;
+ next_pixbuf = null;
+
+ return false;
+ }
+
+ continue;
+ }
+
+ // prefetch this photo's extended neighbors: the next photo highest priority, the prior
+ // one normal, and the extended neighbors lowest, to recognize immediate needs
+ DataSource forward, back;
+ controller.get_immediate_neighbors(next, out forward, out back, Photo.TYPENAME);
+ cache.prefetch((Photo) forward, BackgroundJob.JobPriority.HIGHEST);
+ cache.prefetch((Photo) back, BackgroundJob.JobPriority.NORMAL);
+
+ Gee.Set<DataSource> neighbors = controller.get_extended_neighbors(next, Photo.TYPENAME);
+ neighbors.remove(forward);
+ neighbors.remove(back);
+
+ cache.prefetch_many((Gee.Collection<Photo>) neighbors, BackgroundJob.JobPriority.LOWEST);
+
+ return true;
+ }
+ }
+
+ private void on_play_pause() {
+ if (playing) {
+ play_pause_button.set_stock_id(Gtk.Stock.MEDIA_PLAY);
+ play_pause_button.set_label(_("Play"));
+ play_pause_button.set_tooltip_text(_("Continue the slideshow"));
+ } else {
+ play_pause_button.set_stock_id(Gtk.Stock.MEDIA_PAUSE);
+ play_pause_button.set_label(_("Pause"));
+ play_pause_button.set_tooltip_text(_("Pause the slideshow"));
+ }
+
+ playing = !playing;
+
+ // reset the timer
+ timer.start();
+ }
+
+ protected override void on_previous_photo() {
+ DataView view = controller.get_view_for_source(current);
+
+ Photo? prev_photo = null;
+ DataView? start_view = controller.get_previous(view);
+ DataView? prev_view = start_view;
+
+ while (prev_view != null) {
+ if (prev_view.get_source() is Photo) {
+ prev_photo = (Photo) prev_view.get_source();
+ break;
+ }
+
+ prev_view = controller.get_previous(prev_view);
+
+ if (prev_view == start_view) {
+ warning("on_previous( ): can't advance to previous photo: collection has only videos");
+ return;
+ }
+ }
+
+ advance(prev_photo, Direction.BACKWARD);
+ }
+
+ protected override void on_next_photo() {
+ DataView view = controller.get_view_for_source(current);
+
+ Photo? next_photo = null;
+ DataView? start_view = controller.get_next(view);
+ DataView? next_view = start_view;
+
+ while (next_view != null) {
+ if (next_view.get_source() is Photo) {
+ next_photo = (Photo) next_view.get_source();
+ break;
+ }
+
+ next_view = controller.get_next(next_view);
+
+ if (next_view == start_view) {
+ warning("on_next( ): can't advance to next photo: collection has only videos");
+ return;
+ }
+ }
+
+ if (Config.Facade.get_instance().get_slideshow_transition_effect_id() ==
+ RandomEffectDescriptor.EFFECT_ID) {
+ random_transition_effect();
+ }
+
+ advance(next_photo, Direction.FORWARD);
+ }
+
+ private void advance(Photo photo, Direction direction) {
+ current = photo;
+
+ // set pixbuf
+ Gdk.Pixbuf next_pixbuf;
+ if (get_next_photo(current, direction, out current, out next_pixbuf))
+ set_pixbuf(next_pixbuf, current.get_dimensions(), direction);
+
+ // reset the advance timer
+ timer.start();
+ }
+
+ private bool auto_advance() {
+ if (exiting)
+ return false;
+
+ if (!playing)
+ return true;
+
+ if (timer.elapsed() < Config.Facade.get_instance().get_slideshow_delay())
+ return true;
+
+ on_next_photo();
+
+ return true;
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ bool handled = true;
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "space":
+ on_play_pause();
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ if (handled)
+ return true;
+
+ return (base.key_press_event != null) ? base.key_press_event(event) : true;
+ }
+
+ private void on_change_settings() {
+ SettingsDialog settings_dialog = new SettingsDialog();
+ settings_dialog.show_all();
+
+ bool slideshow_playing = playing;
+ playing = false;
+ hide_toolbar();
+
+ if (settings_dialog.run() == Gtk.ResponseType.OK) {
+ // sync with the config setting so it will persist
+ Config.Facade.get_instance().set_slideshow_delay(settings_dialog.get_delay());
+
+ Config.Facade.get_instance().set_slideshow_transition_delay(settings_dialog.get_transition_delay());
+ Config.Facade.get_instance().set_slideshow_transition_effect_id(settings_dialog.get_transition_effect_id());
+ Config.Facade.get_instance().set_slideshow_show_title(settings_dialog.get_show_title());
+
+ update_transition_effect();
+ }
+
+ settings_dialog.destroy();
+ playing = slideshow_playing;
+ timer.start();
+ }
+
+ private void update_transition_effect() {
+ string effect_id = Config.Facade.get_instance().get_slideshow_transition_effect_id();
+ double effect_delay = Config.Facade.get_instance().get_slideshow_transition_delay();
+
+ set_transition(effect_id, (int) (effect_delay * 1000.0));
+ }
+
+ private void random_transition_effect() {
+ double effect_delay = Config.Facade.get_instance().get_slideshow_transition_delay();
+ string effect_id = TransitionEffectsManager.NULL_EFFECT_ID;
+ if (0 < transitions.length) {
+ int random = Random.int_range(0, transitions.length);
+ effect_id = transitions[random];
+ }
+ set_transition(effect_id, (int) (effect_delay * 1000.0));
+ }
+
+ // Paint the title of the photo
+ private void paint_title(Cairo.Context ctx, Dimensions ctx_dim) {
+ string? title = current.get_title();
+
+ // If the photo doesn't have a title, don't paint anything
+ if (title == null || title == "")
+ return;
+
+ Pango.Layout layout = create_pango_layout(title);
+ Pango.AttrList list = new Pango.AttrList();
+ Pango.Attribute size = Pango.attr_scale_new(3);
+ list.insert(size.copy());
+ layout.set_attributes(list);
+ layout.set_width((int) ((ctx_dim.width * 0.9) * Pango.SCALE));
+
+ // Find the right position
+ int title_width, title_height;
+ layout.get_pixel_size(out title_width, out title_height);
+ double x = ctx_dim.width * 0.2;
+ double y = ctx_dim.height * 0.90;
+
+ // Move the title up if it is too high
+ if (y + title_height >= ctx_dim.height * 0.95)
+ y = ctx_dim.height * 0.95 - title_height;
+ // Move to the left if the title is too long
+ if (x + title_width >= ctx_dim.width * 0.95)
+ x = ctx_dim.width / 2 - title_width / 2;
+
+ set_source_color_from_string(ctx, "#fff");
+ ctx.move_to(x, y);
+ Pango.cairo_show_layout(ctx, layout);
+ Pango.cairo_layout_path(ctx, layout);
+ ctx.set_line_width(1.5);
+ set_source_color_from_string(ctx, "#000");
+ ctx.stroke();
+ }
+
+ public override void paint(Cairo.Context ctx, Dimensions ctx_dim) {
+ base.paint(ctx, ctx_dim);
+
+ if (Config.Facade.get_instance().get_slideshow_show_title() && !is_transition_in_progress())
+ paint_title(ctx, ctx_dim);
+ }
+}
+
diff --git a/src/SortedList.vala b/src/SortedList.vala
new file mode 100644
index 0000000..791f9e0
--- /dev/null
+++ b/src/SortedList.vala
@@ -0,0 +1,429 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public delegate int64 Comparator(void *a, void *b);
+
+extern string g_utf8_collate_key_for_filename(string str, ssize_t len = -1);
+
+public int64 file_comparator(void *a, void *b) {
+ string? path_a = ((File *) a)->get_path();
+ string? path_b = ((File *) b)->get_path();
+
+ // if both are null, treat as equal; if one but not the other, prioritize the non-null
+ if (path_a == null)
+ return (path_b == null) ? 0 : 1;
+
+ if (path_b == null)
+ return -1;
+
+ return strcmp(g_utf8_collate_key_for_filename(path_a), g_utf8_collate_key_for_filename(path_b));
+}
+
+public class SortedList<G> : Object, Gee.Traversable<G>, Gee.Iterable<G>, Gee.Collection<G> {
+ private Gee.ArrayList<G> list;
+ private unowned Comparator? cmp;
+
+ public SortedList(Comparator? cmp = null) {
+ this.list = new Gee.ArrayList<G>();
+ this.cmp = cmp;
+ }
+
+ public Type element_type {
+ get { return typeof(G); }
+ }
+
+ public bool read_only {
+ get { return list.read_only; }
+ }
+
+ public Gee.Iterator<G?> iterator() {
+ return list.iterator();
+ }
+
+ public bool foreach(Gee.ForallFunc<G> f) {
+ return list.foreach(f);
+ }
+
+ public bool add(G? item) {
+ if (cmp == null)
+ list.add(item);
+ else
+ list.insert(get_sorted_insert_pos(item), item);
+
+#if VERIFY_SORTED_LIST
+ assert(is_sorted());
+#endif
+
+ return true;
+ }
+
+ public bool add_all(Gee.Collection<G> collection) {
+ if (collection.size == 0)
+ return false;
+
+ Gee.List<G> as_list = collection as Gee.List<G>;
+ if (as_list != null)
+ return add_list(as_list);
+
+ if (cmp == null)
+ return list.add_all(collection);
+
+ bool changed = false;
+ if (collection.size == 1) {
+ Gee.Iterator<G> iter = collection.iterator();
+ iter.next();
+ G item = iter.get();
+
+ list.insert(get_sorted_insert_pos(item), item);
+ changed = true;
+ } else {
+ Gee.List<G> items = new Gee.ArrayList<G>();
+ items.add_all(collection);
+
+ changed = merge_sort(items);
+ }
+
+#if VERIFY_SORTED_LIST
+ assert(is_sorted());
+#endif
+ return changed;
+ }
+
+ public bool add_list(Gee.List<G> items) {
+ bool added = false;
+ if (items.size == 0) {
+ // do nothing, return false
+ } else if (cmp != null) {
+ // don't use a full merge sort if the number of items is one ... a binary
+ // insertion sort with the insert is quicker
+ if (items.size == 1) {
+ list.insert(get_sorted_insert_pos(items.get(0)), items.get(0));
+ added = true;
+ } else {
+ added = merge_sort(items);
+ }
+ } else {
+ added = list.add_all(items);
+ }
+
+#if VERIFY_SORTED_LIST
+ assert(is_sorted());
+#endif
+
+ return added;
+ }
+
+ public void clear() {
+ list.clear();
+ }
+
+ public bool contains(G? item) {
+ return list.contains(item);
+ }
+
+ public bool contains_all(Gee.Collection<G> collection) {
+ return list.contains_all(collection);
+ }
+
+ public bool is_empty {
+ get {
+ return list.is_empty;
+ }
+ }
+
+ public bool remove(G? item) {
+ return list.remove(item);
+ }
+
+ public bool remove_all(Gee.Collection<G> collection) {
+ return list.remove_all(collection);
+ }
+
+ public bool retain_all(Gee.Collection<G> collection) {
+ return list.retain_all(collection);
+ }
+
+ public int size {
+ get { return list.size; }
+ }
+
+ public inline int get_count() {
+ return list.size;
+ }
+
+ public G? get_at(int index) {
+ return list.get(index);
+ }
+
+ private int binary_search(G search, EqualFunc? equal_func) {
+ assert(cmp != null);
+
+ int min = 0;
+ int max = list.size;
+ for (;;) {
+ int mid = min + ((max - min) / 2);
+ G item = list.get(mid);
+
+ if (equal_func != null && equal_func(item, search))
+ return mid;
+
+ int64 compare = cmp(item, search);
+ if (compare == 0)
+ return mid;
+ else if (compare > 0)
+ max = mid - 1;
+ else
+ min = mid + 1;
+
+ if (min > max)
+ break;
+ }
+
+ return -1;
+ }
+
+ // index_of uses the Comparator to find the item being searched for. Because SortedList allows
+ // for items identified as equal by the Comparator to co-exist in the list, this method will
+ // return the first item found where its compare() method returns zero. Use locate() if a
+ // specific EqualFunc is required for searching.
+ //
+ // Also, index_of() cannot be reliably used to find an item if it has been altered in such a
+ // way that it is no longer sorted properly. Use locate() for that.
+ public int index_of(G search) {
+ return cmp != null ? binary_search(search, null) : locate(search, false);
+ }
+
+ // See notes at index_of for the difference between this method and it.
+ public int locate(G search, bool altered, EqualFunc equal_func = direct_equal) {
+ if (cmp == null || altered) {
+ int count = list.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ if (equal_func(list.get(ctr), search))
+ return ctr;
+ }
+
+ return -1;
+ }
+
+ return binary_search(search, equal_func);
+ }
+
+ public Gee.Collection<G> read_only_view {
+ owned get {
+ return list.read_only_view;
+ }
+ }
+
+ public Gee.List<G> read_only_view_as_list {
+ owned get {
+ return list.read_only_view;
+ }
+ }
+
+ public G? remove_at(int index) {
+ return list.remove_at(index);
+ }
+
+ public G[] to_array() {
+ return list.to_array();
+ }
+
+ public void resort(Comparator new_cmp) {
+ cmp = new_cmp;
+
+ merge_sort();
+
+#if VERIFY_SORTED_LIST
+ assert(is_sorted());
+#endif
+ }
+
+ // Returns true if item has moved.
+ public bool resort_item(G item) {
+ int index = locate(item, true);
+ assert(index >= 0);
+
+ int new_index = get_sorted_insert_pos(item);
+
+ if (index == new_index)
+ return false;
+
+ // insert in such a way to avoid index shift (performing the rightmost
+ // operation before the leftmost)
+ if (new_index > index) {
+ list.insert(new_index, item);
+ G removed_item = list.remove_at(index);
+ assert(item == removed_item);
+ } else {
+ G removed_item = list.remove_at(index);
+ assert(item == removed_item);
+ list.insert(new_index, item);
+ }
+
+#if VERIFY_SORTED_LIST
+ assert(is_sorted());
+#endif
+
+ return true;
+ }
+
+ private int get_sorted_insert_pos(G? item) {
+ int low = 0;
+ int high = list.size;
+ for (;;) {
+ if (low == high)
+ return low;
+
+ int mid = low + ((high - low) / 2);
+
+ // watch for the situation where the item is already in the list (can happen with
+ // resort_item())
+ G cmp_item = list.get(mid);
+ if (item == cmp_item) {
+ // if at the end of the list, add it there
+ if (mid >= list.size - 1)
+ return list.size;
+
+ cmp_item = list.get(mid + 1);
+ }
+
+ int64 result = cmp(item, cmp_item);
+ if (result < 0)
+ high = mid;
+ else if (result > 0)
+ low = mid + 1;
+ else
+ return mid;
+ }
+ }
+
+ public SortedList<G> copy() {
+ SortedList<G> copy = new SortedList<G>(cmp);
+
+ copy.list.add_all(list);
+
+ return copy;
+ }
+
+#if VERIFY_SORTED_LIST
+ private bool is_sorted() {
+ if (cmp == null)
+ return true;
+
+ int length = list.size;
+ for (int ctr = 1; ctr < length; ctr++) {
+ if (cmp(list.get(ctr - 1), list.get(ctr)) >= 0) {
+ critical("Out of order: %d and %d", ctr - 1, ctr);
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+#endif
+
+ private bool merge_sort(Gee.List<G>? add = null) {
+ assert(cmp != null);
+
+ int list_count = list.size;
+ int add_count = (add != null) ? add.size : 0;
+
+ int count = list_count + add_count;
+ if (count == 0)
+ return false;
+
+ // because list access is slow in large-scale sorts, flatten list (with additions) to
+ // an array, merge sort that, and then place them back in the internal ArrayList.
+ G[] array = new G[count];
+ int offset = 0;
+
+ while (offset < list_count) {
+ array[offset] = list.get(offset);
+ offset++;
+ }
+
+ if (add != null) {
+ int add_ctr = 0;
+ while (offset < count) {
+ array[offset] = add.get(add_ctr++);
+ offset++;
+ }
+ }
+
+ assert(offset == count);
+
+ _merge_sort(array, new G[count], 0, count - 1);
+
+ offset = 0;
+ while (offset < list_count) {
+ list.set(offset, array[offset]);
+ offset++;
+ }
+
+ while (offset < count) {
+ list.insert(offset, array[offset]);
+ offset++;
+ }
+
+ return true;
+ }
+
+ private void _merge_sort(G[] array, G[] scratch, int start_index, int end_index) {
+ assert(start_index <= end_index);
+
+ int count = end_index - start_index + 1;
+ if (count <= 1)
+ return;
+
+ int middle_index = start_index + (count / 2);
+
+ _merge_sort(array, scratch, start_index, middle_index - 1);
+ _merge_sort(array, scratch, middle_index, end_index);
+
+ if (cmp(array[middle_index - 1], array[middle_index]) > 0)
+ merge(array, scratch, start_index, middle_index, end_index);
+ }
+
+ private void merge(G[] array, G[] scratch, int start_index, int middle_index, int end_index) {
+ assert(start_index < end_index);
+
+ int count = end_index - start_index + 1;
+ int left_start = start_index;
+ int left_end = middle_index - 1;
+ int right_start = middle_index;
+ int right_end = end_index;
+
+ assert(scratch.length >= count);
+ int scratch_index = 0;
+
+ while (left_start <= left_end && right_start <= right_end) {
+ G left = array[left_start];
+ G right = array[right_start];
+
+ if (cmp(left, right) <= 0) {
+ scratch[scratch_index++] = left;
+ left_start++;
+ } else {
+ scratch[scratch_index++] = right;
+ right_start++;
+ }
+ }
+
+ while (left_start <= left_end)
+ scratch[scratch_index++] = array[left_start++];
+
+ while (right_start <= right_end)
+ scratch[scratch_index++] = array[right_start++];
+
+ assert(scratch_index == count);
+
+ scratch_index = 0;
+ for (int list_index = start_index; list_index <= end_index; list_index++)
+ array[list_index] = scratch[scratch_index++];
+ }
+}
+
diff --git a/src/Tag.vala b/src/Tag.vala
new file mode 100644
index 0000000..1ae76ba
--- /dev/null
+++ b/src/Tag.vala
@@ -0,0 +1,1189 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class TagSourceCollection : ContainerSourceCollection {
+ private Gee.HashMap<string, Tag> name_map = new Gee.HashMap<string, Tag>(Tag.hash_name_string,
+ Tag.equal_name_strings);
+ private Gee.HashMap<MediaSource, Gee.List<Tag>> source_map =
+ new Gee.HashMap<MediaSource, Gee.List<Tag>>();
+ private Gee.HashMap<MediaSource, Gee.SortedSet<Tag>> sorted_source_map =
+ new Gee.HashMap<MediaSource, Gee.SortedSet<Tag>>();
+
+ public TagSourceCollection() {
+ base (Tag.TYPENAME, "TagSourceCollection", get_tag_key);
+
+ attach_collection(LibraryPhoto.global);
+ attach_collection(Video.global);
+
+ // deal with LibraryPhotos being reimported (and possibly their on-disk keywords changing)
+ LibraryPhoto.global.source_reimported.connect(on_photo_source_reimported);
+ }
+
+ ~TagSourceCollection() {
+ LibraryPhoto.global.source_reimported.disconnect(on_photo_source_reimported);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is Tag;
+ }
+
+ private static int64 get_tag_key(DataSource source) {
+ return ((Tag) source).get_instance_id();
+ }
+
+ protected override Gee.Collection<ContainerSource>? get_containers_holding_source(DataSource source) {
+ return fetch_for_source((MediaSource) source);
+ }
+
+ public override ContainerSource? convert_backlink_to_container(SourceBacklink backlink) {
+ TagID tag_id = TagID(backlink.instance_id);
+ Tag? result = null;
+
+ // see if the backlinked tag is already rehydrated and available
+ Tag? tag = fetch(tag_id);
+ if (tag != null) {
+ result = tag;
+ } else {
+ // backlinked tag wasn't already available, so look for it in the holding tank
+ foreach (ContainerSource container in get_holding_tank()) {
+ tag = (Tag) container;
+ if (tag.get_tag_id().id == tag_id.id) {
+ result = tag;
+ break;
+ }
+ }
+ }
+
+ // if we have pulled a hierarchical tag out of the holding tank and the tag we've pulled out
+ // has a parent, its parent might need to be promoted (because it was flattened when put
+ // into the holding tank), so check for this case and promote if necessary
+ if (result != null) {
+ if ((result.get_path().has_prefix(Tag.PATH_SEPARATOR_STRING)) &&
+ (HierarchicalTagUtilities.enumerate_parent_paths(result.get_path()).size > 0)) {
+ string top_level_with_prefix_path =
+ HierarchicalTagUtilities.enumerate_parent_paths(result.get_path()).get(0);
+ string top_level_no_prefix_path =
+ HierarchicalTagUtilities.hierarchical_to_flat(top_level_with_prefix_path);
+
+ foreach (ContainerSource container in get_holding_tank()) {
+ Tag parent_candidate = (Tag) container;
+ if (parent_candidate.get_path() == top_level_no_prefix_path)
+ parent_candidate.promote();
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public Tag? fetch(TagID tag_id) {
+ return (Tag) fetch_by_key(tag_id.id);
+ }
+
+ public bool exists(string name, bool treat_htags_as_root = false) {
+ return fetch_by_name(name, treat_htags_as_root) != null;
+ }
+
+ public Gee.Collection<string> get_all_names() {
+ return name_map.keys;
+ }
+
+ // Returns a list of all Tags associated with the media source in no particular order.
+ //
+ // NOTE: As a search optimization, this returns the list that is maintained by Tags.global.
+ // Do NOT modify this list.
+ public Gee.List<Tag>? fetch_for_source(MediaSource source) {
+ return source_map.get(source);
+ }
+
+ // Returns a sorted set of all Tags associated with the media source (ascending by name).
+ //
+ // NOTE: As an optimization, this returns the list that is maintained by Tags.global.
+ // Do NOT modify this list.
+ public Gee.SortedSet<Tag>? fetch_sorted_for_source(MediaSource photo) {
+ return sorted_source_map.get(photo);
+ }
+
+ // Returns null if not Tag with name exists.
+ // treat_htags_as_root: set to true if you want this function to treat htags as root tags
+ public Tag? fetch_by_name(string name, bool treat_htags_as_root = false) {
+ if (treat_htags_as_root) {
+ if (name.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ if (HierarchicalTagUtilities.enumerate_path_components(name).size == 1) {
+ Tag? tag = name_map.get(HierarchicalTagUtilities.hierarchical_to_flat(name));
+ if (tag != null)
+ return tag;
+ }
+ } else {
+ Tag? tag = name_map.get(HierarchicalTagUtilities.flat_to_hierarchical(name));
+ if (tag != null)
+ return tag;
+ }
+ }
+
+ return name_map.get(name);
+ }
+
+ public Tag? restore_tag_from_holding_tank(string name) {
+ Tag? found = null;
+ foreach (ContainerSource container in get_holding_tank()) {
+ Tag tag = (Tag) container;
+ if (tag.get_name() == name) {
+ found = tag;
+
+ break;
+ }
+ }
+
+ if (found != null) {
+ bool relinked = relink_from_holding_tank(found);
+ assert(relinked);
+ }
+
+ return found;
+ }
+
+ protected override void notify_items_added(Gee.Iterable<DataObject> added) {
+ foreach (DataObject object in added) {
+ Tag tag = (Tag) object;
+
+ assert(!name_map.has_key(tag.get_name()));
+ name_map.set(tag.get_name(), tag);
+ }
+
+ base.notify_items_added(added);
+ }
+
+ protected override void notify_items_removed(Gee.Iterable<DataObject> removed) {
+ foreach (DataObject object in removed) {
+ Tag tag = (Tag) object;
+
+ bool unset = name_map.unset(tag.get_name());
+ assert(unset);
+
+ // if we just removed the last child tag of a top-level hierarchical tag, then convert
+ // the top-level tag back to a flat tag
+ Tag? parent = tag.get_hierarchical_parent();
+ if ((parent != null) && (parent.get_hierarchical_parent() == null)) {
+ if (parent.get_hierarchical_children().size == 0)
+ parent.flatten();
+ }
+ }
+
+ base.notify_items_removed(removed);
+ }
+
+ protected override void notify_items_altered(Gee.Map<DataObject, Alteration> map) {
+ foreach (DataObject object in map.keys) {
+ Tag tag = (Tag) object;
+
+ string? old_name = null;
+
+ // look for this tag being renamed
+ Gee.MapIterator<string, Tag> iter = name_map.map_iterator();
+ while (iter.next()) {
+ if (!iter.get_value().equals(tag))
+ continue;
+
+ old_name = iter.get_key();
+
+ break;
+ }
+
+ assert(old_name != null);
+
+ if (tag.get_name() != old_name) {
+ name_map.unset(old_name);
+ name_map.set(tag.get_name(), tag);
+ }
+ }
+
+ base.notify_items_altered(map);
+ }
+
+ protected override void notify_container_contents_added(ContainerSource container,
+ Gee.Collection<DataSource> added, bool relinking) {
+ Tag tag = (Tag) container;
+ Gee.Collection<MediaSource> sources = (Gee.Collection<MediaSource>) added;
+
+ foreach (MediaSource source in sources) {
+ Gee.List<Tag>? tags = source_map.get(source);
+ if (tags == null) {
+ tags = new Gee.ArrayList<Tag>();
+ source_map.set(source, tags);
+ }
+
+ bool is_added = tags.add(tag);
+ assert(is_added);
+
+ Gee.SortedSet<Tag>? sorted_tags = sorted_source_map.get(source);
+ if (sorted_tags == null) {
+ sorted_tags = new Gee.TreeSet<Tag>(Tag.compare_names);
+ sorted_source_map.set(source, sorted_tags);
+ }
+
+ is_added = sorted_tags.add(tag);
+ assert(is_added);
+ }
+
+ base.notify_container_contents_added(container, added, relinking);
+ }
+
+ protected override void notify_container_contents_removed(ContainerSource container,
+ Gee.Collection<DataSource> removed, bool unlinking) {
+ Tag tag = (Tag) container;
+ Gee.Collection<MediaSource> sources = (Gee.Collection<MediaSource>) removed;
+
+ foreach (MediaSource source in sources) {
+ Gee.List<Tag>? tags = source_map.get(source);
+ assert(tags != null);
+
+ bool is_removed = tags.remove(tag);
+ assert(is_removed);
+
+ if (tags.size == 0)
+ source_map.unset(source);
+
+ Gee.SortedSet<Tag>? sorted_tags = sorted_source_map.get(source);
+ assert(sorted_tags != null);
+
+ is_removed = sorted_tags.remove(tag);
+ assert(is_removed);
+
+ if (sorted_tags.size == 0)
+ sorted_source_map.unset(source);
+ }
+
+ base.notify_container_contents_removed(container, removed, unlinking);
+ }
+
+ private void on_photo_source_reimported(LibraryPhoto photo, PhotoMetadata? metadata) {
+ // with the introduction of HTags, all of this logic has been moved to
+ // Photo.apply_user_metadata_for_reimport( )
+ }
+}
+
+public class Tag : DataSource, ContainerSource, Proxyable, Indexable {
+ public const string TYPENAME = "tag";
+ public const string PATH_SEPARATOR_STRING = "/";
+
+ private class TagSnapshot : SourceSnapshot {
+ private TagRow row;
+ private Gee.HashSet<MediaSource> sources = new Gee.HashSet<MediaSource>();
+
+ public TagSnapshot(Tag tag) {
+ // stash current state of Tag
+ row = tag.row;
+
+ // stash photos and videos attached to this tag ... if any are destroyed, the tag
+ // cannot be reconstituted
+ foreach (MediaSource source in tag.get_sources())
+ sources.add(source);
+
+ LibraryPhoto.global.item_destroyed.connect(on_source_destroyed);
+ Video.global.item_destroyed.connect(on_source_destroyed);
+ }
+
+ ~TagSnapshot() {
+ LibraryPhoto.global.item_destroyed.disconnect(on_source_destroyed);
+ Video.global.item_destroyed.disconnect(on_source_destroyed);
+ }
+
+ public TagRow get_row() {
+ return row;
+ }
+
+ public override void notify_broken() {
+ row = new TagRow();
+ sources.clear();
+
+ base.notify_broken();
+ }
+
+ private void on_source_destroyed(DataSource source) {
+ if (sources.contains((MediaSource) source))
+ notify_broken();
+ }
+ }
+
+ private class TagProxy : SourceProxy {
+ public TagProxy(Tag tag) {
+ base (tag);
+ }
+
+ public override DataSource reconstitute(int64 object_id, SourceSnapshot snapshot) {
+ return Tag.reconstitute(object_id, ((TagSnapshot) snapshot).get_row());
+ }
+ }
+
+ public static TagSourceCollection global = null;
+
+ private TagRow row;
+ private ViewCollection media_views;
+ private string? name_collation_key = null;
+ private bool unlinking = false;
+ private bool relinking = false;
+ private string? indexable_keywords = null;
+
+ private Tag(TagRow row, int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+
+ this.row = row;
+
+ // normalize user text
+ this.row.name = prep_tag_name(this.row.name);
+
+ // convert source ids to MediaSources and ThumbnailViews for the internal ViewCollection
+ Gee.ArrayList<MediaSource> source_list = new Gee.ArrayList<MediaSource>();
+ Gee.ArrayList<ThumbnailView> thumbnail_views = new Gee.ArrayList<ThumbnailView>();
+ if (this.row.source_id_list != null) {
+ foreach (string source_id in this.row.source_id_list) {
+ MediaSource? current_source =
+ (MediaSource?) MediaCollectionRegistry.get_instance().fetch_media(source_id);
+ if (current_source == null)
+ continue;
+
+ source_list.add(current_source);
+ thumbnail_views.add(new ThumbnailView(current_source));
+ }
+ } else {
+ // allocate the source_id_list for use if/when media sources are added
+ this.row.source_id_list = new Gee.HashSet<string>();
+ }
+
+ // add to internal ViewCollection, which maintains media sources associated with this tag
+ media_views = new ViewCollection("ViewCollection for tag %s".printf(row.tag_id.id.to_string()));
+ media_views.add_many(thumbnail_views);
+
+ // need to do this manually here because only want to monitor photo_contents_altered
+ // after add_many() here; but need to keep the TagSourceCollection apprised
+ if (source_list.size > 0) {
+ global.notify_container_contents_added(this, source_list, false);
+ global.notify_container_contents_altered(this, source_list, false, null, false);
+ }
+
+ // monitor ViewCollection to (a) keep the in-memory list of source ids up-to-date, and
+ // (b) update the database whenever there's a change;
+ media_views.contents_altered.connect(on_media_views_contents_altered);
+
+ // monitor the global collections to trap when photos and videos are destroyed, then
+ // automatically remove from the tag
+ LibraryPhoto.global.items_destroyed.connect(on_sources_destroyed);
+ Video.global.items_destroyed.connect(on_sources_destroyed);
+
+ update_indexable_keywords();
+ }
+
+ ~Tag() {
+ media_views.contents_altered.disconnect(on_media_views_contents_altered);
+ LibraryPhoto.global.items_destroyed.disconnect(on_sources_destroyed);
+ Video.global.items_destroyed.disconnect(on_sources_destroyed);
+ }
+
+ public static void init(ProgressMonitor? monitor) {
+ global = new TagSourceCollection();
+
+ // scoop up all the rows at once
+ Gee.List<TagRow?> rows = null;
+ try {
+ rows = TagTable.get_instance().get_all_rows();
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ // turn the freshly-read TagRows into Tag objects.
+
+ // a lookup table of fully-qualified path ancestries and their
+ // attendant tag objects, used later for finding and deleting child
+ // tags with missing parents or incorrect source counts, then
+ // finally adding the remaining tags to the global media source list.
+ Gee.TreeMap<string, Tag> ancestry_dictionary = new Gee.TreeMap<string, Tag>();
+
+ Gee.ArrayList<Tag> unlinked = new Gee.ArrayList<Tag>();
+ int count = rows.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ TagRow row = rows.get(ctr);
+
+ // make sure the tag name is valid
+ string? name = prep_tag_name(row.name);
+ if (name == null) {
+ // TODO: More graceful handling of this situation would be to rename the tag or
+ // alert the user.
+ warning("Invalid tag name \"%s\": removing from database", row.name);
+ try {
+ TagTable.get_instance().remove(row.tag_id);
+ } catch (DatabaseError err) {
+ warning("Unable to delete tag \"%s\": %s", row.name, err.message);
+ }
+
+ continue;
+ }
+
+ row.name = name;
+
+ Tag tag = new Tag(row);
+ if (monitor != null)
+ monitor(ctr, count);
+
+ ancestry_dictionary.set(tag.get_path(), tag);
+
+ if (tag.has_links()) {
+ tag.rehydrate_backlinks(global, null);
+ unlinked.add(tag);
+ }
+ }
+
+ Gee.Set<Tag> victim_set = new Gee.HashSet<Tag>();
+
+ // look through the dictionary for pathological pairs of tags like so:
+ // 'Tag Name' and '/Tag Name'; if we see these, merge the media sources
+ // from '/Tag Name' into 'Tag Name' and delete the hierarchical version.
+ foreach (string fq_tag_path in ancestry_dictionary.keys) {
+ if (HierarchicalTagUtilities.enumerate_parent_paths(fq_tag_path).size < 1) {
+ if ((fq_tag_path.has_prefix(Tag.PATH_SEPARATOR_STRING)) &&
+ (ancestry_dictionary.has_key(HierarchicalTagUtilities.hierarchical_to_flat(fq_tag_path)))) {
+ victim_set.add(ancestry_dictionary.get(fq_tag_path));
+ }
+ }
+ }
+
+ foreach (Tag tag in victim_set) {
+ Gee.Collection<MediaSource> source_collection = tag.get_sources();
+ string flat_version = tag.get_user_visible_name();
+ global.fetch_by_name(flat_version).attach_many(source_collection);
+
+ ancestry_dictionary.unset(tag.get_path());
+
+ tag.detach_many(tag.get_sources());
+ tag.destroy_orphan(true);
+ }
+
+ // look through the dictionary for children with invalid source
+ // counts and/or missing parents and reap them. we'll also flatten
+ // any top-level parents who have 0 children remaining after the reap.
+ victim_set.clear();
+
+ foreach (string fq_tag_path in ancestry_dictionary.keys) {
+ Gee.List<string> parents_to_search =
+ HierarchicalTagUtilities.enumerate_parent_paths(fq_tag_path);
+
+ Tag curr_child = ancestry_dictionary.get(fq_tag_path);
+
+ foreach (string parent_path in parents_to_search) {
+ // if this tag has more sources than its parent, then we're
+ // in an inconsistent state and need to remove this tag.
+ int child_ref_count = curr_child.get_sources_count();
+ int parent_ref_count = -1;
+
+ // does this parent even exist?
+ if (ancestry_dictionary.has_key(parent_path)) {
+ // yes, get its source count.
+ parent_ref_count = ancestry_dictionary.get(parent_path).get_sources_count();
+ }
+
+ // do we have more sources than our parent?
+ if (child_ref_count > parent_ref_count) {
+ // yes, ask to be reaped later. we can't kill ourselves
+ // now because it would interfere with the dictionary's
+ // iterator.
+ victim_set.add(curr_child);
+
+ // if we already know we're going to be reaped,
+ // don't search anymore.
+ break;
+ }
+
+ // is our parent being reaped?
+ if (victim_set.contains(ancestry_dictionary.get(parent_path))) {
+ // yes, we have to be reaped too.
+ victim_set.add(curr_child);
+ break;
+ }
+ }
+ }
+
+ // actually reap invalid children.
+ foreach (Tag t in victim_set) {
+ ancestry_dictionary.unset(t.get_path());
+ t.destroy_orphan(true);
+ }
+
+ // add remaining tags all at once to the SourceCollection
+ global.add_many(ancestry_dictionary.values);
+ global.init_add_many_unlinked(unlinked);
+
+ // flatten root tags who have zero children; this will catch
+ // both parents whose children were reaped and corrupted parents.
+ foreach (Tag t in ancestry_dictionary.values) {
+ // do we have no parent and no children?
+ if ((t.get_hierarchical_children().size < 1) && (t.get_hierarchical_parent() == null)) {
+ //yes, flatten.
+ t.flatten();
+ }
+ }
+ }
+
+ public static void terminate() {
+ }
+
+ public static int compare_names(Tag a, Tag b) {
+ return String.precollated_compare(a.get_name(), a.get_name_collation_key(), b.get_name(),
+ b.get_name_collation_key());
+ }
+
+ public static uint hash_name_string(string a) {
+ return String.collated_hash(a);
+ }
+
+ public static bool equal_name_strings(string a, string b) {
+ return String.collated_equals(a, b);
+ }
+
+ // Returns a Tag for the path, creating a new empty one if it does not already exist.
+ // path should have already been prepared by prep_tag_name.
+ public static Tag for_path(string name) {
+ Tag? tag = global.fetch_by_name(name, true);
+ if (tag == null)
+ tag = global.restore_tag_from_holding_tank(name);
+
+ if (tag != null)
+ return tag;
+
+ // create a new Tag for this name
+ try {
+ tag = new Tag(TagTable.get_instance().add(name));
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ global.add(tag);
+
+ return tag;
+ }
+
+ public static Gee.Collection<Tag> get_terminal_tags(Gee.Collection<Tag> tags) {
+ Gee.Set<string> result_paths = new Gee.HashSet<string>();
+
+ foreach (Tag tag in tags) {
+ // if it's not hierarchical, it's terminal
+ if (!tag.get_path().has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ result_paths.add(tag.get_path());
+ continue;
+ }
+
+ // okay, it is hierarchical
+
+ // has it got a parent?
+ if (tag.get_hierarchical_parent() != null) {
+ // have we seen its parent? if so, remove its parent from the result set since
+ // its parent clearly isn't terminal
+ if (result_paths.contains(tag.get_hierarchical_parent().get_path()))
+ result_paths.remove(tag.get_hierarchical_parent().get_path());
+ }
+
+ result_paths.add(tag.get_path());
+ }
+
+ Gee.ArrayList<Tag> result = new Gee.ArrayList<Tag>();
+ foreach (string path in result_paths) {
+ if (Tag.global.exists(path)) {
+ result.add(Tag.for_path(path));
+ } else {
+ foreach (Tag probed_tag in tags) {
+ if (probed_tag.get_path() == path)
+ result.add(probed_tag);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public static string make_tag_string(Gee.Collection<Tag> tags, string? start = null,
+ string separator = ", ", string? end = null, bool escape = false) {
+ StringBuilder builder = new StringBuilder(start ?? "");
+ Gee.HashSet<string> seen_tags = new Gee.HashSet<string>();
+ Gee.Collection<Tag> terminal_tags = get_terminal_tags(tags);
+ Gee.ArrayList<string> sorted_tags = new Gee.ArrayList<string>();
+ foreach (Tag tag in terminal_tags) {
+ string user_visible_name = escape ? guarded_markup_escape_text(
+ tag.get_user_visible_name()) : tag.get_user_visible_name();
+
+ if (!seen_tags.contains(user_visible_name))
+ sorted_tags.add(user_visible_name);
+ }
+
+ sorted_tags.sort();
+ Gee.Iterator<string> iter = sorted_tags.iterator();
+ while(iter.next()) {
+ builder.append(iter.get());
+ builder.append(separator);
+ }
+
+ string built = builder.str;
+
+ if (built.length >= separator.length)
+ if (built.substring(built.length - separator.length, separator.length) == separator);
+ built = built.substring(0, built.length - separator.length);
+
+ if (end != null)
+ built += end;
+
+ return built;
+ }
+
+ // Utility function to cleanup a tag name that comes from user input and prepare it for use
+ // in the system and storage in the database. Returns null if the name is unacceptable.
+ public static string? prep_tag_name(string name) {
+ return prepare_input_text(name, PrepareInputTextOptions.DEFAULT, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ }
+
+ // Akin to prep_tag_name. Returned array may be smaller than the in parameter (or empty!) if
+ // names are discovered that cannot be used.
+ public static string[] prep_tag_names(string[] names) {
+ string[] result = new string[0];
+
+ for (int ctr = 0; ctr < names.length; ctr++) {
+ string? new_name = prep_tag_name(names[ctr]);
+ if (new_name != null)
+ result += new_name;
+ }
+
+ return result;
+ }
+
+ private void set_raw_flat_name(string name) {
+ string? prepped_name = prep_tag_name(name);
+
+ assert(prepped_name != null);
+ assert(!prepped_name.has_prefix(Tag.PATH_SEPARATOR_STRING));
+
+ try {
+ TagTable.get_instance().rename(row.tag_id, prepped_name);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ return;
+ }
+
+ row.name = prepped_name;
+ name_collation_key = null;
+
+ update_indexable_keywords();
+
+ notify_altered(new Alteration.from_list("metadata:name, indexable:keywords"));
+ }
+
+ private void set_raw_path(string path, bool suppress_notify = false) {
+ string? prepped_path = prep_tag_name(path);
+
+ assert(prepped_path != null);
+ assert(prepped_path.has_prefix(Tag.PATH_SEPARATOR_STRING));
+ assert(!Tag.global.exists(prepped_path));
+
+ try {
+ TagTable.get_instance().rename(row.tag_id, prepped_path);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ return;
+ }
+
+ row.name = prepped_path;
+ name_collation_key = null;
+
+ if (!suppress_notify) {
+ update_indexable_keywords();
+ notify_altered(new Alteration.from_list("metadata:name, indexable:keywords"));
+ }
+ }
+
+ public override string get_typename() {
+ return TYPENAME;
+ }
+
+ public override int64 get_instance_id() {
+ return get_tag_id().id;
+ }
+
+ public override string get_name() {
+ return row.name;
+ }
+
+ public string get_path() {
+ return get_name();
+ }
+
+ public string get_user_visible_name() {
+ return HierarchicalTagUtilities.get_basename(get_path());
+ }
+
+ public string get_searchable_name() {
+ string istring = HierarchicalTagUtilities.get_basename(get_path()).down();
+ return String.remove_diacritics(istring);
+ }
+
+ public void flatten() {
+ assert (get_hierarchical_parent() == null);
+
+ set_raw_flat_name(get_user_visible_name());
+ }
+
+ public void promote() {
+ if (get_path().has_prefix(Tag.PATH_SEPARATOR_STRING))
+ return;
+
+ set_raw_path(Tag.PATH_SEPARATOR_STRING + get_path());
+ }
+
+ public Tag? get_hierarchical_parent() {
+ // if this is a flat tag, it has no parent
+ if (!get_path().has_prefix(Tag.PATH_SEPARATOR_STRING))
+ return null;
+
+ Gee.List<string> components =
+ HierarchicalTagUtilities.enumerate_path_components(get_path());
+
+ assert(components.size > 0);
+
+ if (components.size == 1) {
+ return null;
+ }
+
+ string parent_path = "";
+ for (int i = 0; i < (components.size - 1); i++)
+ parent_path += (Tag.PATH_SEPARATOR_STRING + components.get(i));
+
+ if (Tag.global.exists(parent_path))
+ return Tag.for_path(parent_path);
+ else
+ return null;
+ }
+
+ public int get_attachment_count(MediaSource source) {
+ // if we don't contain the source, the attachment count is zero
+ if (!contains(source))
+ return 0;
+
+ // we ourselves contain the source, so that's one attachment
+ int result = 1;
+
+ // check to see if our children contain the source
+ foreach (Tag child in get_hierarchical_children())
+ if (child.contains(source))
+ result++;
+
+ return result;
+ }
+
+ /**
+ * gets all hierarchical children of a tag recursively; tags are enumerated from most-derived
+ * to least-derived
+ */
+ public Gee.List<Tag> get_hierarchical_children() {
+ Gee.ArrayList<Tag> result = new Gee.ArrayList<Tag>();
+ Gee.ArrayList<Tag> result_reversed = new Gee.ArrayList<Tag>();
+
+ // if it's a flag tag, it doesn't have children
+ if (!get_path().has_prefix(Tag.PATH_SEPARATOR_STRING))
+ return result;
+
+ // default lexicographic comparison for strings ensures hierarchical tag paths will be
+ // sorted from least-derived to most-derived
+ Gee.TreeSet<string> forward_sorted_paths = new Gee.TreeSet<string>();
+
+ string target_path = get_path() + Tag.PATH_SEPARATOR_STRING;
+ foreach (string path in Tag.global.get_all_names()) {
+ if (path.has_prefix(target_path))
+ forward_sorted_paths.add(path);
+ }
+
+ foreach (string tmp in forward_sorted_paths) {
+ result_reversed.add(Tag.for_path(tmp));
+ }
+
+ for (int index = result_reversed.size - 1; index >= 0; index--) {
+ result.add(result_reversed[index]);
+ }
+
+ return result;
+ }
+
+ // Gets the next "untitled" tag name available.
+ // Note: Not thread-safe.
+ private static string get_next_untitled_tag_name(string? _prefix = null) {
+ string prefix = _prefix != null ? _prefix : "";
+ string candidate_name = _("untitled");
+ uint64 counter = 0;
+ do {
+ string path_candidate = prefix + candidate_name +
+ ((counter == 0) ? "" : (" " + counter.to_string()));
+
+ if (!Tag.global.exists(path_candidate))
+ return path_candidate;
+
+ counter++;
+ } while (counter < uint64.MAX);
+
+ // If we get here, it means all untitled tags up to uint64.MAX were used.
+ assert_not_reached();
+ }
+
+ public Tag create_new_child() {
+ string path_prefix = get_path();
+
+ if (!path_prefix.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ set_raw_path(HierarchicalTagUtilities.flat_to_hierarchical(get_path()));
+
+ path_prefix = get_path();
+ }
+
+ return Tag.for_path(get_next_untitled_tag_name(path_prefix + Tag.PATH_SEPARATOR_STRING));
+ }
+
+ public static Tag create_new_root() {
+ return Tag.for_path(get_next_untitled_tag_name());
+ }
+
+ public string get_name_collation_key() {
+ if (name_collation_key == null)
+ name_collation_key = row.name.collate_key();
+
+ return name_collation_key;
+ }
+
+ public override string to_string() {
+ return "Tag %s (%d sources)".printf(row.name, media_views.get_count());
+ }
+
+ public override bool equals(DataSource? source) {
+ // Validate uniqueness of primary key
+ Tag? tag = source as Tag;
+ if (tag != null) {
+ if (tag != this) {
+ assert(tag.row.tag_id.id != row.tag_id.id);
+ }
+ }
+
+ return base.equals(source);
+ }
+
+ public TagID get_tag_id() {
+ return row.tag_id;
+ }
+
+ public override SourceSnapshot? save_snapshot() {
+ return new TagSnapshot(this);
+ }
+
+ public SourceProxy get_proxy() {
+ return new TagProxy(this);
+ }
+
+ public static Tag reconstitute(int64 object_id, TagRow row) {
+ // fill in the row with the new TagID for this reconstituted tag
+ try {
+ row.tag_id = TagTable.get_instance().create_from_row(row);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ Tag tag = new Tag(row, object_id);
+ global.add(tag);
+
+ debug("Reconstituted %s", tag.to_string());
+
+ return tag;
+ }
+
+ public bool has_links() {
+ return LibraryPhoto.global.has_backlink(get_backlink());
+ }
+
+ public SourceBacklink get_backlink() {
+ return new SourceBacklink.from_source(this);
+ }
+
+ public void break_link(DataSource source) {
+ unlinking = true;
+
+ detach((LibraryPhoto) source);
+
+ unlinking = false;
+ }
+
+ public void break_link_many(Gee.Collection<DataSource> sources) {
+ unlinking = true;
+
+ detach_many((Gee.Collection<LibraryPhoto>) sources);
+
+ unlinking = false;
+ }
+
+ public void establish_link(DataSource source) {
+ relinking = true;
+
+ attach((LibraryPhoto) source);
+
+ relinking = false;
+ }
+
+ public void establish_link_many(Gee.Collection<DataSource> sources) {
+ relinking = true;
+
+ attach_many((Gee.Collection<LibraryPhoto>) sources);
+
+ relinking = false;
+ }
+
+ private void update_indexable_keywords() {
+ indexable_keywords = prepare_indexable_string(get_searchable_name());
+ }
+
+ public unowned string? get_indexable_keywords() {
+ return indexable_keywords;
+ }
+
+ public void attach(MediaSource source) {
+ Tag? attach_to = this;
+ while (attach_to != null) {
+ if (!attach_to.media_views.has_view_for_source(source)) {
+ attach_to.media_views.add(new ThumbnailView(source));
+ }
+
+ attach_to = attach_to.get_hierarchical_parent();
+ }
+ }
+
+ public void attach_many(Gee.Collection<MediaSource> sources) {
+ Tag? attach_to = this;
+ while (attach_to != null) {
+ Gee.ArrayList<ThumbnailView> view_list = new Gee.ArrayList<ThumbnailView>();
+ foreach (MediaSource source in sources) {
+ if (!attach_to.media_views.has_view_for_source(source))
+ view_list.add(new ThumbnailView(source));
+ }
+
+ if (view_list.size > 0)
+ attach_to.media_views.add_many(view_list);
+
+ attach_to = attach_to.get_hierarchical_parent();
+ }
+ }
+
+ // Returns a list of Tags the MediaSource was detached from as a result of detaching it from
+ // this Tag. (This Tag will always be in the list unless null is returned, indicating the
+ // MediaSource isn't present at all.)
+ public Gee.List<Tag>? detach(MediaSource source) {
+ DataView? this_view = media_views.get_view_for_source(source);
+ if (this_view == null)
+ return null;
+
+ Gee.List<Tag>? detached_from = new Gee.ArrayList<Tag>();
+
+ foreach (Tag child_tag in get_hierarchical_children()) {
+ DataView? child_view = child_tag.media_views.get_view_for_source(source);
+ if (child_view != null) {
+ child_tag.media_views.remove_marked(child_tag.media_views.mark(child_view));
+ detached_from.add(child_tag);
+ }
+ }
+
+ media_views.remove_marked(media_views.mark(this_view));
+ detached_from.add(this);
+
+ return detached_from;
+ }
+
+ // Returns a map of Tags the MediaSource was detached from as a result of detaching it from
+ // this Tag. (This Tag will always be in the list unless null is returned, indicating the
+ // MediaSource isn't present at all.)
+ public Gee.MultiMap<Tag, MediaSource>? detach_many(Gee.Collection<MediaSource> sources) {
+ Gee.MultiMap<Tag, MediaSource>? detached_from = new Gee.HashMultiMap<Tag, MediaSource>();
+
+ Marker marker = media_views.start_marking();
+ foreach (MediaSource source in sources) {
+ DataView? view = media_views.get_view_for_source(source);
+ if (view == null)
+ continue;
+
+ foreach (Tag child_tag in get_hierarchical_children()) {
+ DataView? child_view = child_tag.media_views.get_view_for_source(source);
+ if (child_view != null) {
+ child_tag.media_views.remove_marked(child_tag.media_views.mark(child_view));
+ detached_from.set(child_tag, source);
+ }
+ }
+
+ marker.mark(view);
+ detached_from.set(this, source);
+ }
+
+ media_views.remove_marked(marker);
+
+ return (detached_from.size > 0) ? detached_from : null;
+ }
+
+ // Returns false if the name already exists or a bad name.
+ public bool rename(string name) {
+ if (name == get_user_visible_name())
+ return true;
+
+ string? new_name = prep_tag_name(name);
+ if (new_name == null)
+ return false;
+
+ // if this is a hierarchical tag, then parents and children come into play
+ if (get_path().has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ string new_path = new_name;
+ string old_path = get_path();
+
+ Tag? parent = get_hierarchical_parent();
+ if (parent != null) {
+ new_path = parent.get_path() + PATH_SEPARATOR_STRING + new_path;
+ } else {
+ new_path = Tag.PATH_SEPARATOR_STRING + new_path;
+ }
+
+ if (Tag.global.exists(new_path, true))
+ return false;
+
+ Gee.Collection<Tag> children = get_hierarchical_children();
+
+ set_raw_path(new_path, true);
+
+ foreach (Tag child in children) {
+ // keep these loop-local temporaries around -- it's useful to be able to print them
+ // out when debugging
+ string old_child_path = child.get_path();
+
+ // find the first instance of old_path in the child path -- we want to replace
+ // the first and only the first instance
+ int old_path_index = old_child_path.index_of(old_path);
+ assert(old_path_index != -1);
+
+ string child_subpath = old_child_path.substring(old_path_index + old_path.length);
+
+ string new_child_path = new_path + child_subpath;
+
+ child.set_raw_path(new_child_path, true);
+ }
+
+ update_indexable_keywords();
+ notify_altered(new Alteration.from_list("metadata:name, indexable:keywords"));
+ foreach (Tag child in children) {
+ child.notify_altered(new Alteration.from_list("metadata:name, indexable:keywords"));
+ }
+ } else {
+ // if this is a flat tag, no problem -- just keep doing what we've always done
+ if (Tag.global.exists(new_name, true))
+ return false;
+
+ set_raw_flat_name(new_name);
+ }
+
+ return true;
+ }
+
+ public bool contains(MediaSource source) {
+ return media_views.has_view_for_source(source);
+ }
+
+ public int get_sources_count() {
+ return media_views.get_count();
+ }
+
+ public Gee.Collection<MediaSource> get_sources() {
+ return (Gee.Collection<MediaSource>) media_views.get_sources();
+ }
+
+ public void mirror_sources(ViewCollection view, CreateView mirroring_ctor) {
+ view.mirror(media_views, mirroring_ctor, null);
+ }
+
+ private void on_media_views_contents_altered(Gee.Iterable<DataView>? added,
+ Gee.Iterable<DataView>? removed) {
+ Gee.Collection<MediaSource> added_sources = null;
+ if (added != null) {
+ added_sources = new Gee.ArrayList<MediaSource>();
+ foreach (DataView view in added) {
+ MediaSource source = (MediaSource) view.get_source();
+
+ // possible a source is added twice if the same tag is in source ... add()
+ // returns true only if the set has altered
+ if (!row.source_id_list.contains(source.get_source_id())) {
+ bool is_added = row.source_id_list.add(source.get_source_id());
+ assert(is_added);
+ }
+
+ bool is_added = added_sources.add(source);
+ assert(is_added);
+ }
+ }
+
+ Gee.Collection<MediaSource> removed_sources = null;
+ if (removed != null) {
+ removed_sources = new Gee.ArrayList<MediaSource>();
+ foreach (DataView view in removed) {
+ MediaSource source = (MediaSource) view.get_source();
+
+ bool is_removed = row.source_id_list.remove(source.get_source_id());
+ assert(is_removed);
+
+ bool is_added = removed_sources.add(source);
+ assert(is_added);
+ }
+ }
+
+ try {
+ TagTable.get_instance().set_tagged_sources(row.tag_id, row.source_id_list);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ // notify of changes to this tag
+ if (added_sources != null)
+ global.notify_container_contents_added(this, added_sources, relinking);
+
+ if (removed_sources != null)
+ global.notify_container_contents_removed(this, removed_sources, unlinking);
+
+ if (added_sources != null || removed_sources != null) {
+ global.notify_container_contents_altered(this, added_sources, relinking, removed_sources,
+ unlinking);
+ }
+ }
+
+ private void on_sources_destroyed(Gee.Collection<DataSource> sources) {
+ detach_many((Gee.Collection<MediaSource>) sources);
+ }
+
+ public override void destroy() {
+ // detach all remaining sources from the tag, so observers are informed ... need to detach
+ // the contents_altered handler because it will destroy this object when sources is empty,
+ // which is bad reentrancy mojo (but hook it back up for the dtor's sake)
+ if (media_views.get_count() > 0) {
+ media_views.contents_altered.disconnect(on_media_views_contents_altered);
+
+ Gee.ArrayList<MediaSource> removed = new Gee.ArrayList<MediaSource>();
+ removed.add_all((Gee.Collection<MediaSource>) media_views.get_sources());
+
+ media_views.clear();
+
+ global.notify_container_contents_removed(this, removed, false);
+ global.notify_container_contents_altered(this, null, false, removed, false);
+
+ media_views.contents_altered.connect(on_media_views_contents_altered);
+ }
+
+ try {
+ TagTable.get_instance().remove(row.tag_id);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ base.destroy();
+ }
+}
+
diff --git a/src/Thumbnail.vala b/src/Thumbnail.vala
new file mode 100644
index 0000000..c33d43b
--- /dev/null
+++ b/src/Thumbnail.vala
@@ -0,0 +1,400 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class Thumbnail : MediaSourceItem {
+ // Collection properties Thumbnail responds to
+ // SHOW_TAGS (bool)
+ public const string PROP_SHOW_TAGS = CheckerboardItem.PROP_SHOW_SUBTITLES;
+ // SIZE (int, scale)
+ public const string PROP_SIZE = "thumbnail-size";
+ // SHOW_RATINGS (bool)
+ public const string PROP_SHOW_RATINGS = "show-ratings";
+
+ public static int MIN_SCALE {
+ get {
+ return 72;
+ }
+ }
+ public static int MAX_SCALE {
+ get {
+ return ThumbnailCache.Size.LARGEST.get_scale();
+ }
+ }
+ public static int DEFAULT_SCALE {
+ get {
+ return ThumbnailCache.Size.MEDIUM.get_scale();
+ }
+ }
+
+ public const Gdk.InterpType LOW_QUALITY_INTERP = Gdk.InterpType.NEAREST;
+ public const Gdk.InterpType HIGH_QUALITY_INTERP = Gdk.InterpType.BILINEAR;
+
+ private const int HQ_IMPROVEMENT_MSEC = 100;
+
+ private MediaSource media;
+ private int scale;
+ private Dimensions original_dim;
+ private Dimensions dim;
+ private Gdk.Pixbuf unscaled_pixbuf = null;
+ private Cancellable cancellable = null;
+ private bool hq_scheduled = false;
+ private bool hq_reschedule = false;
+ // this is cached locally because there are situations where the constant calls to is_exposed()
+ // was showing up in sysprof
+ private bool exposure = false;
+
+ public Thumbnail(MediaSource media, int scale = DEFAULT_SCALE) {
+ base (media, media.get_dimensions().get_scaled(scale, true), media.get_name(),
+ media.get_comment());
+
+ this.media = media;
+ this.scale = scale;
+
+ Tag.global.container_contents_altered.connect(on_tag_contents_altered);
+ Tag.global.items_altered.connect(on_tags_altered);
+
+ assert((media is LibraryPhoto) || (media is Video));
+ set_enable_sprockets(media is Video);
+
+ original_dim = media.get_dimensions();
+ dim = original_dim.get_scaled(scale, true);
+
+ // initialize title and tags text line so they're properly accounted for when the display
+ // size is calculated
+ update_title(true);
+ update_comment(true);
+ update_tags(true);
+ }
+
+ ~Thumbnail() {
+ if (cancellable != null)
+ cancellable.cancel();
+
+ Tag.global.container_contents_altered.disconnect(on_tag_contents_altered);
+ Tag.global.items_altered.disconnect(on_tags_altered);
+ }
+
+ private void update_tags(bool init = false) {
+ Gee.Collection<Tag>? tags = Tag.global.fetch_sorted_for_source(media);
+ if (tags == null || tags.size == 0)
+ clear_subtitle();
+ else if (!init)
+ set_subtitle(Tag.make_tag_string(tags, "<small>", ", ", "</small>", true), true);
+ else
+ set_subtitle("<small>.</small>", true);
+ }
+
+ private void on_tag_contents_altered(ContainerSource container, Gee.Collection<DataSource>? added,
+ bool relinking, Gee.Collection<DataSource>? removed, bool unlinking) {
+ if (!exposure)
+ return;
+
+ bool tag_added = (added != null) ? added.contains(media) : false;
+ bool tag_removed = (removed != null) ? removed.contains(media) : false;
+
+ // if media source we're monitoring is added or removed to any tag, update tag list
+ if (tag_added || tag_removed)
+ update_tags();
+ }
+
+ private void on_tags_altered(Gee.Map<DataObject, Alteration> altered) {
+ if (!exposure)
+ return;
+
+ foreach (DataObject object in altered.keys) {
+ Tag tag = (Tag) object;
+
+ if (tag.contains(media)) {
+ update_tags();
+
+ break;
+ }
+ }
+ }
+
+ private void update_title(bool init = false) {
+ string title = media.get_name();
+ if (is_string_empty(title))
+ clear_title();
+ else if (!init)
+ set_title(title);
+ else
+ set_title("");
+ }
+
+ private void update_comment(bool init = false) {
+ string comment = media.get_comment();
+ if (is_string_empty(comment))
+ clear_comment();
+ else if (!init)
+ set_comment(comment);
+ else
+ set_comment("");
+ }
+
+ protected override void notify_altered(Alteration alteration) {
+ if (exposure && alteration.has_detail("metadata", "name"))
+ update_title();
+ if (exposure && alteration.has_detail("metadata", "comment"))
+ update_comment();
+
+ base.notify_altered(alteration);
+ }
+
+ public MediaSource get_media_source() {
+ return media;
+ }
+
+ //
+ // Comparators
+ //
+
+ public static int64 photo_id_ascending_comparator(void *a, void *b) {
+ return ((Thumbnail *) a)->media.get_instance_id() - ((Thumbnail *) b)->media.get_instance_id();
+ }
+
+ public static int64 photo_id_descending_comparator(void *a, void *b) {
+ return photo_id_ascending_comparator(b, a);
+ }
+
+ public static int64 title_ascending_comparator(void *a, void *b) {
+ int64 result = strcmp(((Thumbnail *) a)->media.get_name(), ((Thumbnail *) b)->media.get_name());
+
+ return (result != 0) ? result : photo_id_ascending_comparator(a, b);
+ }
+
+ public static int64 title_descending_comparator(void *a, void *b) {
+ int64 result = title_ascending_comparator(b, a);
+
+ return (result != 0) ? result : photo_id_descending_comparator(a, b);
+ }
+
+ public static bool title_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "title");
+ }
+
+ public static int64 exposure_time_ascending_comparator(void *a, void *b) {
+ int64 time_a = (int64) (((Thumbnail *) a)->media.get_exposure_time());
+ int64 time_b = (int64) (((Thumbnail *) b)->media.get_exposure_time());
+ int64 result = (time_a - time_b);
+
+ return (result != 0) ? result : filename_ascending_comparator(a, b);
+ }
+
+ public static int64 exposure_time_desending_comparator(void *a, void *b) {
+ int64 result = exposure_time_ascending_comparator(b, a);
+
+ return (result != 0) ? result : filename_descending_comparator(a, b);
+ }
+
+ public static bool exposure_time_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "exposure-time");
+ }
+
+ public static int64 filename_ascending_comparator(void *a, void *b) {
+ string path_a = ((Thumbnail *) a)->media.get_file().get_basename().down();
+ string path_b = ((Thumbnail *) b)->media.get_file().get_basename().down();
+
+ int64 result = strcmp(g_utf8_collate_key_for_filename(path_a),
+ g_utf8_collate_key_for_filename(path_b));
+ return (result != 0) ? result : photo_id_ascending_comparator(a, b);
+ }
+
+ public static int64 filename_descending_comparator(void *a, void *b) {
+ int64 result = filename_ascending_comparator(b, a);
+
+ return (result != 0) ? result : photo_id_descending_comparator(a, b);
+ }
+
+ public static int64 rating_ascending_comparator(void *a, void *b) {
+ int64 result = ((Thumbnail *) a)->media.get_rating() - ((Thumbnail *) b)->media.get_rating();
+
+ return (result != 0) ? result : photo_id_ascending_comparator(a, b);
+ }
+
+ public static int64 rating_descending_comparator(void *a, void *b) {
+ int64 result = rating_ascending_comparator(b, a);
+
+ return (result != 0) ? result : photo_id_descending_comparator(a, b);
+ }
+
+ public static bool rating_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "rating");
+ }
+
+ protected override void thumbnail_altered() {
+ original_dim = media.get_dimensions();
+ dim = original_dim.get_scaled(scale, true);
+
+ if (exposure)
+ delayed_high_quality_fetch();
+ else
+ paint_empty();
+
+ base.thumbnail_altered();
+ }
+
+ protected override void notify_collection_property_set(string name, Value? old, Value val) {
+ switch (name) {
+ case PROP_SIZE:
+ resize((int) val);
+ break;
+
+ case PROP_SHOW_RATINGS:
+ notify_view_altered();
+ break;
+ }
+
+ base.notify_collection_property_set(name, old, val);
+ }
+
+ private void resize(int new_scale) {
+ assert(new_scale >= MIN_SCALE);
+ assert(new_scale <= MAX_SCALE);
+
+ if (scale == new_scale)
+ return;
+
+ scale = new_scale;
+ dim = original_dim.get_scaled(scale, true);
+
+ cancel_async_fetch();
+
+ if (exposure) {
+ // attempt to use an unscaled pixbuf (which is always larger or equal to the current
+ // size, and will most likely be larger than the new size -- and if not, a new one will
+ // be on its way), then use the current pixbuf if available (which may have to be
+ // scaled up, which is ugly)
+ Gdk.Pixbuf? resizable = null;
+ if (unscaled_pixbuf != null)
+ resizable = unscaled_pixbuf;
+ else if (has_image())
+ resizable = get_image();
+
+ if (resizable != null)
+ set_image(resize_pixbuf(resizable, dim, LOW_QUALITY_INTERP));
+
+ delayed_high_quality_fetch();
+ } else {
+ clear_image(dim);
+ }
+ }
+
+ private void paint_empty() {
+ cancel_async_fetch();
+ clear_image(dim);
+ unscaled_pixbuf = null;
+ }
+
+ private void schedule_low_quality_fetch() {
+ cancel_async_fetch();
+ cancellable = new Cancellable();
+
+ ThumbnailCache.fetch_async_scaled(media, ThumbnailCache.Size.SMALLEST,
+ dim, LOW_QUALITY_INTERP, on_low_quality_fetched, cancellable);
+ }
+
+ private void delayed_high_quality_fetch() {
+ if (hq_scheduled) {
+ hq_reschedule = true;
+
+ return;
+ }
+
+ Timeout.add_full(Priority.DEFAULT, HQ_IMPROVEMENT_MSEC, on_schedule_high_quality);
+ hq_scheduled = true;
+ }
+
+ private bool on_schedule_high_quality() {
+ if (hq_reschedule) {
+ hq_reschedule = false;
+
+ return true;
+ }
+
+ cancel_async_fetch();
+ cancellable = new Cancellable();
+
+ if (exposure) {
+ ThumbnailCache.fetch_async_scaled(media, scale, dim,
+ HIGH_QUALITY_INTERP, on_high_quality_fetched, cancellable);
+ }
+
+ hq_scheduled = false;
+
+ return false;
+ }
+
+ private void cancel_async_fetch() {
+ // cancel outstanding I/O
+ if (cancellable != null)
+ cancellable.cancel();
+ }
+
+ private void on_low_quality_fetched(Gdk.Pixbuf? pixbuf, Gdk.Pixbuf? unscaled, Dimensions dim,
+ Gdk.InterpType interp, Error? err) {
+ if (err != null)
+ critical("Unable to fetch low-quality thumbnail for %s (scale: %d): %s", to_string(), scale,
+ err.message);
+
+ if (pixbuf != null)
+ set_image(pixbuf);
+
+ if (unscaled != null)
+ unscaled_pixbuf = unscaled;
+
+ delayed_high_quality_fetch();
+ }
+
+ private void on_high_quality_fetched(Gdk.Pixbuf? pixbuf, Gdk.Pixbuf? unscaled, Dimensions dim,
+ Gdk.InterpType interp, Error? err) {
+ if (err != null)
+ critical("Unable to fetch high-quality thumbnail for %s (scale: %d): %s", to_string(), scale,
+ err.message);
+
+ if (pixbuf != null)
+ set_image(pixbuf);
+
+ if (unscaled != null)
+ unscaled_pixbuf = unscaled;
+ }
+
+ public override void exposed() {
+ exposure = true;
+
+ if (!has_image())
+ schedule_low_quality_fetch();
+
+ update_title();
+ update_comment();
+ update_tags();
+
+ base.exposed();
+ }
+
+ public override void unexposed() {
+ exposure = false;
+
+ paint_empty();
+
+ base.unexposed();
+ }
+
+ protected override Gdk.Pixbuf? get_top_right_trinket(int scale) {
+ Flaggable? flaggable = media as Flaggable;
+
+ return (flaggable != null && flaggable.is_flagged())
+ ? Resources.get_icon(Resources.ICON_FLAGGED_TRINKET) : null;
+ }
+
+ protected override Gdk.Pixbuf? get_bottom_left_trinket(int scale) {
+ Rating rating = media.get_rating();
+ bool show_ratings = (bool) get_collection_property(PROP_SHOW_RATINGS, false);
+
+ return (rating != Rating.UNRATED && show_ratings)
+ ? Resources.get_rating_trinket(rating, scale) : null;
+ }
+}
diff --git a/src/ThumbnailCache.vala b/src/ThumbnailCache.vala
new file mode 100644
index 0000000..c24087c
--- /dev/null
+++ b/src/ThumbnailCache.vala
@@ -0,0 +1,619 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class Thumbnails {
+ private Gee.HashMap<ThumbnailCache.Size, Gdk.Pixbuf> map = new Gee.HashMap<ThumbnailCache.Size,
+ Gdk.Pixbuf>();
+
+ public Thumbnails() {
+ }
+
+ public void set(ThumbnailCache.Size size, Gdk.Pixbuf pixbuf) {
+ map.set(size, pixbuf);
+ }
+
+ public void remove(ThumbnailCache.Size size) {
+ map.unset(size);
+ }
+
+ public Gdk.Pixbuf? get(ThumbnailCache.Size size) {
+ return map.get(size);
+ }
+}
+
+public class ThumbnailCache : Object {
+ public const Gdk.InterpType DEFAULT_INTERP = Gdk.InterpType.HYPER;
+ public const Jpeg.Quality DEFAULT_QUALITY = Jpeg.Quality.HIGH;
+ public const int MAX_INMEMORY_DATA_SIZE = 512 * 1024;
+
+ // Some code relies on Size's pixel values being manipulated and then using Size's methods,
+ // so be careful before changing any of these values (and especially careful before arbitrarily
+ // manipulating a Size enum)
+ public enum Size {
+ LARGEST = 360,
+ BIG = 360,
+ MEDIUM = 128,
+ SMALLEST = 128;
+
+ public int get_scale() {
+ return (int) this;
+ }
+
+ public Scaling get_scaling() {
+ return Scaling.for_best_fit(get_scale(), true);
+ }
+
+ public static Size get_best_size(int scale) {
+ return scale <= MEDIUM.get_scale() ? MEDIUM : BIG;
+ }
+ }
+
+ private static Size[] ALL_SIZES = { Size.BIG, Size.MEDIUM };
+
+ public delegate void AsyncFetchCallback(Gdk.Pixbuf? pixbuf, Gdk.Pixbuf? unscaled, Dimensions dim,
+ Gdk.InterpType interp, Error? err);
+
+ private class ImageData {
+ public Gdk.Pixbuf pixbuf;
+ public ulong bytes;
+
+ public ImageData(Gdk.Pixbuf pixbuf) {
+ this.pixbuf = pixbuf;
+
+ // This is not entirely accurate (see Gtk doc note on pixbuf Image Data), but close enough
+ // for government work
+ bytes = (ulong) pixbuf.get_rowstride() * (ulong) pixbuf.get_height();
+ }
+
+ ~ImageData() {
+ cycle_dropped_bytes += bytes;
+ schedule_debug();
+ }
+ }
+
+ private class AsyncFetchJob : BackgroundJob {
+ public ThumbnailCache cache;
+ public string thumbnail_name;
+ public ThumbnailSource source;
+ public PhotoFileFormat source_format;
+ public Dimensions dim;
+ public Gdk.InterpType interp;
+ public unowned AsyncFetchCallback callback;
+ public Gdk.Pixbuf unscaled;
+ public Gdk.Pixbuf scaled = null;
+ public Error err = null;
+ public bool fetched = false;
+
+ public AsyncFetchJob(ThumbnailCache cache, string thumbnail_name,
+ ThumbnailSource source, Gdk.Pixbuf? prefetched, Dimensions dim,
+ Gdk.InterpType interp, AsyncFetchCallback callback, Cancellable? cancellable) {
+ base(cache, async_fetch_completion_callback, cancellable);
+
+ this.cache = cache;
+ this.thumbnail_name = thumbnail_name;
+ this.source = source;
+ this.source_format = source.get_preferred_thumbnail_format();
+ this.unscaled = prefetched;
+ this.dim = dim;
+ this.interp = interp;
+ this.callback = callback;
+ }
+
+ public override BackgroundJob.JobPriority get_priority() {
+ // lower-quality interps are scheduled first; this is interpreted as a "quick" thumbnail
+ // fetch, versus higher-quality, which are to clean up the display
+ switch (interp) {
+ case Gdk.InterpType.NEAREST:
+ case Gdk.InterpType.TILES:
+ return JobPriority.HIGH;
+
+ case Gdk.InterpType.BILINEAR:
+ case Gdk.InterpType.HYPER:
+ default:
+ return JobPriority.NORMAL;
+ }
+ }
+
+ public override void execute() {
+ try {
+ // load-and-decode if not already prefetched
+ if (unscaled == null) {
+ unscaled = cache.read_pixbuf(thumbnail_name, source_format);
+ fetched = true;
+ }
+
+ if (is_cancelled())
+ return;
+
+ // scale if specified
+ scaled = dim.has_area() ? resize_pixbuf(unscaled, dim, interp) : unscaled;
+ } catch (Error err) {
+ // Is the problem that the thumbnail couldn't be read? If so, it's recoverable;
+ // we'll just create it and leave this.err as null if creation works.
+ if (err is FileError) {
+ try {
+ Photo photo = source as Photo;
+ Video video = source as Video;
+
+ if (photo != null) {
+ unscaled = photo.get_pixbuf(Scaling.for_best_fit(dim.width, true));
+ photo.notify_altered(new Alteration("image","thumbnail"));
+ return;
+ }
+
+ if (video != null) {
+ unscaled = video.create_thumbnail(dim.width);
+ scaled = resize_pixbuf(unscaled, dim, interp);
+ cache.save_thumbnail(cache.get_source_cached_file(source),
+ unscaled, source);
+ replace(source, cache.size, unscaled);
+ return;
+ }
+
+ } catch (Error e) {
+ // Creating the thumbnail failed; tell the rest of the app.
+ this.err = e;
+ return;
+ }
+ }
+
+ // ...the original error wasn't from reading the file, but something else;
+ // tell the rest of the app.
+ this.err = err;
+ }
+ }
+ }
+
+ private static Workers fetch_workers = null;
+
+ public const ulong MAX_BIG_CACHED_BYTES = 40 * 1024 * 1024;
+ public const ulong MAX_MEDIUM_CACHED_BYTES = 30 * 1024 * 1024;
+
+ private static ThumbnailCache big = null;
+ private static ThumbnailCache medium = null;
+
+ private static OneShotScheduler debug_scheduler = null;
+ private static int cycle_fetched_thumbnails = 0;
+ private static int cycle_async_fetched_thumbnails = 0;
+ private static int cycle_async_resized_thumbnails = 0;
+ private static int cycle_overflow_thumbnails = 0;
+ private static ulong cycle_dropped_bytes = 0;
+
+ private File cache_dir;
+ private Size size;
+ private ulong max_cached_bytes;
+ private Gdk.InterpType interp;
+ private Jpeg.Quality quality;
+ private Gee.HashMap<string, ImageData> cache_map = new Gee.HashMap<string, ImageData>();
+ private Gee.ArrayList<string> cache_lru = new Gee.ArrayList<string>();
+ private ulong cached_bytes = 0;
+
+ private ThumbnailCache(Size size, ulong max_cached_bytes, Gdk.InterpType interp = DEFAULT_INTERP,
+ Jpeg.Quality quality = DEFAULT_QUALITY) {
+ cache_dir = AppDirs.get_cache_subdir("thumbs", "thumbs%d".printf(size.get_scale()));
+ this.size = size;
+ this.max_cached_bytes = max_cached_bytes;
+ this.interp = interp;
+ this.quality = quality;
+ }
+
+ // Doing this because static construct {} not working nor new'ing in the above statement
+ public static void init() {
+ debug_scheduler = new OneShotScheduler("ThumbnailCache cycle reporter", report_cycle);
+ fetch_workers = new Workers(Workers.threads_per_cpu(1), true);
+
+ big = new ThumbnailCache(Size.BIG, MAX_BIG_CACHED_BYTES);
+ medium = new ThumbnailCache(Size.MEDIUM, MAX_MEDIUM_CACHED_BYTES);
+ }
+
+ public static void terminate() {
+ }
+
+ public static void import_from_source(ThumbnailSource source, bool force = false)
+ throws Error {
+ debug("import from source: %s", source.to_string());
+ big._import_from_source(source, force);
+ medium._import_from_source(source, force);
+ }
+
+ public static void import_thumbnails(ThumbnailSource source, Thumbnails thumbnails,
+ bool force = false) throws Error {
+ big._import_thumbnail(source, thumbnails.get(Size.BIG), force);
+ medium._import_thumbnail(source, thumbnails.get(Size.MEDIUM), force);
+ }
+
+ public static void duplicate(ThumbnailSource src_source, ThumbnailSource dest_source) {
+ big._duplicate(src_source, dest_source);
+ medium._duplicate(src_source, dest_source);
+ }
+
+ public static void remove(ThumbnailSource source) {
+ big._remove(source);
+ medium._remove(source);
+ }
+
+ private static ThumbnailCache get_best_cache(int scale) {
+ Size size = Size.get_best_size(scale);
+ if (size == Size.BIG) {
+ return big;
+ } else {
+ assert(size == Size.MEDIUM);
+
+ return medium;
+ }
+ }
+
+ private static ThumbnailCache get_cache_for(Size size) {
+ switch (size) {
+ case Size.BIG:
+ return big;
+
+ case Size.MEDIUM:
+ return medium;
+
+ default:
+ error("Unknown thumbnail size %d", size.get_scale());
+ }
+ }
+
+ public static Gdk.Pixbuf fetch(ThumbnailSource source, int scale) throws Error {
+ return get_best_cache(scale)._fetch(source);
+ }
+
+ public static void fetch_async(ThumbnailSource source, int scale, AsyncFetchCallback callback,
+ Cancellable? cancellable = null) {
+ get_best_cache(scale)._fetch_async(source, source.get_preferred_thumbnail_format(),
+ Dimensions(), DEFAULT_INTERP, callback, cancellable);
+ }
+
+ public static void fetch_async_scaled(ThumbnailSource source, int scale, Dimensions dim,
+ Gdk.InterpType interp, AsyncFetchCallback callback, Cancellable? cancellable = null) {
+ get_best_cache(scale)._fetch_async(source,
+ source.get_preferred_thumbnail_format(), dim, interp, callback, cancellable);
+ }
+
+ public static void replace(ThumbnailSource source, Size size, Gdk.Pixbuf replacement)
+ throws Error {
+ get_cache_for(size)._replace(source, replacement);
+ }
+
+ public static bool exists(ThumbnailSource source) {
+ return big._exists(source) && medium._exists(source);
+ }
+
+ public static void rotate(ThumbnailSource source, Rotation rotation) throws Error {
+ foreach (Size size in ALL_SIZES) {
+ Gdk.Pixbuf thumbnail = fetch(source, size);
+ thumbnail = rotation.perform(thumbnail);
+ replace(source, size, thumbnail);
+ }
+ }
+
+ // This does not add the thumbnails to the ThumbnailCache, merely generates them for the
+ // supplied image file.
+ public static void generate_for_photo(Thumbnails thumbnails, PhotoFileReader reader,
+ Orientation orientation, Dimensions original_dim) throws Error {
+ // Taking advantage of Size's values matching their pixel size
+ Size max_size = Size.BIG * 2;
+ Dimensions dim = max_size.get_scaling().get_scaled_dimensions(original_dim);
+ Gdk.Pixbuf? largest_thumbnail = null;
+ try {
+ largest_thumbnail = reader.scaled_read(original_dim, dim);
+ } catch (Error err) {
+ // if the scaled read generated an error, catch it and try to do an unscaled read
+ // followed by a downsample. If the call to unscaled_read() below throws an error,
+ // just propagate it up to the caller
+ largest_thumbnail = reader.unscaled_read();
+ }
+ largest_thumbnail = orientation.rotate_pixbuf(largest_thumbnail);
+ Dimensions largest_thumb_dimensions = Dimensions.for_pixbuf(largest_thumbnail);
+
+ foreach (Size size in ALL_SIZES) {
+ dim = size.get_scaling().get_scaled_dimensions(largest_thumb_dimensions);
+ thumbnails.set(size, largest_thumbnail.scale_simple(dim.width, dim.height, Gdk.InterpType.HYPER));
+ }
+ }
+
+ public static void generate_for_video_frame(Thumbnails thumbnails, Gdk.Pixbuf preview_frame) {
+ foreach (Size size in ALL_SIZES) {
+ Scaling current_scaling = size.get_scaling();
+ Gdk.Pixbuf current_thumbnail = current_scaling.perform_on_pixbuf(preview_frame,
+ Gdk.InterpType.HYPER, true);
+ thumbnails.set(size, current_thumbnail);
+ }
+ }
+
+ // Displaying a debug message for each thumbnail loaded and dropped can cause a ton of messages
+ // and slow down scrolling operations ... this delays reporting them, and only then reporting
+ // them in one aggregate sum
+ private static void schedule_debug() {
+#if MONITOR_THUMBNAIL_CACHE
+ debug_scheduler.priority_after_timeout(Priority.LOW, 500, true);
+#endif
+ }
+
+ private static void report_cycle() {
+#if MONITOR_THUMBNAIL_CACHE
+ if (cycle_fetched_thumbnails > 0) {
+ debug("%d thumbnails fetched into memory", cycle_fetched_thumbnails);
+ cycle_fetched_thumbnails = 0;
+ }
+
+ if (cycle_async_fetched_thumbnails > 0) {
+ debug("%d thumbnails fetched async into memory", cycle_async_fetched_thumbnails);
+ cycle_async_fetched_thumbnails = 0;
+ }
+
+ if (cycle_async_resized_thumbnails > 0) {
+ debug("%d thumbnails resized async into memory", cycle_async_resized_thumbnails);
+ cycle_async_resized_thumbnails = 0;
+ }
+
+ if (cycle_overflow_thumbnails > 0) {
+ debug("%d thumbnails overflowed from memory cache", cycle_overflow_thumbnails);
+ cycle_overflow_thumbnails = 0;
+ }
+
+ if (cycle_dropped_bytes > 0) {
+ debug("%lu bytes freed", cycle_dropped_bytes);
+ cycle_dropped_bytes = 0;
+ }
+
+ foreach (Size size in ALL_SIZES) {
+ ThumbnailCache cache = get_cache_for(size);
+ ulong avg = (cache.cache_lru.size != 0) ? cache.cached_bytes / cache.cache_lru.size : 0;
+ debug("thumbnail cache %d: %d thumbnails, %lu/%lu bytes, %lu bytes/thumbnail",
+ cache.size.get_scale(), cache.cache_lru.size, cache.cached_bytes,
+ cache.max_cached_bytes, avg);
+ }
+#endif
+ }
+
+ private Gdk.Pixbuf _fetch(ThumbnailSource source) throws Error {
+ // use JPEG in memory cache if available
+ Gdk.Pixbuf pixbuf = fetch_from_memory(source.get_source_id());
+ if (pixbuf != null)
+ return pixbuf;
+
+ pixbuf = read_pixbuf(source.get_source_id(), source.get_preferred_thumbnail_format());
+
+ cycle_fetched_thumbnails++;
+ schedule_debug();
+
+ // stash in memory for next time
+ store_in_memory(source.get_source_id(), pixbuf);
+
+ return pixbuf;
+ }
+
+ private void _fetch_async(ThumbnailSource source, PhotoFileFormat format, Dimensions dim,
+ Gdk.InterpType interp, AsyncFetchCallback callback, Cancellable? cancellable) {
+ // check if the pixbuf is already in memory
+ string thumbnail_name = source.get_source_id();
+ Gdk.Pixbuf pixbuf = fetch_from_memory(thumbnail_name);
+ if (pixbuf != null && (!dim.has_area() || Dimensions.for_pixbuf(pixbuf).equals(dim))) {
+ // if no scaling operation required, callback in this context and done (otherwise,
+ // let the background threads perform the scaling operation, to spread out the work)
+ callback(pixbuf, pixbuf, dim, interp, null);
+
+ return;
+ }
+
+ // TODO: Note that there exists a cache condition in this current implementation. It's
+ // possible for two requests for the same thumbnail to come in back-to-back. Since there's
+ // no "reservation" system to indicate that an outstanding job is fetching that thumbnail
+ // (and the other should wait until it's done), two (or more) fetches could occur on the
+ // same thumbnail file.
+ //
+ // Due to the design of Shotwell, with one thumbnail per page, this is seen as an unlikely
+ // situation. This may change in the future, and the caching situation will need to be
+ // handled.
+
+ fetch_workers.enqueue(new AsyncFetchJob(this, thumbnail_name, source, pixbuf, dim,
+ interp, callback, cancellable));
+ }
+
+ // Called within Gtk.main's thread context
+ private static void async_fetch_completion_callback(BackgroundJob background_job) {
+ AsyncFetchJob job = (AsyncFetchJob) background_job;
+
+ if (job.unscaled != null) {
+ if (job.fetched) {
+ // only store in cache if fetched, not pre-fetched
+ job.cache.store_in_memory(job.thumbnail_name, job.unscaled);
+
+ cycle_async_fetched_thumbnails++;
+ schedule_debug();
+ } else {
+ cycle_async_resized_thumbnails++;
+ schedule_debug();
+ }
+ }
+
+ job.callback(job.scaled, job.unscaled, job.dim, job.interp, job.err);
+ }
+
+ private void _import_from_source(ThumbnailSource source, bool force = false)
+ throws Error {
+ File file = get_source_cached_file(source);
+
+ // if not forcing the cache operation, check if file exists and is represented in the
+ // database before continuing
+ if (!force) {
+ if (_exists(source))
+ return;
+ } else {
+ // wipe from system and continue
+ _remove(source);
+ }
+
+ LibraryPhoto photo = (LibraryPhoto) source;
+ save_thumbnail(file, photo.get_pixbuf(Scaling.for_best_fit(size.get_scale(), true)), source);
+
+ // See note in _import_with_pixbuf for reason why this is not maintained in in-memory
+ // cache
+ }
+
+ private void _import_thumbnail(ThumbnailSource source, Gdk.Pixbuf? scaled, bool force = false)
+ throws Error {
+ assert(scaled != null);
+ assert(Dimensions.for_pixbuf(scaled).approx_scaled(size.get_scale()));
+
+ // if not forcing the cache operation, check if file exists and is represented in the
+ // database before continuing
+ if (!force) {
+ if (_exists(source))
+ return;
+ } else {
+ // wipe previous from system and continue
+ _remove(source);
+ }
+
+ save_thumbnail(get_source_cached_file(source), scaled, source);
+
+ // do NOT store in the in-memory cache ... if a lot of photos are being imported at
+ // once, this will blow cache locality, especially when the user is viewing one portion
+ // of the collection while new photos are added far off the viewport
+ }
+
+ private void _duplicate(ThumbnailSource src_source, ThumbnailSource dest_source) {
+ File src_file = get_source_cached_file(src_source);
+ File dest_file = get_cached_file(dest_source.get_representative_id(),
+ src_source.get_preferred_thumbnail_format());
+
+ try {
+ src_file.copy(dest_file, FileCopyFlags.ALL_METADATA | FileCopyFlags.OVERWRITE, null, null);
+ } catch (Error err) {
+ AppWindow.panic("%s".printf(err.message));
+ }
+
+ // Do NOT store in memory cache, for similar reasons as stated in _import().
+ }
+
+ private void _replace(ThumbnailSource source, Gdk.Pixbuf original) throws Error {
+ File file = get_source_cached_file(source);
+
+ // Remove from in-memory cache, if present
+ remove_from_memory(source.get_source_id());
+
+ // scale to cache's parameters
+ Gdk.Pixbuf scaled = scale_pixbuf(original, size.get_scale(), interp, true);
+
+ // save scaled image to disk
+ save_thumbnail(file, scaled, source);
+
+ // Store in in-memory cache; a _replace() probably represents a user-initiated
+ // action (<cough>rotate</cough>) and the thumbnail will probably be fetched immediately.
+ // This means the thumbnail will be cached in scales that aren't immediately needed, but
+ // the benefit seems to outweigh the side-effects
+ store_in_memory(source.get_source_id(), scaled);
+ }
+
+ private void _remove(ThumbnailSource source) {
+ File file = get_source_cached_file(source);
+
+ // remove from in-memory cache
+ remove_from_memory(source.get_source_id());
+
+ // remove from disk
+ try {
+ file.delete(null);
+ } catch (Error err) {
+ // ignored
+ }
+ }
+
+ private bool _exists(ThumbnailSource source) {
+ return get_source_cached_file(source).query_exists(null);
+ }
+
+ // This method is thread-safe.
+ private Gdk.Pixbuf read_pixbuf(string thumbnail_name, PhotoFileFormat format) throws Error {
+ return format.create_reader(get_cached_file(thumbnail_name,
+ format).get_path()).unscaled_read();
+ }
+
+ private File get_source_cached_file(ThumbnailSource source) {
+ return get_cached_file(source.get_representative_id(),
+ source.get_preferred_thumbnail_format());
+ }
+
+ private File get_cached_file(string thumbnail_name, PhotoFileFormat thumbnail_format) {
+ return cache_dir.get_child(thumbnail_format.get_default_basename(thumbnail_name));
+ }
+
+ private Gdk.Pixbuf? fetch_from_memory(string thumbnail_name) {
+ ImageData data = cache_map.get(thumbnail_name);
+
+ return (data != null) ? data.pixbuf : null;
+ }
+
+ private void store_in_memory(string thumbnail_name, Gdk.Pixbuf thumbnail) {
+ if (max_cached_bytes <= 0)
+ return;
+
+ remove_from_memory(thumbnail_name);
+
+ ImageData data = new ImageData(thumbnail);
+
+ // see if this is too large to keep in memory
+ if(data.bytes > MAX_INMEMORY_DATA_SIZE) {
+ debug("Persistent thumbnail [%s] too large to cache in memory", thumbnail_name);
+
+ return;
+ }
+
+ cache_map.set(thumbnail_name, data);
+ cache_lru.insert(0, thumbnail_name);
+
+ cached_bytes += data.bytes;
+
+ // trim cache
+ while (cached_bytes > max_cached_bytes) {
+ assert(cache_lru.size > 0);
+ int index = cache_lru.size - 1;
+
+ string victim_name = cache_lru.get(index);
+ cache_lru.remove_at(index);
+
+ data = cache_map.get(victim_name);
+
+ cycle_overflow_thumbnails++;
+ schedule_debug();
+
+ bool removed = cache_map.unset(victim_name);
+ assert(removed);
+
+ assert(data.bytes <= cached_bytes);
+ cached_bytes -= data.bytes;
+ }
+ }
+
+ private bool remove_from_memory(string thumbnail_name) {
+ ImageData data = cache_map.get(thumbnail_name);
+ if (data == null)
+ return false;
+
+ assert(cached_bytes >= data.bytes);
+ cached_bytes -= data.bytes;
+
+ // remove data from in-memory cache
+ bool removed = cache_map.unset(thumbnail_name);
+ assert(removed);
+
+ // remove from LRU
+ removed = cache_lru.remove(thumbnail_name);
+ assert(removed);
+
+ return true;
+ }
+
+ private void save_thumbnail(File file, Gdk.Pixbuf pixbuf, ThumbnailSource source) throws Error {
+ source.get_preferred_thumbnail_format().create_writer(file.get_path()).write(pixbuf,
+ DEFAULT_QUALITY);
+ }
+}
+
diff --git a/src/TimedQueue.vala b/src/TimedQueue.vala
new file mode 100644
index 0000000..7001421
--- /dev/null
+++ b/src/TimedQueue.vala
@@ -0,0 +1,284 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// TimedQueue is a specialized collection class. It holds items in order, but rather than being
+// manually dequeued, they are dequeued automatically after a specified amount of time has elapsed
+// for that item. As of today, it's possible the item will be dequeued a bit later than asked
+// for, but it will never be early. Future implementations might tighten up the lateness.
+//
+// The original design was to use a signal to notify when an item has been dequeued, but Vala has
+// a bug with passing an unnamed type as a signal parameter:
+// https://bugzilla.gnome.org/show_bug.cgi?id=628639
+//
+// The rate the items come off the queue can be spaced out. Note that this can cause items to back
+// up. As of today, TimedQueue makes no effort to combat this.
+
+public delegate void DequeuedCallback<G>(G item);
+
+public class TimedQueue<G> {
+ private class Element<G> {
+ public G item;
+ public ulong ready;
+
+ public Element(G item, ulong ready) {
+ this.item = item;
+ this.ready = ready;
+ }
+
+ public static int64 comparator(void *a, void *b) {
+ return (int64) ((Element *) a)->ready - (int64) ((Element *) b)->ready;
+ }
+ }
+
+ private uint hold_msec;
+ private unowned DequeuedCallback<G> callback;
+ private Gee.EqualDataFunc<G> equal_func;
+ private int priority;
+ private uint timer_id = 0;
+ private SortedList<Element<G>> queue;
+ private uint dequeue_spacing_msec = 0;
+ private ulong last_dequeue = 0;
+ private bool paused_state = false;
+
+ public virtual signal void paused(bool is_paused) {
+ }
+
+ // Initial design was to have a signal that passed the dequeued G, but bug in valac meant
+ // finding a workaround, namely using a delegate:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=628639
+ public TimedQueue(uint hold_msec, DequeuedCallback<G> callback,
+ owned Gee.EqualDataFunc? equal_func = null, int priority = Priority.DEFAULT) {
+ this.hold_msec = hold_msec;
+ this.callback = callback;
+
+ if (equal_func != null)
+ this.equal_func = (owned) equal_func;
+ else
+ this.equal_func = (Gee.EqualDataFunc<G>) (Gee.Functions.get_equal_func_for(typeof(G)));
+
+ this.priority = priority;
+
+ queue = new SortedList<Element<G>>(Element.comparator);
+
+ timer_id = Timeout.add(get_heartbeat_timeout(), on_heartbeat, priority);
+ }
+
+ ~TimedQueue() {
+ if (timer_id != 0)
+ Source.remove(timer_id);
+ }
+
+ public uint get_dequeue_spacing_msec() {
+ return dequeue_spacing_msec;
+ }
+
+ public void set_dequeue_spacing_msec(uint msec) {
+ if (msec == dequeue_spacing_msec)
+ return;
+
+ if (timer_id != 0)
+ Source.remove(timer_id);
+
+ dequeue_spacing_msec = msec;
+
+ timer_id = Timeout.add(get_heartbeat_timeout(), on_heartbeat, priority);
+ }
+
+ private uint get_heartbeat_timeout() {
+ return ((dequeue_spacing_msec == 0)
+ ? (hold_msec / 10)
+ : (dequeue_spacing_msec / 2)).clamp(10, uint.MAX);
+ }
+
+ protected virtual void notify_dequeued(G item) {
+ callback(item);
+ }
+
+ public bool is_paused() {
+ return paused_state;
+ }
+
+ public void pause() {
+ if (paused_state)
+ return;
+
+ paused_state = true;
+
+ paused(true);
+ }
+
+ public void unpause() {
+ if (!paused_state)
+ return;
+
+ paused_state = false;
+
+ paused(false);
+ }
+
+ public virtual void clear() {
+ queue.clear();
+ }
+
+ public virtual bool contains(G item) {
+ foreach (Element<G> e in queue) {
+ if (equal_func(item, e.item))
+ return true;
+ }
+
+ return false;
+ }
+
+ public virtual bool enqueue(G item) {
+ return queue.add(new Element<G>(item, calc_ready_time()));
+ }
+
+ public virtual bool enqueue_many(Gee.Collection<G> items) {
+ ulong ready_time = calc_ready_time();
+
+ Gee.ArrayList<Element<G>> elements = new Gee.ArrayList<Element<G>>();
+ foreach (G item in items)
+ elements.add(new Element<G>(item, ready_time));
+
+ return queue.add_list(elements);
+ }
+
+ public virtual bool remove_first(G item) {
+ Gee.Iterator<Element<G>> iter = queue.iterator();
+ while (iter.next()) {
+ Element<G> e = iter.get();
+ if (equal_func(item, e.item)) {
+ iter.remove();
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public virtual int size {
+ get {
+ return queue.size;
+ }
+ }
+
+ private ulong calc_ready_time() {
+ return now_ms() + (ulong) hold_msec;
+ }
+
+ private bool on_heartbeat() {
+ if (paused_state)
+ return true;
+
+ ulong now = 0;
+
+ for (;;) {
+ if (queue.size == 0)
+ break;
+
+ Element<G>? head = queue.get_at(0);
+ assert(head != null);
+
+ if (now == 0)
+ now = now_ms();
+
+ if (head.ready > now)
+ break;
+
+ // if a space of time is required between dequeues, check now
+ if ((dequeue_spacing_msec != 0) && ((now - last_dequeue) < dequeue_spacing_msec))
+ break;
+
+ Element<G>? h = queue.remove_at(0);
+ assert(head == h);
+
+ notify_dequeued(head.item);
+ last_dequeue = now;
+
+ // if a dequeue spacing is in place, it's a lock that only one item is dequeued per
+ // heartbeat
+ if (dequeue_spacing_msec != 0)
+ break;
+ }
+
+ return true;
+ }
+}
+
+// HashTimedQueue uses a HashMap for quick lookups of elements via contains().
+
+public class HashTimedQueue<G> : TimedQueue<G> {
+ private Gee.HashMap<G, int> item_count;
+
+ public HashTimedQueue(uint hold_msec, DequeuedCallback<G> callback,
+ owned Gee.HashDataFunc<G>? hash_func = null, owned Gee.EqualDataFunc<G>? equal_func = null,
+ int priority = Priority.DEFAULT) {
+ base (hold_msec, callback, (owned) equal_func, priority);
+
+ item_count = new Gee.HashMap<G, int>((owned) hash_func, (owned) equal_func);
+ }
+
+ protected override void notify_dequeued(G item) {
+ removed(item);
+
+ base.notify_dequeued(item);
+ }
+
+ public override void clear() {
+ item_count.clear();
+
+ base.clear();
+ }
+
+ public override bool contains(G item) {
+ return item_count.has_key(item);
+ }
+
+ public override bool enqueue(G item) {
+ if (!base.enqueue(item))
+ return false;
+
+ item_count.set(item, item_count.has_key(item) ? item_count.get(item) + 1 : 1);
+
+ return true;
+ }
+
+ public override bool enqueue_many(Gee.Collection<G> items) {
+ if (!base.enqueue_many(items))
+ return false;
+
+ foreach (G item in items)
+ item_count.set(item, item_count.has_key(item) ? item_count.get(item) + 1 : 1);
+
+ return true;
+ }
+
+ public override bool remove_first(G item) {
+ if (!base.remove_first(item))
+ return false;
+
+ removed(item);
+
+ return true;
+ }
+
+ private void removed(G item) {
+ // item in question is either already removed
+ // or was never added, safe to do nothing here
+ if (!item_count.has_key(item))
+ return;
+
+ int count = item_count.get(item);
+ assert(count > 0);
+
+ if (--count == 0)
+ item_count.unset(item);
+ else
+ item_count.set(item, count);
+ }
+}
+
diff --git a/src/Tombstone.vala b/src/Tombstone.vala
new file mode 100644
index 0000000..d25b979
--- /dev/null
+++ b/src/Tombstone.vala
@@ -0,0 +1,336 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class TombstoneSourceCollection : DatabaseSourceCollection {
+ private Gee.HashMap<File, Tombstone> file_map = new Gee.HashMap<File, Tombstone>(file_hash,
+ file_equal);
+
+ public TombstoneSourceCollection() {
+ base ("Tombstones", get_tombstone_id);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is Tombstone;
+ }
+
+ private static int64 get_tombstone_id(DataSource source) {
+ return ((Tombstone) source).get_tombstone_id().id;
+ }
+
+ protected override void notify_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ if (added != null) {
+ foreach (DataObject object in added) {
+ Tombstone tombstone = (Tombstone) object;
+
+ file_map.set(tombstone.get_file(), tombstone);
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ Tombstone tombstone = (Tombstone) object;
+
+ // do we actually have this file?
+ if (file_map.has_key(tombstone.get_file())) {
+ // yes, try to remove it.
+ bool is_removed = file_map.unset(tombstone.get_file());
+ assert(is_removed);
+ }
+ // if the hashmap didn't have the file to begin with,
+ // we're already in the state we wanted to be in, so our
+ // work is done; no need to assert.
+ }
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ protected override void notify_items_altered(Gee.Map<DataObject, Alteration> items) {
+ foreach (DataObject object in items.keys) {
+ Alteration alteration = items.get(object);
+ if (!alteration.has_subject("file"))
+ continue;
+
+ Tombstone tombstone = (Tombstone) object;
+
+ foreach (string detail in alteration.get_details("file")) {
+ File old_file = File.new_for_path(detail);
+
+ bool removed = file_map.unset(old_file);
+ assert(removed);
+
+ file_map.set(tombstone.get_file(), tombstone);
+
+ break;
+ }
+ }
+ }
+
+ public Tombstone? locate(File file) {
+ return file_map.get(file);
+ }
+
+ public bool matches(File file) {
+ return file_map.has_key(file);
+ }
+
+ public void resurrect(Tombstone tombstone) {
+ destroy_marked(mark(tombstone), false);
+ }
+
+ public void resurrect_many(Gee.Collection<Tombstone> tombstones) {
+ Marker marker = mark_many(tombstones);
+
+ freeze_notifications();
+ DatabaseTable.begin_transaction();
+
+ destroy_marked(marker, false);
+
+ try {
+ DatabaseTable.commit_transaction();
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ thaw_notifications();
+ }
+
+ // This initiates a scan of the tombstoned files, resurrecting them if the file is no longer
+ // present on disk. If a DirectoryMonitor is supplied, the scan will use that object's FileInfo
+ // if available. If not available or not supplied, the scan will query for the file's
+ // existence.
+ //
+ // Note that this call is non-blocking.
+ public void launch_scan(DirectoryMonitor? monitor, Cancellable? cancellable) {
+ async_scan.begin(monitor, cancellable);
+ }
+
+ private async void async_scan(DirectoryMonitor? monitor, Cancellable? cancellable) {
+ // search through all tombstones for missing files, which indicate the tombstone can go away
+ Marker marker = start_marking();
+ foreach (DataObject object in get_all()) {
+ Tombstone tombstone = (Tombstone) object;
+ File file = tombstone.get_file();
+
+ FileInfo? info = null;
+ if (monitor != null)
+ info = monitor.get_file_info(file);
+
+ // Want to be conservative here; only resurrect a tombstone if file is actually detected
+ // as not present, and not some other problem (which may be intermittant)
+ if (info == null) {
+ try {
+ info = yield file.query_info_async(FileAttribute.STANDARD_NAME,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, Priority.LOW, cancellable);
+ } catch (Error err) {
+ // watch for cancellation, which signals it's time to go
+ if (err is IOError.CANCELLED)
+ break;
+
+ if (!(err is IOError.NOT_FOUND)) {
+ warning("Unable to check for existence of tombstoned file %s: %s",
+ file.get_path(), err.message);
+ }
+ }
+ }
+
+ // if not found, resurrect
+ if (info == null)
+ marker.mark(tombstone);
+
+ Idle.add(async_scan.callback);
+ yield;
+ }
+
+ if (marker.get_count() > 0) {
+ debug("Resurrecting %d tombstones with no backing file", marker.get_count());
+ DatabaseTable.begin_transaction();
+ destroy_marked(marker, false);
+ try {
+ DatabaseTable.commit_transaction();
+ } catch (DatabaseError err2) {
+ AppWindow.database_error(err2);
+ }
+ }
+ }
+}
+
+public class TombstonedFile {
+ public File file;
+ public int64 filesize;
+ public string? md5;
+
+ public TombstonedFile(File file, int64 filesize, string? md5) {
+ this.file = file;
+ this.filesize = filesize;
+ this.md5 = md5;
+ }
+}
+
+public class Tombstone : DataSource {
+ // These values are persisted. Do not change.
+ public enum Reason {
+ REMOVED_BY_USER = 0,
+ AUTO_DETECTED_DUPLICATE = 1;
+
+ public int serialize() {
+ return (int) this;
+ }
+
+ public static Reason unserialize(int value) {
+ switch ((Reason) value) {
+ case AUTO_DETECTED_DUPLICATE:
+ return AUTO_DETECTED_DUPLICATE;
+
+ // 0 is the default in the database, so it should remain so here
+ case REMOVED_BY_USER:
+ default:
+ return REMOVED_BY_USER;
+ }
+ }
+ }
+
+ public static TombstoneSourceCollection global = null;
+
+ private TombstoneRow row;
+ private File? file = null;
+
+ private Tombstone(TombstoneRow row) {
+ this.row = row;
+ }
+
+ public static void init() {
+ global = new TombstoneSourceCollection();
+
+ TombstoneRow[]? rows = null;
+ try {
+ rows = TombstoneTable.get_instance().fetch_all();
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ if (rows != null) {
+ Gee.ArrayList<Tombstone> tombstones = new Gee.ArrayList<Tombstone>();
+ foreach (TombstoneRow row in rows)
+ tombstones.add(new Tombstone(row));
+
+ global.add_many(tombstones);
+ }
+ }
+
+ public static void terminate() {
+ }
+
+ public static void entomb_many_sources(Gee.Collection<MediaSource> sources, Reason reason)
+ throws DatabaseError {
+ Gee.Collection<TombstonedFile> files = new Gee.ArrayList<TombstonedFile>();
+ foreach (MediaSource source in sources) {
+ foreach (BackingFileState state in source.get_backing_files_state())
+ files.add(new TombstonedFile(state.get_file(), state.filesize, state.md5));
+ }
+
+ entomb_many_files(files, reason);
+ }
+
+ public static void entomb_many_files(Gee.Collection<TombstonedFile> files, Reason reason)
+ throws DatabaseError {
+ // destroy any out-of-date tombstones so they may be updated
+ Marker to_destroy = global.start_marking();
+ foreach (TombstonedFile file in files) {
+ Tombstone? tombstone = global.locate(file.file);
+ if (tombstone != null)
+ to_destroy.mark(tombstone);
+ }
+
+ global.destroy_marked(to_destroy, false);
+
+ Gee.ArrayList<Tombstone> tombstones = new Gee.ArrayList<Tombstone>();
+ foreach (TombstonedFile file in files) {
+ tombstones.add(new Tombstone(TombstoneTable.get_instance().add(file.file.get_path(),
+ file.filesize, file.md5, reason)));
+ }
+
+ global.add_many(tombstones);
+ }
+
+ public override string get_typename() {
+ return "tombstone";
+ }
+
+ public override int64 get_instance_id() {
+ return get_tombstone_id().id;
+ }
+
+ public override string get_name() {
+ return row.filepath;
+ }
+
+ public override string to_string() {
+ return "Tombstone %s".printf(get_name());
+ }
+
+ public TombstoneID get_tombstone_id() {
+ return row.id;
+ }
+
+ public File get_file() {
+ if (file == null)
+ file = File.new_for_path(row.filepath);
+
+ return file;
+ }
+
+ public string? get_md5() {
+ return is_string_empty(row.md5) ? null : row.md5;
+ }
+
+ public Reason get_reason() {
+ return row.reason;
+ }
+
+ public void move(File file) {
+ try {
+ TombstoneTable.get_instance().update_file(row.id, file.get_path());
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ string old_filepath = row.filepath;
+ row.filepath = file.get_path();
+ this.file = file;
+
+ notify_altered(new Alteration("file", old_filepath));
+ }
+
+ public bool matches(File file, int64 filesize, string? md5) {
+ if (row.filesize != filesize)
+ return false;
+
+ // normalize to deal with empty strings
+ string? this_md5 = is_string_empty(row.md5) ? null : row.md5;
+ string? other_md5 = is_string_empty(md5) ? null : md5;
+
+ if (this_md5 != other_md5)
+ return false;
+
+ if (!get_file().equal(file))
+ return false;
+
+ return true;
+ }
+
+ public override void destroy() {
+ try {
+ TombstoneTable.get_instance().remove(row.id);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ base.destroy();
+ }
+}
+
diff --git a/src/UnityProgressBar.vala b/src/UnityProgressBar.vala
new file mode 100644
index 0000000..fcf36bc
--- /dev/null
+++ b/src/UnityProgressBar.vala
@@ -0,0 +1,83 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+#if UNITY_SUPPORT
+public class UnityProgressBar : Object {
+
+ private static Unity.LauncherEntry l = Unity.LauncherEntry.get_for_desktop_id("shotwell.desktop");
+ private static UnityProgressBar? visible_uniprobar;
+
+ private double progress;
+ private bool visible;
+
+ public static UnityProgressBar get_instance() {
+ if (visible_uniprobar == null) {
+ visible_uniprobar = new UnityProgressBar();
+ }
+
+ return visible_uniprobar;
+ }
+
+ private UnityProgressBar() {
+ progress = 0.0;
+ visible = false;
+ }
+
+ ~UnityProgressBar () {
+ reset_progress_bar();
+ }
+
+ public double get_progress () {
+ return progress;
+ }
+
+ public void set_progress (double percent) {
+ progress = percent;
+ update_visibility();
+ }
+
+ private void update_visibility () {
+ set_progress_bar(this, progress);
+ }
+
+ public bool get_visible () {
+ return visible;
+ }
+
+ public void set_visible (bool visible) {
+ this.visible = visible;
+
+ if (!visible) {
+ //if not visible and currently displayed, remove Unity progress bar
+ reset_progress_bar();
+ } else {
+ //update_visibility if this progress bar wants to be drawn
+ update_visibility();
+ }
+ }
+
+ public void reset () {
+ set_visible(false);
+ progress = 0.0;
+ }
+
+ private static void set_progress_bar (UnityProgressBar uniprobar, double percent) {
+ //set new visible ProgressBar
+ visible_uniprobar = uniprobar;
+ if (!l.progress_visible)
+ l.progress_visible = true;
+ l.progress = percent;
+ }
+
+ private static void reset_progress_bar () {
+ //reset to default values
+ visible_uniprobar = null;
+ l.progress = 0.0;
+ l.progress_visible = false;
+ }
+}
+
+#endif
diff --git a/src/Upgrades.vala b/src/Upgrades.vala
new file mode 100644
index 0000000..7fef59a
--- /dev/null
+++ b/src/Upgrades.vala
@@ -0,0 +1,115 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Class for aggregating one-off "upgrade" tasks that occur at startup, such as
+// moving or deleting files. This occurs after the UI is shown, so it's not appropriate
+// for database updates and such.
+public class Upgrades {
+ private static Upgrades? instance = null;
+ private uint64 total_steps = 0;
+ private Gee.LinkedList<UpgradeTask> task_list = new Gee.LinkedList<UpgradeTask>();
+
+ private Upgrades() {
+ // Add all upgrade tasks here.
+ add(new MimicsRemovalTask());
+
+ if (Application.get_instance().get_raw_thumbs_fix_required())
+ add(new FixupRawThumbnailsTask());
+ }
+
+ // Call this to initialize the subsystem.
+ public static void init() {
+ assert(instance == null);
+ instance = new Upgrades();
+ }
+
+ public static Upgrades get_instance() {
+ return instance;
+ }
+
+ // Gets the total number of steps for the progress monitor.
+ public uint64 get_step_count() {
+ return total_steps;
+ }
+
+ // Performs all upgrade tasks.
+ public void execute(ProgressMonitor? monitor = null) {
+ foreach (UpgradeTask task in task_list)
+ task.execute(monitor);
+ }
+
+ private void add(UpgradeTask task) {
+ total_steps += task.get_step_count();
+ task_list.add(task);
+ }
+}
+
+// Interface for upgrades that happen on startup.
+// When creating a new upgrade task, you MUST add it to the constructor
+// supplied in Upgrades (see above.)
+private interface UpgradeTask : Object{
+ // Returns the number of steps involved in the ugprade.
+ public abstract uint64 get_step_count();
+
+ // Performs the upgrade. Note that when using the progress
+ // monitor, the total number of steps must be equal to the
+ // step count above.
+ public abstract void execute(ProgressMonitor? monitor = null);
+}
+
+// Deletes the mimics folder, if it still exists.
+// Note: for the step count to be consistent, files cannot be written
+// to the mimcs folder for the durration of this task.
+private class MimicsRemovalTask : Object, UpgradeTask {
+ // Mimics folder (to be deleted, if present)
+ private File mimic_dir = AppDirs.get_data_dir().get_child("mimics");
+ private uint64 num_mimics = 0;
+
+ public uint64 get_step_count() {
+ try {
+ num_mimics = count_files_in_directory(mimic_dir);
+ } catch (Error e) {
+ debug("Error on deleting mimics: %s", e.message);
+ }
+ return num_mimics;
+ }
+
+ public void execute(ProgressMonitor? monitor = null) {
+ try {
+ delete_all_files(mimic_dir, null, monitor, num_mimics, null);
+ mimic_dir.delete();
+ } catch (Error e) {
+ debug("Could not delete mimics: %s", e.message);
+ }
+ }
+}
+
+// Deletes 'stale' thumbnails from camera raw files whose default developer was
+// CAMERA and who may have been incorrectly generated from the embedded preview by
+// previous versions of the application that had bug 4692.
+private class FixupRawThumbnailsTask : Object, UpgradeTask {
+ public uint64 get_step_count() {
+ int num_raw_files = 0;
+
+ foreach (PhotoRow phr in PhotoTable.get_instance().get_all()) {
+ if (phr.master.file_format == PhotoFileFormat.RAW)
+ num_raw_files++;
+ }
+ return num_raw_files;
+ }
+
+ public void execute(ProgressMonitor? monitor = null) {
+ debug("Executing thumbnail deletion and fixup");
+
+ foreach (PhotoRow phr in PhotoTable.get_instance().get_all()) {
+ if ((phr.master.file_format == PhotoFileFormat.RAW) &&
+ (phr.developer == RawDeveloper.CAMERA)) {
+ ThumbnailCache.remove(LibraryPhoto.global.fetch(phr.photo_id));
+ }
+ }
+ }
+}
+
diff --git a/src/VideoMetadata.vala b/src/VideoMetadata.vala
new file mode 100644
index 0000000..100a040
--- /dev/null
+++ b/src/VideoMetadata.vala
@@ -0,0 +1,655 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class VideoMetadata : MediaMetadata {
+
+ private MetadataDateTime timestamp = null;
+ private string title = null;
+ private string comment = null;
+
+ public VideoMetadata() {
+ }
+
+ ~VideoMetadata() {
+ }
+
+ public override void read_from_file(File file) throws Error {
+ QuickTimeMetadataLoader quicktime = new QuickTimeMetadataLoader(file);
+ if (quicktime.is_supported()) {
+ timestamp = quicktime.get_creation_date_time();
+ title = quicktime.get_title();
+ // TODO: is there an quicktime.get_comment ??
+ comment = null;
+ return;
+ }
+ AVIMetadataLoader avi = new AVIMetadataLoader(file);
+ if (avi.is_supported()) {
+ timestamp = avi.get_creation_date_time();
+ title = avi.get_title();
+ comment = null;
+ return;
+ }
+
+ throw new IOError.NOT_SUPPORTED("File %s is not a supported video format", file.get_path());
+ }
+
+ public override MetadataDateTime? get_creation_date_time() {
+ return timestamp;
+ }
+
+ public override string? get_title() {
+ return title;
+ }
+
+ public override string? get_comment() {
+ return comment;
+ }
+
+}
+
+private class QuickTimeMetadataLoader {
+
+ // Quicktime calendar date/time format is number of seconds since January 1, 1904.
+ // This converts to UNIX time (66 years + 17 leap days).
+ public const time_t QUICKTIME_EPOCH_ADJUSTMENT = 2082844800;
+
+ private File file = null;
+
+ public QuickTimeMetadataLoader(File file) {
+ this.file = file;
+ }
+
+ public MetadataDateTime? get_creation_date_time() {
+ return new MetadataDateTime((time_t) get_creation_date_time_for_quicktime());
+ }
+
+ public string? get_title() {
+ // Not supported.
+ return null;
+ }
+
+ // Checks if the given file is a QuickTime file.
+ public bool is_supported() {
+ QuickTimeAtom test = new QuickTimeAtom(file);
+
+ bool ret = false;
+ try {
+ test.open_file();
+ test.read_atom();
+
+ // Look for the header.
+ if ("ftyp" == test.get_current_atom_name()) {
+ ret = true;
+ } else {
+ // Some versions of QuickTime don't have
+ // an ftyp section, so we'll just look
+ // for the mandatory moov section.
+ while(true) {
+ if ("moov" == test.get_current_atom_name()) {
+ ret = true;
+ break;
+ }
+ test.next_atom();
+ test.read_atom();
+ if (test.is_last_atom()) {
+ break;
+ }
+ }
+ }
+ } catch (GLib.Error e) {
+ debug("Error while testing for QuickTime file for %s: %s", file.get_path(), e.message);
+ }
+
+ try {
+ test.close_file();
+ } catch (GLib.Error e) {
+ debug("Error while closing Quicktime file: %s", e.message);
+ }
+ return ret;
+ }
+
+ private ulong get_creation_date_time_for_quicktime() {
+ QuickTimeAtom test = new QuickTimeAtom(file);
+ time_t timestamp = 0;
+
+ try {
+ test.open_file();
+ bool done = false;
+ while(!done) {
+ // Look for "moov" section.
+ test.read_atom();
+ if (test.is_last_atom()) break;
+ if ("moov" == test.get_current_atom_name()) {
+ QuickTimeAtom child = test.get_first_child_atom();
+ while (!done) {
+ // Look for "mvhd" section, or break if none is found.
+ child.read_atom();
+ if (child.is_last_atom() || 0 == child.section_size_remaining()) {
+ done = true;
+ break;
+ }
+
+ if ("mvhd" == child.get_current_atom_name()) {
+ // Skip 4 bytes (version + flags)
+ child.read_uint32();
+ // Grab the timestamp.
+ timestamp = child.read_uint32() - QUICKTIME_EPOCH_ADJUSTMENT;
+ done = true;
+ break;
+ }
+ child.next_atom();
+ }
+ }
+ test.next_atom();
+ }
+ } catch (GLib.Error e) {
+ debug("Error while testing for QuickTime file: %s", e.message);
+ }
+
+ try {
+ test.close_file();
+ } catch (GLib.Error e) {
+ debug("Error while closing Quicktime file: %s", e.message);
+ }
+
+ // Some Android phones package videos recorded with their internal cameras in a 3GP
+ // container that looks suspiciously like a QuickTime container but really isn't -- for
+ // the timestamps of these Android 3GP videos are relative to the UNIX epoch
+ // (January 1, 1970) instead of the QuickTime epoch (January 1, 1904). So, if we detect a
+ // QuickTime movie with a negative timestamp, we can be pretty sure it isn't a valid
+ // QuickTime movie that was shot before 1904 but is instead a non-compliant 3GP video
+ // file. If we detect such a video, we correct its time. See this Redmine ticket
+ // (http://redmine.yorba.org/issues/3314) for more information.
+ if (timestamp < 0)
+ timestamp += QUICKTIME_EPOCH_ADJUSTMENT;
+
+ return (ulong) timestamp;
+ }
+}
+
+private class QuickTimeAtom {
+ private GLib.File file = null;
+ private string section_name = "";
+ private uint64 section_size = 0;
+ private uint64 section_offset = 0;
+ private GLib.DataInputStream input = null;
+ private QuickTimeAtom? parent = null;
+
+ public QuickTimeAtom(GLib.File file) {
+ this.file = file;
+ }
+
+ private QuickTimeAtom.with_input_stream(GLib.DataInputStream input, QuickTimeAtom parent) {
+ this.input = input;
+ this.parent = parent;
+ }
+
+ public void open_file() throws GLib.Error {
+ close_file();
+ input = new GLib.DataInputStream(file.read());
+ input.set_byte_order(DataStreamByteOrder.BIG_ENDIAN);
+ section_size = 0;
+ section_offset = 0;
+ section_name = "";
+ }
+
+ public void close_file() throws GLib.Error {
+ if (null != input) {
+ input.close();
+ input = null;
+ }
+ }
+
+ private void advance_section_offset(uint64 amount) {
+ section_offset += amount;
+ if (null != parent) {
+ parent.advance_section_offset(amount);
+ }
+ }
+
+ public QuickTimeAtom get_first_child_atom() {
+ // Child will simply have the input stream
+ // but not the size/offset. This works because
+ // child atoms follow immediately after a header,
+ // so no skipping is required to access the child
+ // from the current position.
+ return new QuickTimeAtom.with_input_stream(input, this);
+ }
+
+ public uchar read_byte() throws GLib.Error {
+ advance_section_offset(1);
+ return input.read_byte();
+ }
+
+ public uint32 read_uint32() throws GLib.Error {
+ advance_section_offset(4);
+ return input.read_uint32();
+ }
+
+ public uint64 read_uint64() throws GLib.Error {
+ advance_section_offset(8);
+ return input.read_uint64();
+ }
+
+ public void read_atom() throws GLib.Error {
+ // Read atom size.
+ section_size = read_uint32();
+
+ // Read atom name.
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ section_name = sb.str;
+
+ // Check string.
+ if (section_name.length != 4) {
+ throw new IOError.NOT_SUPPORTED("QuickTime atom name length is invalid for %s",
+ file.get_path());
+ }
+ for (int i = 0; i < section_name.length; i++) {
+ if (!section_name[i].isprint()) {
+ throw new IOError.NOT_SUPPORTED("Bad QuickTime atom in file %s", file.get_path());
+ }
+ }
+
+ if (1 == section_size) {
+ // This indicates the section size is a 64-bit
+ // value, specified below the atom name.
+ section_size = read_uint64();
+ }
+ }
+
+ private void skip(uint64 skip_amount) throws GLib.Error {
+ skip_uint64(input, skip_amount);
+ }
+
+ public uint64 section_size_remaining() {
+ assert(section_size >= section_offset);
+ return section_size - section_offset;
+ }
+
+ public void next_atom() throws GLib.Error {
+ skip(section_size_remaining());
+ section_size = 0;
+ section_offset = 0;
+ }
+
+ public string get_current_atom_name() {
+ return section_name;
+ }
+
+ public bool is_last_atom() {
+ return 0 == section_size;
+ }
+
+}
+
+private class AVIMetadataLoader {
+
+ private File file = null;
+
+ // A numerical date string, i.e 2010:01:28 14:54:25
+ private const int NUMERICAL_DATE_LENGTH = 19;
+
+ // Marker for timestamp section in a Nikon nctg blob.
+ private const uint16 NIKON_NCTG_TIMESTAMP_MARKER = 0x13;
+
+ // Size limit to ensure we don't parse forever on a bad file.
+ private const int MAX_STRD_LENGTH = 100;
+
+ public AVIMetadataLoader(File file) {
+ this.file = file;
+ }
+
+ public MetadataDateTime? get_creation_date_time() {
+ return new MetadataDateTime((time_t) get_creation_date_time_for_avi());
+ }
+
+ public string? get_title() {
+ // Not supported.
+ return null;
+ }
+
+ // Checks if the given file is an AVI file.
+ public bool is_supported() {
+ AVIChunk chunk = new AVIChunk(file);
+ bool ret = false;
+ try {
+ chunk.open_file();
+ chunk.read_chunk();
+ // Look for the header and identifier.
+ if ("RIFF" == chunk.get_current_chunk_name() &&
+ "AVI " == chunk.read_name()) {
+ ret = true;
+ }
+ } catch (GLib.Error e) {
+ debug("Error while testing for AVI file: %s", e.message);
+ }
+
+ try {
+ chunk.close_file();
+ } catch (GLib.Error e) {
+ debug("Error while closing AVI file: %s", e.message);
+ }
+ return ret;
+ }
+
+ // Parses a Nikon nctg tag. Based losely on avi_read_nikon() in FFmpeg.
+ private string read_nikon_nctg_tag(AVIChunk chunk) throws GLib.Error {
+ bool found_date = false;
+ while (chunk.section_size_remaining() > sizeof(uint16)*2) {
+ uint16 tag = chunk.read_uint16();
+ uint16 size = chunk.read_uint16();
+ if (NIKON_NCTG_TIMESTAMP_MARKER == tag) {
+ found_date = true;
+ break;
+ }
+ chunk.skip(size);
+ }
+
+ if (found_date) {
+ // Read numerical date string, example: 2010:01:28 14:54:25
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ for (int i = 0; i < NUMERICAL_DATE_LENGTH; i++) {
+ sb.append_c((char) chunk.read_byte());
+ }
+ return sb.str;
+ }
+ return "";
+ }
+
+ // Parses a Fujifilm strd tag. Based on information from:
+ // http://www.eden-foundation.org/products/code/film_date_stamp/index.html
+ private string read_fuji_strd_tag(AVIChunk chunk) throws GLib.Error {
+ chunk.skip(98); // Ignore 98-byte binary blob.
+ chunk.skip(8); // Ignore the string "FUJIFILM"
+ // Read until we find four colons, then two more chars.
+ int colons = 0;
+ int post_colons = 0;
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ // End of date is two chars past the fourth colon.
+ while (colons <= 4 && post_colons < 2) {
+ char c = (char) chunk.read_byte();
+ if (4 == colons) {
+ post_colons++;
+ }
+ if (':' == c) {
+ colons++;
+ }
+ if (c.isprint()) {
+ sb.append_c(c);
+ }
+ if (sb.len > MAX_STRD_LENGTH) {
+ return ""; // Give up searching.
+ }
+ }
+
+ if (sb.str.length < NUMERICAL_DATE_LENGTH) {
+ return "";
+ }
+ // Date is now at the end of the string.
+ return sb.str.substring(sb.str.length - NUMERICAL_DATE_LENGTH);
+ }
+
+ // Recursively read file until the section is found.
+ private string? read_section(AVIChunk chunk) throws GLib.Error {
+ while (true) {
+ chunk.read_chunk();
+ string name = chunk.get_current_chunk_name();
+ if ("IDIT" == name) {
+ return chunk.section_to_string();
+ } else if ("nctg" == name) {
+ return read_nikon_nctg_tag(chunk);
+ } else if ("strd" == name) {
+ return read_fuji_strd_tag(chunk);
+ }
+
+ if ("LIST" == name) {
+ chunk.read_name(); // Read past list name.
+ string result = read_section(chunk.get_first_child_chunk());
+ if (null != result) {
+ return result;
+ }
+ }
+
+ if (chunk.is_last_chunk()) {
+ break;
+ }
+ chunk.next_chunk();
+ }
+ return null;
+ }
+
+ // Parses a date from a string.
+ // Largely based on GStreamer's avi/gstavidemux.c
+ // and the information here:
+ // http://www.eden-foundation.org/products/code/film_date_stamp/index.html
+ private ulong parse_date(string sdate) {
+ if (sdate.length == 0) {
+ return 0;
+ }
+
+ Date date = Date();
+ uint seconds = 0;
+ int year, month, day, hour, min, sec;
+ char weekday[4];
+ char monthstr[4];
+
+ if (sdate[0].isdigit()) {
+ // Format is: 2005:08:17 11:42:43
+ // Format is: 2010/11/30/ 19:42
+ // Format is: 2010/11/30 19:42
+ string tmp = sdate.dup();
+ tmp.canon("0123456789 ", ' '); // strip everything but numbers and spaces
+ sec = 0;
+ int result = tmp.scanf("%d %d %d %d %d %d", out year, out month, out day, out hour, out min, out sec);
+ if(result < 5) {
+ return 0;
+ }
+ date.set_dmy((DateDay) day, (DateMonth) month, (DateYear) year);
+ seconds = sec + min * 60 + hour * 3600;
+ } else {
+ // Format is: Mon Mar 3 09:44:56 2008
+ if(7 != sdate.scanf("%3s %3s %d %d:%d:%d %d", weekday, monthstr, out day, out hour,
+ out min, out sec, out year)) {
+ return 0; // Error
+ }
+ date.set_dmy((DateDay) day, month_from_string((string) monthstr), (DateYear) year);
+ seconds = sec + min * 60 + hour * 3600;
+ }
+
+ Time time = Time();
+ date.to_time(out time);
+
+ // watch for overflow (happens on quasi-bogus dates, like Year 200)
+ time_t tm = time.mktime();
+ ulong result = tm + seconds;
+ if (result < tm) {
+ debug("Overflow for timestamp in video file %s", file.get_path());
+
+ return 0;
+ }
+
+ return result;
+ }
+
+ private DateMonth month_from_string(string s) {
+ switch (s.down()) {
+ case "jan":
+ return DateMonth.JANUARY;
+ case "feb":
+ return DateMonth.FEBRUARY;
+ case "mar":
+ return DateMonth.MARCH;
+ case "apr":
+ return DateMonth.APRIL;
+ case "may":
+ return DateMonth.MAY;
+ case "jun":
+ return DateMonth.JUNE;
+ case "jul":
+ return DateMonth.JULY;
+ case "aug":
+ return DateMonth.AUGUST;
+ case "sep":
+ return DateMonth.SEPTEMBER;
+ case "oct":
+ return DateMonth.OCTOBER;
+ case "nov":
+ return DateMonth.NOVEMBER;
+ case "dec":
+ return DateMonth.DECEMBER;
+ }
+ return DateMonth.BAD_MONTH;
+ }
+
+ private ulong get_creation_date_time_for_avi() {
+ AVIChunk chunk = new AVIChunk(file);
+ ulong timestamp = 0;
+ try {
+ chunk.open_file();
+ chunk.nonsection_skip(12); // Advance past 12 byte header.
+ string sdate = read_section(chunk);
+ if (null != sdate) {
+ timestamp = parse_date(sdate.strip());
+ }
+ } catch (GLib.Error e) {
+ debug("Error while reading AVI file: %s", e.message);
+ }
+
+ try {
+ chunk.close_file();
+ } catch (GLib.Error e) {
+ debug("Error while closing AVI file: %s", e.message);
+ }
+ return timestamp;
+ }
+}
+
+private class AVIChunk {
+ private GLib.File file = null;
+ private string section_name = "";
+ private uint64 section_size = 0;
+ private uint64 section_offset = 0;
+ private GLib.DataInputStream input = null;
+ private AVIChunk? parent = null;
+ private const int MAX_STRING_TO_SECTION_LENGTH = 1024;
+
+ public AVIChunk(GLib.File file) {
+ this.file = file;
+ }
+
+ private AVIChunk.with_input_stream(GLib.DataInputStream input, AVIChunk parent) {
+ this.input = input;
+ this.parent = parent;
+ }
+
+ public void open_file() throws GLib.Error {
+ close_file();
+ input = new GLib.DataInputStream(file.read());
+ input.set_byte_order(DataStreamByteOrder.LITTLE_ENDIAN);
+ section_size = 0;
+ section_offset = 0;
+ section_name = "";
+ }
+
+ public void close_file() throws GLib.Error {
+ if (null != input) {
+ input.close();
+ input = null;
+ }
+ }
+
+ public void nonsection_skip(uint64 skip_amount) throws GLib.Error {
+ skip_uint64(input, skip_amount);
+ }
+
+ public void skip(uint64 skip_amount) throws GLib.Error {
+ advance_section_offset(skip_amount);
+ skip_uint64(input, skip_amount);
+ }
+
+ public AVIChunk get_first_child_chunk() {
+ return new AVIChunk.with_input_stream(input, this);
+ }
+
+ private void advance_section_offset(uint64 amount) {
+ if ((section_offset + amount) > section_size)
+ amount = section_size - section_offset;
+
+ section_offset += amount;
+ if (null != parent) {
+ parent.advance_section_offset(amount);
+ }
+ }
+
+ public uchar read_byte() throws GLib.Error {
+ advance_section_offset(1);
+ return input.read_byte();
+ }
+
+ public uint16 read_uint16() throws GLib.Error {
+ advance_section_offset(2);
+ return input.read_uint16();
+ }
+
+ public void read_chunk() throws GLib.Error {
+ // don't use checked reads here because they advance the section offset, which we're trying
+ // to determine here
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ sb.append_c((char) input.read_byte());
+ sb.append_c((char) input.read_byte());
+ sb.append_c((char) input.read_byte());
+ sb.append_c((char) input.read_byte());
+ section_name = sb.str;
+ section_size = input.read_uint32();
+ section_offset = 0;
+ }
+
+ public string read_name() throws GLib.Error {
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ sb.append_c((char) read_byte());
+ return sb.str;
+ }
+
+ public void next_chunk() throws GLib.Error {
+ skip(section_size_remaining());
+ section_size = 0;
+ section_offset = 0;
+ }
+
+ public string get_current_chunk_name() {
+ return section_name;
+ }
+
+ public bool is_last_chunk() {
+ return section_size == 0;
+ }
+
+ public uint64 section_size_remaining() {
+ assert(section_size >= section_offset);
+ return section_size - section_offset;
+ }
+
+ // Reads section contents into a string.
+ public string section_to_string() throws GLib.Error {
+ GLib.StringBuilder sb = new GLib.StringBuilder();
+ while (section_offset < section_size) {
+ sb.append_c((char) read_byte());
+ if (sb.len > MAX_STRING_TO_SECTION_LENGTH) {
+ return sb.str;
+ }
+ }
+ return sb.str;
+ }
+
+}
+
diff --git a/src/VideoMonitor.vala b/src/VideoMonitor.vala
new file mode 100644
index 0000000..f062999
--- /dev/null
+++ b/src/VideoMonitor.vala
@@ -0,0 +1,301 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+private class VideoUpdates : MonitorableUpdates {
+ public Video video;
+
+ private bool check_interpretable = false;
+
+ public VideoUpdates(Video video) {
+ base (video);
+
+ this.video = video;
+ }
+
+ public virtual void set_check_interpretable(bool check) {
+ check_interpretable = check;
+ }
+
+ public override void mark_online() {
+ base.mark_online();
+
+ set_check_interpretable(true);
+ }
+
+ public bool is_check_interpretable() {
+ return check_interpretable;
+ }
+
+ public override bool is_all_updated() {
+ return (check_interpretable == false) && base.is_all_updated();
+ }
+}
+
+private class VideoMonitor : MediaMonitor {
+ private const int MAX_INTERPRETABLE_CHECKS_PER_CYCLE = 5;
+
+ // Performs interpretable check on video. In a background job because
+ // this will create a new thumbnail for the video.
+ private class VideoInterpretableCheckJob : BackgroundJob {
+ // IN
+ public Video video;
+
+ // OUT
+ public Video.InterpretableResults? results = null;
+
+ public VideoInterpretableCheckJob(Video video, CompletionCallback? callback = null) {
+ base (video, callback);
+ this.video = video;
+ }
+
+ public override void execute() {
+ results = video.check_is_interpretable();
+ }
+ }
+
+ // Work queue for video thumbnailing.
+ // Note: only using 1 thread. If we want to change this to use multiple
+ // threads, we need to put a lock around background_jobs wherever it's modified.
+ private Workers workers = new Workers(1, false);
+ private uint64 background_jobs = 0;
+
+ public VideoMonitor(Cancellable cancellable) {
+ base (Video.global, cancellable);
+
+ foreach (DataObject obj in Video.global.get_all()) {
+ Video video = obj as Video;
+ assert (video != null);
+ if (!video.get_is_interpretable())
+ set_check_interpretable(video, true);
+ }
+ }
+
+ protected override MonitorableUpdates create_updates(Monitorable monitorable) {
+ assert(monitorable is Video);
+
+ return new VideoUpdates((Video) monitorable);
+ }
+
+ public override MediaSourceCollection get_media_source_collection() {
+ return Video.global;
+ }
+
+ public override bool is_file_represented(File file) {
+ VideoSourceCollection.State state;
+ return get_state(file, out state) != null;
+ }
+
+ public override MediaMonitor.DiscoveredFile notify_file_discovered(File file, FileInfo info,
+ out Monitorable monitorable) {
+ VideoSourceCollection.State state;
+ Video? video = get_state(file, out state);
+ if (video == null) {
+ monitorable = null;
+
+ return MediaMonitor.DiscoveredFile.UNKNOWN;
+ }
+
+ switch (state) {
+ case VideoSourceCollection.State.ONLINE:
+ case VideoSourceCollection.State.OFFLINE:
+ monitorable = video;
+
+ return MediaMonitor.DiscoveredFile.REPRESENTED;
+
+ case VideoSourceCollection.State.TRASH:
+ default:
+ // ignored ... trash always stays in trash
+ monitorable = null;
+
+ return MediaMonitor.DiscoveredFile.IGNORE;
+ }
+ }
+
+ public override Gee.Collection<Monitorable>? candidates_for_unknown_file(File file, FileInfo info,
+ out MediaMonitor.DiscoveredFile result) {
+ Gee.Collection<Video> matched = new Gee.ArrayList<Video>();
+ Video.global.fetch_by_matching_backing(info, matched);
+
+ result = MediaMonitor.DiscoveredFile.UNKNOWN;
+
+ return matched;
+ }
+
+ public override bool notify_file_created(File file, FileInfo info) {
+ VideoSourceCollection.State state;
+ Video? video = get_state(file, out state);
+ if (video == null)
+ return false;
+
+ update_online(video);
+
+ return true;
+ }
+
+ public override bool notify_file_moved(File old_file, File new_file, FileInfo new_file_info) {
+ VideoSourceCollection.State old_state;
+ Video? old_video = get_state(old_file, out old_state);
+
+ VideoSourceCollection.State new_state;
+ Video? new_video = get_state(new_file, out new_state);
+
+ // Four possibilities:
+ //
+ // 1. Moving an existing photo file to a location where no photo is represented
+ // Operation: have the Photo object move with the file.
+ // 2. Moving a file with no representative photo to a location where a photo is represented
+ // (i.e. is offline). Operation: Update the photo (backing has changed).
+ // 3. Moving a file with no representative photo to a location with no representative
+ // photo. Operation: Enqueue for import (if appropriate).
+ // 4. Move a file with a representative photo to a location where a photo is represented
+ // Operation: Mark the old photo as offline (or drop editable) and update new photo
+ // (the backing has changed).
+
+ if (old_video != null && new_video == null) {
+ // 1.
+ update_master_file(old_video, new_file);
+ } else if (old_video == null && new_video != null) {
+ // 2.
+ set_check_interpretable(new_video, true);
+ } else if (old_video == null && new_video == null) {
+ // 3.
+ return false;
+ } else {
+ assert(old_video != null && new_video != null);
+
+ // 4.
+ update_offline(old_video);
+ set_check_interpretable(new_video, true);
+ }
+
+ return true;
+ }
+
+ public override bool notify_file_altered(File file) {
+ VideoSourceCollection.State state;
+ return get_state(file, out state) != null;
+ }
+
+ public override bool notify_file_attributes_altered(File file) {
+ VideoSourceCollection.State state;
+ Video? video = get_state(file, out state);
+ if (video == null)
+ return false;
+
+ update_master_file_info_altered(video);
+ update_master_file_in_alteration(video, true);
+
+ return true;
+ }
+
+ public override bool notify_file_alteration_completed(File file, FileInfo info) {
+ VideoSourceCollection.State state;
+ Video? video = get_state(file, out state);
+ if (video == null)
+ return false;
+
+ update_master_file_alterations_completed(video, info);
+
+ return true;
+ }
+
+ public override bool notify_file_deleted(File file) {
+ VideoSourceCollection.State state;
+ Video? video = get_state(file, out state);
+ if (video == null)
+ return false;
+
+ update_master_file_in_alteration(video, false);
+ update_offline(video);
+
+ return true;
+ }
+
+ private Video? get_state(File file, out VideoSourceCollection.State state) {
+ File? real_file = null;
+ foreach (Monitorable monitorable in get_monitorables()) {
+ Video video = (Video) monitorable;
+
+ VideoUpdates? updates = get_existing_video_updates(video);
+ if (updates == null)
+ continue;
+
+ if (updates.get_master_file() != null && updates.get_master_file().equal(file)) {
+ real_file = video.get_master_file();
+
+ break;
+ }
+ }
+
+ return Video.global.get_state_by_file(real_file ?? file, out state);
+ }
+
+ public VideoUpdates fetch_video_updates(Video video) {
+ VideoUpdates? updates = fetch_updates(video) as VideoUpdates;
+ assert(updates != null);
+
+ return updates;
+ }
+
+ public VideoUpdates? get_existing_video_updates(Video video) {
+ return get_existing_updates(video) as VideoUpdates;
+ }
+
+ public void set_check_interpretable(Video video, bool check) {
+ fetch_video_updates(video).set_check_interpretable(check);
+ }
+
+ protected override void process_updates(Gee.Collection<MonitorableUpdates> all_updates,
+ TransactionController controller, ref int op_count) throws Error {
+ base.process_updates(all_updates, controller, ref op_count);
+
+ Gee.ArrayList<Video>? check = null;
+
+ foreach (MonitorableUpdates monitorable_updates in all_updates) {
+ if (op_count >= MAX_OPERATIONS_PER_CYCLE)
+ break;
+
+ // use a separate limit on interpretable checks because they're more expensive than
+ // simple database commands
+ if (check != null && check.size >= MAX_INTERPRETABLE_CHECKS_PER_CYCLE)
+ break;
+
+ VideoUpdates? updates = monitorable_updates as VideoUpdates;
+ if (updates == null)
+ continue;
+
+ if (updates.is_check_interpretable()) {
+ if (check == null)
+ check = new Gee.ArrayList<Video>();
+
+ check.add(updates.video);
+ updates.set_check_interpretable(false);
+ op_count++;
+ }
+ }
+
+ if (check != null) {
+ mdbg("Checking interpretable for %d videos".printf(check.size));
+
+ Video.notify_offline_thumbs_regenerated();
+
+ background_jobs += check.size;
+ foreach (Video video in check)
+ workers.enqueue(new VideoInterpretableCheckJob(video, on_interpretable_check_complete));
+ }
+ }
+
+ void on_interpretable_check_complete(BackgroundJob j) {
+ VideoInterpretableCheckJob job = (VideoInterpretableCheckJob) j;
+
+ job.results.foreground_finish();
+
+ --background_jobs;
+ if (background_jobs <= 0)
+ Video.notify_normal_thumbs_regenerated();
+ }
+}
+
diff --git a/src/VideoSupport.vala b/src/VideoSupport.vala
new file mode 100644
index 0000000..e23ba37
--- /dev/null
+++ b/src/VideoSupport.vala
@@ -0,0 +1,1188 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public errordomain VideoError {
+ FILE, // there's a problem reading the video container file (doesn't exist, no read
+ // permission, etc.)
+
+ CONTENTS, // we can read the container file but its contents are indecipherable (no codec,
+ // malformed data, etc.)
+}
+
+public class VideoImportParams {
+ // IN:
+ public File file;
+ public ImportID import_id = ImportID();
+ public string? md5;
+ public time_t exposure_time_override;
+
+ // IN/OUT:
+ public Thumbnails? thumbnails;
+
+ // OUT:
+ public VideoRow row = new VideoRow();
+
+ public VideoImportParams(File file, ImportID import_id, string? md5,
+ Thumbnails? thumbnails = null, time_t exposure_time_override = 0) {
+ this.file = file;
+ this.import_id = import_id;
+ this.md5 = md5;
+ this.thumbnails = thumbnails;
+ this.exposure_time_override = exposure_time_override;
+ }
+}
+
+public class VideoReader {
+ private const double UNKNOWN_CLIP_DURATION = -1.0;
+ private const uint THUMBNAILER_TIMEOUT = 10000; // In milliseconds.
+
+ // File extensions for video containers that pack only metadata as per the AVCHD spec
+ private const string[] METADATA_ONLY_FILE_EXTENSIONS = { "bdm", "bdmv", "cpi", "mpl" };
+
+ private double clip_duration = UNKNOWN_CLIP_DURATION;
+ private Gdk.Pixbuf preview_frame = null;
+ private File file = null;
+ private GLib.Pid thumbnailer_pid = 0;
+ public DateTime? timestamp { get; private set; default = null; }
+
+ public VideoReader(File file) {
+ this.file = file;
+ }
+
+ public static bool is_supported_video_file(File file) {
+ return is_supported_video_filename(file.get_basename());
+ }
+
+ public static bool is_supported_video_filename(string filename) {
+ string mime_type;
+ mime_type = ContentType.guess(filename, new uchar[0], null);
+ if (mime_type.length >= 6 && mime_type[0:6] == "video/") {
+ string? extension = null;
+ string? name = null;
+ disassemble_filename(filename, out name, out extension);
+
+ if (extension == null)
+ return true;
+
+ foreach (string s in METADATA_ONLY_FILE_EXTENSIONS) {
+ if (utf8_ci_compare(s, extension) == 0)
+ return false;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static ImportResult prepare_for_import(VideoImportParams params) {
+#if MEASURE_IMPORT
+ Timer total_time = new Timer();
+#endif
+ File file = params.file;
+
+ FileInfo info = null;
+ try {
+ info = file.query_info(DirectoryMonitor.SUPPLIED_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ } catch (Error err) {
+ return ImportResult.FILE_ERROR;
+ }
+
+ if (info.get_file_type() != FileType.REGULAR)
+ return ImportResult.NOT_A_FILE;
+
+ if (!is_supported_video_file(file)) {
+ message("Not importing %s: file is marked as a video file but doesn't have a" +
+ "supported extension", file.get_path());
+
+ return ImportResult.UNSUPPORTED_FORMAT;
+ }
+
+ TimeVal timestamp = info.get_modification_time();
+
+ // make sure params has a valid md5
+ assert(params.md5 != null);
+
+ time_t exposure_time = params.exposure_time_override;
+ string title = "";
+ string comment = "";
+
+ VideoReader reader = new VideoReader(file);
+ bool is_interpretable = true;
+ double clip_duration = 0.0;
+ Gdk.Pixbuf preview_frame = reader.read_preview_frame();
+ try {
+ clip_duration = reader.read_clip_duration();
+ } catch (VideoError err) {
+ if (err is VideoError.FILE) {
+ return ImportResult.FILE_ERROR;
+ } else if (err is VideoError.CONTENTS) {
+ is_interpretable = false;
+ clip_duration = 0.0;
+ } else {
+ error("can't prepare video for import: an unknown kind of video error occurred");
+ }
+ }
+
+ try {
+ VideoMetadata metadata = reader.read_metadata();
+ MetadataDateTime? creation_date_time = metadata.get_creation_date_time();
+
+ if (creation_date_time != null && creation_date_time.get_timestamp() != 0)
+ exposure_time = creation_date_time.get_timestamp();
+
+ string? video_title = metadata.get_title();
+ string? video_comment = metadata.get_comment();
+ if (video_title != null)
+ title = video_title;
+ if (video_comment != null)
+ comment = video_comment;
+ } catch (Error err) {
+ warning("Unable to read video metadata: %s", err.message);
+ }
+
+ if (exposure_time == 0) {
+ // Use time reported by Gstreamer, if available.
+ exposure_time = (time_t) (reader.timestamp != null ?
+ reader.timestamp.to_unix() : 0);
+ }
+
+ params.row.video_id = VideoID();
+ params.row.filepath = file.get_path();
+ params.row.filesize = info.get_size();
+ params.row.timestamp = timestamp.tv_sec;
+ params.row.width = preview_frame.width;
+ params.row.height = preview_frame.height;
+ params.row.clip_duration = clip_duration;
+ params.row.is_interpretable = is_interpretable;
+ params.row.exposure_time = exposure_time;
+ params.row.import_id = params.import_id;
+ params.row.event_id = EventID();
+ params.row.md5 = params.md5;
+ params.row.time_created = 0;
+ params.row.title = title;
+ params.row.comment = comment;
+ params.row.backlinks = "";
+ params.row.time_reimported = 0;
+ params.row.flags = 0;
+
+ if (params.thumbnails != null) {
+ params.thumbnails = new Thumbnails();
+ ThumbnailCache.generate_for_video_frame(params.thumbnails, preview_frame);
+ }
+
+#if MEASURE_IMPORT
+ debug("IMPORT: total time to import video = %lf", total_time.elapsed());
+#endif
+ return ImportResult.SUCCESS;
+ }
+
+ private void read_internal() throws VideoError {
+ if (!does_file_exist())
+ throw new VideoError.FILE("video file '%s' does not exist or is inaccessible".printf(
+ file.get_path()));
+
+ try {
+ Gst.PbUtils.Discoverer d = new Gst.PbUtils.Discoverer((Gst.ClockTime) (Gst.SECOND * 5));
+ Gst.PbUtils.DiscovererInfo info = d.discover_uri(file.get_uri());
+
+ clip_duration = ((double) info.get_duration()) / 1000000000.0;
+
+ // Get creation time.
+ // TODO: Note that TAG_DATE can be changed to TAG_DATE_TIME in the future
+ // (and the corresponding output struct) in order to implement #2836.
+ Date? video_date = null;
+ if (info.get_tags() != null && info.get_tags().get_date(Gst.Tags.DATE, out video_date)) {
+ timestamp = new DateTime.local(video_date.get_year(), video_date.get_month(),
+ video_date.get_day(), 0, 0, 0);
+ }
+ } catch (Error e) {
+ debug("Video read error: %s", e.message);
+ throw new VideoError.CONTENTS("GStreamer couldn't extract clip information: %s"
+ .printf(e.message));
+ }
+ }
+
+ // Used by thumbnailer() to kill the external process if need be.
+ private bool on_thumbnailer_timer() {
+ debug("Thumbnailer timer called");
+ if (thumbnailer_pid != 0) {
+ debug("Killing thumbnailer process: %d", thumbnailer_pid);
+ Posix.kill(thumbnailer_pid, Posix.SIGKILL);
+ }
+ return false; // Don't call again.
+ }
+
+ // Performs video thumbnailing.
+ // Note: not thread-safe if called from the same instance of the class.
+ private Gdk.Pixbuf? thumbnailer(string video_file) {
+ // Use Shotwell's thumbnailer, redirect output to stdout.
+ debug("Launching thumbnailer process: %s", AppDirs.get_thumbnailer_bin().get_path());
+ string[] argv = {AppDirs.get_thumbnailer_bin().get_path(), video_file};
+ int child_stdout;
+ try {
+ GLib.Process.spawn_async_with_pipes(null, argv, null, GLib.SpawnFlags.SEARCH_PATH |
+ GLib.SpawnFlags.DO_NOT_REAP_CHILD, null, out thumbnailer_pid, null, out child_stdout,
+ null);
+ debug("Spawned thumbnailer, child pid: %d", (int) thumbnailer_pid);
+ } catch (Error e) {
+ debug("Error spawning process: %s", e.message);
+ if (thumbnailer_pid != 0)
+ GLib.Process.close_pid(thumbnailer_pid);
+ return null;
+ }
+
+ // Start timer.
+ Timeout.add(THUMBNAILER_TIMEOUT, on_thumbnailer_timer);
+
+ // Read pixbuf from stream.
+ Gdk.Pixbuf? buf = null;
+ try {
+ GLib.UnixInputStream unix_input = new GLib.UnixInputStream(child_stdout, true);
+ buf = new Gdk.Pixbuf.from_stream(unix_input, null);
+ } catch (Error e) {
+ debug("Error creating pixbuf: %s", e.message);
+ buf = null;
+ }
+
+ // Make sure process exited properly.
+ int child_status = 0;
+ int ret_waitpid = Posix.waitpid(thumbnailer_pid, out child_status, 0);
+ if (ret_waitpid < 0) {
+ debug("waitpid returned error code: %d", ret_waitpid);
+ buf = null;
+ } else if (0 != posix_wexitstatus(child_status)) {
+ debug("Thumbnailer exited with error code: %d", posix_wexitstatus(child_status));
+ buf = null;
+ }
+
+ Posix.close(child_stdout);
+ GLib.Process.close_pid(thumbnailer_pid);
+ thumbnailer_pid = 0;
+ return buf;
+ }
+
+ private bool does_file_exist() {
+ return FileUtils.test(file.get_path(), FileTest.EXISTS | FileTest.IS_REGULAR);
+ }
+
+ public Gdk.Pixbuf? read_preview_frame() {
+ if (preview_frame != null)
+ return preview_frame;
+
+ if (!does_file_exist())
+ return null;
+
+ // Get preview frame from thumbnailer.
+ preview_frame = thumbnailer(file.get_path());
+ if (null == preview_frame)
+ preview_frame = Resources.get_noninterpretable_badge_pixbuf();
+
+ return preview_frame;
+ }
+
+ public double read_clip_duration() throws VideoError {
+ if (clip_duration == UNKNOWN_CLIP_DURATION)
+ read_internal();
+
+ return clip_duration;
+ }
+
+ public VideoMetadata read_metadata() throws Error {
+ VideoMetadata metadata = new VideoMetadata();
+ metadata.read_from_file(File.new_for_path(file.get_path()));
+
+ return metadata;
+ }
+}
+
+public class Video : VideoSource, Flaggable, Monitorable, Dateable {
+ public const string TYPENAME = "video";
+
+ public const uint64 FLAG_TRASH = 0x0000000000000001;
+ public const uint64 FLAG_OFFLINE = 0x0000000000000002;
+ public const uint64 FLAG_FLAGGED = 0x0000000000000004;
+
+ public class InterpretableResults {
+ internal Video video;
+ internal bool update_interpretable = false;
+ internal bool is_interpretable = false;
+ internal Gdk.Pixbuf? new_thumbnail = null;
+
+ public InterpretableResults(Video video) {
+ this.video = video;
+ }
+
+ public void foreground_finish() {
+ if (update_interpretable)
+ video.set_is_interpretable(is_interpretable);
+
+ if (new_thumbnail != null) {
+ try {
+ ThumbnailCache.replace(video, ThumbnailCache.Size.BIG, new_thumbnail);
+ ThumbnailCache.replace(video, ThumbnailCache.Size.MEDIUM, new_thumbnail);
+
+ video.notify_thumbnail_altered();
+ } catch (Error err) {
+ message("Unable to update video thumbnails for %s: %s", video.to_string(),
+ err.message);
+ }
+ }
+ }
+ }
+
+ private static bool interpreter_state_changed;
+ private static int current_state;
+ private static bool normal_regen_complete;
+ private static bool offline_regen_complete;
+ public static VideoSourceCollection global;
+
+ private VideoRow backing_row;
+
+ public Video(VideoRow row) {
+ this.backing_row = row;
+
+ // normalize user text
+ this.backing_row.title = prep_title(this.backing_row.title);
+
+ if (((row.flags & FLAG_TRASH) != 0) || ((row.flags & FLAG_OFFLINE) != 0))
+ rehydrate_backlinks(global, row.backlinks);
+ }
+
+ public static void init(ProgressMonitor? monitor = null) {
+ // Must initialize static variables here.
+ // TODO: set values at declaration time once the following Vala bug is fixed:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=655594
+ interpreter_state_changed = false;
+ current_state = -1;
+ normal_regen_complete = false;
+ offline_regen_complete = false;
+
+ // initialize GStreamer, but don't pass it our actual command line arguments -- we don't
+ // want our end users to be able to parameterize the GStreamer configuration
+ string[] fake_args = new string[0];
+ unowned string[] fake_unowned_args = fake_args;
+ Gst.init(ref fake_unowned_args);
+
+ int saved_state = Config.Facade.get_instance().get_video_interpreter_state_cookie();
+ current_state = (int) Gst.Registry.get().get_feature_list_cookie();
+ if (saved_state == Config.Facade.NO_VIDEO_INTERPRETER_STATE) {
+ message("interpreter state cookie not found; assuming all video thumbnails are out of date");
+ interpreter_state_changed = true;
+ } else if (saved_state != current_state) {
+ message("interpreter state has changed; video thumbnails may be out of date");
+ interpreter_state_changed = true;
+ }
+
+ global = new VideoSourceCollection();
+
+ Gee.ArrayList<VideoRow?> all = VideoTable.get_instance().get_all();
+ Gee.ArrayList<Video> all_videos = new Gee.ArrayList<Video>();
+ Gee.ArrayList<Video> trashed_videos = new Gee.ArrayList<Video>();
+ Gee.ArrayList<Video> offline_videos = new Gee.ArrayList<Video>();
+ int count = all.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ Video video = new Video(all.get(ctr));
+
+ if (interpreter_state_changed)
+ video.set_is_interpretable(false);
+
+ if (video.is_trashed())
+ trashed_videos.add(video);
+ else if (video.is_offline())
+ offline_videos.add(video);
+ else
+ all_videos.add(video);
+
+ if (monitor != null)
+ monitor(ctr, count);
+ }
+
+ global.add_many_to_trash(trashed_videos);
+ global.add_many_to_offline(offline_videos);
+ global.add_many(all_videos);
+ }
+
+ public static bool has_interpreter_state_changed() {
+ return interpreter_state_changed;
+ }
+
+ public static void notify_normal_thumbs_regenerated() {
+ if (normal_regen_complete)
+ return;
+
+ message("normal video thumbnail regeneration completed");
+
+ normal_regen_complete = true;
+ if (normal_regen_complete && offline_regen_complete)
+ save_interpreter_state();
+ }
+
+ public static void notify_offline_thumbs_regenerated() {
+ if (offline_regen_complete)
+ return;
+
+ message("offline video thumbnail regeneration completed");
+
+ offline_regen_complete = true;
+ if (normal_regen_complete && offline_regen_complete)
+ save_interpreter_state();
+ }
+
+ private static void save_interpreter_state() {
+ if (interpreter_state_changed) {
+ message("saving video interpreter state to configuration system");
+
+ Config.Facade.get_instance().set_video_interpreter_state_cookie(current_state);
+ interpreter_state_changed = false;
+ }
+ }
+
+ public static void terminate() {
+ }
+
+ public static ExporterUI? export_many(Gee.Collection<Video> videos, Exporter.CompletionCallback done,
+ bool export_in_place = false) {
+ if (videos.size == 0)
+ return null;
+
+ // in place export is relatively easy -- provide a fast, separate code path for it
+ if (export_in_place) {
+ ExporterUI temp_exporter = new ExporterUI(new Exporter.for_temp_file(videos,
+ Scaling.for_original(), ExportFormatParameters.unmodified()));
+ temp_exporter.export(done);
+ return temp_exporter;
+ }
+
+ // one video
+ if (videos.size == 1) {
+ Video video = null;
+ foreach (Video v in videos) {
+ video = v;
+ break;
+ }
+
+ File save_as = ExportUI.choose_file(video.get_basename());
+ if (save_as == null)
+ return null;
+
+ try {
+ AppWindow.get_instance().set_busy_cursor();
+ video.export(save_as);
+ AppWindow.get_instance().set_normal_cursor();
+ } catch (Error err) {
+ AppWindow.get_instance().set_normal_cursor();
+ export_error_dialog(save_as, false);
+ }
+
+ return null;
+ }
+
+ // multiple videos
+ File export_dir = ExportUI.choose_dir(_("Export Videos"));
+ if (export_dir == null)
+ return null;
+
+ ExporterUI exporter = new ExporterUI(new Exporter(videos, export_dir,
+ Scaling.for_original(), ExportFormatParameters.unmodified()));
+ exporter.export(done);
+
+ return exporter;
+ }
+
+ protected override void commit_backlinks(SourceCollection? sources, string? backlinks) {
+ try {
+ VideoTable.get_instance().update_backlinks(get_video_id(), backlinks);
+ lock (backing_row) {
+ backing_row.backlinks = backlinks;
+ }
+ } catch (DatabaseError err) {
+ warning("Unable to update link state for %s: %s", to_string(), err.message);
+ }
+ }
+
+ protected override bool set_event_id(EventID event_id) {
+ lock (backing_row) {
+ bool committed = VideoTable.get_instance().set_event(backing_row.video_id, event_id);
+
+ if (committed)
+ backing_row.event_id = event_id;
+
+ return committed;
+ }
+ }
+
+ public static bool is_duplicate(File? file, string? full_md5) {
+ assert(file != null || full_md5 != null);
+#if !NO_DUPE_DETECTION
+ return VideoTable.get_instance().has_duplicate(file, full_md5);
+#else
+ return false;
+#endif
+ }
+
+ public static ImportResult import_create(VideoImportParams params, out Video video) {
+ video = null;
+
+ // add to the database
+ try {
+ if (VideoTable.get_instance().add(params.row).is_invalid())
+ return ImportResult.DATABASE_ERROR;
+ } catch (DatabaseError err) {
+ return ImportResult.DATABASE_ERROR;
+ }
+
+ // create local object but don't add to global until thumbnails generated
+ video = new Video(params.row);
+
+ return ImportResult.SUCCESS;
+ }
+
+ public static void import_failed(Video video) {
+ try {
+ VideoTable.get_instance().remove(video.get_video_id());
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+ }
+
+ public override BackingFileState[] get_backing_files_state() {
+ BackingFileState[] backing = new BackingFileState[1];
+ lock (backing_row) {
+ backing[0] = new BackingFileState(backing_row.filepath, backing_row.filesize,
+ backing_row.timestamp, backing_row.md5);
+ }
+
+ return backing;
+ }
+
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ return ThumbnailCache.fetch(this, scale);
+ }
+
+ public override string get_master_md5() {
+ lock (backing_row) {
+ return backing_row.md5;
+ }
+ }
+
+ public override Gdk.Pixbuf get_preview_pixbuf(Scaling scaling) throws Error {
+ Gdk.Pixbuf pixbuf = get_thumbnail(ThumbnailCache.Size.BIG);
+
+ return scaling.perform_on_pixbuf(pixbuf, Gdk.InterpType.NEAREST, true);
+ }
+
+ public override Gdk.Pixbuf? create_thumbnail(int scale) throws Error {
+ VideoReader reader = new VideoReader(get_file());
+ Gdk.Pixbuf? frame = reader.read_preview_frame();
+
+ return (frame != null) ? frame : Resources.get_noninterpretable_badge_pixbuf().copy();
+ }
+
+ public override string get_typename() {
+ return TYPENAME;
+ }
+
+ public override int64 get_instance_id() {
+ return get_video_id().id;
+ }
+
+ public override ImportID get_import_id() {
+ lock (backing_row) {
+ return backing_row.import_id;
+ }
+ }
+
+ public override PhotoFileFormat get_preferred_thumbnail_format() {
+ return PhotoFileFormat.get_system_default_format();
+ }
+
+ public override string? get_title() {
+ lock (backing_row) {
+ return backing_row.title;
+ }
+ }
+
+ public override void set_title(string? title) {
+ string? new_title = prep_title(title);
+
+ lock (backing_row) {
+ if (backing_row.title == new_title)
+ return;
+
+ try {
+ VideoTable.get_instance().set_title(backing_row.video_id, new_title);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ return;
+ }
+ // if we didn't short-circuit return in the catch clause above, then the change was
+ // successfully committed to the database, so update it in the in-memory row cache
+ backing_row.title = new_title;
+ }
+
+ notify_altered(new Alteration("metadata", "name"));
+ }
+
+ public override string? get_comment() {
+ lock (backing_row) {
+ return backing_row.comment;
+ }
+ }
+
+ public override bool set_comment(string? comment) {
+ string? new_comment = prep_title(comment);
+
+ lock (backing_row) {
+ if (backing_row.comment == new_comment)
+ return true;
+
+ try {
+ VideoTable.get_instance().set_comment(backing_row.video_id, new_comment);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ return false;
+ }
+ // if we didn't short-circuit return in the catch clause above, then the change was
+ // successfully committed to the database, so update it in the in-memory row cache
+ backing_row.comment = new_comment;
+ }
+
+ notify_altered(new Alteration("metadata", "comment"));
+
+ return true;
+ }
+
+
+ public override Rating get_rating() {
+ lock (backing_row) {
+ return backing_row.rating;
+ }
+ }
+
+ public override void set_rating(Rating rating) {
+ lock (backing_row) {
+ if ((!rating.is_valid()) || (rating == backing_row.rating))
+ return;
+
+ try {
+ VideoTable.get_instance().set_rating(get_video_id(), rating);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ return;
+ }
+ // if we didn't short-circuit return in the catch clause above, then the change was
+ // successfully committed to the database, so update it in the in-memory row cache
+ backing_row.rating = rating;
+ }
+
+ notify_altered(new Alteration("metadata", "rating"));
+ }
+
+ public override void increase_rating() {
+ lock (backing_row) {
+ set_rating(backing_row.rating.increase());
+ }
+ }
+
+ public override void decrease_rating() {
+ lock (backing_row) {
+ set_rating(backing_row.rating.decrease());
+ }
+ }
+
+ public override bool is_trashed() {
+ return is_flag_set(FLAG_TRASH);
+ }
+
+ public override bool is_offline() {
+ return is_flag_set(FLAG_OFFLINE);
+ }
+
+ public override void mark_offline() {
+ add_flags(FLAG_OFFLINE);
+ }
+
+ public override void mark_online() {
+ remove_flags(FLAG_OFFLINE);
+
+ if ((!get_is_interpretable()) && has_interpreter_state_changed())
+ check_is_interpretable().foreground_finish();
+ }
+
+ public override void trash() {
+ add_flags(FLAG_TRASH);
+ }
+
+ public override void untrash() {
+ remove_flags(FLAG_TRASH);
+ }
+
+ public bool is_flagged() {
+ return is_flag_set(FLAG_FLAGGED);
+ }
+
+ public void mark_flagged() {
+ add_flags(FLAG_FLAGGED, new Alteration("metadata", "flagged"));
+ }
+
+ public void mark_unflagged() {
+ remove_flags(FLAG_FLAGGED, new Alteration("metadata", "flagged"));
+ }
+
+ public override EventID get_event_id() {
+ lock (backing_row) {
+ return backing_row.event_id;
+ }
+ }
+
+ public override string to_string() {
+ lock (backing_row) {
+ return "[%s] %s".printf(backing_row.video_id.id.to_string(), backing_row.filepath);
+ }
+ }
+
+ public VideoID get_video_id() {
+ lock (backing_row) {
+ return backing_row.video_id;
+ }
+ }
+
+ public override time_t get_exposure_time() {
+ lock (backing_row) {
+ return backing_row.exposure_time;
+ }
+ }
+
+ public void set_exposure_time(time_t time) {
+ lock (backing_row) {
+ try {
+ VideoTable.get_instance().set_exposure_time(backing_row.video_id, time);
+ } catch (Error e) {
+ debug("Warning - %s", e.message);
+ }
+ backing_row.exposure_time = time;
+ }
+
+ notify_altered(new Alteration("metadata", "exposure-time"));
+ }
+
+ public Dimensions get_frame_dimensions() {
+ lock (backing_row) {
+ return Dimensions(backing_row.width, backing_row.height);
+ }
+ }
+
+ public override Dimensions get_dimensions(Photo.Exception disallowed_steps = Photo.Exception.NONE) {
+ return get_frame_dimensions();
+ }
+
+ public override uint64 get_filesize() {
+ return get_master_filesize();
+ }
+
+ public override uint64 get_master_filesize() {
+ lock (backing_row) {
+ return backing_row.filesize;
+ }
+ }
+
+ public override time_t get_timestamp() {
+ lock (backing_row) {
+ return backing_row.timestamp;
+ }
+ }
+
+ public void set_master_timestamp(FileInfo info) {
+ TimeVal time_val = info.get_modification_time();
+
+ try {
+ lock (backing_row) {
+ if (backing_row.timestamp == time_val.tv_sec)
+ return;
+
+ VideoTable.get_instance().set_timestamp(backing_row.video_id, time_val.tv_sec);
+ backing_row.timestamp = time_val.tv_sec;
+ }
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+
+ return;
+ }
+
+ notify_altered(new Alteration("metadata", "master-timestamp"));
+ }
+
+ public string get_filename() {
+ lock (backing_row) {
+ return backing_row.filepath;
+ }
+ }
+
+ public override File get_file() {
+ return File.new_for_path(get_filename());
+ }
+
+ public override File get_master_file() {
+ return get_file();
+ }
+
+ public void export(File dest_file) throws Error {
+ File source_file = File.new_for_path(get_filename());
+ source_file.copy(dest_file, FileCopyFlags.OVERWRITE | FileCopyFlags.TARGET_DEFAULT_PERMS,
+ null, null);
+ }
+
+ public double get_clip_duration() {
+ lock (backing_row) {
+ return backing_row.clip_duration;
+ }
+ }
+
+ public bool get_is_interpretable() {
+ lock (backing_row) {
+ return backing_row.is_interpretable;
+ }
+ }
+
+ private void set_is_interpretable(bool is_interpretable) {
+ lock (backing_row) {
+ if (backing_row.is_interpretable == is_interpretable)
+ return;
+
+ backing_row.is_interpretable = is_interpretable;
+ }
+
+ try {
+ VideoTable.get_instance().update_is_interpretable(get_video_id(), is_interpretable);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ }
+ }
+
+ // Intended to be called from a background thread but can be called from foreground as well.
+ // Caller should call InterpretableResults.foreground_process() only from foreground thread,
+ // however
+ public InterpretableResults check_is_interpretable() {
+ InterpretableResults results = new InterpretableResults(this);
+
+ double clip_duration = -1.0;
+ Gdk.Pixbuf? preview_frame = null;
+
+ VideoReader backing_file_reader = new VideoReader(get_file());
+ try {
+ clip_duration = backing_file_reader.read_clip_duration();
+ preview_frame = backing_file_reader.read_preview_frame();
+ } catch (VideoError e) {
+ // if we catch an error on an interpretable video here, then this video is
+ // non-interpretable (e.g. its codec is not present on the users system).
+ results.update_interpretable = get_is_interpretable();
+ results.is_interpretable = false;
+
+ return results;
+ }
+
+ // if already marked interpretable, this is only confirming what we already knew
+ if (get_is_interpretable()) {
+ results.update_interpretable = false;
+ results.is_interpretable = true;
+
+ return results;
+ }
+
+ debug("video %s has become interpretable", get_file().get_basename());
+
+ // save this here, this can be done in background thread
+ lock (backing_row) {
+ backing_row.clip_duration = clip_duration;
+ }
+
+ results.update_interpretable = true;
+ results.is_interpretable = true;
+ results.new_thumbnail = preview_frame;
+
+ return results;
+ }
+
+ public override void destroy() {
+ VideoID video_id = get_video_id();
+
+ ThumbnailCache.remove(this);
+
+ try {
+ VideoTable.get_instance().remove(video_id);
+ } catch (DatabaseError err) {
+ error("failed to remove video %s from video table", to_string());
+ }
+
+ base.destroy();
+ }
+
+ protected override bool internal_delete_backing() throws Error {
+ bool ret = delete_original_file();
+
+ // Return false if parent method failed.
+ return base.internal_delete_backing() && ret;
+ }
+
+ private void notify_flags_altered(Alteration? additional_alteration) {
+ Alteration alteration = new Alteration("metadata", "flags");
+ if (additional_alteration != null)
+ alteration = alteration.compress(additional_alteration);
+
+ notify_altered(alteration);
+ }
+
+ public uint64 add_flags(uint64 flags_to_add, Alteration? additional_alteration = null) {
+ uint64 new_flags;
+ lock (backing_row) {
+ new_flags = internal_add_flags(backing_row.flags, flags_to_add);
+ if (backing_row.flags == new_flags)
+ return backing_row.flags;
+
+ try {
+ VideoTable.get_instance().set_flags(get_video_id(), new_flags);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ return backing_row.flags;
+ }
+
+ backing_row.flags = new_flags;
+ }
+
+ notify_flags_altered(additional_alteration);
+
+ return new_flags;
+ }
+
+ public uint64 remove_flags(uint64 flags_to_remove, Alteration? additional_alteration = null) {
+ uint64 new_flags;
+ lock (backing_row) {
+ new_flags = internal_remove_flags(backing_row.flags, flags_to_remove);
+ if (backing_row.flags == new_flags)
+ return backing_row.flags;
+
+ try {
+ VideoTable.get_instance().set_flags(get_video_id(), new_flags);
+ } catch (DatabaseError e) {
+ AppWindow.database_error(e);
+ return backing_row.flags;
+ }
+
+ backing_row.flags = new_flags;
+ }
+
+ notify_flags_altered(additional_alteration);
+
+ return new_flags;
+ }
+
+ public bool is_flag_set(uint64 flag) {
+ lock (backing_row) {
+ return internal_is_flag_set(backing_row.flags, flag);
+ }
+ }
+
+ public void set_master_file(File file) {
+ string new_filepath = file.get_path();
+ string? old_filepath = null;
+ try {
+ lock (backing_row) {
+ if (backing_row.filepath == new_filepath)
+ return;
+
+ old_filepath = backing_row.filepath;
+
+ VideoTable.get_instance().set_filepath(backing_row.video_id, new_filepath);
+ backing_row.filepath = new_filepath;
+ }
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+
+ return;
+ }
+
+ assert(old_filepath != null);
+ notify_master_replaced(File.new_for_path(old_filepath), file);
+
+ notify_altered(new Alteration.from_list("backing:master,metadata:name"));
+ }
+
+ public VideoMetadata read_metadata() throws Error {
+ return (new VideoReader(get_file())).read_metadata();
+ }
+}
+
+public class VideoSourceCollection : MediaSourceCollection {
+ public enum State {
+ UNKNOWN,
+ ONLINE,
+ OFFLINE,
+ TRASH
+ }
+
+ public override TransactionController transaction_controller {
+ get {
+ if (_transaction_controller == null)
+ _transaction_controller = new MediaSourceTransactionController(this);
+
+ return _transaction_controller;
+ }
+ }
+
+ private TransactionController _transaction_controller = null;
+ private Gee.MultiMap<uint64?, Video> filesize_to_video =
+ new Gee.TreeMultiMap<uint64?, Video>(uint64_compare);
+
+ public VideoSourceCollection() {
+ base("VideoSourceCollection", get_video_key);
+
+ get_trashcan().contents_altered.connect(on_trashcan_contents_altered);
+ get_offline_bin().contents_altered.connect(on_offline_contents_altered);
+ }
+
+ protected override MediaSourceHoldingTank create_trashcan() {
+ return new MediaSourceHoldingTank(this, is_video_trashed, get_video_key);
+ }
+
+ protected override MediaSourceHoldingTank create_offline_bin() {
+ return new MediaSourceHoldingTank(this, is_video_offline, get_video_key);
+ }
+
+ public override MediaMonitor create_media_monitor(Workers workers, Cancellable cancellable) {
+ return new VideoMonitor(cancellable);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is Video;
+ }
+
+ public override string get_typename() {
+ return Video.TYPENAME;
+ }
+
+ public override bool is_file_recognized(File file) {
+ return VideoReader.is_supported_video_file(file);
+ }
+
+ private void on_trashcan_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ trashcan_contents_altered((Gee.Collection<Video>?) added,
+ (Gee.Collection<Video>?) removed);
+ }
+
+ private void on_offline_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ offline_contents_altered((Gee.Collection<Video>?) added,
+ (Gee.Collection<Video>?) removed);
+ }
+
+ protected override MediaSource? fetch_by_numeric_id(int64 numeric_id) {
+ return fetch(VideoID(numeric_id));
+ }
+
+ public static int64 get_video_key(DataSource source) {
+ Video video = (Video) source;
+ VideoID video_id = video.get_video_id();
+
+ return video_id.id;
+ }
+
+ public static bool is_video_trashed(DataSource source) {
+ return ((Video) source).is_trashed();
+ }
+
+ public static bool is_video_offline(DataSource source) {
+ return ((Video) source).is_offline();
+ }
+
+ public Video fetch(VideoID video_id) {
+ return (Video) fetch_by_key(video_id.id);
+ }
+
+ public override Gee.Collection<string> get_event_source_ids(EventID event_id){
+ return VideoTable.get_instance().get_event_source_ids(event_id);
+ }
+
+ public Video? get_state_by_file(File file, out State state) {
+ Video? video = (Video?) fetch_by_master_file(file);
+ if (video != null) {
+ state = State.ONLINE;
+
+ return video;
+ }
+
+ video = (Video?) get_trashcan().fetch_by_master_file(file);
+ if (video != null) {
+ state = State.TRASH;
+
+ return video;
+ }
+
+ video = (Video?) get_offline_bin().fetch_by_master_file(file);
+ if (video != null) {
+ state = State.OFFLINE;
+
+ return video;
+ }
+
+ state = State.UNKNOWN;
+
+ return null;
+ }
+
+ private void compare_backing(Video video, FileInfo info, Gee.Collection<Video> matching_master) {
+ if (video.get_filesize() != info.get_size())
+ return;
+
+ if (video.get_timestamp() == info.get_modification_time().tv_sec)
+ matching_master.add(video);
+ }
+
+ public void fetch_by_matching_backing(FileInfo info, Gee.Collection<Video> matching_master) {
+ foreach (DataObject object in get_all())
+ compare_backing((Video) object, info, matching_master);
+
+ foreach (MediaSource media in get_offline_bin_contents())
+ compare_backing((Video) media, info, matching_master);
+ }
+
+ protected override void notify_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ if (added != null) {
+ foreach (DataObject object in added) {
+ Video video = (Video) object;
+
+ filesize_to_video.set(video.get_master_filesize(), video);
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ Video video = (Video) object;
+
+ filesize_to_video.remove(video.get_master_filesize(), video);
+ }
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+
+ public VideoID get_basename_filesize_duplicate(string basename, uint64 filesize) {
+ foreach (Video video in filesize_to_video.get(filesize)) {
+ if (utf8_ci_compare(video.get_master_file().get_basename(), basename) == 0)
+ return video.get_video_id();
+ }
+
+ return VideoID(); // the default constructor of the VideoID struct creates an invalid
+ // video id, which is just what we want in this case
+ }
+
+ public bool has_basename_filesize_duplicate(string basename, uint64 filesize) {
+ return get_basename_filesize_duplicate(basename, filesize).is_valid();
+ }
+}
diff --git a/src/camera/Branch.vala b/src/camera/Branch.vala
new file mode 100644
index 0000000..63a5443
--- /dev/null
+++ b/src/camera/Branch.vala
@@ -0,0 +1,116 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Camera.Branch : Sidebar.Branch {
+ internal static Icon? cameras_icon = null;
+
+ private Gee.HashMap<DiscoveredCamera, Camera.SidebarEntry> camera_map = new Gee.HashMap<
+ DiscoveredCamera, Camera.SidebarEntry>();
+
+ public Branch() {
+ base (new Camera.Grouping(),
+ Sidebar.Branch.Options.HIDE_IF_EMPTY | Sidebar.Branch.Options.AUTO_OPEN_ON_NEW_CHILD,
+ camera_comparator);
+
+ foreach (DiscoveredCamera camera in CameraTable.get_instance().get_cameras())
+ add_camera(camera);
+
+ CameraTable.get_instance().camera_added.connect(on_camera_added);
+ CameraTable.get_instance().camera_removed.connect(on_camera_removed);
+ }
+
+ internal static void init() {
+ cameras_icon = new GLib.ThemedIcon(Resources.ICON_CAMERAS);
+ }
+
+ internal static void terminate() {
+ cameras_icon = null;
+ }
+
+ private static int camera_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ // Compare based on name.
+ int ret = a.get_sidebar_name().collate(b.get_sidebar_name());
+ if (ret == 0) {
+ // Cameras had same name! Fallback to URI comparison.
+ Camera.SidebarEntry? cam_a = a as Camera.SidebarEntry;
+ Camera.SidebarEntry? cam_b = b as Camera.SidebarEntry;
+ assert (cam_a != null && cam_b != null);
+ ret = cam_a.get_uri().collate(cam_b.get_uri());
+ }
+
+ return ret;
+ }
+
+ public Camera.SidebarEntry? get_entry_for_camera(DiscoveredCamera camera) {
+ return camera_map.get(camera);
+ }
+
+ private void on_camera_added(DiscoveredCamera camera) {
+ add_camera(camera);
+ }
+
+ private void on_camera_removed(DiscoveredCamera camera) {
+ remove_camera(camera);
+ }
+
+ private void add_camera(DiscoveredCamera camera) {
+ assert(!camera_map.has_key(camera));
+
+ Camera.SidebarEntry entry = new Camera.SidebarEntry(camera);
+ camera_map.set(camera, entry);
+
+ // want to show before adding page so the grouping is available to graft onto
+ graft(get_root(), entry);
+ }
+
+ private void remove_camera(DiscoveredCamera camera) {
+ assert(camera_map.has_key(camera));
+
+ Camera.SidebarEntry? entry = camera_map.get(camera);
+ assert(entry != null);
+
+ bool removed = camera_map.unset(camera);
+ assert(removed);
+
+ prune(entry);
+ }
+}
+
+public class Camera.Grouping : Sidebar.Grouping {
+ public Grouping() {
+ base (_("Cameras"), Camera.Branch.cameras_icon);
+ }
+}
+
+public class Camera.SidebarEntry : Sidebar.SimplePageEntry {
+ private DiscoveredCamera camera;
+ private string uri;
+
+ public SidebarEntry(DiscoveredCamera camera) {
+ this.camera = camera;
+ this.uri = camera.uri;
+ }
+
+ public override string get_sidebar_name() {
+ return camera.display_name ?? _("Camera");
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return camera.icon ?? Camera.Branch.cameras_icon;
+ }
+
+ protected override Page create_page() {
+ return new ImportPage(camera.gcamera, uri, get_sidebar_name(), get_sidebar_icon());
+ }
+
+ public string get_uri() {
+ return uri;
+ }
+}
+
diff --git a/src/camera/Camera.vala b/src/camera/Camera.vala
new file mode 100644
index 0000000..f6d1f4b
--- /dev/null
+++ b/src/camera/Camera.vala
@@ -0,0 +1,18 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Camera {
+
+public void init() throws Error {
+ Camera.Branch.init();
+}
+
+public void terminate() {
+ Camera.Branch.terminate();
+}
+
+}
+
diff --git a/src/camera/CameraTable.vala b/src/camera/CameraTable.vala
new file mode 100644
index 0000000..8466388
--- /dev/null
+++ b/src/camera/CameraTable.vala
@@ -0,0 +1,417 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class DiscoveredCamera {
+ public GPhoto.Camera gcamera;
+ public string uri;
+ public string display_name;
+ public GLib.Icon? icon;
+
+ public DiscoveredCamera(GPhoto.Camera gcamera, string uri, string display_name, GLib.Icon? icon) {
+ this.gcamera = gcamera;
+ this.uri = uri;
+ this.display_name = display_name;
+ this.icon = icon;
+ }
+}
+
+public class CameraTable {
+ private const int UPDATE_DELAY_MSEC = 1000;
+
+ // list of subsystems being monitored for events
+ private const string[] SUBSYSTEMS = { "usb", "block", null };
+
+ private static CameraTable instance = null;
+
+ private GUdev.Client client = new GUdev.Client(SUBSYSTEMS);
+ private OneShotScheduler camera_update_scheduler = null;
+ private GPhoto.Context null_context = new GPhoto.Context();
+ private GPhoto.CameraAbilitiesList abilities_list;
+ private VolumeMonitor volume_monitor;
+
+ private Gee.HashMap<string, DiscoveredCamera> camera_map = new Gee.HashMap<string, DiscoveredCamera>();
+
+ public signal void camera_added(DiscoveredCamera camera);
+
+ public signal void camera_removed(DiscoveredCamera camera);
+
+ private CameraTable() {
+ camera_update_scheduler = new OneShotScheduler("CameraTable update scheduler",
+ on_update_cameras);
+
+ // listen for interesting events on the specified subsystems
+ client.uevent.connect(on_udev_event);
+ volume_monitor = VolumeMonitor.get();
+ volume_monitor.volume_changed.connect(on_volume_changed);
+ volume_monitor.volume_added.connect(on_volume_changed);
+
+ // because loading the camera abilities list takes a bit of time and slows down app
+ // startup, delay loading it (and notifying any observers) for a small period of time,
+ // after the dust has settled
+ Timeout.add(500, delayed_init);
+ }
+
+ private bool delayed_init() {
+ // We disable this here so cameras that are already connected at the time
+ // the application is launched don't interfere with normal navigation...
+ ((LibraryWindow) AppWindow.get_instance()).set_page_switching_enabled(false);
+
+ try {
+ init_camera_table();
+ } catch (GPhotoError err) {
+ warning("Unable to initialize camera table: %s", err.message);
+
+ return false;
+ }
+
+ try {
+ update_camera_table();
+ } catch (GPhotoError err) {
+ warning("Unable to update camera table: %s", err.message);
+ }
+
+ // ...and re-enable it here, so that cameras connected -after- the initial
+ // populating of the table will trigger a switch to the import page, as before.
+ ((LibraryWindow) AppWindow.get_instance()).set_page_switching_enabled(true);
+ return false;
+ }
+
+ public static CameraTable get_instance() {
+ if (instance == null)
+ instance = new CameraTable();
+
+ return instance;
+ }
+
+ public Gee.Iterable<DiscoveredCamera> get_cameras() {
+ return camera_map.values;
+ }
+
+ public int get_count() {
+ return camera_map.size;
+ }
+
+ public DiscoveredCamera? get_for_uri(string uri) {
+ return camera_map.get(uri);
+ }
+
+ private void do_op(GPhoto.Result res, string op) throws GPhotoError {
+ if (res != GPhoto.Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Unable to %s: %s", (int) res, op, res.as_string());
+ }
+
+ private void init_camera_table() throws GPhotoError {
+ do_op(GPhoto.CameraAbilitiesList.create(out abilities_list), "create camera abilities list");
+ do_op(abilities_list.load(null_context), "load camera abilities list");
+ }
+
+ private string[] get_all_usb_cameras() {
+ string[] cameras = new string[0];
+
+ GLib.List<GUdev.Device> device_list = client.query_by_subsystem(null);
+ foreach (GUdev.Device device in device_list) {
+ string device_file = device.get_device_file();
+ if(
+ // only keep devices that have a non-null device file and that
+ // have both the ID_GPHOTO2 and GPHOTO2_DRIVER properties set
+ (device_file != null) &&
+ (device.has_property("ID_GPHOTO2")) &&
+ (device.has_property("GPHOTO2_DRIVER"))
+ ) {
+ int camera_bus, camera_device;
+ // extract the bus and device IDs from the device file string
+ // TODO: is it safe to parse the absolute path or should we be
+ // smarter and use a regex to only pick up the end of the path?
+ if (device_file.scanf("/dev/bus/usb/%d/%d", out camera_bus, out camera_device) < 2) {
+ critical("get_all_usb_cameras: Failed to scanf device file %s", device_file);
+
+ continue;
+ }
+ string camera = "usb:%.3d,%.3d".printf(camera_bus, camera_device);
+ debug("USB camera detected at %s", camera);
+ cameras += camera;
+ }
+ }
+
+ return cameras;
+ }
+
+ // USB (or libusb) is a funny beast; if only one USB device is present (i.e. the camera),
+ // then a single camera is detected at port usb:. However, if multiple USB devices are
+ // present (including non-cameras), then the first attached camera will be listed twice,
+ // first at usb:, then at usb:xxx,yyy. If the usb: device is removed, another usb:xxx,yyy
+ // device will lose its full-path name and be referred to as usb: only.
+ //
+ // This function gleans the full port name of a particular port, even if it's the unadorned
+ // "usb:", by using GUdev.
+ private bool usb_esp(int current_camera_count, string[] usb_cameras, string port,
+ out string full_port) {
+ // sanity
+ assert(current_camera_count > 0);
+
+ debug("USB ESP: current_camera_count=%d port=%s", current_camera_count, port);
+
+ full_port = null;
+
+ // if GPhoto detects one camera, and USB reports one camera, all is swell
+ if (current_camera_count == 1 && usb_cameras.length == 1) {
+ full_port = usb_cameras[0];
+
+ debug("USB ESP: port=%s full_port=%s", port, full_port);
+
+ return true;
+ }
+
+ // with more than one camera, skip the mirrored "usb:" port
+ if (port == "usb:") {
+ debug("USB ESP: Skipping %s", port);
+
+ return false;
+ }
+
+ // parse out the bus and device ID
+ int bus, device;
+ if (port.scanf("usb:%d,%d", out bus, out device) < 2) {
+ critical("USB ESP: Failed to scanf %s", port);
+
+ return false;
+ }
+
+ foreach (string usb_camera in usb_cameras) {
+ int camera_bus, camera_device;
+ if (usb_camera.scanf("usb:%d,%d", out camera_bus, out camera_device) < 2) {
+ critical("USB ESP: Failed to scanf %s", usb_camera);
+
+ continue;
+ }
+
+ if ((bus == camera_bus) && (device == camera_device)) {
+ full_port = port;
+
+ debug("USB ESP: port=%s full_port=%s", port, full_port);
+
+ return true;
+ }
+ }
+
+ debug("USB ESP: No matching bus/device found for port=%s", port);
+
+ return false;
+ }
+
+ public static string get_port_uri(string port) {
+ return "gphoto2://[%s]/".printf(port);
+ }
+
+ public static string? get_port_path(string port) {
+ // Accepted format is usb:001,005
+ return port.has_prefix("usb:") ?
+ "/dev/bus/usb/%s".printf(port.substring(4).replace(",", "/")) : null;
+ }
+
+ private string? get_name_for_uuid(string uuid) {
+ foreach (Volume volume in volume_monitor.get_volumes()) {
+ if (volume.get_identifier(VolumeIdentifier.UUID) == uuid) {
+ return volume.get_name();
+ }
+ }
+ return null;
+ }
+
+ private GLib.Icon? get_icon_for_uuid(string uuid) {
+ foreach (Volume volume in volume_monitor.get_volumes()) {
+ if (volume.get_identifier(VolumeIdentifier.UUID) == uuid) {
+ return volume.get_icon();
+ }
+ }
+ return null;
+ }
+
+ private void update_camera_table() throws GPhotoError {
+ // need to do this because virtual ports come and go in the USB world (and probably others)
+ GPhoto.PortInfoList port_info_list;
+ do_op(GPhoto.PortInfoList.create(out port_info_list), "create port list");
+ do_op(port_info_list.load(), "load port list");
+
+ GPhoto.CameraList camera_list;
+ do_op(GPhoto.CameraList.create(out camera_list), "create camera list");
+ do_op(abilities_list.detect(port_info_list, camera_list, null_context), "detect cameras");
+
+ Gee.HashMap<string, string> detected_map = new Gee.HashMap<string, string>();
+
+ // walk the USB chain and find all PTP cameras; this is necessary for usb_esp
+ string[] usb_cameras = get_all_usb_cameras();
+
+ // go through the detected camera list and glean their ports
+ for (int ctr = 0; ctr < camera_list.count(); ctr++) {
+ string name;
+ do_op(camera_list.get_name(ctr, out name), "get detected camera name");
+
+ string port;
+ do_op(camera_list.get_value(ctr, out port), "get detected camera port");
+
+ debug("Detected %d/%d %s @ %s", ctr + 1, camera_list.count(), name, port);
+
+ // do some USB ESP, skipping ports that cannot be deduced
+ if (port.has_prefix("usb:")) {
+ string full_port;
+ if (!usb_esp(camera_list.count(), usb_cameras, port, out full_port))
+ continue;
+
+ port = full_port;
+ }
+
+ detected_map.set(port, name);
+ }
+
+ // find cameras that have disappeared
+ DiscoveredCamera[] missing = new DiscoveredCamera[0];
+ foreach (DiscoveredCamera camera in camera_map.values) {
+ GPhoto.PortInfo port_info;
+ string tmp_path;
+
+ do_op(camera.gcamera.get_port_info(out port_info),
+ "retrieve missing camera port information");
+
+#if WITH_GPHOTO_25
+ port_info.get_path(out tmp_path);
+#else
+ tmp_path = port_info.path;
+#endif
+
+ GPhoto.CameraAbilities abilities;
+ do_op(camera.gcamera.get_abilities(out abilities), "retrieve camera abilities");
+
+ if (detected_map.has_key(tmp_path)) {
+ debug("Found camera for %s @ %s in detected map", abilities.model, tmp_path);
+
+ continue;
+ }
+
+ debug("%s @ %s missing", abilities.model, tmp_path);
+
+ missing += camera;
+ }
+
+ // have to remove from hash map outside of iterator
+ foreach (DiscoveredCamera camera in missing) {
+ GPhoto.PortInfo port_info;
+ string tmp_path;
+
+ do_op(camera.gcamera.get_port_info(out port_info),
+ "retrieve missing camera port information");
+#if WITH_GPHOTO_25
+ port_info.get_path(out tmp_path);
+#else
+ tmp_path = port_info.path;
+#endif
+
+ GPhoto.CameraAbilities abilities;
+ do_op(camera.gcamera.get_abilities(out abilities), "retrieve missing camera abilities");
+
+ debug("Removing from camera table: %s @ %s", abilities.model, tmp_path);
+
+ camera_map.unset(get_port_uri(tmp_path));
+
+ camera_removed(camera);
+ }
+
+ // add cameras which were not present before
+ foreach (string port in detected_map.keys) {
+ string name = detected_map.get(port);
+ string display_name = null;
+ GLib.Icon? icon = null;
+ string uri = get_port_uri(port);
+
+ if (camera_map.has_key(uri)) {
+ // already known about
+ debug("%s @ %s already registered, skipping", name, port);
+
+ continue;
+ }
+
+ // Get display name for camera.
+ string path = get_port_path(port);
+ if (null != path) {
+ GUdev.Device device = client.query_by_device_file(path);
+ string serial = device.get_property("ID_SERIAL_SHORT");
+ if (null != serial) {
+ // Try to get the name and icon.
+ display_name = get_name_for_uuid(serial);
+ icon = get_icon_for_uuid(serial);
+ }
+ if (null == display_name) {
+ display_name = device.get_sysfs_attr("product");
+ }
+ if (null == display_name) {
+ display_name = device.get_property("ID_MODEL");
+ }
+ }
+ if (null == display_name) {
+ // Default to GPhoto detected name.
+ display_name = name;
+ }
+
+ int index = port_info_list.lookup_path(port);
+ if (index < 0)
+ do_op((GPhoto.Result) index, "lookup port %s".printf(port));
+
+ GPhoto.PortInfo port_info;
+ string tmp_path;
+
+ do_op(port_info_list.get_info(index, out port_info), "get port info for %s".printf(port));
+#if WITH_GPHOTO_25
+ port_info.get_path(out tmp_path);
+#else
+ tmp_path = port_info.path;
+#endif
+
+ // this should match, every time
+ assert(port == tmp_path);
+
+ index = abilities_list.lookup_model(name);
+ if (index < 0)
+ do_op((GPhoto.Result) index, "lookup camera model %s".printf(name));
+
+ GPhoto.CameraAbilities camera_abilities;
+ do_op(abilities_list.get_abilities(index, out camera_abilities),
+ "lookup camera abilities for %s".printf(name));
+
+ GPhoto.Camera gcamera;
+ do_op(GPhoto.Camera.create(out gcamera), "create camera object for %s".printf(name));
+ do_op(gcamera.set_abilities(camera_abilities), "set camera abilities for %s".printf(name));
+ do_op(gcamera.set_port_info(port_info), "set port info for %s on %s".printf(name, port));
+
+ debug("Adding to camera table: %s @ %s", name, port);
+
+ DiscoveredCamera camera = new DiscoveredCamera(gcamera, uri, display_name, icon);
+ camera_map.set(uri, camera);
+
+ camera_added(camera);
+ }
+ }
+
+ private void on_udev_event(string action, GUdev.Device device) {
+ debug("udev event: %s on %s", action, device.get_name());
+
+ // Device add/removes often arrive in pairs; this allows for a single
+ // update to occur when they come in all at once
+ camera_update_scheduler.after_timeout(UPDATE_DELAY_MSEC, true);
+ }
+
+ public void on_volume_changed(Volume volume) {
+ camera_update_scheduler.after_timeout(UPDATE_DELAY_MSEC, true);
+ }
+
+ private void on_update_cameras() {
+ try {
+ get_instance().update_camera_table();
+ } catch (GPhotoError err) {
+ warning("Error updating camera table: %s", err.message);
+ }
+ }
+}
+
diff --git a/src/camera/GPhoto.vala b/src/camera/GPhoto.vala
new file mode 100644
index 0000000..a1a46cb
--- /dev/null
+++ b/src/camera/GPhoto.vala
@@ -0,0 +1,367 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public errordomain GPhotoError {
+ LIBRARY
+}
+
+namespace GPhoto {
+ // ContextWrapper assigns signals to the various GPhoto.Context callbacks, as well as spins
+ // the event loop at opportune times.
+ public class ContextWrapper {
+ public Context context = new Context();
+
+ public ContextWrapper() {
+ context.set_idle_func(on_idle);
+ context.set_error_func(on_error);
+ context.set_status_func(on_status);
+ context.set_message_func(on_message);
+ context.set_progress_funcs(on_progress_start, on_progress_update, on_progress_stop);
+ }
+
+ public virtual void idle() {
+ }
+
+#if WITH_GPHOTO_25
+
+ public virtual void error(string text, void *data) {
+ }
+
+ public virtual void status(string text, void *data) {
+ }
+
+ public virtual void message(string text, void *data) {
+ }
+
+ public virtual void progress_start(float current, string text, void *data) {
+ }
+
+ public virtual void progress_update(float current, void *data) {
+ }
+
+ public virtual void progress_stop() {
+ }
+
+ private void on_idle(Context context) {
+ idle();
+ }
+
+ private void on_error(Context context, string text) {
+ error(text, null);
+ }
+
+ private void on_status(Context context, string text) {
+ status(text, null);
+ }
+
+ private void on_message(Context context, string text) {
+ message(text, null);
+ }
+
+ private uint on_progress_start(Context context, float target, string text) {
+ progress_start(target, text, null);
+
+ return 0;
+ }
+
+ private void on_progress_update(Context context, uint id, float current) {
+ progress_update(current, null);
+ }
+
+ private void on_progress_stop(Context context, uint id) {
+ progress_stop();
+ }
+
+#else
+
+ public virtual void error(string format, void *va_list) {
+ }
+
+ public virtual void status(string format, void *va_list) {
+ }
+
+ public virtual void message(string format, void *va_list) {
+ }
+
+ public virtual void progress_start(float target, string format, void *va_list) {
+ }
+
+ public virtual void progress_update(float current) {
+ }
+
+ public virtual void progress_stop() {
+ }
+
+ private void on_idle(Context context) {
+ idle();
+ }
+
+ private void on_error(Context context, string format, void *va_list) {
+ error(format, va_list);
+ }
+
+ private void on_status(Context context, string format, void *va_list) {
+ status(format, va_list);
+ }
+
+ private void on_message(Context context, string format, void *va_list) {
+ message(format, va_list);
+ }
+
+ private uint on_progress_start(Context context, float target, string format, void *va_list) {
+ progress_start(target, format, va_list);
+
+ return 0;
+ }
+
+ private void on_progress_update(Context context, uint id, float current) {
+ progress_update(current);
+ }
+
+ private void on_progress_stop(Context context, uint id) {
+ progress_stop();
+ }
+
+#endif
+ }
+
+ public class SpinIdleWrapper : ContextWrapper {
+ public SpinIdleWrapper() {
+ }
+
+ public override void idle() {
+ base.idle();
+
+ spin_event_loop();
+ }
+#if WITH_GPHOTO_25
+ public override void progress_update(float current, void *data) {
+ base.progress_update(current, data);
+
+ spin_event_loop();
+ }
+#else
+ public override void progress_update(float current) {
+ base.progress_update(current);
+
+ spin_event_loop();
+ }
+#endif
+ }
+
+ // For CameraFileInfoFile, CameraFileInfoPreview, and CameraStorageInformation. See:
+ // http://redmine.yorba.org/issues/1851
+ // https://bugzilla.redhat.com/show_bug.cgi?id=585676
+ // https://sourceforge.net/tracker/?func=detail&aid=3000198&group_id=8874&atid=108874
+ public const int MAX_FILENAME_LENGTH = 63;
+ public const int MAX_BASEDIR_LENGTH = 255;
+
+ public bool get_info(Context context, Camera camera, string folder, string filename,
+ out CameraFileInfo info) throws Error {
+ if (folder.length > MAX_BASEDIR_LENGTH || filename.length > MAX_FILENAME_LENGTH) {
+ info = {};
+
+ return false;
+ }
+
+ Result res = camera.get_file_info(folder, filename, out info, context);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error retrieving file information for %s/%s: %s",
+ (int) res, folder, filename, res.as_string());
+
+ return true;
+ }
+
+ // Libgphoto will in some instances refuse to get metadata from a camera, but the camera is accessable as a
+ // filesystem. In these cases shotwell can access the file directly. See:
+ // http://redmine.yorba.org/issues/2959
+ public PhotoMetadata? get_fallback_metadata(Camera camera, Context context, string folder, string filename) {
+ GPhoto.CameraStorageInformation *sifs = null;
+ int count = 0;
+ camera.get_storageinfo(&sifs, out count, context);
+
+ GPhoto.PortInfo port_info;
+ camera.get_port_info(out port_info);
+
+ string path;
+#if WITH_GPHOTO_25
+ port_info.get_path(out path);
+#else
+ path = port_info.path;
+#endif
+
+ string prefix = "disk:";
+ if(path.has_prefix(prefix))
+ path = path[prefix.length:path.length];
+ else
+ return null;
+
+ PhotoMetadata? metadata = new PhotoMetadata();
+ try {
+ metadata.read_from_file(File.new_for_path(path + folder + "/" + filename));
+ } catch {
+ metadata = null;
+ }
+
+ return metadata;
+ }
+
+ public Gdk.Pixbuf? load_preview(Context context, Camera camera, string folder, string filename,
+ out uint8[] raw, out size_t raw_length) throws Error {
+ raw = null;
+ raw_length = 0;
+
+ try {
+ raw = load_file_into_buffer(context, camera, folder, filename, GPhoto.CameraFileType.PREVIEW);
+ } catch {
+ PhotoMetadata metadata = get_fallback_metadata(camera, context, folder, filename);
+ if(null == metadata)
+ return null;
+ if(0 == metadata.get_preview_count())
+ return null;
+ PhotoPreview? preview = metadata.get_preview(metadata.get_preview_count() - 1);
+ raw = preview.flatten();
+ }
+
+ if (raw == null) {
+ raw_length = 0;
+ return null;
+ }
+
+ raw_length = raw.length;
+
+ // Try to make sure last two bytes are JPEG footer.
+ // This is necessary because GPhoto sometimes includes a few extra bytes. See
+ // Yorba bug #2905 and the following GPhoto bug:
+ // http://sourceforge.net/tracker/?func=detail&aid=3141521&group_id=8874&atid=108874
+ if (raw_length > 32) {
+ for (size_t i = raw_length - 2; i > raw_length - 32; i--) {
+ if (raw[i] == Jpeg.MARKER_PREFIX && raw[i + 1] == Jpeg.Marker.EOI) {
+ debug("Adjusted length of thumbnail for: %s", filename);
+ raw_length = i + 2;
+ break;
+ }
+ }
+ }
+
+ MemoryInputStream mins = new MemoryInputStream.from_data(raw, null);
+ return new Gdk.Pixbuf.from_stream_at_scale(mins, ImportPreview.MAX_SCALE, ImportPreview.MAX_SCALE, true, null);
+ }
+
+ public Gdk.Pixbuf? load_image(Context context, Camera camera, string folder, string filename)
+ throws Error {
+ InputStream ins = load_file_into_stream(context, camera, folder, filename, GPhoto.CameraFileType.NORMAL);
+ if (ins == null)
+ return null;
+
+ return new Gdk.Pixbuf.from_stream(ins, null);
+ }
+
+ public void save_image(Context context, Camera camera, string folder, string filename,
+ File dest_file) throws Error {
+ GPhoto.CameraFile camera_file;
+ GPhoto.Result res = GPhoto.CameraFile.create(out camera_file);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error allocating camera file: %s", (int) res, res.as_string());
+
+ res = camera.get_file(folder, filename, GPhoto.CameraFileType.NORMAL, camera_file, context);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error retrieving file object for %s/%s: %s",
+ (int) res, folder, filename, res.as_string());
+
+ res = camera_file.save(dest_file.get_path());
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error copying file %s/%s to %s: %s", (int) res,
+ folder, filename, dest_file.get_path(), res.as_string());
+ }
+
+ public PhotoMetadata? load_metadata(Context context, Camera camera, string folder, string filename)
+ throws Error {
+ uint8[] camera_raw = null;
+ try {
+ camera_raw = load_file_into_buffer(context, camera, folder, filename, GPhoto.CameraFileType.EXIF);
+ } catch {
+ return get_fallback_metadata(camera, context, folder, filename);
+ }
+
+ if (camera_raw == null || camera_raw.length == 0)
+ return null;
+
+ PhotoMetadata metadata = new PhotoMetadata();
+ metadata.read_from_app1_segment(camera_raw);
+
+ return metadata;
+ }
+
+ // Returns an InputStream for the requested camera file. The stream should be used
+ // immediately rather than stored, as the backing is temporary in nature.
+ public InputStream load_file_into_stream(Context context, Camera camera, string folder, string filename,
+ GPhoto.CameraFileType filetype) throws Error {
+ GPhoto.CameraFile camera_file;
+ GPhoto.Result res = GPhoto.CameraFile.create(out camera_file);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error allocating camera file: %s", (int) res, res.as_string());
+
+ res = camera.get_file(folder, filename, filetype, camera_file, context);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error retrieving file object for %s/%s: %s",
+ (int) res, folder, filename, res.as_string());
+
+ // if entire file fits in memory, return a stream from that ... can't merely wrap
+ // MemoryInputStream around the camera_file buffer, as that will be destroyed when the
+ // function returns
+ unowned uint8 *data;
+ ulong data_len;
+ res = camera_file.get_data_and_size(out data, out data_len);
+ if (res == Result.OK) {
+ uint8[] buffer = new uint8[data_len];
+ Memory.copy(buffer, data, buffer.length);
+
+ return new MemoryInputStream.from_data(buffer, on_mins_destroyed);
+ }
+
+ // if not stored in memory, try copying it to a temp file and then reading out of that
+ File temp = AppDirs.get_temp_dir().get_child("import.tmp");
+ res = camera_file.save(temp.get_path());
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error copying file %s/%s to %s: %s", (int) res,
+ folder, filename, temp.get_path(), res.as_string());
+
+ return temp.read(null);
+ }
+
+ private static void on_mins_destroyed(void *data) {
+ free(data);
+ }
+
+ // Returns a buffer with the requested file, if within reason. Use load_file for larger files.
+ public uint8[]? load_file_into_buffer(Context context, Camera camera, string folder,
+ string filename, CameraFileType filetype) throws Error {
+ GPhoto.CameraFile camera_file;
+ GPhoto.Result res = GPhoto.CameraFile.create(out camera_file);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error allocating camera file: %s", (int) res, res.as_string());
+
+ res = camera.get_file(folder, filename, filetype, camera_file, context);
+ if (res != Result.OK)
+ throw new GPhotoError.LIBRARY("[%d] Error retrieving file object for %s/%s: %s",
+ (int) res, folder, filename, res.as_string());
+
+ // if buffer can be loaded into memory, return a copy of that (can't return buffer itself
+ // as it will be destroyed when the camera_file is unref'd)
+ unowned uint8 *data;
+ ulong data_len;
+ res = camera_file.get_data_and_size(out data, out data_len);
+ if (res != Result.OK)
+ return null;
+
+ uint8[] buffer = new uint8[data_len];
+ Memory.copy(buffer, data, buffer.length);
+
+ return buffer;
+ }
+}
+
diff --git a/src/camera/ImportPage.vala b/src/camera/ImportPage.vala
new file mode 100644
index 0000000..823a458
--- /dev/null
+++ b/src/camera/ImportPage.vala
@@ -0,0 +1,1799 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+private class ImportSourceCollection : SourceCollection {
+ public ImportSourceCollection(string name) {
+ base (name);
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is ImportSource;
+ }
+}
+
+abstract class ImportSource : ThumbnailSource, Indexable {
+ private string camera_name;
+ private GPhoto.Camera camera;
+ private int fsid;
+ private string folder;
+ private string filename;
+ private ulong file_size;
+ private time_t modification_time;
+ private Gdk.Pixbuf? preview = null;
+ private string? indexable_keywords = null;
+
+ public ImportSource(string camera_name, GPhoto.Camera camera, int fsid, string folder,
+ string filename, ulong file_size, time_t modification_time) {
+ this.camera_name = camera_name;
+ this.camera = camera;
+ this.fsid = fsid;
+ this.folder = folder;
+ this.filename = filename;
+ this.file_size = file_size;
+ this.modification_time = modification_time;
+ indexable_keywords = prepare_indexable_string(filename);
+ }
+
+ protected void set_preview(Gdk.Pixbuf? preview) {
+ this.preview = preview;
+ }
+
+ public string get_camera_name() {
+ return camera_name;
+ }
+
+ public GPhoto.Camera get_camera() {
+ return camera;
+ }
+
+ public int get_fsid() {
+ return fsid;
+ }
+
+ public string get_folder() {
+ return folder;
+ }
+
+ public string get_filename() {
+ return filename;
+ }
+
+ public ulong get_filesize() {
+ return file_size;
+ }
+
+ public time_t get_modification_time() {
+ return modification_time;
+ }
+
+ public virtual Gdk.Pixbuf? get_preview() {
+ return preview;
+ }
+
+ public virtual time_t get_exposure_time() {
+ return get_modification_time();
+ }
+
+ public string? get_fulldir() {
+ return ImportPage.get_fulldir(get_camera(), get_camera_name(), get_fsid(), get_folder());
+ }
+
+ public override string to_string() {
+ return "%s %s/%s".printf(get_camera_name(), get_folder(), get_filename());
+ }
+
+ public override bool internal_delete_backing() throws Error {
+ debug("Deleting %s from %s", to_string(), camera_name);
+
+ string? fulldir = get_fulldir();
+ if (fulldir == null) {
+ warning("Skipping deleting %s from %s: invalid folder name", to_string(), camera_name);
+
+ return base.internal_delete_backing();
+ }
+
+ GPhoto.Result result = get_camera().delete_file(fulldir, get_filename(),
+ ImportPage.spin_idle_context.context);
+ if (result != GPhoto.Result.OK)
+ warning("Error deleting %s from %s: %s", to_string(), camera_name, result.to_full_string());
+
+ return base.internal_delete_backing() && (result == GPhoto.Result.OK);
+ }
+
+ public unowned string? get_indexable_keywords() {
+ return indexable_keywords;
+ }
+}
+
+class VideoImportSource : ImportSource {
+ public VideoImportSource(string camera_name, GPhoto.Camera camera, int fsid, string folder,
+ string filename, ulong file_size, time_t modification_time) {
+ base(camera_name, camera, fsid, folder, filename, file_size, modification_time);
+ }
+
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ return create_thumbnail(scale);
+ }
+
+ public override Gdk.Pixbuf? create_thumbnail(int scale) throws Error {
+ if (get_preview() == null)
+ return null;
+
+ // this satifies the return-a-new-instance requirement of create_thumbnail( ) because
+ // scale_pixbuf( ) allocates a new pixbuf
+ return (scale > 0) ? scale_pixbuf(get_preview(), scale, Gdk.InterpType.BILINEAR, true) :
+ get_preview();
+ }
+
+ public override string get_typename() {
+ return "videoimport";
+ }
+
+ public override int64 get_instance_id() {
+ return get_object_id();
+ }
+
+ public override PhotoFileFormat get_preferred_thumbnail_format() {
+ return PhotoFileFormat.get_system_default_format();
+ }
+
+ public override string get_name() {
+ return get_filename();
+ }
+
+ public void update(Gdk.Pixbuf? preview) {
+ set_preview((preview != null) ? preview : Resources.get_noninterpretable_badge_pixbuf());
+ }
+}
+
+class PhotoImportSource : ImportSource {
+ public const Gdk.InterpType INTERP = Gdk.InterpType.BILINEAR;
+
+ private PhotoFileFormat file_format;
+ private string? preview_md5 = null;
+ private PhotoMetadata? metadata = null;
+ private string? exif_md5 = null;
+ private PhotoImportSource? associated = null; // JPEG source for RAW+JPEG
+
+ public PhotoImportSource(string camera_name, GPhoto.Camera camera, int fsid, string folder,
+ string filename, ulong file_size, time_t modification_time, PhotoFileFormat file_format) {
+ base(camera_name, camera, fsid, folder, filename, file_size, modification_time);
+ this.file_format = file_format;
+ }
+
+ public override string get_name() {
+ string? title = get_title();
+
+ return !is_string_empty(title) ? title : get_filename();
+ }
+
+ public override string get_typename() {
+ return "photoimport";
+ }
+
+ public override int64 get_instance_id() {
+ return get_object_id();
+ }
+
+ public override PhotoFileFormat get_preferred_thumbnail_format() {
+ return (file_format.can_write()) ? file_format :
+ PhotoFileFormat.get_system_default_format();
+ }
+
+ public override Gdk.Pixbuf? create_thumbnail(int scale) throws Error {
+ if (get_preview() == null)
+ return null;
+
+ // this satifies the return-a-new-instance requirement of create_thumbnail( ) because
+ // scale_pixbuf( ) allocates a new pixbuf
+ return (scale > 0) ? scale_pixbuf(get_preview(), scale, INTERP, true) : get_preview();
+ }
+
+ // Needed because previews and exif are loaded after other information has been gathered.
+ public void update(Gdk.Pixbuf? preview, string? preview_md5, PhotoMetadata? metadata, string? exif_md5) {
+ set_preview(preview);
+ this.preview_md5 = preview_md5;
+ this.metadata = metadata;
+ this.exif_md5 = exif_md5;
+ }
+
+ public override time_t get_exposure_time() {
+ if (metadata == null)
+ return get_modification_time();
+
+ MetadataDateTime? date_time = metadata.get_exposure_date_time();
+
+ return (date_time != null) ? date_time.get_timestamp() : get_modification_time();
+ }
+
+ public string? get_title() {
+ return (metadata != null) ? metadata.get_title() : null;
+ }
+
+ public PhotoMetadata? get_metadata() {
+ if (associated != null)
+ return associated.get_metadata();
+
+ return metadata;
+ }
+
+ public override Gdk.Pixbuf? get_preview() {
+ if (associated != null)
+ return associated.get_preview();
+
+ if (base.get_preview() != null)
+ return base.get_preview();
+
+ return null;
+ }
+
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ if (get_preview() == null)
+ return null;
+
+ return (scale > 0) ? scale_pixbuf(get_preview(), scale, INTERP, true) : get_preview();
+ }
+
+ public PhotoFileFormat get_file_format() {
+ return file_format;
+ }
+
+ public string? get_preview_md5() {
+ return preview_md5;
+ }
+
+ public void set_associated(PhotoImportSource? associated) {
+ this.associated = associated;
+ }
+
+ public PhotoImportSource? get_associated() {
+ return associated;
+ }
+
+ public override bool internal_delete_backing() throws Error {
+ bool ret = base.internal_delete_backing();
+ if (associated != null)
+ ret &= associated.internal_delete_backing();
+ return ret;
+ }
+}
+
+class ImportPreview : MediaSourceItem {
+ public const int MAX_SCALE = 128;
+
+ private static Gdk.Pixbuf placeholder_preview = null;
+
+ private DuplicatedFile? duplicated_file;
+
+ public ImportPreview(ImportSource source) {
+ base(source, Dimensions(), source.get_name(), null);
+
+ this.duplicated_file = null;
+
+ // draw sprocket holes as visual indications on video previews
+ if (source is VideoImportSource)
+ set_enable_sprockets(true);
+
+ // scale down pixbuf if necessary
+ Gdk.Pixbuf pixbuf = null;
+ try {
+ pixbuf = source.get_thumbnail(0);
+ } catch (Error err) {
+ warning("Unable to fetch loaded import preview for %s: %s", to_string(), err.message);
+ }
+
+ // use placeholder if no preview available
+ bool using_placeholder = (pixbuf == null);
+ if (pixbuf == null) {
+ if (placeholder_preview == null) {
+ placeholder_preview = AppWindow.get_instance().render_icon(Gtk.Stock.MISSING_IMAGE,
+ Gtk.IconSize.DIALOG, null);
+ placeholder_preview = scale_pixbuf(placeholder_preview, MAX_SCALE,
+ Gdk.InterpType.BILINEAR, true);
+ }
+
+ pixbuf = placeholder_preview;
+ }
+
+ // scale down if too large
+ if (pixbuf.get_width() > MAX_SCALE || pixbuf.get_height() > MAX_SCALE)
+ pixbuf = scale_pixbuf(pixbuf, MAX_SCALE, PhotoImportSource.INTERP, false);
+
+ if (source is PhotoImportSource) {
+ // honor rotation for photos -- we don't care about videos since they can't be rotated
+ PhotoImportSource photo_import_source = source as PhotoImportSource;
+ if (!using_placeholder && photo_import_source.get_metadata() != null)
+ pixbuf = photo_import_source.get_metadata().get_orientation().rotate_pixbuf(pixbuf);
+
+ if (photo_import_source.get_associated() != null) {
+ set_subtitle("<small>%s</small>".printf(_("RAW+JPEG")), true);
+ }
+ }
+
+ set_image(pixbuf);
+ }
+
+ public bool is_already_imported() {
+ PhotoImportSource photo_import_source = get_import_source() as PhotoImportSource;
+ if (photo_import_source != null) {
+ string? preview_md5 = photo_import_source.get_preview_md5();
+ PhotoFileFormat file_format = photo_import_source.get_file_format();
+
+ // ignore trashed duplicates
+ if (!is_string_empty(preview_md5)
+ && LibraryPhoto.has_nontrash_duplicate(null, preview_md5, null, file_format)) {
+
+ duplicated_file = DuplicatedFile.create_from_photo_id(
+ LibraryPhoto.get_nontrash_duplicate(null, preview_md5, null, file_format));
+
+ return true;
+ }
+
+ // Because gPhoto doesn't reliably return thumbnails for RAW files, and because we want
+ // to avoid downloading huge RAW files during an "import all" only to determine they're
+ // duplicates, use the image's basename and filesize to do duplicate detection
+ if (file_format == PhotoFileFormat.RAW) {
+ uint64 filesize = get_import_source().get_filesize();
+ // unlikely to be a problem, but what the hay
+ if (filesize <= int64.MAX) {
+ if (LibraryPhoto.global.has_basename_filesize_duplicate(
+ get_import_source().get_filename(), (int64) filesize)) {
+
+ duplicated_file = DuplicatedFile.create_from_photo_id(
+ LibraryPhoto.global.get_basename_filesize_duplicate(
+ get_import_source().get_filename(), (int64) filesize));
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ VideoImportSource video_import_source = get_import_source() as VideoImportSource;
+ if (video_import_source != null) {
+ // Unlike photos, if a video does have a thumbnail (i.e. gphoto2 can retrieve one from
+ // a sidecar file), it will be unavailable to Shotwell during the import process, so
+ // no comparison is available. Instead, like RAW files, use name and filesize to
+ // do a less-reliable but better-than-nothing comparison
+ if (Video.global.has_basename_filesize_duplicate(video_import_source.get_filename(),
+ video_import_source.get_filesize())) {
+
+ duplicated_file = DuplicatedFile.create_from_video_id(
+ Video.global.get_basename_filesize_duplicate(
+ video_import_source.get_filename(),
+ video_import_source.get_filesize()));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ return false;
+ }
+
+ public DuplicatedFile? get_duplicated_file() {
+ if (!is_already_imported())
+ return null;
+
+ return duplicated_file;
+ }
+
+ public ImportSource get_import_source() {
+ return (ImportSource) get_source();
+ }
+}
+
+public class CameraViewTracker : Core.ViewTracker {
+ public CameraAccumulator all = new CameraAccumulator();
+ public CameraAccumulator visible = new CameraAccumulator();
+ public CameraAccumulator selected = new CameraAccumulator();
+
+ public CameraViewTracker(ViewCollection collection) {
+ base (collection);
+
+ start(all, visible, selected);
+ }
+}
+
+public class CameraAccumulator : Object, Core.TrackerAccumulator {
+ public int total { get; private set; default = 0; }
+ public int photos { get; private set; default = 0; }
+ public int videos { get; private set; default = 0; }
+ public int raw { get; private set; default = 0; }
+
+ public bool include(DataObject object) {
+ ImportSource source = (ImportSource) ((DataView) object).get_source();
+
+ total++;
+
+ PhotoImportSource? photo = source as PhotoImportSource;
+ if (photo != null && photo.get_file_format() != PhotoFileFormat.RAW)
+ photos++;
+ else if (photo != null && photo.get_file_format() == PhotoFileFormat.RAW)
+ raw++;
+ else if (source is VideoImportSource)
+ videos++;
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool uninclude(DataObject object) {
+ ImportSource source = (ImportSource) ((DataView) object).get_source();
+
+ total++;
+
+ PhotoImportSource? photo = source as PhotoImportSource;
+ if (photo != null && photo.get_file_format() != PhotoFileFormat.RAW) {
+ assert(photos > 0);
+ photos--;
+ } else if (photo != null && photo.get_file_format() == PhotoFileFormat.RAW) {
+ assert(raw > 0);
+ raw--;
+ } else if (source is VideoImportSource) {
+ assert(videos > 0);
+ videos--;
+ }
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool altered(DataObject object, Alteration alteration) {
+ // no alteration affects accumulated data
+ return false;
+ }
+
+ public string to_string() {
+ return "%d total/%d photos/%d videos/%d raw".printf(total, photos, videos, raw);
+ }
+}
+
+public class ImportPage : CheckerboardPage {
+ private const string UNMOUNT_FAILED_MSG = _("Unable to unmount camera. Try unmounting the camera from the file manager.");
+
+ private class ImportViewManager : ViewManager {
+ private ImportPage owner;
+
+ public ImportViewManager(ImportPage owner) {
+ this.owner = owner;
+ }
+
+ public override DataView create_view(DataSource source) {
+ return new ImportPreview((ImportSource) source);
+ }
+ }
+
+ private class CameraImportJob : BatchImportJob {
+ private GPhoto.ContextWrapper context;
+ private ImportSource import_file;
+ private GPhoto.Camera camera;
+ private string fulldir;
+ private string filename;
+ private uint64 filesize;
+ private PhotoMetadata metadata;
+ private time_t exposure_time;
+ private CameraImportJob? associated = null;
+ private BackingPhotoRow? associated_file = null;
+ private DuplicatedFile? duplicated_file;
+
+ public CameraImportJob(GPhoto.ContextWrapper context, ImportSource import_file,
+ DuplicatedFile? duplicated_file = null) {
+ this.context = context;
+ this.import_file = import_file;
+ this.duplicated_file = duplicated_file;
+
+ // stash everything called in prepare(), as it may/will be called from a separate thread
+ camera = import_file.get_camera();
+ fulldir = import_file.get_fulldir();
+ // this should've been caught long ago when the files were first enumerated
+ assert(fulldir != null);
+ filename = import_file.get_filename();
+ filesize = import_file.get_filesize();
+ metadata = (import_file is PhotoImportSource) ?
+ (import_file as PhotoImportSource).get_metadata() : null;
+ exposure_time = import_file.get_exposure_time();
+ }
+
+ public time_t get_exposure_time() {
+ return exposure_time;
+ }
+
+ public override DuplicatedFile? get_duplicated_file() {
+ return duplicated_file;
+ }
+
+ public override time_t get_exposure_time_override() {
+ return (import_file is VideoImportSource) ? get_exposure_time() : 0;
+ }
+
+ public override string get_dest_identifier() {
+ return filename;
+ }
+
+ public override string get_source_identifier() {
+ return import_file.get_filename();
+ }
+
+ public override string get_basename() {
+ return filename;
+ }
+
+ public override string get_path() {
+ return fulldir;
+ }
+
+ public override void set_associated(BatchImportJob associated) {
+ this.associated = associated as CameraImportJob;
+ }
+
+ public ImportSource get_source() {
+ return import_file;
+ }
+
+ public override bool is_directory() {
+ return false;
+ }
+
+ public override bool determine_file_size(out uint64 filesize, out File file) {
+ file = null;
+ filesize = this.filesize;
+
+ return true;
+ }
+
+ public override bool prepare(out File file_to_import, out bool copy_to_library) throws Error {
+ file_to_import = null;
+ copy_to_library = false;
+
+ File dest_file = null;
+ try {
+ bool collision;
+ dest_file = LibraryFiles.generate_unique_file(filename, metadata, exposure_time,
+ out collision);
+ } catch (Error err) {
+ warning("Unable to generate local file for %s: %s", import_file.get_filename(),
+ err.message);
+ }
+
+ if (dest_file == null) {
+ message("Unable to generate local file for %s", import_file.get_filename());
+
+ return false;
+ }
+
+ // always blacklist the copied images from the LibraryMonitor, otherwise it'll think
+ // they should be auto-imported
+ LibraryMonitor.blacklist_file(dest_file, "CameraImportJob.prepare");
+ try {
+ GPhoto.save_image(context.context, camera, fulldir, filename, dest_file);
+ } finally {
+ LibraryMonitor.unblacklist_file(dest_file);
+ }
+
+ // Copy over associated file, if it exists.
+ if (associated != null) {
+ try {
+ associated_file =
+ RawDeveloper.CAMERA.create_backing_row_for_development(dest_file.get_path(),
+ associated.get_basename());
+ } catch (Error err) {
+ warning("Unable to generate backing associated file for %s: %s", associated.filename,
+ err.message);
+ }
+
+ if (associated_file == null) {
+ message("Unable to generate backing associated file for %s", associated.filename);
+ return false;
+ }
+
+ File assoc_dest = File.new_for_path(associated_file.filepath);
+ LibraryMonitor.blacklist_file(assoc_dest, "CameraImportJob.prepare");
+ try {
+ GPhoto.save_image(context.context, camera, associated.fulldir, associated.filename,
+ assoc_dest);
+ } finally {
+ LibraryMonitor.unblacklist_file(assoc_dest);
+ }
+ }
+
+ file_to_import = dest_file;
+ copy_to_library = false;
+
+ return true;
+ }
+
+ public override bool complete(MediaSource source, BatchImportRoll import_roll) throws Error {
+ bool ret = false;
+ if (source is Photo) {
+ Photo photo = source as Photo;
+
+ // Associate paired JPEG with RAW photo.
+ if (associated_file != null) {
+ photo.add_backing_photo_for_development(RawDeveloper.CAMERA, associated_file);
+ ret = true;
+ photo.set_raw_developer(Config.Facade.get_instance().get_default_raw_developer());
+ }
+ }
+ return ret;
+ }
+ }
+
+ private class ImportPageSearchViewFilter : SearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.MEDIA;
+ }
+
+ public override bool predicate(DataView view) {
+ ImportSource source = ((ImportPreview) view).get_import_source();
+
+ // Media type.
+ if ((bool) (SearchFilterCriteria.MEDIA & get_criteria()) && filter_by_media_type()) {
+ if (source is VideoImportSource) {
+ if (!show_media_video)
+ return false;
+ } else if (source is PhotoImportSource) {
+ PhotoImportSource photo = source as PhotoImportSource;
+ if (photo.get_file_format() == PhotoFileFormat.RAW) {
+ if (photo.get_associated() != null) {
+ if (!show_media_photos && !show_media_raw)
+ return false;
+ } else if (!show_media_raw) {
+ return false;
+ }
+ } else if (!show_media_photos)
+ return false;
+ }
+ }
+
+ if ((bool) (SearchFilterCriteria.TEXT & get_criteria())) {
+ unowned string? keywords = source.get_indexable_keywords();
+ if (is_string_empty(keywords))
+ return false;
+
+ // Return false if the word isn't found, true otherwise.
+ foreach (unowned string word in get_search_filter_words()) {
+ if (!keywords.contains(word))
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ // View filter for already imported filter.
+ private class HideImportedViewFilter : ViewFilter {
+ public override bool predicate(DataView view) {
+ return !((ImportPreview) view).is_already_imported();
+ }
+ }
+
+ public static GPhoto.ContextWrapper null_context = null;
+ public static GPhoto.SpinIdleWrapper spin_idle_context = null;
+
+ private SourceCollection import_sources = null;
+ private Gtk.Label camera_label = new Gtk.Label(null);
+ private Gtk.CheckButton hide_imported;
+ private Gtk.ProgressBar progress_bar = new Gtk.ProgressBar();
+ private GPhoto.Camera camera;
+ private string uri;
+ private bool busy = false;
+ private bool refreshed = false;
+ private GPhoto.Result refresh_result = GPhoto.Result.OK;
+ private string refresh_error = null;
+ private string camera_name;
+ private VolumeMonitor volume_monitor = null;
+ private ImportPage? local_ref = null;
+ private GLib.Icon? icon;
+ private ImportPageSearchViewFilter search_filter = new ImportPageSearchViewFilter();
+ private HideImportedViewFilter hide_imported_filter = new HideImportedViewFilter();
+ private CameraViewTracker tracker;
+
+#if UNITY_SUPPORT
+ UnityProgressBar uniprobar = UnityProgressBar.get_instance();
+#endif
+
+ public enum RefreshResult {
+ OK,
+ BUSY,
+ LOCKED,
+ LIBRARY_ERROR
+ }
+
+ public ImportPage(GPhoto.Camera camera, string uri, string? display_name = null, GLib.Icon? icon = null) {
+ base(_("Camera"));
+ this.camera = camera;
+ this.uri = uri;
+ this.import_sources = new ImportSourceCollection("ImportSources for %s".printf(uri));
+ this.icon = icon;
+
+ tracker = new CameraViewTracker(get_view());
+
+ // Get camera name.
+ if (null != display_name) {
+ camera_name = display_name;
+ } else {
+ GPhoto.CameraAbilities abilities;
+ GPhoto.Result res = camera.get_abilities(out abilities);
+ if (res != GPhoto.Result.OK) {
+ debug("Unable to get camera abilities: %s", res.to_full_string());
+ camera_name = _("Camera");
+ }
+ }
+ camera_label.set_text(camera_name);
+ set_page_name(camera_name);
+
+ // Mount.unmounted signal is *only* fired when a VolumeMonitor has been instantiated.
+ this.volume_monitor = VolumeMonitor.get();
+
+ // set up the global null context when needed
+ if (null_context == null)
+ null_context = new GPhoto.ContextWrapper();
+
+ // same with idle-loop wrapper
+ if (spin_idle_context == null)
+ spin_idle_context = new GPhoto.SpinIdleWrapper();
+
+ // monitor source collection to add/remove views
+ get_view().monitor_source_collection(import_sources, new ImportViewManager(this), null);
+
+ // sort by exposure time
+ get_view().set_comparator(preview_comparator, preview_comparator_predicate);
+
+ // monitor selection for UI
+ get_view().items_state_changed.connect(on_view_changed);
+ get_view().contents_altered.connect(on_view_changed);
+ get_view().items_visibility_changed.connect(on_view_changed);
+
+ // Show subtitles.
+ get_view().set_property(CheckerboardItem.PROP_SHOW_SUBTITLES, true);
+
+ // monitor Photos for removals, as that will change the result of the ViewFilter
+ LibraryPhoto.global.contents_altered.connect(on_media_added_removed);
+ Video.global.contents_altered.connect(on_media_added_removed);
+
+ init_item_context_menu("/ImportContextMenu");
+ init_page_context_menu("/ImportContextMenu");
+ }
+
+ ~ImportPage() {
+ LibraryPhoto.global.contents_altered.disconnect(on_media_added_removed);
+ Video.global.contents_altered.disconnect(on_media_added_removed);
+ }
+
+ public override Gtk.Toolbar get_toolbar() {
+ if (toolbar == null) {
+ base.get_toolbar();
+
+ // hide duplicates checkbox
+ hide_imported = new Gtk.CheckButton.with_label(_("Hide photos already imported"));
+ hide_imported.set_tooltip_text(_("Only display photos that have not been imported"));
+ hide_imported.clicked.connect(on_hide_imported);
+ hide_imported.sensitive = false;
+ hide_imported.active = Config.Facade.get_instance().get_hide_photos_already_imported();
+ Gtk.ToolItem hide_item = new Gtk.ToolItem();
+ hide_item.is_important = true;
+ hide_item.add(hide_imported);
+
+ toolbar.insert(hide_item, -1);
+
+ // separator to force buttons to right side of toolbar
+ Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
+ separator.set_draw(false);
+
+ toolbar.insert(separator, -1);
+
+ // progress bar in center of toolbar
+ progress_bar.set_orientation(Gtk.Orientation.HORIZONTAL);
+ progress_bar.visible = false;
+ Gtk.ToolItem progress_item = new Gtk.ToolItem();
+ progress_item.set_expand(true);
+ progress_item.add(progress_bar);
+ progress_bar.set_show_text(true);
+
+ toolbar.insert(progress_item, -1);
+
+ // Find button
+ Gtk.ToggleToolButton find_button = new Gtk.ToggleToolButton();
+ find_button.set_related_action(get_action("CommonDisplaySearchbar"));
+
+ toolbar.insert(find_button, -1);
+
+ // Separator
+ toolbar.insert(new Gtk.SeparatorToolItem(), -1);
+
+ // Import selected
+ Gtk.ToolButton import_selected_button = new Gtk.ToolButton.from_stock(Resources.IMPORT);
+ import_selected_button.set_related_action(get_action("ImportSelected"));
+
+ toolbar.insert(import_selected_button, -1);
+
+ // Import all
+ Gtk.ToolButton import_all_button = new Gtk.ToolButton.from_stock(Resources.IMPORT_ALL);
+ import_all_button.set_related_action(get_action("ImportAll"));
+
+ toolbar.insert(import_all_button, -1);
+
+ // restrain the recalcitrant rascal! prevents the progress bar from being added to the
+ // show_all queue so we have more control over its visibility
+ progress_bar.set_no_show_all(true);
+
+ update_toolbar_state();
+
+ show_all();
+ }
+
+ return toolbar;
+ }
+
+ public override Core.ViewTracker? get_view_tracker() {
+ return tracker;
+ }
+
+ // Ticket #3304 - Import page shouldn't display confusing message
+ // prior to import.
+ // TODO: replace this with approved text for "talking to camera,
+ // please wait" once new strings are being accepted.
+ protected override string get_view_empty_message() {
+ return _("Starting import, please wait...");
+ }
+
+ private static int64 preview_comparator(void *a, void *b) {
+ return ((ImportPreview *) a)->get_import_source().get_exposure_time()
+ - ((ImportPreview *) b)->get_import_source().get_exposure_time();
+ }
+
+ private static bool preview_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "exposure-time");
+ }
+
+ private int64 import_job_comparator(void *a, void *b) {
+ return ((CameraImportJob *) a)->get_exposure_time() - ((CameraImportJob *) b)->get_exposure_time();
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("import.ui");
+ }
+
+ protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
+ Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
+
+ Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
+ TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
+ titles.label = _("_Titles");
+ titles.tooltip = _("Display the title of each photo");
+ toggle_actions += titles;
+
+ return toggle_actions;
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry import_selected = { "ImportSelected", Resources.IMPORT,
+ TRANSLATABLE, null, null, on_import_selected };
+ import_selected.label = _("Import _Selected");
+ import_selected.tooltip = _("Import the selected photos into your library");
+ actions += import_selected;
+
+ Gtk.ActionEntry import_all = { "ImportAll", Resources.IMPORT_ALL, TRANSLATABLE,
+ null, null, on_import_all };
+ import_all.label = _("Import _All");
+ import_all.tooltip = _("Import all the photos into your library");
+ actions += import_all;
+
+ return actions;
+ }
+
+ public GPhoto.Camera get_camera() {
+ return camera;
+ }
+
+ public string get_uri() {
+ return uri;
+ }
+
+ public bool is_busy() {
+ return busy;
+ }
+
+ protected override void init_actions(int selected_count, int count) {
+ on_view_changed();
+
+ set_action_important("ImportSelected", true);
+ set_action_important("ImportAll", true);
+
+ base.init_actions(selected_count, count);
+ }
+
+ public bool is_refreshed() {
+ return refreshed && !busy;
+ }
+
+ public string? get_refresh_message() {
+ string msg = null;
+ if (refresh_error != null) {
+ msg = refresh_error;
+ } else if (refresh_result == GPhoto.Result.OK) {
+ // all went well
+ } else {
+ msg = refresh_result.to_full_string();
+ }
+
+ return msg;
+ }
+
+ private void update_status(bool busy, bool refreshed) {
+ this.busy = busy;
+ this.refreshed = refreshed;
+
+ on_view_changed();
+ }
+
+ private void update_toolbar_state() {
+ if (hide_imported != null)
+ hide_imported.sensitive = !busy && refreshed && (get_view().get_unfiltered_count() > 0);
+ }
+
+ private void on_view_changed() {
+ set_action_sensitive("ImportSelected", !busy && refreshed && get_view().get_selected_count() > 0);
+ set_action_sensitive("ImportAll", !busy && refreshed && get_view().get_count() > 0);
+ AppWindow.get_instance().set_common_action_sensitive("CommonSelectAll",
+ !busy && (get_view().get_count() > 0));
+
+ update_toolbar_state();
+ }
+
+ private void on_media_added_removed() {
+ search_filter.refresh();
+ }
+
+ private void on_display_titles(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_titles(display);
+ Config.Facade.get_instance().set_display_photo_titles(display);
+ }
+
+ public override void switched_to() {
+ set_display_titles(Config.Facade.get_instance().get_display_photo_titles());
+
+ base.switched_to();
+ }
+
+ public override void ready() {
+ try_refreshing_camera(false);
+ hide_imported_filter.refresh();
+ }
+
+ private void try_refreshing_camera(bool fail_on_locked) {
+ // if camera has been refreshed or is in the process of refreshing, go no further
+ if (refreshed || busy)
+ return;
+
+ RefreshResult res = refresh_camera();
+ switch (res) {
+ case ImportPage.RefreshResult.OK:
+ case ImportPage.RefreshResult.BUSY:
+ // nothing to report; if busy, let it continue doing its thing
+ // (although earlier check should've caught this)
+ break;
+
+ case ImportPage.RefreshResult.LOCKED:
+ if (fail_on_locked) {
+ AppWindow.error_message(UNMOUNT_FAILED_MSG);
+
+ break;
+ }
+
+ // if locked because it's mounted, offer to unmount
+ debug("Checking if %s is mounted ...", uri);
+
+ File uri = File.new_for_uri(uri);
+
+ Mount mount = null;
+ try {
+ mount = uri.find_enclosing_mount(null);
+ } catch (Error err) {
+ // error means not mounted
+ }
+
+ if (mount != null) {
+ // it's mounted, offer to unmount for the user
+ string mounted_message = _("Shotwell needs to unmount the camera from the filesystem in order to access it. Continue?");
+
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(AppWindow.get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION,
+ Gtk.ButtonsType.CANCEL, "%s", mounted_message);
+ dialog.title = Resources.APP_TITLE;
+ dialog.add_button(_("_Unmount"), Gtk.ResponseType.YES);
+ int dialog_res = dialog.run();
+ dialog.destroy();
+
+ if (dialog_res != Gtk.ResponseType.YES) {
+ set_page_message(_("Please unmount the camera."));
+ } else {
+ unmount_camera(mount);
+ }
+ } else {
+ string locked_message = _("The camera is locked by another application. Shotwell can only access the camera when it's unlocked. Please close any other application using the camera and try again.");
+
+ // it's not mounted, so another application must have it locked
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(AppWindow.get_instance(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING,
+ Gtk.ButtonsType.OK, "%s", locked_message);
+ dialog.title = Resources.APP_TITLE;
+ dialog.run();
+ dialog.destroy();
+
+ set_page_message(_("Please close any other application using the camera."));
+ }
+ break;
+
+ case ImportPage.RefreshResult.LIBRARY_ERROR:
+ AppWindow.error_message(_("Unable to fetch previews from the camera:\n%s").printf(
+ get_refresh_message()));
+ break;
+
+ default:
+ error("Unknown result type %d", (int) res);
+ }
+ }
+
+ public bool unmount_camera(Mount mount) {
+ if (busy)
+ return false;
+
+ update_status(true, false);
+ progress_bar.visible = true;
+ progress_bar.set_fraction(0.0);
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text(_("Unmounting..."));
+
+ // unmount_with_operation() can/will complete with the volume still mounted (probably meaning
+ // it's been *scheduled* for unmounting). However, this signal is fired when the mount
+ // really is unmounted -- *if* a VolumeMonitor has been instantiated.
+ mount.unmounted.connect(on_unmounted);
+
+ debug("Unmounting camera ...");
+ mount.unmount_with_operation.begin(MountUnmountFlags.NONE,
+ new Gtk.MountOperation(AppWindow.get_instance()), null, on_unmount_finished);
+
+ return true;
+ }
+
+ private void on_unmount_finished(Object? source, AsyncResult aresult) {
+ debug("Async unmount finished");
+
+ Mount mount = (Mount) source;
+ try {
+ mount.unmount_with_operation.end(aresult);
+ } catch (Error err) {
+ AppWindow.error_message(UNMOUNT_FAILED_MSG);
+
+ // don't trap this signal, even if it does come in, we've backed off
+ mount.unmounted.disconnect(on_unmounted);
+
+ update_status(false, refreshed);
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text("");
+ progress_bar.visible = false;
+ }
+ }
+
+ private void on_unmounted(Mount mount) {
+ debug("on_unmounted");
+
+ update_status(false, refreshed);
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text("");
+ progress_bar.visible = false;
+
+ try_refreshing_camera(true);
+ }
+
+ private void clear_all_import_sources() {
+ Marker marker = import_sources.start_marking();
+ marker.mark_all();
+ import_sources.destroy_marked(marker, false);
+ }
+
+ /**
+ * @brief Returns whether the current device has a given directory or not.
+ *
+ * @param fsid The file system id of the camera or other device to search.
+ * @param dir The path to start searching from.
+ * @param search_target The name of the directory to look for.
+ */
+ private bool check_directory_exists(int fsid, string dir, string search_target) {
+ string? fulldir = get_fulldir(camera, camera_name, fsid, dir);
+ GPhoto.Result result;
+ GPhoto.CameraList folders;
+
+ result = GPhoto.CameraList.create(out folders);
+ if (result != GPhoto.Result.OK) {
+ // couldn't create a list - can't determine whether specified dir is present
+ return false;
+ }
+
+ result = camera.list_folders(fulldir, folders, spin_idle_context.context);
+ if (result != GPhoto.Result.OK) {
+ // fetching the list failed - can't determine whether specified dir is present
+ return false;
+ }
+
+ int list_len = folders.count();
+
+ for(int list_index = 0; list_index < list_len; list_index++) {
+ string tmp;
+
+ folders.get_name(list_index, out tmp);
+ if (tmp == search_target) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private RefreshResult refresh_camera() {
+ if (busy)
+ return RefreshResult.BUSY;
+
+ update_status(busy, false);
+
+ refresh_error = null;
+ refresh_result = camera.init(spin_idle_context.context);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to initialize camera: %s", refresh_result.to_full_string());
+
+ return (refresh_result == GPhoto.Result.IO_LOCK) ? RefreshResult.LOCKED : RefreshResult.LIBRARY_ERROR;
+ }
+
+ update_status(true, refreshed);
+
+ on_view_changed();
+
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text(_("Fetching photo information"));
+ progress_bar.set_fraction(0.0);
+ progress_bar.set_pulse_step(0.01);
+ progress_bar.visible = true;
+
+ Gee.ArrayList<ImportSource> import_list = new Gee.ArrayList<ImportSource>();
+
+ GPhoto.CameraStorageInformation *sifs = null;
+ int count = 0;
+ refresh_result = camera.get_storageinfo(&sifs, out count, spin_idle_context.context);
+ if (refresh_result == GPhoto.Result.OK) {
+ for (int fsid = 0; fsid < count; fsid++) {
+ // Check well-known video and image paths first to prevent accidental
+ // scanning of undesired directories (which can cause user annoyance with
+ // some smartphones or camera-equipped media players)
+ bool got_well_known_dir = false;
+
+ // Check common paths for most primarily-still cameras, many (most?) smartphones
+ if (check_directory_exists(fsid, "/", "DCIM")) {
+ enumerate_files(fsid, "/DCIM", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/", "dcim")) {
+ enumerate_files(fsid, "/dcim", import_list);
+ got_well_known_dir = true;
+ }
+
+ // Check common paths for AVCHD camcorders, primarily-still
+ // cameras that shoot .mts video files
+ if (check_directory_exists(fsid, "/PRIVATE/", "AVCHD")) {
+ enumerate_files(fsid, "/PRIVATE/AVCHD", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/private/", "avchd")) {
+ enumerate_files(fsid, "/private/avchd", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/", "AVCHD")) {
+ enumerate_files(fsid, "/AVCHD", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/", "avchd")) {
+ enumerate_files(fsid, "/avchd", import_list);
+ got_well_known_dir = true;
+ }
+
+ // Check common video paths for some Sony primarily-still
+ // cameras
+ if (check_directory_exists(fsid, "/PRIVATE/", "SONY")) {
+ enumerate_files(fsid, "/PRIVATE/SONY", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/private/", "sony")) {
+ enumerate_files(fsid, "/private/sony", import_list);
+ got_well_known_dir = true;
+ }
+
+ // Check common video paths for Sony NEX3, PSP addon camera
+ if (check_directory_exists(fsid, "/", "MP_ROOT")) {
+ enumerate_files(fsid, "/MP_ROOT", import_list);
+ got_well_known_dir = true;
+ }
+ if (check_directory_exists(fsid, "/", "mp_root")) {
+ enumerate_files(fsid, "/mp_root", import_list);
+ got_well_known_dir = true;
+ }
+
+ // Didn't find any of the common directories we know about
+ // already - try scanning from device root.
+ if (!got_well_known_dir) {
+ if (!enumerate_files(fsid, "/", import_list))
+ break;
+ }
+ }
+ }
+
+ clear_all_import_sources();
+
+ // Associate files (for RAW+JPEG)
+ auto_match_raw_jpeg(import_list);
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+
+ load_previews_and_metadata(import_list);
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: reset
+ uniprobar.reset();
+#endif
+
+ progress_bar.visible = false;
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text("");
+ progress_bar.set_fraction(0.0);
+
+ GPhoto.Result res = camera.exit(spin_idle_context.context);
+ if (res != GPhoto.Result.OK) {
+ // log but don't fail
+ warning("Unable to unlock camera: %s", res.to_full_string());
+ }
+
+ if (refresh_result == GPhoto.Result.OK) {
+ update_status(false, true);
+ } else {
+ update_status(false, false);
+
+ // show 'em all or show none
+ clear_all_import_sources();
+ }
+
+ on_view_changed();
+
+ switch (refresh_result) {
+ case GPhoto.Result.OK:
+ return RefreshResult.OK;
+
+ case GPhoto.Result.IO_LOCK:
+ return RefreshResult.LOCKED;
+
+ default:
+ return RefreshResult.LIBRARY_ERROR;
+ }
+ }
+
+ private static string chomp_ch(string str, char ch) {
+ long offset = str.length;
+ while (--offset >= 0) {
+ if (str[offset] != ch)
+ return str.slice(0, offset);
+ }
+
+ return "";
+ }
+
+ public static string append_path(string basepath, string addition) {
+ if (!basepath.has_suffix("/") && !addition.has_prefix("/"))
+ return basepath + "/" + addition;
+ else if (basepath.has_suffix("/") && addition.has_prefix("/"))
+ return chomp_ch(basepath, '/') + addition;
+ else
+ return basepath + addition;
+ }
+
+ // Need to do this because some phones (iPhone, in particular) changes the name of their filesystem
+ // between each mount
+ public static string? get_fs_basedir(GPhoto.Camera camera, int fsid) {
+ GPhoto.CameraStorageInformation *sifs = null;
+ int count = 0;
+ GPhoto.Result res = camera.get_storageinfo(&sifs, out count, null_context.context);
+ if (res != GPhoto.Result.OK)
+ return null;
+
+ if (fsid >= count)
+ return null;
+
+ GPhoto.CameraStorageInformation *ifs = sifs + fsid;
+
+ return (ifs->fields & GPhoto.CameraStorageInfoFields.BASE) != 0 ? ifs->basedir : "/";
+ }
+
+ public static string? get_fulldir(GPhoto.Camera camera, string camera_name, int fsid, string folder) {
+ if (folder.length > GPhoto.MAX_BASEDIR_LENGTH)
+ return null;
+
+ string basedir = get_fs_basedir(camera, fsid);
+ if (basedir == null) {
+ debug("Unable to find base directory for %s fsid %d", camera_name, fsid);
+
+ return folder;
+ }
+
+ return append_path(basedir, folder);
+ }
+
+ private bool enumerate_files(int fsid, string dir, Gee.ArrayList<ImportSource> import_list) {
+ string? fulldir = get_fulldir(camera, camera_name, fsid, dir);
+ if (fulldir == null) {
+ warning("Skipping enumerating %s: invalid folder name", dir);
+
+ return true;
+ }
+
+ GPhoto.CameraList files;
+ refresh_result = GPhoto.CameraList.create(out files);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to create file list: %s", refresh_result.to_full_string());
+
+ return false;
+ }
+
+ refresh_result = camera.list_files(fulldir, files, spin_idle_context.context);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to list files in %s: %s", fulldir, refresh_result.to_full_string());
+
+ // Although an error, don't abort the import because of this
+ refresh_result = GPhoto.Result.OK;
+
+ return true;
+ }
+
+ for (int ctr = 0; ctr < files.count(); ctr++) {
+ string filename;
+ refresh_result = files.get_name(ctr, out filename);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to get the name of file %d in %s: %s", ctr, fulldir,
+ refresh_result.to_full_string());
+
+ return false;
+ }
+
+ try {
+ GPhoto.CameraFileInfo info;
+ if (!GPhoto.get_info(spin_idle_context.context, camera, fulldir, filename, out info)) {
+ warning("Skipping import of %s/%s: name too long", fulldir, filename);
+
+ continue;
+ }
+
+ if ((info.file.fields & GPhoto.CameraFileInfoFields.TYPE) == 0) {
+ message("Skipping %s/%s: No file (file=%02Xh)", fulldir, filename,
+ info.file.fields);
+
+ continue;
+ }
+
+ if (VideoReader.is_supported_video_filename(filename)) {
+ VideoImportSource video_source = new VideoImportSource(camera_name, camera,
+ fsid, dir, filename, info.file.size, info.file.mtime);
+ import_list.add(video_source);
+ } else {
+ // determine file format from type, and then from file extension
+ PhotoFileFormat file_format = PhotoFileFormat.from_gphoto_type(info.file.type);
+ if (file_format == PhotoFileFormat.UNKNOWN) {
+ file_format = PhotoFileFormat.get_by_basename_extension(filename);
+ if (file_format == PhotoFileFormat.UNKNOWN) {
+ message("Skipping %s/%s: Not a supported file extension (%s)", fulldir,
+ filename, info.file.type);
+
+ continue;
+ }
+ }
+ import_list.add(new PhotoImportSource(camera_name, camera, fsid, dir, filename,
+ info.file.size, info.file.mtime, file_format));
+ }
+
+ progress_bar.pulse();
+
+ // spin the event loop so the UI doesn't freeze
+ spin_event_loop();
+ } catch (Error err) {
+ warning("Error while enumerating files in %s: %s", fulldir, err.message);
+
+ refresh_error = err.message;
+
+ return false;
+ }
+ }
+
+ GPhoto.CameraList folders;
+ refresh_result = GPhoto.CameraList.create(out folders);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to create folder list: %s", refresh_result.to_full_string());
+
+ return false;
+ }
+
+ refresh_result = camera.list_folders(fulldir, folders, spin_idle_context.context);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to list folders in %s: %s", fulldir, refresh_result.to_full_string());
+
+ // Although an error, don't abort the import because of this
+ refresh_result = GPhoto.Result.OK;
+
+ return true;
+ }
+
+ for (int ctr = 0; ctr < folders.count(); ctr++) {
+ string subdir;
+ refresh_result = folders.get_name(ctr, out subdir);
+ if (refresh_result != GPhoto.Result.OK) {
+ warning("Unable to get name of folder %d: %s", ctr, refresh_result.to_full_string());
+
+ return false;
+ }
+
+ if (!enumerate_files(fsid, append_path(dir, subdir), import_list))
+ return false;
+ }
+
+ return true;
+ }
+
+ // Try to match RAW+JPEG pairs.
+ private void auto_match_raw_jpeg(Gee.ArrayList<ImportSource> import_list) {
+ for (int i = 0; i < import_list.size; i++) {
+ PhotoImportSource? current = import_list.get(i) as PhotoImportSource;
+ PhotoImportSource? next = (i + 1 < import_list.size) ?
+ import_list.get(i + 1) as PhotoImportSource : null;
+ PhotoImportSource? prev = (i > 0) ?
+ import_list.get(i - 1) as PhotoImportSource : null;
+ if (current != null && current.get_file_format() == PhotoFileFormat.RAW) {
+ string current_name;
+ string ext;
+ disassemble_filename(current.get_filename(), out current_name, out ext);
+
+ // Try to find a matching pair.
+ PhotoImportSource? associated = null;
+ if (next != null && next.get_file_format() == PhotoFileFormat.JFIF) {
+ string next_name;
+ disassemble_filename(next.get_filename(), out next_name, out ext);
+ if (next_name == current_name)
+ associated = next;
+ }
+ if (prev != null && prev.get_file_format() == PhotoFileFormat.JFIF) {
+ string prev_name;
+ disassemble_filename(prev.get_filename(), out prev_name, out ext);
+ if (prev_name == current_name)
+ associated = prev;
+ }
+
+ // Associate!
+ if (associated != null) {
+ debug("Found RAW+JPEG pair: %s and %s", current.get_filename(), associated.get_filename());
+ current.set_associated(associated);
+ if (!import_list.remove(associated)) {
+ debug("Unable to associate files");
+ current.set_associated(null);
+ }
+ }
+ }
+ }
+ }
+
+ private void load_previews_and_metadata(Gee.List<ImportSource> import_list) {
+ int loaded_photos = 0;
+ foreach (ImportSource import_source in import_list) {
+ string filename = import_source.get_filename();
+ string? fulldir = import_source.get_fulldir();
+ if (fulldir == null) {
+ warning("Skipping loading preview of %s: invalid folder name", import_source.to_string());
+
+ continue;
+ }
+
+ // Get JPEG pair, if available.
+ PhotoImportSource? associated = null;
+ if (import_source is PhotoImportSource &&
+ ((PhotoImportSource) import_source).get_associated() != null) {
+ associated = ((PhotoImportSource) import_source).get_associated();
+ }
+
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.MIDDLE);
+ progress_bar.set_text(_("Fetching preview for %s").printf(import_source.get_name()));
+
+ // Ask GPhoto to read the current file's metadata, but only if the file is not a
+ // video. Across every memory card and camera type I've tested (lucas, as of 10/27/2010)
+ // GPhoto always loads null metadata for videos. So without the is-not-video guard,
+ // this code segment just needlessly and annoyingly prints a warning message to the
+ // console.
+ PhotoMetadata? metadata = null;
+ if (!VideoReader.is_supported_video_filename(filename)) {
+ try {
+ metadata = GPhoto.load_metadata(spin_idle_context.context, camera, fulldir,
+ filename);
+ } catch (Error err) {
+ warning("Unable to fetch metadata for %s/%s: %s", fulldir, filename,
+ err.message);
+ }
+ }
+
+ // calculate EXIF's fingerprint
+ string? exif_only_md5 = null;
+ if (metadata != null) {
+ uint8[]? flattened_sans_thumbnail = metadata.flatten_exif(false);
+ if (flattened_sans_thumbnail != null && flattened_sans_thumbnail.length > 0)
+ exif_only_md5 = md5_binary(flattened_sans_thumbnail, flattened_sans_thumbnail.length);
+ }
+
+ // XXX: Cannot use the metadata for the thumbnail preview because libgphoto2
+ // 2.4.6 has a bug where the returned EXIF data object is complete garbage. This
+ // is fixed in 2.4.7, but need to work around this as best we can. In particular,
+ // this means the preview orientation will be wrong and the MD5 is not generated
+ // if the EXIF did not parse properly (see above)
+
+ uint8[] preview_raw = null;
+ size_t preview_raw_length = 0;
+ Gdk.Pixbuf preview = null;
+ try {
+ string preview_fulldir = fulldir;
+ string preview_filename = filename;
+ if (associated != null) {
+ preview_fulldir = associated.get_fulldir();
+ preview_filename = associated.get_filename();
+ }
+ preview = GPhoto.load_preview(spin_idle_context.context, camera, preview_fulldir,
+ preview_filename, out preview_raw, out preview_raw_length);
+ } catch (Error err) {
+ // only issue the warning message if we're not reading a video. GPhoto is capable
+ // of reading video previews about 50% of the time, so we don't want to put a guard
+ // around this entire code segment like we did with the metadata-read segment above,
+ // however video previews being absent is so common that there's no reason
+ // we should generate a warning for one.
+ if (!VideoReader.is_supported_video_filename(filename)) {
+ warning("Unable to fetch preview for %s/%s: %s", fulldir, filename, err.message);
+ }
+ }
+
+ // calculate thumbnail fingerprint
+ string? preview_md5 = null;
+ if (preview != null && preview_raw != null && preview_raw_length > 0)
+ preview_md5 = md5_binary(preview_raw, preview_raw_length);
+
+#if TRACE_MD5
+ debug("camera MD5 %s: exif=%s preview=%s", filename, exif_only_md5, preview_md5);
+#endif
+
+ if (import_source is VideoImportSource)
+ (import_source as VideoImportSource).update(preview);
+
+ if (import_source is PhotoImportSource)
+ (import_source as PhotoImportSource).update(preview, preview_md5, metadata,
+ exif_only_md5);
+
+ if (associated != null) {
+ try {
+ PhotoMetadata? associated_metadata = GPhoto.load_metadata(spin_idle_context.context,
+ camera, associated.get_fulldir(), associated.get_filename());
+ associated.update(preview, preview_md5, associated_metadata, null);
+ } catch (Error err) {
+ warning("Unable to fetch metadata for %s/%s: %s", associated.get_fulldir(),
+ associated.get_filename(), err.message);
+ }
+ }
+
+ // *now* add to the SourceCollection, now that it is completed
+ import_sources.add(import_source);
+
+ progress_bar.set_fraction((double) (++loaded_photos) / (double) import_list.size);
+#if UNITY_SUPPORT
+ //UnityProgressBar: set progress
+ uniprobar.set_progress((double) (loaded_photos) / (double) import_list.size);
+#endif
+
+ // spin the event loop so the UI doesn't freeze
+ spin_event_loop();
+ }
+ }
+
+ private void on_hide_imported() {
+ if (hide_imported.get_active())
+ get_view().install_view_filter(hide_imported_filter);
+ else
+ get_view().remove_view_filter(hide_imported_filter);
+
+ Config.Facade.get_instance().set_hide_photos_already_imported(hide_imported.get_active());
+ }
+
+ private void on_import_selected() {
+ import(get_view().get_selected());
+ }
+
+ private void on_import_all() {
+ import(get_view().get_all());
+ }
+
+ private void import(Gee.Iterable<DataObject> items) {
+ GPhoto.Result res = camera.init(spin_idle_context.context);
+ if (res != GPhoto.Result.OK) {
+ AppWindow.error_message(_("Unable to lock camera: %s").printf(res.to_full_string()));
+
+ return;
+ }
+
+ update_status(true, refreshed);
+
+ on_view_changed();
+ progress_bar.visible = false;
+
+ SortedList<CameraImportJob> jobs = new SortedList<CameraImportJob>(import_job_comparator);
+ Gee.ArrayList<CameraImportJob> already_imported = new Gee.ArrayList<CameraImportJob>();
+
+ foreach (DataObject object in items) {
+ ImportPreview preview = (ImportPreview) object;
+ ImportSource import_file = (ImportSource) preview.get_source();
+
+ if (preview.is_already_imported()) {
+ message("Skipping import of %s: checksum detected in library",
+ import_file.get_filename());
+
+ already_imported.add(new CameraImportJob(null_context, import_file,
+ preview.get_duplicated_file()));
+
+ continue;
+ }
+
+ CameraImportJob import_job = new CameraImportJob(null_context, import_file);
+
+ // Maintain RAW+JPEG association.
+ if (import_file is PhotoImportSource &&
+ ((PhotoImportSource) import_file).get_associated() != null) {
+ import_job.set_associated(new CameraImportJob(null_context,
+ ((PhotoImportSource) import_file).get_associated()));
+ }
+
+ jobs.add(import_job);
+ }
+
+ debug("Importing %d files from %s", jobs.size, camera_name);
+
+ if (jobs.size > 0) {
+ // see import_reporter() to see why this is held during the duration of the import
+ assert(local_ref == null);
+ local_ref = this;
+
+ BatchImport batch_import = new BatchImport(jobs, camera_name, import_reporter,
+ null, already_imported);
+ batch_import.import_job_failed.connect(on_import_job_failed);
+ batch_import.import_complete.connect(close_import);
+
+ LibraryWindow.get_app().enqueue_batch_import(batch_import, true);
+ LibraryWindow.get_app().switch_to_import_queue_page();
+ // camera.exit() and busy flag will be handled when the batch import completes
+ } else {
+ // since failed up-front, build a fake (faux?) ImportManifest and report it here
+ if (already_imported.size > 0)
+ import_reporter(new ImportManifest(null, already_imported));
+
+ close_import();
+ }
+ }
+
+ private void on_import_job_failed(BatchImportResult result) {
+ if (result.file == null || result.result == ImportResult.SUCCESS)
+ return;
+
+ // delete the copied file
+ try {
+ result.file.delete(null);
+ } catch (Error err) {
+ message("Unable to delete downloaded file %s: %s", result.file.get_path(), err.message);
+ }
+ }
+
+ private void import_reporter(ImportManifest manifest) {
+ // TODO: Need to keep the ImportPage around until the BatchImport is completed, but the
+ // page controller (i.e. LibraryWindow) needs to know (a) if ImportPage is busy before
+ // removing and (b) if it is, to be notified when it ain't. Until that's in place, need
+ // to hold the ref so the page isn't destroyed ... this switcheroo keeps the ref alive
+ // until this function returns (at any time)
+ ImportPage? local_ref = this.local_ref;
+ this.local_ref = null;
+
+ if (manifest.success.size > 0) {
+ string photos_string = (ngettext("Delete this photo from camera?",
+ "Delete these %d photos from camera?",
+ manifest.success.size)).printf(manifest.success.size);
+ string videos_string = (ngettext("Delete this video from camera?",
+ "Delete these %d videos from camera?",
+ manifest.success.size)).printf(manifest.success.size);
+ string both_string = (ngettext("Delete this photo/video from camera?",
+ "Delete these %d photos/videos from camera?",
+ manifest.success.size)).printf(manifest.success.size);
+ string neither_string = (ngettext("Delete these files from camera?",
+ "Delete these %d files from camera?",
+ manifest.success.size)).printf(manifest.success.size);
+
+ string question_string = ImportUI.get_media_specific_string(manifest.success,
+ photos_string, videos_string, both_string, neither_string);
+
+ ImportUI.QuestionParams question = new ImportUI.QuestionParams(
+ question_string, Gtk.Stock.DELETE, _("_Keep"));
+
+ if (!ImportUI.report_manifest(manifest, false, question))
+ return;
+ } else {
+ ImportUI.report_manifest(manifest, false, null);
+ return;
+ }
+
+ // delete the photos from the camera and the SourceCollection... for now, this is an
+ // all-or-nothing deal
+ Marker marker = import_sources.start_marking();
+ foreach (BatchImportResult batch_result in manifest.success) {
+ CameraImportJob job = batch_result.job as CameraImportJob;
+
+ marker.mark(job.get_source());
+ }
+
+ ProgressDialog progress = new ProgressDialog(AppWindow.get_instance(),
+ _("Removing photos/videos from camera"), new Cancellable());
+ int error_count = import_sources.destroy_marked(marker, true, progress.monitor);
+ if (error_count > 0) {
+ string error_string =
+ (ngettext("Unable to delete %d photo/video from the camera due to errors.",
+ "Unable to delete %d photos/videos from the camera due to errors.", error_count)).printf(
+ error_count);
+ AppWindow.error_message(error_string);
+ }
+
+ progress.close();
+
+ // to stop build warnings
+ local_ref = null;
+ }
+
+ private void close_import() {
+ GPhoto.Result res = camera.exit(spin_idle_context.context);
+ if (res != GPhoto.Result.OK) {
+ // log but don't fail
+ message("Unable to unlock camera: %s", res.to_full_string());
+ }
+
+ update_status(false, refreshed);
+
+ on_view_changed();
+ }
+
+ public override void set_display_titles(bool display) {
+ base.set_display_titles(display);
+
+ Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
+ if (action != null)
+ action.set_active(display);
+ }
+
+ // Gets the search view filter for this page.
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
diff --git a/src/camera/mk/camera.mk b/src/camera/mk/camera.mk
new file mode 100644
index 0000000..1812a42
--- /dev/null
+++ b/src/camera/mk/camera.mk
@@ -0,0 +1,32 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Camera
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := camera
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ CameraTable.vala \
+ GPhoto.vala \
+ ImportPage.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Sidebar
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/config/Config.vala b/src/config/Config.vala
new file mode 100644
index 0000000..2095107
--- /dev/null
+++ b/src/config/Config.vala
@@ -0,0 +1,155 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Config unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Config {
+
+public class Facade : ConfigurationFacade {
+ public const double SLIDESHOW_DELAY_MAX = 30.0;
+ public const double SLIDESHOW_DELAY_MIN = 1.0;
+ public const double SLIDESHOW_DELAY_DEFAULT = 3.0;
+ public const double SLIDESHOW_TRANSITION_DELAY_MAX = 1.0;
+ public const double SLIDESHOW_TRANSITION_DELAY_MIN = 0.1;
+ public const double SLIDESHOW_TRANSITION_DELAY_DEFAULT = 0.3;
+ public const int WIDTH_DEFAULT = 1024;
+ public const int HEIGHT_DEFAULT = 768;
+ public const int SIDEBAR_MIN_POSITION = 180;
+ public const int SIDEBAR_MAX_POSITION = 1000;
+ public const string DEFAULT_BG_COLOR = "#444";
+ public const int NO_VIDEO_INTERPRETER_STATE = -1;
+
+ private const double BLACK_THRESHOLD = 0.61;
+ private const string DARK_SELECTED_COLOR = "#0AD";
+ private const string LIGHT_SELECTED_COLOR = "#2DF";
+ private const string DARK_UNSELECTED_COLOR = "#000";
+ private const string LIGHT_UNSELECTED_COLOR = "#FFF";
+ private const string DARK_BORDER_COLOR = "#999";
+ private const string LIGHT_BORDER_COLOR = "#AAA";
+ private const string DARK_UNFOCUSED_SELECTED_COLOR = "#6fc4dd";
+ private const string LIGHT_UNFOCUSED_SELECTED_COLOR = "#99efff";
+
+ private string bg_color = null;
+ private string selected_color = null;
+ private string unselected_color = null;
+ private string unfocused_selected_color = null;
+ private string border_color = null;
+
+ private static Facade instance = null;
+
+ public signal void colors_changed();
+
+ private Facade() {
+ base(new GSettingsConfigurationEngine());
+
+ bg_color_name_changed.connect(on_color_name_changed);
+ }
+
+ public static Facade get_instance() {
+ if (instance == null)
+ instance = new Facade();
+
+ return instance;
+ }
+
+ private void on_color_name_changed() {
+ colors_changed();
+ }
+
+ private void set_text_colors(Gdk.RGBA bg_color) {
+ // since bg color is greyscale, we only need to compare the red value to the threshold,
+ // which determines whether the background is dark enough to need light text and selection
+ // colors or vice versa
+ if (bg_color.red > BLACK_THRESHOLD) {
+ selected_color = DARK_SELECTED_COLOR;
+ unselected_color = DARK_UNSELECTED_COLOR;
+ unfocused_selected_color = DARK_UNFOCUSED_SELECTED_COLOR;
+ border_color = DARK_BORDER_COLOR;
+ } else {
+ selected_color = LIGHT_SELECTED_COLOR;
+ unselected_color = LIGHT_UNSELECTED_COLOR;
+ unfocused_selected_color = LIGHT_UNFOCUSED_SELECTED_COLOR;
+ border_color = LIGHT_BORDER_COLOR;
+ }
+ }
+
+ private void get_colors() {
+ bg_color = base.get_bg_color_name();
+
+ if (!is_color_parsable(bg_color))
+ bg_color = DEFAULT_BG_COLOR;
+
+ set_text_colors(parse_color(bg_color));
+ }
+
+ public Gdk.RGBA get_bg_color() {
+ if (is_string_empty(bg_color))
+ get_colors();
+
+ return parse_color(bg_color);
+ }
+
+ public Gdk.RGBA get_selected_color(bool in_focus = true) {
+ if (in_focus) {
+ if (is_string_empty(selected_color))
+ get_colors();
+
+ return parse_color(selected_color);
+ } else {
+ if (is_string_empty(unfocused_selected_color))
+ get_colors();
+
+ return parse_color(unfocused_selected_color);
+ }
+ }
+
+ public Gdk.RGBA get_unselected_color() {
+ if (is_string_empty(unselected_color))
+ get_colors();
+
+ return parse_color(unselected_color);
+ }
+
+ public Gdk.RGBA get_border_color() {
+ if (is_string_empty(border_color))
+ get_colors();
+
+ return parse_color(border_color);
+ }
+
+ public void set_bg_color(Gdk.RGBA color) {
+ uint8 col_tmp = (uint8) (color.red * 255.0);
+
+ bg_color = "#%02X%02X%02X".printf(col_tmp, col_tmp, col_tmp);
+ set_bg_color_name(bg_color);
+
+ set_text_colors(color);
+ }
+
+ public void commit_bg_color() {
+ base.set_bg_color_name(bg_color);
+ }
+}
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/config/ConfigurationInterfaces.vala b/src/config/ConfigurationInterfaces.vala
new file mode 100644
index 0000000..97f41cc
--- /dev/null
+++ b/src/config/ConfigurationInterfaces.vala
@@ -0,0 +1,1609 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public errordomain ConfigurationError {
+ PROPERTY_HAS_NO_VALUE,
+ /**
+ * the underlying configuration engine reported an error; the error is
+ * specific to the configuration engine in use (e.g., GSettings)
+ * and is usually meaningless to client code */
+ ENGINE_ERROR,
+}
+
+public enum FuzzyPropertyState {
+ ENABLED,
+ DISABLED,
+ UNKNOWN
+}
+
+public enum ConfigurableProperty {
+ AUTO_IMPORT_FROM_LIBRARY = 0,
+ BG_COLOR_NAME,
+ COMMIT_METADATA_TO_MASTERS,
+ DESKTOP_BACKGROUND_FILE,
+ DESKTOP_BACKGROUND_MODE,
+ DIRECTORY_PATTERN,
+ DIRECTORY_PATTERN_CUSTOM,
+ DIRECT_WINDOW_HEIGHT,
+ DIRECT_WINDOW_MAXIMIZE,
+ DIRECT_WINDOW_WIDTH,
+ DISPLAY_BASIC_PROPERTIES,
+ DISPLAY_EVENT_COMMENTS,
+ DISPLAY_EXTENDED_PROPERTIES,
+ DISPLAY_SIDEBAR,
+ DISPLAY_SEARCH_BAR,
+ DISPLAY_PHOTO_RATINGS,
+ DISPLAY_PHOTO_TAGS,
+ DISPLAY_PHOTO_TITLES,
+ DISPLAY_PHOTO_COMMENTS,
+ EVENT_PHOTOS_SORT_ASCENDING,
+ EVENT_PHOTOS_SORT_BY,
+ EVENTS_SORT_ASCENDING,
+ EXTERNAL_PHOTO_APP,
+ EXTERNAL_RAW_APP,
+ HIDE_PHOTOS_ALREADY_IMPORTED,
+ IMPORT_DIR,
+ KEEP_RELATIVITY,
+ LAST_CROP_HEIGHT,
+ LAST_CROP_MENU_CHOICE,
+ LAST_CROP_WIDTH,
+ LAST_USED_SERVICE,
+ LAST_USED_DATAIMPORTS_SERVICE,
+ LIBRARY_PHOTOS_SORT_ASCENDING,
+ LIBRARY_PHOTOS_SORT_BY,
+ LIBRARY_WINDOW_HEIGHT,
+ LIBRARY_WINDOW_MAXIMIZE,
+ LIBRARY_WINDOW_WIDTH,
+ MODIFY_ORIGINALS,
+ PHOTO_THUMBNAIL_SCALE,
+ PIN_TOOLBAR_STATE,
+ PRINTING_CONTENT_HEIGHT,
+ PRINTING_CONTENT_LAYOUT,
+ PRINTING_CONTENT_PPI,
+ PRINTING_CONTENT_UNITS,
+ PRINTING_CONTENT_WIDTH,
+ PRINTING_IMAGES_PER_PAGE,
+ PRINTING_MATCH_ASPECT_RATIO,
+ PRINTING_PRINT_TITLES,
+ PRINTING_SIZE_SELECTION,
+ PRINTING_TITLES_FONT,
+ RAW_DEVELOPER_DEFAULT,
+ SHOW_WELCOME_DIALOG,
+ SIDEBAR_POSITION,
+ SLIDESHOW_DELAY,
+ SLIDESHOW_TRANSITION_DELAY,
+ SLIDESHOW_TRANSITION_EFFECT_ID,
+ SLIDESHOW_SHOW_TITLE,
+ USE_24_HOUR_TIME,
+ USE_LOWERCASE_FILENAMES,
+ VIDEO_INTERPRETER_STATE_COOKIE,
+
+
+ NUM_PROPERTIES;
+
+ public string to_string() {
+ switch (this) {
+ case AUTO_IMPORT_FROM_LIBRARY:
+ return "AUTO_IMPORT_FROM_LIBRARY";
+
+ case BG_COLOR_NAME:
+ return "BG_COLOR_NAME";
+
+ case COMMIT_METADATA_TO_MASTERS:
+ return "COMMIT_METADATA_TO_MASTERS";
+
+ case DESKTOP_BACKGROUND_FILE:
+ return "DESKTOP_BACKGROUND_FILE";
+
+ case DESKTOP_BACKGROUND_MODE:
+ return "DESKTOP_BACKGROUND_MODE";
+
+ case DIRECTORY_PATTERN:
+ return "DIRECTORY_PATTERN";
+
+ case DIRECTORY_PATTERN_CUSTOM:
+ return "DIRECTORY_PATTERN_CUSTOM";
+
+ case DIRECT_WINDOW_HEIGHT:
+ return "DIRECT_WINDOW_HEIGHT";
+
+ case DIRECT_WINDOW_MAXIMIZE:
+ return "DIRECT_WINDOW_MAXIMIZE";
+
+ case DIRECT_WINDOW_WIDTH:
+ return "DIRECT_WINDOW_WIDTH";
+
+ case DISPLAY_BASIC_PROPERTIES:
+ return "DISPLAY_BASIC_PROPERTIES";
+
+ case DISPLAY_EXTENDED_PROPERTIES:
+ return "DISPLAY_EXTENDED_PROPERTIES";
+
+ case DISPLAY_SIDEBAR:
+ return "DISPLAY_SIDEBAR";
+
+ case DISPLAY_SEARCH_BAR:
+ return "DISPLAY_SEARCH_BAR";
+
+ case DISPLAY_PHOTO_RATINGS:
+ return "DISPLAY_PHOTO_RATINGS";
+
+ case DISPLAY_PHOTO_TAGS:
+ return "DISPLAY_PHOTO_TAGS";
+
+ case DISPLAY_PHOTO_TITLES:
+ return "DISPLAY_PHOTO_TITLES";
+
+ case DISPLAY_PHOTO_COMMENTS:
+ return "DISPLAY_PHOTO_COMMENTS";
+
+ case DISPLAY_EVENT_COMMENTS:
+ return "DISPLAY_EVENT_COMMENTS";
+
+ case EVENT_PHOTOS_SORT_ASCENDING:
+ return "EVENT_PHOTOS_SORT_ASCENDING";
+
+ case EVENT_PHOTOS_SORT_BY:
+ return "EVENT_PHOTOS_SORT_BY";
+
+ case EVENTS_SORT_ASCENDING:
+ return "EVENTS_SORT_ASCENDING";
+
+ case EXTERNAL_PHOTO_APP:
+ return "EXTERNAL_PHOTO_APP";
+
+ case EXTERNAL_RAW_APP:
+ return "EXTERNAL_RAW_APP";
+
+ case HIDE_PHOTOS_ALREADY_IMPORTED:
+ return "HIDE_PHOTOS_ALREADY_IMPORTED";
+
+ case IMPORT_DIR:
+ return "IMPORT_DIR";
+
+ case KEEP_RELATIVITY:
+ return "KEEP_RELATIVITY";
+
+ case LAST_CROP_HEIGHT:
+ return "LAST_CROP_HEIGHT";
+
+ case LAST_CROP_MENU_CHOICE:
+ return "LAST_CROP_MENU_CHOICE";
+
+ case LAST_CROP_WIDTH:
+ return "LAST_CROP_WIDTH";
+
+ case LAST_USED_SERVICE:
+ return "LAST_USED_SERVICE";
+
+ case LAST_USED_DATAIMPORTS_SERVICE:
+ return "LAST_USED_DATAIMPORTS_SERVICE";
+
+ case LIBRARY_PHOTOS_SORT_ASCENDING:
+ return "LIBRARY_PHOTOS_SORT_ASCENDING";
+
+ case LIBRARY_PHOTOS_SORT_BY:
+ return "LIBRARY_PHOTOS_SORT_BY";
+
+ case LIBRARY_WINDOW_HEIGHT:
+ return "LIBRARY_WINDOW_HEIGHT";
+
+ case LIBRARY_WINDOW_MAXIMIZE:
+ return "LIBRARY_WINDOW_MAXIMIZE";
+
+ case LIBRARY_WINDOW_WIDTH:
+ return "LIBRARY_WINDOW_WIDTH";
+
+ case MODIFY_ORIGINALS:
+ return "MODIFY_ORIGINALS";
+
+ case PHOTO_THUMBNAIL_SCALE:
+ return "PHOTO_THUMBNAIL_SCALE";
+
+ case PIN_TOOLBAR_STATE:
+ return "PIN_TOOLBAR_STATE";
+
+ case PRINTING_CONTENT_HEIGHT:
+ return "PRINTING_CONTENT_HEIGHT";
+
+ case PRINTING_CONTENT_LAYOUT:
+ return "PRINTING_CONTENT_LAYOUT";
+
+ case PRINTING_CONTENT_PPI:
+ return "PRINTING_CONTENT_PPI";
+
+ case PRINTING_CONTENT_UNITS:
+ return "PRINTING_CONTENT_UNITS";
+
+ case PRINTING_CONTENT_WIDTH:
+ return "PRINTING_CONTENT_WIDTH";
+
+ case PRINTING_IMAGES_PER_PAGE:
+ return "PRINTING_IMAGES_PER_PAGE";
+
+ case PRINTING_MATCH_ASPECT_RATIO:
+ return "PRINTING_MATCH_ASPECT_RATIO";
+
+ case PRINTING_PRINT_TITLES:
+ return "PRINTING_PRINT_TITLES";
+
+ case PRINTING_SIZE_SELECTION:
+ return "PRINTING_SIZE_SELECTION";
+
+ case PRINTING_TITLES_FONT:
+ return "PRINTING_TITLES_FONT";
+
+ case RAW_DEVELOPER_DEFAULT:
+ return "RAW_DEVELOPER_DEFAULT";
+
+ case SHOW_WELCOME_DIALOG:
+ return "SHOW_WELCOME_DIALOG";
+
+ case SIDEBAR_POSITION:
+ return "SIDEBAR_POSITION";
+
+ case SLIDESHOW_DELAY:
+ return "SLIDESHOW_DELAY";
+
+ case SLIDESHOW_TRANSITION_DELAY:
+ return "SLIDESHOW_TRANSITION_DELAY";
+
+ case SLIDESHOW_TRANSITION_EFFECT_ID:
+ return "SLIDESHOW_TRANSITION_EFFECT_ID";
+
+ case SLIDESHOW_SHOW_TITLE:
+ return "SLIDESHOW_SHOW_TITLE";
+
+ case USE_24_HOUR_TIME:
+ return "USE_24_HOUR_TIME";
+
+ case USE_LOWERCASE_FILENAMES:
+ return "USE_LOWERCASE_FILENAMES";
+
+ case VIDEO_INTERPRETER_STATE_COOKIE:
+ return "VIDEO_INTERPRETER_STATE_COOKIE";
+
+ default:
+ error("unknown ConfigurableProperty enumeration value");
+ }
+ }
+}
+
+public interface ConfigurationEngine : GLib.Object {
+ public signal void property_changed(ConfigurableProperty p);
+
+ public abstract string get_name();
+
+ public abstract int get_int_property(ConfigurableProperty p) throws ConfigurationError;
+ public abstract void set_int_property(ConfigurableProperty p, int val) throws ConfigurationError;
+
+ public abstract string get_string_property(ConfigurableProperty p) throws ConfigurationError;
+ public abstract void set_string_property(ConfigurableProperty p, string val) throws ConfigurationError;
+
+ public abstract bool get_bool_property(ConfigurableProperty p) throws ConfigurationError;
+ public abstract void set_bool_property(ConfigurableProperty p, bool val) throws ConfigurationError;
+
+ public abstract double get_double_property(ConfigurableProperty p) throws ConfigurationError;
+ public abstract void set_double_property(ConfigurableProperty p, double val) throws ConfigurationError;
+
+ public abstract bool get_plugin_bool(string domain, string id, string key, bool def);
+ public abstract void set_plugin_bool(string domain, string id, string key, bool val);
+ public abstract double get_plugin_double(string domain, string id, string key, double def);
+ public abstract void set_plugin_double(string domain, string id, string key, double val);
+ public abstract int get_plugin_int(string domain, string id, string key, int def);
+ public abstract void set_plugin_int(string domain, string id, string key, int val);
+ public abstract string? get_plugin_string(string domain, string id, string key, string? def);
+ public abstract void set_plugin_string(string domain, string id, string key, string? val);
+ public abstract void unset_plugin_key(string domain, string id, string key);
+
+ public abstract FuzzyPropertyState is_plugin_enabled(string id);
+ public abstract void set_plugin_enabled(string id, bool enabled);
+}
+
+public abstract class ConfigurationFacade : Object {
+ private ConfigurationEngine engine;
+
+ public signal void auto_import_from_library_changed();
+ public signal void bg_color_name_changed();
+ public signal void commit_metadata_to_masters_changed();
+ public signal void events_sort_ascending_changed();
+ public signal void external_app_changed();
+ public signal void import_directory_changed();
+
+ protected ConfigurationFacade(ConfigurationEngine engine) {
+ this.engine = engine;
+
+ engine.property_changed.connect(on_property_changed);
+ }
+
+ private void on_property_changed(ConfigurableProperty p) {
+ debug ("ConfigurationFacade: engine reports property '%s' changed.", p.to_string());
+
+ switch (p) {
+ case ConfigurableProperty.AUTO_IMPORT_FROM_LIBRARY:
+ auto_import_from_library_changed();
+ break;
+
+ case ConfigurableProperty.BG_COLOR_NAME:
+ bg_color_name_changed();
+ break;
+
+ case ConfigurableProperty.COMMIT_METADATA_TO_MASTERS:
+ commit_metadata_to_masters_changed();
+ break;
+
+ case ConfigurableProperty.EVENTS_SORT_ASCENDING:
+ events_sort_ascending_changed();
+ break;
+
+ case ConfigurableProperty.EXTERNAL_PHOTO_APP:
+ case ConfigurableProperty.EXTERNAL_RAW_APP:
+ external_app_changed();
+ break;
+
+ case ConfigurableProperty.IMPORT_DIR:
+ import_directory_changed();
+ break;
+ }
+ }
+
+ protected ConfigurationEngine get_engine() {
+ return engine;
+ }
+
+ protected void on_configuration_error(ConfigurationError err) {
+ if (err is ConfigurationError.PROPERTY_HAS_NO_VALUE) {
+ message("configuration engine '%s' reports PROPERTY_HAS_NO_VALUE error: %s",
+ engine.get_name(), err.message);
+ }
+ else if (err is ConfigurationError.ENGINE_ERROR) {
+ critical("configuration engine '%s' reports ENGINE_ERROR: %s",
+ engine.get_name(), err.message);
+ } else {
+ critical("configuration engine '%s' reports unknown error: %s",
+ engine.get_name(), err.message);
+ }
+ }
+
+ //
+ // auto import from library
+ //
+ public virtual bool get_auto_import_from_library() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.AUTO_IMPORT_FROM_LIBRARY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_auto_import_from_library(bool auto_import) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.AUTO_IMPORT_FROM_LIBRARY,
+ auto_import);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // bg color name
+ //
+ public virtual string get_bg_color_name() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.BG_COLOR_NAME);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_bg_color_name(string color_name) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.BG_COLOR_NAME, color_name);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // commit metadata to masters
+ //
+ public virtual bool get_commit_metadata_to_masters() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.COMMIT_METADATA_TO_MASTERS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_commit_metadata_to_masters(bool commit_metadata) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.COMMIT_METADATA_TO_MASTERS,
+ commit_metadata);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // desktop background
+ //
+ public virtual string get_desktop_background() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.DESKTOP_BACKGROUND_FILE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_desktop_background(string filename) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.DESKTOP_BACKGROUND_FILE,
+ filename);
+ get_engine().set_string_property(ConfigurableProperty.DESKTOP_BACKGROUND_MODE,
+ "zoom");
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // directory pattern
+ //
+ public virtual string? get_directory_pattern() {
+ try {
+ string s = get_engine().get_string_property(ConfigurableProperty.DIRECTORY_PATTERN);
+ return (s == "") ? null : s;
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_directory_pattern(string? s) {
+ try {
+ if (s == null)
+ s = "";
+
+ get_engine().set_string_property(ConfigurableProperty.DIRECTORY_PATTERN, s);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // directory pattern custom
+ //
+ public virtual string get_directory_pattern_custom() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.DIRECTORY_PATTERN_CUSTOM);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_directory_pattern_custom(string s) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.DIRECTORY_PATTERN_CUSTOM, s);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // direct window state
+ //
+ public virtual void get_direct_window_state(out bool maximize, out Dimensions dimensions) {
+ maximize = false;
+ dimensions = Dimensions(1024, 768);
+ try {
+ maximize = get_engine().get_bool_property(ConfigurableProperty.DIRECT_WINDOW_MAXIMIZE);
+ int w = get_engine().get_int_property(ConfigurableProperty.DIRECT_WINDOW_WIDTH);
+ int h = get_engine().get_int_property(ConfigurableProperty.DIRECT_WINDOW_HEIGHT);
+ dimensions = Dimensions(w, h);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ public virtual void set_direct_window_state(bool maximize, Dimensions dimensions) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DIRECT_WINDOW_MAXIMIZE, maximize);
+ get_engine().set_int_property(ConfigurableProperty.DIRECT_WINDOW_WIDTH,
+ dimensions.width);
+ get_engine().set_int_property(ConfigurableProperty.DIRECT_WINDOW_HEIGHT,
+ dimensions.height);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display basic properties
+ //
+ public virtual bool get_display_basic_properties() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_BASIC_PROPERTIES);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_display_basic_properties(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_BASIC_PROPERTIES, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display extended properties
+ //
+ public virtual bool get_display_extended_properties() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_EXTENDED_PROPERTIES);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_extended_properties(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_EXTENDED_PROPERTIES,
+ display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display sidebar
+ //
+ public virtual bool get_display_sidebar() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_SIDEBAR);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_sidebar(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_SIDEBAR, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display search & filter toolbar
+ //
+ public virtual bool get_display_search_bar() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_SEARCH_BAR);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_search_bar(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_SEARCH_BAR, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display photo ratings
+ //
+ public virtual bool get_display_photo_ratings() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_PHOTO_RATINGS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_display_photo_ratings(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_PHOTO_RATINGS, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display photo tags
+ //
+ public virtual bool get_display_photo_tags() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_PHOTO_TAGS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_display_photo_tags(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_PHOTO_TAGS, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display photo titles
+ //
+ public virtual bool get_display_photo_titles() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_PHOTO_TITLES);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_photo_titles(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_PHOTO_TITLES, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display photo comments
+ //
+ public virtual bool get_display_photo_comments() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_PHOTO_COMMENTS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_photo_comments(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_PHOTO_COMMENTS, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // display event comments
+ //
+ public virtual bool get_display_event_comments() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.DISPLAY_EVENT_COMMENTS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_display_event_comments(bool display) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.DISPLAY_EVENT_COMMENTS, display);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // event photos sort
+ //
+ public virtual void get_event_photos_sort(out bool sort_order, out int sort_by) {
+ sort_order = false;
+ sort_by = 2;
+ try {
+ sort_order = get_engine().get_bool_property(
+ ConfigurableProperty.EVENT_PHOTOS_SORT_ASCENDING);
+ sort_by = get_engine().get_int_property(ConfigurableProperty.EVENT_PHOTOS_SORT_BY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ public virtual void set_event_photos_sort(bool sort_order, int sort_by) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.EVENT_PHOTOS_SORT_ASCENDING,
+ sort_order);
+ get_engine().set_int_property(ConfigurableProperty.EVENT_PHOTOS_SORT_BY,
+ sort_by);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // events sort ascending
+ //
+ public virtual bool get_events_sort_ascending() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.EVENTS_SORT_ASCENDING);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_events_sort_ascending(bool sort) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.EVENTS_SORT_ASCENDING, sort);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // external photo app
+ //
+ public virtual string get_external_photo_app() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.EXTERNAL_PHOTO_APP);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_external_photo_app(string external_photo_app) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.EXTERNAL_PHOTO_APP,
+ external_photo_app);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // external raw app
+ //
+ public virtual string get_external_raw_app() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.EXTERNAL_RAW_APP);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_external_raw_app(string external_raw_app) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.EXTERNAL_RAW_APP,
+ external_raw_app);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // Default RAW developer.
+ //
+ public virtual RawDeveloper get_default_raw_developer() {
+ try {
+ return RawDeveloper.from_string(get_engine().get_string_property(
+ ConfigurableProperty.RAW_DEVELOPER_DEFAULT));
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return RawDeveloper.CAMERA;
+ }
+ }
+
+ public virtual void set_default_raw_developer(RawDeveloper d) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.RAW_DEVELOPER_DEFAULT,
+ d.to_string());
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return;
+ }
+ }
+
+ //
+ // hide photos already imported
+ //
+ public virtual bool get_hide_photos_already_imported() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.HIDE_PHOTOS_ALREADY_IMPORTED);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_hide_photos_already_imported(bool hide_imported) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.HIDE_PHOTOS_ALREADY_IMPORTED, hide_imported);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // import dir
+ //
+ public virtual string get_import_dir() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.IMPORT_DIR);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return "";
+ }
+ }
+
+ public virtual void set_import_dir(string import_dir) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.IMPORT_DIR, import_dir);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // keep relativity
+ //
+ public virtual bool get_keep_relativity() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.KEEP_RELATIVITY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_keep_relativity(bool keep_relativity) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.KEEP_RELATIVITY, keep_relativity);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // pin toolbar state
+ //
+ public virtual bool get_pin_toolbar_state() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.PIN_TOOLBAR_STATE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return false;
+ }
+ }
+
+ public virtual void set_pin_toolbar_state(bool state) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.PIN_TOOLBAR_STATE, state);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // last crop height
+ //
+ public virtual int get_last_crop_height() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.LAST_CROP_HEIGHT);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return 1;
+ }
+ }
+
+ public virtual void set_last_crop_height(int choice) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.LAST_CROP_HEIGHT, choice);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // last crop menu choice
+ //
+ public virtual int get_last_crop_menu_choice() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.LAST_CROP_MENU_CHOICE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ // in the event we can't get a reasonable value from the configuration engine, we
+ // return the empty string since it won't match the name of any existing publishing
+ // service -- this will cause the publishing subsystem to select the first service
+ // loaded that supports the user's media type
+ return 0;
+ }
+ }
+
+ public virtual void set_last_crop_menu_choice(int choice) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.LAST_CROP_MENU_CHOICE, choice);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // last crop width
+ //
+ public virtual int get_last_crop_width() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.LAST_CROP_WIDTH);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return 1;
+ }
+ }
+
+ public virtual void set_last_crop_width(int choice) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.LAST_CROP_WIDTH, choice);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // last used service
+ //
+ public virtual string get_last_used_service() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.LAST_USED_SERVICE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ // in the event we can't get a reasonable value from the configuration engine, we
+ // return the empty string since it won't match the name of any existing publishing
+ // service -- this will cause the publishing subsystem to select the first service
+ // loaded that supports the user's media type
+ return "";
+ }
+ }
+
+ public virtual void set_last_used_service(string service_name) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.LAST_USED_SERVICE, service_name);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // last used import service
+ //
+ public virtual string get_last_used_dataimports_service() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.LAST_USED_DATAIMPORTS_SERVICE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ // in the event we can't get a reasonable value from the configuration engine, we
+ // return the empty string since it won't match the name of any existing import
+ // service -- this will cause the import subsystem to select the first service
+ // loaded
+ return "";
+ }
+ }
+
+ public virtual void set_last_used_dataimports_service(string service_name) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.LAST_USED_DATAIMPORTS_SERVICE, service_name);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // library photos sort
+ //
+ public virtual void get_library_photos_sort(out bool sort_order, out int sort_by) {
+ sort_order = false;
+ sort_by = 2;
+ try {
+ sort_order = get_engine().get_bool_property(
+ ConfigurableProperty.LIBRARY_PHOTOS_SORT_ASCENDING);
+ sort_by = get_engine().get_int_property(ConfigurableProperty.LIBRARY_PHOTOS_SORT_BY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ public virtual void set_library_photos_sort(bool sort_order, int sort_by) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.LIBRARY_PHOTOS_SORT_ASCENDING,
+ sort_order);
+ get_engine().set_int_property(ConfigurableProperty.LIBRARY_PHOTOS_SORT_BY,
+ sort_by);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // library window state
+ //
+ public virtual void get_library_window_state(out bool maximize, out Dimensions dimensions) {
+ maximize = false;
+ dimensions = Dimensions(1024, 768);
+ try {
+ maximize = get_engine().get_bool_property(ConfigurableProperty.LIBRARY_WINDOW_MAXIMIZE);
+ int w = get_engine().get_int_property(ConfigurableProperty.LIBRARY_WINDOW_WIDTH);
+ int h = get_engine().get_int_property(ConfigurableProperty.LIBRARY_WINDOW_HEIGHT);
+ dimensions = Dimensions(w, h);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ public virtual void set_library_window_state(bool maximize, Dimensions dimensions) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.LIBRARY_WINDOW_MAXIMIZE, maximize);
+ get_engine().set_int_property(ConfigurableProperty.LIBRARY_WINDOW_WIDTH,
+ dimensions.width);
+ get_engine().set_int_property(ConfigurableProperty.LIBRARY_WINDOW_HEIGHT,
+ dimensions.height);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // modify originals
+ //
+ public virtual bool get_modify_originals() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.MODIFY_ORIGINALS);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ // if we can't get a reasonable value from the configuration engine, don't modify
+ // originals
+ return false;
+ }
+ }
+
+ public virtual void set_modify_originals(bool modify_originals) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.MODIFY_ORIGINALS, modify_originals);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // photo thumbnail scale
+ //
+ public virtual int get_photo_thumbnail_scale() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PHOTO_THUMBNAIL_SCALE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ return Thumbnail.DEFAULT_SCALE;
+ }
+ }
+
+ public virtual void set_photo_thumbnail_scale(int scale) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PHOTO_THUMBNAIL_SCALE, scale);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing content height
+ //
+ public virtual double get_printing_content_height() {
+ try {
+ return get_engine().get_double_property(ConfigurableProperty.PRINTING_CONTENT_HEIGHT);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 5.0;
+ }
+ }
+
+ public virtual void set_printing_content_height(double content_height) {
+ try {
+ get_engine().set_double_property(ConfigurableProperty.PRINTING_CONTENT_HEIGHT,
+ content_height);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing content layout
+ //
+ public virtual int get_printing_content_layout() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PRINTING_CONTENT_LAYOUT) - 1;
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 0;
+ }
+ }
+
+ public virtual void set_printing_content_layout(int layout_code) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PRINTING_CONTENT_LAYOUT,
+ layout_code + 1);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing content ppi
+ //
+ public virtual int get_printing_content_ppi() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PRINTING_CONTENT_PPI);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 600;
+ }
+ }
+
+ public virtual void set_printing_content_ppi(int content_ppi) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PRINTING_CONTENT_PPI, content_ppi);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing content units
+ //
+ public virtual int get_printing_content_units() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PRINTING_CONTENT_UNITS) - 1;
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 0;
+ }
+ }
+
+ public virtual void set_printing_content_units(int units_code) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PRINTING_CONTENT_UNITS,
+ units_code + 1);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing content width
+ //
+ public virtual double get_printing_content_width() {
+ try {
+ return get_engine().get_double_property(ConfigurableProperty.PRINTING_CONTENT_WIDTH);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 7.0;
+ }
+ }
+
+ public virtual void set_printing_content_width(double content_width) {
+ try {
+ get_engine().set_double_property(ConfigurableProperty.PRINTING_CONTENT_WIDTH,
+ content_width);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing images per page
+ //
+ public virtual int get_printing_images_per_page() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PRINTING_IMAGES_PER_PAGE) - 1;
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 0;
+ }
+ }
+
+ public virtual void set_printing_images_per_page(int images_per_page_code) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PRINTING_IMAGES_PER_PAGE,
+ images_per_page_code + 1);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing match aspect ratio
+ //
+ public virtual bool get_printing_match_aspect_ratio() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.PRINTING_MATCH_ASPECT_RATIO);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_printing_match_aspect_ratio(bool match_aspect_ratio) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.PRINTING_MATCH_ASPECT_RATIO,
+ match_aspect_ratio);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing print titles
+ //
+ public virtual bool get_printing_print_titles() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.PRINTING_PRINT_TITLES);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_printing_print_titles(bool print_titles) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.PRINTING_PRINT_TITLES,
+ print_titles);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing size selection
+ //
+ public virtual int get_printing_size_selection() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.PRINTING_SIZE_SELECTION) - 1;
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 0;
+ }
+ }
+
+ public virtual void set_printing_size_selection(int size_code) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.PRINTING_SIZE_SELECTION,
+ size_code + 1);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // printing titles font
+ //
+ public virtual string get_printing_titles_font() {
+ try {
+ return get_engine().get_string_property(ConfigurableProperty.PRINTING_TITLES_FONT);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ // in the event we can't get a reasonable value from the configuration engine, just
+ // use the system default Sans Serif font
+ return "Sans Bold 12";
+ }
+ }
+
+ public virtual void set_printing_titles_font(string font_name) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.PRINTING_TITLES_FONT, font_name);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // show welcome dialog
+ //
+ public virtual bool get_show_welcome_dialog() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.SHOW_WELCOME_DIALOG);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return true;
+ }
+ }
+
+ public virtual void set_show_welcome_dialog(bool show) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.SHOW_WELCOME_DIALOG,
+ show);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // sidebar position
+ //
+ public virtual int get_sidebar_position() {
+ try {
+ return get_engine().get_int_property(ConfigurableProperty.SIDEBAR_POSITION);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 180;
+ }
+ }
+
+ public virtual void set_sidebar_position(int position) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.SIDEBAR_POSITION, position);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // slideshow delay
+ //
+ public virtual double get_slideshow_delay() {
+ try {
+ return get_engine().get_double_property(ConfigurableProperty.SLIDESHOW_DELAY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 3.0;
+ }
+ }
+
+ public virtual void set_slideshow_delay(double delay) {
+ try {
+ get_engine().set_double_property(ConfigurableProperty.SLIDESHOW_DELAY, delay);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // slideshow transition delay
+ //
+ public virtual double get_slideshow_transition_delay() {
+ try {
+ return get_engine().get_double_property(
+ ConfigurableProperty.SLIDESHOW_TRANSITION_DELAY);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return 0.3;
+ }
+ }
+
+ public virtual void set_slideshow_transition_delay(double delay) {
+ try {
+ get_engine().set_double_property(ConfigurableProperty.SLIDESHOW_TRANSITION_DELAY,
+ delay);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // slideshow transition effect id
+ //
+ public virtual string get_slideshow_transition_effect_id() {
+ try {
+ return get_engine().get_string_property(
+ ConfigurableProperty.SLIDESHOW_TRANSITION_EFFECT_ID);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ // in the event we can't get a reasonable value from the configuration engine, use
+ // the null transition effect
+ return TransitionEffectsManager.NULL_EFFECT_ID;
+ }
+ }
+
+ public virtual void set_slideshow_transition_effect_id(string id) {
+ try {
+ get_engine().set_string_property(ConfigurableProperty.SLIDESHOW_TRANSITION_EFFECT_ID,
+ id);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // Slideshow show title
+ //
+ public virtual bool get_slideshow_show_title() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.SLIDESHOW_SHOW_TITLE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_slideshow_show_title(bool show_title) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.SLIDESHOW_SHOW_TITLE, show_title);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // use 24 hour time
+ //
+ public virtual bool get_use_24_hour_time() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.USE_24_HOUR_TIME);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ // if we can't get a reasonable value from the configuration system, then use the
+ // operating system default for the user's country and region.
+ return is_string_empty(Time.local(0).format("%p"));
+ }
+ }
+
+ public virtual void set_use_24_hour_time(bool use_24_hour_time) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.USE_24_HOUR_TIME, use_24_hour_time);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // use lowercase filenames
+ //
+ public virtual bool get_use_lowercase_filenames() {
+ try {
+ return get_engine().get_bool_property(ConfigurableProperty.USE_LOWERCASE_FILENAMES);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return false;
+ }
+ }
+
+ public virtual void set_use_lowercase_filenames(bool b) {
+ try {
+ get_engine().set_bool_property(ConfigurableProperty.USE_LOWERCASE_FILENAMES, b);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // video interpreter state cookie
+ //
+ public virtual int get_video_interpreter_state_cookie() {
+ try {
+ return get_engine().get_int_property(
+ ConfigurableProperty.VIDEO_INTERPRETER_STATE_COOKIE);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+
+ return -1;
+ }
+ }
+
+ public virtual void set_video_interpreter_state_cookie(int state_cookie) {
+ try {
+ get_engine().set_int_property(ConfigurableProperty.VIDEO_INTERPRETER_STATE_COOKIE,
+ state_cookie);
+ } catch (ConfigurationError err) {
+ on_configuration_error(err);
+ }
+ }
+
+ //
+ // allow plugins to get & set arbitrary properties
+ //
+ public virtual bool get_plugin_bool(string domain, string id, string key, bool def) {
+ return get_engine().get_plugin_bool(domain, id, key, def);
+ }
+
+ public virtual void set_plugin_bool(string domain, string id, string key, bool val) {
+ get_engine().set_plugin_bool(domain, id, key, val);
+ }
+
+ public virtual double get_plugin_double(string domain, string id, string key, double def) {
+ return get_engine().get_plugin_double(domain, id, key, def);
+ }
+
+ public virtual void set_plugin_double(string domain, string id, string key, double val) {
+ get_engine().set_plugin_double(domain, id, key, val);
+ }
+
+ public virtual int get_plugin_int(string domain, string id, string key, int def) {
+ return get_engine().get_plugin_int(domain, id, key, def);
+ }
+
+ public virtual void set_plugin_int(string domain, string id, string key, int val) {
+ get_engine().set_plugin_int(domain, id, key, val);
+ }
+
+ public virtual string? get_plugin_string(string domain, string id, string key, string? def) {
+ string? result = get_engine().get_plugin_string(domain, id, key, def);
+ return (result == "") ? null : result;
+ }
+
+ public virtual void set_plugin_string(string domain, string id, string key, string? val) {
+ if (val == null)
+ val = "";
+
+ get_engine().set_plugin_string(domain, id, key, val);
+ }
+
+ public virtual void unset_plugin_key(string domain, string id, string key) {
+ get_engine().unset_plugin_key(domain, id, key);
+ }
+
+ //
+ // enable & disable plugins
+ //
+ public virtual FuzzyPropertyState is_plugin_enabled(string id) {
+ return get_engine().is_plugin_enabled(id);
+ }
+
+ public virtual void set_plugin_enabled(string id, bool enabled) {
+ get_engine().set_plugin_enabled(id, enabled);
+ }
+}
diff --git a/src/config/GSettingsEngine.vala b/src/config/GSettingsEngine.vala
new file mode 100644
index 0000000..3a55648
--- /dev/null
+++ b/src/config/GSettingsEngine.vala
@@ -0,0 +1,469 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class GSettingsConfigurationEngine : ConfigurationEngine, GLib.Object {
+ private const string ROOT_SCHEMA_NAME = "org.yorba.shotwell";
+ private const string PREFS_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".preferences";
+ private const string UI_PREFS_SCHEMA_NAME = PREFS_SCHEMA_NAME + ".ui";
+ private const string SLIDESHOW_PREFS_SCHEMA_NAME = PREFS_SCHEMA_NAME + ".slideshow";
+ private const string WINDOW_PREFS_SCHEMA_NAME = PREFS_SCHEMA_NAME + ".window";
+ private const string FILES_PREFS_SCHEMA_NAME = PREFS_SCHEMA_NAME + ".files";
+ private const string EDITING_PREFS_SCHEMA_NAME = PREFS_SCHEMA_NAME + ".editing";
+ private const string VIDEO_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".video";
+ private const string PRINTING_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".printing";
+ private const string SHARING_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".sharing";
+ private const string IMPORTING_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".dataimports";
+ private const string CROP_SCHEMA_NAME = ROOT_SCHEMA_NAME + ".crop-settings";
+ private const string SYSTEM_DESKTOP_SCHEMA_NAME = "org.gnome.desktop.background";
+ private const string PLUGINS_ENABLE_DISABLE_SCHEMA_NAME = ROOT_SCHEMA_NAME +
+ ".plugins.enable-state";
+
+ private Gee.Set<string> known_schemas;
+ private string[] schema_names;
+ private string[] key_names;
+
+ public GSettingsConfigurationEngine() {
+ known_schemas = new Gee.HashSet<string>();
+
+ foreach (string current_schema in Settings.list_schemas())
+ known_schemas.add(current_schema);
+
+ schema_names = new string[ConfigurableProperty.NUM_PROPERTIES];
+
+ schema_names[ConfigurableProperty.AUTO_IMPORT_FROM_LIBRARY] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.BG_COLOR_NAME] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.COMMIT_METADATA_TO_MASTERS] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DESKTOP_BACKGROUND_FILE] = SYSTEM_DESKTOP_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DESKTOP_BACKGROUND_MODE] = SYSTEM_DESKTOP_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DIRECTORY_PATTERN] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DIRECTORY_PATTERN_CUSTOM] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DIRECT_WINDOW_HEIGHT] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DIRECT_WINDOW_MAXIMIZE] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DIRECT_WINDOW_WIDTH] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_BASIC_PROPERTIES] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_EXTENDED_PROPERTIES] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_SIDEBAR] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_SEARCH_BAR] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_PHOTO_RATINGS] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_PHOTO_TAGS] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_PHOTO_TITLES] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_PHOTO_COMMENTS] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.DISPLAY_EVENT_COMMENTS] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.EVENT_PHOTOS_SORT_ASCENDING] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.EVENT_PHOTOS_SORT_BY] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.EVENTS_SORT_ASCENDING] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.EXTERNAL_PHOTO_APP] = EDITING_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.EXTERNAL_RAW_APP] = EDITING_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.HIDE_PHOTOS_ALREADY_IMPORTED] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.IMPORT_DIR] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.KEEP_RELATIVITY] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LAST_CROP_HEIGHT] = CROP_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LAST_CROP_MENU_CHOICE] = CROP_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LAST_CROP_WIDTH] = CROP_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LAST_USED_SERVICE] = SHARING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LAST_USED_DATAIMPORTS_SERVICE] = IMPORTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LIBRARY_PHOTOS_SORT_ASCENDING] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LIBRARY_PHOTOS_SORT_BY] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LIBRARY_WINDOW_HEIGHT] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LIBRARY_WINDOW_MAXIMIZE] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.LIBRARY_WINDOW_WIDTH] = WINDOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.MODIFY_ORIGINALS] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PHOTO_THUMBNAIL_SCALE] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PIN_TOOLBAR_STATE] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_CONTENT_HEIGHT] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_CONTENT_LAYOUT] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_CONTENT_PPI] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_CONTENT_UNITS] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_CONTENT_WIDTH] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_IMAGES_PER_PAGE] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_MATCH_ASPECT_RATIO] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_PRINT_TITLES] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_SIZE_SELECTION] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.PRINTING_TITLES_FONT] = PRINTING_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.RAW_DEVELOPER_DEFAULT] = FILES_PREFS_SCHEMA_NAME;;
+ schema_names[ConfigurableProperty.SHOW_WELCOME_DIALOG] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.SIDEBAR_POSITION] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.SLIDESHOW_DELAY] = SLIDESHOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.SLIDESHOW_TRANSITION_DELAY] = SLIDESHOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.SLIDESHOW_TRANSITION_EFFECT_ID] = SLIDESHOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.SLIDESHOW_SHOW_TITLE] = SLIDESHOW_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.USE_24_HOUR_TIME] = UI_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.USE_LOWERCASE_FILENAMES] = FILES_PREFS_SCHEMA_NAME;
+ schema_names[ConfigurableProperty.VIDEO_INTERPRETER_STATE_COOKIE] = VIDEO_SCHEMA_NAME;
+
+ key_names = new string[ConfigurableProperty.NUM_PROPERTIES];
+
+ key_names[ConfigurableProperty.AUTO_IMPORT_FROM_LIBRARY] = "auto-import";
+ key_names[ConfigurableProperty.BG_COLOR_NAME] = "background-color";
+ key_names[ConfigurableProperty.COMMIT_METADATA_TO_MASTERS] = "commit-metadata";
+ key_names[ConfigurableProperty.DESKTOP_BACKGROUND_FILE] = "picture-uri";
+ key_names[ConfigurableProperty.DESKTOP_BACKGROUND_MODE] = "picture-options";
+ key_names[ConfigurableProperty.DIRECTORY_PATTERN] = "directory-pattern";
+ key_names[ConfigurableProperty.DIRECTORY_PATTERN_CUSTOM] = "directory-pattern-custom";
+ key_names[ConfigurableProperty.DIRECT_WINDOW_HEIGHT] = "direct-height";
+ key_names[ConfigurableProperty.DIRECT_WINDOW_MAXIMIZE] = "direct-maximize";
+ key_names[ConfigurableProperty.DIRECT_WINDOW_WIDTH] = "direct-width";
+ key_names[ConfigurableProperty.DISPLAY_BASIC_PROPERTIES] = "display-basic-properties";
+ key_names[ConfigurableProperty.DISPLAY_EXTENDED_PROPERTIES] = "display-extended-properties";
+ key_names[ConfigurableProperty.DISPLAY_SIDEBAR] = "display-sidebar";
+ key_names[ConfigurableProperty.DISPLAY_SEARCH_BAR] = "display-search-bar";
+ key_names[ConfigurableProperty.DISPLAY_PHOTO_RATINGS] = "display-photo-ratings";
+ key_names[ConfigurableProperty.DISPLAY_PHOTO_TAGS] = "display-photo-tags";
+ key_names[ConfigurableProperty.DISPLAY_PHOTO_TITLES] = "display-photo-titles";
+ key_names[ConfigurableProperty.DISPLAY_PHOTO_COMMENTS] = "display-photo-comments";
+ key_names[ConfigurableProperty.DISPLAY_EVENT_COMMENTS] = "display-event-comments";
+ key_names[ConfigurableProperty.EVENT_PHOTOS_SORT_ASCENDING] = "event-photos-sort-ascending";
+ key_names[ConfigurableProperty.EVENT_PHOTOS_SORT_BY] = "event-photos-sort-by";
+ key_names[ConfigurableProperty.EVENTS_SORT_ASCENDING] = "events-sort-ascending";
+ key_names[ConfigurableProperty.EXTERNAL_PHOTO_APP] = "external-photo-editor";
+ key_names[ConfigurableProperty.EXTERNAL_RAW_APP] = "external-raw-editor";
+ key_names[ConfigurableProperty.HIDE_PHOTOS_ALREADY_IMPORTED] = "hide-photos-already-imported";
+ key_names[ConfigurableProperty.IMPORT_DIR] = "import-dir";
+ key_names[ConfigurableProperty.KEEP_RELATIVITY] = "keep-relativity";
+ key_names[ConfigurableProperty.LAST_CROP_HEIGHT] = "last-crop-height";
+ key_names[ConfigurableProperty.LAST_CROP_MENU_CHOICE] = "last-crop-menu-choice";
+ key_names[ConfigurableProperty.LAST_CROP_WIDTH] = "last-crop-width";
+ key_names[ConfigurableProperty.LAST_USED_SERVICE] = "last-used-service";
+ key_names[ConfigurableProperty.LAST_USED_DATAIMPORTS_SERVICE] = "last-used-dataimports-service";
+ key_names[ConfigurableProperty.LIBRARY_PHOTOS_SORT_ASCENDING] = "library-photos-sort-ascending";
+ key_names[ConfigurableProperty.LIBRARY_PHOTOS_SORT_BY] = "library-photos-sort-by";
+ key_names[ConfigurableProperty.LIBRARY_WINDOW_HEIGHT] = "library-height";
+ key_names[ConfigurableProperty.LIBRARY_WINDOW_MAXIMIZE] = "library-maximize";
+ key_names[ConfigurableProperty.LIBRARY_WINDOW_WIDTH] = "library-width";
+ key_names[ConfigurableProperty.MODIFY_ORIGINALS] = "modify-originals";
+ key_names[ConfigurableProperty.PHOTO_THUMBNAIL_SCALE] = "photo-thumbnail-scale";
+ key_names[ConfigurableProperty.PIN_TOOLBAR_STATE] = "pin-toolbar-state";
+ key_names[ConfigurableProperty.PRINTING_CONTENT_HEIGHT] = "content-height";
+ key_names[ConfigurableProperty.PRINTING_CONTENT_LAYOUT] = "content-layout";
+ key_names[ConfigurableProperty.PRINTING_CONTENT_PPI] = "content-ppi";
+ key_names[ConfigurableProperty.PRINTING_CONTENT_UNITS] = "content-units";
+ key_names[ConfigurableProperty.PRINTING_CONTENT_WIDTH] = "content-width";
+ key_names[ConfigurableProperty.PRINTING_IMAGES_PER_PAGE] = "images-per-page";
+ key_names[ConfigurableProperty.PRINTING_MATCH_ASPECT_RATIO] = "match-aspect-ratio";
+ key_names[ConfigurableProperty.PRINTING_PRINT_TITLES] = "print-titles";
+ key_names[ConfigurableProperty.PRINTING_SIZE_SELECTION] = "size-selection";
+ key_names[ConfigurableProperty.PRINTING_TITLES_FONT] = "titles-font";
+ key_names[ConfigurableProperty.RAW_DEVELOPER_DEFAULT] = "raw-developer-default";
+ key_names[ConfigurableProperty.SHOW_WELCOME_DIALOG] = "show-welcome-dialog";
+ key_names[ConfigurableProperty.SIDEBAR_POSITION] = "sidebar-position";
+ key_names[ConfigurableProperty.SLIDESHOW_DELAY] = "delay";
+ key_names[ConfigurableProperty.SLIDESHOW_TRANSITION_DELAY] = "transition-delay";
+ key_names[ConfigurableProperty.SLIDESHOW_TRANSITION_EFFECT_ID] = "transition-effect-id";
+ key_names[ConfigurableProperty.SLIDESHOW_SHOW_TITLE] = "show-title";
+ key_names[ConfigurableProperty.USE_24_HOUR_TIME] = "use-24-hour-time";
+ key_names[ConfigurableProperty.USE_LOWERCASE_FILENAMES] = "use-lowercase-filenames";
+ key_names[ConfigurableProperty.VIDEO_INTERPRETER_STATE_COOKIE] = "interpreter-state-cookie";
+ }
+
+ private bool schema_has_key(Settings schema_object, string key) {
+ foreach (string current_key in schema_object.list_keys()) {
+ if (current_key == key)
+ return true;
+ }
+
+ return false;
+ }
+
+ private void check_key_valid(string schema, string key) throws ConfigurationError {
+ if (!known_schemas.contains(schema))
+ throw new ConfigurationError.ENGINE_ERROR("schema '%s' is not installed".printf(schema));
+
+ Settings schema_object = new Settings(schema);
+
+ if (!schema_has_key(schema_object, key))
+ throw new ConfigurationError.ENGINE_ERROR("schema '%s' does not define key '%s'".printf(
+ schema, key));
+ }
+
+ private bool get_gs_bool(string schema, string key) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ return schema_object.get_boolean(key);
+ }
+
+ private void set_gs_bool(string schema, string key, bool value) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ schema_object.set_boolean(key, value);
+ }
+
+ private int get_gs_int(string schema, string key) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ return schema_object.get_int(key);
+ }
+
+ private void set_gs_int(string schema, string key, int value) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ schema_object.set_int(key, value);
+ }
+
+ private double get_gs_double(string schema, string key) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ return schema_object.get_double(key);
+ }
+
+ private void set_gs_double(string schema, string key, double value) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ schema_object.set_double(key, value);
+ }
+
+ private string get_gs_string(string schema, string key) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ return schema_object.get_string(key);
+ }
+
+ private void set_gs_string(string schema, string key, string value) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ schema_object.set_string(key, value);
+ }
+
+ private void reset_gs_to_default(string schema, string key) throws ConfigurationError {
+ check_key_valid(schema, key);
+
+ Settings schema_object = new Settings(schema);
+
+ schema_object.reset(key);
+ }
+
+ private static string? clean_plugin_id(string id) {
+ string cleaned = id.replace("/", "-");
+ cleaned = cleaned.strip();
+
+ return !is_string_empty(cleaned) ? cleaned : null;
+ }
+
+ private static string get_plugin_enable_disable_name(string id) {
+ string? cleaned_id = clean_plugin_id(id);
+ if (cleaned_id == null)
+ cleaned_id = "default";
+
+ cleaned_id = cleaned_id.replace("org.yorba.shotwell.", "");
+ cleaned_id = cleaned_id.replace(".", "-");
+
+ return cleaned_id;
+ }
+
+ private static string make_plugin_schema_name(string domain, string id) {
+ string? cleaned_id = clean_plugin_id(id);
+ if (cleaned_id == null)
+ cleaned_id = "default";
+ cleaned_id = cleaned_id.replace(".", "-");
+
+ return "org.yorba.shotwell.%s.%s".printf(domain, cleaned_id);
+ }
+
+ private static string make_gsettings_key(string gconf_key) {
+ return gconf_key.replace("_", "-");
+ }
+
+ public string get_name() {
+ return "GSettings";
+ }
+
+ public int get_int_property(ConfigurableProperty p) throws ConfigurationError {
+ return get_gs_int(schema_names[p], key_names[p]);
+ }
+
+ public void set_int_property(ConfigurableProperty p, int val) throws ConfigurationError {
+ set_gs_int(schema_names[p], key_names[p], val);
+ property_changed(p);
+ }
+
+ public string get_string_property(ConfigurableProperty p) throws ConfigurationError {
+ string gs_result = get_gs_string(schema_names[p], key_names[p]);
+
+ // if we're getting the desktop background file, convert the file uri we get back from
+ // GSettings into a file path
+ string result = gs_result;
+ if (p == ConfigurableProperty.DESKTOP_BACKGROUND_FILE) {
+ result = gs_result.substring(7);
+ }
+
+ return result;
+ }
+
+ public void set_string_property(ConfigurableProperty p, string val) throws ConfigurationError {
+ // if we're setting the desktop background file, convert the filename into a file URI
+ string converted_val = val;
+ if (p == ConfigurableProperty.DESKTOP_BACKGROUND_FILE) {
+ converted_val = "file://" + val;
+ }
+
+ set_gs_string(schema_names[p], key_names[p], converted_val);
+ property_changed(p);
+ }
+
+ public bool get_bool_property(ConfigurableProperty p) throws ConfigurationError {
+ return get_gs_bool(schema_names[p], key_names[p]);
+ }
+
+ public void set_bool_property(ConfigurableProperty p, bool val) throws ConfigurationError {
+ set_gs_bool(schema_names[p], key_names[p], val);
+ property_changed(p);
+ }
+
+ public double get_double_property(ConfigurableProperty p) throws ConfigurationError {
+ return get_gs_double(schema_names[p], key_names[p]);
+ }
+
+ public void set_double_property(ConfigurableProperty p, double val) throws ConfigurationError {
+ set_gs_double(schema_names[p], key_names[p], val);
+ property_changed(p);
+ }
+
+ public bool get_plugin_bool(string domain, string id, string key, bool def) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ return get_gs_bool(schema_name, make_gsettings_key(key));
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ return def;
+ }
+ }
+
+ public void set_plugin_bool(string domain, string id, string key, bool val) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ set_gs_bool(schema_name, make_gsettings_key(key), val);
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ public double get_plugin_double(string domain, string id, string key, double def) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ return get_gs_double(schema_name, make_gsettings_key(key));
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ return def;
+ }
+ }
+
+ public void set_plugin_double(string domain, string id, string key, double val) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ set_gs_double(schema_name, make_gsettings_key(key), val);
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ public int get_plugin_int(string domain, string id, string key, int def) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ return get_gs_int(schema_name, make_gsettings_key(key));
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ return def;
+ }
+ }
+
+ public void set_plugin_int(string domain, string id, string key, int val) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ set_gs_int(schema_name, make_gsettings_key(key), val);
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ public string? get_plugin_string(string domain, string id, string key, string? def) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ return get_gs_string(schema_name, make_gsettings_key(key));
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ return def;
+ }
+ }
+
+ public void set_plugin_string(string domain, string id, string key, string? val) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ set_gs_string(schema_name, make_gsettings_key(key), val);
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ public void unset_plugin_key(string domain, string id, string key) {
+ string schema_name = make_plugin_schema_name(domain, id);
+
+ try {
+ reset_gs_to_default(schema_name, make_gsettings_key(key));
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ public FuzzyPropertyState is_plugin_enabled(string id) {
+ string enable_disable_name = get_plugin_enable_disable_name(id);
+
+ try {
+ return (get_gs_bool(PLUGINS_ENABLE_DISABLE_SCHEMA_NAME, enable_disable_name)) ?
+ FuzzyPropertyState.ENABLED : FuzzyPropertyState.DISABLED;
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ return FuzzyPropertyState.UNKNOWN;
+ }
+ }
+
+ public void set_plugin_enabled(string id, bool enabled) {
+ string enable_disable_name = get_plugin_enable_disable_name(id);
+
+ try {
+ set_gs_bool(PLUGINS_ENABLE_DISABLE_SCHEMA_NAME, enable_disable_name, enabled);
+ } catch (ConfigurationError err) {
+ critical("GSettingsConfigurationEngine: error: %s", err.message);
+ }
+ }
+
+ /*! @brief Migrates settings data over from old-style /apps/ paths to /org/yorba/ ones.
+ * Should only be called ONCE, during DB upgrading; otherwise, stale data may be copied
+ * over newer data by accident.
+ */
+ public static void run_gsettings_migrator() {
+ string cmd_line = "sh " + AppDirs.get_settings_migrator_bin().get_path();
+
+ try {
+ Process.spawn_command_line_sync(cmd_line);
+ } catch (Error err) {
+ message("Error running shotwell-settings-migrator: %s", err.message);
+ }
+ }
+
+}
diff --git a/src/config/mk/config.mk b/src/config/mk/config.mk
new file mode 100644
index 0000000..e06dedf
--- /dev/null
+++ b/src/config/mk/config.mk
@@ -0,0 +1,29 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Config
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := config
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ ConfigurationInterfaces.vala \
+ GSettingsEngine.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/core/Alteration.vala b/src/core/Alteration.vala
new file mode 100644
index 0000000..865be84
--- /dev/null
+++ b/src/core/Alteration.vala
@@ -0,0 +1,316 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// Alteration represents a description of what has changed in the DataObject (reported via the
+// "altered" signal). Since the descriptions can vary wildly depending on the semantics of each
+// DataObject, no assumptions or requirements are placed on Alteration other than it must have
+// one or more "subjects", each with a "detail". Subscribers to the "altered" signal can query
+// the Alteration object to determine if the change is important to them.
+//
+// Alteration is an immutable type. This means it's possible to store const Alterations of oft-used
+// values for reuse.
+//
+// Alterations may be compressed, merging their subjects and details into a new aggregated
+// Alteration. Generally this is handled automatically by DataObject and DataCollection, when
+// necessary.
+//
+// NOTE: subjects and details should be ASCII labels (as in, plain-old ASCII, no code pages).
+// They are treated as case-sensitive strings.
+//
+// Recommended subjects include: image, thumbnail, metadata.
+//
+
+public class Alteration {
+ private string subject = null;
+ private string detail = null;
+ private Gee.MultiMap<string, string> map = null;
+
+ public Alteration(string subject, string detail) {
+ add_detail(subject, detail);
+ }
+
+ // Create an Alteration that has more than one subject/detail. list is a comma-delimited
+ // string of colon-separated subject:detail pairs.
+ public Alteration.from_list(string list) requires (list.length > 0) {
+ string[] pairs = list.split(",");
+ assert(pairs.length >= 1);
+
+ foreach (string pair in pairs) {
+ string[] subject_detail = pair.split(":", 2);
+ assert(subject_detail.length == 2);
+
+ add_detail(subject_detail[0], subject_detail[1]);
+ }
+ }
+
+ // Create an Alteration that has more than one subject/detail from an array of comma-delimited
+ // strings of colon-separate subject:detail pairs
+ public Alteration.from_array(string[] array) requires (array.length > 0) {
+ foreach (string pair in array) {
+ string[] subject_detail = pair.split(":", 2);
+ assert(subject_detail.length == 2);
+
+ add_detail(subject_detail[0], subject_detail[1]);
+ }
+ }
+
+ // Used for compression.
+ private Alteration.from_map(Gee.MultiMap<string, string> map) {
+ this.map = map;
+ }
+
+ private void add_detail(string sub, string det) {
+ // strip leading and trailing whitespace
+ string subject = sub.strip();
+ assert(subject.length > 0);
+
+ string detail = det.strip();
+ assert(detail.length > 0);
+
+ // if a simple Alteration, store in singleton refs
+ if (this.subject == null && map == null) {
+ assert(this.detail == null);
+
+ this.subject = subject;
+ this.detail = detail;
+
+ return;
+ }
+
+ // Now a complex Alteration, requiring a Map.
+ if (map == null)
+ map = create_map();
+
+ // Move singletons into Map
+ if (this.subject != null) {
+ assert(this.detail != null);
+
+ map.set(this.subject, this.detail);
+ this.subject = null;
+ this.detail = null;
+ }
+
+ // Store new subject:detail in Map as well
+ map.set(subject, detail);
+ }
+
+ private Gee.MultiMap<string, string> create_map() {
+ return new Gee.HashMultiMap<string, string>(case_hash, case_equal, case_hash, case_equal);
+ }
+
+ private static bool case_equal(string? a, string? b) {
+ return equal_values(a, b);
+ }
+
+ private static uint case_hash(string? a) {
+ return hash_value(a);
+ }
+
+ private static inline bool equal_values(string str1, string str2) {
+ return str1.ascii_casecmp(str2) == 0;
+ }
+
+ private static inline uint hash_value(string str) {
+ return str_hash(str);
+ }
+
+ public bool has_subject(string subject) {
+ if (this.subject != null)
+ return equal_values(this.subject, subject);
+
+ assert(map != null);
+ Gee.Set<string>? keys = map.get_keys();
+ if (keys != null) {
+ foreach (string key in keys) {
+ if (equal_values(key, subject))
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public bool has_detail(string subject, string detail) {
+ if (this.subject != null && this.detail != null)
+ return equal_values(this.subject, subject) && equal_values(this.detail, detail);
+
+ assert(map != null);
+ Gee.Collection<string>? values = map.get(subject);
+ if (values != null) {
+ foreach (string value in values) {
+ if (equal_values(value, detail))
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public Gee.Collection<string>? get_details(string subject) {
+ if (this.subject != null && detail != null && equal_values(this.subject, subject)) {
+ Gee.ArrayList<string> details = new Gee.ArrayList<string>();
+ details.add(detail);
+
+ return details;
+ }
+
+ return (map != null) ? map.get(subject) : null;
+ }
+
+ public string to_string() {
+ if (subject != null) {
+ assert(detail != null);
+
+ return "%s:%s".printf(subject, detail);
+ }
+
+ assert(map != null);
+
+ string str = "";
+ foreach (string key in map.get_keys()) {
+ foreach (string value in map.get(key)) {
+ if (str.length != 0)
+ str += ", ";
+
+ str += "%s:%s".printf(key, value);
+ }
+ }
+
+ return str;
+ }
+
+ // Returns true if this object has any subject:detail matches with the supplied Alteration.
+ public bool contains_any(Alteration other) {
+ // identity
+ if (this == other)
+ return true;
+
+ // if both singletons, check for singleton match
+ if (subject != null && other.subject != null && detail != null && other.detail != null)
+ return equal_values(subject, other.subject) && equal_values(detail, other.detail);
+
+ // if one is singleton and the other a multiple, search for singleton in multiple
+ if ((map != null && other.map == null) || (map == null && other.map != null)) {
+ string single_subject = subject != null ? subject : other.subject;
+ string single_detail = detail != null ? detail : other.detail;
+ Gee.MultiMap<string, string> multimap = map != null ? map : other.map;
+
+ return multimap.contains(single_subject) && map.get(single_subject).contains(single_detail);
+ }
+
+ // if both multiples, check for any match at all
+ if (map != null && other.map != null) {
+ Gee.Set<string>? keys = map.get_keys();
+ assert(keys != null);
+ Gee.Set<string>? other_keys = other.map.get_keys();
+ assert(other_keys != null);
+
+ foreach (string subject in other_keys) {
+ if (!keys.contains(subject))
+ continue;
+
+ Gee.Collection<string>? details = map.get(subject);
+ Gee.Collection<string>? other_details = other.map.get(subject);
+
+ if (details != null && other_details != null) {
+ foreach (string detail in other_details) {
+ if (details.contains(detail))
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public bool equals(Alteration other) {
+ // identity
+ if (this == other)
+ return true;
+
+ // if both singletons, check for singleton match
+ if (subject != null && other.subject != null && detail != null && other.detail != null)
+ return equal_values(subject, other.subject) && equal_values(detail, other.detail);
+
+ // if both multiples, check for across-the-board matches
+ if (map != null && other.map != null) {
+ // see if both maps contain the same set of keys
+ Gee.Set<string>? keys = map.get_keys();
+ assert(keys != null);
+ Gee.Set<string>? other_keys = other.map.get_keys();
+ assert(other_keys != null);
+
+ if (keys.size != other_keys.size)
+ return false;
+
+ if (!keys.contains_all(other_keys))
+ return false;
+
+ if (!other_keys.contains_all(keys))
+ return false;
+
+ foreach (string key in keys) {
+ Gee.Collection<string> values = map.get(key);
+ Gee.Collection<string> other_values = other.map.get(key);
+
+ if (values.size != other_values.size)
+ return false;
+
+ if (!values.contains_all(other_values))
+ return false;
+
+ if (!other_values.contains_all(values))
+ return false;
+ }
+
+ // maps are identical
+ return true;
+ }
+
+ // one singleton and one multiple, not equal
+ return false;
+ }
+
+ private static void multimap_add_all(Gee.MultiMap<string, string> dest,
+ Gee.MultiMap<string, string> src) {
+ Gee.Set<string> keys = src.get_keys();
+ foreach (string key in keys) {
+ Gee.Collection<string> values = src.get(key);
+ foreach (string value in values)
+ dest.set(key, value);
+ }
+ }
+
+ // This merges the Alterations, returning a new Alteration with both represented. If both
+ // Alterations are equal, this will return this object rather than create a new one.
+ public Alteration compress(Alteration other) {
+ if (equals(other))
+ return this;
+
+ // Build a new Alteration with both represented ... if they're unequal, then the new one
+ // is guaranteed not to be a singleton
+ Gee.MultiMap<string, string> compressed = create_map();
+
+ if (subject != null && detail != null) {
+ compressed.set(subject, detail);
+ } else {
+ assert(map != null);
+ multimap_add_all(compressed, map);
+ }
+
+ if (other.subject != null && other.detail != null) {
+ compressed.set(other.subject, other.detail);
+ } else {
+ assert(other.map != null);
+ multimap_add_all(compressed, other.map);
+ }
+
+ return new Alteration.from_map(compressed);
+ }
+}
+
diff --git a/src/core/ContainerSourceCollection.vala b/src/core/ContainerSourceCollection.vala
new file mode 100644
index 0000000..655cfa0
--- /dev/null
+++ b/src/core/ContainerSourceCollection.vala
@@ -0,0 +1,237 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// A ContainerSourceCollection is for DataSources which maintain links to one or more other
+// DataSources, assumed to be of a different type. ContainerSourceCollection automates the task
+// of handling unlinking and relinking and maintaining backlinks. Unlinked DataSources are
+// held in a holding tank, until they are either relinked or destroyed.
+//
+// If the ContainerSourceCollection's DataSources are types that "evaporate" (i.e. they disappear
+// when they hold no items), they should use the evaporate() method, which will either destroy
+// the DataSource or hold it in the tank (if backlinks are outstanding).
+public abstract class ContainerSourceCollection : DatabaseSourceCollection {
+ private Gee.HashSet<SourceCollection> attached_collections = new Gee.HashSet<SourceCollection>();
+ private string backlink_name;
+ private Gee.HashSet<ContainerSource> holding_tank = new Gee.HashSet<ContainerSource>();
+
+ public virtual signal void container_contents_added(ContainerSource container,
+ Gee.Collection<DataSource> added, bool relinked) {
+ }
+
+ public virtual signal void container_contents_removed(ContainerSource container,
+ Gee.Collection<DataSource> removed, bool unlinked) {
+ }
+
+ public virtual signal void container_contents_altered(ContainerSource container,
+ Gee.Collection<DataSource>? added, bool relinked, Gee.Collection<DataSource>? removed,
+ bool unlinked) {
+ }
+
+ public virtual signal void backlink_to_container_removed(ContainerSource container,
+ Gee.Collection<DataSource> sources) {
+ }
+
+ public ContainerSourceCollection(string backlink_name, string name,
+ GetSourceDatabaseKey source_key_func) {
+ base (name, source_key_func);
+
+ this.backlink_name = backlink_name;
+ }
+
+ ~ContainerSourceCollection() {
+ detach_all_collections();
+ }
+
+ protected override void notify_backlink_removed(SourceBacklink backlink,
+ Gee.Collection<DataSource> sources) {
+ base.notify_backlink_removed(backlink, sources);
+
+ ContainerSource? container = convert_backlink_to_container(backlink);
+ if (container != null)
+ notify_backlink_to_container_removed(container, sources);
+ }
+
+ public virtual void notify_container_contents_added(ContainerSource container,
+ Gee.Collection<DataSource> added, bool relinked) {
+ // if container is in holding tank, remove it now and relink to collection
+ if (holding_tank.contains(container)) {
+ bool removed = holding_tank.remove(container);
+ assert(removed);
+
+ relink(container);
+ }
+
+ container_contents_added(container, added, relinked);
+ }
+
+ public virtual void notify_container_contents_removed(ContainerSource container,
+ Gee.Collection<DataSource> removed, bool unlinked) {
+ container_contents_removed(container, removed, unlinked);
+ }
+
+ public virtual void notify_container_contents_altered(ContainerSource container,
+ Gee.Collection<DataSource>? added, bool relinked, Gee.Collection<DataSource>? removed,
+ bool unlinked) {
+ container_contents_altered(container, added, relinked, removed, unlinked);
+ }
+
+ public virtual void notify_backlink_to_container_removed(ContainerSource container,
+ Gee.Collection<DataSource> sources) {
+ backlink_to_container_removed(container, sources);
+ }
+
+ protected abstract Gee.Collection<ContainerSource>? get_containers_holding_source(DataSource source);
+
+ // Looks in holding_tank as well.
+ protected abstract ContainerSource? convert_backlink_to_container(SourceBacklink backlink);
+
+ protected void freeze_attached_notifications() {
+ foreach(SourceCollection collection in attached_collections)
+ collection.freeze_notifications();
+ }
+
+ protected void thaw_attached_notifications() {
+ foreach(SourceCollection collection in attached_collections)
+ collection.thaw_notifications();
+ }
+
+ public Gee.Collection<ContainerSource> get_holding_tank() {
+ return holding_tank.read_only_view;
+ }
+
+ public void init_add_unlinked(ContainerSource unlinked) {
+ holding_tank.add(unlinked);
+ }
+
+ public void init_add_many_unlinked(Gee.Collection<ContainerSource> unlinked) {
+ holding_tank.add_all(unlinked);
+ }
+
+ public bool relink_from_holding_tank(ContainerSource source) {
+ if (!holding_tank.remove(source))
+ return false;
+
+ relink(source);
+
+ return true;
+ }
+
+ private void on_contained_sources_unlinking(Gee.Collection<DataSource> unlinking) {
+ freeze_attached_notifications();
+
+ Gee.HashMultiMap<ContainerSource, DataSource> map =
+ new Gee.HashMultiMap<ContainerSource, DataSource>();
+
+ foreach (DataSource source in unlinking) {
+ Gee.Collection<ContainerSource>? containers = get_containers_holding_source(source);
+ if (containers == null || containers.size == 0)
+ continue;
+
+ foreach (ContainerSource container in containers) {
+ map.set(container, source);
+ source.set_backlink(container.get_backlink());
+ }
+ }
+
+ foreach (ContainerSource container in map.get_keys())
+ container.break_link_many(map.get(container));
+
+ thaw_attached_notifications();
+ }
+
+ private void on_contained_sources_relinked(Gee.Collection<DataSource> relinked) {
+ freeze_attached_notifications();
+
+ Gee.HashMultiMap<ContainerSource, DataSource> map =
+ new Gee.HashMultiMap<ContainerSource, DataSource>();
+
+ foreach (DataSource source in relinked) {
+ Gee.List<SourceBacklink>? backlinks = source.get_backlinks(backlink_name);
+ if (backlinks == null || backlinks.size == 0)
+ continue;
+
+ foreach (SourceBacklink backlink in backlinks) {
+ ContainerSource? container = convert_backlink_to_container(backlink);
+ if (container != null) {
+ map.set(container, source);
+ } else {
+ warning("Unable to relink %s to container backlink %s", source.to_string(),
+ backlink.to_string());
+ }
+ }
+ }
+
+ foreach (ContainerSource container in map.get_keys())
+ container.establish_link_many(map.get(container));
+
+ thaw_attached_notifications();
+ }
+
+ private void on_contained_source_destroyed(DataSource source) {
+ Gee.Iterator<ContainerSource> iter = holding_tank.iterator();
+ while (iter.next()) {
+ ContainerSource container = iter.get();
+
+ // By design, we no longer discard 'orphan' tags, that is, tags with zero media sources
+ // remaining, since empty tags are explicitly allowed to persist as of the 0.12 dev cycle.
+ if ((!container.has_links()) && !(container is Tag)) {
+ iter.remove();
+ container.destroy_orphan(true);
+ }
+ }
+ }
+
+ protected override void notify_item_destroyed(DataSource source) {
+ foreach (SourceCollection collection in attached_collections) {
+ collection.remove_backlink(((ContainerSource) source).get_backlink());
+ }
+
+ base.notify_item_destroyed(source);
+ }
+
+ // This method should be called by a ContainerSource when it needs to "evaporate" -- it no
+ // longer holds any source objects and should not be available to the user any longer. If link
+ // state persists for this ContainerSource, it will be held in the holding tank. Otherwise, it's
+ // destroyed.
+ public void evaporate(ContainerSource container) {
+ foreach (SourceCollection collection in attached_collections) {
+ if (collection.has_backlink(container.get_backlink())) {
+ unlink_marked(mark(container));
+ bool added = holding_tank.add(container);
+ assert(added);
+ return;
+ }
+ }
+
+ destroy_marked(mark(container), true);
+ }
+
+ public void attach_collection(SourceCollection collection) {
+ if (attached_collections.contains(collection)) {
+ warning("attempted to multiple-attach '%s' to '%s'", collection.to_string(), to_string());
+ return;
+ }
+
+ attached_collections.add(collection);
+
+ collection.items_unlinking.connect(on_contained_sources_unlinking);
+ collection.items_relinked.connect(on_contained_sources_relinked);
+ collection.item_destroyed.connect(on_contained_source_destroyed);
+ collection.unlinked_destroyed.connect(on_contained_source_destroyed);
+ }
+
+ public void detach_all_collections() {
+ foreach (SourceCollection collection in attached_collections) {
+ collection.items_unlinking.disconnect(on_contained_sources_unlinking);
+ collection.items_relinked.disconnect(on_contained_sources_relinked);
+ collection.item_destroyed.disconnect(on_contained_source_destroyed);
+ collection.unlinked_destroyed.disconnect(on_contained_source_destroyed);
+ }
+
+ attached_collections.clear();
+ }
+}
+
diff --git a/src/core/Core.vala b/src/core/Core.vala
new file mode 100644
index 0000000..1b9958e
--- /dev/null
+++ b/src/core/Core.vala
@@ -0,0 +1,29 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Core unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Core {
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/core/DataCollection.vala b/src/core/DataCollection.vala
new file mode 100644
index 0000000..615c6ac
--- /dev/null
+++ b/src/core/DataCollection.vala
@@ -0,0 +1,623 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class DataCollection {
+ public const int64 INVALID_OBJECT_ORDINAL = -1;
+
+ private class MarkerImpl : Object, Marker {
+ public DataCollection owner;
+ public Gee.HashSet<DataObject> marked = new Gee.HashSet<DataObject>();
+ public int freeze_count = 0;
+
+ public MarkerImpl(DataCollection owner) {
+ this.owner = owner;
+
+ // if items are removed from main collection, they're removed from the marked list
+ // as well
+ owner.items_removed.connect(on_items_removed);
+ }
+
+ ~MarkerImpl() {
+ owner.items_removed.disconnect(on_items_removed);
+ }
+
+ public void mark(DataObject object) {
+ assert(owner.internal_contains(object));
+
+ marked.add(object);
+ }
+
+ public void unmark(DataObject object) {
+ assert(owner.internal_contains(object));
+
+ marked.remove(object);
+ }
+
+ public bool toggle(DataObject object) {
+ assert(owner.internal_contains(object));
+
+ if (marked.contains(object)) {
+ marked.remove(object);
+ } else {
+ marked.add(object);
+ }
+
+ return marked.contains(object);
+ }
+
+ public void mark_many(Gee.Collection<DataObject> list) {
+ foreach (DataObject object in list) {
+ assert(owner.internal_contains(object));
+
+ marked.add(object);
+ }
+ }
+
+ public void unmark_many(Gee.Collection<DataObject> list) {
+ foreach (DataObject object in list) {
+ assert(owner.internal_contains(object));
+
+ marked.remove(object);
+ }
+ }
+
+ public void mark_all() {
+ foreach (DataObject object in owner.get_all())
+ marked.add(object);
+ }
+
+ public int get_count() {
+ return (marked != null) ? marked.size : freeze_count;
+ }
+
+ public Gee.Collection<DataObject> get_all() {
+ Gee.ArrayList<DataObject> copy = new Gee.ArrayList<DataObject>();
+ copy.add_all(marked);
+
+ return copy;
+ }
+
+ private void on_items_removed(Gee.Iterable<DataObject> removed) {
+ foreach (DataObject object in removed)
+ marked.remove(object);
+ }
+
+ // This method is called by DataCollection when it starts iterating over the marked list ...
+ // the marker at this point stops monitoring the collection, preventing a possible
+ // removal during an iteration, which is bad.
+ public void freeze() {
+ owner.items_removed.disconnect(on_items_removed);
+ }
+
+ public void finished() {
+ if (marked != null)
+ freeze_count = marked.size;
+
+ marked = null;
+ }
+
+ public bool is_valid(DataCollection collection) {
+ return (collection == owner) && (marked != null);
+ }
+ }
+
+ private string name;
+ private DataSet dataset = new DataSet();
+ private Gee.HashMap<string, Value?> properties = new Gee.HashMap<string, Value?>();
+ private int64 object_ordinal_generator = 0;
+ private int notifies_frozen = 0;
+ private Gee.HashMap<DataObject, Alteration> frozen_items_altered = null;
+ private bool fire_ordering_changed = false;
+
+ // When this signal has been fired, the added items are part of the collection
+ public virtual signal void items_added(Gee.Iterable<DataObject> added) {
+ }
+
+ // When this signal is fired, the removed items are no longer part of the collection
+ public virtual signal void items_removed(Gee.Iterable<DataObject> removed) {
+ }
+
+ // When this signal is fired, the removed items are no longer part of the collection
+ public virtual signal void contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ }
+
+ // This signal fires whenever any (or multiple) items in the collection signal they've been
+ // altered.
+ public virtual signal void items_altered(Gee.Map<DataObject, Alteration> items) {
+ }
+
+ // Fired when a new sort comparator is registered or an item has moved in the ordering due to
+ // an alteration.
+ public virtual signal void ordering_changed() {
+ }
+
+ // Fired when a collection property is set. The old value is passed as well, null if not set
+ // previously.
+ public virtual signal void property_set(string name, Value? old, Value val) {
+ }
+
+ // Fired when a collection property is cleared.
+ public virtual signal void property_cleared(string name) {
+ }
+
+ // Fired when "altered" signal (and possibly other related signals, depending on the subclass)
+ // is frozen.
+ public virtual signal void frozen() {
+ }
+
+ // Fired when "altered" signal (and other related signals, depending on the subclass) is
+ // restored (thawed).
+ public virtual signal void thawed() {
+ }
+
+ public DataCollection(string name) {
+ this.name = name;
+ }
+
+ ~DataCollection() {
+#if TRACE_DTORS
+ debug("DTOR: DataCollection %s", name);
+#endif
+ }
+
+ public virtual string to_string() {
+ return "%s (%d)".printf(name, get_count());
+ }
+
+ // use notifies to ensure proper chronology of signal handling
+ protected virtual void notify_items_added(Gee.Iterable<DataObject> added) {
+ items_added(added);
+ }
+
+ protected virtual void notify_items_removed(Gee.Iterable<DataObject> removed) {
+ items_removed(removed);
+ }
+
+ protected virtual void notify_contents_altered(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ contents_altered(added, removed);
+ }
+
+ protected virtual void notify_items_altered(Gee.Map<DataObject, Alteration> items) {
+ items_altered(items);
+ }
+
+ protected virtual void notify_ordering_changed() {
+ ordering_changed();
+ }
+
+ protected virtual void notify_property_set(string name, Value? old, Value val) {
+ property_set(name, old, val);
+ }
+
+ protected virtual void notify_property_cleared(string name) {
+ property_cleared(name);
+ }
+
+ // A singleton list is used when a single item has been added/remove/selected/unselected
+ // and needs to be reported via a signal, which uses a list as a parameter ... although this
+ // seems wasteful, can't reuse a single singleton list because it's possible for a method
+ // that needs it to be called from within a signal handler for another method, corrupting the
+ // shared list's contents mid-signal
+ protected static Gee.Collection<DataObject> get_singleton(DataObject object) {
+ return new SingletonCollection<DataObject>(object);
+ }
+
+ protected static Gee.Map<DataObject, Alteration> get_alteration_singleton(DataObject object,
+ Alteration alteration) {
+ Gee.Map<DataObject, Alteration> map = new Gee.HashMap<DataObject, Alteration>();
+ map.set(object, alteration);
+
+ return map;
+ }
+
+ public virtual bool valid_type(DataObject object) {
+ return true;
+ }
+
+ public unowned Comparator get_comparator() {
+ return dataset.get_comparator();
+ }
+
+ public unowned ComparatorPredicate get_comparator_predicate() {
+ return dataset.get_comparator_predicate();
+ }
+
+ public virtual void set_comparator(Comparator comparator, ComparatorPredicate? predicate) {
+ dataset.set_comparator(comparator, predicate);
+ notify_ordering_changed();
+ }
+
+ // Return to natural ordering of DataObjects, which is order-added
+ public virtual void reset_comparator() {
+ dataset.reset_comparator();
+ notify_ordering_changed();
+ }
+
+ public virtual Gee.Collection<DataObject> get_all() {
+ return dataset.get_all();
+ }
+
+ protected DataSet get_dataset_copy() {
+ return dataset.copy();
+ }
+
+ public virtual int get_count() {
+ return dataset.get_count();
+ }
+
+ public virtual DataObject? get_at(int index) {
+ return dataset.get_at(index);
+ }
+
+ public virtual int index_of(DataObject object) {
+ return dataset.index_of(object);
+ }
+
+ public virtual bool contains(DataObject object) {
+ return internal_contains(object);
+ }
+
+ // Because subclasses may filter out objects (by overriding key methods here), need an
+ // internal_contains for consistency checking.
+ private bool internal_contains(DataObject object) {
+ if (!dataset.contains(object))
+ return false;
+
+ assert(object.get_membership() == this);
+
+ return true;
+ }
+
+ private void internal_add(DataObject object) {
+ assert(valid_type(object));
+
+ object.internal_set_membership(this, object_ordinal_generator++);
+
+ bool added = dataset.add(object);
+ assert(added);
+ }
+
+ private void internal_add_many(Gee.List<DataObject> objects, ProgressMonitor? monitor) {
+ int count = objects.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ DataObject object = objects.get(ctr);
+ assert(valid_type(object));
+
+ object.internal_set_membership(this, object_ordinal_generator++);
+
+ if (monitor != null)
+ monitor(ctr, count);
+ }
+
+ bool added = dataset.add_many(objects);
+ assert(added);
+ }
+
+ private void internal_remove(DataObject object) {
+ bool removed = dataset.remove(object);
+ assert(removed);
+
+ object.internal_clear_membership();
+ }
+
+ // Returns false if item is already part of the collection.
+ public virtual bool add(DataObject object) {
+ if (internal_contains(object)) {
+ debug("%s cannot add %s: already present", to_string(), object.to_string());
+
+ return false;
+ }
+
+ internal_add(object);
+
+ // fire signal after added using singleton list
+ Gee.Collection<DataObject> added = get_singleton(object);
+ notify_items_added(added);
+ notify_contents_altered(added, null);
+
+ // This must be called *after* the DataCollection has signalled.
+ object.notify_membership_changed(this);
+
+ return true;
+ }
+
+ // Returns the items added to the collection.
+ public virtual Gee.Collection<DataObject> add_many(Gee.Collection<DataObject> objects,
+ ProgressMonitor? monitor = null) {
+ Gee.ArrayList<DataObject> added = new Gee.ArrayList<DataObject>();
+ foreach (DataObject object in objects) {
+ if (internal_contains(object)) {
+ debug("%s cannot add %s: already present", to_string(), object.to_string());
+
+ continue;
+ }
+
+ added.add(object);
+ }
+
+ int count = added.size;
+ if (count == 0)
+ return added;
+
+ internal_add_many(added, monitor);
+
+ // signal once all have been added
+ notify_items_added(added);
+ notify_contents_altered(added, null);
+
+ // This must be called *after* the DataCollection signals have fired.
+ for (int ctr = 0; ctr < count; ctr++)
+ added.get(ctr).notify_membership_changed(this);
+
+ return added;
+ }
+
+ // Obtain a marker to build a list of objects to perform an action upon.
+ public Marker start_marking() {
+ return new MarkerImpl(this);
+ }
+
+ // Obtain a marker with a single item marked. More can be added.
+ public Marker mark(DataObject object) {
+ Marker marker = new MarkerImpl(this);
+ marker.mark(object);
+
+ return marker;
+ }
+
+ // Obtain a marker for all items in a collection. More can be added.
+ public Marker mark_many(Gee.Collection<DataObject> objects) {
+ Marker marker = new MarkerImpl(this);
+ marker.mark_many(objects);
+
+ return marker;
+ }
+
+ // Iterate over all the marked objects performing a user-supplied action on each one. The
+ // marker is invalid after calling this method.
+ public void act_on_marked(Marker m, MarkedAction action, ProgressMonitor? monitor = null,
+ Object? user = null) {
+ MarkerImpl marker = (MarkerImpl) m;
+
+ assert(marker.is_valid(this));
+
+ // freeze the marker to prepare it for iteration
+ marker.freeze();
+
+ uint64 count = 0;
+ uint64 total = marker.marked.size;
+
+ // iterate, breaking if the callback asks to stop
+ foreach (DataObject object in marker.marked) {
+ // although marker tracks when items are removed, catch it here as well
+ if (!internal_contains(object)) {
+ warning("act_on_marked: marker holding ref to unknown %s", object.to_string());
+
+ continue;
+ }
+
+ if (!action(object, user))
+ break;
+
+ if (monitor != null) {
+ if (!monitor(++count, total))
+ break;
+ }
+ }
+
+ // invalidate the marker
+ marker.finished();
+ }
+
+ // Remove marked items from collection. This two-step process allows for iterating in a foreach
+ // loop and removing without creating a separate list. The marker is invalid after this call.
+ public virtual void remove_marked(Marker m) {
+ MarkerImpl marker = (MarkerImpl) m;
+
+ assert(marker.is_valid(this));
+
+ // freeze the marker before signalling, so it doesn't remove all its items
+ marker.freeze();
+
+ // remove everything in the marked list
+ Gee.ArrayList<DataObject> skipped = null;
+ foreach (DataObject object in marker.marked) {
+ // although marker should track items already removed, catch it here as well
+ if (!internal_contains(object)) {
+ warning("remove_marked: marker holding ref to unknown %s", object.to_string());
+
+ if (skipped == null)
+ skipped = new Gee.ArrayList<DataObject>();
+
+ skipped.add(object);
+
+ continue;
+ }
+
+ internal_remove(object);
+ }
+
+ if (skipped != null)
+ marker.marked.remove_all(skipped);
+
+ // signal after removing
+ if (marker.marked.size > 0) {
+ notify_items_removed(marker.marked);
+ notify_contents_altered(null, marker.marked);
+
+ // this must be called after the DataCollection has signalled.
+ foreach (DataObject object in marker.marked)
+ object.notify_membership_changed(null);
+ }
+
+ // invalidate the marker
+ marker.finished();
+ }
+
+ public virtual void clear() {
+ if (dataset.get_count() == 0)
+ return;
+
+ // remove everything in the list, but have to maintain a new list for reporting the signal.
+ // Don't use an iterator, as list is modified in internal_remove().
+ Gee.ArrayList<DataObject> removed = new Gee.ArrayList<DataObject>();
+ do {
+ DataObject? object = dataset.get_at(0);
+ assert(object != null);
+
+ removed.add(object);
+ internal_remove(object);
+ } while (dataset.get_count() > 0);
+
+ // report after removal
+ notify_items_removed(removed);
+ notify_contents_altered(null, removed);
+
+ // This must be called after the DataCollection has signalled.
+ foreach (DataObject object in removed)
+ object.notify_membership_changed(null);
+ }
+
+ // close() must be called before disposing of the DataCollection, so all signals may be
+ // disconnected and all internal references to the collection can be dropped. In the bare
+ // minimum, all items will be removed from the collection (and the appropriate signals and
+ // notify calls will be made). Subclasses may fire other signals while disposing of their
+ // references. However, if they are entirely synchronized on DataCollection's signals, that
+ // may be enough for them to clean up.
+ public virtual void close() {
+ clear();
+ }
+
+ // This method is only called by DataObject to report when it has been altered, so observers of
+ // this collection may be notified as well.
+ public void internal_notify_altered(DataObject object, Alteration alteration) {
+ assert(internal_contains(object));
+
+ bool resort_occurred = dataset.resort_object(object, alteration);
+
+ if (are_notifications_frozen()) {
+ if (frozen_items_altered == null)
+ frozen_items_altered = new Gee.HashMap<DataObject, Alteration>();
+
+ // if an alteration for the object is already in place, compress the two and add the
+ // new one, otherwise set the supplied one
+ Alteration? current = frozen_items_altered.get(object);
+ if (current != null)
+ current = current.compress(alteration);
+ else
+ current = alteration;
+
+ frozen_items_altered.set(object, current);
+
+ fire_ordering_changed = fire_ordering_changed || resort_occurred;
+
+ return;
+ }
+
+ if (resort_occurred)
+ notify_ordering_changed();
+
+ notify_items_altered(get_alteration_singleton(object, alteration));
+ }
+
+ public Value? get_property(string name) {
+ return properties.get(name);
+ }
+
+ public void set_property(string name, Value val, ValueEqualFunc? value_equals = null) {
+ if (value_equals == null) {
+ if (val.holds(typeof(bool)))
+ value_equals = bool_value_equals;
+ else if (val.holds(typeof(int)))
+ value_equals = int_value_equals;
+ else
+ error("value_equals must be specified for this type");
+ }
+
+ Value? old = properties.get(name);
+ if (old != null) {
+ if (value_equals(old, val))
+ return;
+ }
+
+ properties.set(name, val);
+
+ notify_property_set(name, old, val);
+
+ // notify all items in the collection of the change
+ int count = dataset.get_count();
+ for (int ctr = 0; ctr < count; ctr++)
+ dataset.get_at(ctr).notify_collection_property_set(name, old, val);
+ }
+
+ public void clear_property(string name) {
+ if (!properties.unset(name))
+ return;
+
+ // only notify if the propery was unset (that is, was set to begin with)
+ notify_property_cleared(name);
+
+ // notify all items
+ int count = dataset.get_count();
+ for (int ctr = 0; ctr < count; ctr++)
+ dataset.get_at(ctr).notify_collection_property_cleared(name);
+ }
+
+ // This is only guaranteed to freeze notifications that come in from contained objects and
+ // need to be propagated with collection signals. Thus, the caller can freeze notifications,
+ // make modifications to many or all member objects, then unthaw and have the aggregated signals
+ // fired at once.
+ //
+ // DataObject/DataSource/DataView should also "eat" their signals as well, to prevent observers
+ // from being notified while their collection is frozen, and only fire them when
+ // internal_collection_thawed is called.
+ //
+ // For DataCollection, the signals affected are items_altered and ordering_changed.
+ public void freeze_notifications() {
+ if (notifies_frozen++ == 0)
+ notify_frozen();
+ }
+
+ public void thaw_notifications() {
+ if (notifies_frozen == 0)
+ return;
+
+ if (--notifies_frozen == 0)
+ notify_thawed();
+ }
+
+ public bool are_notifications_frozen() {
+ return notifies_frozen > 0;
+ }
+
+ // This is called when notifications have frozen. Child collections should halt notifications
+ // until thawed() is called.
+ protected virtual void notify_frozen() {
+ frozen();
+ }
+
+ // This is called when enough thaw_notifications() calls have been made. Child collections
+ // should issue caught notifications.
+ protected virtual void notify_thawed() {
+ if (frozen_items_altered != null) {
+ // refs are swapped around due to reentrancy
+ Gee.Map<DataObject, Alteration> copy = frozen_items_altered;
+ frozen_items_altered = null;
+
+ notify_items_altered(copy);
+ }
+
+ if (fire_ordering_changed) {
+ fire_ordering_changed = false;
+ notify_ordering_changed();
+ }
+
+ thawed();
+ }
+}
+
diff --git a/src/core/DataObject.vala b/src/core/DataObject.vala
new file mode 100644
index 0000000..1fe133d
--- /dev/null
+++ b/src/core/DataObject.vala
@@ -0,0 +1,137 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+//
+// DataObject
+//
+// Object IDs are incremented for each DataObject, and therefore may be used to compare
+// creation order. This behavior may be relied upon elsewhere. Object IDs may be recycled when
+// DataObjects are reconstituted by a proxy.
+//
+// Ordinal IDs are supplied by DataCollections to record the ordering of the object being added
+// to the collection. This value is primarily only used by DataCollection, but may be used
+// elsewhere to resolve ordering questions (including stabilizing a sort).
+//
+
+// Have to inherit from Object due to ContainerSource and this bug:
+// https://bugzilla.gnome.org/show_bug.cgi?id=615904
+public abstract class DataObject : Object {
+ public const int64 INVALID_OBJECT_ID = -1;
+
+ private static int64 object_id_generator = 0;
+
+#if TRACE_DTORS
+ // because calling to_string() in a destructor is dangerous, stash to_string()'s result in
+ // this variable for reporting
+ protected string dbg_to_string = null;
+#endif
+
+ private int64 object_id = INVALID_OBJECT_ID;
+ private DataCollection member_of = null;
+ private int64 ordinal = DataCollection.INVALID_OBJECT_ORDINAL;
+
+ // NOTE: Supplying an object ID should *only* be used when reconstituting the object (generally
+ // only done by DataSources).
+ public DataObject(int64 object_id = INVALID_OBJECT_ID) {
+ this.object_id = (object_id == INVALID_OBJECT_ID) ? object_id_generator++ : object_id;
+ }
+
+ public virtual void notify_altered(Alteration alteration) {
+ if (member_of != null)
+ member_of.internal_notify_altered(this, alteration);
+ }
+
+ // There is no membership_changed signal as it's expensive (esp. at startup) and not needed
+ // at this time. The notify_membership_changed mechanism is still in place for subclasses.
+ //
+ // This is called after the change has occurred (i.e., after the DataObject has been added
+ // to the DataCollection, or after it has been remove from the same). It is also called after
+ // the DataCollection has reported the change on its own signals, so it and its children can
+ // properly integrate the DataObject into its pools.
+ //
+ // This is only called by DataCollection.
+ public virtual void notify_membership_changed(DataCollection? collection) {
+ }
+
+ // Generally, this is only called by DataCollection. No signal is bound to this because
+ // it's not needed currently and affects performance.
+ public virtual void notify_collection_property_set(string name, Value? old, Value val) {
+ }
+
+ // Generally, this is only called by DataCollection. No signal is bound to this because
+ // it's not needed currently and affects performance.
+ public virtual void notify_collection_property_cleared(string name) {
+ }
+
+ public abstract string get_name();
+
+ public abstract string to_string();
+
+ public DataCollection? get_membership() {
+ return member_of;
+ }
+
+ public bool has_membership() {
+ return member_of != null;
+ }
+
+ // This method is only called by DataCollection. It's called after the DataObject has been
+ // assigned to a DataCollection.
+ public void internal_set_membership(DataCollection collection, int64 ordinal) {
+ assert(member_of == null);
+
+ member_of = collection;
+ this.ordinal = ordinal;
+
+#if TRACE_DTORS
+ dbg_to_string = to_string();
+#endif
+ }
+
+ // This method is only called by SourceHoldingTank (to give ordinality to its unassociated
+ // members). DataCollections should call internal_set_membership.
+ public void internal_set_ordinal(int64 ordinal) {
+ assert(member_of == null);
+
+ this.ordinal = ordinal;
+ }
+
+ // This method is only called by DataCollection. It's called after the DataObject has been
+ // assigned to a DataCollection.
+ public void internal_clear_membership() {
+ member_of = null;
+ ordinal = DataCollection.INVALID_OBJECT_ORDINAL;
+ }
+
+ // This method is only called by DataCollection, DataSet, and SourceHoldingTank.
+ public inline int64 internal_get_ordinal() {
+ return ordinal;
+ }
+
+ public inline int64 get_object_id() {
+ return object_id;
+ }
+
+ public Value? get_collection_property(string name, Value? def = null) {
+ if (member_of == null)
+ return def;
+
+ Value? result = member_of.get_property(name);
+
+ return (result != null) ? result : def;
+ }
+
+ public void set_collection_property(string name, Value val, ValueEqualFunc? value_equals = null) {
+ if (member_of != null)
+ member_of.set_property(name, val, value_equals);
+ }
+
+ public void clear_collection_property(string name) {
+ if (member_of != null)
+ member_of.clear_property(name);
+ }
+}
+
diff --git a/src/core/DataSet.vala b/src/core/DataSet.vala
new file mode 100644
index 0000000..ebb5500
--- /dev/null
+++ b/src/core/DataSet.vala
@@ -0,0 +1,183 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// DataSet
+//
+// A DataSet is a collection class used for internal implementations of DataCollection
+// and its children. It may be of use to other classes, however.
+//
+// The general purpose of DataSet is to provide low-cost implementations of various collection
+// operations at a cost of internally maintaining its objects in more than one simple collection.
+// contains(), for example, can return a result with hash-table performance while notions of
+// ordering are maintained by a SortedList. The cost is in adding and removing objects (in general,
+// there are others).
+//
+// Because this class has no signalling mechanisms and does not manipulate DataObjects in ways
+// they expect to be manipulated (these features are performed by DataCollection), it's probably
+// best not to use this class. Even in cases of building a list of DataObjects for some quick
+// operation is probably best done by a Gee.ArrayList.
+//
+
+// ComparatorPredicate is used to determine if a re-sort operation is necessary; it has no
+// effect on adding a DataObject to a DataSet in sorted order.
+public delegate bool ComparatorPredicate(DataObject object, Alteration alteration);
+
+public class DataSet {
+ private SortedList<DataObject> list = new SortedList<DataObject>();
+ private Gee.HashSet<DataObject> hash_set = new Gee.HashSet<DataObject>();
+ private unowned Comparator user_comparator = null;
+ private unowned ComparatorPredicate? comparator_predicate = null;
+
+ public DataSet() {
+ reset_comparator();
+ }
+
+ private int64 order_added_comparator(void *a, void *b) {
+ return ((DataObject *) a)->internal_get_ordinal() - ((DataObject *) b)->internal_get_ordinal();
+ }
+
+ private bool order_added_predicate(DataObject object, Alteration alteration) {
+ // ordinals don't change (shouldn't change!) while a part of the DataSet
+ return false;
+ }
+
+ private int64 comparator_wrapper(void *a, void *b) {
+ if (a == b)
+ return 0;
+
+ // use the order-added comparator if the user's compare returns equal, to stabilize the
+ // sort
+ int64 result = 0;
+
+ if (user_comparator != null)
+ result = user_comparator(a, b);
+
+ if (result == 0)
+ result = order_added_comparator(a, b);
+
+ assert(result != 0);
+
+ return result;
+ }
+
+ public bool contains(DataObject object) {
+ return hash_set.contains(object);
+ }
+
+ public inline int get_count() {
+ return list.get_count();
+ }
+
+ public void reset_comparator() {
+ user_comparator = null;
+ comparator_predicate = order_added_predicate;
+ list.resort(order_added_comparator);
+ }
+
+ public unowned Comparator get_comparator() {
+ return user_comparator;
+ }
+
+ public unowned ComparatorPredicate get_comparator_predicate() {
+ return comparator_predicate;
+ }
+
+ public void set_comparator(Comparator user_comparator, ComparatorPredicate? comparator_predicate) {
+ this.user_comparator = user_comparator;
+ this.comparator_predicate = comparator_predicate;
+ list.resort(comparator_wrapper);
+ }
+
+ public Gee.List<DataObject> get_all() {
+ return list.read_only_view_as_list;
+ }
+
+ public DataSet copy() {
+ DataSet clone = new DataSet();
+ clone.list = list.copy();
+ clone.hash_set.add_all(hash_set);
+
+ return clone;
+ }
+
+ public DataObject? get_at(int index) {
+ return list.get_at(index);
+ }
+
+ public int index_of(DataObject object) {
+ return list.locate(object, false);
+ }
+
+ // DataObject's ordinal should be set before adding.
+ public bool add(DataObject object) {
+ if (!list.add(object))
+ return false;
+
+ if (!hash_set.add(object)) {
+ // attempt to back out of previous operation
+ list.remove(object);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ // DataObjects' ordinals should be set before adding.
+ public bool add_many(Gee.Collection<DataObject> objects) {
+ int count = objects.size;
+ if (count == 0)
+ return true;
+
+ if (!list.add_all(objects))
+ return false;
+
+ if (!hash_set.add_all(objects)) {
+ // back out previous operation
+ list.remove_all(objects);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool remove(DataObject object) {
+ bool success = true;
+
+ if (!list.remove(object))
+ success = false;
+
+ if (!hash_set.remove(object))
+ success = false;
+
+ return success;
+ }
+
+ public bool remove_many(Gee.Collection<DataObject> objects) {
+ bool success = true;
+
+ if (!list.remove_all(objects))
+ success = false;
+
+ if (!hash_set.remove_all(objects))
+ success = false;
+
+ return success;
+ }
+
+ // Returns true if the item has moved.
+ public bool resort_object(DataObject object, Alteration? alteration) {
+ if (comparator_predicate != null && alteration != null
+ && !comparator_predicate(object, alteration)) {
+ return false;
+ }
+
+ return list.resort_item(object);
+ }
+}
+
diff --git a/src/core/DataSource.vala b/src/core/DataSource.vala
new file mode 100644
index 0000000..e4d2d34
--- /dev/null
+++ b/src/core/DataSource.vala
@@ -0,0 +1,679 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// DataSource
+//
+// A DataSource is an object that is unique throughout the system. DataSources
+// commonly have external and/or persistent representations, hence they have a notion of being
+// destroyed (versus removed or freed). Several DataViews may exist that reference a single
+// DataSource. Note that DataSources MUST be destroyed (rather than simply removed) from their
+// SourceCollection, and that they MUST be destroyed via their SourceCollection (rather than
+// calling DataSource.destroy() directly.)
+//
+// Destroying a DataSource indicates it should remove all secondary and tertiary structures (such
+// as thumbnails) and any records pointing to its backing store. SourceCollection.destroy_marked()
+// has a parameter indicating if the backing should be destroyed as well; that is when
+// internal_delete_backing() is called.
+//
+// There are no provisions (currently) for a DataSource to be removed from its SourceCollection
+// without destroying its backing and/or secondary and tertiary structures. DataSources are intended
+// to go to the grave with their SourceCollection otherwise. If a need arises for a DataSource to
+// be peaceably removed from its SourceCollection, code will need to be written. SourceSnapshots
+// may be one solution to this problem.
+//
+// Some DataSources cannot be reconstituted (for example, if its backing file is deleted). In
+// that case, dehydrate() should return null. When reconstituted, it is the responsibility of the
+// implementation to ensure an exact clone is produced, minus any details that are not relevant or
+// exposed (such as a database ID).
+//
+// If other DataSources refer to this DataSource, their state will *not* be
+// saved/restored. This must be achieved via other means. However, implementations *should*
+// track when changes to external state would break the proxy and call notify_broken();
+//
+
+public abstract class DataSource : DataObject {
+ protected delegate void ContactSubscriber(DataView view);
+ protected delegate void ContactSubscriberAlteration(DataView view, Alteration alteration);
+
+ private DataView[] subscribers = new DataView[4];
+ private SourceHoldingTank holding_tank = null;
+ private weak SourceCollection unlinked_from_collection = null;
+ private Gee.HashMap<string, Gee.List<string>> backlinks = null;
+ private bool in_contact = false;
+ private bool marked_for_destroy = false;
+ private bool is_destroyed = false;
+
+ // This signal is fired after the DataSource has been unlinked from its SourceCollection.
+ public virtual signal void unlinked(SourceCollection sources) {
+ }
+
+ // This signal is fired after the DataSource has been relinked to a SourceCollection.
+ public virtual signal void relinked(SourceCollection sources) {
+ }
+
+ // This signal is fired at the end of the destroy() chain. The object's state is either fragile
+ // or unusable. It is up to all observers to drop their references to the DataObject.
+ public virtual signal void destroyed() {
+ }
+
+ public DataSource(int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+ }
+
+ ~DataSource() {
+#if TRACE_DTORS
+ debug("DTOR: DataSource %s", dbg_to_string);
+#endif
+ }
+
+ public override void notify_membership_changed(DataCollection? collection) {
+ // DataSources can only be removed once they've been destroyed or unlinked.
+ if (collection == null) {
+ assert(is_destroyed || backlinks != null);
+ } else {
+ assert(!is_destroyed);
+ }
+
+ // If removed from a collection but have backlinks, then that's an unlink.
+ if (collection == null && backlinks != null)
+ notify_unlinked();
+
+ base.notify_membership_changed(collection);
+ }
+
+ public virtual void notify_held_in_tank(SourceHoldingTank? holding_tank) {
+ // this should never be called if part of a collection
+ assert(get_membership() == null);
+
+ // DataSources can only be held in a tank if not already in one, and must be removed from
+ // one before being put in another
+ if (holding_tank != null) {
+ assert(this.holding_tank == null);
+ } else {
+ assert(this.holding_tank != null);
+ }
+
+ this.holding_tank = holding_tank;
+ }
+
+ public override void notify_altered(Alteration alteration) {
+ // re-route this to the SourceHoldingTank if held in one
+ if (holding_tank != null) {
+ holding_tank.internal_notify_altered(this, alteration);
+ } else {
+ contact_subscribers_alteration(alteration);
+
+ base.notify_altered(alteration);
+ }
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise.
+ public virtual void notify_unlinking(SourceCollection collection) {
+ assert(backlinks == null && unlinked_from_collection == null);
+
+ unlinked_from_collection = collection;
+ backlinks = new Gee.HashMap<string, Gee.List<string>>();
+ }
+
+ // This method is called by DataSource. It should not be called otherwise.
+ protected virtual void notify_unlinked() {
+ assert(unlinked_from_collection != null && backlinks != null);
+
+ unlinked(unlinked_from_collection);
+
+ // give the DataSource a chance to persist the link state, if any
+ if (backlinks.size > 0)
+ commit_backlinks(unlinked_from_collection, dehydrate_backlinks());
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise.
+ public virtual void notify_relinking(SourceCollection collection) {
+ assert((backlinks != null) && (unlinked_from_collection == collection));
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise.
+ public virtual void notify_relinked() {
+ assert(backlinks != null && unlinked_from_collection != null);
+
+ SourceCollection relinked_to = unlinked_from_collection;
+ backlinks = null;
+ unlinked_from_collection = null;
+ relinked(relinked_to);
+
+ // have the DataSource delete any persisted link state
+ commit_backlinks(null, null);
+ }
+
+ // Each DataSource has a unique typename. All DataSources of the same type should have the
+ // same typename. This method should be thread-safe.
+ //
+ // NOTE: Because this value may be persisted in various ways, it should not be changed once
+ // defined.
+ public abstract string get_typename();
+
+ // Each DataSource of a particular typename has an instance ID. Many DataSources can have a
+ // typename of "tag" and many DataSources can have an ID of 42, but only one DataSource may
+ // have a typename of "tag" AND an ID of 42. If the DataSource is persisted, this number should
+ // be persisted as well. This method should be thread-safe.
+ public abstract int64 get_instance_id();
+
+ // This returns a string that can be used to uniquely identify the DataSource throughout the
+ // system. This method should be thread-safe.
+ public virtual string get_source_id() {
+ return ("%s-%016" + int64.FORMAT_MODIFIER + "x").printf(get_typename(), get_instance_id());
+ }
+
+ public bool has_backlink(SourceBacklink backlink) {
+ if (backlinks == null)
+ return false;
+
+ Gee.List<string>? values = backlinks.get(backlink.name);
+
+ return values != null ? values.contains(backlink.value) : false;
+ }
+
+ public Gee.List<SourceBacklink>? get_backlinks(string name) {
+ if (backlinks == null)
+ return null;
+
+ Gee.List<string>? values = backlinks.get(name);
+ if (values == null || values.size == 0)
+ return null;
+
+ Gee.List<SourceBacklink> backlinks = new Gee.ArrayList<SourceBacklink>();
+ foreach (string value in values)
+ backlinks.add(new SourceBacklink(name, value));
+
+ return backlinks;
+ }
+
+ public void set_backlink(SourceBacklink backlink) {
+ // can only be called during an unlink operation
+ assert(backlinks != null);
+
+ Gee.List<string> values = backlinks.get(backlink.name);
+ if (values == null) {
+ values = new Gee.ArrayList<string>();
+ backlinks.set(backlink.name, values);
+ }
+
+ values.add(backlink.value);
+
+ SourceCollection? sources = (SourceCollection?) get_membership();
+ if (sources != null)
+ sources.internal_backlink_set(this, backlink);
+ }
+
+ public bool remove_backlink(SourceBacklink backlink) {
+ if (backlinks == null)
+ return false;
+
+ Gee.List<string> values = backlinks.get(backlink.name);
+ if (values == null)
+ return false;
+
+ int original_size = values.size;
+ assert(original_size > 0);
+
+ Gee.Iterator<string> iter = values.iterator();
+ while (iter.next()) {
+ if (iter.get() == backlink.value)
+ iter.remove();
+ }
+
+ if (values.size == 0)
+ backlinks.unset(backlink.name);
+
+ // Commit here because this can come at any time; setting the backlinks should only
+ // happen during an unlink, which commits at the end of the cycle.
+ commit_backlinks(unlinked_from_collection, dehydrate_backlinks());
+
+ SourceCollection? sources = (SourceCollection?) get_membership();
+ if (sources != null)
+ sources.internal_backlink_removed(this, backlink);
+
+ return values.size != original_size;
+ }
+
+ // Base implementation is to do nothing; if DataSource wishes to persist link state across
+ // application sessions, it should do so when this is called. Do not call this base method
+ // when overriding; it will only issue a warning.
+ //
+ // If dehydrated is null, the persisted link state should be deleted. sources will be null
+ // as well.
+ protected virtual void commit_backlinks(SourceCollection? sources, string? dehydrated) {
+ if (sources != null || dehydrated != null)
+ warning("No implementation to commit link state for %s", to_string());
+ }
+
+ private string? dehydrate_backlinks() {
+ if (backlinks == null || backlinks.size == 0)
+ return null;
+
+ StringBuilder builder = new StringBuilder();
+ foreach (string name in backlinks.keys) {
+ Gee.List<string> values = backlinks.get(name);
+ if (values == null || values.size == 0)
+ continue;
+
+ string value_field = "";
+ foreach (string value in values) {
+ if (!is_string_empty(value))
+ value_field += value + "|";
+ }
+
+ if (value_field.length > 0)
+ builder.append("%s=%s\n".printf(name, value_field));
+ }
+
+ return builder.str.length > 0 ? builder.str : null;
+ }
+
+ // If dehydrated is null, this method will still put the DataSource into an unlinked state,
+ // simply without any backlinks to reestablish.
+ public void rehydrate_backlinks(SourceCollection unlinked_from, string? dehydrated) {
+ unlinked_from_collection = unlinked_from;
+ backlinks = new Gee.HashMap<string, Gee.List<string>>();
+
+ if (dehydrated == null)
+ return;
+
+ string[] lines = dehydrated.split("\n");
+ foreach (string line in lines) {
+ if (line.length == 0)
+ continue;
+
+ string[] tokens = line.split("=", 2);
+ if (tokens.length < 2) {
+ warning("Unable to rehydrate \"%s\" for %s: name and value not present", line,
+ to_string());
+
+ continue;
+ }
+
+ string[] decoded_values = tokens[1].split("|");
+ Gee.List<string> values = new Gee.ArrayList<string>();
+ foreach (string value in decoded_values) {
+ if (value != null && value.length > 0)
+ values.add(value);
+ }
+
+ if (values.size > 0)
+ backlinks.set(tokens[0], values);
+ }
+ }
+
+ // If a DataSource cannot produce snapshots, return null.
+ public virtual SourceSnapshot? save_snapshot() {
+ return null;
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise.
+ public void internal_mark_for_destroy() {
+ marked_for_destroy = true;
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise.
+ //
+ // This method deletes whatever backing this DataSource represents. It should either return
+ // false or throw an error if the delete fails.
+ public virtual bool internal_delete_backing() throws Error {
+ return true;
+ }
+
+ // Because of the rules of DataSources, a DataSource is only equal to itself; subclasses
+ // may override this to perform validations and/or assertions
+ public virtual bool equals(DataSource? source) {
+ return (this == source);
+ }
+
+ // This method is called by SourceCollection. It should not be called otherwise. To destroy
+ // a DataSource, destroy it from its SourceCollection.
+ //
+ // Child classes should call this base class to ensure that the collection this object is
+ // a member of is notified and the signal is properly called. The collection will remove this
+ // object automatically.
+ public virtual void destroy() {
+ assert(marked_for_destroy);
+
+ // mark as destroyed
+ is_destroyed = true;
+
+ // unsubscribe all subscribers
+ for (int ctr = 0; ctr < subscribers.length; ctr++) {
+ if (subscribers[ctr] != null) {
+ DataView view = subscribers[ctr];
+ subscribers[ctr] = null;
+
+ view.notify_unsubscribed(this);
+ }
+ }
+
+ // propagate the signal
+ destroyed();
+ }
+
+ // This method can be used to destroy a DataSource before it's added to a SourceCollection
+ // or has been unlinked from one. It should not be used otherwise. (In particular, don't
+ // automate destroys by removing and then calling this method -- that will happen automatically.)
+ // To destroy a DataSource already integrated into a SourceCollection, call
+ // SourceCollection.destroy_marked(). Returns true if the operation completed successfully,
+ // otherwise it will return false.
+ public bool destroy_orphan(bool delete_backing) {
+ bool ret = true;
+ if (delete_backing) {
+ try {
+ ret = internal_delete_backing();
+ if (!ret)
+ warning("Unable to delete backing for %s", to_string());
+
+ } catch (Error err) {
+ warning("Unable to delete backing for %s: %s", to_string(), err.message);
+ ret = false;
+ }
+ }
+
+ internal_mark_for_destroy();
+ destroy();
+
+ if (unlinked_from_collection != null)
+ unlinked_from_collection.notify_unlinked_destroyed(this);
+
+ return ret;
+ }
+
+ // DataViews subscribe to the DataSource to inform it of their existence. Not only does this
+ // allow for signal reflection (i.e. DataSource.altered -> DataView.altered) it also makes
+ // them first-in-line for notification of destruction, so they can remove themselves from
+ // their ViewCollections automatically.
+ //
+ // This method is only called by DataView.
+ public void internal_subscribe(DataView view) {
+ assert(!in_contact);
+
+ for (int ctr = 0; ctr < subscribers.length; ctr++) {
+ if (subscribers[ctr] == null) {
+ subscribers[ctr] = view;
+
+ return;
+ }
+ }
+
+ subscribers += view;
+ }
+
+ // This method is only called by DataView. NOTE: This method does NOT call
+ // DataView.notify_unsubscribed(), as it's assumed the DataView itself will do so if appropriate.
+ public void internal_unsubscribe(DataView view) {
+ assert(!in_contact);
+
+ for (int ctr = 0; ctr < subscribers.length; ctr++) {
+ if (subscribers[ctr] == view) {
+ subscribers[ctr] = null;
+
+ return;
+ }
+ }
+ }
+
+ protected void contact_subscribers(ContactSubscriber contact_subscriber) {
+ assert(!in_contact);
+
+ in_contact = true;
+ for (int ctr = 0; ctr < subscribers.length; ctr++) {
+ if (subscribers[ctr] != null)
+ contact_subscriber(subscribers[ctr]);
+ }
+ in_contact = false;
+ }
+
+ protected void contact_subscribers_alteration(Alteration alteration) {
+ assert(!in_contact);
+
+ in_contact = true;
+ for (int ctr = 0; ctr < subscribers.length; ctr++) {
+ if (subscribers[ctr] != null)
+ subscribers[ctr].notify_altered(alteration);
+ }
+ in_contact = false;
+ }
+}
+
+public abstract class SourceSnapshot {
+ private bool snapshot_broken = false;
+
+ // This is signalled when the DataSource, for whatever reason, can no longer be reconstituted
+ // from this Snapshot.
+ public virtual signal void broken() {
+ }
+
+ public virtual void notify_broken() {
+ snapshot_broken = true;
+
+ broken();
+ }
+
+ public bool is_broken() {
+ return snapshot_broken;
+ }
+}
+
+// Link state name may not contain the equal sign ("="). Link names and values may not contain the
+// pipe-character ("|"). Both will be stripped of leading and trailing whitespace. This may
+// affect retrieval.
+public class SourceBacklink {
+ private string _name;
+ private string _value;
+
+ public string name {
+ get {
+ return _name;
+ }
+ }
+
+ public string value {
+ get {
+ return _value;
+ }
+ }
+
+ // This only applies if the SourceBacklink comes from a DataSource.
+ public string typename {
+ get {
+ return _name;
+ }
+ }
+
+ // This only applies if the SourceBacklink comes from a DataSource.
+ public int64 instance_id {
+ get {
+ return int64.parse(_value);
+ }
+ }
+
+ public SourceBacklink(string name, string value) {
+ assert(validate_name_value(name, value));
+
+ _name = name.strip();
+ _value = value.strip();
+ }
+
+ public SourceBacklink.from_source(DataSource source) {
+ _name = source.get_typename().strip();
+ _value = source.get_instance_id().to_string().strip();
+
+ assert(validate_name_value(_name, _value));
+ }
+
+ private static bool validate_name_value(string name, string value) {
+ return !name.contains("=") && !name.contains("|") && !value.contains("|");
+ }
+
+ public string to_string() {
+ return "Backlink %s=%s".printf(name, value);
+ }
+
+ public static uint hash_func(SourceBacklink? backlink) {
+ return str_hash(backlink._name) ^ str_hash(backlink._value);
+ }
+
+ public static bool equal_func(SourceBacklink? alink, SourceBacklink? blink) {
+ return str_equal(alink._name, blink._name) && str_equal(alink._value, blink._value);
+ }
+}
+
+//
+// SourceProxy
+//
+// A SourceProxy allows for a DataSource's state to be maintained in memory regardless of
+// whether or not the DataSource has been destroyed. If a user of SourceProxy
+// requests the represented object and it is still in memory, it will be returned. If not, it
+// is reconstituted and the new DataSource is returned.
+//
+// Several SourceProxy can be wrapped around the same DataSource. If the DataSource is
+// destroyed, all Proxys drop their reference. When a Proxy reconstitutes the DataSource, all
+// will be aware of it and re-establish their reference.
+//
+// The snapshot that is maintained is the snapshot in regards to the time of the Proxy's creation.
+// Proxys do not update their snapshot thereafter. If a snapshot reports it is broken, the
+// Proxy will not reconstitute the DataSource and get_source() will return null thereafter.
+//
+// There is no preferential treatment in regards to snapshots of the DataSources. The first
+// Proxy to reconstitute the DataSource wins.
+//
+
+public abstract class SourceProxy {
+ private int64 object_id;
+ private string source_string;
+ private DataSource source;
+ private SourceSnapshot snapshot;
+ private SourceCollection membership;
+
+ // This is only signalled by the SourceProxy that reconstituted the DataSource. All
+ // Proxys will signal when this occurs.
+ public virtual signal void reconstituted(DataSource source) {
+ }
+
+ // This is signalled when the SourceProxy has dropped a destroyed DataSource. Calling
+ // get_source() will force it to be reconstituted.
+ public virtual signal void dehydrated() {
+ }
+
+ // This is signalled when the held DataSourceSnapshot reports it is broken. The DataSource
+ // will not be reconstituted and get_source() will return null thereafter.
+ public virtual signal void broken() {
+ }
+
+ public SourceProxy(DataSource source) {
+ object_id = source.get_object_id();
+ source_string = source.to_string();
+
+ snapshot = source.save_snapshot();
+ assert(snapshot != null);
+ snapshot.broken.connect(on_snapshot_broken);
+
+ set_source(source);
+
+ membership = (SourceCollection) source.get_membership();
+ assert(membership != null);
+ membership.items_added.connect(on_source_added);
+ }
+
+ ~SourceProxy() {
+ drop_source();
+ membership.items_added.disconnect(on_source_added);
+ }
+
+ public abstract DataSource reconstitute(int64 object_id, SourceSnapshot snapshot);
+
+ public virtual void notify_reconstituted(DataSource source) {
+ reconstituted(source);
+ }
+
+ public virtual void notify_dehydrated() {
+ dehydrated();
+ }
+
+ public virtual void notify_broken() {
+ broken();
+ }
+
+ private void on_snapshot_broken() {
+ drop_source();
+
+ notify_broken();
+ }
+
+ private void set_source(DataSource source) {
+ drop_source();
+
+ this.source = source;
+ source.destroyed.connect(on_destroyed);
+ }
+
+ private void drop_source() {
+ if (source == null)
+ return;
+
+ source.destroyed.disconnect(on_destroyed);
+ source = null;
+ }
+
+ public DataSource? get_source() {
+ if (snapshot.is_broken())
+ return null;
+
+ if (source != null)
+ return source;
+
+ // without the source, need to reconstitute it and re-add to its original SourceCollection
+ // it should also automatically add itself to its original collection (which is trapped
+ // in on_source_added)
+ DataSource new_source = reconstitute(object_id, snapshot);
+ if (source != new_source)
+ source = new_source;
+ if (object_id != source.get_object_id())
+ object_id = new_source.get_object_id();
+ assert(source.get_object_id() == object_id);
+ assert(membership.contains(source));
+
+ return source;
+ }
+
+ private void on_destroyed() {
+ assert(source != null);
+
+ // drop the reference ... will need to reconstitute later if requested
+ drop_source();
+
+ notify_dehydrated();
+ }
+
+ private void on_source_added(Gee.Iterable<DataObject> added) {
+ // only interested in new objects when the proxied object has gone away
+ if (source != null)
+ return;
+
+ foreach (DataObject object in added) {
+ // looking for new objects with original source object's id
+ if (object.get_object_id() != object_id)
+ continue;
+
+ // this is it; stash for future use
+ set_source((DataSource) object);
+
+ notify_reconstituted((DataSource) object);
+
+ break;
+ }
+ }
+}
+
+public interface Proxyable : Object {
+ public abstract SourceProxy get_proxy();
+}
+
diff --git a/src/core/DataSourceTypes.vala b/src/core/DataSourceTypes.vala
new file mode 100644
index 0000000..9f23ac6
--- /dev/null
+++ b/src/core/DataSourceTypes.vala
@@ -0,0 +1,108 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// Media sources
+//
+
+public abstract class ThumbnailSource : DataSource {
+ public virtual signal void thumbnail_altered() {
+ }
+
+ public ThumbnailSource(int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+ }
+
+ public virtual void notify_thumbnail_altered() {
+ // fire signal on self
+ thumbnail_altered();
+
+ // signal reflection to DataViews
+ contact_subscribers(subscriber_thumbnail_altered);
+ }
+
+ private void subscriber_thumbnail_altered(DataView view) {
+ ((ThumbnailView) view).notify_thumbnail_altered();
+ }
+
+ public abstract Gdk.Pixbuf? get_thumbnail(int scale) throws Error;
+
+ // get_thumbnail( ) may return a cached pixbuf; create_thumbnail( ) is guaranteed to create
+ // a new pixbuf (e.g., by the source loading, decoding, and scaling image data)
+ public abstract Gdk.Pixbuf? create_thumbnail(int scale) throws Error;
+
+ // A ThumbnailSource may use another ThumbnailSource as its representative. It's up to the
+ // subclass to forward on the appropriate methods to this ThumbnailSource. But, since multiple
+ // ThumbnailSources may be referring to a single ThumbnailSource, this allows for that to be
+ // detected and optimized (in caching).
+ //
+ // Note that it's the responsibility of this ThumbnailSource to fire "thumbnail-altered" if its
+ // representative does the same.
+ //
+ // Default behavior is to return the ID of this.
+ public virtual string get_representative_id() {
+ return get_source_id();
+ }
+
+ public abstract PhotoFileFormat get_preferred_thumbnail_format();
+}
+
+public abstract class PhotoSource : MediaSource {
+ public PhotoSource(int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+ }
+
+ public abstract PhotoMetadata? get_metadata();
+
+ public abstract Gdk.Pixbuf get_pixbuf(Scaling scaling) throws Error;
+}
+
+public abstract class VideoSource : MediaSource {
+}
+
+//
+// EventSource
+//
+
+public abstract class EventSource : ThumbnailSource {
+ public EventSource(int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+ }
+
+ public abstract time_t get_start_time();
+
+ public abstract time_t get_end_time();
+
+ public abstract uint64 get_total_filesize();
+
+ public abstract int get_media_count();
+
+ public abstract Gee.Collection<MediaSource> get_media();
+
+ public abstract string? get_comment();
+
+ public abstract bool set_comment(string? comment);
+}
+
+//
+// ContainerSource
+//
+
+public interface ContainerSource : DataSource {
+ public abstract bool has_links();
+
+ public abstract SourceBacklink get_backlink();
+
+ public abstract void break_link(DataSource source);
+
+ public abstract void break_link_many(Gee.Collection<DataSource> sources);
+
+ public abstract void establish_link(DataSource source);
+
+ public abstract void establish_link_many(Gee.Collection<DataSource> sources);
+}
+
+
diff --git a/src/core/DataView.vala b/src/core/DataView.vala
new file mode 100644
index 0000000..07cd4fc
--- /dev/null
+++ b/src/core/DataView.vala
@@ -0,0 +1,132 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class DataView : DataObject {
+ private DataSource source;
+ private bool selected = false;
+ private bool visible = true;
+
+ // Indicates that the selection state has changed.
+ public virtual signal void state_changed(bool selected) {
+ }
+
+ // Indicates the visible state has changed.
+ public virtual signal void visibility_changed(bool visible) {
+ }
+
+ // Indicates that the display (what is seen by the user) of the DataView has changed.
+ public virtual signal void view_altered() {
+ }
+
+ // Indicates that the geometry of the DataView has changed (which implies the view has altered,
+ // but only in that the same elements have changed size).
+ public virtual signal void geometry_altered() {
+ }
+
+ public virtual signal void unsubscribed(DataSource source) {
+ }
+
+ public DataView(DataSource source) {
+ this.source = source;
+
+ // subscribe to the DataSource, which sets up signal reflection and gives the DataView
+ // first notification of destruction.
+ source.internal_subscribe(this);
+ }
+
+ ~DataView() {
+#if TRACE_DTORS
+ debug("DTOR: DataView %s", dbg_to_string);
+#endif
+ source.internal_unsubscribe(this);
+ }
+
+ public override string get_name() {
+ return "View of %s".printf(source.get_name());
+ }
+
+ public override string to_string() {
+ return "DataView %s [DataSource %s]".printf(get_name(), source.to_string());
+ }
+
+ public DataSource get_source() {
+ return source;
+ }
+
+ public bool is_selected() {
+ return selected;
+ }
+
+ // This method is only called by ViewCollection.
+ public void internal_set_selected(bool selected) {
+ if (this.selected == selected)
+ return;
+
+ this.selected = selected;
+ state_changed(selected);
+ }
+
+ // This method is only called by ViewCollection. Returns the toggled state.
+ public bool internal_toggle() {
+ selected = !selected;
+ state_changed(selected);
+
+ return selected;
+ }
+
+ public bool is_visible() {
+ return visible;
+ }
+
+ // This method is only called by ViewCollection.
+ public void internal_set_visible(bool visible) {
+ if (this.visible == visible)
+ return;
+
+ this.visible = visible;
+ visibility_changed(visible);
+ }
+
+ protected virtual void notify_view_altered() {
+ // impossible when not visible
+ if (!visible)
+ return;
+
+ ViewCollection vc = get_membership() as ViewCollection;
+ if (vc != null) {
+ if (!vc.are_notifications_frozen())
+ view_altered();
+
+ // notify ViewCollection in any event
+ vc.internal_notify_view_altered(this);
+ } else {
+ view_altered();
+ }
+ }
+
+ protected virtual void notify_geometry_altered() {
+ // impossible when not visible
+ if (!visible)
+ return;
+
+ ViewCollection vc = get_membership() as ViewCollection;
+ if (vc != null) {
+ if (!vc.are_notifications_frozen())
+ geometry_altered();
+
+ // notify ViewCollection in any event
+ vc.internal_notify_geometry_altered(this);
+ } else {
+ geometry_altered();
+ }
+ }
+
+ // This is only called by DataSource
+ public virtual void notify_unsubscribed(DataSource source) {
+ unsubscribed(source);
+ }
+}
+
diff --git a/src/core/DataViewTypes.vala b/src/core/DataViewTypes.vala
new file mode 100644
index 0000000..fac7602
--- /dev/null
+++ b/src/core/DataViewTypes.vala
@@ -0,0 +1,50 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class ThumbnailView : DataView {
+ public virtual signal void thumbnail_altered() {
+ }
+
+ public ThumbnailView(ThumbnailSource source) {
+ base(source);
+ }
+
+ public virtual void notify_thumbnail_altered() {
+ // fire signal on self
+ thumbnail_altered();
+ }
+}
+
+public class PhotoView : ThumbnailView {
+ public PhotoView(PhotoSource source) {
+ base(source);
+ }
+
+ public PhotoSource get_photo_source() {
+ return (PhotoSource) get_source();
+ }
+}
+
+public class VideoView : ThumbnailView {
+ public VideoView(VideoSource source) {
+ base(source);
+ }
+
+ public VideoSource get_video_source() {
+ return (VideoSource) get_source();
+ }
+}
+
+public class EventView : ThumbnailView {
+ public EventView(EventSource source) {
+ base(source);
+ }
+
+ public EventSource get_event_source() {
+ return (EventSource) get_source();
+ }
+}
+
diff --git a/src/core/DatabaseSourceCollection.vala b/src/core/DatabaseSourceCollection.vala
new file mode 100644
index 0000000..0c704bb
--- /dev/null
+++ b/src/core/DatabaseSourceCollection.vala
@@ -0,0 +1,86 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public delegate int64 GetSourceDatabaseKey(DataSource source);
+
+// A DatabaseSourceCollection is a SourceCollection that understands database keys (IDs) and the
+// nature that a row in a database can only be instantiated once in the system, and so it tracks
+// their existence in a map so they can be fetched by their key.
+//
+// TODO: This would be better implemented as an observer class, possibly with an interface to
+// force subclasses to provide a fetch_by_key() method.
+public abstract class DatabaseSourceCollection : SourceCollection {
+ private unowned GetSourceDatabaseKey source_key_func;
+ private Gee.HashMap<int64?, DataSource> map = new Gee.HashMap<int64?, DataSource>(int64_hash,
+ int64_equal);
+
+ public DatabaseSourceCollection(string name, GetSourceDatabaseKey source_key_func) {
+ base (name);
+
+ this.source_key_func = source_key_func;
+ }
+
+ public override void notify_items_added(Gee.Iterable<DataObject> added) {
+ foreach (DataObject object in added) {
+ DataSource source = (DataSource) object;
+ int64 key = source_key_func(source);
+
+ assert(!map.has_key(key));
+
+ map.set(key, source);
+ }
+
+ base.notify_items_added(added);
+ }
+
+ public override void notify_items_removed(Gee.Iterable<DataObject> removed) {
+ foreach (DataObject object in removed) {
+ int64 key = source_key_func((DataSource) object);
+
+ bool is_removed = map.unset(key);
+ assert(is_removed);
+ }
+
+ base.notify_items_removed(removed);
+ }
+
+ protected DataSource fetch_by_key(int64 key) {
+ return map.get(key);
+ }
+}
+
+public class DatabaseSourceHoldingTank : SourceHoldingTank {
+ private unowned GetSourceDatabaseKey get_key;
+ private Gee.HashMap<int64?, DataSource> map = new Gee.HashMap<int64?, DataSource>(int64_hash,
+ int64_equal);
+
+ public DatabaseSourceHoldingTank(SourceCollection sources,
+ SourceHoldingTank.CheckToKeep check_to_keep, GetSourceDatabaseKey get_key) {
+ base (sources, check_to_keep);
+
+ this.get_key = get_key;
+ }
+
+ public DataSource? get_by_id(int64 id) {
+ return map.get(id);
+ }
+
+ protected override void notify_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ if (added != null) {
+ foreach (DataSource source in added)
+ map.set(get_key(source), source);
+ }
+
+ if (removed != null) {
+ foreach (DataSource source in removed)
+ map.unset(get_key(source));
+ }
+
+ base.notify_contents_altered(added, removed);
+ }
+}
+
diff --git a/src/core/SourceCollection.vala b/src/core/SourceCollection.vala
new file mode 100644
index 0000000..020df0e
--- /dev/null
+++ b/src/core/SourceCollection.vala
@@ -0,0 +1,221 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public abstract class SourceCollection : DataCollection {
+ private class DestroyCounter : Object {
+ public Marker remove_marker;
+ public Gee.ArrayList<DataSource> notify_list = new Gee.ArrayList<DataSource>();
+ public Gee.ArrayList<MediaSource> not_removed = new Gee.ArrayList<MediaSource>();
+
+ public DestroyCounter(Marker remove_marker) {
+ this.remove_marker = remove_marker;
+ }
+ }
+
+ // When this signal is fired, the items are about to be unlinked from the collection. The
+ // appropriate remove signals will follow.
+ public virtual signal void items_unlinking(Gee.Collection<DataSource> unlinking) {
+ }
+
+ // When this signal is fired, the items are being relinked to the collection. The appropriate
+ // add signals have already been fired.
+ public virtual signal void items_relinked(Gee.Collection<DataSource> relinked) {
+ }
+
+ // When this signal is fired, the item is still part of the collection but its own destroy()
+ // has already been called.
+ public virtual signal void item_destroyed(DataSource source) {
+ }
+
+ // When this signal is fired, the item is still part of the collection but its own destroy()
+ // has already been called.
+ public virtual signal void items_destroyed(Gee.Collection<DataSource> destroyed) {
+ }
+
+ // When this signal is fired, the unlinked item has been unlinked from the collection previously
+ // and its destroy() has been called.
+ public virtual signal void unlinked_destroyed(DataSource source) {
+ }
+
+ // When this signal is fired, the backlink to the ContainerSource has already been removed.
+ public virtual signal void backlink_removed(SourceBacklink backlink,
+ Gee.Collection<DataSource> sources) {
+ }
+
+ private Gee.MultiMap<SourceBacklink, DataSource>? backlinks = null;
+
+ public SourceCollection(string name) {
+ base (name);
+ }
+
+ public abstract bool holds_type_of_source(DataSource source);
+
+ protected virtual void notify_items_unlinking(Gee.Collection<DataSource> unlinking) {
+ items_unlinking(unlinking);
+ }
+
+ protected virtual void notify_items_relinked(Gee.Collection<DataSource> relinked) {
+ items_relinked(relinked);
+ }
+
+ protected virtual void notify_item_destroyed(DataSource source) {
+ item_destroyed(source);
+ }
+
+ protected virtual void notify_items_destroyed(Gee.Collection<DataSource> destroyed) {
+ items_destroyed(destroyed);
+ }
+
+ // This is only called by DataSource.
+ public virtual void notify_unlinked_destroyed(DataSource unlinked) {
+ unlinked_destroyed(unlinked);
+ }
+
+ protected virtual void notify_backlink_removed(SourceBacklink backlink,
+ Gee.Collection<DataSource> sources) {
+ backlink_removed(backlink, sources);
+ }
+
+ protected override bool valid_type(DataObject object) {
+ return object is DataSource;
+ }
+
+ // Destroy all marked items and optionally have them delete their backing. Returns the
+ // number of items which failed to delete their backing (if delete_backing is true) or zero.
+ public int destroy_marked(Marker marker, bool delete_backing, ProgressMonitor? monitor = null,
+ Gee.List<MediaSource>? not_removed = null) {
+ DestroyCounter counter = new DestroyCounter(start_marking());
+
+ if (delete_backing)
+ act_on_marked(marker, destroy_and_delete_source, monitor, counter);
+ else
+ act_on_marked(marker, destroy_source, monitor, counter);
+
+ // notify of destruction
+ foreach (DataSource source in counter.notify_list)
+ notify_item_destroyed(source);
+ notify_items_destroyed(counter.notify_list);
+
+ // remove once all destroyed
+ remove_marked(counter.remove_marker);
+
+ if (null != not_removed) {
+ not_removed.add_all(counter.not_removed);
+ }
+
+ return counter.not_removed.size;
+ }
+
+ private bool destroy_and_delete_source(DataObject object, Object? user) {
+ bool success = false;
+ try {
+ success = ((DataSource) object).internal_delete_backing();
+ } catch (Error err) {
+ success = false;
+ }
+
+ if (!success && object is MediaSource) {
+ ((DestroyCounter) user).not_removed.add((MediaSource) object);
+ }
+
+ return destroy_source(object, user) && success;
+ }
+
+ private bool destroy_source(DataObject object, Object? user) {
+ DataSource source = (DataSource) object;
+
+ source.internal_mark_for_destroy();
+ source.destroy();
+
+ ((DestroyCounter) user).remove_marker.mark(source);
+ ((DestroyCounter) user).notify_list.add(source);
+
+ return true;
+ }
+
+ // This is only called by DataSource.
+ public void internal_backlink_set(DataSource source, SourceBacklink backlink) {
+ if (backlinks == null) {
+ backlinks = new Gee.HashMultiMap<SourceBacklink, DataSource>(SourceBacklink.hash_func,
+ SourceBacklink.equal_func);
+ }
+
+ backlinks.set(backlink, source);
+ }
+
+ // This is only called by DataSource.
+ public void internal_backlink_removed(DataSource source, SourceBacklink backlink) {
+ assert(backlinks != null);
+
+ bool removed = backlinks.remove(backlink, source);
+ assert(removed);
+ }
+
+ public virtual bool has_backlink(SourceBacklink backlink) {
+ return backlinks != null ? backlinks.contains(backlink) : false;
+ }
+
+ public Gee.Collection<DataSource>? unlink_marked(Marker marker, ProgressMonitor? monitor = null) {
+ Gee.ArrayList<DataSource> list = new Gee.ArrayList<DataSource>();
+ act_on_marked(marker, prepare_for_unlink, monitor, list);
+
+ if (list.size == 0)
+ return null;
+
+ notify_items_unlinking(list);
+
+ remove_marked(mark_many(list));
+
+ return list;
+ }
+
+ private bool prepare_for_unlink(DataObject object, Object? user) {
+ DataSource source = (DataSource) object;
+
+ source.notify_unlinking(this);
+ ((Gee.List<DataSource>) user).add(source);
+
+ return true;
+ }
+
+ public void relink(DataSource source) {
+ source.notify_relinking(this);
+
+ add(source);
+ notify_items_relinked((Gee.Collection<DataSource>) get_singleton(source));
+
+ source.notify_relinked();
+ }
+
+ public void relink_many(Gee.Collection<DataSource> relink) {
+ if (relink.size == 0)
+ return;
+
+ foreach (DataSource source in relink)
+ source.notify_relinking(this);
+
+ add_many(relink);
+ notify_items_relinked(relink);
+
+ foreach (DataSource source in relink)
+ source.notify_relinked();
+ }
+
+ public virtual void remove_backlink(SourceBacklink backlink) {
+ if (backlinks == null)
+ return;
+
+ // create copy because the DataSources will be removing the backlinks
+ Gee.ArrayList<DataSource> sources = new Gee.ArrayList<DataSource>();
+ sources.add_all(backlinks.get(backlink));
+
+ foreach (DataSource source in sources)
+ source.remove_backlink(backlink);
+
+ notify_backlink_removed(backlink, sources);
+ }
+}
+
diff --git a/src/core/SourceHoldingTank.vala b/src/core/SourceHoldingTank.vala
new file mode 100644
index 0000000..adfec8b
--- /dev/null
+++ b/src/core/SourceHoldingTank.vala
@@ -0,0 +1,209 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// A SourceHoldingTank is similar to the holding tank used by ContainerSourceCollection, but for
+// non-ContainerSources to be held offline from their natural SourceCollection (i.e. PhotoSources
+// being held in a trashcan, for example). It is *not* a DataCollection (important!), but rather
+// a signalled collection that moves DataSources to and from their SourceCollection.
+//
+// DataSources can be shuttled from their SourceCollection to the SourceHoldingTank manually
+// (via unlink_and_hold) or can be automatically moved by installing a HoldingPredicate.
+// Only one HoldingConditional may be installed. Because of assertions in the methods, it's unwise
+// to use more than one method. add() and add_many() should ONLY be used for DataSources not
+// first installed in their SourceCollection (i.e. they're born in the SourceHoldingTank).
+//
+// NOTE: DataSources should never be in more than one SourceHoldingTank. No tests are performed
+// here to verify this. This is why a filter/predicate method (which could automatically move
+// them in as they're altered) is not offered; there's no easy way to keep DataSources from being
+// moved into more than one holding tank, or which should have preference. The CheckToRemove
+// predicate is offered only to know when to release them.
+
+public class SourceHoldingTank {
+ // Return true if the DataSource should remain in the SourceHoldingTank, false otherwise.
+ public delegate bool CheckToKeep(DataSource source, Alteration alteration);
+
+ private SourceCollection sources;
+ private unowned CheckToKeep check_to_keep;
+ private DataSet tank = new DataSet();
+ private Gee.HashSet<DataSource> relinks = new Gee.HashSet<DataSource>();
+ private Gee.HashSet<DataSource> unlinking = new Gee.HashSet<DataSource>();
+ private int64 ordinal = 0;
+
+ public virtual signal void contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ }
+
+ public SourceHoldingTank(SourceCollection sources, CheckToKeep check_to_keep) {
+ this.sources = sources;
+ this.check_to_keep = check_to_keep;
+
+ this.sources.item_destroyed.connect(on_source_destroyed);
+ this.sources.thawed.connect(on_source_collection_thawed);
+ }
+
+ ~SourceHoldingTank() {
+ sources.item_destroyed.disconnect(on_source_destroyed);
+ sources.thawed.disconnect(on_source_collection_thawed);
+ }
+
+ protected virtual void notify_contents_altered(Gee.Collection<DataSource>? added,
+ Gee.Collection<DataSource>? removed) {
+ if (added != null) {
+ foreach (DataSource source in added)
+ source.notify_held_in_tank(this);
+ }
+
+ if (removed != null) {
+ foreach (DataSource source in removed)
+ source.notify_held_in_tank(null);
+ }
+
+ contents_altered(added, removed);
+ }
+
+ public int get_count() {
+ return tank.get_count();
+ }
+
+ public Gee.Collection<DataSource> get_all() {
+ return (Gee.Collection<DataSource>) tank.get_all();
+ }
+
+ public bool contains(DataSource source) {
+ return tank.contains(source) || unlinking.contains(source);
+ }
+
+ // Only use for DataSources that have not been installed in their SourceCollection.
+ public void add_many(Gee.Collection<DataSource> many) {
+ if (many.size == 0)
+ return;
+
+ foreach (DataSource source in many)
+ source.internal_set_ordinal(ordinal++);
+
+ bool added = tank.add_many(many);
+ assert(added);
+
+ notify_contents_altered(many, null);
+ }
+
+ // Do not pass in DataSources which have already been unlinked, including into this holding
+ // tank.
+ public void unlink_and_hold(Gee.Collection<DataSource> unlink) {
+ if (unlink.size == 0)
+ return;
+
+ // store in the unlinking collection to guard against reentrancy
+ unlinking.add_all(unlink);
+
+ sources.unlink_marked(sources.mark_many(unlink));
+
+ foreach (DataSource source in unlink)
+ source.internal_set_ordinal(ordinal++);
+
+ bool added = tank.add_many(unlink);
+ assert(added);
+
+ // remove from the unlinking pool, as they're now unlinked
+ unlinking.remove_all(unlink);
+
+ notify_contents_altered(unlink, null);
+ }
+
+ public bool has_backlink(SourceBacklink backlink) {
+ int count = tank.get_count();
+ for (int ctr = 0; ctr < count; ctr++) {
+ if (((DataSource) tank.get_at(ctr)).has_backlink(backlink))
+ return true;
+ }
+
+ return false;
+ }
+
+ public void remove_backlink(SourceBacklink backlink) {
+ int count = tank.get_count();
+ for (int ctr = 0; ctr < count; ctr++)
+ ((DataSource) tank.get_at(ctr)).remove_backlink(backlink);
+ }
+
+ public void destroy_orphans(Gee.List<DataSource> destroy, bool delete_backing,
+ ProgressMonitor? monitor = null, Gee.List<DataSource>? not_removed = null) {
+ if (destroy.size == 0)
+ return;
+
+ bool removed = tank.remove_many(destroy);
+ assert(removed);
+
+ notify_contents_altered(null, destroy);
+
+ int count = destroy.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ DataSource source = destroy.get(ctr);
+ if (!source.destroy_orphan(delete_backing)) {
+ if (null != not_removed) {
+ not_removed.add(source);
+ }
+ }
+ if (monitor != null)
+ monitor(ctr + 1, count);
+ }
+ }
+
+ private void on_source_destroyed(DataSource source) {
+ if (!tank.contains(source))
+ return;
+
+ bool removed = tank.remove(source);
+ assert(removed);
+
+ notify_contents_altered(null, new SingletonCollection<DataSource>(source));
+ }
+
+ // This is only called by DataSource
+ public void internal_notify_altered(DataSource source, Alteration alteration) {
+ if (!tank.contains(source)) {
+ debug("SourceHoldingTank.internal_notify_altered called for %s not stored in %s",
+ source.to_string(), to_string());
+
+ return;
+ }
+
+ // see if it should stay put
+ if (check_to_keep(source, alteration))
+ return;
+
+ bool removed = tank.remove(source);
+ assert(removed);
+
+ if (sources.are_notifications_frozen()) {
+ relinks.add(source);
+
+ return;
+ }
+
+ notify_contents_altered(null, new SingletonCollection<DataSource>(source));
+
+ sources.relink(source);
+ }
+
+ private void on_source_collection_thawed() {
+ if (relinks.size == 0)
+ return;
+
+ // swap out to protect against reentrancy
+ Gee.HashSet<DataSource> copy = relinks;
+ relinks = new Gee.HashSet<DataSource>();
+
+ notify_contents_altered(null, copy);
+
+ sources.relink_many(copy);
+ }
+
+ public string to_string() {
+ return "SourceHoldingTank @ 0x%p".printf(this);
+ }
+}
+
diff --git a/src/core/SourceInterfaces.vala b/src/core/SourceInterfaces.vala
new file mode 100644
index 0000000..59956d3
--- /dev/null
+++ b/src/core/SourceInterfaces.vala
@@ -0,0 +1,44 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// See the note in MediaInterfaces.vala for some thoughts on the theory of expanding Shotwell's
+// features via interfaces rather than class heirarchies.
+
+// Indexable DataSources provide raw strings that may be searched against (and, in the future,
+// indexed) for free-text search queries. DataSources implementing Indexable must prepare and
+// store (i.e. cache) these strings using prepare_indexable_string(s), as preparing the strings
+// for each call is expensive.
+//
+// When the indexable string has changed, the object should fire an alteration of
+// "indexable:keywords". The prepare methods will not do this.
+
+public interface Indexable : DataSource {
+ public abstract unowned string? get_indexable_keywords();
+
+ public static string? prepare_indexable_string(string? str) {
+ if(is_string_empty(str))
+ return null;
+ return String.remove_diacritics(str.down());
+ }
+
+ public static string? prepare_indexable_strings(string[]? strs) {
+ if (strs == null || strs.length == 0)
+ return null;
+
+ StringBuilder builder = new StringBuilder();
+ int ctr = 0;
+ do {
+ if (!is_string_empty(strs[ctr])) {
+ builder.append(strs[ctr].down());
+ if (ctr < strs.length - 1)
+ builder.append_c(' ');
+ }
+ } while (++ctr < strs.length);
+
+ return !is_string_empty(builder.str) ? builder.str : null;
+ }
+}
+
diff --git a/src/core/Tracker.vala b/src/core/Tracker.vala
new file mode 100644
index 0000000..e72992b
--- /dev/null
+++ b/src/core/Tracker.vala
@@ -0,0 +1,216 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Core {
+
+// A TrackerAccumulator is called by Tracker indicating when a DataObject should be included or
+// unincluded in its accumulated data. All methods return true if their data has changed,
+// indicating that the Tracker's "updated" signal should be fired.
+public interface TrackerAccumulator : Object {
+ public abstract bool include(DataObject object);
+
+ public abstract bool uninclude(DataObject object);
+
+ public abstract bool altered(DataObject object, Alteration alteration);
+}
+
+// A Tracker monitors a DataCollection and reports to an installed TrackerAccumulator when objects
+// are available and unavailable. This simplifies connecting to the DataCollection manually to
+// monitoring availability (or subclassing for similar reasons, which may not always be available).
+public class Tracker {
+ protected delegate bool IncludeUnincludeObject(DataObject object);
+
+ private DataCollection collection;
+ private Gee.Collection<DataObject>? initial;
+ private TrackerAccumulator? acc = null;
+
+ public virtual signal void updated() {
+ }
+
+ public Tracker(DataCollection collection, Gee.Collection<DataObject>? initial = null) {
+ this.collection = collection;
+ this.initial = initial;
+ }
+
+ ~Tracker() {
+ if (acc != null) {
+ collection.items_added.disconnect(on_items_added);
+ collection.items_removed.disconnect(on_items_removed);
+ collection.items_altered.disconnect(on_items_altered);
+ }
+ }
+
+ public void start(TrackerAccumulator acc) {
+ // can only be started once
+ assert(this.acc == null);
+
+ this.acc = acc;
+
+ collection.items_added.connect(on_items_added);
+ collection.items_removed.connect(on_items_removed);
+ collection.items_altered.connect(on_items_altered);
+
+ if (initial != null && initial.size > 0)
+ on_items_added(initial);
+ else if (initial == null)
+ on_items_added(collection.get_all());
+
+ initial = null;
+ }
+
+ public DataCollection get_collection() {
+ return collection;
+ }
+
+ private void on_items_added(Gee.Iterable<DataObject> added) {
+ include_uninclude(added, acc.include);
+ }
+
+ private void on_items_removed(Gee.Iterable<DataObject> removed) {
+ include_uninclude(removed, acc.uninclude);
+ }
+
+ // Subclasses can use this as a utility method.
+ protected void include_uninclude(Gee.Iterable<DataObject> objects, IncludeUnincludeObject cb) {
+ bool fire_updated = false;
+ foreach (DataObject object in objects)
+ fire_updated = cb(object) || fire_updated;
+
+ if (fire_updated)
+ updated();
+ }
+
+ private void on_items_altered(Gee.Map<DataObject, Alteration> map) {
+ bool fire_updated = false;
+ foreach (DataObject object in map.keys)
+ fire_updated = acc.altered(object, map.get(object)) || fire_updated;
+
+ if (fire_updated)
+ updated();
+ }
+}
+
+// A ViewTracker is Tracker designed for ViewCollections. It uses an internal mux to route
+// Tracker's calls to three TrackerAccumulators: all (all objects in the ViewCollection), selected
+// (only for selected objects) and visible (only for items not hidden or filtered out).
+public class ViewTracker : Tracker {
+ private class Mux : Object, TrackerAccumulator {
+ public TrackerAccumulator? all;
+ public TrackerAccumulator? visible;
+ public TrackerAccumulator? selected;
+
+ public Mux(TrackerAccumulator? all, TrackerAccumulator? visible, TrackerAccumulator? selected) {
+ this.all = all;
+ this.visible = visible;
+ this.selected = selected;
+ }
+
+ public bool include(DataObject object) {
+ DataView view = (DataView) object;
+
+ bool fire_updated = false;
+
+ if (all != null)
+ fire_updated = all.include(view) || fire_updated;
+
+ if (visible != null && view.is_visible())
+ fire_updated = visible.include(view) || fire_updated;
+
+ if (selected != null && view.is_selected())
+ fire_updated = selected.include(view) || fire_updated;
+
+ return fire_updated;
+ }
+
+ public bool uninclude(DataObject object) {
+ DataView view = (DataView) object;
+
+ bool fire_updated = false;
+
+ if (all != null)
+ fire_updated = all.uninclude(view) || fire_updated;
+
+ if (visible != null && view.is_visible())
+ fire_updated = visible.uninclude(view) || fire_updated;
+
+ if (selected != null && view.is_selected())
+ fire_updated = selected.uninclude(view) || fire_updated;
+
+ return fire_updated;
+ }
+
+ public bool altered(DataObject object, Alteration alteration) {
+ DataView view = (DataView) object;
+
+ bool fire_updated = false;
+
+ if (all != null)
+ fire_updated = all.altered(view, alteration) || fire_updated;
+
+ if (visible != null && view.is_visible())
+ fire_updated = visible.altered(view, alteration) || fire_updated;
+
+ if (selected != null && view.is_selected())
+ fire_updated = selected.altered(view, alteration) || fire_updated;
+
+ return fire_updated;
+ }
+ }
+
+ private Mux? mux = null;
+
+ public ViewTracker(ViewCollection collection) {
+ base (collection, collection.get_all_unfiltered());
+ }
+
+ ~ViewTracker() {
+ if (mux != null) {
+ ViewCollection? collection = get_collection() as ViewCollection;
+ assert(collection != null);
+ collection.items_shown.disconnect(on_items_shown);
+ collection.items_hidden.disconnect(on_items_hidden);
+ collection.items_selected.disconnect(on_items_selected);
+ collection.items_unselected.disconnect(on_items_unselected);
+ }
+ }
+
+ public new void start(TrackerAccumulator? all, TrackerAccumulator? visible, TrackerAccumulator? selected) {
+ assert(mux == null);
+
+ mux = new Mux(all, visible, selected);
+
+ ViewCollection? collection = get_collection() as ViewCollection;
+ assert(collection != null);
+ collection.items_shown.connect(on_items_shown);
+ collection.items_hidden.connect(on_items_hidden);
+ collection.items_selected.connect(on_items_selected);
+ collection.items_unselected.connect(on_items_unselected);
+
+ base.start(mux);
+ }
+
+ private void on_items_shown(Gee.Collection<DataView> shown) {
+ if (mux.visible != null)
+ include_uninclude(shown, mux.visible.include);
+ }
+
+ private void on_items_hidden(Gee.Collection<DataView> hidden) {
+ if (mux.visible != null)
+ include_uninclude(hidden, mux.visible.uninclude);
+ }
+
+ private void on_items_selected(Gee.Iterable<DataView> selected) {
+ if (mux.selected != null)
+ include_uninclude(selected, mux.selected.include);
+ }
+
+ private void on_items_unselected(Gee.Iterable<DataView> unselected) {
+ if (mux.selected != null)
+ include_uninclude(unselected, mux.selected.uninclude);
+ }
+}
+
+}
diff --git a/src/core/ViewCollection.vala b/src/core/ViewCollection.vala
new file mode 100644
index 0000000..a34e23e
--- /dev/null
+++ b/src/core/ViewCollection.vala
@@ -0,0 +1,1287 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// A ViewCollection holds DataView objects, which are view instances wrapping DataSource objects.
+// Thus, multiple views can exist of a single SourceCollection, each view displaying all or some
+// of that SourceCollection. A view collection also has a notion of order
+// (first/last/next/previous) that can be overridden by child classes. It also understands hidden
+// objects, which are withheld entirely from the collection until they're made visible. Currently
+// the only way to hide objects is with a ViewFilter.
+//
+// A ViewCollection may also be locked. When locked, it will not (a) remove hidden items from the
+// collection and (b) remove DataViews representing unlinked DataSources. This allows for the
+// ViewCollection to be "frozen" while manipulating items within it. When the collection is
+// unlocked, all changes are applied at once.
+//
+// The default implementation provides a browser which orders the view in the order they're
+// stored in DataCollection, which is not specified.
+public class ViewCollection : DataCollection {
+ public class Monitor {
+ }
+
+ private class MonitorImpl : Monitor {
+ public ViewCollection owner;
+ public SourceCollection sources;
+ public ViewManager manager;
+ public Alteration? prereq;
+
+ public MonitorImpl(ViewCollection owner, SourceCollection sources, ViewManager manager,
+ Alteration? prereq) {
+ this.owner = owner;
+ this.sources = sources;
+ this.manager = manager;
+ this.prereq = prereq;
+
+ sources.items_added.connect(owner.on_sources_added);
+ sources.items_removed.connect(owner.on_sources_removed);
+ sources.items_altered.connect(owner.on_sources_altered);
+ }
+
+ ~MonitorImpl() {
+ sources.items_added.disconnect(owner.on_sources_added);
+ sources.items_removed.disconnect(owner.on_sources_removed);
+ sources.items_altered.disconnect(owner.on_sources_altered);
+ }
+ }
+
+ private class ToggleLists : Object {
+ public Gee.ArrayList<DataView> selected = new Gee.ArrayList<DataView>();
+ public Gee.ArrayList<DataView> unselected = new Gee.ArrayList<DataView>();
+ }
+
+#if MEASURE_VIEW_FILTERING
+ private static OpTimer filter_timer = new OpTimer("ViewCollection filter timer");
+#endif
+
+ private Gee.HashMultiMap<SourceCollection, MonitorImpl> monitors = new Gee.HashMultiMap<
+ SourceCollection, MonitorImpl>();
+ private ViewCollection mirroring = null;
+ private unowned CreateView mirroring_ctor = null;
+ private unowned CreateViewPredicate should_mirror = null;
+ private Gee.Set<ViewFilter> filters = new Gee.HashSet<ViewFilter>();
+ private DataSet selected = new DataSet();
+ private DataSet visible = null;
+ private Gee.HashSet<DataView> frozen_views_altered = null;
+ private Gee.HashSet<DataView> frozen_geometries_altered = null;
+
+ // TODO: source-to-view mapping ... for now, only one view is allowed for each source.
+ // This may need to change in the future.
+ private Gee.HashMap<DataSource, DataView> source_map = new Gee.HashMap<DataSource, DataView>();
+
+ // Signal aggregator.
+ public virtual signal void items_selected(Gee.Iterable<DataView> selected) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void items_unselected(Gee.Iterable<DataView> unselected) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void items_state_changed(Gee.Iterable<DataView> changed) {
+ }
+
+ // This signal is fired when the selection in the view has changed in any capacity. Items
+ // are not reported individually because they may have been removed (and are not reported as
+ // unselected). In other words, although individual DataViews' selection status may not have
+ // changed, what characterizes the total selection of the ViewCollection has changed.
+ public virtual signal void selection_group_altered() {
+ }
+
+ // Signal aggregator.
+ public virtual signal void items_shown(Gee.Collection<DataView> visible) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void items_hidden(Gee.Collection<DataView> hidden) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void items_visibility_changed(Gee.Collection<DataView> changed) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void item_view_altered(DataView view) {
+ }
+
+ // Signal aggregator.
+ public virtual signal void item_geometry_altered(DataView view) {
+ }
+
+ public virtual signal void views_altered(Gee.Collection<DataView> views) {
+ }
+
+ public virtual signal void geometries_altered(Gee.Collection<DataView> views) {
+ }
+
+ public virtual signal void view_filter_installed(ViewFilter filer) {
+ }
+
+ public virtual signal void view_filter_removed(ViewFilter filer) {
+ }
+
+ public ViewCollection(string name) {
+ base (name);
+ }
+
+ protected virtual void notify_items_selected_unselected(Gee.Collection<DataView>? selected,
+ Gee.Collection<DataView>? unselected) {
+ bool has_selected = (selected != null) && (selected.size > 0);
+ bool has_unselected = (unselected != null) && (unselected.size > 0);
+
+ if (has_selected)
+ items_selected(selected);
+
+ if (has_unselected)
+ items_unselected(unselected);
+
+ Gee.Collection<DataView>? sum;
+ if (has_selected && !has_unselected) {
+ sum = selected;
+ } else if (!has_selected && has_unselected) {
+ sum = unselected;
+ } else if (!has_selected && !has_unselected) {
+ sum = null;
+ } else {
+ sum = new Gee.HashSet<DataView>();
+ sum.add_all(selected);
+ sum.add_all(unselected);
+ }
+
+ if (sum != null) {
+ items_state_changed(sum);
+ notify_selection_group_altered();
+ }
+ }
+
+ protected virtual void notify_selection_group_altered() {
+ selection_group_altered();
+ }
+
+ protected virtual void notify_item_view_altered(DataView view) {
+ item_view_altered(view);
+ }
+
+ protected virtual void notify_views_altered(Gee.Collection<DataView> views) {
+ views_altered(views);
+ }
+
+ protected virtual void notify_item_geometry_altered(DataView view) {
+ item_geometry_altered(view);
+ }
+
+ protected virtual void notify_geometries_altered(Gee.Collection<DataView> views) {
+ geometries_altered(views);
+ }
+
+ protected virtual void notify_items_shown(Gee.Collection<DataView> shown) {
+ items_shown(shown);
+ }
+
+ protected virtual void notify_items_hidden(Gee.Collection<DataView> hidden) {
+ items_hidden(hidden);
+ }
+
+ protected virtual void notify_items_visibility_changed(Gee.Collection<DataView> changed) {
+ items_visibility_changed(changed);
+ }
+
+ protected virtual void notify_view_filter_installed(ViewFilter filter) {
+ view_filter_installed(filter);
+ }
+
+ protected virtual void notify_view_filter_removed(ViewFilter filter) {
+ view_filter_removed(filter);
+ }
+
+ public override void clear() {
+ // cannot clear a ViewCollection if it is monitoring a SourceCollection or mirroring a
+ // ViewCollection
+ if (monitors.size > 0 || mirroring != null) {
+ warning("Cannot clear %s: monitoring or mirroring in effect", to_string());
+
+ return;
+ }
+
+ base.clear();
+ }
+
+ public override void close() {
+ halt_all_monitoring();
+ halt_mirroring();
+ foreach (ViewFilter f in filters)
+ f.refresh.disconnect(on_view_filter_refresh);
+ filters.clear();
+
+ base.close();
+ }
+
+ public Monitor monitor_source_collection(SourceCollection sources, ViewManager manager,
+ Alteration? prereq, Gee.Collection<DataSource>? initial = null,
+ ProgressMonitor? progress_monitor = null) {
+ // cannot use source monitoring and mirroring at the same time
+ halt_mirroring();
+
+ freeze_notifications();
+
+ // create a monitor, which will hook up all the signals and filter from there
+ MonitorImpl monitor = new MonitorImpl(this, sources, manager, prereq);
+ monitors.set(sources, monitor);
+
+ if (initial != null && initial.size > 0) {
+ // add from the initial list handed to us, using the ViewManager to add/remove later
+ Gee.ArrayList<DataView> created_views = new Gee.ArrayList<DataView>();
+ foreach (DataSource source in initial)
+ created_views.add(manager.create_view(source));
+
+ add_many(created_views, progress_monitor);
+ } else {
+ // load in all items from the SourceCollection, filtering with the manager
+ add_sources(sources, (Gee.Iterable<DataSource>) sources.get_all(), progress_monitor);
+ }
+
+ thaw_notifications();
+
+ return monitor;
+ }
+
+ public void halt_monitoring(Monitor m) {
+ MonitorImpl monitor = (MonitorImpl) m;
+
+ bool removed = monitors.remove(monitor.sources, monitor);
+ assert(removed);
+ }
+
+ public void halt_all_monitoring() {
+ monitors.clear();
+ }
+
+ public void mirror(ViewCollection to_mirror, CreateView mirroring_ctor,
+ CreateViewPredicate? should_mirror) {
+ halt_mirroring();
+ halt_all_monitoring();
+ clear();
+
+ mirroring = to_mirror;
+ this.mirroring_ctor = mirroring_ctor;
+ this.should_mirror = should_mirror;
+ set_comparator(to_mirror.get_comparator(), to_mirror.get_comparator_predicate());
+
+ // load up with current items
+ on_mirror_contents_added(mirroring.get_all());
+
+ mirroring.items_added.connect(on_mirror_contents_added);
+ mirroring.items_removed.connect(on_mirror_contents_removed);
+ }
+
+ public void halt_mirroring() {
+ if (mirroring != null) {
+ mirroring.items_added.disconnect(on_mirror_contents_added);
+ mirroring.items_removed.disconnect(on_mirror_contents_removed);
+ }
+
+ mirroring = null;
+ }
+
+ public void copy_into(ViewCollection to_copy, CreateView copying_ctor,
+ CreateViewPredicate should_copy) {
+ // Copy into self.
+ Gee.ArrayList<DataObject> copy_view = new Gee.ArrayList<DataObject>();
+ foreach (DataObject object in to_copy.get_all()) {
+ DataView view = (DataView) object;
+ if (should_copy(view.get_source())) {
+ copy_view.add(copying_ctor(view.get_source()));
+ }
+ }
+ add_many(copy_view);
+ }
+
+ public bool is_view_filter_installed(ViewFilter f) {
+ return filters.contains(f);
+ }
+
+ public void install_view_filter(ViewFilter f) {
+ if (is_view_filter_installed(f))
+ return;
+
+ filters.add(f);
+ f.refresh.connect(on_view_filter_refresh);
+
+ // filter existing items
+ on_view_filter_refresh();
+
+ // notify of change after activating filter
+ notify_view_filter_installed(f);
+ }
+
+ public void remove_view_filter(ViewFilter f) {
+ if (!is_view_filter_installed(f))
+ return;
+
+ filters.remove(f);
+ f.refresh.disconnect(on_view_filter_refresh);
+
+ // filter existing items
+ on_view_filter_refresh();
+
+ // notify of change after activating filter
+ notify_view_filter_removed(f);
+ }
+
+ private void on_view_filter_refresh() {
+ filter_altered_items((Gee.Collection<DataView>) base.get_all());
+ }
+
+ // Runs predicate on all filters, returns ANDed result.
+ private bool is_in_filter(DataView view) {
+ foreach (ViewFilter f in filters) {
+ if (!f.predicate(view))
+ return false;
+ }
+ return true;
+ }
+
+ public override bool valid_type(DataObject object) {
+ return object is DataView;
+ }
+
+ private void on_sources_added(DataCollection sources, Gee.Iterable<DataSource> added) {
+ add_sources((SourceCollection) sources, added);
+ }
+
+ private void add_sources(SourceCollection sources, Gee.Iterable<DataSource> added,
+ ProgressMonitor? progress_monitor = null) {
+ // add only source items which are to be included by the manager ... do this in batches
+ // to take advantage of add_many()
+ DataView created_view = null;
+ Gee.ArrayList<DataView> created_views = null;
+ foreach (DataSource source in added) {
+ CreateView factory = null;
+ foreach (MonitorImpl monitor in monitors.get(sources)) {
+ if (monitor.manager.include_in_view(source)) {
+ factory = monitor.manager.create_view;
+
+ break;
+ }
+ }
+
+ if (factory != null) {
+ DataView new_view = factory(source);
+
+ // this bit of code is designed to avoid creating the ArrayList if only one item
+ // is being added to the ViewCollection
+ if (created_views != null) {
+ created_views.add(new_view);
+ } else if (created_view == null) {
+ created_view = new_view;
+ } else {
+ created_views = new Gee.ArrayList<DataView>();
+ created_views.add(created_view);
+ created_view = null;
+ created_views.add(new_view);
+ }
+ }
+ }
+
+ if (created_view != null)
+ add(created_view);
+ else if (created_views != null && created_views.size > 0)
+ add_many(created_views, progress_monitor);
+ }
+
+ public override bool add(DataObject object) {
+ ((DataView) object).internal_set_visible(true);
+
+ if (!base.add(object))
+ return false;
+
+ filter_altered_items((Gee.Collection<DataView>) get_singleton(object));
+
+ return true;
+ }
+
+ public override Gee.Collection<DataObject> add_many(Gee.Collection<DataObject> objects,
+ ProgressMonitor? monitor = null) {
+ foreach (DataObject object in objects)
+ ((DataView) object).internal_set_visible(true);
+
+ Gee.Collection<DataObject> return_list = base.add_many(objects, monitor);
+
+ filter_altered_items((Gee.Collection<DataView>) return_list);
+
+ return return_list;
+ }
+
+ private void on_sources_removed(Gee.Iterable<DataSource> removed) {
+ // mark all view items associated with the source to be removed
+ Marker marker = null;
+ foreach (DataSource source in removed) {
+ DataView view = source_map.get(source);
+
+ // ignore if not represented in this view
+ if (view != null) {
+ if (marker == null)
+ marker = start_marking();
+
+ marker.mark(view);
+ }
+ }
+
+ if (marker != null && marker.get_count() != 0)
+ remove_marked(marker);
+ }
+
+ private void on_sources_altered(DataCollection collection, Gee.Map<DataObject, Alteration> items) {
+ // let ViewManager decide whether or not to keep, but only add if not already present
+ // and only remove if already present
+ Gee.ArrayList<DataView> to_add = null;
+ Gee.ArrayList<DataView> to_remove = null;
+ bool ordering_changed = false;
+ foreach (DataObject object in items.keys) {
+ Alteration alteration = items.get(object);
+ DataSource source = (DataSource) object;
+
+ MonitorImpl? monitor = null;
+ bool ignored = true;
+ foreach (MonitorImpl monitor_impl in monitors.get((SourceCollection) collection)) {
+ if (monitor_impl.prereq != null && !alteration.contains_any(monitor_impl.prereq))
+ continue;
+
+ ignored = false;
+
+ if (monitor_impl.manager.include_in_view(source)) {
+ monitor = monitor_impl;
+
+ break;
+ }
+ }
+
+ if (ignored) {
+ assert(monitor == null);
+
+ continue;
+ }
+
+ if (monitor != null && !has_view_for_source(source)) {
+ if (to_add == null)
+ to_add = new Gee.ArrayList<DataView>();
+
+ to_add.add(monitor.manager.create_view(source));
+ } else if (monitor == null && has_view_for_source(source)) {
+ if (to_remove == null)
+ to_remove = new Gee.ArrayList<DataView>();
+
+ to_remove.add(get_view_for_source(source));
+ } else if (monitor != null && has_view_for_source(source)) {
+ DataView view = get_view_for_source(source);
+
+ if (selected.contains(view))
+ selected.resort_object(view, alteration);
+
+ if (visible != null && is_visible(view)) {
+ if (visible.resort_object(view, alteration))
+ ordering_changed = true;
+ }
+ }
+ }
+
+ if (to_add != null)
+ add_many(to_add);
+
+ if (to_remove != null)
+ remove_marked(mark_many(to_remove));
+
+ if (ordering_changed)
+ notify_ordering_changed();
+ }
+
+ private void on_mirror_contents_added(Gee.Iterable<DataObject> added) {
+ Gee.ArrayList<DataView> to_add = new Gee.ArrayList<DataView>();
+ foreach (DataObject object in added) {
+ DataSource source = ((DataView) object).get_source();
+
+ if (should_mirror == null || should_mirror(source))
+ to_add.add(mirroring_ctor(source));
+ }
+
+ if (to_add.size > 0)
+ add_many(to_add);
+ }
+
+ private void on_mirror_contents_removed(Gee.Iterable<DataObject> removed) {
+ Marker marker = start_marking();
+ foreach (DataObject object in removed) {
+ DataView view = (DataView) object;
+
+ DataView? our_view = get_view_for_source(view.get_source());
+ assert(our_view != null);
+
+ marker.mark(our_view);
+ }
+
+ remove_marked(marker);
+ }
+
+ // Keep the source map and state tables synchronized
+ protected override void notify_items_added(Gee.Iterable<DataObject> added) {
+ Gee.ArrayList<DataView> added_visible = null;
+ Gee.ArrayList<DataView> added_selected = null;
+
+ foreach (DataObject object in added) {
+ DataView view = (DataView) object;
+ source_map.set(view.get_source(), view);
+
+ if (view.is_selected() && view.is_visible()) {
+ if (added_selected == null)
+ added_selected = new Gee.ArrayList<DataView>();
+
+ added_selected.add(view);
+ }
+
+ // add to visible list only if there is one
+ if (view.is_visible() && visible != null) {
+ if (added_visible == null)
+ added_visible = new Gee.ArrayList<DataView>();
+
+ added_visible.add(view);
+ }
+ }
+
+ if (added_visible != null) {
+ bool is_added = add_many_visible(added_visible);
+ assert(is_added);
+ }
+
+ if (added_selected != null) {
+ add_many_selected(added_selected);
+ notify_items_selected_unselected(added_selected, null);
+ }
+
+ base.notify_items_added(added);
+ }
+
+ // Keep the source map and state tables synchronized
+ protected override void notify_items_removed(Gee.Iterable<DataObject> removed) {
+ Gee.ArrayList<DataView>? selected_removed = null;
+ foreach (DataObject object in removed) {
+ DataView view = (DataView) object;
+
+ // It's possible for execution to get here in direct mode with the source
+ // in question already having been removed from the source map, but the
+ // double removal is unimportant to direct mode, so if this happens, the
+ // remove is skipped the second time (to prevent crashing).
+ if (source_map.has_key(view.get_source())) {
+ bool is_removed = source_map.unset(view.get_source());
+ assert(is_removed);
+
+ if (view.is_selected()) {
+ // hidden items may be selected, but they won't be in the selected pool
+ assert(selected.contains(view) == view.is_visible());
+
+ if (view.is_visible()) {
+ if (selected_removed == null)
+ selected_removed = new Gee.ArrayList<DataView>();
+
+ selected_removed.add(view);
+ }
+ }
+
+ if (view.is_visible() && visible != null) {
+ is_removed = visible.remove(view);
+ assert(is_removed);
+ }
+ }
+ }
+
+ if (selected_removed != null) {
+ remove_many_selected(selected_removed);
+
+ // If a selected item was removed, only fire the selected_removed signal, as the total
+ // selection character of the ViewCollection has changed, but not the individual items'
+ // state.
+ notify_selection_group_altered();
+ }
+
+ base.notify_items_removed(removed);
+ }
+
+ private void filter_altered_items(Gee.Collection<DataView> views) {
+ // Can't use the marker system because ViewCollection completely overrides DataCollection
+ // and hidden items cannot be marked.
+ Gee.ArrayList<DataView> to_show = null;
+ Gee.ArrayList<DataView> to_hide = null;
+
+#if MEASURE_VIEW_FILTERING
+ filter_timer.start();
+#endif
+ foreach (DataView view in views) {
+ if (is_in_filter(view)) {
+ if (!view.is_visible()) {
+ if (to_show == null)
+ to_show = new Gee.ArrayList<DataView>();
+
+ to_show.add(view);
+ }
+ } else {
+ if (view.is_visible()) {
+ if (to_hide == null)
+ to_hide = new Gee.ArrayList<DataView>();
+
+ to_hide.add(view);
+ }
+ }
+ }
+#if MEASURE_VIEW_FILTERING
+ filter_timer.stop();
+ debug("Filtering for %s: %s", to_string(), filter_timer.to_string());
+#endif
+
+ if (to_show != null)
+ show_items(to_show);
+
+ if (to_hide != null)
+ hide_items(to_hide);
+ }
+
+ public override void items_altered(Gee.Map<DataObject, Alteration> map) {
+ filter_altered_items(map.keys);
+
+ base.items_altered(map);
+ }
+
+ public override void set_comparator(Comparator comparator, ComparatorPredicate? predicate) {
+ selected.set_comparator(comparator, predicate);
+ if (visible != null)
+ visible.set_comparator(comparator, predicate);
+
+ base.set_comparator(comparator, predicate);
+ }
+
+ public override void reset_comparator() {
+ selected.reset_comparator();
+ if (visible != null)
+ visible.reset_comparator();
+
+ base.reset_comparator();
+ }
+
+ public override Gee.Collection<DataObject> get_all() {
+ return (visible != null) ? visible.get_all() : base.get_all();
+ }
+
+ public Gee.Collection<DataObject> get_all_unfiltered() {
+ return base.get_all();
+ }
+
+ public override int get_count() {
+ return (visible != null) ? visible.get_count() : base.get_count();
+ }
+
+ public int get_unfiltered_count() {
+ return base.get_count();
+ }
+
+ public override DataObject? get_at(int index) {
+ return (visible != null) ? visible.get_at(index) : base.get_at(index);
+ }
+
+ public override int index_of(DataObject object) {
+ return (visible != null) ? visible.index_of(object) : base.index_of(object);
+ }
+
+ public override bool contains(DataObject object) {
+ // use base method first, which can quickly ascertain if the object is *not* a member of
+ // this collection
+ if (!base.contains(object))
+ return false;
+
+ // even if a member, must be visible to be "contained"
+ return is_visible((DataView) object);
+ }
+
+ public virtual DataView? get_first() {
+ return (get_count() > 0) ? (DataView?) get_at(0) : null;
+ }
+
+ /**
+ * @brief A helper method for places in the app that need a
+ * non-rejected media source (namely Events, when looking to
+ * automatically choose a thumbnail).
+ *
+ * @note If every view in this collection is rejected, we
+ * return the first view; this is intentional. This prevents
+ * pathological events that have nothing but rejected images
+ * in them from breaking.
+ */
+ public virtual DataView? get_first_unrejected() {
+ // We have no media, unrejected or otherwise...
+ if (get_count() < 1)
+ return null;
+
+ // Loop through media we do have...
+ DataView dv = get_first();
+ int num_views = get_count();
+
+ while ((dv != null) && (index_of(dv) < (num_views - 1))) {
+ MediaSource tmp = dv.get_source() as MediaSource;
+
+ if ((tmp != null) && (tmp.get_rating() != Rating.REJECTED)) {
+ // ...found a good one; return it.
+ return dv;
+ } else {
+ dv = get_next(dv);
+ }
+ }
+
+ // Got to the end of the collection, none found, need to return
+ // _something_...
+ return get_first();
+ }
+
+ public virtual DataView? get_last() {
+ return (get_count() > 0) ? (DataView?) get_at(get_count() - 1) : null;
+ }
+
+ public virtual DataView? get_next(DataView view) {
+ if (get_count() == 0)
+ return null;
+
+ int index = index_of(view);
+ if (index < 0)
+ return null;
+
+ index++;
+ if (index >= get_count())
+ index = 0;
+
+ return (DataView?) get_at(index);
+ }
+
+ public virtual DataView? get_previous(DataView view) {
+ if (get_count() == 0)
+ return null;
+
+ int index = index_of(view);
+ if (index < 0)
+ return null;
+
+ index--;
+ if (index < 0)
+ index = get_count() - 1;
+
+ return (DataView?) get_at(index);
+ }
+
+ public bool get_immediate_neighbors(DataSource home, out DataSource? next,
+ out DataSource? prev, string? type_selector = null) {
+ next = null;
+ prev = null;
+
+ DataView home_view = get_view_for_source(home);
+ if (home_view == null)
+ return false;
+
+ DataView? next_view = get_next(home_view);
+ while (next_view != home_view) {
+ if ((type_selector == null) || (next_view.get_source().get_typename() == type_selector)) {
+ next = next_view.get_source();
+ break;
+ }
+ next_view = get_next(next_view);
+ }
+
+ DataView? prev_view = get_previous(home_view);
+ while (prev_view != home_view) {
+ if ((type_selector == null) || (prev_view.get_source().get_typename() == type_selector)) {
+ prev = prev_view.get_source();
+ break;
+ }
+ prev_view = get_previous(prev_view);
+ }
+
+ return true;
+ }
+
+ // "Extended" as in immediate neighbors and their neighbors
+ public Gee.Set<DataSource> get_extended_neighbors(DataSource home, string? typename = null) {
+ // build set of neighbors
+ Gee.Set<DataSource> neighbors = new Gee.HashSet<DataSource>();
+
+ // immediate neighbors
+ DataSource next, prev;
+ if (!get_immediate_neighbors(home, out next, out prev, typename))
+ return neighbors;
+
+ // add next and its distant neighbor
+ if (next != null) {
+ neighbors.add(next);
+
+ DataSource next_next, next_prev;
+ get_immediate_neighbors(next, out next_next, out next_prev, typename);
+
+ // only add next-next because next-prev is home
+ if (next_next != null)
+ neighbors.add(next_next);
+ }
+
+ // add previous and its distant neighbor
+ if (prev != null) {
+ neighbors.add(prev);
+
+ DataSource next_prev, prev_prev;
+ get_immediate_neighbors(prev, out next_prev, out prev_prev, typename);
+
+ // only add prev-prev because next-prev is home
+ if (prev_prev != null)
+ neighbors.add(prev_prev);
+ }
+
+ // finally, in a small collection a neighbor could be home itself, so exclude it
+ neighbors.remove(home);
+
+ return neighbors;
+ }
+
+ // Do NOT add hidden items to the selection collection, mark them as selected and they will be
+ // added when/if they are made visible.
+ private void add_many_selected(Gee.Collection<DataView> views) {
+ if (views.size == 0)
+ return;
+
+ foreach (DataView view in views)
+ assert(view.is_visible());
+
+ bool added = selected.add_many(views);
+ assert(added);
+ }
+
+ private void remove_many_selected(Gee.Collection<DataView> views) {
+ if (views.size == 0)
+ return;
+
+ bool removed = selected.remove_many(views);
+ assert(removed);
+ }
+
+ // Selects all the marked items. The marker will be invalid after this call.
+ public void select_marked(Marker marker) {
+ Gee.ArrayList<DataView> selected = new Gee.ArrayList<DataView>();
+ act_on_marked(marker, select_item, null, selected);
+
+ if (selected.size > 0) {
+ add_many_selected(selected);
+ notify_items_selected_unselected(selected, null);
+ }
+ }
+
+ // Selects all items.
+ public void select_all() {
+ Marker marker = start_marking();
+ marker.mark_all();
+ select_marked(marker);
+ }
+
+ private bool select_item(DataObject object, Object? user) {
+ DataView view = (DataView) object;
+ if (view.is_selected()) {
+ if (view.is_visible())
+ assert(selected.contains(view));
+
+ return true;
+ }
+
+ view.internal_set_selected(true);
+
+ // Do NOT add hidden items to the selection collection, merely mark them as selected
+ // and they will be re-added when/if they are made visible
+ if (view.is_visible())
+ ((Gee.ArrayList<DataView>) user).add(view);
+
+ return true;
+ }
+
+ // Unselects all the marked items. The marker will be invalid after this call.
+ public void unselect_marked(Marker marker) {
+ Gee.ArrayList<DataView> unselected = new Gee.ArrayList<DataView>();
+ act_on_marked(marker, unselect_item, null, unselected);
+
+ if (unselected.size > 0) {
+ remove_many_selected(unselected);
+ notify_items_selected_unselected(null, unselected);
+ }
+ }
+
+ // Unselects all items.
+ public void unselect_all() {
+ if (selected.get_count() == 0)
+ return;
+
+ Marker marker = start_marking();
+ marker.mark_many(get_selected());
+
+ unselect_marked(marker);
+ }
+
+ // Unselects all items but the one specified.
+ public void unselect_all_but(DataView exception) {
+ Marker marker = start_marking();
+ foreach (DataObject object in get_all()) {
+ DataView view = (DataView) object;
+ if (view != exception)
+ marker.mark(view);
+ }
+
+ unselect_marked(marker);
+ }
+
+ private bool unselect_item(DataObject object, Object? user) {
+ DataView view = (DataView) object;
+ if (!view.is_selected()) {
+ assert(!selected.contains(view));
+
+ return true;
+ }
+
+ view.internal_set_selected(false);
+ ((Gee.ArrayList<DataView>) user).add(view);
+
+ return true;
+ }
+
+ // Performs the operations in that order: unselects the marked then selects the marked
+ public void unselect_and_select_marked(Marker unselect, Marker select) {
+ Gee.ArrayList<DataView> unselected = new Gee.ArrayList<DataView>();
+ act_on_marked(unselect, unselect_item, null, unselected);
+
+ remove_many_selected(unselected);
+
+ Gee.ArrayList<DataView> selected = new Gee.ArrayList<DataView>();
+ act_on_marked(select, select_item, null, selected);
+
+ add_many_selected(selected);
+
+ notify_items_selected_unselected(selected, unselected);
+ }
+
+ // Toggle the selection state of all marked items. The marker will be invalid after this
+ // call.
+ public void toggle_marked(Marker marker) {
+ ToggleLists lists = new ToggleLists();
+ act_on_marked(marker, toggle_item, null, lists);
+
+ // add and remove selected before firing the signals
+ add_many_selected(lists.selected);
+ remove_many_selected(lists.unselected);
+
+ notify_items_selected_unselected(lists.selected, lists.unselected);
+ }
+
+ private bool toggle_item(DataObject object, Object? user) {
+ DataView view = (DataView) object;
+ ToggleLists lists = (ToggleLists) user;
+
+ // toggle the selection state of the view, adding or removing it from the selected list
+ // to maintain state and adding it to the ToggleLists for the caller to signal with
+ //
+ // See add_many_selected for rules on not adding hidden items to the selection pool
+ if (view.internal_toggle()) {
+ if (view.is_visible())
+ lists.selected.add(view);
+ } else {
+ lists.unselected.add(view);
+ }
+
+ return true;
+ }
+
+ public int get_selected_count() {
+ return selected.get_count();
+ }
+
+ public Gee.List<DataView> get_selected() {
+ return (Gee.List<DataView>) selected.get_all();
+ }
+
+ public DataView? get_selected_at(int index) {
+ return (DataView?) selected.get_at(index);
+ }
+
+ private bool is_visible(DataView view) {
+ return (visible != null) ? visible.contains(view) : true;
+ }
+
+ private bool add_many_visible(Gee.Collection<DataView> many) {
+ if (visible == null)
+ return true;
+
+ if (!visible.add_many(many))
+ return false;
+
+ // if all are visible, then revert to using base class's set
+ if (visible.get_count() == base.get_count())
+ visible = null;
+
+ return true;
+ }
+
+ // This method requires that all items in to_hide are not hidden already.
+ private void hide_items(Gee.List<DataView> to_hide) {
+ Gee.ArrayList<DataView> unselected = new Gee.ArrayList<DataView>();
+
+ int count = to_hide.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ DataView view = to_hide.get(ctr);
+ assert(view.is_visible());
+
+ if (view.is_selected()) {
+ view.internal_set_selected(false);
+ unselected.add(view);
+ } else {
+ assert(!selected.contains(view));
+ }
+
+ view.internal_set_visible(false);
+ }
+
+ if (visible == null) {
+ // make a copy of the full set before removing items
+ visible = get_dataset_copy();
+ }
+
+ bool removed = visible.remove_many(to_hide);
+ assert(removed);
+
+ remove_many_selected(unselected);
+
+ if (unselected.size > 0)
+ notify_items_selected_unselected(null, unselected);
+
+ if (to_hide.size > 0) {
+ notify_items_hidden(to_hide);
+ notify_items_visibility_changed(to_hide);
+ }
+ }
+
+ // This method requires that all items in to_show are hidden already.
+ private void show_items(Gee.List<DataView> to_show) {
+ Gee.ArrayList<DataView> added_selected = new Gee.ArrayList<DataView>();
+
+ int count = to_show.size;
+ for (int ctr = 0; ctr < count; ctr++) {
+ DataView view = to_show.get(ctr);
+ assert(!view.is_visible());
+
+ view.internal_set_visible(true);
+
+ // See note in add_selected for selection handling with hidden/visible items
+ if (view.is_selected()) {
+ assert(!selected.contains(view));
+ added_selected.add(view);
+ }
+ }
+
+ bool added = add_many_visible(to_show);
+ assert(added);
+
+ add_many_selected(added_selected);
+
+ if (to_show.size > 0) {
+ notify_items_shown(to_show);
+ notify_items_visibility_changed(to_show);
+ }
+ }
+
+ // This currently does not respect filtering.
+ public bool has_view_for_source(DataSource source) {
+ return get_view_for_source(source) != null;
+ }
+
+ // This currently does not respect filtering.
+ public DataView? get_view_for_source(DataSource source) {
+ return source_map.get(source);
+ }
+
+ // Respects filtering.
+ public bool has_view_for_source_with_filtered(DataSource source) {
+ return get_view_for_source_filtered(source) != null;
+ }
+
+ // Respects filtering.
+ public DataView? get_view_for_source_filtered(DataSource source) {
+ DataView? view = source_map.get(source);
+ // Consult with filter to make sure DataView is visible.
+ if (view != null && !is_in_filter(view))
+ return null;
+ return view;
+ }
+
+ // TODO: This currently does not respect filtering.
+ public Gee.Collection<DataSource> get_sources() {
+ return source_map.keys.read_only_view;
+ }
+
+ // TODO: This currently does not respect filtering.
+ public bool has_source_of_type(Type t) {
+ assert(t.is_a(typeof(DataSource)));
+
+ foreach (DataSource source in source_map.keys) {
+ if (source.get_type().is_a(t))
+ return true;
+ }
+
+ return false;
+ }
+
+ public int get_sources_of_type_count(Type t) {
+ assert(t.is_a(typeof(DataSource)));
+
+ int count = 0;
+ foreach (DataObject object in get_all()) {
+ if (((DataView) object).get_source().get_type().is_a(t))
+ count++;
+ }
+
+ return count;
+ }
+
+ public Gee.List<DataSource>? get_sources_of_type(Type t) {
+ assert(t.is_a(typeof(DataSource)));
+
+ Gee.List<DataSource>? sources = null;
+ foreach (DataObject object in get_all()) {
+ DataSource source = ((DataView) object).get_source();
+ if (source.get_type().is_a(t)) {
+ if (sources == null)
+ sources = new Gee.ArrayList<DataSource>();
+
+ sources.add(source);
+ }
+ }
+
+ return sources;
+ }
+
+ public Gee.List<DataSource> get_selected_sources() {
+ Gee.List<DataSource> sources = new Gee.ArrayList<DataSource>();
+
+ int count = selected.get_count();
+ for (int ctr = 0; ctr < count; ctr++)
+ sources.add(((DataView) selected.get_at(ctr)).get_source());
+
+ return sources;
+ }
+
+ public DataSource? get_selected_source_at(int index) {
+ DataObject? object = selected.get_at(index);
+
+ return (object != null) ? ((DataView) object).get_source() : null;
+ }
+
+ public Gee.List<DataSource>? get_selected_sources_of_type(Type t) {
+ Gee.List<DataSource>? sources = null;
+ foreach (DataView view in get_selected()) {
+ DataSource source = view.get_source();
+ if (source.get_type().is_a(t)) {
+ if (sources == null)
+ sources = new Gee.ArrayList<DataSource>();
+
+ sources.add(source);
+ }
+ }
+
+ return sources;
+ }
+
+ // Returns -1 if source is not in the ViewCollection.
+ public int index_of_source(DataSource source) {
+ DataView? view = get_view_for_source(source);
+
+ return (view != null) ? index_of(view) : -1;
+ }
+
+ // This is only used by DataView.
+ public void internal_notify_view_altered(DataView view) {
+ if (!are_notifications_frozen()) {
+ notify_item_view_altered(view);
+ notify_views_altered((Gee.Collection<DataView>) get_singleton(view));
+ } else {
+ if (frozen_views_altered == null)
+ frozen_views_altered = new Gee.HashSet<DataView>();
+ frozen_views_altered.add(view);
+ }
+ }
+
+ // This is only used by DataView.
+ public void internal_notify_geometry_altered(DataView view) {
+ if (!are_notifications_frozen()) {
+ notify_item_geometry_altered(view);
+ notify_geometries_altered((Gee.Collection<DataView>) get_singleton(view));
+ } else {
+ if (frozen_geometries_altered == null)
+ frozen_geometries_altered = new Gee.HashSet<DataView>();
+ frozen_geometries_altered.add(view);
+ }
+ }
+
+ protected override void notify_thawed() {
+ if (frozen_views_altered != null) {
+ foreach (DataView view in frozen_views_altered)
+ notify_item_view_altered(view);
+ notify_views_altered(frozen_views_altered);
+ frozen_views_altered = null;
+ }
+
+ if (frozen_geometries_altered != null) {
+ foreach (DataView view in frozen_geometries_altered)
+ notify_item_geometry_altered(view);
+ notify_geometries_altered(frozen_geometries_altered);
+ frozen_geometries_altered = null;
+ }
+
+ base.notify_thawed();
+ }
+
+ public bool are_items_filtered_out() {
+ return base.get_count() != get_count();
+ }
+}
+
+// A ViewManager allows an interface for ViewCollection to monitor a SourceCollection and
+// (selectively) add DataViews automatically.
+public abstract class ViewManager {
+ // This predicate function can be used to filter which DataView objects should be included
+ // in the collection as new source objects appear in the SourceCollection. May be called more
+ // than once for any DataSource object.
+ public virtual bool include_in_view(DataSource source) {
+ return true;
+ }
+
+ // If include_in_view returns true, this method will be called to instantiate a DataView object
+ // for the ViewCollection.
+ public abstract DataView create_view(DataSource source);
+}
+
+// CreateView is a construction delegate used when mirroring or copying a ViewCollection
+// in another ViewCollection.
+public delegate DataView CreateView(DataSource source);
+
+// CreateViewPredicate is a filter delegate used when copy a ViewCollection in another
+// ViewCollection.
+public delegate bool CreateViewPredicate(DataSource source);
+
+// A ViewFilter allows for items in a ViewCollection to be shown or hidden depending on the
+// supplied predicate method. For now, only one ViewFilter may be installed, although this may
+// change in the future. The ViewFilter is used whenever an object is added to the collection
+// and when its altered/metadata_altered signals fire.
+public abstract class ViewFilter {
+ // Fire this signal whenever a refresh is needed. The ViewCollection listens
+ // to this signal to know when to reapply the filter.
+ public virtual signal void refresh() {
+ }
+
+ // Return true if view should be visible, false if it should be hidden.
+ public abstract bool predicate(DataView view);
+}
+
diff --git a/src/core/mk/core.mk b/src/core/mk/core.mk
new file mode 100644
index 0000000..c35c93a
--- /dev/null
+++ b/src/core/mk/core.mk
@@ -0,0 +1,43 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Core
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := core
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ DataCollection.vala \
+ DataSet.vala \
+ util.vala \
+ SourceCollection.vala \
+ SourceHoldingTank.vala \
+ DatabaseSourceCollection.vala \
+ ContainerSourceCollection.vala \
+ ViewCollection.vala \
+ DataObject.vala \
+ Alteration.vala \
+ DataSource.vala \
+ DataSourceTypes.vala \
+ DataView.vala \
+ DataViewTypes.vala \
+ Tracker.vala \
+ SourceInterfaces.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/core/util.vala b/src/core/util.vala
new file mode 100644
index 0000000..1846380
--- /dev/null
+++ b/src/core/util.vala
@@ -0,0 +1,196 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// SingletonCollection is a read-only collection designed to hold exactly one item in it. This
+// is far more efficient than creating a dummy collection (such as ArrayList) merely to pass around
+// a single item, particularly for signals which require Iterables and Collections.
+//
+// This collection cannot be used to store null.
+
+public class SingletonCollection<G> : Gee.AbstractCollection<G> {
+ private class SingletonIterator<G> : Object, Gee.Traversable<G>, Gee.Iterator<G> {
+ private SingletonCollection<G> c;
+ private bool done = false;
+ private G? current = null;
+
+ public SingletonIterator(SingletonCollection<G> c) {
+ this.c = c;
+ }
+
+ public bool read_only {
+ get { return done; }
+ }
+
+ public bool valid {
+ get { return done; }
+ }
+
+ public bool foreach(Gee.ForallFunc<G> f) {
+ return f(c.object);
+ }
+
+ public new G? get() {
+ return current;
+ }
+
+ public bool has_next() {
+ return false;
+ }
+
+ public bool next() {
+ if (done)
+ return false;
+
+ done = true;
+ current = c.object;
+
+ return true;
+ }
+
+ public void remove() {
+ if (!done) {
+ c.object = null;
+ current = null;
+ }
+
+ done = true;
+ }
+ }
+
+ private G? object;
+
+ public SingletonCollection(G object) {
+ this.object = object;
+ }
+
+ public override bool read_only {
+ get { return false; }
+ }
+
+ public override bool add(G object) {
+ warning("Cannot add to SingletonCollection");
+
+ return false;
+ }
+
+ public override void clear() {
+ object = null;
+ }
+
+ public override bool contains(G object) {
+ return this.object == object;
+ }
+
+ public override Gee.Iterator<G> iterator() {
+ return new SingletonIterator<G>(this);
+ }
+
+ public override bool remove(G item) {
+ if (item == object) {
+ object = null;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int size {
+ get {
+ return (object != null) ? 1 : 0;
+ }
+ }
+}
+
+// A Marker is an object for marking (selecting) DataObjects in a DataCollection to then perform
+// an action on all of them. This mechanism allows for performing mass operations in a generic
+// way, as well as dealing with the (perpetual) issue of removing items from a Collection within
+// an iterator.
+public interface Marker : Object {
+ public abstract void mark(DataObject object);
+
+ public abstract void unmark(DataObject object);
+
+ public abstract bool toggle(DataObject object);
+
+ public abstract void mark_many(Gee.Collection<DataObject> list);
+
+ public abstract void unmark_many(Gee.Collection<DataObject> list);
+
+ public abstract void mark_all();
+
+ // Returns the number of marked items, or the number of items when the marker was frozen
+ // and used.
+ public abstract int get_count();
+
+ // Returns a copy of the collection of marked items.
+ public abstract Gee.Collection<DataObject> get_all();
+}
+
+// MarkedAction is a callback to perform an action on the marked DataObject. Return false to
+// end iterating.
+public delegate bool MarkedAction(DataObject object, Object? user);
+
+// A ProgressMonitor allows for notifications of progress on operations on multiple items (via
+// the marked interfaces). Return false if the operation is cancelled and should end immediately.
+public delegate bool ProgressMonitor(uint64 current, uint64 total, bool do_event_loop = true);
+
+// UnknownTotalMonitor is useful when an interface cannot report the total count to a ProgressMonitor,
+// only a count, but the total is known by the caller.
+public class UnknownTotalMonitor {
+ private uint64 total;
+ private unowned ProgressMonitor wrapped_monitor;
+
+ public UnknownTotalMonitor(uint64 total, ProgressMonitor wrapped_monitor) {
+ this.total = total;
+ this.wrapped_monitor = wrapped_monitor;
+ }
+
+ public bool monitor(uint64 count, uint64 total) {
+ return wrapped_monitor(count, this.total);
+ }
+}
+
+// AggregateProgressMonitor is useful when several discrete operations are being performed against
+// a single ProgressMonitor.
+public class AggregateProgressMonitor {
+ private uint64 grand_total;
+ private unowned ProgressMonitor wrapped_monitor;
+ private uint64 aggregate_count = 0;
+ private uint64 last_count = uint64.MAX;
+
+ public AggregateProgressMonitor(uint64 grand_total, ProgressMonitor wrapped_monitor) {
+ this.grand_total = grand_total;
+ this.wrapped_monitor = wrapped_monitor;
+ }
+
+ public void next_step(string name) {
+ debug("next step: %s (%s/%s)", name, aggregate_count.to_string(), grand_total.to_string());
+ last_count = uint64.MAX;
+ }
+
+ public bool monitor(uint64 count, uint64 total) {
+ // add the difference from the last, unless a new step has started
+ aggregate_count += (last_count != uint64.MAX) ? (count - last_count) : count;
+ if (aggregate_count > grand_total)
+ aggregate_count = grand_total;
+
+ // save for next time
+ last_count = count;
+
+ return wrapped_monitor(aggregate_count, grand_total);
+ }
+}
+
+// Useful when debugging.
+public bool null_progress_monitor(uint64 count, uint64 total) {
+ return true;
+}
+
+
+double degrees_to_radians(double theta) {
+ return (theta * (GLib.Math.PI / 180.0));
+}
diff --git a/src/data_imports/DataImportJob.vala b/src/data_imports/DataImportJob.vala
new file mode 100644
index 0000000..b27997c
--- /dev/null
+++ b/src/data_imports/DataImportJob.vala
@@ -0,0 +1,177 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+namespace Spit.DataImports {
+
+/**
+ * A specialized import job implementation for alien databases.
+ */
+public class DataImportJob : BatchImportJob {
+ private DataImportSource import_source;
+ private File? src_file;
+ private uint64 filesize;
+ private time_t exposure_time;
+ private DataImportJob? associated = null;
+ private HierarchicalTagIndex? detected_htags = null;
+
+ public DataImportJob(DataImportSource import_source) {
+ this.import_source = import_source;
+
+ // stash everything called in prepare(), as it may/will be called from a separate thread
+ src_file = import_source.get_file();
+ filesize = import_source.get_filesize();
+ exposure_time = import_source.get_exposure_time();
+ }
+
+ private HierarchicalTagIndex? build_exclusion_index(ImportableTag[] src_tags) {
+ Gee.Set<string> detected_htags = new Gee.HashSet<string>();
+
+ foreach (ImportableTag src_tag in src_tags) {
+ string? prepped = HierarchicalTagUtilities.join_path_components(
+ Tag.prep_tag_names(
+ build_path_components(src_tag)
+ )
+ );
+
+ if (prepped != null && prepped.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ detected_htags.add(prepped);
+
+ Gee.List<string> parents = HierarchicalTagUtilities.enumerate_parent_paths(prepped);
+ foreach (string parent in parents)
+ detected_htags.add(parent);
+ }
+ }
+
+ return (detected_htags.size > 0) ? HierarchicalTagIndex.from_paths(detected_htags) : null;
+ }
+
+ public time_t get_exposure_time() {
+ return exposure_time;
+ }
+
+ public override string get_dest_identifier() {
+ return import_source.get_filename();
+ }
+
+ public override string get_source_identifier() {
+ return import_source.get_filename();
+ }
+
+ public override bool is_directory() {
+ return false;
+ }
+
+ public override string get_basename() {
+ return src_file.get_basename();
+ }
+
+ public override string get_path() {
+ return src_file.get_parent().get_path();
+ }
+
+ public override void set_associated(BatchImportJob associated) {
+ this.associated = associated as DataImportJob;
+ }
+
+ public override bool determine_file_size(out uint64 filesize, out File file) {
+ file = null;
+ filesize = this.filesize;
+
+ return true;
+ }
+
+ public override bool prepare(out File file_to_import, out bool copy_to_library) throws Error {
+ file_to_import = src_file;
+ copy_to_library = false;
+
+ detected_htags = build_exclusion_index(import_source.get_photo().get_tags());
+
+ return true;
+ }
+
+ public override bool complete(MediaSource source, BatchImportRoll import_roll) throws Error {
+ LibraryPhoto? photo = source as LibraryPhoto;
+ if (photo == null)
+ return false;
+
+ ImportableMediaItem src_photo = import_source.get_photo();
+
+ // tags
+ if (detected_htags != null) {
+ Gee.Collection<string> paths = detected_htags.get_all_paths();
+
+ foreach (string path in paths)
+ Tag.for_path(path);
+ }
+
+ ImportableTag[] src_tags = src_photo.get_tags();
+ foreach (ImportableTag src_tag in src_tags) {
+ string? prepped = HierarchicalTagUtilities.join_path_components(
+ Tag.prep_tag_names(
+ build_path_components(src_tag)
+ )
+ );
+ if (prepped != null) {
+ if (HierarchicalTagUtilities.enumerate_path_components(prepped).size == 1) {
+ if (prepped.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ prepped = HierarchicalTagUtilities.hierarchical_to_flat(prepped);
+ } else {
+ Gee.List<string> parents =
+ HierarchicalTagUtilities.enumerate_parent_paths(prepped);
+
+ assert(parents.size > 0);
+
+ string top_level_parent = parents.get(0);
+ string flat_top_level_parent =
+ HierarchicalTagUtilities.hierarchical_to_flat(top_level_parent);
+
+ if (Tag.global.exists(flat_top_level_parent))
+ Tag.for_path(flat_top_level_parent).promote();
+ }
+
+ Tag.for_path(prepped).attach(photo);
+ }
+ }
+ // event
+ ImportableEvent? src_event = src_photo.get_event();
+ if (src_event != null) {
+ string? prepped = prepare_input_text(src_event.get_name(),
+ PrepareInputTextOptions.DEFAULT, -1);
+ if (prepped != null)
+ Event.generate_single_event(photo, import_roll.generated_events, prepped);
+ }
+ // rating
+ Rating dst_rating;
+ ImportableRating src_rating = src_photo.get_rating();
+ if (src_rating.is_rejected())
+ dst_rating = Rating.REJECTED;
+ else if (src_rating.is_unrated())
+ dst_rating = Rating.UNRATED;
+ else
+ dst_rating = Rating.unserialize(src_rating.get_value());
+ photo.set_rating(dst_rating);
+ // title
+ string? title = src_photo.get_title();
+ if (title != null)
+ photo.set_title(title);
+ // import ID
+ photo.set_import_id(import_roll.import_id);
+
+ return true;
+ }
+
+ private string[] build_path_components(ImportableTag tag) {
+ // use a linked list as we are always inserting in head position
+ Gee.List<string> components = new Gee.LinkedList<string>();
+ for (ImportableTag current_tag = tag; current_tag != null; current_tag = current_tag.get_parent()) {
+ components.insert(0, HierarchicalTagUtilities.make_flat_tag_safe(current_tag.get_name()));
+ }
+ return components.to_array();
+ }
+}
+
+}
+
diff --git a/src/data_imports/DataImportSource.vala b/src/data_imports/DataImportSource.vala
new file mode 100644
index 0000000..d7e8ec8
--- /dev/null
+++ b/src/data_imports/DataImportSource.vala
@@ -0,0 +1,135 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Spit.DataImports {
+
+/**
+ * Photo source implementation for alien databases. This class is responsible
+ * for extracting meta-data out of a source photo to support the import
+ * process.
+ *
+ * This class does not extend PhotoSource in order to minimise the API to the
+ * absolute minimum required to run the import job.
+ */
+public class DataImportSource {
+ private bool backing_file_found;
+ private ImportableMediaItem db_photo;
+ private string? title = null;
+ private string? preview_md5 = null;
+ private uint64 file_size;
+ private time_t modification_time;
+ private MetadataDateTime? exposure_time;
+
+ public DataImportSource(ImportableMediaItem db_photo) {
+ this.db_photo = db_photo;
+
+ // A well-behaved plugin will ensure that the path and file name are
+ // not null but we check just in case
+ string folder_path = db_photo.get_folder_path();
+ string filename = db_photo.get_filename();
+ File? photo = null;
+ if (folder_path != null && filename != null) {
+ photo = File.new_for_path(db_photo.get_folder_path()).
+ get_child(db_photo.get_filename());
+
+ backing_file_found = photo.query_exists();
+ } else {
+ backing_file_found = false;
+ }
+
+ if (photo != null && backing_file_found) {
+ PhotoMetadata? metadata = new PhotoMetadata();
+ try {
+ metadata.read_from_file(photo);
+ } catch(Error e) {
+ warning("Could not get file metadata for %s: %s", get_filename(), e.message);
+ metadata = null;
+ }
+
+ title = (metadata != null) ? metadata.get_title() : null;
+ exposure_time = (metadata != null) ? metadata.get_exposure_date_time() : null;
+ PhotoPreview? preview = metadata != null ? metadata.get_preview(0) : null;
+ if (preview != null) {
+ try {
+ uint8[] preview_raw = preview.flatten();
+ preview_md5 = md5_binary(preview_raw, preview_raw.length);
+ } catch(Error e) {
+ warning("Could not get raw preview for %s: %s", get_filename(), e.message);
+ }
+ }
+#if TRACE_MD5
+ debug("Photo MD5 %s: preview=%s", get_filename(), preview_md5);
+#endif
+
+ try {
+ file_size = query_total_file_size(photo);
+ } catch(Error e) {
+ warning("Could not get file size for %s: %s", get_filename(), e.message);
+ }
+ try {
+ modification_time = query_file_modified(photo);
+ } catch(Error e) {
+ warning("Could not get modification time for %s: %s", get_filename(), e.message);
+ }
+ } else {
+ debug ("Photo file %s not found".printf(photo.get_path()));
+ }
+ }
+
+ public string get_filename() {
+ return db_photo.get_filename();
+ }
+
+ public string get_fulldir() {
+ return db_photo.get_folder_path();
+ }
+
+ public File get_file() {
+ return File.new_for_path(get_fulldir()).get_child(get_filename());
+ }
+
+ public string get_name() {
+ return !is_string_empty(title) ? title : get_filename();
+ }
+
+ public string? get_title() {
+ return title;
+ }
+
+ public PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.get_by_basename_extension(get_filename());
+ }
+
+ public string to_string() {
+ return get_name();
+ }
+
+ public time_t get_exposure_time() {
+ return (exposure_time != null) ? exposure_time.get_timestamp() : modification_time;
+ }
+
+ public uint64 get_filesize() {
+ return file_size;
+ }
+
+ public ImportableMediaItem get_photo() {
+ return db_photo;
+ }
+
+ public bool is_already_imported() {
+ // ignore trashed duplicates
+ return (preview_md5 != null)
+ ? LibraryPhoto.has_nontrash_duplicate(null, preview_md5, null, get_file_format())
+ : false;
+ }
+
+ public bool was_backing_file_found() {
+ return backing_file_found;
+ }
+}
+
+}
+
diff --git a/src/data_imports/DataImports.vala b/src/data_imports/DataImports.vala
new file mode 100644
index 0000000..72c8b4d
--- /dev/null
+++ b/src/data_imports/DataImports.vala
@@ -0,0 +1,30 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the DataImports unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace DataImports {
+
+public void init() throws Error {
+ string[] core_ids = new string[0];
+ core_ids += "org.yorba.shotwell.dataimports.fspot";
+
+ Plugins.register_extension_point(typeof(Spit.DataImports.Service), _("Data Imports"),
+ Resources.IMPORT, core_ids);
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/data_imports/DataImportsPluginHost.vala b/src/data_imports/DataImportsPluginHost.vala
new file mode 100644
index 0000000..f92bc53
--- /dev/null
+++ b/src/data_imports/DataImportsPluginHost.vala
@@ -0,0 +1,482 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Spit.DataImports {
+
+private class CoreImporter {
+ private weak Spit.DataImports.PluginHost host;
+ public int imported_items_count = 0;
+ public BatchImportRoll? current_import_roll = null;
+
+ public CoreImporter(Spit.DataImports.PluginHost host) {
+ this.host = host;
+ }
+
+ public void prepare_media_items_for_import(
+ ImportableMediaItem[] items,
+ double progress,
+ double host_progress_delta = 0.0,
+ string? progress_message = null
+ ) {
+ host.update_import_progress_pane(progress, progress_message);
+ //
+ SortedList<DataImportJob> jobs =
+ new SortedList<DataImportJob>(import_job_comparator);
+ Gee.ArrayList<DataImportJob> already_imported =
+ new Gee.ArrayList<DataImportJob>();
+ Gee.ArrayList<DataImportJob> failed =
+ new Gee.ArrayList<DataImportJob>();
+
+ int item_idx = 0;
+ double item_progress_delta = host_progress_delta / items.length;
+ foreach (ImportableMediaItem src_item in items) {
+ DataImportSource import_source = new DataImportSource(src_item);
+
+ if (!import_source.was_backing_file_found()) {
+ message("Skipping import of %s: backing file not found",
+ import_source.get_filename());
+ failed.add(new DataImportJob(import_source));
+
+ continue;
+ }
+
+ if (import_source.is_already_imported()) {
+ message("Skipping import of %s: checksum detected in library",
+ import_source.get_filename());
+ already_imported.add(new DataImportJob(import_source));
+
+ continue;
+ }
+
+ jobs.add(new DataImportJob(import_source));
+ item_idx++;
+ host.update_import_progress_pane(progress + item_idx * item_progress_delta);
+ }
+
+ if (jobs.size > 0) {
+ // If there it no current import roll, create one to ensure that all
+ // imported items end up in the same roll even if this method is called
+ // several times
+ if (current_import_roll == null)
+ current_import_roll = new BatchImportRoll();
+ string db_name = _("%s Database").printf(host.get_data_importer().get_service().get_pluggable_name());
+ BatchImport batch_import = new BatchImport(jobs, db_name, data_import_reporter,
+ failed, already_imported, null, current_import_roll);
+
+ LibraryWindow.get_app().enqueue_batch_import(batch_import, true);
+ imported_items_count += jobs.size;
+ }
+
+ host.update_import_progress_pane(progress + host_progress_delta);
+ }
+
+ public void finalize_import() {
+ // Send an empty job to the queue to mark the end of the import
+ string db_name = _("%s Database").printf(host.get_data_importer().get_service().get_pluggable_name());
+ BatchImport batch_import = new BatchImport(
+ new Gee.ArrayList<BatchImportJob>(), db_name, data_import_reporter, null, null, null, current_import_roll
+ );
+ LibraryWindow.get_app().enqueue_batch_import(batch_import, true);
+ current_import_roll = null;
+ }
+}
+
+public class ConcreteDataImportsHost : Plugins.StandardHostInterface,
+ Spit.DataImports.PluginHost {
+
+ private Spit.DataImports.DataImporter active_importer = null;
+ private weak DataImportsUI.DataImportsDialog dialog = null;
+ private DataImportsUI.ProgressPane? progress_pane = null;
+ private bool importing_halted = false;
+ private CoreImporter core_importer;
+
+ public ConcreteDataImportsHost(Service service, DataImportsUI.DataImportsDialog dialog) {
+ base(service, "data_imports");
+ this.dialog = dialog;
+
+ this.active_importer = service.create_data_importer(this);
+ this.core_importer = new CoreImporter(this);
+ }
+
+ public DataImporter get_data_importer() {
+ return active_importer;
+ }
+
+ public void start_importing() {
+ if (get_data_importer().is_running())
+ return;
+
+ debug("ConcreteDataImportsHost.start_importing( ): invoked.");
+
+ get_data_importer().start();
+ }
+
+ public void stop_importing() {
+ debug("ConcreteDataImportsHost.stop_importing( ): invoked.");
+
+ if (get_data_importer().is_running())
+ get_data_importer().stop();
+
+ clean_up();
+
+ importing_halted = true;
+ }
+
+ private void clean_up() {
+ progress_pane = null;
+ }
+
+ public void set_button_mode(Spit.DataImports.PluginHost.ButtonMode mode) {
+ if (mode == Spit.DataImports.PluginHost.ButtonMode.CLOSE)
+ dialog.set_close_button_mode();
+ else if (mode == Spit.DataImports.PluginHost.ButtonMode.CANCEL)
+ dialog.set_cancel_button_mode();
+ else
+ error("unrecognized button mode enumeration value");
+ }
+
+ // Pane handling methods
+
+ public void post_error(Error err) {
+ post_error_message(err.message);
+ }
+
+ public void post_error_message(string message) {
+ string msg = _("Importing from %s can't continue because an error occurred:").printf(
+ active_importer.get_service().get_pluggable_name());
+ msg += GLib.Markup.printf_escaped("\n\n<i>%s</i>\n\n", message);
+ msg += _("To try importing from another service, select one from the above menu.");
+
+ dialog.install_pane(new DataImportsUI.StaticMessagePane.with_pango(msg));
+ dialog.set_close_button_mode();
+ dialog.unlock_service();
+
+ get_data_importer().stop();
+
+ // post_error_message( ) tells the active_importer to stop importing and displays a
+ // non-removable error pane that effectively ends the publishing interaction,
+ // so no problem calling clean_up( ) here.
+ clean_up();
+ }
+
+ public void install_dialog_pane(Spit.DataImports.DialogPane pane,
+ Spit.DataImports.PluginHost.ButtonMode button_mode = Spit.DataImports.PluginHost.ButtonMode.CANCEL) {
+ debug("DataImports.PluginHost: install_dialog_pane( ): invoked.");
+
+ if (get_data_importer() == null || (!get_data_importer().is_running()))
+ return;
+
+ dialog.install_pane(pane);
+
+ set_button_mode(button_mode);
+ }
+
+ public void install_static_message_pane(string message,
+ Spit.DataImports.PluginHost.ButtonMode button_mode = Spit.DataImports.PluginHost.ButtonMode.CANCEL) {
+
+ set_button_mode(button_mode);
+
+ dialog.install_pane(new DataImportsUI.StaticMessagePane.with_pango(message));
+ }
+
+ public void install_library_selection_pane(
+ string welcome_message,
+ ImportableLibrary[] discovered_libraries,
+ string? file_select_label
+ ) {
+ if (discovered_libraries.length == 0 && file_select_label == null)
+ post_error_message("Libraries or file option needed");
+ else
+ dialog.install_pane(new DataImportsUI.LibrarySelectionPane(
+ this,
+ welcome_message,
+ discovered_libraries,
+ file_select_label
+ ));
+ set_button_mode(Spit.DataImports.PluginHost.ButtonMode.CLOSE);
+ }
+
+ public void install_import_progress_pane(
+ string message
+ ) {
+ progress_pane = new DataImportsUI.ProgressPane(message);
+ dialog.install_pane(progress_pane);
+ set_button_mode(Spit.DataImports.PluginHost.ButtonMode.CANCEL);
+ // initialize the import
+ core_importer.imported_items_count = 0;
+ core_importer.current_import_roll = null;
+ }
+
+ public void update_import_progress_pane(
+ double progress,
+ string? progress_message = null
+ ) {
+ if (progress_pane != null) {
+ progress_pane.update_progress(progress, progress_message);
+ }
+ }
+
+ public void prepare_media_items_for_import(
+ ImportableMediaItem[] items,
+ double progress,
+ double host_progress_delta = 0.0,
+ string? progress_message = null
+ ) {
+ core_importer.prepare_media_items_for_import(items, progress, host_progress_delta, progress_message);
+ }
+
+ public void finalize_import(
+ ImportedItemsCountCallback report_imported_items_count,
+ string? finalize_message = null
+ ) {
+ update_import_progress_pane(1.0, finalize_message);
+ set_button_mode(Spit.DataImports.PluginHost.ButtonMode.CLOSE);
+ core_importer.finalize_import();
+ report_imported_items_count(core_importer.imported_items_count);
+ if (core_importer.imported_items_count > 0)
+ LibraryWindow.get_app().switch_to_import_queue_page();
+ }
+}
+
+public class WelcomeDataImportsHost : Plugins.StandardHostInterface,
+ Spit.DataImports.PluginHost {
+
+ private weak WelcomeImportMetaHost meta_host;
+ private Spit.DataImports.DataImporter active_importer = null;
+ private bool importing_halted = false;
+ private CoreImporter core_importer;
+
+ public WelcomeDataImportsHost(Service service, WelcomeImportMetaHost meta_host) {
+ base(service, "data_imports");
+
+ this.active_importer = service.create_data_importer(this);
+ this.core_importer = new CoreImporter(this);
+ this.meta_host = meta_host;
+ }
+
+ public DataImporter get_data_importer() {
+ return active_importer;
+ }
+
+ public void start_importing() {
+ if (get_data_importer().is_running())
+ return;
+
+ debug("WelcomeDataImportsHost.start_importing( ): invoked.");
+
+ get_data_importer().start();
+ }
+
+ public void stop_importing() {
+ debug("WelcomeDataImportsHost.stop_importing( ): invoked.");
+
+ if (get_data_importer().is_running())
+ get_data_importer().stop();
+
+ clean_up();
+
+ importing_halted = true;
+ }
+
+ private void clean_up() {
+ }
+
+ // Pane handling methods
+
+ public void post_error(Error err) {
+ post_error_message(err.message);
+ }
+
+ public void post_error_message(string message) {
+ string msg = _("Importing from %s can't continue because an error occurred:").printf(
+ active_importer.get_service().get_pluggable_name());
+
+ debug(msg);
+
+ get_data_importer().stop();
+
+ // post_error_message( ) tells the active_importer to stop importing and displays a
+ // non-removable error pane that effectively ends the publishing interaction,
+ // so no problem calling clean_up( ) here.
+ clean_up();
+ }
+
+ public void install_dialog_pane(Spit.DataImports.DialogPane pane,
+ Spit.DataImports.PluginHost.ButtonMode button_mode = Spit.DataImports.PluginHost.ButtonMode.CANCEL) {
+ // do nothing
+ }
+
+ public void install_static_message_pane(string message,
+ Spit.DataImports.PluginHost.ButtonMode button_mode = Spit.DataImports.PluginHost.ButtonMode.CANCEL) {
+ // do nothing
+ }
+
+ public void install_library_selection_pane(
+ string welcome_message,
+ ImportableLibrary[] discovered_libraries,
+ string? file_select_label
+ ) {
+ debug("WelcomeDataImportsHost: Installing library selection pane for %s".printf(get_data_importer().get_service().get_pluggable_name()));
+ if (discovered_libraries.length > 0) {
+ meta_host.install_service_entry(new WelcomeImportServiceEntry(
+ this,
+ get_data_importer().get_service().get_pluggable_name(),
+ discovered_libraries
+ ));
+ }
+ }
+
+ public void install_import_progress_pane(
+ string message
+ ) {
+ // empty implementation
+ }
+
+ public void update_import_progress_pane(
+ double progress,
+ string? progress_message = null
+ ) {
+ // empty implementation
+ }
+
+ public void prepare_media_items_for_import(
+ ImportableMediaItem[] items,
+ double progress,
+ double host_progress_delta = 0.0,
+ string? progress_message = null
+ ) {
+ core_importer.prepare_media_items_for_import(items, progress, host_progress_delta, progress_message);
+ }
+
+ public void finalize_import(
+ ImportedItemsCountCallback report_imported_items_count,
+ string? finalize_message = null
+ ) {
+ core_importer.finalize_import();
+ report_imported_items_count(core_importer.imported_items_count);
+ meta_host.finalize_import(this);
+ }
+}
+
+
+//public delegate void WelcomeImporterCallback();
+
+public class WelcomeImportServiceEntry : GLib.Object, WelcomeServiceEntry {
+ private string pluggable_name;
+ private ImportableLibrary[] discovered_libraries;
+ private Spit.DataImports.PluginHost host;
+
+ public WelcomeImportServiceEntry(
+ Spit.DataImports.PluginHost host,
+ string pluggable_name, ImportableLibrary[] discovered_libraries) {
+
+ this.host = host;
+ this.pluggable_name = pluggable_name;
+ this.discovered_libraries = discovered_libraries;
+ }
+
+ public string get_service_name() {
+ return pluggable_name;
+ }
+
+ public void execute() {
+ foreach (ImportableLibrary library in discovered_libraries) {
+ host.get_data_importer().on_library_selected(library);
+ }
+ }
+}
+
+public class WelcomeImportMetaHost : GLib.Object {
+ private WelcomeDialog dialog;
+
+ public WelcomeImportMetaHost(WelcomeDialog dialog) {
+ this.dialog = dialog;
+ }
+
+ public void start() {
+ Service[] services = load_all_services();
+ foreach (Service service in services) {
+ WelcomeDataImportsHost host = new WelcomeDataImportsHost(service, this);
+ host.start_importing();
+ }
+ }
+
+ public void finalize_import(WelcomeDataImportsHost host) {
+ host.stop_importing();
+ }
+
+ public void install_service_entry(WelcomeServiceEntry entry) {
+ debug("WelcomeImportMetaHost: Installing service entry for %s".printf(entry.get_service_name()));
+ dialog.install_service_entry(entry);
+ }
+}
+
+public static Spit.DataImports.Service[] load_all_services() {
+ return load_services(true);
+}
+
+public static Spit.DataImports.Service[] load_services(bool load_all = false) {
+ Spit.DataImports.Service[] loaded_services = new Spit.DataImports.Service[0];
+
+ // load publishing services from plug-ins
+ Gee.Collection<Spit.Pluggable> pluggables = Plugins.get_pluggables_for_type(
+ typeof(Spit.DataImports.Service), null, load_all);
+ // TODO: include sorting function to ensure consistent order
+
+ debug("DataImportsDialog: discovered %d pluggable data import services.", pluggables.size);
+
+ foreach (Spit.Pluggable pluggable in pluggables) {
+ int pluggable_interface = pluggable.get_pluggable_interface(
+ Spit.DataImports.CURRENT_INTERFACE, Spit.DataImports.CURRENT_INTERFACE);
+ if (pluggable_interface != Spit.DataImports.CURRENT_INTERFACE) {
+ warning("Unable to load data import plugin %s: reported interface %d.",
+ Plugins.get_pluggable_module_id(pluggable), pluggable_interface);
+
+ continue;
+ }
+
+ Spit.DataImports.Service service =
+ (Spit.DataImports.Service) pluggable;
+
+ debug("DataImportsDialog: discovered pluggable data import service '%s'.",
+ service.get_pluggable_name());
+
+ loaded_services += service;
+ }
+
+ // Sort import services by name.
+ // TODO: extract to a function to sort it on initial request
+ Posix.qsort(loaded_services, loaded_services.length, sizeof(Spit.DataImports.Service),
+ (a, b) => {return utf8_cs_compare((*((Spit.DataImports.Service**) a))->get_pluggable_name(),
+ (*((Spit.DataImports.Service**) b))->get_pluggable_name());
+ });
+
+ return loaded_services;
+}
+
+private ImportManifest? meta_manifest = null;
+
+private void data_import_reporter(ImportManifest manifest, BatchImportRoll import_roll) {
+ if (manifest.all.size > 0) {
+ if (meta_manifest == null)
+ meta_manifest = new ImportManifest();
+ foreach (BatchImportResult result in manifest.all) {
+ meta_manifest.add_result(result);
+ }
+ } else {
+ DataImportsUI.DataImportsDialog.terminate_instance();
+ ImportUI.report_manifest(meta_manifest, true);
+ meta_manifest = null;
+ }
+}
+
+private int64 import_job_comparator(void *a, void *b) {
+ return ((DataImportJob *) a)->get_exposure_time()
+ - ((DataImportJob *) b)->get_exposure_time();
+}
+
+}
+
diff --git a/src/data_imports/DataImportsUI.vala b/src/data_imports/DataImportsUI.vala
new file mode 100644
index 0000000..9b171b1
--- /dev/null
+++ b/src/data_imports/DataImportsUI.vala
@@ -0,0 +1,445 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace DataImportsUI {
+
+internal const string NO_PLUGINS_ENABLED_MESSAGE =
+ _("You do not have any data imports plugins enabled.\n\nIn order to use the Import From Application functionality, you need to have at least one data imports plugin enabled. Plugins can be enabled in the Preferences dialog.");
+
+public class ConcreteDialogPane : Spit.DataImports.DialogPane, GLib.Object {
+ private Gtk.Box pane_widget;
+
+ public ConcreteDialogPane() {
+ pane_widget = new Gtk.Box(Gtk.Orientation.VERTICAL, 8);
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.DataImports.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.DataImports.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+public class StaticMessagePane : ConcreteDialogPane {
+ public StaticMessagePane(string message_string) {
+ Gtk.Label message_label = new Gtk.Label(message_string);
+ (get_widget() as Gtk.Box).pack_start(message_label, true, true, 0);
+ }
+
+ public StaticMessagePane.with_pango(string msg) {
+ Gtk.Label label = new Gtk.Label(null);
+ label.set_markup(msg);
+ label.set_line_wrap(true);
+
+ (get_widget() as Gtk.Box).pack_start(label, true, true, 0);
+ }
+}
+
+public class LibrarySelectionPane : ConcreteDialogPane {
+ private weak Spit.DataImports.PluginHost host;
+ private Spit.DataImports.ImportableLibrary? selected_library = null;
+ private File? selected_file = null;
+ private Gtk.Button import_button;
+ private Gtk.RadioButton? file_radio = null;
+
+ public LibrarySelectionPane(
+ Spit.DataImports.PluginHost host,
+ string welcome_message,
+ Spit.DataImports.ImportableLibrary[] discovered_libraries,
+ string? file_select_label
+ ) {
+ assert(discovered_libraries.length > 0 || on_file_selected != null);
+
+ this.host = host;
+
+ Gtk.Box content_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 8);
+ content_box.set_margin_left(30);
+ content_box.set_margin_right(30);
+ Gtk.Label welcome_label = new Gtk.Label(null);
+ welcome_label.set_markup(welcome_message);
+ welcome_label.set_line_wrap(true);
+ welcome_label.set_halign(Gtk.Align.START);
+ content_box.pack_start(welcome_label, true, true, 6);
+
+ // margins for buttons
+ int radio_margin_left = 20;
+ int radio_margin_right = 20;
+ int chooser_margin_left = radio_margin_left;
+ int chooser_margin_right = radio_margin_right;
+
+ Gtk.RadioButton lib_radio = null;
+ if (discovered_libraries.length > 0) {
+ chooser_margin_left = radio_margin_left + 20;
+ foreach (Spit.DataImports.ImportableLibrary library in discovered_libraries) {
+ string lib_radio_label = library.get_display_name();
+ lib_radio = create_radio_button(
+ content_box, lib_radio, library, lib_radio_label,
+ radio_margin_left, radio_margin_right
+ );
+ }
+ if (file_select_label != null) {
+ lib_radio = create_radio_button(
+ content_box, lib_radio, null, file_select_label,
+ radio_margin_left, radio_margin_right
+ );
+ file_radio = lib_radio;
+ }
+ }
+ if (file_select_label != null) {
+ Gtk.FileChooserButton file_chooser = new Gtk.FileChooserButton(_("Database file:"), Gtk.FileChooserAction.OPEN);
+ file_chooser.selection_changed.connect(() => {
+ selected_file = file_chooser.get_file();
+ if (file_radio != null)
+ file_radio.active = true;
+ set_import_button_sensitivity();
+ });
+ file_chooser.set_margin_left(chooser_margin_left);
+ file_chooser.set_margin_right(chooser_margin_right);
+ content_box.pack_start(file_chooser, false, false, 6);
+ }
+
+ import_button = new Gtk.Button.with_mnemonic(_("_Import"));
+ import_button.clicked.connect(() => {
+ if (selected_library != null)
+ on_library_selected(selected_library);
+ else if (selected_file != null)
+ on_file_selected(selected_file);
+ else
+ debug("LibrarySelectionPane: Library or file should be selected.");
+ });
+ Gtk.ButtonBox button_box = new Gtk.ButtonBox(Gtk.Orientation.HORIZONTAL);
+ button_box.layout_style = Gtk.ButtonBoxStyle.CENTER;
+ button_box.add(import_button);
+ content_box.pack_end(button_box, true, false, 6);
+
+ (get_widget() as Gtk.Box).pack_start(content_box, true, true, 0);
+
+ set_import_button_sensitivity();
+ }
+
+ private Gtk.RadioButton create_radio_button(
+ Gtk.Box box, Gtk.RadioButton? group, Spit.DataImports.ImportableLibrary? library, string label,
+ int margin_left, int margin_right
+ ) {
+ var button = new Gtk.RadioButton.with_label_from_widget (group, label);
+ if (group == null) { // first radio button is active
+ button.active = true;
+ selected_library = library;
+ }
+ button.toggled.connect (() => {
+ if (button.active) {
+ this.selected_library = library;
+ set_import_button_sensitivity();
+ }
+
+ });
+ button.set_margin_left(margin_left);
+ button.set_margin_right(margin_right);
+ box.pack_start(button, false, false, 6);
+ return button;
+ }
+
+ private void set_import_button_sensitivity() {
+ import_button.set_sensitive(selected_library != null || selected_file != null);
+ }
+
+ private void on_library_selected(Spit.DataImports.ImportableLibrary library) {
+ host.get_data_importer().on_library_selected(library);
+ }
+
+ private void on_file_selected(File file) {
+ host.get_data_importer().on_file_selected(file);
+ }
+}
+
+public class ProgressPane : ConcreteDialogPane {
+ private Gtk.Label message_label;
+ private Gtk.Label progress_label;
+ private Gtk.ProgressBar progress_bar;
+
+ public ProgressPane(string message) {
+ Gtk.Box content_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 8);
+ message_label = new Gtk.Label(message);
+ content_box.pack_start(message_label, true, true, 6);
+ progress_bar = new Gtk.ProgressBar();
+ content_box.pack_start(progress_bar, false, true, 6);
+ progress_label = new Gtk.Label("");
+ content_box.pack_start(progress_label, false, true, 6);
+
+ (get_widget() as Gtk.Container).add(content_box);
+ }
+
+ public void update_progress(double progress, string? progress_message) {
+ progress_bar.set_fraction(progress);
+ if (progress_message != null)
+ progress_label.set_label(progress_message);
+ spin_event_loop();
+ }
+}
+
+public class DataImportsDialog : Gtk.Dialog {
+ private const int LARGE_WINDOW_WIDTH = 860;
+ private const int LARGE_WINDOW_HEIGHT = 688;
+ private const int COLOSSAL_WINDOW_WIDTH = 1024;
+ private const int COLOSSAL_WINDOW_HEIGHT = 688;
+ private const int STANDARD_WINDOW_WIDTH = 600;
+ private const int STANDARD_WINDOW_HEIGHT = 510;
+ private const int BORDER_REGION_WIDTH = 16;
+ private const int BORDER_REGION_HEIGHT = 100;
+
+ public const int STANDARD_CONTENT_LABEL_WIDTH = 500;
+ public const int STANDARD_ACTION_BUTTON_WIDTH = 128;
+
+ private Gtk.ComboBoxText service_selector_box;
+ private Gtk.Label service_selector_box_label;
+ private Gtk.Box central_area_layouter;
+ private Gtk.Button close_cancel_button;
+ private Spit.DataImports.DialogPane active_pane;
+ private Spit.DataImports.ConcreteDataImportsHost host;
+
+ protected DataImportsDialog() {
+
+ resizable = false;
+ delete_event.connect(on_window_close);
+
+ string title = _("Import From Application");
+ string label = _("Import media _from:");
+
+ set_title(title);
+
+ Spit.DataImports.Service[] loaded_services = Spit.DataImports.load_services();
+
+ if (loaded_services.length > 0) {
+ // Install the service selector part only if there is at least one
+ // service to select from
+ service_selector_box = new Gtk.ComboBoxText();
+ service_selector_box.set_active(0);
+ service_selector_box_label = new Gtk.Label.with_mnemonic(label);
+ service_selector_box_label.set_mnemonic_widget(service_selector_box);
+ service_selector_box_label.set_alignment(0.0f, 0.5f);
+
+ // get the name of the service the user last used
+ string? last_used_service = Config.Facade.get_instance().get_last_used_dataimports_service();
+
+ int ticker = 0;
+ int last_used_index = -1;
+ foreach (Spit.DataImports.Service service in loaded_services) {
+ string curr_service_id = service.get_id();
+ if (last_used_service != null && last_used_service == curr_service_id)
+ last_used_index = ticker;
+
+ service_selector_box.append_text(service.get_pluggable_name());
+ ticker++;
+ }
+ if (last_used_index >= 0)
+ service_selector_box.set_active(last_used_index);
+ else
+ service_selector_box.set_active(0);
+
+ service_selector_box.changed.connect(on_service_changed);
+
+ /* the wrapper is not an extraneous widget -- it's necessary to prevent the service
+ selection box from growing and shrinking whenever its parent's size changes.
+ When wrapped inside a Gtk.Alignment, the Alignment grows and shrinks instead of
+ the service selection box. */
+ Gtk.Alignment service_selector_box_wrapper = new Gtk.Alignment(1.0f, 0.5f, 0.0f, 0.0f);
+ service_selector_box_wrapper.add(service_selector_box);
+
+ Gtk.Box service_selector_layouter = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ service_selector_layouter.set_border_width(12);
+ service_selector_layouter.add(service_selector_box_label);
+ service_selector_layouter.pack_start(service_selector_box_wrapper, true, true, 0);
+
+ /* 'service area' is the selector assembly plus the horizontal rule dividing it from the
+ rest of the dialog */
+ Gtk.Box service_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ service_area_layouter.pack_start(service_selector_layouter, true, true, 0);
+ Gtk.Separator service_central_separator = new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
+ service_area_layouter.add(service_central_separator);
+
+ Gtk.Alignment service_area_wrapper = new Gtk.Alignment(0.0f, 0.0f, 1.0f, 0.0f);
+ service_area_wrapper.add(service_area_layouter);
+
+ ((Gtk.Box) get_content_area()).pack_start(service_area_wrapper, false, false, 0);
+ }
+
+ // Intall the central area in all cases
+ central_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ ((Gtk.Box) get_content_area()).pack_start(central_area_layouter, true, true, 0);
+
+ close_cancel_button = new Gtk.Button.with_mnemonic("_Cancel");
+ close_cancel_button.set_can_default(true);
+ close_cancel_button.clicked.connect(on_close_cancel_clicked);
+ ((Gtk.Box) get_action_area()).add(close_cancel_button);
+
+ set_standard_window_mode();
+
+ if (loaded_services.length > 0) {
+ // trigger the selected service if at least one service is available
+ on_service_changed();
+ } else {
+ // otherwise, install a message pane advising the user what to do
+ install_pane(new StaticMessagePane.with_pango(NO_PLUGINS_ENABLED_MESSAGE));
+ set_close_button_mode();
+ }
+
+ show_all();
+ }
+
+ public static DataImportsDialog get_or_create_instance() {
+ if (instance == null) {
+ instance = new DataImportsDialog();
+ }
+ return instance;
+ }
+
+ public static void terminate_instance() {
+ if (instance != null) {
+ instance.terminate();
+ }
+ instance = null;
+ }
+
+ private bool on_window_close(Gdk.EventAny evt) {
+ debug("DataImportsDialog: on_window_close( ): invoked.");
+ terminate();
+
+ return true;
+ }
+
+ private void on_service_changed() {
+ debug("DataImportsDialog: on_service_changed invoked.");
+ string service_name = service_selector_box.get_active_text();
+
+ Spit.DataImports.Service? selected_service = null;
+ Spit.DataImports.Service[] services = Spit.DataImports.load_all_services();
+ foreach (Spit.DataImports.Service service in services) {
+ if (service.get_pluggable_name() == service_name) {
+ selected_service = service;
+ break;
+ }
+ }
+ assert(selected_service != null);
+
+ Config.Facade.get_instance().set_last_used_dataimports_service(selected_service.get_id());
+
+ host = new Spit.DataImports.ConcreteDataImportsHost(selected_service, this);
+ host.start_importing();
+ }
+
+ private void on_close_cancel_clicked() {
+ debug("DataImportsDialog: on_close_cancel_clicked( ): invoked.");
+
+ terminate();
+ }
+
+ private void terminate() {
+ debug("DataImportsDialog: terminate( ): invoked.");
+
+ if (host != null) {
+ host.stop_importing();
+ host = null;
+ }
+
+ hide();
+ destroy();
+ instance = null;
+ }
+
+ private void set_large_window_mode() {
+ set_size_request(LARGE_WINDOW_WIDTH, LARGE_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(LARGE_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ LARGE_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_colossal_window_mode() {
+ set_size_request(COLOSSAL_WINDOW_WIDTH, COLOSSAL_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(COLOSSAL_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ COLOSSAL_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_standard_window_mode() {
+ set_size_request(STANDARD_WINDOW_WIDTH, STANDARD_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(STANDARD_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ STANDARD_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_free_sizable_window_mode() {
+ resizable = true;
+ }
+
+ private void clear_free_sizable_window_mode() {
+ resizable = false;
+ }
+
+ public Spit.DataImports.DialogPane get_active_pane() {
+ return active_pane;
+ }
+
+ public void set_close_button_mode() {
+ close_cancel_button.set_label(_("_Close"));
+ set_default(close_cancel_button);
+ }
+
+ public void set_cancel_button_mode() {
+ close_cancel_button.set_label(_("_Cancel"));
+ }
+
+ public void lock_service() {
+ service_selector_box.set_sensitive(false);
+ }
+
+ public void unlock_service() {
+ service_selector_box.set_sensitive(true);
+ }
+
+ public void install_pane(Spit.DataImports.DialogPane pane) {
+ debug("DataImportsDialog: install_pane( ): invoked.");
+
+ if (active_pane != null) {
+ debug("DataImportsDialog: install_pane( ): a pane is already installed; removing it.");
+
+ active_pane.on_pane_uninstalled();
+ central_area_layouter.remove(active_pane.get_widget());
+ }
+
+ central_area_layouter.pack_start(pane.get_widget(), true, true, 0);
+ show_all();
+
+ Spit.DataImports.DialogPane.GeometryOptions geometry_options =
+ pane.get_preferred_geometry();
+ if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.EXTENDED_SIZE) != 0)
+ set_large_window_mode();
+ else if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.COLOSSAL_SIZE) != 0)
+ set_colossal_window_mode();
+ else
+ set_standard_window_mode();
+
+ if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.RESIZABLE) != 0)
+ set_free_sizable_window_mode();
+ else
+ clear_free_sizable_window_mode();
+
+ active_pane = pane;
+ pane.on_pane_installed();
+ }
+
+ private static DataImportsDialog? instance;
+}
+
+}
+
diff --git a/src/data_imports/mk/data_imports.mk b/src/data_imports/mk/data_imports.mk
new file mode 100644
index 0000000..771ba74
--- /dev/null
+++ b/src/data_imports/mk/data_imports.mk
@@ -0,0 +1,31 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := DataImports
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := data_imports
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ DataImportsPluginHost.vala \
+ DataImportsUI.vala \
+ DataImportJob.vala \
+ DataImportSource.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/db/DatabaseTable.vala b/src/db/DatabaseTable.vala
new file mode 100644
index 0000000..55d440d
--- /dev/null
+++ b/src/db/DatabaseTable.vala
@@ -0,0 +1,384 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public errordomain DatabaseError {
+ ERROR,
+ BACKING,
+ MEMORY,
+ ABORT,
+ LIMITS,
+ TYPESPEC
+}
+
+public abstract class DatabaseTable {
+ /***
+ * This number should be incremented every time any database schema is altered.
+ *
+ * NOTE: Adding or removing tables or removing columns do not need a new schema version, because
+ * tables are created on demand and tables and columns are easily ignored when already present.
+ * However, the change should be noted in upgrade_database() as a comment.
+ ***/
+ public const int SCHEMA_VERSION = 20;
+
+ protected static Sqlite.Database db;
+
+ private static int in_transaction = 0;
+
+ public string table_name = null;
+
+ private static void prepare_db(string filename) {
+ // Open DB.
+ int res = Sqlite.Database.open_v2(filename, out db, Sqlite.OPEN_READWRITE | Sqlite.OPEN_CREATE,
+ null);
+ if (res != Sqlite.OK)
+ AppWindow.panic(_("Unable to open/create photo database %s: error code %d").printf(filename,
+ res));
+
+ // Check if we have write access to database.
+ if (filename != Db.IN_MEMORY_NAME) {
+ try {
+ File file_db = File.new_for_path(filename);
+ FileInfo info = file_db.query_info(FileAttribute.ACCESS_CAN_WRITE, FileQueryInfoFlags.NONE);
+ if (!info.get_attribute_boolean(FileAttribute.ACCESS_CAN_WRITE))
+ AppWindow.panic(_("Unable to write to photo database file:\n %s").printf(filename));
+ } catch (Error e) {
+ AppWindow.panic(_("Error accessing database file:\n %s\n\nError was: \n%s").printf(filename,
+ e.message));
+ }
+ }
+ }
+
+ public static void init(string filename) {
+ // Open DB.
+ prepare_db(filename);
+
+ // Try a query to make sure DB is intact; if not, try to use the backup
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS VersionTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "schema_version INTEGER, "
+ + "app_version TEXT, "
+ + "user_data TEXT NULL"
+ + ")", -1, out stmt);
+
+ // Query on db failed, copy over backup and open it
+ if(res != Sqlite.OK) {
+ db = null;
+
+ string backup_path = filename + ".bak";
+ string cmdline = "cp " + backup_path + " " + filename;
+ Posix.system(cmdline);
+
+ prepare_db(filename);
+ }
+
+ // disable synchronized commits for performance reasons ... this is not vital, hence we
+ // don't error out if this fails
+ res = db.exec("PRAGMA synchronous=OFF");
+ if (res != Sqlite.OK)
+ warning("Unable to disable synchronous mode", res);
+ }
+
+ public static void terminate() {
+ // freeing the database closes it
+ db = null;
+ }
+
+ // XXX: errmsg() is global, and so this will not be accurate in a threaded situation
+ protected static void fatal(string op, int res) {
+ error("%s: [%d] %s", op, res, db.errmsg());
+ }
+
+ // XXX: errmsg() is global, and so this will not be accurate in a threaded situation
+ protected static void warning(string op, int res) {
+ GLib.warning("%s: [%d] %s", op, res, db.errmsg());
+ }
+
+ protected void set_table_name(string table_name) {
+ this.table_name = table_name;
+ }
+
+ // This method will throw an error on an SQLite return code unless it's OK, DONE, or ROW, which
+ // are considered normal results.
+ protected static void throw_error(string method, int res) throws DatabaseError {
+ string msg = "(%s) [%d] - %s".printf(method, res, db.errmsg());
+
+ switch (res) {
+ case Sqlite.OK:
+ case Sqlite.DONE:
+ case Sqlite.ROW:
+ return;
+
+ case Sqlite.PERM:
+ case Sqlite.BUSY:
+ case Sqlite.READONLY:
+ case Sqlite.IOERR:
+ case Sqlite.CORRUPT:
+ case Sqlite.CANTOPEN:
+ case Sqlite.NOLFS:
+ case Sqlite.AUTH:
+ case Sqlite.FORMAT:
+ case Sqlite.NOTADB:
+ throw new DatabaseError.BACKING(msg);
+
+ case Sqlite.NOMEM:
+ throw new DatabaseError.MEMORY(msg);
+
+ case Sqlite.ABORT:
+ case Sqlite.LOCKED:
+ case Sqlite.INTERRUPT:
+ throw new DatabaseError.ABORT(msg);
+
+ case Sqlite.FULL:
+ case Sqlite.EMPTY:
+ case Sqlite.TOOBIG:
+ case Sqlite.CONSTRAINT:
+ case Sqlite.RANGE:
+ throw new DatabaseError.LIMITS(msg);
+
+ case Sqlite.SCHEMA:
+ case Sqlite.MISMATCH:
+ throw new DatabaseError.TYPESPEC(msg);
+
+ case Sqlite.ERROR:
+ case Sqlite.INTERNAL:
+ case Sqlite.MISUSE:
+ default:
+ throw new DatabaseError.ERROR(msg);
+ }
+ }
+
+ protected bool exists_by_id(int64 id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM %s WHERE id=?".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW && res != Sqlite.DONE)
+ fatal("exists_by_id [%s] %s".printf(id.to_string(), table_name), res);
+
+ return (res == Sqlite.ROW);
+ }
+
+ protected bool select_by_id(int64 id, string columns, out Sqlite.Statement stmt) {
+ string sql = "SELECT %s FROM %s WHERE id=?".printf(columns, table_name);
+
+ int res = db.prepare_v2(sql, -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW && res != Sqlite.DONE)
+ fatal("select_by_id [%s] %s %s".printf(id.to_string(), table_name, columns), res);
+
+ return (res == Sqlite.ROW);
+ }
+
+ // Caller needs to bind value #1 before calling execute_update_by_id()
+ private void prepare_update_by_id(int64 id, string column, out Sqlite.Statement stmt) {
+ string sql = "UPDATE %s SET %s=? WHERE id=?".printf(table_name, column);
+
+ int res = db.prepare_v2(sql, -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(2, id);
+ assert(res == Sqlite.OK);
+ }
+
+ private bool execute_update_by_id(Sqlite.Statement stmt) {
+ int res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("execute_update_by_id", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ protected bool update_text_by_id(int64 id, string column, string text) {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_text(1, text);
+ assert(res == Sqlite.OK);
+
+ return execute_update_by_id(stmt);
+ }
+
+ protected void update_text_by_id_2(int64 id, string column, string text) throws DatabaseError {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_text(1, text);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("DatabaseTable.update_text_by_id_2 %s.%s".printf(table_name, column), res);
+ }
+
+ protected bool update_int_by_id(int64 id, string column, int value) {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_int(1, value);
+ assert(res == Sqlite.OK);
+
+ return execute_update_by_id(stmt);
+ }
+
+ protected void update_int_by_id_2(int64 id, string column, int value) throws DatabaseError {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_int(1, value);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("DatabaseTable.update_int_by_id_2 %s.%s".printf(table_name, column), res);
+ }
+
+ protected bool update_int64_by_id(int64 id, string column, int64 value) {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_int64(1, value);
+ assert(res == Sqlite.OK);
+
+ return execute_update_by_id(stmt);
+ }
+
+ protected void update_int64_by_id_2(int64 id, string column, int64 value) throws DatabaseError {
+ Sqlite.Statement stmt;
+ prepare_update_by_id(id, column, out stmt);
+
+ int res = stmt.bind_int64(1, value);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("DatabaseTable.update_int64_by_id_2 %s.%s".printf(table_name, column), res);
+ }
+
+ protected void delete_by_id(int64 id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("DELETE FROM %s WHERE id=?".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("%s.remove".printf(table_name), res);
+ }
+
+ public static bool has_column(string table_name, string column_name) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("PRAGMA table_info(%s)".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("has_column %s".printf(table_name), res);
+
+ break;
+ } else {
+ string column = stmt.column_text(1);
+ if (column != null && column == column_name)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static bool has_table(string table_name) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("PRAGMA table_info(%s)".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+
+ return (res != Sqlite.DONE);
+ }
+
+ public static bool add_column(string table_name, string column_name, string column_constraints) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("ALTER TABLE %s ADD COLUMN %s %s".printf(table_name, column_name,
+ column_constraints), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ critical("Unable to add column %s %s %s: (%d) %s", table_name, column_name, column_constraints,
+ res, db.errmsg());
+
+ return false;
+ }
+
+ return true;
+ }
+
+ // This method will only add the column if a table exists (relying on the table object
+ // to build a new one when first referenced) and only if the column does not exist. In essence,
+ // it's a cleaner way to run has_table(), has_column(), and add_column().
+ public static bool ensure_column(string table_name, string column_name, string column_constraints,
+ string upgrade_msg) {
+ if (!has_table(table_name) || has_column(table_name, column_name))
+ return true;
+
+ message("%s", upgrade_msg);
+
+ return add_column(table_name, column_name, column_constraints);
+ }
+
+ public int get_row_count() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT COUNT(id) AS RowCount FROM %s".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW) {
+ critical("Unable to retrieve row count on %s: (%d) %s", table_name, res, db.errmsg());
+
+ return 0;
+ }
+
+ return stmt.column_int(0);
+ }
+
+ // This is not thread-safe.
+ public static void begin_transaction() {
+ if (in_transaction++ != 0)
+ return;
+
+ int res = db.exec("BEGIN TRANSACTION");
+ assert(res == Sqlite.OK);
+ }
+
+ // This is not thread-safe.
+ public static void commit_transaction() throws DatabaseError {
+ assert(in_transaction > 0);
+ if (--in_transaction != 0)
+ return;
+
+ int res = db.exec("COMMIT TRANSACTION");
+ if (res != Sqlite.DONE)
+ throw_error("commit_transaction", res);
+ }
+}
+
diff --git a/src/db/Db.vala b/src/db/Db.vala
new file mode 100644
index 0000000..ced530a
--- /dev/null
+++ b/src/db/Db.vala
@@ -0,0 +1,366 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Db {
+
+public static const string IN_MEMORY_NAME = ":memory:";
+
+private string? filename = null;
+
+// Passing null as the db_file will create an in-memory, non-persistent database.
+public void preconfigure(File? db_file) {
+ filename = (db_file != null) ? db_file.get_path() : IN_MEMORY_NAME;
+}
+
+public void init() throws Error {
+ assert(filename != null);
+
+ DatabaseTable.init(filename);
+}
+
+public void terminate() {
+ DatabaseTable.terminate();
+}
+
+public enum VerifyResult {
+ OK,
+ FUTURE_VERSION,
+ UPGRADE_ERROR,
+ NO_UPGRADE_AVAILABLE
+}
+
+public VerifyResult verify_database(out string app_version, out int schema_version) {
+ VersionTable version_table = VersionTable.get_instance();
+ schema_version = version_table.get_version(out app_version);
+
+ if (schema_version >= 0)
+ debug("Database schema version %d created by app version %s", schema_version, app_version);
+
+ if (schema_version == -1) {
+ // no version set, do it now (tables will be created on demand)
+ debug("Creating database schema version %d for app version %s", DatabaseTable.SCHEMA_VERSION,
+ Resources.APP_VERSION);
+ version_table.set_version(DatabaseTable.SCHEMA_VERSION, Resources.APP_VERSION);
+ app_version = Resources.APP_VERSION;
+ schema_version = DatabaseTable.SCHEMA_VERSION;
+ } else if (schema_version > DatabaseTable.SCHEMA_VERSION) {
+ // Back to the future
+ return Db.VerifyResult.FUTURE_VERSION;
+ } else if (schema_version < DatabaseTable.SCHEMA_VERSION) {
+ // Past is present
+ VerifyResult result = upgrade_database(schema_version);
+ if (result != VerifyResult.OK)
+ return result;
+ }
+
+ return VerifyResult.OK;
+}
+
+private VerifyResult upgrade_database(int input_version) {
+ assert(input_version < DatabaseTable.SCHEMA_VERSION);
+
+ int version = input_version;
+
+ // No upgrade available from version 1.
+ if (version == 1)
+ return VerifyResult.NO_UPGRADE_AVAILABLE;
+
+ message("Upgrading database from schema version %d to %d", version, DatabaseTable.SCHEMA_VERSION);
+
+ //
+ // Version 2: For all intents and purposes, the baseline schema version.
+ // * Removed start_time and end_time from EventsTable
+ //
+
+ //
+ // Version 3:
+ // * Added flags column to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "flags")) {
+ message("upgrade_database: adding flags column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "flags", "INTEGER DEFAULT 0"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 3;
+
+ //
+ // ThumbnailTable(s) removed.
+ //
+
+ //
+ // Version 4:
+ // * Added file_format column to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "file_format")) {
+ message("upgrade_database: adding file_format column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "file_format", "INTEGER DEFAULT 0"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 4;
+
+ //
+ // Version 5:
+ // * Added title column to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "title")) {
+ message("upgrade_database: adding title column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "title", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 5;
+
+ //
+ // Version 6:
+ // * Added backlinks column to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "backlinks")) {
+ message("upgrade_database: adding backlinks column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "backlinks", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 6;
+
+ //
+ // * Ignore the exif_md5 column from PhotoTable. Because removing columns with SQLite is
+ // painful, simply ignoring the column for now. Keeping it up-to-date when possible in
+ // case a future requirement is discovered.
+ //
+
+ //
+ // Version 7:
+ // * Added BackingPhotoTable (which creates itself if needed)
+ // * Added time_reimported and editable_id columns to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "time_reimported")) {
+ message("upgrade_database: adding time_reimported column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "time_reimported", "INTEGER"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ if (!DatabaseTable.has_column("PhotoTable", "editable_id")) {
+ message("upgrade_database: adding editable_id column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "editable_id", "INTEGER DEFAULT -1"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 7;
+
+ //
+ // * Ignore the orientation column in BackingPhotoTable. (See note above about removing
+ // columns from tables.)
+ //
+
+ //
+ // Version 8:
+ // * Added rating column to PhotoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "rating")) {
+ message("upgrade_database: adding rating column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "rating", "INTEGER DEFAULT 0"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ //
+ // Version 9:
+ // * Added metadata_dirty flag to PhotoTable. Default to 1 rather than 0 on upgrades so
+ // changes to metadata prior to upgrade will be caught by MetadataWriter.
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "metadata_dirty")) {
+ message("upgrade_database: adding metadata_dirty column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "metadata_dirty", "INTEGER DEFAULT 1"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 9;
+
+ //
+ // Version 10:
+ // * Added flags column to VideoTable
+ //
+
+ if (DatabaseTable.has_table("VideoTable") && !DatabaseTable.has_column("VideoTable", "flags")) {
+ message("upgrade_database: adding flags column to VideoTable");
+ if (!DatabaseTable.add_column("VideoTable", "flags", "INTEGER DEFAULT 0"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 10;
+
+ //
+ // Version 11:
+ // * Added primary_source_id column to EventTable
+ //
+
+ if (!DatabaseTable.has_column("EventTable", "primary_source_id")) {
+ message("upgrade_database: adding primary_source_id column to EventTable");
+ if (!DatabaseTable.add_column("EventTable", "primary_source_id", "INTEGER DEFAULT 0"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 11;
+
+ //
+ // Version 12:
+ // * Added reason column to TombstoneTable
+ //
+
+ if (!DatabaseTable.ensure_column("TombstoneTable", "reason", "INTEGER DEFAULT 0",
+ "upgrade_database: adding reason column to TombstoneTable")) {
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 12;
+
+ //
+ // Version 13:
+ // * Added RAW development columns to Photo table.
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "developer")) {
+ message("upgrade_database: adding developer column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "developer", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ if (!DatabaseTable.has_column("PhotoTable", "develop_shotwell_id")) {
+ message("upgrade_database: adding develop_shotwell_id column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "develop_shotwell_id", "INTEGER DEFAULT -1"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ if (!DatabaseTable.has_column("PhotoTable", "develop_camera_id")) {
+ message("upgrade_database: adding develop_camera_id column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "develop_camera_id", "INTEGER DEFAULT -1"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ if (!DatabaseTable.has_column("PhotoTable", "develop_embedded_id")) {
+ message("upgrade_database: adding develop_embedded_id column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "develop_embedded_id", "INTEGER DEFAULT -1"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 13;
+
+ //
+ // Version 14:
+ // * Upgrades tag names in the TagTable for hierarchical tag support
+ //
+
+ if (input_version < 14)
+ TagTable.upgrade_for_htags();
+
+ version = 14;
+
+ //
+ // Version 15:
+ // * Upgrades the version number to prevent Shotwell 0.11 users from opening
+ // Shotwell 0.12 databases. While the database schema hasn't changed,
+ // straighten was only partially implemented in 0.11 but is fully
+ // implemented in 0.12, so when 0.11 users open an 0.12 database with
+ // straightening information, they see partially and/or incorrectly
+ // rotated photos.
+ //
+
+ version = 15;
+
+ //
+ // Version 16:
+ // * Migration of dconf settings data from /apps/shotwell to /org/yorba/shotwell.
+ //
+ // The database itself doesn't change; this is to force the path migration to
+ // occur.
+ //
+
+ if (input_version < 16) {
+ // Run the settings migrator to copy settings data from /apps/shotwell to /org/yorba/shotwell.
+ // Please see https://mail.gnome.org/archives/desktop-devel-list/2011-February/msg00064.html
+ GSettingsConfigurationEngine.run_gsettings_migrator();
+ }
+
+ version = 16;
+
+ //
+ // Version 17:
+ // * Added comment column to PhotoTable and VideoTable
+ //
+
+ if (!DatabaseTable.has_column("PhotoTable", "comment")) {
+ message("upgrade_database: adding comment column to PhotoTable");
+ if (!DatabaseTable.add_column("PhotoTable", "comment", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+ if (!DatabaseTable.has_column("VideoTable", "comment")) {
+ message("upgrade_database: adding comment column to VideoTable");
+ if (!DatabaseTable.add_column("VideoTable", "comment", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 17;
+
+ //
+ // Version 18:
+ // * Added comment column to EventTable
+ //
+
+ if (!DatabaseTable.has_column("EventTable", "comment")) {
+ message("upgrade_database: adding comment column to EventTable");
+ if (!DatabaseTable.add_column("EventTable", "comment", "TEXT"))
+ return VerifyResult.UPGRADE_ERROR;
+ }
+
+ version = 18;
+
+ //
+ // Version 19:
+ // * Deletion and regeneration of camera-raw thumbnails from previous versions,
+ // since they're likely to be incorrect.
+ //
+ // The database itself doesn't change; this is to force the thumbnail fixup to
+ // occur.
+ //
+
+ if (input_version < 19) {
+ Application.get_instance().set_raw_thumbs_fix_required(true);
+ }
+
+ version = 19;
+
+ //
+ // Version 20:
+ // * No change to database schema but fixing issue #6541 ("Saved searches should be aware of
+ // comments") added a new enumeration value that is stored in the SavedSearchTable. The
+ // presence of this heretofore unseen enumeration value will cause prior versions of
+ // Shotwell to yarf, so we bump the version here to ensure this doesn't happen
+ //
+
+ version = 20;
+
+ //
+ // Finalize the upgrade process
+ //
+
+ assert(version == DatabaseTable.SCHEMA_VERSION);
+ VersionTable.get_instance().update_version(version, Resources.APP_VERSION);
+
+ message("Database upgrade to schema version %d successful", version);
+
+ return VerifyResult.OK;
+}
+
+}
+
diff --git a/src/db/EventTable.vala b/src/db/EventTable.vala
new file mode 100644
index 0000000..016fa00
--- /dev/null
+++ b/src/db/EventTable.vala
@@ -0,0 +1,235 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct EventID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public EventID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class EventRow {
+ public EventID event_id;
+ public string? name;
+ public time_t time_created;
+ public string? primary_source_id;
+ public string? comment;
+}
+
+public class EventTable : DatabaseTable {
+ private static EventTable instance = null;
+
+ private EventTable() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS EventTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "name TEXT, "
+ + "primary_photo_id INTEGER, "
+ + "time_created INTEGER,"
+ + "primary_source_id TEXT,"
+ + "comment TEXT"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create photo table", res);
+
+ set_table_name("EventTable");
+ }
+
+ public static EventTable get_instance() {
+ if (instance == null)
+ instance = new EventTable();
+
+ return instance;
+ }
+
+ // Returns a valid source ID, creating one from a legacy primary photo ID when needed.
+ private string? source_id_upgrade(int64 primary_photo_id, string? primary_source_id) {
+ if (MediaCollectionRegistry.get_instance().is_valid_source_id(primary_source_id)) {
+ return primary_source_id;
+ }
+ if (primary_photo_id != PhotoID.INVALID) {
+ // Upgrade to source_id from photo_id.
+ return PhotoID.upgrade_photo_id_to_source_id(PhotoID(primary_photo_id));
+ }
+ return null;
+ }
+
+ public EventRow create(string? primary_source_id, string? comment) throws DatabaseError {
+ assert(primary_source_id != null && primary_source_id != "");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "INSERT INTO EventTable (primary_source_id, time_created, comment) VALUES (?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, primary_source_id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("EventTable.create", res);
+
+ EventRow row = new EventRow();
+ row.event_id = EventID(db.last_insert_rowid());
+ row.name = null;
+ row.primary_source_id = primary_source_id;
+ row.time_created = time_created;
+ row.comment = comment;
+
+ return row;
+ }
+
+ // NOTE: The event_id in EventRow is ignored here. No checking is done to prevent
+ // against creating duplicate events or for the validity of other fields in the row (i.e.
+ // the primary photo ID).
+ public EventID create_from_row(EventRow row) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO EventTable (name, primary_photo_id, primary_source_id, time_created, comment) VALUES (?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, row.name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, PhotoID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, row.primary_source_id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, row.time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(5, row.comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("Event create_from_row", res);
+
+ return EventID();
+ }
+
+ return EventID(db.last_insert_rowid());
+ }
+
+ public EventRow? get_row(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT name, primary_photo_id, primary_source_id, time_created, comment FROM EventTable WHERE id=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ if (stmt.step() != Sqlite.ROW)
+ return null;
+
+ EventRow row = new EventRow();
+ row.event_id = event_id;
+ row.name = stmt.column_text(0);
+ if (row.name != null && row.name.length == 0)
+ row.name = null;
+ row.primary_source_id = source_id_upgrade(stmt.column_int64(1), stmt.column_text(2));
+ row.time_created = (time_t) stmt.column_int64(3);
+ row.comment = stmt.column_text(4);
+
+ return row;
+ }
+
+ public void remove(EventID event_id) throws DatabaseError {
+ delete_by_id(event_id.id);
+ }
+
+ public Gee.ArrayList<EventRow?> get_events() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, name, primary_photo_id, primary_source_id, time_created, comment FROM EventTable",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<EventRow?> event_rows = new Gee.ArrayList<EventRow?>();
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_events", res);
+
+ break;
+ }
+
+ EventRow row = new EventRow();
+
+ row.event_id = EventID(stmt.column_int64(0));
+ row.name = stmt.column_text(1);
+ row.primary_source_id = source_id_upgrade(stmt.column_int64(2), stmt.column_text(3));
+ row.time_created = (time_t) stmt.column_int64(4);
+ row.comment = stmt.column_text(5);
+
+ event_rows.add(row);
+ }
+
+ return event_rows;
+ }
+
+ public bool rename(EventID event_id, string? name) {
+ return update_text_by_id(event_id.id, "name", name != null ? name : "");
+ }
+
+ public string? get_name(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "name", out stmt))
+ return null;
+
+ string name = stmt.column_text(0);
+
+ return (name != null && name.length > 0) ? name : null;
+ }
+
+ public string? get_primary_source_id(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "primary_source_id", out stmt))
+ return null;
+
+ return stmt.column_text(0);
+ }
+
+ public bool set_primary_source_id(EventID event_id, string primary_source_id) {
+ return update_text_by_id(event_id.id, "primary_source_id", primary_source_id);
+ }
+
+ public time_t get_time_created(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "time_created", out stmt))
+ return 0;
+
+ return (time_t) stmt.column_int64(0);
+ }
+
+ public bool set_comment(EventID event_id, string new_comment) {
+ return update_text_by_id(event_id.id, "comment", new_comment != null ? new_comment : "");
+ }
+
+}
+
+
diff --git a/src/db/PhotoTable.vala b/src/db/PhotoTable.vala
new file mode 100644
index 0000000..9891fe6
--- /dev/null
+++ b/src/db/PhotoTable.vala
@@ -0,0 +1,1245 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct PhotoID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public PhotoID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+
+ public uint hash() {
+ return int64_hash(id);
+ }
+
+ public static bool equal(void *a, void *b) {
+ return ((PhotoID *) a)->id == ((PhotoID *) b)->id;
+ }
+
+ public static string upgrade_photo_id_to_source_id(PhotoID photo_id) {
+ return ("%s%016" + int64.FORMAT_MODIFIER + "x").printf(Photo.TYPENAME, photo_id.id);
+ }
+}
+
+public struct ImportID {
+ public const int64 INVALID = 0;
+
+ public int64 id;
+
+ public ImportID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public static ImportID generate() {
+ TimeVal timestamp = TimeVal();
+ timestamp.get_current_time();
+ int64 id = timestamp.tv_sec;
+
+ return ImportID(id);
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+
+ public static int compare_func(ImportID? a, ImportID? b) {
+ assert (a != null && b != null);
+ return (int) (a.id - b.id);
+ }
+
+ public static int64 comparator(void *a, void *b) {
+ return ((ImportID *) a)->id - ((ImportID *) b)->id;
+ }
+}
+
+public class PhotoRow {
+ public PhotoID photo_id;
+ public BackingPhotoRow master;
+ public time_t exposure_time;
+ public ImportID import_id;
+ public EventID event_id;
+ public Orientation orientation;
+ public Gee.HashMap<string, KeyValueMap>? transformations;
+ public string md5;
+ public string thumbnail_md5;
+ public string exif_md5;
+ public time_t time_created;
+ public uint64 flags;
+ public Rating rating;
+ public string title;
+ public string comment;
+ public string? backlinks;
+ public time_t time_reimported;
+ public BackingPhotoID editable_id;
+ public bool metadata_dirty;
+
+ // Currently selected developer (RAW only)
+ public RawDeveloper developer;
+
+ // Currently selected developer (RAW only)
+ public BackingPhotoID[] development_ids;
+
+
+ public PhotoRow() {
+ master = new BackingPhotoRow();
+ editable_id = BackingPhotoID();
+ development_ids = new BackingPhotoID[RawDeveloper.as_array().length];
+ foreach (RawDeveloper d in RawDeveloper.as_array())
+ development_ids[d] = BackingPhotoID();
+ }
+}
+
+public class PhotoTable : DatabaseTable {
+ private static PhotoTable instance = null;
+
+ private PhotoTable() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS PhotoTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "filename TEXT UNIQUE NOT NULL, "
+ + "width INTEGER, "
+ + "height INTEGER, "
+ + "filesize INTEGER, "
+ + "timestamp INTEGER, "
+ + "exposure_time INTEGER, "
+ + "orientation INTEGER, "
+ + "original_orientation INTEGER, "
+ + "import_id INTEGER, "
+ + "event_id INTEGER, "
+ + "transformations TEXT, "
+ + "md5 TEXT, "
+ + "thumbnail_md5 TEXT, "
+ + "exif_md5 TEXT, "
+ + "time_created INTEGER, "
+ + "flags INTEGER DEFAULT 0, "
+ + "rating INTEGER DEFAULT 0, "
+ + "file_format INTEGER DEFAULT 0, "
+ + "title TEXT, "
+ + "backlinks TEXT, "
+ + "time_reimported INTEGER, "
+ + "editable_id INTEGER DEFAULT -1, "
+ + "metadata_dirty INTEGER DEFAULT 0, "
+ + "developer TEXT, "
+ + "develop_shotwell_id INTEGER DEFAULT -1, "
+ + "develop_camera_id INTEGER DEFAULT -1, "
+ + "develop_embedded_id INTEGER DEFAULT -1, "
+ + "comment TEXT"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create photo table", res);
+
+ // index on event_id
+ Sqlite.Statement stmt2;
+ int res2 = db.prepare_v2("CREATE INDEX IF NOT EXISTS PhotoEventIDIndex ON PhotoTable (event_id)",
+ -1, out stmt2);
+ assert(res2 == Sqlite.OK);
+
+ res2 = stmt2.step();
+ if (res2 != Sqlite.DONE)
+ fatal("create photo table", res2);
+
+ set_table_name("PhotoTable");
+ }
+
+ public static PhotoTable get_instance() {
+ if (instance == null)
+ instance = new PhotoTable();
+
+ return instance;
+ }
+
+ // PhotoRow.photo_id, event_id, master.orientation, flags, and time_created are ignored on input.
+ // All fields are set on exit with values stored in the database. editable_id field is ignored.
+ public PhotoID add(PhotoRow photo_row) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "INSERT INTO PhotoTable (filename, width, height, filesize, timestamp, exposure_time, "
+ + "orientation, original_orientation, import_id, event_id, md5, thumbnail_md5, "
+ + "exif_md5, time_created, file_format, title, rating, editable_id, developer, comment) "
+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ ulong time_created = now_sec();
+
+ res = stmt.bind_text(1, photo_row.master.filepath);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(2, photo_row.master.dim.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(3, photo_row.master.dim.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, photo_row.master.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(5, photo_row.master.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(6, photo_row.exposure_time);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(7, photo_row.master.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(8, photo_row.master.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(9, photo_row.import_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(10, EventID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(11, photo_row.md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(12, photo_row.thumbnail_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(13, photo_row.exif_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(14, time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(15, photo_row.master.file_format.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(16, photo_row.title);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(17, photo_row.rating.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(18, BackingPhotoID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(19, photo_row.developer.to_string());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(20, photo_row.comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ if (res != Sqlite.CONSTRAINT)
+ fatal("add_photo", res);
+
+ return PhotoID();
+ }
+
+ // fill in ignored fields with database values
+ photo_row.photo_id = PhotoID(db.last_insert_rowid());
+ photo_row.orientation = photo_row.master.original_orientation;
+ photo_row.event_id = EventID();
+ photo_row.time_created = (time_t) time_created;
+ photo_row.flags = 0;
+
+ return photo_row.photo_id;
+ }
+
+ // The only fields recognized in the PhotoRow are photo_id, dimensions,
+ // filesize, timestamp, exposure_time, original_orientation, file_format,
+ // and the md5 fields. When the method returns, time_reimported and master.orientation has been
+ // updated. editable_id is ignored. transformations are untouched; use
+ // remove_all_transformations() if necessary.
+ public void reimport(PhotoRow row) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "UPDATE PhotoTable SET width = ?, height = ?, filesize = ?, timestamp = ?, "
+ + "exposure_time = ?, orientation = ?, original_orientation = ?, md5 = ?, "
+ + "exif_md5 = ?, thumbnail_md5 = ?, file_format = ?, title = ?, time_reimported = ? "
+ + "WHERE id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_reimported = (time_t) now_sec();
+
+ res = stmt.bind_int(1, row.master.dim.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(2, row.master.dim.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(3, row.master.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, row.master.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(5, row.exposure_time);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(6, row.master.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(7, row.master.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(8, row.md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(9, row.exif_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(10, row.thumbnail_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(11, row.master.file_format.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(12, row.title);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(13, time_reimported);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(14, row.photo_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("PhotoTable.reimport_master", res);
+
+ row.time_reimported = time_reimported;
+ row.orientation = row.master.original_orientation;
+ }
+
+ public bool master_exif_updated(PhotoID photoID, int64 filesize, long timestamp,
+ string md5, string? exif_md5, string? thumbnail_md5, PhotoRow row) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "UPDATE PhotoTable SET filesize = ?, timestamp = ?, md5 = ?, exif_md5 = ?,"
+ + "thumbnail_md5 =? WHERE id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(4, exif_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(5, thumbnail_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(6, photoID.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ if (res != Sqlite.CONSTRAINT)
+ fatal("write_update_photo", res);
+
+ return false;
+ }
+
+ row.master.filesize = filesize;
+ row.master.timestamp = timestamp;
+ row.md5 = md5;
+ row.exif_md5 = exif_md5;
+ row.thumbnail_md5 = thumbnail_md5;
+
+ return true;
+ }
+
+ // Force corrupted orientations to a safe value.
+ //
+ // In previous versions of Shotwell, this field could be written to
+ // the DB as a zero due to Vala 0.14 breaking the way it handled
+ // objects passed as 'ref' arguments to methods.
+ //
+ // For further details, please see http://redmine.yorba.org/issues/4354 and
+ // https://bugzilla.gnome.org/show_bug.cgi?id=663818 .
+ private void validate_orientation(PhotoRow row) {
+ if ((row.orientation < Orientation.MIN) ||
+ (row.orientation > Orientation.MAX)) {
+ // orientation was corrupted; set it to top left.
+ set_orientation(row.photo_id, Orientation.MIN);
+ row.orientation = Orientation.MIN;
+ }
+ }
+
+ public PhotoRow? get_row(PhotoID photo_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT filename, width, height, filesize, timestamp, exposure_time, orientation, "
+ + "original_orientation, import_id, event_id, transformations, md5, thumbnail_md5, "
+ + "exif_md5, time_created, flags, rating, file_format, title, backlinks, "
+ + "time_reimported, editable_id, metadata_dirty, developer, develop_shotwell_id, "
+ + "develop_camera_id, develop_embedded_id, comment "
+ + "FROM PhotoTable WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, photo_id.id);
+ assert(res == Sqlite.OK);
+
+ if (stmt.step() != Sqlite.ROW)
+ return null;
+
+ PhotoRow row = new PhotoRow();
+ row.photo_id = photo_id;
+ row.master.filepath = stmt.column_text(0);
+ row.master.dim = Dimensions(stmt.column_int(1), stmt.column_int(2));
+ row.master.filesize = stmt.column_int64(3);
+ row.master.timestamp = (time_t) stmt.column_int64(4);
+ row.exposure_time = (time_t) stmt.column_int64(5);
+ row.orientation = (Orientation) stmt.column_int(6);
+ row.master.original_orientation = (Orientation) stmt.column_int(7);
+ row.import_id.id = stmt.column_int64(8);
+ row.event_id.id = stmt.column_int64(9);
+ row.transformations = marshall_all_transformations(stmt.column_text(10));
+ row.md5 = stmt.column_text(11);
+ row.thumbnail_md5 = stmt.column_text(12);
+ row.exif_md5 = stmt.column_text(13);
+ row.time_created = (time_t) stmt.column_int64(14);
+ row.flags = stmt.column_int64(15);
+ row.rating = Rating.unserialize(stmt.column_int(16));
+ row.master.file_format = PhotoFileFormat.unserialize(stmt.column_int(17));
+ row.title = stmt.column_text(18);
+ row.backlinks = stmt.column_text(19);
+ row.time_reimported = (time_t) stmt.column_int64(20);
+ row.editable_id = BackingPhotoID(stmt.column_int64(21));
+ row.metadata_dirty = stmt.column_int(22) != 0;
+ row.developer = stmt.column_text(23) != null ? RawDeveloper.from_string(stmt.column_text(23)) :
+ RawDeveloper.CAMERA;
+ row.development_ids[RawDeveloper.SHOTWELL] = BackingPhotoID(stmt.column_int64(24));
+ row.development_ids[RawDeveloper.CAMERA] = BackingPhotoID(stmt.column_int64(25));
+ row.development_ids[RawDeveloper.EMBEDDED] = BackingPhotoID(stmt.column_int64(26));
+ row.comment = stmt.column_text(27);
+
+ return row;
+ }
+
+ public Gee.ArrayList<PhotoRow?> get_all() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT id, filename, width, height, filesize, timestamp, exposure_time, orientation, "
+ + "original_orientation, import_id, event_id, transformations, md5, thumbnail_md5, "
+ + "exif_md5, time_created, flags, rating, file_format, title, backlinks, time_reimported, "
+ + "editable_id, metadata_dirty, developer, develop_shotwell_id, develop_camera_id, "
+ + "develop_embedded_id, comment FROM PhotoTable",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<PhotoRow?> all = new Gee.ArrayList<PhotoRow?>();
+
+ while ((res = stmt.step()) == Sqlite.ROW) {
+ PhotoRow row = new PhotoRow();
+ row.photo_id.id = stmt.column_int64(0);
+ row.master.filepath = stmt.column_text(1);
+ row.master.dim = Dimensions(stmt.column_int(2), stmt.column_int(3));
+ row.master.filesize = stmt.column_int64(4);
+ row.master.timestamp = (time_t) stmt.column_int64(5);
+ row.exposure_time = (time_t) stmt.column_int64(6);
+ row.orientation = (Orientation) stmt.column_int(7);
+ row.master.original_orientation = (Orientation) stmt.column_int(8);
+ row.import_id.id = stmt.column_int64(9);
+ row.event_id.id = stmt.column_int64(10);
+ row.transformations = marshall_all_transformations(stmt.column_text(11));
+ row.md5 = stmt.column_text(12);
+ row.thumbnail_md5 = stmt.column_text(13);
+ row.exif_md5 = stmt.column_text(14);
+ row.time_created = (time_t) stmt.column_int64(15);
+ row.flags = stmt.column_int64(16);
+ row.rating = Rating.unserialize(stmt.column_int(17));
+ row.master.file_format = PhotoFileFormat.unserialize(stmt.column_int(18));
+ row.title = stmt.column_text(19);
+ row.backlinks = stmt.column_text(20);
+ row.time_reimported = (time_t) stmt.column_int64(21);
+ row.editable_id = BackingPhotoID(stmt.column_int64(22));
+ row.metadata_dirty = stmt.column_int(23) != 0;
+ row.developer = stmt.column_text(24) != null ? RawDeveloper.from_string(stmt.column_text(24)) :
+ RawDeveloper.CAMERA;
+ row.development_ids[RawDeveloper.SHOTWELL] = BackingPhotoID(stmt.column_int64(25));
+ row.development_ids[RawDeveloper.CAMERA] = BackingPhotoID(stmt.column_int64(26));
+ row.development_ids[RawDeveloper.EMBEDDED] = BackingPhotoID(stmt.column_int64(27));
+ row.comment = stmt.column_text(28);
+
+ validate_orientation(row);
+
+ all.add(row);
+ }
+
+ return all;
+ }
+
+ // Create a duplicate of the specified row. A new byte-for-byte duplicate (including filesystem
+ // metadata) of PhotoID's file needs to back this duplicate and its editable (if exists).
+ public PhotoID duplicate(PhotoID photo_id, string new_filename, BackingPhotoID editable_id,
+ BackingPhotoID develop_shotwell, BackingPhotoID develop_camera_id,
+ BackingPhotoID develop_embedded_id) {
+ // get a copy of the original row, duplicating most (but not all) of it
+ PhotoRow original = get_row(photo_id);
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO PhotoTable (filename, width, height, filesize, "
+ + "timestamp, exposure_time, orientation, original_orientation, import_id, event_id, "
+ + "transformations, md5, thumbnail_md5, exif_md5, time_created, flags, rating, "
+ + "file_format, title, editable_id, developer, develop_shotwell_id, develop_camera_id, "
+ + "develop_embedded_id, comment) "
+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, new_filename);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(2, original.master.dim.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(3, original.master.dim.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, original.master.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(5, original.master.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(6, original.exposure_time);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(7, original.orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(8, original.master.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(9, original.import_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(10, original.event_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(11, unmarshall_all_transformations(original.transformations));
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(12, original.md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(13, original.thumbnail_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(14, original.exif_md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(15, now_sec());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(16, (int64) original.flags);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(17, original.rating.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(18, original.master.file_format.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(19, original.title);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(20, editable_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(21, original.developer.to_string());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(22, develop_shotwell.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(23, develop_camera_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(24, develop_embedded_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(25, original.comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ if (res != Sqlite.CONSTRAINT)
+ fatal("duplicate", res);
+
+ return PhotoID();
+ }
+
+ return PhotoID(db.last_insert_rowid());
+ }
+
+ public bool set_title(PhotoID photo_id, string? new_title) {
+ return update_text_by_id(photo_id.id, "title", new_title != null ? new_title : "");
+ }
+
+ public bool set_comment(PhotoID photo_id, string? new_comment) {
+ return update_text_by_id(photo_id.id, "comment", new_comment != null ? new_comment : "");
+ }
+
+ public void set_filepath(PhotoID photo_id, string filepath) throws DatabaseError {
+ update_text_by_id_2(photo_id.id, "filename", filepath);
+ }
+
+ public void update_timestamp(PhotoID photo_id, time_t timestamp) throws DatabaseError {
+ update_int64_by_id_2(photo_id.id, "timestamp", timestamp);
+ }
+
+ public bool set_exposure_time(PhotoID photo_id, time_t time) {
+ return update_int64_by_id(photo_id.id, "exposure_time", (int64) time);
+ }
+
+ public void set_import_id(PhotoID photo_id, ImportID import_id) throws DatabaseError {
+ update_int64_by_id_2(photo_id.id, "import_id", import_id.id);
+ }
+
+ public bool remove_by_file(File file) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("DELETE FROM PhotoTable WHERE filename=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, file.get_path());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ warning("remove", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public void remove(PhotoID photo_id) throws DatabaseError {
+ delete_by_id(photo_id.id);
+ }
+
+ public Gee.ArrayList<PhotoID?> get_photos() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM PhotoTable", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<PhotoID?> photo_ids = new Gee.ArrayList<PhotoID?>();
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_photos", res);
+
+ break;
+ }
+
+ photo_ids.add(PhotoID(stmt.column_int64(0)));
+ }
+
+ return photo_ids;
+ }
+
+ public bool set_orientation(PhotoID photo_id, Orientation orientation) {
+ return update_int_by_id(photo_id.id, "orientation", (int) orientation);
+ }
+
+ public bool replace_flags(PhotoID photo_id, uint64 flags) {
+ return update_int64_by_id(photo_id.id, "flags", (int64) flags);
+ }
+
+ public bool set_rating(PhotoID photo_id, Rating rating) {
+ return update_int_by_id(photo_id.id, "rating", rating.serialize());
+ }
+
+ public int get_event_photo_count(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM PhotoTable WHERE event_id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ int count = 0;
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_event_photo_count", res);
+
+ break;
+ }
+
+ count++;
+ }
+
+ return count;
+ }
+
+ public Gee.ArrayList<string> get_event_source_ids(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM PhotoTable WHERE event_id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<string> result = new Gee.ArrayList<string>();
+ for(;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_event_source_ids", res);
+
+ break;
+ }
+
+ result.add(PhotoID.upgrade_photo_id_to_source_id(PhotoID(stmt.column_int64(0))));
+ }
+
+ return result;
+ }
+
+ public bool event_has_photos(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM PhotoTable WHERE event_id = ? LIMIT 1", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ return false;
+ } else if (res != Sqlite.ROW) {
+ fatal("event_has_photos", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool drop_event(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE PhotoTable SET event_id = ? WHERE event_id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, EventID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, event_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("drop_event", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool set_event(PhotoID photo_id, EventID event_id) {
+ return update_int64_by_id(photo_id.id, "event_id", event_id.id);
+ }
+
+ private string? get_raw_transformations(PhotoID photo_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(photo_id.id, "transformations", out stmt))
+ return null;
+
+ string trans = stmt.column_text(0);
+ if (trans == null || trans.length == 0)
+ return null;
+
+ return trans;
+ }
+
+ private bool set_raw_transformations(PhotoID photo_id, string trans) {
+ return update_text_by_id(photo_id.id, "transformations", trans);
+ }
+
+ public bool set_transformation_state(PhotoID photo_id, Orientation orientation,
+ Gee.HashMap<string, KeyValueMap>? transformations) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE PhotoTable SET orientation = ?, transformations = ? WHERE id = ?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int(1, orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, unmarshall_all_transformations(transformations));
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(3, photo_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("set_transformation_state", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public static Gee.HashMap<string, KeyValueMap>? marshall_all_transformations(string? trans) {
+ if (trans == null || trans.length == 0)
+ return null;
+
+ try {
+ KeyFile keyfile = new KeyFile();
+ if (!keyfile.load_from_data(trans, trans.length, KeyFileFlags.NONE))
+ return null;
+
+ Gee.HashMap<string, KeyValueMap> map = new Gee.HashMap<string, KeyValueMap>();
+
+ string[] objects = keyfile.get_groups();
+ foreach (string object in objects) {
+ string[] keys = keyfile.get_keys(object);
+ if (keys == null || keys.length == 0)
+ continue;
+
+ KeyValueMap key_map = new KeyValueMap(object);
+ for (int ctr = 0; ctr < keys.length; ctr++)
+ key_map.set_string(keys[ctr], keyfile.get_string(object, keys[ctr]));
+
+ map.set(object, key_map);
+ }
+
+ return map;
+ } catch (Error err) {
+ error("%s", err.message);
+ }
+ }
+
+ public static string? unmarshall_all_transformations(Gee.HashMap<string, KeyValueMap>? transformations) {
+ if (transformations == null || transformations.keys.size == 0)
+ return null;
+
+ KeyFile keyfile = new KeyFile();
+
+ foreach (string object in transformations.keys) {
+ KeyValueMap map = transformations.get(object);
+
+ foreach (string key in map.get_keys()) {
+ string? value = map.get_string(key, null);
+ assert(value != null);
+
+ keyfile.set_string(object, key, value);
+ }
+ }
+
+ size_t length;
+ string unmarshalled = keyfile.to_data(out length);
+ assert(unmarshalled != null);
+ assert(unmarshalled.length > 0);
+
+ return unmarshalled;
+ }
+
+ public bool set_transformation(PhotoID photo_id, KeyValueMap map) {
+ string trans = get_raw_transformations(photo_id);
+
+ try {
+ KeyFile keyfile = new KeyFile();
+ if (trans != null) {
+ if (!keyfile.load_from_data(trans, trans.length, KeyFileFlags.NONE))
+ return false;
+ }
+
+ Gee.Set<string> keys = map.get_keys();
+ foreach (string key in keys) {
+ string value = map.get_string(key, null);
+ assert(value != null);
+
+ keyfile.set_string(map.get_group(), key, value);
+ }
+
+ size_t length;
+ trans = keyfile.to_data(out length);
+ assert(trans != null);
+ assert(trans.length > 0);
+ } catch (Error err) {
+ error("%s", err.message);
+ }
+
+ return set_raw_transformations(photo_id, trans);
+ }
+
+ public bool remove_transformation(PhotoID photo_id, string object) {
+ string trans = get_raw_transformations(photo_id);
+ if (trans == null)
+ return true;
+
+ try {
+ KeyFile keyfile = new KeyFile();
+ if (!keyfile.load_from_data(trans, trans.length, KeyFileFlags.NONE))
+ return false;
+
+ if (!keyfile.has_group(object))
+ return true;
+
+ keyfile.remove_group(object);
+
+ size_t length;
+ trans = keyfile.to_data(out length);
+ assert(trans != null);
+ } catch (Error err) {
+ error("%s", err.message);
+ }
+
+ return set_raw_transformations(photo_id, trans);
+ }
+
+ public bool remove_all_transformations(PhotoID photo_id) {
+ if (get_raw_transformations(photo_id) == null)
+ return false;
+
+ return update_text_by_id(photo_id.id, "transformations", "");
+ }
+
+ // Use PhotoFileFormat.UNKNOWN if not to search for matching file format; it's only used if
+ // searching for MD5 duplicates.
+ private Sqlite.Statement get_duplicate_stmt(File? file, string? thumbnail_md5, string? md5,
+ PhotoFileFormat file_format) {
+ assert(file != null || thumbnail_md5 != null || md5 != null);
+
+ string sql = "SELECT id FROM PhotoTable WHERE";
+ bool first = true;
+
+ if (file != null) {
+ sql += " filename=?";
+ first = false;
+ }
+
+ if (thumbnail_md5 != null || md5 != null) {
+ if (first)
+ sql += " ((";
+ else
+ sql += " OR ((";
+ first = false;
+
+ if (thumbnail_md5 != null)
+ sql += " thumbnail_md5=?";
+
+ if (md5 != null) {
+ if (thumbnail_md5 == null)
+ sql += " md5=?";
+ else
+ sql += " OR md5=?";
+ }
+
+ sql += ")";
+
+ if (file_format != PhotoFileFormat.UNKNOWN)
+ sql += " AND file_format=?";
+
+ sql += ")";
+ }
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(sql, -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ int col = 1;
+
+ if (file != null) {
+ res = stmt.bind_text(col++, file.get_path());
+ assert(res == Sqlite.OK);
+ }
+
+ if (thumbnail_md5 != null) {
+ res = stmt.bind_text(col++, thumbnail_md5);
+ assert(res == Sqlite.OK);
+ }
+
+ if (md5 != null) {
+ res = stmt.bind_text(col++, md5);
+ assert(res == Sqlite.OK);
+ }
+
+ if ((thumbnail_md5 != null || md5 != null) && file_format != PhotoFileFormat.UNKNOWN) {
+ res = stmt.bind_int(col++, file_format.serialize());
+ assert(res == Sqlite.OK);
+ }
+
+ return stmt;
+ }
+
+ public bool has_duplicate(File? file, string? thumbnail_md5, string? md5, PhotoFileFormat file_format) {
+ Sqlite.Statement stmt = get_duplicate_stmt(file, thumbnail_md5, md5, file_format);
+ int res = stmt.step();
+
+ if (res == Sqlite.DONE) {
+ // not found
+ return false;
+ } else if (res == Sqlite.ROW) {
+ // at least one found
+ return true;
+ } else {
+ fatal("has_duplicate", res);
+
+ return false;
+ }
+ }
+
+ public PhotoID[] get_duplicate_ids(File? file, string? thumbnail_md5, string? md5,
+ PhotoFileFormat file_format) {
+ Sqlite.Statement stmt = get_duplicate_stmt(file, thumbnail_md5, md5, file_format);
+
+ PhotoID[] ids = new PhotoID[0];
+
+ int res = stmt.step();
+ while (res == Sqlite.ROW) {
+ ids += PhotoID(stmt.column_int64(0));
+ res = stmt.step();
+ }
+
+ return ids;
+ }
+
+ public void update_backlinks(PhotoID photo_id, string? backlinks) throws DatabaseError {
+ update_text_by_id_2(photo_id.id, "backlinks", backlinks != null ? backlinks : "");
+ }
+
+ public void attach_editable(PhotoRow row, BackingPhotoID editable_id) throws DatabaseError {
+ update_int64_by_id_2(row.photo_id.id, "editable_id", editable_id.id);
+
+ row.editable_id = editable_id;
+ }
+
+ public void detach_editable(PhotoRow row) throws DatabaseError {
+ update_int64_by_id_2(row.photo_id.id, "editable_id", BackingPhotoID.INVALID);
+
+ row.editable_id = BackingPhotoID();
+ }
+
+ public void set_metadata_dirty(PhotoID photo_id, bool dirty) throws DatabaseError {
+ update_int_by_id_2(photo_id.id, "metadata_dirty", dirty ? 1 : 0);
+ }
+
+ public void update_raw_development(PhotoRow row, RawDeveloper rd, BackingPhotoID backing_photo_id)
+ throws DatabaseError {
+
+ string col;
+ switch (rd) {
+ case RawDeveloper.SHOTWELL:
+ col = "develop_shotwell_id";
+ break;
+
+ case RawDeveloper.CAMERA:
+ col = "develop_camera_id";
+ break;
+
+ case RawDeveloper.EMBEDDED:
+ col = "develop_embedded_id";
+ break;
+
+ default:
+ assert_not_reached();
+ }
+
+ row.development_ids[rd] = backing_photo_id;
+ update_int64_by_id_2(row.photo_id.id, col, backing_photo_id.id);
+
+ if (backing_photo_id.id != BackingPhotoID.INVALID)
+ update_text_by_id_2(row.photo_id.id, "developer", rd.to_string());
+ }
+
+ public void remove_development(PhotoRow row, RawDeveloper rd) throws DatabaseError {
+ update_raw_development(row, rd, BackingPhotoID());
+ }
+
+}
+
+//
+// BackingPhotoTable
+//
+// BackingPhotoTable is designed to hold any number of alternative backing photos
+// for a Photo. In the first implementation it was designed for editable photos (Edit with
+// External Editor), but if other such alternates are needed, this is where to store them.
+//
+// Note that no transformations are held here.
+//
+
+public struct BackingPhotoID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public BackingPhotoID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class BackingPhotoRow {
+ public BackingPhotoID id;
+ public time_t time_created;
+ public string? filepath = null;
+ public int64 filesize;
+ public time_t timestamp;
+ public PhotoFileFormat file_format;
+ public Dimensions dim;
+ public Orientation original_orientation;
+
+ public bool matches_file_info(FileInfo info) {
+ if (filesize != info.get_size())
+ return false;
+
+ return timestamp == info.get_modification_time().tv_sec;
+ }
+
+ public bool is_touched(FileInfo info) {
+ if (filesize != info.get_size())
+ return false;
+
+ return timestamp != info.get_modification_time().tv_sec;
+ }
+
+ // Copies another backing photo row into this one.
+ public void copy_from(BackingPhotoRow from) {
+ id = from.id;
+ time_created = from.time_created;
+ filepath = from.filepath;
+ filesize = from.filesize;
+ timestamp = from.timestamp;
+ file_format = from.file_format;
+ dim = from.dim;
+ original_orientation = from.original_orientation;
+ }
+}
+
+public class BackingPhotoTable : DatabaseTable {
+ private static BackingPhotoTable instance = null;
+
+ private BackingPhotoTable() {
+ set_table_name("BackingPhotoTable");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "BackingPhotoTable "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "filepath TEXT UNIQUE NOT NULL, "
+ + "timestamp INTEGER, "
+ + "filesize INTEGER, "
+ + "width INTEGER, "
+ + "height INTEGER, "
+ + "original_orientation INTEGER, "
+ + "file_format INTEGER, "
+ + "time_created INTEGER "
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create PhotoBackingTable", res);
+ }
+
+ public static BackingPhotoTable get_instance() {
+ if (instance == null)
+ instance = new BackingPhotoTable();
+
+ return instance;
+ }
+
+ public void add(BackingPhotoRow state) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO BackingPhotoTable "
+ + "(filepath, timestamp, filesize, width, height, original_orientation, "
+ + "file_format, time_created) "
+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, state.filepath);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, state.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(3, state.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(4, state.dim.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(5, state.dim.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(6, state.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(7, state.file_format.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(8, (int64) time_created);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("PhotoBackingTable.add", res);
+
+ state.id = BackingPhotoID(db.last_insert_rowid());
+ state.time_created = time_created;
+ }
+
+ public BackingPhotoRow? fetch(BackingPhotoID id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT filepath, timestamp, filesize, width, height, "
+ + "original_orientation, file_format, time_created FROM BackingPhotoTable WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ return null;
+ else if (res != Sqlite.ROW)
+ throw_error("BackingPhotoTable.fetch_for_photo", res);
+
+ BackingPhotoRow row = new BackingPhotoRow();
+ row.id = id;
+ row.filepath = stmt.column_text(0);
+ row.timestamp = (time_t) stmt.column_int64(1);
+ row.filesize = stmt.column_int64(2);
+ row.dim = Dimensions(stmt.column_int(3), stmt.column_int(4));
+ row.original_orientation = (Orientation) stmt.column_int(5);
+ row.file_format = PhotoFileFormat.unserialize(stmt.column_int(6));
+ row.time_created = (time_t) stmt.column_int64(7);
+
+ return row;
+ }
+
+ // Everything but filepath is updated.
+ public void update(BackingPhotoRow row) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE BackingPhotoTable SET timestamp=?, filesize=?, "
+ + "width=?, height=?, original_orientation=?, file_format=? "
+ + "WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, row.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, row.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(3, row.dim.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(4, row.dim.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(5, row.original_orientation);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(6, row.file_format.serialize());
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(7, row.id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("BackingPhotoTable.update", res);
+ }
+
+ public void update_attributes(BackingPhotoID id, time_t timestamp, int64 filesize) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE BackingPhotoTable SET timestamp=?, filesize=? WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(3, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("BackingPhotoTable.update_attributes", res);
+ }
+
+ public void remove(BackingPhotoID backing_id) throws DatabaseError {
+ delete_by_id(backing_id.id);
+ }
+
+ public void set_filepath(BackingPhotoID id, string filepath) throws DatabaseError {
+ update_text_by_id_2(id.id, "filepath", filepath);
+ }
+
+ public void update_timestamp(BackingPhotoID id, time_t timestamp) throws DatabaseError {
+ update_int64_by_id_2(id.id, "timestamp", timestamp);
+ }
+}
+
diff --git a/src/db/SavedSearchDBTable.vala b/src/db/SavedSearchDBTable.vala
new file mode 100644
index 0000000..d986038
--- /dev/null
+++ b/src/db/SavedSearchDBTable.vala
@@ -0,0 +1,641 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct SavedSearchID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public SavedSearchID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class SavedSearchRow {
+ public SavedSearchID search_id;
+
+ public string name;
+ public SearchOperator operator;
+ public Gee.List<SearchCondition> conditions;
+}
+
+public class SavedSearchDBTable : DatabaseTable {
+ private static SavedSearchDBTable instance = null;
+
+ private SavedSearchDBTable() {
+ set_table_name("SavedSearchDBTable");
+
+ // Create main search table.
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "name TEXT UNIQUE NOT NULL, "
+ + "operator TEXT NOT NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable", res);
+
+ // Create search text table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_Text "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "context TEXT NOT NULL, "
+ + "text TEXT"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Text", res);
+
+ // Create search media type table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_MediaType "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "context TEXT NOT NULL, "
+ + "type TEXT NOT_NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_MediaType", res);
+
+ // Create flagged search table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_Flagged "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "flag_state TEXT NOT NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Flagged", res);
+
+ // Create modified search table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_Modified "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "context TEXT NOT NULL, "
+ + "modified_state TEXT NOT NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Modified", res);
+
+ // Create rating search table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_Rating "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "rating INTEGER NOT_NULL, "
+ + "context TEXT NOT NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Rating", res);
+
+ // Create date search table.
+ res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "SavedSearchDBTable_Date "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "search_id INTEGER NOT NULL, "
+ + "search_type TEXT NOT NULL, "
+ + "context TEXT NOT NULL, "
+ + "date_one INTEGER NOT_NULL, "
+ + "date_two INTEGER NOT_NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Rating", res);
+
+ // Create indexes.
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_Text_Index "
+ + "ON SavedSearchDBTable_Text(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Text_Index", res);
+
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_MediaType_Index "
+ + "ON SavedSearchDBTable_MediaType(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_MediaType_Index", res);
+
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_Flagged_Index "
+ + "ON SavedSearchDBTable_Flagged(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Flagged_Index", res);
+
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_Modified_Index "
+ + "ON SavedSearchDBTable_Modified(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Modified_Index", res);
+
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_Rating_Index "
+ + "ON SavedSearchDBTable_Rating(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Rating_Index", res);
+
+ res = db.prepare_v2("CREATE INDEX IF NOT EXISTS "
+ + "SavedSearchDBTable_Date_Index "
+ + "ON SavedSearchDBTable_Date(search_id)", -1, out stmt);
+ assert(res == Sqlite.OK);
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create SavedSearchDBTable_Date_Index", res);
+ }
+
+ public static SavedSearchDBTable get_instance() {
+ if (instance == null)
+ instance = new SavedSearchDBTable();
+
+ return instance;
+ }
+
+ public SavedSearchRow add(string name, SearchOperator operator,
+ Gee.ArrayList<SearchCondition> conditions) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable (name, operator) VALUES (?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, operator.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable.add", res);
+
+ SavedSearchRow row = new SavedSearchRow();
+ row.search_id = SavedSearchID(db.last_insert_rowid());
+ row.name = name;
+ row.operator = operator;
+ row.conditions = conditions;
+
+ foreach (SearchCondition sc in conditions) {
+ add_condition(row.search_id, sc);
+ }
+
+ return row;
+ }
+
+ private void add_condition(SavedSearchID id, SearchCondition condition) throws DatabaseError {
+ if (condition is SearchConditionText) {
+ SearchConditionText text = condition as SearchConditionText;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_Text (search_id, search_type, context, "
+ + "text) VALUES (?, ?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, text.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(3, text.context.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(4, text.text);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_Text.add", res);
+ } else if (condition is SearchConditionMediaType) {
+ SearchConditionMediaType media_type = condition as SearchConditionMediaType;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_MediaType (search_id, search_type, context, "
+ + "type) VALUES (?, ?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, media_type.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(3, media_type.context.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(4, media_type.media_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_MediaType.add", res);
+ } else if (condition is SearchConditionFlagged) {
+ SearchConditionFlagged flag_state = condition as SearchConditionFlagged;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_Flagged (search_id, search_type, "
+ + "flag_state) VALUES (?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, flag_state.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(3, flag_state.state.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_Flagged.add", res);
+ } else if (condition is SearchConditionModified) {
+ SearchConditionModified modified_state = condition as SearchConditionModified;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_Modified (search_id, search_type, context, "
+ + "modified_state) VALUES (?, ?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, modified_state.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(3, modified_state.context.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(4, modified_state.state.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_Modified.add", res);
+ } else if (condition is SearchConditionRating) {
+ SearchConditionRating rating = condition as SearchConditionRating;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_Rating (search_id, search_type, rating, "
+ + "context) VALUES (?, ?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, rating.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int(3, rating.rating.serialize());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(4, rating.context.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_Rating.add", res);
+ } else if (condition is SearchConditionDate) {
+ SearchConditionDate date = condition as SearchConditionDate;
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable_Date (search_id, search_type, "
+ + "context, date_one, date_two) VALUES (?, ?, ?, ?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(2, date.search_type.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(3, date.context.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(4, date.date_one.to_unix());
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(5, date.date_two.to_unix());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable_Date.add", res);
+ } else {
+ assert_not_reached();
+ }
+ }
+
+ // Removes the conditions of a search. Used on delete.
+ private void remove_conditions_for_search_id(SavedSearchID search_id) throws DatabaseError {
+ remove_conditions_for_table("SavedSearchDBTable_Text", search_id);
+ remove_conditions_for_table("SavedSearchDBTable_MediaType", search_id);
+ remove_conditions_for_table("SavedSearchDBTable_Flagged", search_id);
+ remove_conditions_for_table("SavedSearchDBTable_Modified", search_id);
+ remove_conditions_for_table("SavedSearchDBTable_Rating", search_id);
+ remove_conditions_for_table("SavedSearchDBTable_Date", search_id);
+ }
+
+ private void remove_conditions_for_table(string table_name, SavedSearchID search_id)
+ throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("DELETE FROM %s WHERE search_id=?".printf(table_name), -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("%s.remove".printf(table_name), res);
+ }
+
+ // Returns all conditions for a given search. Used on loading a search.
+ private Gee.List<SearchCondition> get_conditions_for_id(SavedSearchID search_id)
+ throws DatabaseError {
+ Gee.List<SearchCondition> list = new Gee.ArrayList<SearchCondition>();
+ Sqlite.Statement stmt;
+ int res;
+
+ // Get all text conditions.
+ res = db.prepare_v2("SELECT search_type, context, text FROM SavedSearchDBTable_Text "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_Text.get_all_rows", res);
+
+ SearchConditionText condition = new SearchConditionText(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ stmt.column_text(2),
+ SearchConditionText.Context.from_string(stmt.column_text(1)));
+
+ list.add(condition);
+ }
+
+ // Get all media type conditions.
+ res = db.prepare_v2("SELECT search_type, context, type FROM SavedSearchDBTable_MediaType "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_MediaType.get_all_rows", res);
+
+ SearchConditionMediaType condition = new SearchConditionMediaType(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ SearchConditionMediaType.Context.from_string(stmt.column_text(1)),
+ SearchConditionMediaType.MediaType.from_string(stmt.column_text(2)));
+
+ list.add(condition);
+ }
+
+ // Get all flagged state conditions.
+ res = db.prepare_v2("SELECT search_type, flag_state FROM SavedSearchDBTable_Flagged "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_Flagged.get_all_rows", res);
+
+ SearchConditionFlagged condition = new SearchConditionFlagged(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ SearchConditionFlagged.State.from_string(stmt.column_text(1)));
+
+ list.add(condition);
+ }
+
+ // Get all modified state conditions.
+ res = db.prepare_v2("SELECT search_type, context, modified_state FROM SavedSearchDBTable_Modified "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_Modified.get_all_rows", res);
+
+ SearchConditionModified condition = new SearchConditionModified(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ SearchConditionModified.Context.from_string(stmt.column_text(1)),
+ SearchConditionModified.State.from_string(stmt.column_text(2)));
+
+ list.add(condition);
+ }
+
+ // Get all rating conditions.
+ res = db.prepare_v2("SELECT search_type, rating, context FROM SavedSearchDBTable_Rating "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_Rating.get_all_rows", res);
+
+ SearchConditionRating condition = new SearchConditionRating(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ Rating.unserialize(stmt.column_int(1)),
+ SearchConditionRating.Context.from_string(stmt.column_text(2)));
+
+ list.add(condition);
+ }
+
+ // Get all date conditions.
+ res = db.prepare_v2("SELECT search_type, context, date_one, date_two FROM SavedSearchDBTable_Date "
+ + "WHERE search_id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable_Date.get_all_rows", res);
+
+ SearchConditionDate condition = new SearchConditionDate(
+ SearchCondition.SearchType.from_string(stmt.column_text(0)),
+ SearchConditionDate.Context.from_string(stmt.column_text(1)),
+ new DateTime.from_unix_local(stmt.column_int64(2)),
+ new DateTime.from_unix_local(stmt.column_int64(3)));
+ list.add(condition);
+ }
+
+ return list;
+ }
+
+ // All fields but search_id are respected in SavedSearchRow.
+ public SavedSearchID create_from_row(SavedSearchRow row) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO SavedSearchDBTable (name, operator) VALUES (?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, row.name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, row.operator.to_string());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("SavedSearchDBTable.create_from_row", res);
+
+ SavedSearchID search_id = SavedSearchID(db.last_insert_rowid());
+
+ foreach (SearchCondition sc in row.conditions) {
+ add_condition(search_id, sc);
+ }
+
+ return search_id;
+ }
+
+ public void remove(SavedSearchID search_id) throws DatabaseError {
+ remove_conditions_for_search_id(search_id);
+ delete_by_id(search_id.id);
+ }
+
+ public SavedSearchRow? get_row(SavedSearchID search_id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT name, operator FROM SavedSearchDBTable WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, search_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ return null;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable.get_row", res);
+
+ SavedSearchRow row = new SavedSearchRow();
+ row.search_id = search_id;
+ row.name = stmt.column_text(0);
+ row.operator = SearchOperator.from_string(stmt.column_text(1));
+
+ return row;
+ }
+
+ public Gee.List<SavedSearchRow?> get_all_rows() throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, name, operator FROM SavedSearchDBTable", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.List<SavedSearchRow?> rows = new Gee.ArrayList<SavedSearchRow?>();
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("SavedSearchDBTable.get_all_rows", res);
+
+ SavedSearchRow row = new SavedSearchRow();
+ row.search_id = SavedSearchID(stmt.column_int64(0));
+ row.name = stmt.column_text(1);
+ row.operator = SearchOperator.from_string(stmt.column_text(2));
+ row.conditions = get_conditions_for_id(row.search_id);
+
+ rows.add(row);
+ }
+
+ return rows;
+ }
+
+ public void rename(SavedSearchID search_id, string new_name) throws DatabaseError {
+ update_text_by_id_2(search_id.id, "name", new_name);
+ }
+}
+
diff --git a/src/db/TagTable.vala b/src/db/TagTable.vala
new file mode 100644
index 0000000..a0fade8
--- /dev/null
+++ b/src/db/TagTable.vala
@@ -0,0 +1,248 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct TagID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public TagID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class TagRow {
+ public TagID tag_id;
+ public string name;
+ public Gee.Set<string>? source_id_list;
+ public time_t time_created;
+}
+
+public class TagTable : DatabaseTable {
+ private static TagTable instance = null;
+
+ private TagTable() {
+ set_table_name("TagTable");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "TagTable "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "name TEXT UNIQUE NOT NULL, "
+ + "photo_id_list TEXT, "
+ + "time_created INTEGER"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create TagTable", res);
+ }
+
+ public static TagTable get_instance() {
+ if (instance == null)
+ instance = new TagTable();
+
+ return instance;
+ }
+
+ public static void upgrade_for_htags() {
+ TagTable table = get_instance();
+
+ try {
+ Gee.List<TagRow?> rows = table.get_all_rows();
+
+ foreach (TagRow row in rows) {
+ row.name = row.name.replace(Tag.PATH_SEPARATOR_STRING, "-");
+ table.rename(row.tag_id, row.name);
+ }
+ } catch (DatabaseError e) {
+ error ("TagTable: can't upgrade tag names for hierarchical tag support: %s", e.message);
+ }
+ }
+
+ public TagRow add(string name) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO TagTable (name, time_created) VALUES (?, ?)", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, time_created);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("TagTable.add", res);
+
+ TagRow row = new TagRow();
+ row.tag_id = TagID(db.last_insert_rowid());
+ row.name = name;
+ row.source_id_list = null;
+ row.time_created = time_created;
+
+ return row;
+ }
+
+ // All fields but tag_id are respected in TagRow.
+ public TagID create_from_row(TagRow row) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO TagTable (name, photo_id_list, time_created) VALUES (?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, row.name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, serialize_source_ids(row.source_id_list));
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(3, row.time_created);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("TagTable.create_from_row", res);
+
+ return TagID(db.last_insert_rowid());
+ }
+
+ public void remove(TagID tag_id) throws DatabaseError {
+ delete_by_id(tag_id.id);
+ }
+
+ public string? get_name(TagID tag_id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ if (!select_by_id(tag_id.id, "name", out stmt))
+ return null;
+
+ return stmt.column_text(0);
+ }
+
+ public TagRow? get_row(TagID tag_id) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT name, photo_id_list, time_created FROM TagTable WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, tag_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ return null;
+ else if (res != Sqlite.ROW)
+ throw_error("TagTable.get_row", res);
+
+ TagRow row = new TagRow();
+ row.tag_id = tag_id;
+ row.name = stmt.column_text(0);
+ row.source_id_list = unserialize_source_ids(stmt.column_text(1));
+ row.time_created = (time_t) stmt.column_int64(2);
+
+ return row;
+ }
+
+ public Gee.List<TagRow?> get_all_rows() throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, name, photo_id_list, time_created FROM TagTable", -1,
+ out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.List<TagRow?> rows = new Gee.ArrayList<TagRow?>();
+
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("TagTable.get_all_rows", res);
+
+ // res == Sqlite.ROW
+ TagRow row = new TagRow();
+ row.tag_id = TagID(stmt.column_int64(0));
+ row.name = stmt.column_text(1);
+ row.source_id_list = unserialize_source_ids(stmt.column_text(2));
+ row.time_created = (time_t) stmt.column_int64(3);
+
+ rows.add(row);
+ }
+
+ return rows;
+ }
+
+ public void rename(TagID tag_id, string new_name) throws DatabaseError {
+ update_text_by_id_2(tag_id.id, "name", new_name);
+ }
+
+ public void set_tagged_sources(TagID tag_id, Gee.Collection<string> source_ids) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE TagTable SET photo_id_list=? WHERE id=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, serialize_source_ids(source_ids));
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, tag_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("TagTable.set_tagged_photos", res);
+ }
+
+ private string? serialize_source_ids(Gee.Collection<string>? source_ids) {
+ if (source_ids == null)
+ return null;
+
+ StringBuilder result = new StringBuilder();
+
+ foreach (string source_id in source_ids) {
+ result.append(source_id);
+ result.append(",");
+ }
+
+ return (result.len != 0) ? result.str : null;
+ }
+
+ private Gee.Set<string> unserialize_source_ids(string? text_list) {
+ Gee.Set<string> result = new Gee.HashSet<string>();
+
+ if (text_list == null)
+ return result;
+
+ string[] split = text_list.split(",");
+ foreach (string token in split) {
+ if (is_string_empty(token))
+ continue;
+
+ // handle current and legacy encoding of source ids -- in the past, we only stored
+ // LibraryPhotos in tags so we only needed to store the numeric database key of the
+ // photo to uniquely identify it. Now, however, tags can store arbitrary MediaSources,
+ // so instead of simply storing a number we store the source id, a string that contains
+ // a typename followed by an identifying number (e.g., "video-022354").
+ if (token[0].isdigit()) {
+ // this is a legacy entry
+ result.add(PhotoID.upgrade_photo_id_to_source_id(PhotoID(parse_int64(token, 10))));
+ } else if (token[0].isalpha()) {
+ // this is a modern entry
+ result.add(token);
+ }
+ }
+
+ return result;
+ }
+}
+
diff --git a/src/db/TombstoneTable.vala b/src/db/TombstoneTable.vala
new file mode 100644
index 0000000..9e108bd
--- /dev/null
+++ b/src/db/TombstoneTable.vala
@@ -0,0 +1,146 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct TombstoneID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public TombstoneID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class TombstoneRow {
+ public TombstoneID id;
+ public string filepath;
+ public int64 filesize;
+ public string? md5;
+ public time_t time_created;
+ public Tombstone.Reason reason;
+}
+
+public class TombstoneTable : DatabaseTable {
+ private static TombstoneTable instance = null;
+
+ private TombstoneTable() {
+ set_table_name("TombstoneTable");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "TombstoneTable "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "filepath TEXT NOT NULL, "
+ + "filesize INTEGER, "
+ + "md5 TEXT, "
+ + "time_created INTEGER, "
+ + "reason INTEGER DEFAULT 0 "
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create TombstoneTable", res);
+ }
+
+ public static TombstoneTable get_instance() {
+ if (instance == null)
+ instance = new TombstoneTable();
+
+ return instance;
+ }
+
+ public TombstoneRow add(string filepath, int64 filesize, string? md5, Tombstone.Reason reason)
+ throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO TombstoneTable "
+ + "(filepath, filesize, md5, time_created, reason) "
+ + "VALUES (?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, filepath);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, (int64) time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(5, reason.serialize());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("TombstoneTable.add", res);
+
+ TombstoneRow row = new TombstoneRow();
+ row.id = TombstoneID(db.last_insert_rowid());
+ row.filepath = filepath;
+ row.filesize = filesize;
+ row.md5 = md5;
+ row.time_created = time_created;
+ row.reason = reason;
+
+ return row;
+ }
+
+ public TombstoneRow[]? fetch_all() throws DatabaseError {
+ int row_count = get_row_count();
+ if (row_count == 0)
+ return null;
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, filepath, filesize, md5, time_created, reason "
+ + "FROM TombstoneTable", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ TombstoneRow[] rows = new TombstoneRow[row_count];
+
+ int index = 0;
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("TombstoneTable.fetch_all", res);
+
+ TombstoneRow row = new TombstoneRow();
+ row.id = TombstoneID(stmt.column_int64(0));
+ row.filepath = stmt.column_text(1);
+ row.filesize = stmt.column_int64(2);
+ row.md5 = stmt.column_text(3);
+ row.time_created = (time_t) stmt.column_int64(4);
+ row.reason = Tombstone.Reason.unserialize(stmt.column_int(5));
+
+ rows[index++] = row;
+ }
+
+ assert(index == row_count);
+
+ return rows;
+ }
+
+ public void update_file(TombstoneID tombstone_id, string filepath) throws DatabaseError {
+ update_text_by_id_2(tombstone_id.id, "filepath", filepath);
+ }
+
+ public void remove(TombstoneID tombstone_id) throws DatabaseError {
+ delete_by_id(tombstone_id.id);
+ }
+}
+
diff --git a/src/db/VersionTable.vala b/src/db/VersionTable.vala
new file mode 100644
index 0000000..9003b1b
--- /dev/null
+++ b/src/db/VersionTable.vala
@@ -0,0 +1,98 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class VersionTable : DatabaseTable {
+ private static VersionTable instance = null;
+
+ private VersionTable() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS VersionTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "schema_version INTEGER, "
+ + "app_version TEXT, "
+ + "user_data TEXT NULL"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create version table", res);
+
+ set_table_name("VersionTable");
+ }
+
+ public static VersionTable get_instance() {
+ if (instance == null)
+ instance = new VersionTable();
+
+ return instance;
+ }
+
+ public int get_version(out string app_version) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT schema_version, app_version FROM VersionTable ORDER BY schema_version DESC LIMIT 1",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.ROW) {
+ if (res != Sqlite.DONE)
+ fatal("get_version", res);
+
+ app_version = null;
+
+ return -1;
+ }
+
+ app_version = stmt.column_text(1);
+
+ return stmt.column_int(0);
+ }
+
+ public void set_version(int version, string app_version, string? user_data = null) {
+ Sqlite.Statement stmt;
+
+ string bitbucket;
+ if (get_version(out bitbucket) != -1) {
+ // overwrite existing row
+ int res = db.prepare_v2("UPDATE VersionTable SET schema_version=?, app_version=?, user_data=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+ } else {
+ // insert new row
+ int res = db.prepare_v2("INSERT INTO VersionTable (schema_version, app_version, user_data) VALUES (?,?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+ }
+
+ int res = stmt.bind_int(1, version);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, app_version);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, user_data);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("set_version %d %s %s".printf(version, app_version, user_data), res);
+ }
+
+ public void update_version(int version, string app_version) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE VersionTable SET schema_version=?, app_version=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int(1, version);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(2, app_version);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("update_version %d".printf(version), res);
+ }
+}
+
diff --git a/src/db/VideoTable.vala b/src/db/VideoTable.vala
new file mode 100644
index 0000000..c681dc2
--- /dev/null
+++ b/src/db/VideoTable.vala
@@ -0,0 +1,462 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct VideoID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public VideoID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+
+ public static uint hash(VideoID? a) {
+ return int64_hash(a.id);
+ }
+
+ public static bool equal(void *a, void *b) {
+ return ((VideoID *) a)->id == ((VideoID *) b)->id;
+ }
+
+ public static string upgrade_video_id_to_source_id(VideoID video_id) {
+ return ("%s-%016" + int64.FORMAT_MODIFIER + "x").printf(Video.TYPENAME, video_id.id);
+ }
+}
+
+public class VideoRow {
+ public VideoID video_id;
+ public string filepath;
+ public int64 filesize;
+ public time_t timestamp;
+ public int width;
+ public int height;
+ public double clip_duration;
+ public bool is_interpretable;
+ public time_t exposure_time;
+ public ImportID import_id;
+ public EventID event_id;
+ public string md5;
+ public time_t time_created;
+ public Rating rating;
+ public string title;
+ public string? backlinks;
+ public time_t time_reimported;
+ public uint64 flags;
+ public string comment;
+}
+
+public class VideoTable : DatabaseTable {
+ private static VideoTable instance = null;
+
+ private VideoTable() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS VideoTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "filename TEXT UNIQUE NOT NULL, "
+ + "width INTEGER, "
+ + "height INTEGER, "
+ + "clip_duration REAL, "
+ + "is_interpretable INTEGER, "
+ + "filesize INTEGER, "
+ + "timestamp INTEGER, "
+ + "exposure_time INTEGER, "
+ + "import_id INTEGER, "
+ + "event_id INTEGER, "
+ + "md5 TEXT, "
+ + "time_created INTEGER, "
+ + "rating INTEGER DEFAULT 0, "
+ + "title TEXT, "
+ + "backlinks TEXT, "
+ + "time_reimported INTEGER, "
+ + "flags INTEGER DEFAULT 0, "
+ + "comment TEXT "
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("VideoTable constructor", res);
+
+ // index on event_id
+ Sqlite.Statement stmt2;
+ int res2 = db.prepare_v2("CREATE INDEX IF NOT EXISTS VideoEventIDIndex ON VideoTable (event_id)",
+ -1, out stmt2);
+ assert(res2 == Sqlite.OK);
+
+ res2 = stmt2.step();
+ if (res2 != Sqlite.DONE)
+ fatal("VideoTable constructor", res2);
+
+ set_table_name("VideoTable");
+ }
+
+ public static VideoTable get_instance() {
+ if (instance == null)
+ instance = new VideoTable();
+
+ return instance;
+ }
+
+ // VideoRow.video_id, event_id, time_created are ignored on input. All fields are set on exit
+ // with values stored in the database.
+ public VideoID add(VideoRow video_row) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "INSERT INTO VideoTable (filename, width, height, clip_duration, is_interpretable, "
+ + "filesize, timestamp, exposure_time, import_id, event_id, md5, time_created, title, comment) "
+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ ulong time_created = now_sec();
+
+ res = stmt.bind_text(1, video_row.filepath);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(2, video_row.width);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(3, video_row.height);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_double(4, video_row.clip_duration);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(5, (video_row.is_interpretable) ? 1 : 0);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(6, video_row.filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(7, video_row.timestamp);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(8, video_row.exposure_time);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(9, video_row.import_id.id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(10, EventID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(11, video_row.md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(12, time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(13, video_row.title);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(14, video_row.comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ if (res != Sqlite.CONSTRAINT)
+ throw_error("VideoTable.add", res);
+ }
+
+ // fill in ignored fields with database values
+ video_row.video_id = VideoID(db.last_insert_rowid());
+ video_row.event_id = EventID();
+ video_row.time_created = (time_t) time_created;
+ video_row.flags = 0;
+
+ return video_row.video_id;
+ }
+
+ public bool drop_event(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("UPDATE VideoTable SET event_id = ? WHERE event_id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, EventID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, event_id.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("VideoTable.drop_event", res);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public VideoRow? get_row(VideoID video_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT filename, width, height, clip_duration, is_interpretable, filesize, timestamp, "
+ + "exposure_time, import_id, event_id, md5, time_created, rating, title, backlinks, "
+ + "time_reimported, flags, comment FROM VideoTable WHERE id=?",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, video_id.id);
+ assert(res == Sqlite.OK);
+
+ if (stmt.step() != Sqlite.ROW)
+ return null;
+
+ VideoRow row = new VideoRow();
+ row.video_id = video_id;
+ row.filepath = stmt.column_text(0);
+ row.width = stmt.column_int(1);
+ row.height = stmt.column_int(2);
+ row.clip_duration = stmt.column_double(3);
+ row.is_interpretable = (stmt.column_int(4) == 1);
+ row.filesize = stmt.column_int64(5);
+ row.timestamp = (time_t) stmt.column_int64(6);
+ row.exposure_time = (time_t) stmt.column_int64(7);
+ row.import_id.id = stmt.column_int64(8);
+ row.event_id.id = stmt.column_int64(9);
+ row.md5 = stmt.column_text(10);
+ row.time_created = (time_t) stmt.column_int64(11);
+ row.rating = Rating.unserialize(stmt.column_int(12));
+ row.title = stmt.column_text(13);
+ row.backlinks = stmt.column_text(14);
+ row.time_reimported = (time_t) stmt.column_int64(15);
+ row.flags = stmt.column_int64(16);
+ row.comment = stmt.column_text(17);
+
+ return row;
+ }
+
+ public Gee.ArrayList<VideoRow?> get_all() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT id, filename, width, height, clip_duration, is_interpretable, filesize, "
+ + "timestamp, exposure_time, import_id, event_id, md5, time_created, rating, title, "
+ + "backlinks, time_reimported, flags, comment FROM VideoTable",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<VideoRow?> all = new Gee.ArrayList<VideoRow?>();
+
+ while ((res = stmt.step()) == Sqlite.ROW) {
+ VideoRow row = new VideoRow();
+ row.video_id.id = stmt.column_int64(0);
+ row.filepath = stmt.column_text(1);
+ row.width = stmt.column_int(2);
+ row.height = stmt.column_int(3);
+ row.clip_duration = stmt.column_double(4);
+ row.is_interpretable = (stmt.column_int(5) == 1);
+ row.filesize = stmt.column_int64(6);
+ row.timestamp = (time_t) stmt.column_int64(7);
+ row.exposure_time = (time_t) stmt.column_int64(8);
+ row.import_id.id = stmt.column_int64(9);
+ row.event_id.id = stmt.column_int64(10);
+ row.md5 = stmt.column_text(11);
+ row.time_created = (time_t) stmt.column_int64(12);
+ row.rating = Rating.unserialize(stmt.column_int(13));
+ row.title = stmt.column_text(14);
+ row.backlinks = stmt.column_text(15);
+ row.time_reimported = (time_t) stmt.column_int64(16);
+ row.flags = stmt.column_int64(17);
+ row.comment = stmt.column_text(18);
+
+ all.add(row);
+ }
+
+ return all;
+ }
+
+ public void set_filepath(VideoID video_id, string filepath) throws DatabaseError {
+ update_text_by_id_2(video_id.id, "filename", filepath);
+ }
+
+ public void set_title(VideoID video_id, string? new_title) throws DatabaseError {
+ update_text_by_id_2(video_id.id, "title", new_title != null ? new_title : "");
+ }
+
+ public void set_comment(VideoID video_id, string? new_comment) throws DatabaseError {
+ update_text_by_id_2(video_id.id, "comment", new_comment != null ? new_comment : "");
+ }
+
+ public void set_exposure_time(VideoID video_id, time_t time) throws DatabaseError {
+ update_int64_by_id_2(video_id.id, "exposure_time", (int64) time);
+ }
+
+ public void set_rating(VideoID video_id, Rating rating) throws DatabaseError {
+ update_int64_by_id_2(video_id.id, "rating", rating.serialize());
+ }
+
+ public void set_flags(VideoID video_id, uint64 flags) throws DatabaseError {
+ update_int64_by_id_2(video_id.id, "flags", (int64) flags);
+ }
+
+ public void update_backlinks(VideoID video_id, string? backlinks) throws DatabaseError {
+ update_text_by_id_2(video_id.id, "backlinks", backlinks != null ? backlinks : "");
+ }
+
+ public void update_is_interpretable(VideoID video_id, bool is_interpretable) throws DatabaseError {
+ update_int_by_id_2(video_id.id, "is_interpretable", (is_interpretable) ? 1 : 0);
+ }
+
+ public bool set_event(VideoID video_id, EventID event_id) {
+ return update_int64_by_id(video_id.id, "event_id", event_id.id);
+ }
+
+ public void remove_by_file(File file) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("DELETE FROM VideoTable WHERE filename=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, file.get_path());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("VideoTable.remove_by_file", res);
+ }
+
+ public void remove(VideoID videoID) throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("DELETE FROM VideoTable WHERE id=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, videoID.id);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("VideoTable.remove", res);
+ }
+
+ public bool is_video_stored(File file) {
+ return get_id(file).is_valid();
+ }
+
+ public VideoID get_id(File file) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT ID FROM VideoTable WHERE filename=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, file.get_path());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+
+ return (res == Sqlite.ROW) ? VideoID(stmt.column_int64(0)) : VideoID();
+ }
+
+ public Gee.ArrayList<VideoID?> get_videos() throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM VideoTable", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<VideoID?> video_ids = new Gee.ArrayList<VideoID?>();
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ throw_error("VideoTable.get_videos", res);
+ }
+
+ video_ids.add(VideoID(stmt.column_int64(0)));
+ }
+
+ return video_ids;
+ }
+
+ private Sqlite.Statement get_duplicate_stmt(File? file, string? md5) {
+ assert(file != null || md5 != null);
+
+ string sql = "SELECT id FROM VideoTable WHERE";
+ bool first = true;
+
+ if (file != null) {
+ sql += " filename=?";
+ first = false;
+ }
+
+ if (md5 != null) {
+ if (!first)
+ sql += " OR ";
+
+ sql += " md5=?";
+ }
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(sql, -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ int col = 1;
+
+ if (file != null) {
+ res = stmt.bind_text(col++, file.get_path());
+ assert(res == Sqlite.OK);
+ }
+
+ if (md5 != null) {
+ res = stmt.bind_text(col++, md5);
+ assert(res == Sqlite.OK);
+ }
+
+ return stmt;
+ }
+
+ public bool has_duplicate(File? file, string? md5) {
+ Sqlite.Statement stmt = get_duplicate_stmt(file, md5);
+ int res = stmt.step();
+
+ if (res == Sqlite.DONE) {
+ // not found
+ return false;
+ } else if (res == Sqlite.ROW) {
+ // at least one found
+ return true;
+ } else {
+ fatal("VideoTable.has_duplicate", res);
+ }
+
+ return false;
+ }
+
+ public VideoID[] get_duplicate_ids(File? file, string? md5) {
+ Sqlite.Statement stmt = get_duplicate_stmt(file, md5);
+
+ VideoID[] ids = new VideoID[0];
+
+ int res = stmt.step();
+ while (res == Sqlite.ROW) {
+ ids += VideoID(stmt.column_int64(0));
+ res = stmt.step();
+ }
+
+ return ids;
+ }
+
+ public Gee.ArrayList<string> get_event_source_ids(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id FROM VideoTable WHERE event_id = ?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<string> result = new Gee.ArrayList<string>();
+ for(;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_event_source_ids", res);
+
+ break;
+ }
+
+ result.add(VideoID.upgrade_video_id_to_source_id(VideoID(stmt.column_int64(0))));
+ }
+
+ return result;
+ }
+
+ public void set_timestamp(VideoID video_id, time_t timestamp) throws DatabaseError {
+ update_int64_by_id_2(video_id.id, "timestamp", (int64) timestamp);
+ }
+}
+
diff --git a/src/db/mk/db.mk b/src/db/mk/db.mk
new file mode 100644
index 0000000..421961a
--- /dev/null
+++ b/src/db/mk/db.mk
@@ -0,0 +1,35 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Db
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := db
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ DatabaseTable.vala \
+ PhotoTable.vala \
+ EventTable.vala \
+ TagTable.vala \
+ TombstoneTable.vala \
+ VideoTable.vala \
+ VersionTable.vala \
+ SavedSearchDBTable.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/direct/Direct.vala b/src/direct/Direct.vala
new file mode 100644
index 0000000..dd2a847
--- /dev/null
+++ b/src/direct/Direct.vala
@@ -0,0 +1,35 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Direct unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Direct {
+
+private File? initial_file = null;
+
+public void preconfigure(File initial_file) {
+ Direct.initial_file = initial_file;
+}
+
+public void init() throws Error {
+ assert(initial_file != null);
+
+ DirectPhoto.init(initial_file);
+}
+
+public void terminate() {
+ DirectPhoto.terminate();
+}
+
+}
+
diff --git a/src/direct/DirectPhoto.vala b/src/direct/DirectPhoto.vala
new file mode 100644
index 0000000..98886ba
--- /dev/null
+++ b/src/direct/DirectPhoto.vala
@@ -0,0 +1,316 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class DirectPhoto : Photo {
+ private const int PREVIEW_BEST_FIT = 360;
+
+ public static DirectPhotoSourceCollection global = null;
+
+ public signal void can_rotate_changed(bool b);
+
+ private Gdk.Pixbuf preview = null;
+ private bool loaded = false;
+
+ private DirectPhoto(PhotoRow row) {
+ base (row);
+ }
+
+ /**
+ * @brief Because all transformations are discarded on reimport by design, including
+ * Orientation, a JFIF file that is only rotated or flipped, then saved, has the orientation
+ * change the user made before saving removed (recall that fetch() remembers which images it
+ * has seen before and will only add a file to the file map once; every time it sees it
+ * again after this is considered a reimport). This will set the orientation to the
+ * specified value, fixing up both the row and the backing row.
+ *
+ * @warning Only reimported JFIF files should need this; non-lossy image types have their
+ * actual pixels physically rotated in the file when they're exported.
+ *
+ * @param dest The orientation to set the photo to; usually, this should be a value
+ * obtained by calling get_orientation() prior to export()ing a DirectPhoto.
+ */
+ public void fixup_orientation_after_reimport(Orientation dest) {
+ row.orientation = dest;
+ backing_photo_row.original_orientation = dest;
+ }
+
+ public static void init(File initial_file) {
+ global = new DirectPhotoSourceCollection(initial_file);
+ DirectPhoto photo;
+ string? reason = global.fetch(initial_file, out photo, false);
+ if (reason != null)
+ warning("fetch error: %s", reason);
+ global.add(photo);
+ }
+
+ public static void terminate() {
+ }
+
+ // Gets the dimensions of this photo's pixbuf when scaled to original
+ // size and saves them where get_raw_dimensions can find them.
+ private void save_dims() {
+ try {
+ backing_photo_row.dim = Dimensions.for_pixbuf(get_pixbuf_with_options(Scaling.for_original(),
+ Exception.CROP | Exception.STRAIGHTEN | Exception.ORIENTATION));
+ } catch (Error e) {
+ warning("Dimensions for image %s could not be gotten.", to_string());
+ }
+ }
+
+ // Loads a photo on demand.
+ public ImportResult demand_load() {
+ if (loaded) {
+ save_dims();
+ return ImportResult.SUCCESS;
+ }
+
+ Photo.ReimportMasterState reimport_state;
+ try {
+ prepare_for_reimport_master(out reimport_state);
+ finish_reimport_master(reimport_state);
+ } catch (Error err) {
+ warning("Database error on re-importing image: %s", err.message);
+ return ImportResult.DATABASE_ERROR;
+ }
+
+ loaded = true;
+ save_dims();
+ return ImportResult.SUCCESS;
+ }
+
+ // This method should only be called by DirectPhotoSourceCollection. Use
+ // DirectPhoto.global.fetch to import files into the system.
+ public static ImportResult internal_import(File file, out DirectPhoto photo) {
+ PhotoImportParams params = new PhotoImportParams.create_placeholder(file, ImportID.generate());
+ Photo.create_pre_import(params);
+ PhotoTable.get_instance().add(params.row);
+
+ photo = new DirectPhoto(params.row);
+
+ return ImportResult.SUCCESS;
+ }
+
+ public override Gdk.Pixbuf get_preview_pixbuf(Scaling scaling) throws Error {
+ if (preview == null) {
+ preview = get_thumbnail(PREVIEW_BEST_FIT);
+
+ if (preview == null)
+ preview = get_pixbuf(scaling);
+ }
+
+ return scaling.perform_on_pixbuf(preview, Gdk.InterpType.BILINEAR, true);
+ }
+
+ public override void rotate(Rotation rotation) {
+ can_rotate_now = false;
+ can_rotate_changed(false);
+ base.rotate(rotation);
+ }
+
+ public override Gdk.Pixbuf get_pixbuf(Scaling scaling) throws Error {
+ Gdk.Pixbuf ret = base.get_pixbuf(scaling);
+ can_rotate_changed(true);
+ can_rotate_now = true;
+ return ret;
+ }
+
+ public override Gdk.Pixbuf? get_thumbnail(int scale) throws Error {
+ return (get_metadata().get_preview_count() == 0) ? null :
+ get_orientation().rotate_pixbuf(get_metadata().get_preview(0).get_pixbuf());
+ }
+
+ protected override void notify_altered(Alteration alteration) {
+ preview = null;
+
+ base.notify_altered(alteration);
+ }
+
+ protected override bool has_user_generated_metadata() {
+ // TODO: implement this method
+ return false;
+ }
+
+ protected override void set_user_metadata_for_export(PhotoMetadata metadata) {
+ // TODO: implement this method, see ticket
+ }
+
+ protected override void apply_user_metadata_for_reimport(PhotoMetadata metadata) {
+ }
+
+ public override bool is_trashed() {
+ // always returns false -- direct-edit mode has no concept of the trash can
+ return false;
+ }
+
+ public override bool is_offline() {
+ // always returns false -- direct-edit mode has no concept of offline photos
+ return false;
+ }
+
+ public override void trash() {
+ // a no-op -- direct-edit mode has no concept of the trash can
+ }
+
+ public override void untrash() {
+ // a no-op -- direct-edit mode has no concept of the trash can
+ }
+
+ public override void mark_offline() {
+ // a no-op -- direct-edit mode has no concept of offline photos
+ }
+
+ public override void mark_online() {
+ // a no-op -- direct-edit mode has no concept of offline photos
+ }
+}
+
+public class DirectPhotoSourceCollection : DatabaseSourceCollection {
+ private const int DISCOVERED_FILES_BATCH_ADD = 500;
+ private Gee.Collection<DirectPhoto> prepared_photos = new Gee.ArrayList<DirectPhoto>();
+ private Gee.HashMap<File, DirectPhoto> file_map = new Gee.HashMap<File, DirectPhoto>(file_hash,
+ file_equal);
+ private DirectoryMonitor monitor;
+
+ public DirectPhotoSourceCollection(File initial_file) {
+ base("DirectPhotoSourceCollection", get_direct_key);
+
+ // only use the monitor for discovery in the specified directory, not its children
+ monitor = new DirectoryMonitor(initial_file.get_parent(), false, false);
+ monitor.file_discovered.connect(on_file_discovered);
+ monitor.discovery_completed.connect(on_discovery_completed);
+
+ monitor.start_discovery();
+ }
+
+ public override bool holds_type_of_source(DataSource source) {
+ return source is DirectPhoto;
+ }
+
+ private static int64 get_direct_key(DataSource source) {
+ DirectPhoto photo = (DirectPhoto) source;
+ PhotoID photo_id = photo.get_photo_id();
+
+ return photo_id.id;
+ }
+
+ public override void notify_items_added(Gee.Iterable<DataObject> added) {
+ foreach (DataObject object in added) {
+ DirectPhoto photo = (DirectPhoto) object;
+ File file = photo.get_file();
+
+ assert(!file_map.has_key(file));
+
+ file_map.set(file, photo);
+ }
+
+ base.notify_items_added(added);
+ }
+
+ public override void notify_items_removed(Gee.Iterable<DataObject> removed) {
+ foreach (DataObject object in removed) {
+ DirectPhoto photo = (DirectPhoto) object;
+ File file = photo.get_file();
+
+ bool is_removed = file_map.unset(file);
+ assert(is_removed);
+ }
+
+ base.notify_items_removed(removed);
+ }
+
+ public bool has_source_for_file(File file) {
+ return file_map.has_key(file);
+ }
+
+ private void on_file_discovered(File file, FileInfo info) {
+ // skip already-seen files
+ if (has_source_for_file(file))
+ return;
+
+ // only add files that look like photo files we support
+ if (!PhotoFileFormat.is_file_supported(file))
+ return;
+
+ DirectPhoto photo;
+ string? reason = fetch(file, out photo, false);
+ if (reason != null)
+ warning("Error fetching file: %s", reason);
+ prepared_photos.add(photo);
+ if (prepared_photos.size >= DISCOVERED_FILES_BATCH_ADD)
+ flush_prepared_photos();
+ }
+
+ private void on_discovery_completed() {
+ flush_prepared_photos();
+ }
+
+ private void flush_prepared_photos() {
+ add_many(prepared_photos);
+ prepared_photos.clear();
+ }
+
+ public bool has_file(File file) {
+ return file_map.has_key(file);
+ }
+
+ public void reimport_photo(DirectPhoto photo) {
+ photo.discard_prefetched(true);
+ DirectPhoto reimported_photo;
+ fetch(photo.get_file(), out reimported_photo, true);
+ }
+
+ // Returns an error string if unable to fetch, null otherwise
+ public string? fetch(File file, out DirectPhoto photo, bool reimport) {
+ // fetch from the map first, which ensures that only one DirectPhoto exists for each file
+ photo = file_map.get(file);
+ if (photo != null) {
+ string? reason = null;
+
+ if (reimport) {
+ try {
+ Orientation ori_tmp = Orientation.TOP_LEFT;
+ bool should_restore_ori = false;
+
+ if ((photo.only_metadata_changed()) ||
+ (photo.get_file_format() == PhotoFileFormat.JFIF)) {
+ ori_tmp = photo.get_orientation();
+ should_restore_ori = true;
+ }
+
+ Photo.ReimportMasterState reimport_state;
+ if (photo.prepare_for_reimport_master(out reimport_state)) {
+ photo.finish_reimport_master(reimport_state);
+ if (should_restore_ori) {
+ photo.fixup_orientation_after_reimport(ori_tmp);
+ }
+ }
+ else {
+ reason = ImportResult.FILE_ERROR.to_string();
+ }
+ } catch (Error err) {
+ reason = err.message;
+ }
+ }
+
+ return reason;
+ }
+
+ // for DirectPhoto, a fetch on an unknown file is an implicit import into the in-memory
+ // database (which automatically adds the new DirectPhoto object to DirectPhoto.global)
+ ImportResult result = DirectPhoto.internal_import(file, out photo);
+
+ return (result == ImportResult.SUCCESS) ? null : result.to_string();
+ }
+
+ public bool has_file_source(File file) {
+ return file_map.has_key(file);
+ }
+
+ public DirectPhoto? get_file_source(File file) {
+ return file_map.get(file);
+ }
+}
+
diff --git a/src/direct/DirectPhotoPage.vala b/src/direct/DirectPhotoPage.vala
new file mode 100644
index 0000000..b2e130d
--- /dev/null
+++ b/src/direct/DirectPhotoPage.vala
@@ -0,0 +1,580 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class DirectPhotoPage : EditingHostPage {
+ private File initial_file;
+ private DirectViewCollection? view_controller = null;
+ private File current_save_dir;
+ private bool drop_if_dirty = false;
+
+ public DirectPhotoPage(File file) {
+ base (DirectPhoto.global, file.get_basename());
+
+ if (!check_editable_file(file)) {
+ Application.get_instance().panic();
+
+ return;
+ }
+
+ initial_file = file;
+ view_controller = new DirectViewCollection();
+ current_save_dir = file.get_parent();
+
+ DirectPhoto.global.items_altered.connect(on_photos_altered);
+
+ get_view().selection_group_altered.connect(on_selection_group_altered);
+ }
+
+ ~DirectPhotoPage() {
+ DirectPhoto.global.items_altered.disconnect(on_photos_altered);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("direct_context.ui");
+ ui_filenames.add("direct.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
+ file.label = _("_File");
+ actions += file;
+
+ Gtk.ActionEntry save = { "Save", Gtk.Stock.SAVE, TRANSLATABLE, "<Ctrl>S", TRANSLATABLE,
+ on_save };
+ save.label = _("_Save");
+ save.tooltip = _("Save photo");
+ actions += save;
+
+ Gtk.ActionEntry save_as = { "SaveAs", Gtk.Stock.SAVE_AS, TRANSLATABLE,
+ "<Ctrl><Shift>S", TRANSLATABLE, on_save_as };
+ save_as.label = _("Save _As...");
+ save_as.tooltip = _("Save photo with a different name");
+ actions += save_as;
+
+ Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
+ TRANSLATABLE, on_send_to };
+ send_to.label = Resources.SEND_TO_MENU;
+ actions += send_to;
+
+ Gtk.ActionEntry print = { "Print", Gtk.Stock.PRINT, TRANSLATABLE, "<Ctrl>P",
+ TRANSLATABLE, on_print };
+ print.label = Resources.PRINT_MENU;
+ print.tooltip = _("Print the photo to a printer connected to your computer");
+ actions += print;
+
+ Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
+ edit.label = _("_Edit");
+ actions += edit;
+
+ Gtk.ActionEntry photo = { "PhotoMenu", null, "", null, null, null };
+ photo.label = _("_Photo");
+ actions += photo;
+
+ Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
+ tools.label = _("T_ools");
+ actions += tools;
+
+ Gtk.ActionEntry prev = { "PrevPhoto", Gtk.Stock.GO_BACK, TRANSLATABLE, null,
+ TRANSLATABLE, on_previous_photo };
+ prev.label = _("_Previous Photo");
+ prev.tooltip = _("Previous Photo");
+ actions += prev;
+
+ Gtk.ActionEntry next = { "NextPhoto", Gtk.Stock.GO_FORWARD, TRANSLATABLE, null,
+ TRANSLATABLE, on_next_photo };
+ next.label = _("_Next Photo");
+ next.tooltip = _("Next Photo");
+ actions += next;
+
+ Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
+ TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
+ rotate_right.label = Resources.ROTATE_CW_MENU;
+ rotate_right.tooltip = Resources.ROTATE_CCW_TOOLTIP;
+ actions += rotate_right;
+
+ Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
+ TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
+ rotate_left.label = Resources.ROTATE_CCW_MENU;
+ rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
+ actions += rotate_left;
+
+ Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_horizontally };
+ hflip.label = Resources.HFLIP_MENU;
+ actions += hflip;
+
+ Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
+ TRANSLATABLE, on_flip_vertically };
+ vflip.label = Resources.VFLIP_MENU;
+ actions += vflip;
+
+ Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
+ TRANSLATABLE, on_enhance };
+ enhance.label = Resources.ENHANCE_MENU;
+ enhance.tooltip = Resources.ENHANCE_TOOLTIP;
+ actions += enhance;
+
+ Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
+ TRANSLATABLE, toggle_crop };
+ crop.label = Resources.CROP_MENU;
+ crop.tooltip = Resources.CROP_TOOLTIP;
+ actions += crop;
+
+ Gtk.ActionEntry straighten = { "Straighten", Gtk.Stock.REFRESH, TRANSLATABLE, "<Ctrl>A",
+ TRANSLATABLE, toggle_straighten };
+ straighten.label = Resources.STRAIGHTEN_MENU;
+ straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
+ actions += straighten;
+
+ Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
+ TRANSLATABLE, toggle_redeye };
+ red_eye.label = Resources.RED_EYE_MENU;
+ red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
+ actions += red_eye;
+
+ Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
+ TRANSLATABLE, toggle_adjust };
+ adjust.label = Resources.ADJUST_MENU;
+ adjust.tooltip = Resources.ADJUST_TOOLTIP;
+ actions += adjust;
+
+ Gtk.ActionEntry revert = { "Revert", Gtk.Stock.REVERT_TO_SAVED, TRANSLATABLE,
+ null, TRANSLATABLE, on_revert };
+ revert.label = Resources.REVERT_MENU;
+ actions += revert;
+
+ Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_adjust_date_time };
+ adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
+ actions += adjust_date_time;
+
+ Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
+ TRANSLATABLE, on_set_background };
+ set_background.label = Resources.SET_BACKGROUND_MENU;
+ set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
+ actions += set_background;
+
+ Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
+ view.label = _("_View");
+ actions += view;
+
+ Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
+ help.label = _("_Help");
+ actions += help;
+
+ Gtk.ActionEntry increase_size = { "IncreaseSize", Gtk.Stock.ZOOM_IN, TRANSLATABLE,
+ "<Ctrl>plus", TRANSLATABLE, on_increase_size };
+ increase_size.label = _("Zoom _In");
+ increase_size.tooltip = _("Increase the magnification of the photo");
+ actions += increase_size;
+
+ Gtk.ActionEntry decrease_size = { "DecreaseSize", Gtk.Stock.ZOOM_OUT, TRANSLATABLE,
+ "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
+ decrease_size.label = _("Zoom _Out");
+ decrease_size.tooltip = _("Decrease the magnification of the photo");
+ actions += decrease_size;
+
+ Gtk.ActionEntry best_fit = { "ZoomFit", Gtk.Stock.ZOOM_FIT, TRANSLATABLE,
+ "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
+ best_fit.label = _("Fit to _Page");
+ best_fit.tooltip = _("Zoom the photo to fit on the screen");
+ actions += best_fit;
+
+ Gtk.ActionEntry actual_size = { "Zoom100", Gtk.Stock.ZOOM_100, TRANSLATABLE,
+ "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
+ /// xgettext:no-c-format
+ actual_size.label = _("Zoom _100%");
+ /// xgettext:no-c-format
+ actual_size.tooltip = _("Zoom the photo to 100% magnification");
+ actions += actual_size;
+
+ Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
+ "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
+ /// xgettext:no-c-format
+ max_size.label = _("Zoom _200%");
+ /// xgettext:no-c-format
+ max_size.tooltip = _("Zoom the photo to 200% magnification");
+ actions += max_size;
+
+ return actions;
+ }
+
+ protected override InjectionGroup[] init_collect_injection_groups() {
+ InjectionGroup[] groups = base.init_collect_injection_groups();
+
+ InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
+ print_group.add_menu_item("Print");
+
+ groups += print_group;
+
+ InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
+ bg_group.add_menu_item("SetBackground");
+
+ groups += bg_group;
+
+ return groups;
+ }
+
+ private static bool check_editable_file(File file) {
+ if (!FileUtils.test(file.get_path(), FileTest.EXISTS))
+ AppWindow.error_message(_("%s does not exist.").printf(file.get_path()));
+ else if (!FileUtils.test(file.get_path(), FileTest.IS_REGULAR))
+ AppWindow.error_message(_("%s is not a file.").printf(file.get_path()));
+ else if (!PhotoFileFormat.is_file_supported(file))
+ AppWindow.error_message(_("%s does not support the file format of\n%s.").printf(
+ Resources.APP_TITLE, file.get_path()));
+ else
+ return true;
+
+ return false;
+ }
+
+ public override void realize() {
+ if (base.realize != null)
+ base.realize();
+
+ DirectPhoto? photo = DirectPhoto.global.get_file_source(initial_file);
+
+ display_mirror_of(view_controller, photo);
+ initial_file = null;
+ }
+
+ protected override void photo_changing(Photo new_photo) {
+ if (get_photo() != null) {
+ DirectPhoto tmp = get_photo() as DirectPhoto;
+
+ if (tmp != null) {
+ tmp.can_rotate_changed.disconnect(on_dphoto_can_rotate_changed);
+ }
+ }
+
+ ((DirectPhoto) new_photo).demand_load();
+
+ DirectPhoto tmp = new_photo as DirectPhoto;
+
+ if (tmp != null) {
+ tmp.can_rotate_changed.connect(on_dphoto_can_rotate_changed);
+ }
+ }
+
+ public File get_current_file() {
+ return get_photo().get_file();
+ }
+
+ protected override bool on_context_buttonpress(Gdk.EventButton event) {
+ Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget("/DirectContextMenu");
+ popup_context_menu(context_menu, event);
+
+ return true;
+ }
+
+ private void update_zoom_menu_item_sensitivity() {
+ set_action_sensitive("IncreaseSize", !get_zoom_state().is_max() && !get_photo_missing());
+ set_action_sensitive("DecreaseSize", !get_zoom_state().is_default() && !get_photo_missing());
+ }
+
+ protected override void on_increase_size() {
+ base.on_increase_size();
+
+ update_zoom_menu_item_sensitivity();
+ }
+
+ protected override void on_decrease_size() {
+ base.on_decrease_size();
+
+ update_zoom_menu_item_sensitivity();
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> map) {
+ bool contains = false;
+ if (has_photo()) {
+ Photo photo = get_photo();
+ foreach (DataObject object in map.keys) {
+ if (((Photo) object) == photo) {
+ contains = true;
+
+ break;
+ }
+ }
+ }
+
+ bool sensitive = has_photo() && !get_photo_missing();
+ if (sensitive)
+ sensitive = contains;
+
+ set_action_sensitive("Save", sensitive && get_photo().get_file_format().can_write());
+ set_action_sensitive("Revert", sensitive);
+ }
+
+ private void on_selection_group_altered() {
+ // On EditingHostPage, the displayed photo is always selected, so this signal is fired
+ // whenever a new photo is displayed (which even happens on an in-place save; the changes
+ // are written and a new DirectPhoto is loaded into its place).
+ //
+ // In every case, reset the CommandManager, as the command stack is not valid against this
+ // new file.
+ get_command_manager().reset();
+ }
+
+ protected override bool on_double_click(Gdk.EventButton event) {
+ AppWindow.get_instance().end_fullscreen();
+
+ return base.on_double_click(event);
+ }
+
+ protected override void update_ui(bool missing) {
+ bool sensitivity = !missing;
+
+ set_action_sensitive("Save", sensitivity);
+ set_action_sensitive("SaveAs", sensitivity);
+ set_action_sensitive("SendTo", sensitivity);
+ set_action_sensitive("Publish", sensitivity);
+ set_action_sensitive("Print", sensitivity);
+ set_action_sensitive("CommonJumpToFile", sensitivity);
+
+ set_action_sensitive("CommonUndo", sensitivity);
+ set_action_sensitive("CommonRedo", sensitivity);
+
+ set_action_sensitive("IncreaseSize", sensitivity);
+ set_action_sensitive("DecreaseSize", sensitivity);
+ set_action_sensitive("ZoomFit", sensitivity);
+ set_action_sensitive("Zoom100", sensitivity);
+ set_action_sensitive("Zoom200", sensitivity);
+
+ set_action_sensitive("RotateClockwise", sensitivity);
+ set_action_sensitive("RotateCounterclockwise", sensitivity);
+ set_action_sensitive("FlipHorizontally", sensitivity);
+ set_action_sensitive("FlipVertically", sensitivity);
+ set_action_sensitive("Enhance", sensitivity);
+ set_action_sensitive("Crop", sensitivity);
+ set_action_sensitive("Straighten", sensitivity);
+ set_action_sensitive("RedEye", sensitivity);
+ set_action_sensitive("Adjust", sensitivity);
+ set_action_sensitive("Revert", sensitivity);
+ set_action_sensitive("AdjustDateTime", sensitivity);
+ set_action_sensitive("Fullscreen", sensitivity);
+
+ set_action_sensitive("SetBackground", has_photo() && !get_photo_missing());
+
+ base.update_ui(missing);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ bool multiple = get_view().get_count() > 1;
+ bool revert_possible = has_photo() ? get_photo().has_transformations()
+ && !get_photo_missing() : false;
+ bool rotate_possible = has_photo() ? is_rotate_available(get_photo()) : false;
+ bool enhance_possible = has_photo() ? is_enhance_available(get_photo()) : false;
+
+ set_action_sensitive("PrevPhoto", multiple);
+ set_action_sensitive("NextPhoto", multiple);
+ set_action_sensitive("RotateClockwise", rotate_possible);
+ set_action_sensitive("RotateCounterclockwise", rotate_possible);
+ set_action_sensitive("FlipHorizontally", rotate_possible);
+ set_action_sensitive("FlipVertically", rotate_possible);
+ set_action_sensitive("Revert", revert_possible);
+ set_action_sensitive("Enhance", enhance_possible);
+
+ set_action_sensitive("SetBackground", has_photo());
+
+ if (has_photo()) {
+ set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), Scaling.for_original()));
+ set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(),
+ Scaling.for_original()));
+ }
+
+ // can't write to raws, and trapping the output JPEG here is tricky,
+ // so don't allow date/time changes here.
+ if (get_photo() != null) {
+ set_action_sensitive("AdjustDateTime", (get_photo().get_file_format() != PhotoFileFormat.RAW));
+ } else {
+ set_action_sensitive("AdjustDateTime", false);
+ }
+
+ base.update_actions(selected_count, count);
+ }
+
+ private bool check_ok_to_close_photo(Photo photo) {
+ if (!photo.has_alterations())
+ return true;
+
+ if (drop_if_dirty) {
+ // need to remove transformations, or else they stick around in memory (reappearing
+ // if the user opens the file again)
+ photo.remove_all_transformations();
+
+ return true;
+ }
+
+ bool is_writeable = get_photo().get_file_format().can_write();
+ string save_option = is_writeable ? _("_Save") : _("_Save a Copy");
+
+ Gtk.ResponseType response = AppWindow.negate_affirm_cancel_question(
+ _("Lose changes to %s?").printf(photo.get_basename()), save_option,
+ _("Close _without Saving"));
+
+ if (response == Gtk.ResponseType.YES)
+ photo.remove_all_transformations();
+ else if (response == Gtk.ResponseType.NO) {
+ if (is_writeable)
+ save(photo.get_file(), 0, ScaleConstraint.ORIGINAL, Jpeg.Quality.HIGH,
+ get_photo().get_file_format());
+ else
+ on_save_as();
+ } else if ((response == Gtk.ResponseType.CANCEL) || (response == Gtk.ResponseType.DELETE_EVENT) ||
+ (response == Gtk.ResponseType.CLOSE)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public bool check_quit() {
+ return check_ok_to_close_photo(get_photo());
+ }
+
+ protected override bool confirm_replace_photo(Photo? old_photo, Photo new_photo) {
+ return (old_photo != null) ? check_ok_to_close_photo(old_photo) : true;
+ }
+
+ private void save(File dest, int scale, ScaleConstraint constraint, Jpeg.Quality quality,
+ PhotoFileFormat format, bool copy_unmodified = false, bool save_metadata = true) {
+ Scaling scaling = Scaling.for_constraint(constraint, scale, false);
+
+ try {
+ get_photo().export(dest, scaling, quality, format, copy_unmodified, save_metadata);
+ } catch (Error err) {
+ AppWindow.error_message(_("Error while saving to %s: %s").printf(dest.get_path(),
+ err.message));
+
+ return;
+ }
+
+ // Fetch the DirectPhoto and reimport.
+ DirectPhoto photo;
+ DirectPhoto.global.fetch(dest, out photo, true);
+
+ DirectView tmp_view = new DirectView(photo);
+ view_controller.add(tmp_view);
+
+ DirectPhoto.global.reimport_photo(photo);
+ display_mirror_of(view_controller, photo);
+ }
+
+ private void on_save() {
+ if (!get_photo().has_alterations() || !get_photo().get_file_format().can_write() ||
+ get_photo_missing())
+ return;
+
+ // save full-sized version right on top of the current file
+ save(get_photo().get_file(), 0, ScaleConstraint.ORIGINAL, Jpeg.Quality.HIGH,
+ get_photo().get_file_format());
+ }
+
+ private void on_save_as() {
+ ExportDialog export_dialog = new ExportDialog(_("Save As"));
+
+ int scale;
+ ScaleConstraint constraint;
+ ExportFormatParameters export_params = ExportFormatParameters.last();
+ if (!export_dialog.execute(out scale, out constraint, ref export_params))
+ return;
+
+ string filename = get_photo().get_export_basename_for_parameters(export_params);
+ PhotoFileFormat effective_export_format =
+ get_photo().get_export_format_for_parameters(export_params);
+
+ string[] output_format_extensions =
+ effective_export_format.get_properties().get_known_extensions();
+ Gtk.FileFilter output_format_filter = new Gtk.FileFilter();
+ foreach(string extension in output_format_extensions) {
+ string uppercase_extension = extension.up();
+ output_format_filter.add_pattern("*." + extension);
+ output_format_filter.add_pattern("*." + uppercase_extension);
+ }
+
+ Gtk.FileChooserDialog save_as_dialog = new Gtk.FileChooserDialog(_("Save As"),
+ AppWindow.get_instance(), Gtk.FileChooserAction.SAVE, Gtk.Stock.CANCEL,
+ Gtk.ResponseType.CANCEL, Gtk.Stock.OK, Gtk.ResponseType.OK);
+ save_as_dialog.set_select_multiple(false);
+ save_as_dialog.set_current_name(filename);
+ save_as_dialog.set_current_folder(current_save_dir.get_path());
+ save_as_dialog.add_filter(output_format_filter);
+ save_as_dialog.set_do_overwrite_confirmation(true);
+ save_as_dialog.set_local_only(false);
+
+ int response = save_as_dialog.run();
+ if (response == Gtk.ResponseType.OK) {
+ // flag to prevent asking user about losing changes to the old file (since they'll be
+ // loaded right into the new one)
+ drop_if_dirty = true;
+ save(File.new_for_uri(save_as_dialog.get_uri()), scale, constraint, export_params.quality,
+ effective_export_format, export_params.mode == ExportFormatMode.UNMODIFIED,
+ export_params.export_metadata);
+ drop_if_dirty = false;
+
+ current_save_dir = File.new_for_path(save_as_dialog.get_current_folder());
+ }
+
+ save_as_dialog.destroy();
+ }
+
+ private void on_send_to() {
+ if (has_photo())
+ DesktopIntegration.send_to((Gee.Collection<Photo>) get_view().get_selected_sources());
+ }
+
+ protected override bool on_app_key_pressed(Gdk.EventKey event) {
+ bool handled = true;
+
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "bracketright":
+ activate_action("RotateClockwise");
+ break;
+
+ case "bracketleft":
+ activate_action("RotateClockwise");
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+
+ return handled ? true : base.on_app_key_pressed(event);
+ }
+
+ private void on_print() {
+ if (get_view().get_selected_count() > 0) {
+ PrintManager.get_instance().spool_photo(
+ (Gee.Collection<Photo>) get_view().get_selected_sources_of_type(typeof(Photo)));
+ }
+ }
+
+ private void on_dphoto_can_rotate_changed(bool should_allow_rotation) {
+ enable_rotate(should_allow_rotation);
+ }
+
+ protected override DataView create_photo_view(DataSource source) {
+ return new DirectView((DirectPhoto) source);
+ }
+}
+
+public class DirectFullscreenPhotoPage : DirectPhotoPage {
+ public DirectFullscreenPhotoPage(File file) {
+ base(file);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ // We intentionally avoid calling the base class implementation since we don't want
+ // direct.ui.
+ ui_filenames.add("direct_context.ui");
+ }
+}
diff --git a/src/direct/DirectView.vala b/src/direct/DirectView.vala
new file mode 100644
index 0000000..a36ec68
--- /dev/null
+++ b/src/direct/DirectView.vala
@@ -0,0 +1,50 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class DirectView : DataView {
+ private File file;
+ private string? collate_key = null;
+
+ public DirectView(DirectPhoto source) {
+ base ((DataSource) source);
+
+ this.file = ((Photo) source).get_file();
+ }
+
+ public File get_file() {
+ return file;
+ }
+
+ public string get_collate_key() {
+ if (collate_key == null)
+ collate_key = file.get_basename().collate_key_for_filename();
+
+ return collate_key;
+ }
+}
+
+private class DirectViewCollection : ViewCollection {
+ private class DirectViewManager : ViewManager {
+ public override DataView create_view(DataSource source) {
+ return new DirectView((DirectPhoto) source);
+ }
+ }
+
+ public DirectViewCollection() {
+ base ("DirectViewCollection");
+
+ set_comparator(filename_comparator, null);
+ monitor_source_collection(DirectPhoto.global, new DirectViewManager(), null);
+ }
+
+ private static int64 filename_comparator(void *a, void *b) {
+ DirectView *aview = (DirectView *) a;
+ DirectView *bview = (DirectView *) b;
+
+ return strcmp(aview->get_collate_key(), bview->get_collate_key());
+ }
+}
+
diff --git a/src/direct/DirectWindow.vala b/src/direct/DirectWindow.vala
new file mode 100644
index 0000000..b339ac4
--- /dev/null
+++ b/src/direct/DirectWindow.vala
@@ -0,0 +1,98 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class DirectWindow : AppWindow {
+ private DirectPhotoPage direct_photo_page;
+
+ public DirectWindow(File file) {
+ direct_photo_page = new DirectPhotoPage(file);
+ direct_photo_page.get_view().items_altered.connect(on_photo_changed);
+ direct_photo_page.get_view().items_state_changed.connect(on_photo_changed);
+
+ set_current_page(direct_photo_page);
+
+ update_title(file, false);
+
+ direct_photo_page.switched_to();
+
+ // simple layout: menu on top, photo in center, toolbar along bottom (mimicking the
+ // PhotoPage in the library, but without the sidebar)
+ Gtk.Box layout = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ layout.pack_start(direct_photo_page.get_menubar(), false, false, 0);
+ layout.pack_start(direct_photo_page, true, true, 0);
+ layout.pack_end(direct_photo_page.get_toolbar(), false, false, 0);
+
+ add(layout);
+ }
+
+ public static DirectWindow get_app() {
+ return (DirectWindow) instance;
+ }
+
+ public DirectPhotoPage get_direct_page() {
+ return (DirectPhotoPage) get_current_page();
+ }
+
+ public void update_title(File file, bool modified) {
+ title = "%s%s (%s) - %s".printf((modified) ? "*" : "", file.get_basename(),
+ get_display_pathname(file.get_parent()), Resources.APP_TITLE);
+ }
+
+ protected override void on_fullscreen() {
+ File file = get_direct_page().get_current_file();
+
+ go_fullscreen(new DirectFullscreenPhotoPage(file));
+ }
+
+ public override string get_app_role() {
+ return Resources.APP_DIRECT_ROLE;
+ }
+
+ private void on_photo_changed() {
+ Photo? photo = direct_photo_page.get_photo();
+ if (photo != null)
+ update_title(photo.get_file(), photo.has_alterations());
+ }
+
+ protected override void on_quit() {
+ if (!get_direct_page().check_quit())
+ return;
+
+ Config.Facade.get_instance().set_direct_window_state(maximized, dimensions);
+
+ base.on_quit();
+ }
+
+ public override bool delete_event(Gdk.EventAny event) {
+ if (!get_direct_page().check_quit())
+ return true;
+
+ return (base.delete_event != null) ? base.delete_event(event) : false;
+ }
+
+ public override bool button_press_event(Gdk.EventButton event) {
+ if (event.type == Gdk.EventType.2BUTTON_PRESS) {
+ on_fullscreen();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ // check for an escape
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ on_quit();
+
+ return true;
+ }
+
+ // ...then let the base class take over
+ return (base.key_press_event != null) ? base.key_press_event(event) : false;
+ }
+}
+
diff --git a/src/direct/mk/direct.mk b/src/direct/mk/direct.mk
new file mode 100644
index 0000000..4c0f226
--- /dev/null
+++ b/src/direct/mk/direct.mk
@@ -0,0 +1,36 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Direct
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := direct
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ DirectWindow.vala \
+ DirectPhoto.vala \
+ DirectPhotoPage.vala \
+ DirectView.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Db \
+ Util \
+ Photos \
+ Slideshow \
+ Core
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/editing_tools/EditingTools.vala b/src/editing_tools/EditingTools.vala
new file mode 100644
index 0000000..b06dbf4
--- /dev/null
+++ b/src/editing_tools/EditingTools.vala
@@ -0,0 +1,2934 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the EditingTools unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace EditingTools {
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+}
+
+public void terminate() {
+}
+
+public abstract class EditingToolWindow : Gtk.Window {
+ private const int FRAME_BORDER = 6;
+
+ private Gtk.Frame layout_frame = new Gtk.Frame(null);
+ private bool user_moved = false;
+
+ public EditingToolWindow(Gtk.Window container) {
+ // needed so that windows will appear properly in fullscreen mode
+ type_hint = Gdk.WindowTypeHint.UTILITY;
+
+ set_decorated(false);
+ set_transient_for(container);
+
+ Gtk.Frame outer_frame = new Gtk.Frame(null);
+ outer_frame.set_border_width(0);
+ outer_frame.set_shadow_type(Gtk.ShadowType.OUT);
+
+ layout_frame.set_border_width(FRAME_BORDER);
+ layout_frame.set_shadow_type(Gtk.ShadowType.NONE);
+
+ outer_frame.add(layout_frame);
+ base.add(outer_frame);
+
+ add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.KEY_PRESS_MASK);
+ focus_on_map = true;
+ set_accept_focus(true);
+ set_can_focus(true);
+ set_has_resize_grip(false);
+
+ // Needed to prevent the (spurious) 'This event was synthesised outside of GDK'
+ // warnings after a keypress.
+ Log.set_handler("Gdk", LogLevelFlags.LEVEL_WARNING, suppress_warnings);
+ }
+
+ ~EditingToolWindow() {
+ Log.set_handler("Gdk", LogLevelFlags.LEVEL_WARNING, Log.default_handler);
+ }
+
+ public override void add(Gtk.Widget widget) {
+ layout_frame.add(widget);
+ }
+
+ public bool has_user_moved() {
+ return user_moved;
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ if (base.key_press_event(event)) {
+ return true;
+ }
+ return AppWindow.get_instance().key_press_event(event);
+ }
+
+ public override bool button_press_event(Gdk.EventButton event) {
+ // LMB only
+ if (event.button != 1)
+ return (base.button_press_event != null) ? base.button_press_event(event) : true;
+
+ begin_move_drag((int) event.button, (int) event.x_root, (int) event.y_root, event.time);
+ user_moved = true;
+
+ return true;
+ }
+
+ public override void realize() {
+ set_opacity(Resources.TRANSIENT_WINDOW_OPACITY);
+
+ base.realize();
+ }
+}
+
+// The PhotoCanvas is an interface object between an EditingTool and its host. It provides objects
+// and primitives for an EditingTool to obtain information about the image, to draw on the host's
+// canvas, and to be signalled when the canvas and its pixbuf changes (is resized).
+public abstract class PhotoCanvas {
+ private Gtk.Window container;
+ private Gdk.Window drawing_window;
+ private Photo photo;
+ private Cairo.Context default_ctx;
+ private Dimensions surface_dim;
+ private Cairo.Surface scaled;
+ private Gdk.Pixbuf scaled_pixbuf;
+ private Gdk.Rectangle scaled_position;
+
+ public PhotoCanvas(Gtk.Window container, Gdk.Window drawing_window, Photo photo,
+ Cairo.Context default_ctx, Dimensions surface_dim, Gdk.Pixbuf scaled, Gdk.Rectangle scaled_position) {
+ this.container = container;
+ this.drawing_window = drawing_window;
+ this.photo = photo;
+ this.default_ctx = default_ctx;
+ this.surface_dim = surface_dim;
+ this.scaled_position = scaled_position;
+ this.scaled_pixbuf = scaled;
+ this.scaled = pixbuf_to_surface(default_ctx, scaled, scaled_position);
+ }
+
+ public signal void new_surface(Cairo.Context ctx, Dimensions dim);
+
+ public signal void resized_scaled_pixbuf(Dimensions old_dim, Gdk.Pixbuf scaled,
+ Gdk.Rectangle scaled_position);
+
+ public Gdk.Rectangle unscaled_to_raw_rect(Gdk.Rectangle rectangle) {
+ return photo.unscaled_to_raw_rect(rectangle);
+ }
+
+ public Gdk.Point active_to_unscaled_point(Gdk.Point active_point) {
+ Gdk.Rectangle scaled_position = get_scaled_pixbuf_position();
+ Dimensions unscaled_dims = photo.get_dimensions();
+
+ double scale_factor_x = ((double) unscaled_dims.width) /
+ ((double) scaled_position.width);
+ double scale_factor_y = ((double) unscaled_dims.height) /
+ ((double) scaled_position.height);
+
+ Gdk.Point result = {0};
+ result.x = (int)(((double) active_point.x) * scale_factor_x + 0.5);
+ result.y = (int)(((double) active_point.y) * scale_factor_y + 0.5);
+
+ return result;
+ }
+
+ public Gdk.Rectangle active_to_unscaled_rect(Gdk.Rectangle active_rect) {
+ Gdk.Point upper_left = {0};
+ Gdk.Point lower_right = {0};
+ upper_left.x = active_rect.x;
+ upper_left.y = active_rect.y;
+ lower_right.x = upper_left.x + active_rect.width;
+ lower_right.y = upper_left.y + active_rect.height;
+
+ upper_left = active_to_unscaled_point(upper_left);
+ lower_right = active_to_unscaled_point(lower_right);
+
+ Gdk.Rectangle unscaled_rect = Gdk.Rectangle();
+ unscaled_rect.x = upper_left.x;
+ unscaled_rect.y = upper_left.y;
+ unscaled_rect.width = lower_right.x - upper_left.x;
+ unscaled_rect.height = lower_right.y - upper_left.y;
+
+ return unscaled_rect;
+ }
+
+ public Gdk.Point user_to_active_point(Gdk.Point user_point) {
+ Gdk.Rectangle active_offsets = get_scaled_pixbuf_position();
+
+ Gdk.Point result = {0};
+ result.x = user_point.x - active_offsets.x;
+ result.y = user_point.y - active_offsets.y;
+
+ return result;
+ }
+
+ public Gdk.Rectangle user_to_active_rect(Gdk.Rectangle user_rect) {
+ Gdk.Point upper_left = {0};
+ Gdk.Point lower_right = {0};
+ upper_left.x = user_rect.x;
+ upper_left.y = user_rect.y;
+ lower_right.x = upper_left.x + user_rect.width;
+ lower_right.y = upper_left.y + user_rect.height;
+
+ upper_left = user_to_active_point(upper_left);
+ lower_right = user_to_active_point(lower_right);
+
+ Gdk.Rectangle active_rect = Gdk.Rectangle();
+ active_rect.x = upper_left.x;
+ active_rect.y = upper_left.y;
+ active_rect.width = lower_right.x - upper_left.x;
+ active_rect.height = lower_right.y - upper_left.y;
+
+ return active_rect;
+ }
+
+ public Photo get_photo() {
+ return photo;
+ }
+
+ public Gtk.Window get_container() {
+ return container;
+ }
+
+ public Gdk.Window get_drawing_window() {
+ return drawing_window;
+ }
+
+ public Cairo.Context get_default_ctx() {
+ return default_ctx;
+ }
+
+ public Dimensions get_surface_dim() {
+ return surface_dim;
+ }
+
+ public Scaling get_scaling() {
+ return Scaling.for_viewport(surface_dim, false);
+ }
+
+ public void set_surface(Cairo.Context default_ctx, Dimensions surface_dim) {
+ this.default_ctx = default_ctx;
+ this.surface_dim = surface_dim;
+
+ new_surface(default_ctx, surface_dim);
+ }
+
+ public Cairo.Surface get_scaled_surface() {
+ return scaled;
+ }
+
+ public Gdk.Pixbuf get_scaled_pixbuf() {
+ return scaled_pixbuf;
+ }
+
+ public Gdk.Rectangle get_scaled_pixbuf_position() {
+ return scaled_position;
+ }
+
+ public void resized_pixbuf(Dimensions old_dim, Gdk.Pixbuf scaled, Gdk.Rectangle scaled_position) {
+ this.scaled = pixbuf_to_surface(default_ctx, scaled, scaled_position);
+ this.scaled_pixbuf = scaled;
+ this.scaled_position = scaled_position;
+
+ resized_scaled_pixbuf(old_dim, scaled, scaled_position);
+ }
+
+ public abstract void repaint();
+
+ // Because the editing tool should not have any need to draw on the gutters outside the photo,
+ // and it's a pain to constantly calculate where it's laid out on the drawable, these convenience
+ // methods automatically adjust for its position.
+ //
+ // If these methods are not used, all painting to the drawable should be offet by
+ // get_scaled_pixbuf_position().x and get_scaled_pixbuf_position().y
+ public void paint_pixbuf(Gdk.Pixbuf pixbuf) {
+ default_ctx.save();
+
+ // paint black background
+ set_source_color_from_string(default_ctx, "#000");
+ default_ctx.rectangle(0, 0, surface_dim.width, surface_dim.height);
+ default_ctx.fill();
+
+ // paint the actual image
+ Gdk.cairo_set_source_pixbuf(default_ctx, pixbuf, scaled_position.x, scaled_position.y);
+ default_ctx.rectangle(scaled_position.x, scaled_position.y,
+ pixbuf.get_width(), pixbuf.get_height());
+ default_ctx.fill();
+ default_ctx.restore();
+ }
+
+ public void paint_pixbuf_area(Gdk.Pixbuf pixbuf, Box source_area) {
+ default_ctx.save();
+ if (pixbuf.get_has_alpha()) {
+ set_source_color_from_string(default_ctx, "#000");
+ default_ctx.rectangle(scaled_position.x + source_area.left,
+ scaled_position.y + source_area.top,
+ source_area.get_width(), source_area.get_height());
+ default_ctx.fill();
+
+ }
+ Gdk.cairo_set_source_pixbuf(default_ctx, pixbuf, scaled_position.x,
+ scaled_position.y);
+ default_ctx.rectangle(scaled_position.x + source_area.left,
+ scaled_position.y + source_area.top,
+ source_area.get_width(), source_area.get_height());
+ default_ctx.fill();
+ default_ctx.restore();
+ }
+
+ // Paint a surface on top of the photo
+ public void paint_surface(Cairo.Surface surface, bool over) {
+ default_ctx.save();
+ if (over == false)
+ default_ctx.set_operator(Cairo.Operator.SOURCE);
+ else
+ default_ctx.set_operator(Cairo.Operator.OVER);
+
+ default_ctx.set_source_surface(scaled, scaled_position.x, scaled_position.y);
+ default_ctx.paint();
+ default_ctx.set_source_surface(surface, scaled_position.x, scaled_position.y);
+ default_ctx.paint();
+ default_ctx.restore();
+ }
+
+ public void paint_surface_area(Cairo.Surface surface, Box source_area, bool over) {
+ default_ctx.save();
+ if (over == false)
+ default_ctx.set_operator(Cairo.Operator.SOURCE);
+ else
+ default_ctx.set_operator(Cairo.Operator.OVER);
+
+ default_ctx.set_source_surface(scaled, scaled_position.x, scaled_position.y);
+ default_ctx.rectangle(scaled_position.x + source_area.left,
+ scaled_position.y + source_area.top,
+ source_area.get_width(), source_area.get_height());
+ default_ctx.fill();
+
+ default_ctx.set_source_surface(surface, scaled_position.x, scaled_position.y);
+ default_ctx.rectangle(scaled_position.x + source_area.left,
+ scaled_position.y + source_area.top,
+ source_area.get_width(), source_area.get_height());
+ default_ctx.fill();
+ default_ctx.restore();
+ }
+
+ public void draw_box(Cairo.Context ctx, Box box) {
+ Gdk.Rectangle rect = box.get_rectangle();
+ rect.x += scaled_position.x;
+ rect.y += scaled_position.y;
+
+ ctx.rectangle(rect.x + 0.5, rect.y + 0.5, rect.width - 1, rect.height - 1);
+ ctx.stroke();
+ }
+
+ public void draw_text(Cairo.Context ctx, string text, int x, int y, bool use_scaled_pos = true) {
+ if (use_scaled_pos) {
+ x += scaled_position.x;
+ y += scaled_position.y;
+ }
+ Cairo.TextExtents extents;
+ ctx.text_extents(text, out extents);
+ x -= (int) extents.width / 2;
+
+ set_source_color_from_string(ctx, Resources.ONIMAGE_FONT_BACKGROUND);
+
+ int pane_border = 5; // border around edge of pane in pixels
+ ctx.rectangle(x - pane_border, y - pane_border - extents.height,
+ extents.width + 2 * pane_border,
+ extents.height + 2 * pane_border);
+ ctx.fill();
+
+ ctx.move_to(x, y);
+ set_source_color_from_string(ctx, Resources.ONIMAGE_FONT_COLOR);
+ ctx.show_text(text);
+ }
+
+ /**
+ * Draw a horizontal line into the specified Cairo context at the specified position, taking
+ * into account the scaled position of the image unless directed otherwise.
+ *
+ * @param ctx The drawing context of the surface we're drawing to.
+ * @param x The horizontal position to place the line at.
+ * @param y The vertical position to place the line at.
+ * @param width The length of the line.
+ * @param use_scaled_pos Whether to use absolute window positioning or take into account the
+ * position of the scaled image.
+ */
+ public void draw_horizontal_line(Cairo.Context ctx, int x, int y, int width, bool use_scaled_pos = true) {
+ if (use_scaled_pos) {
+ x += scaled_position.x;
+ y += scaled_position.y;
+ }
+
+ ctx.move_to(x + 0.5, y + 0.5);
+ ctx.line_to(x + width - 1, y + 0.5);
+ ctx.stroke();
+ }
+
+ /**
+ * Draw a vertical line into the specified Cairo context at the specified position, taking
+ * into account the scaled position of the image unless directed otherwise.
+ *
+ * @param ctx The drawing context of the surface we're drawing to.
+ * @param x The horizontal position to place the line at.
+ * @param y The vertical position to place the line at.
+ * @param width The length of the line.
+ * @param use_scaled_pos Whether to use absolute window positioning or take into account the
+ * position of the scaled image.
+ */
+ public void draw_vertical_line(Cairo.Context ctx, int x, int y, int height, bool use_scaled_pos = true) {
+ if (use_scaled_pos) {
+ x += scaled_position.x;
+ y += scaled_position.y;
+ }
+
+ ctx.move_to(x + 0.5, y + 0.5);
+ ctx.line_to(x + 0.5, y + height - 1);
+ ctx.stroke();
+ }
+
+ public void erase_horizontal_line(int x, int y, int width) {
+ default_ctx.save();
+
+ default_ctx.set_operator(Cairo.Operator.SOURCE);
+ default_ctx.set_source_surface(scaled, scaled_position.x, scaled_position.y);
+ default_ctx.rectangle(scaled_position.x + x, scaled_position.y + y,
+ width - 1, 1);
+ default_ctx.fill();
+
+ default_ctx.restore();
+ }
+
+ public void draw_circle(Cairo.Context ctx, int active_center_x, int active_center_y,
+ int radius) {
+ int center_x = active_center_x + scaled_position.x;
+ int center_y = active_center_y + scaled_position.y;
+
+ ctx.arc(center_x, center_y, radius, 0, 2 * GLib.Math.PI);
+ ctx.stroke();
+ }
+
+ public void erase_vertical_line(int x, int y, int height) {
+ default_ctx.save();
+
+ // Ticket #3146 - artifacting when moving the crop box or
+ // enlarging it from the lower right.
+ // We now no longer subtract one from the height before choosing
+ // a region to erase.
+ default_ctx.set_operator(Cairo.Operator.SOURCE);
+ default_ctx.set_source_surface(scaled, scaled_position.x, scaled_position.y);
+ default_ctx.rectangle(scaled_position.x + x, scaled_position.y + y,
+ 1, height);
+ default_ctx.fill();
+
+ default_ctx.restore();
+ }
+
+ public void erase_box(Box box) {
+ erase_horizontal_line(box.left, box.top, box.get_width());
+ erase_horizontal_line(box.left, box.bottom, box.get_width());
+
+ erase_vertical_line(box.left, box.top, box.get_height());
+ erase_vertical_line(box.right, box.top, box.get_height());
+ }
+
+ public void invalidate_area(Box area) {
+ Gdk.Rectangle rect = area.get_rectangle();
+ rect.x += scaled_position.x;
+ rect.y += scaled_position.y;
+
+ drawing_window.invalidate_rect(rect, false);
+ }
+
+ private Cairo.Surface pixbuf_to_surface(Cairo.Context default_ctx, Gdk.Pixbuf pixbuf,
+ Gdk.Rectangle pos) {
+ Cairo.Surface surface = new Cairo.Surface.similar(default_ctx.get_target(),
+ Cairo.Content.COLOR_ALPHA, pos.width, pos.height);
+ Cairo.Context ctx = new Cairo.Context(surface);
+ Gdk.cairo_set_source_pixbuf(ctx, pixbuf, 0, 0);
+ ctx.paint();
+ return surface;
+ }
+}
+
+public abstract class EditingTool {
+ public PhotoCanvas canvas = null;
+
+ private EditingToolWindow tool_window = null;
+ protected Cairo.Surface surface;
+ public string name;
+
+ [CCode (has_target=false)]
+ public delegate EditingTool Factory();
+
+ public signal void activated();
+
+ public signal void deactivated();
+
+ public signal void applied(Command? command, Gdk.Pixbuf? new_pixbuf, Dimensions new_max_dim,
+ bool needs_improvement);
+
+ public signal void cancelled();
+
+ public signal void aborted();
+
+ public EditingTool(string name) {
+ this.name = name;
+ }
+
+ // base.activate() should always be called by an overriding member to ensure the base class
+ // gets to set up and store the PhotoCanvas in the canvas member field. More importantly,
+ // the activated signal is called here, and should only be called once the tool is completely
+ // initialized.
+ public virtual void activate(PhotoCanvas canvas) {
+ // multiple activates are not tolerated
+ assert(this.canvas == null);
+ assert(tool_window == null);
+
+ this.canvas = canvas;
+
+ tool_window = get_tool_window();
+ if (tool_window != null)
+ tool_window.key_press_event.connect(on_keypress);
+
+ activated();
+ }
+
+ // Like activate(), this should always be called from an overriding subclass.
+ public virtual void deactivate() {
+ // multiple deactivates are tolerated
+ if (canvas == null && tool_window == null)
+ return;
+
+ canvas = null;
+
+ if (tool_window != null) {
+ tool_window.key_press_event.disconnect(on_keypress);
+ tool_window = null;
+ }
+
+ deactivated();
+ }
+
+ public bool is_activated() {
+ return canvas != null;
+ }
+
+ public virtual EditingToolWindow? get_tool_window() {
+ return null;
+ }
+
+ // This allows the EditingTool to specify which pixbuf to display during the tool's
+ // operation. Returning null means the host should use the pixbuf associated with the current
+ // Photo. Note: This will be called before activate(), primarily to display the pixbuf before
+ // the tool is on the screen, and before paint_full() is hooked in. It also means the PhotoCanvas
+ // will have this pixbuf rather than one from the Photo class.
+ //
+ // If returns non-null, should also fill max_dim with the maximum dimensions of the original
+ // image, as the editing host may not always scale images up to fit the viewport.
+ //
+ // Note this this method doesn't need to be returning the "proper" pixbuf on-the-fly (i.e.
+ // a pixbuf with unsaved tool edits in it). That can be handled in the paint() virtual method.
+ public virtual Gdk.Pixbuf? get_display_pixbuf(Scaling scaling, Photo photo,
+ out Dimensions max_dim) throws Error {
+ max_dim = Dimensions();
+
+ return null;
+ }
+
+ public virtual void on_left_click(int x, int y) {
+ }
+
+ public virtual void on_left_released(int x, int y) {
+ }
+
+ public virtual void on_motion(int x, int y, Gdk.ModifierType mask) {
+ }
+
+ public virtual bool on_leave_notify_event(){
+ return false;
+ }
+
+ public virtual bool on_keypress(Gdk.EventKey event) {
+ // check for an escape/abort first
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ notify_cancel();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public virtual void paint(Cairo.Context ctx) {
+ }
+
+ // Helper function that fires the cancelled signal. (Can be connected to other signals.)
+ protected void notify_cancel() {
+ cancelled();
+ }
+}
+
+public class CropTool : EditingTool {
+ private const double CROP_INIT_X_PCT = 0.15;
+ private const double CROP_INIT_Y_PCT = 0.15;
+
+ private const int CROP_MIN_SIZE = 8;
+
+ private const float CROP_EXTERIOR_SATURATION = 0.00f;
+ private const int CROP_EXTERIOR_RED_SHIFT = -32;
+ private const int CROP_EXTERIOR_GREEN_SHIFT = -32;
+ private const int CROP_EXTERIOR_BLUE_SHIFT = -32;
+ private const int CROP_EXTERIOR_ALPHA_SHIFT = 0;
+
+ private const float ANY_ASPECT_RATIO = -1.0f;
+ private const float SCREEN_ASPECT_RATIO = -2.0f;
+ private const float ORIGINAL_ASPECT_RATIO = -3.0f;
+ private const float CUSTOM_ASPECT_RATIO = -4.0f;
+ private const float COMPUTE_FROM_BASIS = -5.0f;
+ private const float SEPARATOR = -6.0f;
+ private const float MIN_ASPECT_RATIO = 1.0f / 64.0f;
+ private const float MAX_ASPECT_RATIO = 64.0f;
+
+ private class ConstraintDescription {
+ public string name;
+ public int basis_width;
+ public int basis_height;
+ public bool is_pivotable;
+ public float aspect_ratio;
+
+ public ConstraintDescription(string new_name, int new_basis_width, int new_basis_height,
+ bool new_pivotable, float new_aspect_ratio = COMPUTE_FROM_BASIS) {
+ name = new_name;
+ basis_width = new_basis_width;
+ basis_height = new_basis_height;
+ if (new_aspect_ratio == COMPUTE_FROM_BASIS)
+ aspect_ratio = ((float) basis_width) / ((float) basis_height);
+ else
+ aspect_ratio = new_aspect_ratio;
+ is_pivotable = new_pivotable;
+ }
+
+ public bool is_separator() {
+ return !is_pivotable && aspect_ratio == SEPARATOR;
+ }
+ }
+
+ private enum ReticleOrientation {
+ LANDSCAPE,
+ PORTRAIT;
+
+ public ReticleOrientation toggle() {
+ return (this == ReticleOrientation.LANDSCAPE) ? ReticleOrientation.PORTRAIT :
+ ReticleOrientation.LANDSCAPE;
+ }
+ }
+
+ private enum ConstraintMode {
+ NORMAL,
+ CUSTOM
+ }
+
+ private class CropToolWindow : EditingToolWindow {
+ private const int CONTROL_SPACING = 8;
+
+ public Gtk.Button ok_button = new Gtk.Button.with_label(Resources.CROP_LABEL);
+ public Gtk.Button cancel_button = new Gtk.Button.from_stock(Gtk.Stock.CANCEL);
+ public Gtk.ComboBox constraint_combo;
+ public Gtk.Button pivot_reticle_button = new Gtk.Button();
+ public Gtk.Entry custom_width_entry = new Gtk.Entry();
+ public Gtk.Entry custom_height_entry = new Gtk.Entry();
+ public Gtk.Label custom_mulsign_label = new Gtk.Label.with_mnemonic("x");
+ public Gtk.Entry most_recently_edited = null;
+ public Gtk.Box response_layout = null;
+ public Gtk.Box layout = null;
+ public int normal_width = -1;
+ public int normal_height = -1;
+
+ public CropToolWindow(Gtk.Window container) {
+ base(container);
+
+ cancel_button.set_tooltip_text(_("Return to current photo dimensions"));
+ cancel_button.set_image_position(Gtk.PositionType.LEFT);
+
+ ok_button.set_tooltip_text(_("Set the crop for this photo"));
+ ok_button.set_image_position(Gtk.PositionType.LEFT);
+
+ constraint_combo = new Gtk.ComboBox();
+ Gtk.CellRendererText combo_text_renderer = new Gtk.CellRendererText();
+ constraint_combo.pack_start(combo_text_renderer, true);
+ constraint_combo.add_attribute(combo_text_renderer, "text", 0);
+ constraint_combo.set_row_separator_func(constraint_combo_separator_func);
+ constraint_combo.set_active(0);
+
+ pivot_reticle_button.set_image(new Gtk.Image.from_stock(Resources.CROP_PIVOT_RETICLE,
+ Gtk.IconSize.SMALL_TOOLBAR));
+ pivot_reticle_button.set_tooltip_text(_("Pivot the crop rectangle between portrait and landscape orientations"));
+
+ custom_width_entry.set_width_chars(4);
+ custom_width_entry.editable = true;
+ custom_height_entry.set_width_chars(4);
+ custom_height_entry.editable = true;
+
+ response_layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, CONTROL_SPACING);
+ response_layout.homogeneous = true;
+ response_layout.add(cancel_button);
+ response_layout.add(ok_button);
+
+ layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, CONTROL_SPACING);
+ layout.add(constraint_combo);
+ layout.add(pivot_reticle_button);
+ layout.add(response_layout);
+
+ add(layout);
+ }
+
+ private static bool constraint_combo_separator_func(Gtk.TreeModel model, Gtk.TreeIter iter) {
+ Value val;
+ model.get_value(iter, 0, out val);
+
+ return (val.dup_string() == "-");
+ }
+ }
+
+ private CropToolWindow crop_tool_window = null;
+ private Gdk.CursorType current_cursor_type = Gdk.CursorType.LEFT_PTR;
+ private BoxLocation in_manipulation = BoxLocation.OUTSIDE;
+ private Cairo.Context wide_black_ctx = null;
+ private Cairo.Context wide_white_ctx = null;
+ private Cairo.Context thin_white_ctx = null;
+ private Cairo.Context text_ctx = null;
+
+ // This is where we draw our crop tool
+ private Cairo.Surface crop_surface = null;
+
+ // these are kept in absolute coordinates, not relative to photo's position on canvas
+ private Box scaled_crop;
+ private int last_grab_x = -1;
+ private int last_grab_y = -1;
+
+ private ConstraintDescription[] constraints = create_constraints();
+ private Gtk.ListStore constraint_list = create_constraint_list(create_constraints());
+ private ReticleOrientation reticle_orientation = ReticleOrientation.LANDSCAPE;
+ private ConstraintMode constraint_mode = ConstraintMode.NORMAL;
+ private bool entry_insert_in_progress = false;
+ private float custom_aspect_ratio = 1.0f;
+ private int custom_width = -1;
+ private int custom_height = -1;
+ private int custom_init_width = -1;
+ private int custom_init_height = -1;
+ private float pre_aspect_ratio = ANY_ASPECT_RATIO;
+
+ private CropTool() {
+ base("CropTool");
+ }
+
+ public static CropTool factory() {
+ return new CropTool();
+ }
+
+ public static bool is_available(Photo photo, Scaling scaling) {
+ Dimensions dim = scaling.get_scaled_dimensions(photo.get_original_dimensions());
+
+ return dim.width > CROP_MIN_SIZE && dim.height > CROP_MIN_SIZE;
+ }
+
+ private static ConstraintDescription[] create_constraints() {
+ ConstraintDescription[] result = new ConstraintDescription[0];
+
+ result += new ConstraintDescription(_("Unconstrained"), 0, 0, false, ANY_ASPECT_RATIO);
+ result += new ConstraintDescription(_("Square"), 1, 1, false);
+ result += new ConstraintDescription(_("Screen"), 0, 0, true, SCREEN_ASPECT_RATIO);
+ result += new ConstraintDescription(_("Original Size"), 0, 0, true, ORIGINAL_ASPECT_RATIO);
+ result += new ConstraintDescription(_("-"), 0, 0, false, SEPARATOR);
+ result += new ConstraintDescription(_("SD Video (4 : 3)"), 4, 3, true);
+ result += new ConstraintDescription(_("HD Video (16 : 9)"), 16, 9, true);
+ result += new ConstraintDescription(_("-"), 0, 0, false, SEPARATOR);
+ result += new ConstraintDescription(_("Wallet (2 x 3 in.)"), 3, 2, true);
+ result += new ConstraintDescription(_("Notecard (3 x 5 in.)"), 5, 3, true);
+ result += new ConstraintDescription(_("4 x 6 in."), 6, 4, true);
+ result += new ConstraintDescription(_("5 x 7 in."), 7, 5, true);
+ result += new ConstraintDescription(_("8 x 10 in."), 10, 8, true);
+ result += new ConstraintDescription(_("Letter (8.5 x 11 in.)"), 85, 110, true);
+ result += new ConstraintDescription(_("11 x 14 in."), 14, 11, true);
+ result += new ConstraintDescription(_("Tabloid (11 x 17 in.)"), 17, 11, true);
+ result += new ConstraintDescription(_("16 x 20 in."), 20, 16, true);
+ result += new ConstraintDescription(_("-"), 0, 0, false, SEPARATOR);
+ result += new ConstraintDescription(_("Metric Wallet (9 x 13 cm)"), 13, 9, true);
+ result += new ConstraintDescription(_("Postcard (10 x 15 cm)"), 15, 10, true);
+ result += new ConstraintDescription(_("13 x 18 cm"), 18, 13, true);
+ result += new ConstraintDescription(_("18 x 24 cm"), 24, 18, true);
+ result += new ConstraintDescription(_("A4 (210 x 297 mm)"), 210, 297, true);
+ result += new ConstraintDescription(_("20 x 30 cm"), 30, 20, true);
+ result += new ConstraintDescription(_("24 x 40 cm"), 40, 24, true);
+ result += new ConstraintDescription(_("30 x 40 cm"), 40, 30, true);
+ result += new ConstraintDescription(_("A3 (297 x 420 mm)"), 420, 297, true);
+ result += new ConstraintDescription(_("-"), 0, 0, false, SEPARATOR);
+ result += new ConstraintDescription(_("Custom"), 0, 0, true, CUSTOM_ASPECT_RATIO);
+
+ return result;
+ }
+
+ private static Gtk.ListStore create_constraint_list(ConstraintDescription[] constraint_data) {
+ Gtk.ListStore result = new Gtk.ListStore(1, typeof(string), typeof(string));
+
+ Gtk.TreeIter iter;
+ foreach (ConstraintDescription constraint in constraint_data) {
+ result.append(out iter);
+ result.set_value(iter, 0, constraint.name);
+ }
+
+ return result;
+ }
+
+ private void update_pivot_button_state() {
+ crop_tool_window.pivot_reticle_button.set_sensitive(
+ get_selected_constraint().is_pivotable);
+ }
+
+ private ConstraintDescription get_selected_constraint() {
+ ConstraintDescription result = constraints[crop_tool_window.constraint_combo.get_active()];
+
+ if (result.aspect_ratio == ORIGINAL_ASPECT_RATIO) {
+ result.basis_width = canvas.get_scaled_pixbuf_position().width;
+ result.basis_height = canvas.get_scaled_pixbuf_position().height;
+ } else if (result.aspect_ratio == SCREEN_ASPECT_RATIO) {
+ Gdk.Screen screen = Gdk.Screen.get_default();
+ result.basis_width = screen.get_width();
+ result.basis_height = screen.get_height();
+ }
+
+ return result;
+ }
+
+ private bool on_width_entry_focus_out(Gdk.EventFocus event) {
+ crop_tool_window.most_recently_edited = crop_tool_window.custom_width_entry;
+ return on_custom_entry_focus_out(event);
+ }
+
+ private bool on_height_entry_focus_out(Gdk.EventFocus event) {
+ crop_tool_window.most_recently_edited = crop_tool_window.custom_height_entry;
+ return on_custom_entry_focus_out(event);
+ }
+
+ private bool on_custom_entry_focus_out(Gdk.EventFocus event) {
+ int width = int.parse(crop_tool_window.custom_width_entry.text);
+ int height = int.parse(crop_tool_window.custom_height_entry.text);
+
+ if(width < 1) {
+ width = 1;
+ crop_tool_window.custom_width_entry.set_text("%d".printf(width));
+ }
+
+ if(height < 1) {
+ height = 1;
+ crop_tool_window.custom_height_entry.set_text("%d".printf(height));
+ }
+
+ if ((width == custom_width) && (height == custom_height))
+ return false;
+
+ custom_aspect_ratio = ((float) width) / ((float) height);
+
+ if (custom_aspect_ratio < MIN_ASPECT_RATIO) {
+ if (crop_tool_window.most_recently_edited == crop_tool_window.custom_height_entry) {
+ height = (int) (width / MIN_ASPECT_RATIO);
+ crop_tool_window.custom_height_entry.set_text("%d".printf(height));
+ } else {
+ width = (int) (height * MIN_ASPECT_RATIO);
+ crop_tool_window.custom_width_entry.set_text("%d".printf(width));
+ }
+ } else if (custom_aspect_ratio > MAX_ASPECT_RATIO) {
+ if (crop_tool_window.most_recently_edited == crop_tool_window.custom_height_entry) {
+ height = (int) (width / MAX_ASPECT_RATIO);
+ crop_tool_window.custom_height_entry.set_text("%d".printf(height));
+ } else {
+ width = (int) (height * MAX_ASPECT_RATIO);
+ crop_tool_window.custom_width_entry.set_text("%d".printf(width));
+ }
+ }
+
+ custom_aspect_ratio = ((float) width) / ((float) height);
+
+ Box new_crop = constrain_crop(scaled_crop);
+
+ crop_resized(new_crop);
+ scaled_crop = new_crop;
+ canvas.invalidate_area(new_crop);
+ canvas.repaint();
+
+ custom_width = width;
+ custom_height = height;
+
+ return false;
+ }
+
+ private void on_width_insert_text(string text, int length, ref int position) {
+ on_entry_insert_text(crop_tool_window.custom_width_entry, text, length, ref position);
+ }
+
+ private void on_height_insert_text(string text, int length, ref int position) {
+ on_entry_insert_text(crop_tool_window.custom_height_entry, text, length, ref position);
+ }
+
+ private void on_entry_insert_text(Gtk.Entry sender, string text, int length, ref int position) {
+ if (entry_insert_in_progress)
+ return;
+
+ entry_insert_in_progress = true;
+
+ if (length == -1)
+ length = (int) text.length;
+
+ // only permit numeric text
+ string new_text = "";
+ for (int ctr = 0; ctr < length; ctr++) {
+ if (text[ctr].isdigit()) {
+ new_text += ((char) text[ctr]).to_string();
+ }
+ }
+
+ if (new_text.length > 0)
+ sender.insert_text(new_text, (int) new_text.length, ref position);
+
+ Signal.stop_emission_by_name(sender, "insert-text");
+
+ entry_insert_in_progress = false;
+ }
+
+ private float get_constraint_aspect_ratio() {
+ float result = get_selected_constraint().aspect_ratio;
+
+ if (result == ORIGINAL_ASPECT_RATIO) {
+ result = ((float) canvas.get_scaled_pixbuf_position().width) /
+ ((float) canvas.get_scaled_pixbuf_position().height);
+ } else if (result == SCREEN_ASPECT_RATIO) {
+ Gdk.Screen screen = Gdk.Screen.get_default();
+ result = ((float) screen.get_width()) / ((float) screen.get_height());
+ } else if (result == CUSTOM_ASPECT_RATIO) {
+ result = custom_aspect_ratio;
+ }
+ if (reticle_orientation == ReticleOrientation.PORTRAIT)
+ result = 1.0f / result;
+
+ return result;
+ }
+
+ private void constraint_changed() {
+ ConstraintDescription selected_constraint = get_selected_constraint();
+ if (selected_constraint.aspect_ratio == CUSTOM_ASPECT_RATIO) {
+ set_custom_constraint_mode();
+ } else {
+ set_normal_constraint_mode();
+
+ if (selected_constraint.aspect_ratio != ANY_ASPECT_RATIO) {
+ // user may have switched away from 'Custom' without
+ // accepting, so set these to default back to saved
+ // values.
+ custom_init_width = Config.Facade.get_instance().get_last_crop_width();
+ custom_init_height = Config.Facade.get_instance().get_last_crop_height();
+ custom_aspect_ratio = ((float) custom_init_width) / ((float) custom_init_height);
+ }
+ }
+
+ update_pivot_button_state();
+
+ if (!get_selected_constraint().is_pivotable)
+ reticle_orientation = ReticleOrientation.LANDSCAPE;
+
+ if (get_constraint_aspect_ratio() != pre_aspect_ratio) {
+ Box new_crop = constrain_crop(scaled_crop);
+
+ crop_resized(new_crop);
+ scaled_crop = new_crop;
+ canvas.invalidate_area(new_crop);
+ canvas.repaint();
+
+ pre_aspect_ratio = get_constraint_aspect_ratio();
+ }
+ }
+
+ private void set_custom_constraint_mode() {
+ if (constraint_mode == ConstraintMode.CUSTOM)
+ return;
+
+ if ((crop_tool_window.normal_width == -1) || (crop_tool_window.normal_height == -1))
+ crop_tool_window.get_size(out crop_tool_window.normal_width,
+ out crop_tool_window.normal_height);
+
+ int window_x_pos = 0;
+ int window_y_pos = 0;
+ crop_tool_window.get_position(out window_x_pos, out window_y_pos);
+
+ crop_tool_window.hide();
+
+ crop_tool_window.layout.remove(crop_tool_window.constraint_combo);
+ crop_tool_window.layout.remove(crop_tool_window.pivot_reticle_button);
+ crop_tool_window.layout.remove(crop_tool_window.response_layout);
+
+ crop_tool_window.layout.add(crop_tool_window.constraint_combo);
+ crop_tool_window.layout.add(crop_tool_window.custom_width_entry);
+ crop_tool_window.layout.add(crop_tool_window.custom_mulsign_label);
+ crop_tool_window.layout.add(crop_tool_window.custom_height_entry);
+ crop_tool_window.layout.add(crop_tool_window.pivot_reticle_button);
+ crop_tool_window.layout.add(crop_tool_window.response_layout);
+
+ if (reticle_orientation == ReticleOrientation.LANDSCAPE) {
+ crop_tool_window.custom_width_entry.set_text("%d".printf(custom_init_width));
+ crop_tool_window.custom_height_entry.set_text("%d".printf(custom_init_height));
+ } else {
+ crop_tool_window.custom_width_entry.set_text("%d".printf(custom_init_height));
+ crop_tool_window.custom_height_entry.set_text("%d".printf(custom_init_width));
+ }
+ custom_aspect_ratio = ((float) custom_init_width) / ((float) custom_init_height);
+
+ crop_tool_window.move(window_x_pos, window_y_pos);
+ crop_tool_window.show_all();
+
+ constraint_mode = ConstraintMode.CUSTOM;
+ }
+
+ private void set_normal_constraint_mode() {
+ if (constraint_mode == ConstraintMode.NORMAL)
+ return;
+
+ int window_x_pos = 0;
+ int window_y_pos = 0;
+ crop_tool_window.get_position(out window_x_pos, out window_y_pos);
+
+ crop_tool_window.hide();
+
+ crop_tool_window.layout.remove(crop_tool_window.constraint_combo);
+ crop_tool_window.layout.remove(crop_tool_window.custom_width_entry);
+ crop_tool_window.layout.remove(crop_tool_window.custom_mulsign_label);
+ crop_tool_window.layout.remove(crop_tool_window.custom_height_entry);
+ crop_tool_window.layout.remove(crop_tool_window.pivot_reticle_button);
+ crop_tool_window.layout.remove(crop_tool_window.response_layout);
+
+ crop_tool_window.layout.add(crop_tool_window.constraint_combo);
+ crop_tool_window.layout.add(crop_tool_window.pivot_reticle_button);
+ crop_tool_window.layout.add(crop_tool_window.response_layout);
+
+ crop_tool_window.resize(crop_tool_window.normal_width,
+ crop_tool_window.normal_height);
+
+ crop_tool_window.move(window_x_pos, window_y_pos);
+ crop_tool_window.show_all();
+
+ constraint_mode = ConstraintMode.NORMAL;
+ }
+
+ private Box constrain_crop(Box crop) {
+ float user_aspect_ratio = get_constraint_aspect_ratio();
+ if (user_aspect_ratio == ANY_ASPECT_RATIO)
+ return crop;
+
+ // PHASE 1: Scale to the desired aspect ratio, preserving area and center.
+ float old_area = (float) (crop.get_width() * crop.get_height());
+ crop.adjust_height((int) Math.sqrt(old_area / user_aspect_ratio));
+ crop.adjust_width((int) Math.sqrt(old_area * user_aspect_ratio));
+
+ // PHASE 2: Crop to the image boundary.
+ Dimensions image_size = get_photo_dimensions();
+ double angle;
+ canvas.get_photo().get_straighten(out angle);
+ crop = clamp_inside_rotated_image(crop, image_size.width, image_size.height, angle, false);
+
+ // PHASE 3: Crop down to the aspect ratio if necessary.
+ if (crop.get_width() >= crop.get_height() * user_aspect_ratio) // possibly too wide
+ crop.adjust_width((int) (crop.get_height() * user_aspect_ratio));
+ else // possibly too tall
+ crop.adjust_height((int) (crop.get_width() / user_aspect_ratio));
+
+ return crop;
+ }
+
+ private ConstraintDescription? get_last_constraint(out int index) {
+ index = Config.Facade.get_instance().get_last_crop_menu_choice();
+
+ return (index < constraints.length) ? constraints[index] : null;
+ }
+
+ public override void activate(PhotoCanvas canvas) {
+ bind_canvas_handlers(canvas);
+
+ prepare_ctx(canvas.get_default_ctx(), canvas.get_surface_dim());
+
+ if (crop_surface != null)
+ crop_surface = null;
+
+ crop_surface = new Cairo.ImageSurface(Cairo.Format.ARGB32,
+ canvas.get_scaled_pixbuf_position().width,
+ canvas.get_scaled_pixbuf_position().height);
+
+ Cairo.Context ctx = new Cairo.Context(crop_surface);
+ ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ ctx.paint();
+
+ // create the crop tool window, where the user can apply or cancel the crop
+ crop_tool_window = new CropToolWindow(canvas.get_container());
+
+ // set up the constraint combo box
+ crop_tool_window.constraint_combo.set_model(constraint_list);
+ if(!canvas.get_photo().has_crop()) {
+ int index;
+ ConstraintDescription? desc = get_last_constraint(out index);
+ if (desc != null && !desc.is_separator())
+ crop_tool_window.constraint_combo.set_active(index);
+ }
+
+ // set up the pivot reticle button
+ update_pivot_button_state();
+ reticle_orientation = ReticleOrientation.LANDSCAPE;
+
+ bind_window_handlers();
+
+ // obtain crop dimensions and paint against the uncropped photo
+ Dimensions uncropped_dim = canvas.get_photo().get_dimensions(Photo.Exception.CROP);
+
+ Box crop;
+ if (!canvas.get_photo().get_crop(out crop)) {
+ int xofs = (int) (uncropped_dim.width * CROP_INIT_X_PCT);
+ int yofs = (int) (uncropped_dim.height * CROP_INIT_Y_PCT);
+
+ // initialize the actual crop in absolute coordinates, not relative
+ // to the photo's position on the canvas
+ crop = Box(xofs, yofs, uncropped_dim.width - xofs, uncropped_dim.height - yofs);
+ }
+
+ // scale the crop to the scaled photo's size ... the scaled crop is maintained in
+ // coordinates not relative to photo's position on canvas
+ scaled_crop = crop.get_scaled_similar(uncropped_dim,
+ Dimensions.for_rectangle(canvas.get_scaled_pixbuf_position()));
+
+ // get the custom width and height from the saved config and
+ // set up the initial custom values with it.
+ custom_width = Config.Facade.get_instance().get_last_crop_width();
+ custom_height = Config.Facade.get_instance().get_last_crop_height();
+ custom_init_width = custom_width;
+ custom_init_height = custom_height;
+ pre_aspect_ratio = ((float) custom_init_width) / ((float) custom_init_height);
+
+ constraint_mode = ConstraintMode.NORMAL;
+
+ base.activate(canvas);
+
+ // make sure the window has its regular size before going into
+ // custom mode, which will resize it and needs to save the old
+ // size first.
+ crop_tool_window.show_all();
+ crop_tool_window.hide();
+
+ // was 'custom' the most-recently-chosen menu item?
+ if(!canvas.get_photo().has_crop()) {
+ ConstraintDescription? desc = get_last_constraint(null);
+ if (desc != null && !desc.is_separator() && desc.aspect_ratio == CUSTOM_ASPECT_RATIO)
+ set_custom_constraint_mode();
+ }
+
+ // since we no longer just run with the default, but rather
+ // a saved value, we'll behave as if the saved constraint has
+ // just been changed to so that everything gets updated and
+ // the canvas stays in sync.
+ Box new_crop = constrain_crop(scaled_crop);
+
+ crop_resized(new_crop);
+ scaled_crop = new_crop;
+ canvas.invalidate_area(new_crop);
+ canvas.repaint();
+
+ pre_aspect_ratio = get_constraint_aspect_ratio();
+ }
+
+ private void bind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.new_surface.connect(prepare_ctx);
+ canvas.resized_scaled_pixbuf.connect(on_resized_pixbuf);
+ }
+
+ private void unbind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.new_surface.disconnect(prepare_ctx);
+ canvas.resized_scaled_pixbuf.disconnect(on_resized_pixbuf);
+ }
+
+ private void bind_window_handlers() {
+ crop_tool_window.key_press_event.connect(on_keypress);
+ crop_tool_window.ok_button.clicked.connect(on_crop_ok);
+ crop_tool_window.cancel_button.clicked.connect(notify_cancel);
+ crop_tool_window.constraint_combo.changed.connect(constraint_changed);
+ crop_tool_window.pivot_reticle_button.clicked.connect(on_pivot_button_clicked);
+
+ // set up the custom width and height entry boxes
+ crop_tool_window.custom_width_entry.focus_out_event.connect(on_width_entry_focus_out);
+ crop_tool_window.custom_height_entry.focus_out_event.connect(on_height_entry_focus_out);
+ crop_tool_window.custom_width_entry.insert_text.connect(on_width_insert_text);
+ crop_tool_window.custom_height_entry.insert_text.connect(on_height_insert_text);
+ }
+
+ private void unbind_window_handlers() {
+ crop_tool_window.key_press_event.disconnect(on_keypress);
+ crop_tool_window.ok_button.clicked.disconnect(on_crop_ok);
+ crop_tool_window.cancel_button.clicked.disconnect(notify_cancel);
+ crop_tool_window.constraint_combo.changed.disconnect(constraint_changed);
+ crop_tool_window.pivot_reticle_button.clicked.disconnect(on_pivot_button_clicked);
+
+ // set up the custom width and height entry boxes
+ crop_tool_window.custom_width_entry.focus_out_event.disconnect(on_width_entry_focus_out);
+ crop_tool_window.custom_height_entry.focus_out_event.disconnect(on_height_entry_focus_out);
+ crop_tool_window.custom_width_entry.insert_text.disconnect(on_width_insert_text);
+ }
+
+ public override bool on_keypress(Gdk.EventKey event) {
+ if ((Gdk.keyval_name(event.keyval) == "KP_Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Return")) {
+ on_crop_ok();
+ return true;
+ }
+
+ return base.on_keypress(event);
+ }
+
+ private void on_pivot_button_clicked() {
+ if (get_selected_constraint().aspect_ratio == CUSTOM_ASPECT_RATIO) {
+ string width_text = crop_tool_window.custom_width_entry.get_text();
+ string height_text = crop_tool_window.custom_height_entry.get_text();
+ crop_tool_window.custom_width_entry.set_text(height_text);
+ crop_tool_window.custom_height_entry.set_text(width_text);
+
+ int temp = custom_width;
+ custom_width = custom_height;
+ custom_height = temp;
+ }
+ reticle_orientation = reticle_orientation.toggle();
+ constraint_changed();
+ }
+
+ public override void deactivate() {
+ if (canvas != null)
+ unbind_canvas_handlers(canvas);
+
+ if (crop_tool_window != null) {
+ unbind_window_handlers();
+ crop_tool_window.hide();
+ crop_tool_window.destroy();
+ crop_tool_window = null;
+ }
+
+ // make sure the cursor isn't set to a modify indicator
+ if (canvas != null)
+ canvas.get_drawing_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.LEFT_PTR));
+
+ crop_surface = null;
+
+ base.deactivate();
+ }
+
+ public override EditingToolWindow? get_tool_window() {
+ return crop_tool_window;
+ }
+
+ public override Gdk.Pixbuf? get_display_pixbuf(Scaling scaling, Photo photo,
+ out Dimensions max_dim) throws Error {
+ max_dim = photo.get_dimensions(Photo.Exception.CROP);
+
+ return photo.get_pixbuf_with_options(scaling, Photo.Exception.CROP);
+ }
+
+ private void prepare_ctx(Cairo.Context ctx, Dimensions dim) {
+ wide_black_ctx = new Cairo.Context(ctx.get_target());
+ set_source_color_from_string(wide_black_ctx, "#000");
+ wide_black_ctx.set_line_width(1);
+
+ wide_white_ctx = new Cairo.Context(ctx.get_target());
+ set_source_color_from_string(wide_white_ctx, "#FFF");
+ wide_white_ctx.set_line_width(1);
+
+ thin_white_ctx = new Cairo.Context(ctx.get_target());
+ set_source_color_from_string(thin_white_ctx, "#FFF");
+ thin_white_ctx.set_line_width(0.5);
+
+ text_ctx = new Cairo.Context(ctx.get_target());
+ text_ctx.select_font_face("Sans", Cairo.FontSlant.NORMAL, Cairo.FontWeight.NORMAL);
+ }
+
+ private void on_resized_pixbuf(Dimensions old_dim, Gdk.Pixbuf scaled, Gdk.Rectangle scaled_position) {
+ Dimensions new_dim = Dimensions.for_pixbuf(scaled);
+ Dimensions uncropped_dim = canvas.get_photo().get_dimensions(Photo.Exception.CROP);
+
+ // rescale to full crop
+ Box crop = scaled_crop.get_scaled_similar(old_dim, uncropped_dim);
+
+ // rescale back to new size
+ scaled_crop = crop.get_scaled_similar(uncropped_dim, new_dim);
+ if (crop_surface != null)
+ crop_surface = null;
+
+ crop_surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, scaled.width, scaled.height);
+ Cairo.Context ctx = new Cairo.Context(crop_surface);
+ ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ ctx.paint();
+
+ }
+
+ public override void on_left_click(int x, int y) {
+ Gdk.Rectangle scaled_pixbuf_pos = canvas.get_scaled_pixbuf_position();
+
+ // scaled_crop is not maintained relative to photo's position on canvas
+ Box offset_scaled_crop = scaled_crop.get_offset(scaled_pixbuf_pos.x, scaled_pixbuf_pos.y);
+
+ // determine where the mouse down landed and store for future events
+ in_manipulation = offset_scaled_crop.approx_location(x, y);
+ last_grab_x = x -= scaled_pixbuf_pos.x;
+ last_grab_y = y -= scaled_pixbuf_pos.y;
+
+ // repaint because the crop changes on a mouse down
+ canvas.repaint();
+ }
+
+ public override void on_left_released(int x, int y) {
+ // nothing to do if released outside of the crop box
+ if (in_manipulation == BoxLocation.OUTSIDE)
+ return;
+
+ // end manipulation
+ in_manipulation = BoxLocation.OUTSIDE;
+ last_grab_x = -1;
+ last_grab_y = -1;
+
+ update_cursor(x, y);
+
+ // repaint because crop changes when released
+ canvas.repaint();
+ }
+
+ public override void on_motion(int x, int y, Gdk.ModifierType mask) {
+ // only deal with manipulating the crop tool when click-and-dragging one of the edges
+ // or the interior
+ if (in_manipulation != BoxLocation.OUTSIDE)
+ on_canvas_manipulation(x, y);
+
+ update_cursor(x, y);
+ canvas.repaint();
+ }
+
+ public override void paint(Cairo.Context default_ctx) {
+ // fill region behind the crop surface with neutral color
+ int w = canvas.get_drawing_window().get_width();
+ int h = canvas.get_drawing_window().get_height();
+
+ default_ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ default_ctx.rectangle(0, 0, w, h);
+ default_ctx.fill();
+ default_ctx.paint();
+
+ Cairo.Context ctx = new Cairo.Context(crop_surface);
+ ctx.set_operator(Cairo.Operator.SOURCE);
+ ctx.set_source_rgba(0.0, 0.0, 0.0, 0.5);
+ ctx.paint();
+
+ // paint exposed (cropped) part of pixbuf minus crop border
+ ctx.set_source_rgba(0.0, 0.0, 0.0, 0.0);
+ ctx.rectangle(scaled_crop.left, scaled_crop.top, scaled_crop.get_width(),
+ scaled_crop.get_height());
+ ctx.fill();
+ canvas.paint_surface(crop_surface, true);
+
+ // paint crop tool last
+ paint_crop_tool(scaled_crop);
+ }
+
+ private void on_crop_ok() {
+ // user's clicked OK, save the combobox choice and width/height.
+ // safe to do, even if not in 'custom' mode - the previous values
+ // will just get saved again.
+ Config.Facade.get_instance().set_last_crop_menu_choice(
+ crop_tool_window.constraint_combo.get_active());
+ Config.Facade.get_instance().set_last_crop_width(custom_width);
+ Config.Facade.get_instance().set_last_crop_height(custom_height);
+
+ // scale screen-coordinate crop to photo's coordinate system
+ Box crop = scaled_crop.get_scaled_similar(
+ Dimensions.for_rectangle(canvas.get_scaled_pixbuf_position()),
+ canvas.get_photo().get_dimensions(Photo.Exception.CROP));
+
+ // crop the current pixbuf and offer it to the editing host
+ Gdk.Pixbuf cropped = new Gdk.Pixbuf.subpixbuf(canvas.get_scaled_pixbuf(), scaled_crop.left,
+ scaled_crop.top, scaled_crop.get_width(), scaled_crop.get_height());
+
+ // signal host; we have a cropped image, but it will be scaled upward, and so a better one
+ // should be fetched
+ applied(new CropCommand(canvas.get_photo(), crop, Resources.CROP_LABEL,
+ Resources.CROP_TOOLTIP), cropped, crop.get_dimensions(), true);
+ }
+
+ private void update_cursor(int x, int y) {
+ // scaled_crop is not maintained relative to photo's position on canvas
+ Gdk.Rectangle scaled_pos = canvas.get_scaled_pixbuf_position();
+ Box offset_scaled_crop = scaled_crop.get_offset(scaled_pos.x, scaled_pos.y);
+
+ Gdk.CursorType cursor_type = Gdk.CursorType.LEFT_PTR;
+ switch (offset_scaled_crop.approx_location(x, y)) {
+ case BoxLocation.LEFT_SIDE:
+ cursor_type = Gdk.CursorType.LEFT_SIDE;
+ break;
+
+ case BoxLocation.TOP_SIDE:
+ cursor_type = Gdk.CursorType.TOP_SIDE;
+ break;
+
+ case BoxLocation.RIGHT_SIDE:
+ cursor_type = Gdk.CursorType.RIGHT_SIDE;
+ break;
+
+ case BoxLocation.BOTTOM_SIDE:
+ cursor_type = Gdk.CursorType.BOTTOM_SIDE;
+ break;
+
+ case BoxLocation.TOP_LEFT:
+ cursor_type = Gdk.CursorType.TOP_LEFT_CORNER;
+ break;
+
+ case BoxLocation.BOTTOM_LEFT:
+ cursor_type = Gdk.CursorType.BOTTOM_LEFT_CORNER;
+ break;
+
+ case BoxLocation.TOP_RIGHT:
+ cursor_type = Gdk.CursorType.TOP_RIGHT_CORNER;
+ break;
+
+ case BoxLocation.BOTTOM_RIGHT:
+ cursor_type = Gdk.CursorType.BOTTOM_RIGHT_CORNER;
+ break;
+
+ case BoxLocation.INSIDE:
+ cursor_type = Gdk.CursorType.FLEUR;
+ break;
+
+ default:
+ // use Gdk.CursorType.LEFT_PTR
+ break;
+ }
+
+ if (cursor_type != current_cursor_type) {
+ Gdk.Cursor cursor = new Gdk.Cursor(cursor_type);
+ canvas.get_drawing_window().set_cursor(cursor);
+ current_cursor_type = cursor_type;
+ }
+ }
+
+ private int eval_radial_line(double center_x, double center_y, double bounds_x,
+ double bounds_y, double user_x) {
+ double decision_slope = (bounds_y - center_y) / (bounds_x - center_x);
+ double decision_intercept = bounds_y - (decision_slope * bounds_x);
+
+ return (int) (decision_slope * user_x + decision_intercept);
+ }
+
+ // Return the dimensions of the uncropped source photo scaled to canvas coordinates.
+ private Dimensions get_photo_dimensions() {
+ Dimensions photo_dims = canvas.get_photo().get_dimensions(Photo.Exception.CROP);
+ Dimensions surface_dims = canvas.get_surface_dim();
+ double scale_factor = double.min((double) surface_dims.width / photo_dims.width,
+ (double) surface_dims.height / photo_dims.height);
+ scale_factor = double.min(scale_factor, 1.0);
+
+ photo_dims = canvas.get_photo().get_dimensions(
+ Photo.Exception.CROP | Photo.Exception.STRAIGHTEN);
+
+ return { (int) (photo_dims.width * scale_factor),
+ (int) (photo_dims.height * scale_factor) };
+ }
+
+ private bool on_canvas_manipulation(int x, int y) {
+ Gdk.Rectangle scaled_pos = canvas.get_scaled_pixbuf_position();
+
+ // scaled_crop is maintained in coordinates non-relative to photo's position on canvas ...
+ // but bound tool to photo itself
+ x -= scaled_pos.x;
+ if (x < 0)
+ x = 0;
+ else if (x >= scaled_pos.width)
+ x = scaled_pos.width - 1;
+
+ y -= scaled_pos.y;
+ if (y < 0)
+ y = 0;
+ else if (y >= scaled_pos.height)
+ y = scaled_pos.height - 1;
+
+ // need to make manipulations outside of box structure, because its methods do sanity
+ // checking
+ int left = scaled_crop.left;
+ int top = scaled_crop.top;
+ int right = scaled_crop.right;
+ int bottom = scaled_crop.bottom;
+
+ // get extra geometric information needed to enforce constraints
+ int center_x = (left + right) / 2;
+ int center_y = (top + bottom) / 2;
+
+ switch (in_manipulation) {
+ case BoxLocation.LEFT_SIDE:
+ left = x;
+ if (get_constraint_aspect_ratio() != ANY_ASPECT_RATIO) {
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ bottom = top + ((int) new_height);
+ }
+ break;
+
+ case BoxLocation.TOP_SIDE:
+ top = y;
+ if (get_constraint_aspect_ratio() != ANY_ASPECT_RATIO) {
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ right = left + ((int) new_width);
+ }
+ break;
+
+ case BoxLocation.RIGHT_SIDE:
+ right = x;
+ if (get_constraint_aspect_ratio() != ANY_ASPECT_RATIO) {
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ bottom = top + ((int) new_height);
+ }
+ break;
+
+ case BoxLocation.BOTTOM_SIDE:
+ bottom = y;
+ if (get_constraint_aspect_ratio() != ANY_ASPECT_RATIO) {
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ right = left + ((int) new_width);
+ }
+ break;
+
+ case BoxLocation.TOP_LEFT:
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ top = y;
+ left = x;
+ } else {
+ if (y < eval_radial_line(center_x, center_y, left, top, x)) {
+ top = y;
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ left = right - ((int) new_width);
+ } else {
+ left = x;
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ top = bottom - ((int) new_height);
+ }
+ }
+ break;
+
+ case BoxLocation.BOTTOM_LEFT:
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ bottom = y;
+ left = x;
+ } else {
+ if (y < eval_radial_line(center_x, center_y, left, bottom, x)) {
+ left = x;
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ bottom = top + ((int) new_height);
+ } else {
+ bottom = y;
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ left = right - ((int) new_width);
+ }
+ }
+ break;
+
+ case BoxLocation.TOP_RIGHT:
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ top = y;
+ right = x;
+ } else {
+ if (y < eval_radial_line(center_x, center_y, right, top, x)) {
+ top = y;
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ right = left + ((int) new_width);
+ } else {
+ right = x;
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ top = bottom - ((int) new_height);
+ }
+ }
+ break;
+
+ case BoxLocation.BOTTOM_RIGHT:
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ bottom = y;
+ right = x;
+ } else {
+ if (y < eval_radial_line(center_x, center_y, right, bottom, x)) {
+ right = x;
+ float new_height = ((float) (right - left)) / get_constraint_aspect_ratio();
+ bottom = top + ((int) new_height);
+ } else {
+ bottom = y;
+ float new_width = ((float) (bottom - top)) * get_constraint_aspect_ratio();
+ right = left + ((int) new_width);
+ }
+ }
+ break;
+
+ case BoxLocation.INSIDE:
+ assert(last_grab_x >= 0);
+ assert(last_grab_y >= 0);
+
+ int delta_x = (x - last_grab_x);
+ int delta_y = (y - last_grab_y);
+
+ last_grab_x = x;
+ last_grab_y = y;
+
+ int width = right - left + 1;
+ int height = bottom - top + 1;
+
+ left += delta_x;
+ top += delta_y;
+ right += delta_x;
+ bottom += delta_y;
+
+ // bound crop inside of photo
+ if (left < 0)
+ left = 0;
+
+ if (top < 0)
+ top = 0;
+
+ if (right >= scaled_pos.width)
+ right = scaled_pos.width - 1;
+
+ if (bottom >= scaled_pos.height)
+ bottom = scaled_pos.height - 1;
+
+ int adj_width = right - left + 1;
+ int adj_height = bottom - top + 1;
+
+ // don't let adjustments affect the size of the crop
+ if (adj_width != width) {
+ if (delta_x < 0)
+ right = left + width - 1;
+ else
+ left = right - width + 1;
+ }
+
+ if (adj_height != height) {
+ if (delta_y < 0)
+ bottom = top + height - 1;
+ else
+ top = bottom - height + 1;
+ }
+ break;
+
+ default:
+ // do nothing, not even a repaint
+ return false;
+ }
+
+ // Check if the mouse has gone out of bounds, and if it has, make sure that the
+ // crop reticle's edges stay within the photo bounds. This bounds check works
+ // differently in constrained versus unconstrained mode. In unconstrained mode,
+ // we need only to bounds clamp the one or two edge(s) that are actually out-of-bounds.
+ // In constrained mode however, we need to bounds clamp the entire box, because the
+ // positions of edges are all interdependent (so as to enforce the aspect ratio
+ // constraint).
+ int width = right - left + 1;
+ int height = bottom - top + 1;
+
+ Dimensions photo_dims = get_photo_dimensions();
+ double angle;
+ canvas.get_photo().get_straighten(out angle);
+
+ Box new_crop;
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ width = right - left + 1;
+ height = bottom - top + 1;
+
+ switch (in_manipulation) {
+ case BoxLocation.LEFT_SIDE:
+ case BoxLocation.TOP_LEFT:
+ case BoxLocation.BOTTOM_LEFT:
+ if (width < CROP_MIN_SIZE)
+ left = right - CROP_MIN_SIZE;
+ break;
+
+ case BoxLocation.RIGHT_SIDE:
+ case BoxLocation.TOP_RIGHT:
+ case BoxLocation.BOTTOM_RIGHT:
+ if (width < CROP_MIN_SIZE)
+ right = left + CROP_MIN_SIZE;
+ break;
+
+ default:
+ break;
+ }
+
+ switch (in_manipulation) {
+ case BoxLocation.TOP_SIDE:
+ case BoxLocation.TOP_LEFT:
+ case BoxLocation.TOP_RIGHT:
+ if (height < CROP_MIN_SIZE)
+ top = bottom - CROP_MIN_SIZE;
+ break;
+
+ case BoxLocation.BOTTOM_SIDE:
+ case BoxLocation.BOTTOM_LEFT:
+ case BoxLocation.BOTTOM_RIGHT:
+ if (height < CROP_MIN_SIZE)
+ bottom = top + CROP_MIN_SIZE;
+ break;
+
+ default:
+ break;
+ }
+
+ // preliminary crop region has been chosen, now clamp it inside the
+ // image as needed.
+
+ new_crop = clamp_inside_rotated_image(
+ Box(left, top, right, bottom),
+ photo_dims.width, photo_dims.height, angle,
+ in_manipulation == BoxLocation.INSIDE);
+
+ } else {
+ // one of the constrained modes is active; revert instead of clamping so
+ // that aspect ratio stays intact
+
+ new_crop = Box(left, top, right, bottom);
+ Box adjusted = clamp_inside_rotated_image(new_crop,
+ photo_dims.width, photo_dims.height, angle,
+ in_manipulation == BoxLocation.INSIDE);
+
+ if (adjusted != new_crop || width < CROP_MIN_SIZE || height < CROP_MIN_SIZE) {
+ new_crop = scaled_crop; // revert crop move
+ }
+ }
+
+ if (in_manipulation != BoxLocation.INSIDE)
+ crop_resized(new_crop);
+ else
+ crop_moved(new_crop);
+
+ // load new values
+ scaled_crop = new_crop;
+
+ if (get_constraint_aspect_ratio() == ANY_ASPECT_RATIO) {
+ custom_init_width = scaled_crop.get_width();
+ custom_init_height = scaled_crop.get_height();
+ custom_aspect_ratio = ((float) custom_init_width) / ((float) custom_init_height);
+ }
+
+ return false;
+ }
+
+ private void crop_resized(Box new_crop) {
+ if(scaled_crop.equals(new_crop)) {
+ // no change
+ return;
+ }
+
+ canvas.invalidate_area(scaled_crop);
+
+ Box horizontal;
+ bool horizontal_enlarged;
+ Box vertical;
+ bool vertical_enlarged;
+ BoxComplements complements = scaled_crop.resized_complements(new_crop, out horizontal,
+ out horizontal_enlarged, out vertical, out vertical_enlarged);
+
+ // this should never happen ... this means that the operation wasn't a resize
+ assert(complements != BoxComplements.NONE);
+
+ if (complements == BoxComplements.HORIZONTAL || complements == BoxComplements.BOTH)
+ set_area_alpha(horizontal, horizontal_enlarged ? 0.0 : 0.5);
+
+ if (complements == BoxComplements.VERTICAL || complements == BoxComplements.BOTH)
+ set_area_alpha(vertical, vertical_enlarged ? 0.0 : 0.5);
+
+ paint_crop_tool(new_crop);
+ canvas.invalidate_area(new_crop);
+ }
+
+ private void crop_moved(Box new_crop) {
+ if (scaled_crop.equals(new_crop)) {
+ // no change
+ return;
+ }
+
+ canvas.invalidate_area(scaled_crop);
+
+ set_area_alpha(scaled_crop, 0.5);
+ set_area_alpha(new_crop, 0.0);
+
+
+ // paint crop in new location
+ paint_crop_tool(new_crop);
+ canvas.invalidate_area(new_crop);
+ }
+
+ private void set_area_alpha(Box area, double alpha) {
+ Cairo.Context ctx = new Cairo.Context(crop_surface);
+ ctx.set_operator(Cairo.Operator.SOURCE);
+ ctx.set_source_rgba(0.0, 0.0, 0.0, alpha);
+ ctx.rectangle(area.left, area.top, area.get_width(), area.get_height());
+ ctx.fill();
+ canvas.paint_surface_area(crop_surface, area, true);
+ }
+
+ private void paint_crop_tool(Box crop) {
+ // paint rule-of-thirds lines and current dimensions if user is manipulating the crop
+ if (in_manipulation != BoxLocation.OUTSIDE) {
+ int one_third_x = crop.get_width() / 3;
+ int one_third_y = crop.get_height() / 3;
+
+ canvas.draw_horizontal_line(thin_white_ctx, crop.left, crop.top + one_third_y, crop.get_width());
+ canvas.draw_horizontal_line(thin_white_ctx, crop.left, crop.top + (one_third_y * 2), crop.get_width());
+
+ canvas.draw_vertical_line(thin_white_ctx, crop.left + one_third_x, crop.top, crop.get_height());
+ canvas.draw_vertical_line(thin_white_ctx, crop.left + (one_third_x * 2), crop.top, crop.get_height());
+
+ // current dimensions
+ // scale screen-coordinate crop to photo's coordinate system
+ Box adj_crop = scaled_crop.get_scaled_similar(
+ Dimensions.for_rectangle(canvas.get_scaled_pixbuf_position()),
+ canvas.get_photo().get_dimensions(Photo.Exception.CROP));
+ string text = adj_crop.get_width().to_string() + "x" + adj_crop.get_height().to_string();
+ int x = crop.left + crop.get_width() / 2;
+ int y = crop.top + crop.get_height() / 2;
+ canvas.draw_text(text_ctx, text, x, y);
+ }
+
+ // outer rectangle ... outer line in black, inner in white, corners fully black
+ canvas.draw_box(wide_black_ctx, crop);
+ canvas.draw_box(wide_white_ctx, crop.get_reduced(1));
+ canvas.draw_box(wide_white_ctx, crop.get_reduced(2));
+ }
+
+}
+
+public struct RedeyeInstance {
+ public const int MIN_RADIUS = 4;
+ public const int MAX_RADIUS = 32;
+ public const int DEFAULT_RADIUS = 10;
+
+ public Gdk.Point center;
+ public int radius;
+
+ RedeyeInstance() {
+ Gdk.Point default_center = Gdk.Point();
+ center = default_center;
+ radius = DEFAULT_RADIUS;
+ }
+
+ public static Gdk.Rectangle to_bounds_rect(EditingTools.RedeyeInstance inst) {
+ Gdk.Rectangle result = Gdk.Rectangle();
+ result.x = inst.center.x - inst.radius;
+ result.y = inst.center.y - inst.radius;
+ result.width = 2 * inst.radius;
+ result.height = result.width;
+
+ return result;
+ }
+
+ public static RedeyeInstance from_bounds_rect(Gdk.Rectangle rect) {
+ Gdk.Rectangle in_rect = rect;
+
+ RedeyeInstance result = RedeyeInstance();
+ result.radius = (in_rect.width + in_rect.height) / 4;
+ result.center.x = in_rect.x + result.radius;
+ result.center.y = in_rect.y + result.radius;
+
+ return result;
+ }
+}
+
+public class RedeyeTool : EditingTool {
+ private class RedeyeToolWindow : EditingToolWindow {
+ private const int CONTROL_SPACING = 8;
+
+ private Gtk.Label slider_label = new Gtk.Label.with_mnemonic(_("Size:"));
+
+ public Gtk.Button apply_button =
+ new Gtk.Button.from_stock(Gtk.Stock.APPLY);
+ public Gtk.Button close_button =
+ new Gtk.Button.from_stock(Gtk.Stock.CLOSE);
+ public Gtk.Scale slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ RedeyeInstance.MIN_RADIUS, RedeyeInstance.MAX_RADIUS, 1.0);
+
+ public RedeyeToolWindow(Gtk.Window container) {
+ base(container);
+
+ slider.set_size_request(80, -1);
+ slider.set_draw_value(false);
+
+ close_button.set_tooltip_text(_("Close the red-eye tool"));
+ close_button.set_image_position(Gtk.PositionType.LEFT);
+
+ apply_button.set_tooltip_text(_("Remove any red-eye effects in the selected region"));
+ apply_button.set_image_position(Gtk.PositionType.LEFT);
+
+ Gtk.Box layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, CONTROL_SPACING);
+ layout.add(slider_label);
+ layout.add(slider);
+ layout.add(close_button);
+ layout.add(apply_button);
+
+ add(layout);
+ }
+ }
+
+ private Cairo.Context thin_white_ctx = null;
+ private Cairo.Context wider_gray_ctx = null;
+ private RedeyeToolWindow redeye_tool_window = null;
+ private RedeyeInstance user_interaction_instance;
+ private bool is_reticle_move_in_progress = false;
+ private Gdk.Point reticle_move_mouse_start_point;
+ private Gdk.Point reticle_move_anchor;
+ private Gdk.Cursor cached_arrow_cursor;
+ private Gdk.Cursor cached_grab_cursor;
+ private Gdk.Rectangle old_scaled_pixbuf_position;
+ private Gdk.Pixbuf current_pixbuf = null;
+
+ private RedeyeTool() {
+ base("RedeyeTool");
+ }
+
+ public static RedeyeTool factory() {
+ return new RedeyeTool();
+ }
+
+ public static bool is_available(Photo photo, Scaling scaling) {
+ Dimensions dim = scaling.get_scaled_dimensions(photo.get_dimensions());
+
+ return dim.width >= (RedeyeInstance.MAX_RADIUS * 2)
+ && dim.height >= (RedeyeInstance.MAX_RADIUS * 2);
+ }
+
+ private RedeyeInstance new_interaction_instance(PhotoCanvas canvas) {
+ Gdk.Rectangle photo_bounds = canvas.get_scaled_pixbuf_position();
+ Gdk.Point photo_center = {0};
+ photo_center.x = photo_bounds.x + (photo_bounds.width / 2);
+ photo_center.y = photo_bounds.y + (photo_bounds.height / 2);
+
+ RedeyeInstance result = RedeyeInstance();
+ result.center.x = photo_center.x;
+ result.center.y = photo_center.y;
+ result.radius = RedeyeInstance.DEFAULT_RADIUS;
+
+ return result;
+ }
+
+ private void prepare_ctx(Cairo.Context ctx, Dimensions dim) {
+ wider_gray_ctx = new Cairo.Context(ctx.get_target());
+ set_source_color_from_string(wider_gray_ctx, "#111");
+ wider_gray_ctx.set_line_width(3);
+
+ thin_white_ctx = new Cairo.Context(ctx.get_target());
+ set_source_color_from_string(thin_white_ctx, "#FFF");
+ thin_white_ctx.set_line_width(1);
+ }
+
+ private void draw_redeye_instance(RedeyeInstance inst) {
+ canvas.draw_circle(wider_gray_ctx, inst.center.x, inst.center.y,
+ inst.radius);
+ canvas.draw_circle(thin_white_ctx, inst.center.x, inst.center.y,
+ inst.radius);
+ }
+
+ private bool on_size_slider_adjust(Gtk.ScrollType type) {
+ user_interaction_instance.radius =
+ (int) redeye_tool_window.slider.get_value();
+
+ canvas.repaint();
+
+ return false;
+ }
+
+ private void on_apply() {
+ Gdk.Rectangle bounds_rect_user =
+ RedeyeInstance.to_bounds_rect(user_interaction_instance);
+
+ Gdk.Rectangle bounds_rect_active =
+ canvas.user_to_active_rect(bounds_rect_user);
+ Gdk.Rectangle bounds_rect_unscaled =
+ canvas.active_to_unscaled_rect(bounds_rect_active);
+ Gdk.Rectangle bounds_rect_raw =
+ canvas.unscaled_to_raw_rect(bounds_rect_unscaled);
+
+ RedeyeInstance instance_raw =
+ RedeyeInstance.from_bounds_rect(bounds_rect_raw);
+
+ // transform screen coords back to image coords,
+ // taking into account straightening angle.
+ Dimensions dimensions = canvas.get_photo().get_dimensions(
+ Photo.Exception.STRAIGHTEN | Photo.Exception.CROP);
+
+ double theta = 0.0;
+
+ canvas.get_photo().get_straighten(out theta);
+
+ instance_raw.center = derotate_point_arb(instance_raw.center,
+ dimensions.width, dimensions.height, theta);
+
+ RedeyeCommand command = new RedeyeCommand(canvas.get_photo(), instance_raw,
+ Resources.RED_EYE_LABEL, Resources.RED_EYE_TOOLTIP);
+ AppWindow.get_command_manager().execute(command);
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> map) {
+ if (!map.has_key(canvas.get_photo()))
+ return;
+
+ try {
+ current_pixbuf = canvas.get_photo().get_pixbuf(canvas.get_scaling());
+ } catch (Error err) {
+ warning("%s", err.message);
+ aborted();
+
+ return;
+ }
+
+ canvas.repaint();
+ }
+
+ private void on_close() {
+ applied(null, current_pixbuf, canvas.get_photo().get_dimensions(), false);
+ }
+
+ private void on_canvas_resize() {
+ Gdk.Rectangle scaled_pixbuf_position =
+ canvas.get_scaled_pixbuf_position();
+
+ user_interaction_instance.center.x -= old_scaled_pixbuf_position.x;
+ user_interaction_instance.center.y -= old_scaled_pixbuf_position.y;
+
+ double scale_factor = ((double) scaled_pixbuf_position.width) /
+ ((double) old_scaled_pixbuf_position.width);
+
+ user_interaction_instance.center.x =
+ (int)(((double) user_interaction_instance.center.x) *
+ scale_factor + 0.5);
+ user_interaction_instance.center.y =
+ (int)(((double) user_interaction_instance.center.y) *
+ scale_factor + 0.5);
+
+ user_interaction_instance.center.x += scaled_pixbuf_position.x;
+ user_interaction_instance.center.y += scaled_pixbuf_position.y;
+
+ old_scaled_pixbuf_position = scaled_pixbuf_position;
+
+ current_pixbuf = null;
+ }
+
+ public override void activate(PhotoCanvas canvas) {
+ user_interaction_instance = new_interaction_instance(canvas);
+
+ prepare_ctx(canvas.get_default_ctx(), canvas.get_surface_dim());
+
+ bind_canvas_handlers(canvas);
+
+ old_scaled_pixbuf_position = canvas.get_scaled_pixbuf_position();
+ current_pixbuf = canvas.get_scaled_pixbuf();
+
+ redeye_tool_window = new RedeyeToolWindow(canvas.get_container());
+ redeye_tool_window.slider.set_value(user_interaction_instance.radius);
+
+ bind_window_handlers();
+
+ cached_arrow_cursor = new Gdk.Cursor(Gdk.CursorType.LEFT_PTR);
+ cached_grab_cursor = new Gdk.Cursor(Gdk.CursorType.FLEUR);
+
+ DataCollection? owner = canvas.get_photo().get_membership();
+ if (owner != null)
+ owner.items_altered.connect(on_photos_altered);
+
+ base.activate(canvas);
+ }
+
+ public override void deactivate() {
+ if (canvas != null) {
+ DataCollection? owner = canvas.get_photo().get_membership();
+ if (owner != null)
+ owner.items_altered.disconnect(on_photos_altered);
+
+ unbind_canvas_handlers(canvas);
+ }
+
+ if (redeye_tool_window != null) {
+ unbind_window_handlers();
+ redeye_tool_window.hide();
+ redeye_tool_window.destroy();
+ redeye_tool_window = null;
+ }
+
+ base.deactivate();
+ }
+
+ private void bind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.new_surface.connect(prepare_ctx);
+ canvas.resized_scaled_pixbuf.connect(on_canvas_resize);
+ }
+
+ private void unbind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.new_surface.disconnect(prepare_ctx);
+ canvas.resized_scaled_pixbuf.disconnect(on_canvas_resize);
+ }
+
+ private void bind_window_handlers() {
+ redeye_tool_window.apply_button.clicked.connect(on_apply);
+ redeye_tool_window.close_button.clicked.connect(on_close);
+ redeye_tool_window.slider.change_value.connect(on_size_slider_adjust);
+ }
+
+ private void unbind_window_handlers() {
+ redeye_tool_window.apply_button.clicked.disconnect(on_apply);
+ redeye_tool_window.close_button.clicked.disconnect(on_close);
+ redeye_tool_window.slider.change_value.disconnect(on_size_slider_adjust);
+ }
+
+ public override EditingToolWindow? get_tool_window() {
+ return redeye_tool_window;
+ }
+
+ public override void paint(Cairo.Context ctx) {
+ canvas.paint_pixbuf((current_pixbuf != null) ? current_pixbuf : canvas.get_scaled_pixbuf());
+
+ /* user_interaction_instance has its radius in user coords, and
+ draw_redeye_instance expects active region coords */
+ RedeyeInstance active_inst = user_interaction_instance;
+ active_inst.center =
+ canvas.user_to_active_point(user_interaction_instance.center);
+ draw_redeye_instance(active_inst);
+ }
+
+ public override void on_left_click(int x, int y) {
+ Gdk.Rectangle bounds_rect =
+ RedeyeInstance.to_bounds_rect(user_interaction_instance);
+
+ if (coord_in_rectangle(x, y, bounds_rect)) {
+ is_reticle_move_in_progress = true;
+ reticle_move_mouse_start_point.x = x;
+ reticle_move_mouse_start_point.y = y;
+ reticle_move_anchor = user_interaction_instance.center;
+ }
+ }
+
+ public override void on_left_released(int x, int y) {
+ is_reticle_move_in_progress = false;
+ }
+
+ public override void on_motion(int x, int y, Gdk.ModifierType mask) {
+ if (is_reticle_move_in_progress) {
+
+ Gdk.Rectangle active_region_rect =
+ canvas.get_scaled_pixbuf_position();
+
+ int x_clamp_low =
+ active_region_rect.x + user_interaction_instance.radius + 1;
+ int y_clamp_low =
+ active_region_rect.y + user_interaction_instance.radius + 1;
+ int x_clamp_high =
+ active_region_rect.x + active_region_rect.width -
+ user_interaction_instance.radius - 1;
+ int y_clamp_high =
+ active_region_rect.y + active_region_rect.height -
+ user_interaction_instance.radius - 1;
+
+ int delta_x = x - reticle_move_mouse_start_point.x;
+ int delta_y = y - reticle_move_mouse_start_point.y;
+
+ user_interaction_instance.center.x = reticle_move_anchor.x +
+ delta_x;
+ user_interaction_instance.center.y = reticle_move_anchor.y +
+ delta_y;
+
+ user_interaction_instance.center.x =
+ (reticle_move_anchor.x + delta_x).clamp(x_clamp_low,
+ x_clamp_high);
+ user_interaction_instance.center.y =
+ (reticle_move_anchor.y + delta_y).clamp(y_clamp_low,
+ y_clamp_high);
+
+ canvas.repaint();
+ } else {
+ Gdk.Rectangle bounds =
+ RedeyeInstance.to_bounds_rect(user_interaction_instance);
+
+ if (coord_in_rectangle(x, y, bounds)) {
+ canvas.get_drawing_window().set_cursor(cached_grab_cursor);
+ } else {
+ canvas.get_drawing_window().set_cursor(cached_arrow_cursor);
+ }
+ }
+ }
+
+ public override bool on_keypress(Gdk.EventKey event) {
+ if ((Gdk.keyval_name(event.keyval) == "KP_Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Return")) {
+ on_close();
+ return true;
+ }
+
+ return base.on_keypress(event);
+ }
+}
+
+public class AdjustTool : EditingTool {
+ private const int SLIDER_WIDTH = 160;
+ private const uint SLIDER_DELAY_MSEC = 100;
+
+ private class AdjustToolWindow : EditingToolWindow {
+ public Gtk.Scale exposure_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ ExposureTransformation.MIN_PARAMETER, ExposureTransformation.MAX_PARAMETER,
+ 1.0);
+ public Gtk.Scale saturation_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ SaturationTransformation.MIN_PARAMETER, SaturationTransformation.MAX_PARAMETER,
+ 1.0);
+ public Gtk.Scale tint_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ TintTransformation.MIN_PARAMETER, TintTransformation.MAX_PARAMETER, 1.0);
+ public Gtk.Scale temperature_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ TemperatureTransformation.MIN_PARAMETER, TemperatureTransformation.MAX_PARAMETER,
+ 1.0);
+
+ public Gtk.Scale shadows_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ ShadowDetailTransformation.MIN_PARAMETER, ShadowDetailTransformation.MAX_PARAMETER,
+ 1.0);
+
+ public Gtk.Scale highlights_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL,
+ HighlightDetailTransformation.MIN_PARAMETER, HighlightDetailTransformation.MAX_PARAMETER,
+ 1.0);
+
+ public Gtk.Button ok_button = new Gtk.Button.from_stock(Gtk.Stock.OK);
+ public Gtk.Button reset_button = new Gtk.Button.with_mnemonic(_("_Reset"));
+ public Gtk.Button cancel_button = new Gtk.Button.from_stock(Gtk.Stock.CANCEL);
+ public RGBHistogramManipulator histogram_manipulator = new RGBHistogramManipulator();
+
+ public AdjustToolWindow(Gtk.Window container) {
+ base(container);
+
+ Gtk.Grid slider_organizer = new Gtk.Grid();
+ slider_organizer.set_column_homogeneous(false);
+ slider_organizer.set_row_spacing(12);
+ slider_organizer.set_column_spacing(12);
+ slider_organizer.set_margin_left(12);
+ slider_organizer.set_margin_bottom(12);
+
+ Gtk.Label exposure_label = new Gtk.Label.with_mnemonic(_("Exposure:"));
+ exposure_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(exposure_label, 0, 0, 1, 1);
+ slider_organizer.attach(exposure_slider, 1, 0, 1, 1);
+ exposure_slider.set_size_request(SLIDER_WIDTH, -1);
+ exposure_slider.set_draw_value(false);
+ exposure_slider.set_margin_right(0);
+
+ Gtk.Label saturation_label = new Gtk.Label.with_mnemonic(_("Saturation:"));
+ saturation_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(saturation_label, 0, 1, 1, 1);
+ slider_organizer.attach(saturation_slider, 1, 1, 1, 1);
+ saturation_slider.set_size_request(SLIDER_WIDTH, -1);
+ saturation_slider.set_draw_value(false);
+ saturation_slider.set_margin_right(0);
+
+ Gtk.Label tint_label = new Gtk.Label.with_mnemonic(_("Tint:"));
+ tint_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(tint_label, 0, 2, 1, 1);
+ slider_organizer.attach(tint_slider, 1, 2, 1, 1);
+ tint_slider.set_size_request(SLIDER_WIDTH, -1);
+ tint_slider.set_draw_value(false);
+ tint_slider.set_margin_right(0);
+
+ Gtk.Label temperature_label =
+ new Gtk.Label.with_mnemonic(_("Temperature:"));
+ temperature_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(temperature_label, 0, 3, 1, 1);
+ slider_organizer.attach(temperature_slider, 1, 3, 1, 1);
+ temperature_slider.set_size_request(SLIDER_WIDTH, -1);
+ temperature_slider.set_draw_value(false);
+ temperature_slider.set_margin_right(0);
+
+ Gtk.Label shadows_label = new Gtk.Label.with_mnemonic(_("Shadows:"));
+ shadows_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(shadows_label, 0, 4, 1, 1);
+ slider_organizer.attach(shadows_slider, 1, 4, 1, 1);
+ shadows_slider.set_size_request(SLIDER_WIDTH, -1);
+ shadows_slider.set_draw_value(false);
+ shadows_slider.set_margin_right(0);
+
+ Gtk.Label highlights_label = new Gtk.Label.with_mnemonic(_("Highlights:"));
+ highlights_label.set_alignment(0.0f, 0.5f);
+ slider_organizer.attach(highlights_label, 0, 5, 1, 1);
+ slider_organizer.attach(highlights_slider, 1, 5, 1, 1);
+ highlights_slider.set_size_request(SLIDER_WIDTH, -1);
+ highlights_slider.set_draw_value(false);
+
+ Gtk.Box button_layouter = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ button_layouter.set_homogeneous(true);
+ button_layouter.pack_start(cancel_button, true, true, 1);
+ button_layouter.pack_start(reset_button, true, true, 1);
+ button_layouter.pack_start(ok_button, true, true, 1);
+
+ Gtk.Alignment histogram_aligner = new Gtk.Alignment(0.0f, 0.0f, 0.0f, 0.0f);
+ histogram_aligner.add(histogram_manipulator);
+ histogram_aligner.set_padding(12, 8, 12, 12);
+
+ Gtk.Box pane_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 8);
+ pane_layouter.add(histogram_aligner);
+ pane_layouter.add(slider_organizer);
+ pane_layouter.add(button_layouter);
+ pane_layouter.set_child_packing(histogram_aligner, true, true, 0, Gtk.PackType.START);
+
+ add(pane_layouter);
+ }
+ }
+
+ private abstract class AdjustToolCommand : Command {
+ protected weak AdjustTool owner;
+
+ public AdjustToolCommand(AdjustTool owner, string name, string explanation) {
+ base (name, explanation);
+
+ this.owner = owner;
+ owner.deactivated.connect(on_owner_deactivated);
+ }
+
+ ~AdjustToolCommand() {
+ if (owner != null)
+ owner.deactivated.disconnect(on_owner_deactivated);
+ }
+
+ private void on_owner_deactivated() {
+ // This reset call is by design. See notes on ticket #1946 if this is undesirable or if
+ // you are planning to change it.
+ AppWindow.get_command_manager().reset();
+ }
+ }
+
+ private class AdjustResetCommand : AdjustToolCommand {
+ private PixelTransformationBundle original;
+ private PixelTransformationBundle reset;
+
+ public AdjustResetCommand(AdjustTool owner, PixelTransformationBundle current) {
+ base (owner, _("Reset Colors"), _("Reset all color adjustments to original"));
+
+ original = current.copy();
+ reset = new PixelTransformationBundle();
+ reset.set_to_identity();
+ }
+
+ public override void execute() {
+ owner.set_adjustments(reset);
+ }
+
+ public override void undo() {
+ owner.set_adjustments(original);
+ }
+
+ public override bool compress(Command command) {
+ AdjustResetCommand reset_command = command as AdjustResetCommand;
+ if (reset_command == null)
+ return false;
+
+ if (reset_command.owner != owner)
+ return false;
+
+ // multiple successive resets on the same photo as good as a single
+ return true;
+ }
+ }
+
+ private class SliderAdjustmentCommand : AdjustToolCommand {
+ private PixelTransformationType transformation_type;
+ private PixelTransformation new_transformation;
+ private PixelTransformation old_transformation;
+
+ public SliderAdjustmentCommand(AdjustTool owner, PixelTransformation old_transformation,
+ PixelTransformation new_transformation, string name) {
+ base(owner, name, name);
+
+ this.old_transformation = old_transformation;
+ this.new_transformation = new_transformation;
+ transformation_type = old_transformation.get_transformation_type();
+ assert(new_transformation.get_transformation_type() == transformation_type);
+ }
+
+ public override void execute() {
+ // don't update slider; it's been moved by the user
+ owner.update_transformation(new_transformation);
+ owner.canvas.repaint();
+ }
+
+ public override void undo() {
+ owner.update_transformation(old_transformation);
+
+ owner.unbind_window_handlers();
+ owner.update_slider(old_transformation);
+ owner.bind_window_handlers();
+
+ owner.canvas.repaint();
+ }
+
+ public override void redo() {
+ owner.update_transformation(new_transformation);
+
+ owner.unbind_window_handlers();
+ owner.update_slider(new_transformation);
+ owner.bind_window_handlers();
+
+ owner.canvas.repaint();
+ }
+
+ public override bool compress(Command command) {
+ SliderAdjustmentCommand slider_adjustment = command as SliderAdjustmentCommand;
+ if (slider_adjustment == null)
+ return false;
+
+ // same photo
+ if (slider_adjustment.owner != owner)
+ return false;
+
+ // same adjustment
+ if (slider_adjustment.transformation_type != transformation_type)
+ return false;
+
+ // execute the command
+ slider_adjustment.execute();
+
+ // save it's transformation as ours
+ new_transformation = slider_adjustment.new_transformation;
+
+ return true;
+ }
+ }
+
+ private class AdjustEnhanceCommand : AdjustToolCommand {
+ private Photo photo;
+ private PixelTransformationBundle original;
+ private PixelTransformationBundle enhanced = null;
+
+ public AdjustEnhanceCommand(AdjustTool owner, Photo photo) {
+ base(owner, Resources.ENHANCE_LABEL, Resources.ENHANCE_TOOLTIP);
+
+ this.photo = photo;
+ original = photo.get_color_adjustments();
+ }
+
+ public override void execute() {
+ if (enhanced == null)
+ enhanced = photo.get_enhance_transformations();
+
+ owner.set_adjustments(enhanced);
+ }
+
+ public override void undo() {
+ owner.set_adjustments(original);
+ }
+
+ public override bool compress(Command command) {
+ // can compress both normal enhance and one with the adjust tool running
+ EnhanceSingleCommand enhance_single = command as EnhanceSingleCommand;
+ if (enhance_single != null) {
+ Photo photo = (Photo) enhance_single.get_source();
+
+ // multiple successive enhances are as good as a single, as long as it's on the
+ // same photo
+ return photo.equals(owner.canvas.get_photo());
+ }
+
+ AdjustEnhanceCommand enhance_command = command as AdjustEnhanceCommand;
+ if (enhance_command == null)
+ return false;
+
+ if (enhance_command.owner != owner)
+ return false;
+
+ // multiple successive as good as a single
+ return true;
+ }
+ }
+
+ private AdjustToolWindow adjust_tool_window = null;
+ private bool suppress_effect_redraw = false;
+ private Gdk.Pixbuf draw_to_pixbuf = null;
+ private Gdk.Pixbuf histogram_pixbuf = null;
+ private Gdk.Pixbuf virgin_histogram_pixbuf = null;
+ private PixelTransformer transformer = null;
+ private PixelTransformer histogram_transformer = null;
+ private PixelTransformationBundle transformations = null;
+ private float[] fp_pixel_cache = null;
+ private bool disable_histogram_refresh = false;
+ private OneShotScheduler? temperature_scheduler = null;
+ private OneShotScheduler? tint_scheduler = null;
+ private OneShotScheduler? saturation_scheduler = null;
+ private OneShotScheduler? exposure_scheduler = null;
+ private OneShotScheduler? shadows_scheduler = null;
+ private OneShotScheduler? highlights_scheduler = null;
+
+ private AdjustTool() {
+ base("AdjustTool");
+ }
+
+ public static AdjustTool factory() {
+ return new AdjustTool();
+ }
+
+ public static bool is_available(Photo photo, Scaling scaling) {
+ return true;
+ }
+
+ public override void activate(PhotoCanvas canvas) {
+ adjust_tool_window = new AdjustToolWindow(canvas.get_container());
+
+ Photo photo = canvas.get_photo();
+ transformations = photo.get_color_adjustments();
+ transformer = transformations.generate_transformer();
+
+ // the histogram transformer uses all transformations but contrast expansion
+ histogram_transformer = new PixelTransformer();
+
+ /* set up expansion */
+ ExpansionTransformation expansion_trans = (ExpansionTransformation)
+ transformations.get_transformation(PixelTransformationType.TONE_EXPANSION);
+ adjust_tool_window.histogram_manipulator.set_left_nub_position(
+ expansion_trans.get_black_point());
+ adjust_tool_window.histogram_manipulator.set_right_nub_position(
+ expansion_trans.get_white_point());
+
+ /* set up shadows */
+ ShadowDetailTransformation shadows_trans = (ShadowDetailTransformation)
+ transformations.get_transformation(PixelTransformationType.SHADOWS);
+ histogram_transformer.attach_transformation(shadows_trans);
+ adjust_tool_window.shadows_slider.set_value(shadows_trans.get_parameter());
+
+ /* set up highlights */
+ HighlightDetailTransformation highlights_trans = (HighlightDetailTransformation)
+ transformations.get_transformation(PixelTransformationType.HIGHLIGHTS);
+ histogram_transformer.attach_transformation(highlights_trans);
+ adjust_tool_window.highlights_slider.set_value(highlights_trans.get_parameter());
+
+ /* set up temperature & tint */
+ TemperatureTransformation temp_trans = (TemperatureTransformation)
+ transformations.get_transformation(PixelTransformationType.TEMPERATURE);
+ histogram_transformer.attach_transformation(temp_trans);
+ adjust_tool_window.temperature_slider.set_value(temp_trans.get_parameter());
+
+ TintTransformation tint_trans = (TintTransformation)
+ transformations.get_transformation(PixelTransformationType.TINT);
+ histogram_transformer.attach_transformation(tint_trans);
+ adjust_tool_window.tint_slider.set_value(tint_trans.get_parameter());
+
+ /* set up saturation */
+ SaturationTransformation sat_trans = (SaturationTransformation)
+ transformations.get_transformation(PixelTransformationType.SATURATION);
+ histogram_transformer.attach_transformation(sat_trans);
+ adjust_tool_window.saturation_slider.set_value(sat_trans.get_parameter());
+
+ /* set up exposure */
+ ExposureTransformation exposure_trans = (ExposureTransformation)
+ transformations.get_transformation(PixelTransformationType.EXPOSURE);
+ histogram_transformer.attach_transformation(exposure_trans);
+ adjust_tool_window.exposure_slider.set_value(exposure_trans.get_parameter());
+
+ bind_canvas_handlers(canvas);
+ bind_window_handlers();
+
+ draw_to_pixbuf = canvas.get_scaled_pixbuf().copy();
+ init_fp_pixel_cache(canvas.get_scaled_pixbuf());
+
+ /* if we have an 1x1 pixel image, then there's no need to deal with recomputing the
+ histogram, because a histogram for a 1x1 image is meaningless. The histogram shows the
+ distribution of color over all the many pixels in an image, but if an image only has
+ one pixel, the notion of a "distribution over pixels" makes no sense. */
+ if (draw_to_pixbuf.width == 1 && draw_to_pixbuf.height == 1)
+ disable_histogram_refresh = true;
+
+ /* don't sample the original image to create the histogram if the original image is
+ sufficiently large -- if it's over 8k pixels, then we'll get pretty much the same
+ histogram if we sample from a half-size image */
+ if (((draw_to_pixbuf.width * draw_to_pixbuf.height) > 8192) && (draw_to_pixbuf.width > 1) &&
+ (draw_to_pixbuf.height > 1)) {
+ histogram_pixbuf = draw_to_pixbuf.scale_simple(draw_to_pixbuf.width / 2,
+ draw_to_pixbuf.height / 2, Gdk.InterpType.HYPER);
+ } else {
+ histogram_pixbuf = draw_to_pixbuf.copy();
+ }
+ virgin_histogram_pixbuf = histogram_pixbuf.copy();
+
+ DataCollection? owner = canvas.get_photo().get_membership();
+ if (owner != null)
+ owner.items_altered.connect(on_photos_altered);
+
+ base.activate(canvas);
+ }
+
+ public override EditingToolWindow? get_tool_window() {
+ return adjust_tool_window;
+ }
+
+ public override void deactivate() {
+ if (canvas != null) {
+ DataCollection? owner = canvas.get_photo().get_membership();
+ if (owner != null)
+ owner.items_altered.disconnect(on_photos_altered);
+
+ unbind_canvas_handlers(canvas);
+ }
+
+ if (adjust_tool_window != null) {
+ unbind_window_handlers();
+ adjust_tool_window.hide();
+ adjust_tool_window.destroy();
+ adjust_tool_window = null;
+ }
+
+ draw_to_pixbuf = null;
+ fp_pixel_cache = null;
+
+ base.deactivate();
+ }
+
+ public override void paint(Cairo.Context ctx) {
+ if (!suppress_effect_redraw) {
+ transformer.transform_from_fp(ref fp_pixel_cache, draw_to_pixbuf);
+ histogram_transformer.transform_to_other_pixbuf(virgin_histogram_pixbuf,
+ histogram_pixbuf);
+ if (!disable_histogram_refresh)
+ adjust_tool_window.histogram_manipulator.update_histogram(histogram_pixbuf);
+ }
+
+ canvas.paint_pixbuf(draw_to_pixbuf);
+ }
+
+ public override Gdk.Pixbuf? get_display_pixbuf(Scaling scaling, Photo photo,
+ out Dimensions max_dim) throws Error {
+ if (!photo.has_color_adjustments()) {
+ max_dim = Dimensions();
+
+ return null;
+ }
+
+ max_dim = photo.get_dimensions();
+
+ return photo.get_pixbuf_with_options(scaling, Photo.Exception.ADJUST);
+ }
+
+ private void on_reset() {
+ AdjustResetCommand command = new AdjustResetCommand(this, transformations);
+ AppWindow.get_command_manager().execute(command);
+ }
+
+ private void on_ok() {
+ suppress_effect_redraw = true;
+
+ get_tool_window().hide();
+
+ applied(new AdjustColorsSingleCommand(canvas.get_photo(), transformations,
+ Resources.ADJUST_LABEL, Resources.ADJUST_TOOLTIP), draw_to_pixbuf,
+ canvas.get_photo().get_dimensions(), false);
+ }
+
+ private void update_transformations(PixelTransformationBundle new_transformations) {
+ foreach (PixelTransformation transformation in new_transformations.get_transformations())
+ update_transformation(transformation);
+ }
+
+ private void update_transformation(PixelTransformation new_transformation) {
+ PixelTransformation old_transformation = transformations.get_transformation(
+ new_transformation.get_transformation_type());
+
+ transformer.replace_transformation(old_transformation, new_transformation);
+ if (new_transformation.get_transformation_type() != PixelTransformationType.TONE_EXPANSION)
+ histogram_transformer.replace_transformation(old_transformation, new_transformation);
+
+ transformations.set(new_transformation);
+ }
+
+ private void slider_updated(PixelTransformation new_transformation, string name) {
+ PixelTransformation old_transformation = transformations.get_transformation(
+ new_transformation.get_transformation_type());
+ SliderAdjustmentCommand command = new SliderAdjustmentCommand(this, old_transformation,
+ new_transformation, name);
+ AppWindow.get_command_manager().execute(command);
+ }
+
+ private void on_temperature_adjustment() {
+ if (temperature_scheduler == null)
+ temperature_scheduler = new OneShotScheduler("temperature", on_delayed_temperature_adjustment);
+
+ temperature_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_temperature_adjustment() {
+ TemperatureTransformation new_temp_trans = new TemperatureTransformation(
+ (float) adjust_tool_window.temperature_slider.get_value());
+ slider_updated(new_temp_trans, _("Temperature"));
+ }
+
+ private void on_tint_adjustment() {
+ if (tint_scheduler == null)
+ tint_scheduler = new OneShotScheduler("tint", on_delayed_tint_adjustment);
+
+ tint_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_tint_adjustment() {
+ TintTransformation new_tint_trans = new TintTransformation(
+ (float) adjust_tool_window.tint_slider.get_value());
+ slider_updated(new_tint_trans, _("Tint"));
+ }
+
+ private void on_saturation_adjustment() {
+ if (saturation_scheduler == null)
+ saturation_scheduler = new OneShotScheduler("saturation", on_delayed_saturation_adjustment);
+
+ saturation_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_saturation_adjustment() {
+ SaturationTransformation new_sat_trans = new SaturationTransformation(
+ (float) adjust_tool_window.saturation_slider.get_value());
+ slider_updated(new_sat_trans, _("Saturation"));
+ }
+
+ private void on_exposure_adjustment() {
+ if (exposure_scheduler == null)
+ exposure_scheduler = new OneShotScheduler("exposure", on_delayed_exposure_adjustment);
+
+ exposure_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_exposure_adjustment() {
+ ExposureTransformation new_exp_trans = new ExposureTransformation(
+ (float) adjust_tool_window.exposure_slider.get_value());
+ slider_updated(new_exp_trans, _("Exposure"));
+ }
+
+ private void on_shadows_adjustment() {
+ if (shadows_scheduler == null)
+ shadows_scheduler = new OneShotScheduler("shadows", on_delayed_shadows_adjustment);
+
+ shadows_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_shadows_adjustment() {
+ ShadowDetailTransformation new_shadows_trans = new ShadowDetailTransformation(
+ (float) adjust_tool_window.shadows_slider.get_value());
+ slider_updated(new_shadows_trans, _("Shadows"));
+ }
+
+ private void on_highlights_adjustment() {
+ if (highlights_scheduler == null)
+ highlights_scheduler = new OneShotScheduler("highlights", on_delayed_highlights_adjustment);
+
+ highlights_scheduler.after_timeout(SLIDER_DELAY_MSEC, true);
+ }
+
+ private void on_delayed_highlights_adjustment() {
+ HighlightDetailTransformation new_highlights_trans = new HighlightDetailTransformation(
+ (float) adjust_tool_window.highlights_slider.get_value());
+ slider_updated(new_highlights_trans, _("Highlights"));
+ }
+
+ private void on_histogram_constraint() {
+ int expansion_black_point =
+ adjust_tool_window.histogram_manipulator.get_left_nub_position();
+ int expansion_white_point =
+ adjust_tool_window.histogram_manipulator.get_right_nub_position();
+ ExpansionTransformation new_exp_trans =
+ new ExpansionTransformation.from_extrema(expansion_black_point, expansion_white_point);
+ slider_updated(new_exp_trans, _("Contrast Expansion"));
+ }
+
+ private void on_canvas_resize() {
+ draw_to_pixbuf = canvas.get_scaled_pixbuf().copy();
+ init_fp_pixel_cache(canvas.get_scaled_pixbuf());
+ }
+
+ private bool on_hscale_reset(Gtk.Widget widget, Gdk.EventButton event) {
+ Gtk.Scale source = (Gtk.Scale) widget;
+
+ if (event.button == 1 && event.type == Gdk.EventType.BUTTON_PRESS
+ && has_only_key_modifier(event.state, Gdk.ModifierType.CONTROL_MASK)) {
+ // Left Mouse Button and CTRL pressed
+ source.set_value(0);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private void bind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.resized_scaled_pixbuf.connect(on_canvas_resize);
+ }
+
+ private void unbind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.resized_scaled_pixbuf.disconnect(on_canvas_resize);
+ }
+
+ private void bind_window_handlers() {
+ adjust_tool_window.ok_button.clicked.connect(on_ok);
+ adjust_tool_window.reset_button.clicked.connect(on_reset);
+ adjust_tool_window.cancel_button.clicked.connect(notify_cancel);
+ adjust_tool_window.exposure_slider.value_changed.connect(on_exposure_adjustment);
+ adjust_tool_window.saturation_slider.value_changed.connect(on_saturation_adjustment);
+ adjust_tool_window.tint_slider.value_changed.connect(on_tint_adjustment);
+ adjust_tool_window.temperature_slider.value_changed.connect(on_temperature_adjustment);
+ adjust_tool_window.shadows_slider.value_changed.connect(on_shadows_adjustment);
+ adjust_tool_window.highlights_slider.value_changed.connect(on_highlights_adjustment);
+ adjust_tool_window.histogram_manipulator.nub_position_changed.connect(on_histogram_constraint);
+
+ adjust_tool_window.saturation_slider.button_press_event.connect(on_hscale_reset);
+ adjust_tool_window.exposure_slider.button_press_event.connect(on_hscale_reset);
+ adjust_tool_window.tint_slider.button_press_event.connect(on_hscale_reset);
+ adjust_tool_window.temperature_slider.button_press_event.connect(on_hscale_reset);
+ adjust_tool_window.shadows_slider.button_press_event.connect(on_hscale_reset);
+ adjust_tool_window.highlights_slider.button_press_event.connect(on_hscale_reset);
+ }
+
+ private void unbind_window_handlers() {
+ adjust_tool_window.ok_button.clicked.disconnect(on_ok);
+ adjust_tool_window.reset_button.clicked.disconnect(on_reset);
+ adjust_tool_window.cancel_button.clicked.disconnect(notify_cancel);
+ adjust_tool_window.exposure_slider.value_changed.disconnect(on_exposure_adjustment);
+ adjust_tool_window.saturation_slider.value_changed.disconnect(on_saturation_adjustment);
+ adjust_tool_window.tint_slider.value_changed.disconnect(on_tint_adjustment);
+ adjust_tool_window.temperature_slider.value_changed.disconnect(on_temperature_adjustment);
+ adjust_tool_window.shadows_slider.value_changed.disconnect(on_shadows_adjustment);
+ adjust_tool_window.highlights_slider.value_changed.disconnect(on_highlights_adjustment);
+ adjust_tool_window.histogram_manipulator.nub_position_changed.disconnect(on_histogram_constraint);
+
+ adjust_tool_window.saturation_slider.button_press_event.disconnect(on_hscale_reset);
+ adjust_tool_window.exposure_slider.button_press_event.disconnect(on_hscale_reset);
+ adjust_tool_window.tint_slider.button_press_event.disconnect(on_hscale_reset);
+ adjust_tool_window.temperature_slider.button_press_event.disconnect(on_hscale_reset);
+ adjust_tool_window.shadows_slider.button_press_event.disconnect(on_hscale_reset);
+ adjust_tool_window.highlights_slider.button_press_event.disconnect(on_hscale_reset);
+ }
+
+ public bool enhance() {
+ AdjustEnhanceCommand command = new AdjustEnhanceCommand(this, canvas.get_photo());
+ AppWindow.get_command_manager().execute(command);
+
+ return true;
+ }
+
+ private void on_photos_altered(Gee.Map<DataObject, Alteration> map) {
+ if (!map.has_key(canvas.get_photo()))
+ return;
+
+ PixelTransformationBundle adjustments = canvas.get_photo().get_color_adjustments();
+ set_adjustments(adjustments);
+ }
+
+ private void set_adjustments(PixelTransformationBundle new_adjustments) {
+ unbind_window_handlers();
+
+ update_transformations(new_adjustments);
+
+ foreach (PixelTransformation adjustment in new_adjustments.get_transformations())
+ update_slider(adjustment);
+
+ bind_window_handlers();
+ canvas.repaint();
+ }
+
+ // Note that window handlers should be unbound (unbind_window_handlers) prior to calling this
+ // if the caller doesn't want the widget's signals to fire with the change.
+ private void update_slider(PixelTransformation transformation) {
+ switch (transformation.get_transformation_type()) {
+ case PixelTransformationType.TONE_EXPANSION:
+ ExpansionTransformation expansion = (ExpansionTransformation) transformation;
+
+ if (!disable_histogram_refresh) {
+ adjust_tool_window.histogram_manipulator.set_left_nub_position(
+ expansion.get_black_point());
+ adjust_tool_window.histogram_manipulator.set_right_nub_position(
+ expansion.get_white_point());
+ }
+ break;
+
+ case PixelTransformationType.SHADOWS:
+ adjust_tool_window.shadows_slider.set_value(
+ ((ShadowDetailTransformation) transformation).get_parameter());
+ break;
+
+ case PixelTransformationType.HIGHLIGHTS:
+ adjust_tool_window.highlights_slider.set_value(
+ ((HighlightDetailTransformation) transformation).get_parameter());
+ break;
+
+ case PixelTransformationType.EXPOSURE:
+ adjust_tool_window.exposure_slider.set_value(
+ ((ExposureTransformation) transformation).get_parameter());
+ break;
+
+ case PixelTransformationType.SATURATION:
+ adjust_tool_window.saturation_slider.set_value(
+ ((SaturationTransformation) transformation).get_parameter());
+ break;
+
+ case PixelTransformationType.TINT:
+ adjust_tool_window.tint_slider.set_value(
+ ((TintTransformation) transformation).get_parameter());
+ break;
+
+ case PixelTransformationType.TEMPERATURE:
+ adjust_tool_window.temperature_slider.set_value(
+ ((TemperatureTransformation) transformation).get_parameter());
+ break;
+
+ default:
+ error("Unknown adjustment: %d", (int) transformation.get_transformation_type());
+ }
+ }
+
+ private void init_fp_pixel_cache(Gdk.Pixbuf source) {
+ int source_width = source.get_width();
+ int source_height = source.get_height();
+ int source_num_channels = source.get_n_channels();
+ int source_rowstride = source.get_rowstride();
+ unowned uchar[] source_pixels = source.get_pixels();
+
+ fp_pixel_cache = new float[3 * source_width * source_height];
+ int cache_pixel_index = 0;
+ float INV_255 = 1.0f / 255.0f;
+
+ for (int j = 0; j < source_height; j++) {
+ int row_start_index = j * source_rowstride;
+ int row_end_index = row_start_index + (source_width * source_num_channels);
+ for (int i = row_start_index; i < row_end_index; i += source_num_channels) {
+ fp_pixel_cache[cache_pixel_index++] = ((float) source_pixels[i]) * INV_255;
+ fp_pixel_cache[cache_pixel_index++] = ((float) source_pixels[i + 1]) * INV_255;
+ fp_pixel_cache[cache_pixel_index++] = ((float) source_pixels[i + 2]) * INV_255;
+ }
+ }
+ }
+
+ public override bool on_keypress(Gdk.EventKey event) {
+ if ((Gdk.keyval_name(event.keyval) == "KP_Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Return")) {
+ on_ok();
+ return true;
+ }
+
+ return base.on_keypress(event);
+ }
+}
+
+
+}
+
diff --git a/src/editing_tools/StraightenTool.vala b/src/editing_tools/StraightenTool.vala
new file mode 100644
index 0000000..8a778ec
--- /dev/null
+++ b/src/editing_tools/StraightenTool.vala
@@ -0,0 +1,559 @@
+
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace EditingTools {
+
+/**
+ * An editing tool that allows one to introduce or remove a Dutch angle from
+ * a photograph.
+ */
+public class StraightenTool : EditingTool {
+ private const double MIN_ANGLE = -15.0;
+ private const double MAX_ANGLE = 15.0;
+ private const double INCREMENT = 0.1;
+ private const int MIN_SLIDER_SIZE = 160;
+ private const int MIN_LABEL_SIZE = 100;
+ private const int MIN_BUTTON_SIZE = 84;
+ private const int TEMP_PIXBUF_SIZE = 768;
+ private const double GUIDE_DASH[2] = {10, 10};
+ private const int REPAINT_ON_STOP_DELAY_MSEC = 100;
+
+ private class StraightenGuide {
+ private bool is_active = false;
+ private int x[2]; // start & end drag coords
+ private int y[2];
+ private double angle0; // current angle
+
+ public void reset(int x, int y, double angle) {
+ this.x = {x, x};
+ this.y = {y, y};
+ this.is_active = true;
+ this.angle0 = angle;
+ }
+
+ public bool update(int x, int y) {
+ if (this.is_active) {
+ this.x[1] = x;
+ this.y[1] = y;
+ return true;
+ }
+
+ return false;
+ }
+
+ public void clear() {
+ this.is_active = false;
+ }
+
+ public double? get_angle() {
+ double dx = x[1] - x[0];
+ double dy = y[1] - y[0];
+
+ // minimum radius to consider: discard clicks
+ if (dy*dy + dx*dx < 40)
+ return null;
+
+ // distinguish guides closer to horizontal or vertical
+ if (Math.fabs(dy) > Math.fabs(dx))
+ return angle0 + Math.atan(dx / dy) / Math.PI * 180;
+ else
+ return angle0 - Math.atan(dy / dx) / Math.PI * 180;
+ }
+
+ public void draw(Cairo.Context ctx) {
+ if (!is_active)
+ return;
+
+ double angle = get_angle() ?? 0.0;
+ if (angle == 0.0)
+ return;
+
+ double alpha = 1.0;
+ if (angle < MIN_ANGLE || angle > MAX_ANGLE)
+ alpha = 0.35;
+
+ // b&w dashing so it will be more visible on
+ // different backgrounds.
+ ctx.set_source_rgba(0.0, 0.0, 0.0, alpha);
+ ctx.set_dash(GUIDE_DASH, GUIDE_DASH[0] / 2);
+ ctx.move_to(x[0] + 0.5, y[0] + 0.5);
+ ctx.line_to(x[1] + 0.5, y[1] + 0.5);
+ ctx.stroke();
+ ctx.set_dash(GUIDE_DASH, -GUIDE_DASH[0] / 2);
+ ctx.set_source_rgba(1.0, 1.0, 1.0, alpha);
+ ctx.move_to(x[0] + 0.5, y[0] + 0.5);
+ ctx.line_to(x[1] + 0.5, y[1] + 0.5);
+ ctx.stroke();
+ }
+ }
+
+ private class StraightenToolWindow : EditingToolWindow {
+ public const int CONTROL_SPACING = 8;
+
+ public Gtk.Scale angle_slider = new Gtk.Scale.with_range(Gtk.Orientation.HORIZONTAL, MIN_ANGLE, MAX_ANGLE, INCREMENT);
+ public Gtk.Label angle_label = new Gtk.Label("");
+ public Gtk.Label description_label = new Gtk.Label(_("Angle:"));
+ public Gtk.Button ok_button = new Gtk.Button.with_mnemonic(_("_Straighten"));
+ public Gtk.Button cancel_button = new Gtk.Button.from_stock(Gtk.Stock.CANCEL);
+ public Gtk.Button reset_button = new Gtk.Button.with_mnemonic(_("_Reset"));
+
+ /**
+ * Prepare straighten tool's window for use and initialize all its controls.
+ *
+ * @param container The application's main window.
+ */
+ public StraightenToolWindow(Gtk.Window container) {
+ base(container);
+
+ angle_slider.set_min_slider_size(MIN_SLIDER_SIZE);
+ angle_slider.set_size_request(MIN_SLIDER_SIZE, -1);
+ angle_slider.set_value(0.0);
+ angle_slider.set_draw_value(false);
+
+ description_label.set_padding(CONTROL_SPACING, 0);
+ angle_label.set_padding(0, 0);
+ angle_label.set_size_request(MIN_LABEL_SIZE,-1);
+
+ Gtk.Box slider_layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, CONTROL_SPACING);
+ slider_layout.pack_start(angle_slider, true, true, 0);
+
+ Gtk.Box button_layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, CONTROL_SPACING);
+ cancel_button.set_size_request(MIN_BUTTON_SIZE, -1);
+ reset_button.set_size_request(MIN_BUTTON_SIZE, -1);
+ ok_button.set_size_request(MIN_BUTTON_SIZE, -1);
+ button_layout.pack_start(cancel_button, true, true, 0);
+ button_layout.pack_start(reset_button, true, true, 0);
+ button_layout.pack_start(ok_button, true, true, 0);
+
+ Gtk.Box main_layout = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+ main_layout.pack_start(description_label, true, true, 0);
+ main_layout.pack_start(slider_layout, true, true, 0);
+ main_layout.pack_start(angle_label, true, true, 0);
+ main_layout.pack_start(button_layout, true, true, 0);
+
+ add(main_layout);
+
+ reset_button.clicked.connect(on_reset_clicked);
+
+ set_position(Gtk.WindowPosition.CENTER_ON_PARENT);
+ }
+
+ private void on_reset_clicked() {
+ angle_slider.set_value(0.0);
+ }
+ }
+
+ private StraightenToolWindow window;
+
+ // the incoming image itself.
+ private Cairo.Surface photo_surf;
+ Dimensions image_dims;
+
+ // temporary surface we'll draw the rotated image into.
+ private Cairo.Surface rotate_surf;
+ private Cairo.Context rotate_ctx;
+
+ private Dimensions last_viewport;
+ private int view_width;
+ private int view_height;
+ private double photo_angle = 0.0;
+
+ // should we use a nicer-but-more-expensive filter
+ // when repainting the rotated image?
+ private bool use_high_qual = true;
+ private OneShotScheduler? slider_sched = null;
+
+ private Gdk.Point crop_center; // original center in image coordinates
+ private int crop_width;
+ private int crop_height;
+
+ private StraightenGuide guide = new StraightenGuide();
+
+ // As the crop box rotates, we adjust its center and/or scale it so that it fits in the image.
+ private Gdk.Point rotated_center; // in image coordinates
+ private double rotate_scale; // always <= 1.0: rotation may shrink but not grow box
+
+ private double preview_scale;
+
+ private StraightenTool() {
+ base("StraightenTool");
+ }
+
+ public static StraightenTool factory() {
+ return new StraightenTool();
+ }
+
+ public static bool is_available(Photo photo, Scaling scaling) {
+ return true;
+ }
+
+ /**
+ * @brief Signal handler for when the 'OK' button has been clicked. Computes where a previously-
+ * set crop region should have rotated to (to match the Photo's straightening angle).
+ *
+ * @note After this has been called against a Photo, it will always have a crop region; in the
+ * case of a previously-uncropped Photo, the crop region will be set to the original dimensions
+ * of the photo and centered at the Photo's center.
+ */
+ private void on_ok_clicked() {
+ assert(canvas.get_photo() != null);
+
+ // compute where the crop box should be now and set the image's
+ // current crop to it
+ double slider_val = window.angle_slider.get_value();
+
+ Gdk.Point new_crop_center = rotate_point_arb(rotated_center,
+ image_dims.width, image_dims.height, slider_val);
+
+ StraightenCommand command = new StraightenCommand(
+ canvas.get_photo(), slider_val,
+ Box.from_center(new_crop_center,
+ (int) (rotate_scale * crop_width), (int) (rotate_scale * crop_height)),
+ Resources.STRAIGHTEN_LABEL, Resources.STRAIGHTEN_TOOLTIP);
+ applied(command, null, image_dims, true);
+ }
+
+ private void high_qual_repaint(){
+ use_high_qual = true;
+ update_rotated_surface();
+ this.canvas.repaint();
+ }
+
+ private void on_slider_stopped_delayed() {
+ high_qual_repaint();
+ }
+
+ public override void on_left_click(int x, int y) {
+ guide.reset(x, y, photo_angle);
+ }
+
+ public override void on_left_released(int x, int y) {
+ guide.update(x, y);
+ double? a = guide.get_angle();
+ guide.clear();
+ if (a != null) {
+ window.angle_slider.set_value(a);
+ high_qual_repaint();
+ }
+ }
+
+ public override void on_motion(int x, int y, Gdk.ModifierType mask) {
+ if (guide.update(x, y))
+ canvas.repaint();
+ }
+
+ public override bool on_keypress(Gdk.EventKey event) {
+ if ((Gdk.keyval_name(event.keyval) == "KP_Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Enter") ||
+ (Gdk.keyval_name(event.keyval) == "Return")) {
+ on_ok_clicked();
+ return true;
+ }
+
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ notify_cancel();
+ return true;
+ }
+
+ return base.on_keypress(event);
+ }
+
+ private void prepare_image() {
+ Dimensions canvas_dims = canvas.get_surface_dim();
+ Dimensions viewport = canvas_dims.with_max(TEMP_PIXBUF_SIZE, TEMP_PIXBUF_SIZE);
+ if (viewport == last_viewport)
+ return; // no change
+
+ last_viewport = viewport;
+
+ Gdk.Pixbuf low_res_tmp = null;
+ try {
+ low_res_tmp =
+ canvas.get_photo().get_pixbuf_with_options(Scaling.for_viewport(viewport, false),
+ Photo.Exception.STRAIGHTEN | Photo.Exception.CROP);
+ } catch (Error e) {
+ warning("A pixbuf for %s couldn't be fetched.", canvas.get_photo().to_string());
+ low_res_tmp = new Gdk.Pixbuf(Gdk.Colorspace.RGB, false, 8, 1, 1);
+ }
+
+ preview_scale = low_res_tmp.width / (double) image_dims.width;
+
+ // copy image data from photo into a cairo surface.
+ photo_surf = new Cairo.ImageSurface(Cairo.Format.ARGB32, low_res_tmp.width, low_res_tmp.height);
+ Cairo.Context ctx = new Cairo.Context(photo_surf);
+ Gdk.cairo_set_source_pixbuf(ctx, low_res_tmp, 0, 0);
+ ctx.rectangle(0, 0, low_res_tmp.width, low_res_tmp.height);
+ ctx.fill();
+ ctx.paint();
+
+ // prepare rotation surface and context. we paint a rotated,
+ // low-res copy of the image into it, followed by a faint grid.
+ view_width = (int) (crop_width * preview_scale);
+ view_height = (int) (crop_height * preview_scale);
+ rotate_surf = new Cairo.ImageSurface(Cairo.Format.ARGB32, view_width, view_height);
+ rotate_ctx = new Cairo.Context(rotate_surf);
+ }
+
+ // Adjust the rotated crop box so that it fits in the source image.
+ void adjust_for_rotation() {
+ double width, height;
+ compute_arb_rotated_size(crop_width, crop_height, photo_angle, out width, out height);
+
+ // First compute a scaling factor that will let the rotated box fit in the image.
+ rotate_scale = double.min(image_dims.width / width, image_dims.height / height);
+ rotate_scale = double.min(rotate_scale, 1.0);
+
+ // Now nudge the box into the image if necessary.
+ rotated_center = crop_center;
+ int radius_x = (int) (rotate_scale * width / 2);
+ int radius_y = (int) (rotate_scale * height / 2);
+ rotated_center.x = rotated_center.x.clamp(radius_x, image_dims.width - radius_x);
+ rotated_center.y = rotated_center.y.clamp(radius_y, image_dims.height - radius_y);
+ }
+
+ /**
+ * @brief Spawn the tool window, set up the scratch surfaces and prepare the straightening
+ * tool for use. If a valid pixbuf of the incoming Photo can't be loaded for any
+ * reason, the tool will use a 1x1 temporary image instead to avoid crashing.
+ *
+ * @param canvas The PhotoCanvas the tool's output should be painted to.
+ */
+ public override void activate(PhotoCanvas canvas) {
+ base.activate(canvas);
+ this.canvas = canvas;
+ bind_canvas_handlers(this.canvas);
+
+ image_dims = canvas.get_photo().get_dimensions(
+ Photo.Exception.STRAIGHTEN | Photo.Exception.CROP);
+
+ Box crop_region;
+ if (!canvas.get_photo().get_crop(out crop_region)) {
+ crop_region.left = 0;
+ crop_region.right = image_dims.width;
+
+ crop_region.top = 0;
+ crop_region.bottom = image_dims.height;
+ }
+
+ // read the photo's current angle and start the tool with the slider set to that value. we
+ // also use this to de-rotate the crop region
+ double incoming_angle = 0.0;
+ canvas.get_photo().get_straighten(out incoming_angle);
+
+ // Translate the crop center to image coordinates.
+ crop_center = derotate_point_arb(crop_region.get_center(),
+ image_dims.width, image_dims.height, incoming_angle);
+ crop_width = crop_region.get_width();
+ crop_height = crop_region.get_height();
+
+ adjust_for_rotation();
+
+ prepare_image();
+
+ // set crosshair cursor
+ canvas.get_drawing_window().set_cursor(new Gdk.Cursor(Gdk.CursorType.CROSSHAIR));
+
+ window = new StraightenToolWindow(canvas.get_container());
+ bind_window_handlers();
+
+ // prepare ths slider for display
+ window.angle_slider.set_value(incoming_angle);
+ photo_angle = incoming_angle;
+
+ string tmp = "%2.1f°".printf(incoming_angle);
+ window.angle_label.set_text(tmp);
+
+ high_qual_repaint();
+ window.show_all();
+ }
+
+ /**
+ * Tears down the tool window and frees resources.
+ */
+ public override void deactivate() {
+ if(window != null) {
+
+ unbind_window_handlers();
+
+ window.hide();
+ window = null;
+ }
+
+ if (canvas != null) {
+ unbind_canvas_handlers(canvas);
+ canvas.get_drawing_window().set_cursor(null);
+ }
+
+ base.deactivate();
+ }
+
+ private void bind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.resized_scaled_pixbuf.connect(on_resized_pixbuf);
+ }
+
+ private void unbind_canvas_handlers(PhotoCanvas canvas) {
+ canvas.resized_scaled_pixbuf.disconnect(on_resized_pixbuf);
+ }
+
+ private void bind_window_handlers() {
+ window.key_press_event.connect(on_keypress);
+ window.ok_button.clicked.connect(on_ok_clicked);
+ window.cancel_button.clicked.connect(notify_cancel);
+ window.angle_slider.value_changed.connect(on_angle_changed);
+ }
+
+ private void unbind_window_handlers() {
+ window.key_press_event.disconnect(on_keypress);
+ window.ok_button.clicked.disconnect(on_ok_clicked);
+ window.cancel_button.clicked.disconnect(notify_cancel);
+ window.angle_slider.value_changed.disconnect(on_angle_changed);
+ }
+
+ private void on_angle_changed() {
+ photo_angle = window.angle_slider.get_value();
+ string tmp = "%2.1f°".printf(window.angle_slider.get_value());
+ window.angle_label.set_text(tmp);
+
+ if (slider_sched == null)
+ slider_sched = new OneShotScheduler("straighten", on_slider_stopped_delayed);
+ slider_sched.after_timeout(REPAINT_ON_STOP_DELAY_MSEC, true);
+
+ use_high_qual = false;
+
+ adjust_for_rotation();
+ update_rotated_surface();
+ this.canvas.repaint();
+ }
+
+ /**
+ * @brief Called by the EditingHostPage when a resize event occurs.
+ */
+ private void on_resized_pixbuf(Dimensions old_dim, Gdk.Pixbuf scaled, Gdk.Rectangle scaled_position) {
+ prepare_image();
+ }
+
+ /**
+ * Returns a reference to the current StraightenTool instance's tool window;
+ * the PhotoPage uses this to control the tool window's positioning, etc.
+ */
+ public override EditingToolWindow? get_tool_window() {
+ return window;
+ }
+
+ /**
+ * Draw the rotated photo and grid.
+ */
+ private void update_rotated_surface() {
+ draw_rotated_source(photo_surf, rotate_ctx, view_width, view_height, photo_angle);
+ rotate_ctx.set_line_width(1.0);
+ draw_superimposed_grid(rotate_ctx, view_width, view_height);
+ }
+
+ /**
+ * Render a smaller, rotated version of the image, with a grid superimposed over it.
+ *
+ * @param ctx The rendering context of a 'scratch' Cairo surface. The tool makes its own
+ * surfaces and contexts so it can have things set up exactly like it wants them, so
+ * it's not used.
+ */
+ public override void paint(Cairo.Context ctx) {
+ int w = canvas.get_drawing_window().get_width();
+ int h = canvas.get_drawing_window().get_height();
+
+ // fill region behind the rotation surface with neutral color.
+ canvas.get_default_ctx().identity_matrix();
+ canvas.get_default_ctx().set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ canvas.get_default_ctx().rectangle(0, 0, w, h);
+ canvas.get_default_ctx().fill();
+
+ // copy the composited result to the main window.
+ canvas.get_default_ctx().translate((w - view_width) / 2.0, (h - view_height) / 2.0);
+ canvas.get_default_ctx().set_source_surface(rotate_surf, 0, 0);
+ canvas.get_default_ctx().rectangle(0, 0, view_width, view_height);
+ canvas.get_default_ctx().fill();
+ canvas.get_default_ctx().paint();
+
+ // reset the 'modelview' matrix, since when the canvas is not in
+ // 'tool' mode, it 'expects' things to be set up a certain way.
+ canvas.get_default_ctx().identity_matrix();
+
+ guide.draw(canvas.get_default_ctx());
+ }
+
+ /**
+ * Copy a rotated version of the source image onto the destination
+ * context.
+ *
+ * @param src_surf A Cairo surface containing the source image.
+ * @param dest_ctx The rendering context of the destination image.
+ * @param src_width The width of the image data in src_surf in pixels.
+ * @param src_height The height of the image data in src_surf in pixels.
+ * @param angle The angle the source image should be rotated by, in degrees.
+ */
+ private void draw_rotated_source(Cairo.Surface src_surf, Cairo.Context dest_ctx,
+ int src_width, int src_height, double angle) {
+ double angle_internal = degrees_to_radians(angle);
+
+ // fill area behind rotated image with neutral color to avoid 'ghosting'.
+ // this should be removed after #4612 has been addressed.
+ dest_ctx.identity_matrix();
+ dest_ctx.set_source_rgba(0.0, 0.0, 0.0, 1.0);
+ dest_ctx.rectangle(0, 0, view_width, view_height);
+ dest_ctx.fill();
+
+ // rotate the image, taking into account that the position of the
+ // upper left corner must change depending on rotation amount and direction
+ // and translate so center of preview crop region is now center of rotation
+ dest_ctx.identity_matrix();
+
+ dest_ctx.translate(view_width / 2, view_height / 2);
+ dest_ctx.scale(1.0 / rotate_scale, 1.0 / rotate_scale);
+ dest_ctx.rotate(angle_internal);
+ dest_ctx.translate(- rotated_center.x * preview_scale, - rotated_center.y * preview_scale);
+
+ dest_ctx.set_source_surface(src_surf, 0, 0);
+ dest_ctx.get_source().set_filter(use_high_qual ? Cairo.Filter.BEST : Cairo.Filter.NEAREST);
+ dest_ctx.rectangle(0, 0, src_width, src_height);
+ dest_ctx.fill();
+ dest_ctx.paint();
+ }
+
+ /**
+ * Superimpose a faint grid over the supplied image.
+ *
+ * @param width The total width the grid should be drawn to.
+ * @param height The total height the grid should be drawn to.
+ * @param dest_ctx The rendering context of the destination image.
+ */
+ private void draw_superimposed_grid(Cairo.Context dest_ctx, int width, int height) {
+ int half_width = width / 2;
+ int quarter_width = width / 4;
+
+ int half_height = height / 2;
+ int quarter_height = height / 4;
+
+ dest_ctx.identity_matrix();
+ dest_ctx.set_source_rgba(1.0, 1.0, 1.0, 1.0);
+
+ canvas.draw_horizontal_line(dest_ctx, 0, 0, width, false);
+ canvas.draw_horizontal_line(dest_ctx, 0, half_height, width, false);
+ canvas.draw_horizontal_line(dest_ctx, 0, view_height - 1, width, false);
+
+ canvas.draw_vertical_line(dest_ctx, 0, 0, height + 1, false);
+ canvas.draw_vertical_line(dest_ctx, half_width, 0, height + 1, false);
+ canvas.draw_vertical_line(dest_ctx, width - 1, 0, height + 1, false);
+
+ dest_ctx.set_source_rgba(1.0, 1.0, 1.0, 0.33);
+
+ canvas.draw_horizontal_line(dest_ctx, 0, quarter_height, width, false);
+ canvas.draw_horizontal_line(dest_ctx, 0, half_height + quarter_height, width, false);
+ canvas.draw_vertical_line(dest_ctx, quarter_width, 0, height, false);
+ canvas.draw_vertical_line(dest_ctx, half_width + quarter_width, 0, height, false);
+ }
+}
+
+} // end namespace
diff --git a/src/editing_tools/mk/editing_tools.mk b/src/editing_tools/mk/editing_tools.mk
new file mode 100644
index 0000000..424c525
--- /dev/null
+++ b/src/editing_tools/mk/editing_tools.mk
@@ -0,0 +1,28 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := EditingTools
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := editing_tools
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ StraightenTool.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/events/Branch.vala b/src/events/Branch.vala
new file mode 100644
index 0000000..e1b5221
--- /dev/null
+++ b/src/events/Branch.vala
@@ -0,0 +1,542 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Events.Branch : Sidebar.Branch {
+ internal static Icon open_icon;
+ internal static Icon closed_icon;
+ internal static Icon events_icon;
+ internal static Icon single_event_icon;
+ internal static Icon no_event_icon;
+
+ // NOTE: Because the comparators must be static methods (due to CompareFunc's stupid impl.)
+ // and there's an assumption that only one Events.Branch is ever created, this is a static
+ // member but it's modified by instance methods.
+ private static bool sort_ascending = false;
+
+ private Gee.HashMap<Event, Events.EventEntry> entry_map = new Gee.HashMap<
+ Event, Events.EventEntry>();
+ private Events.UndatedDirectoryEntry undated_entry = new Events.UndatedDirectoryEntry();
+ private Events.NoEventEntry no_event_entry = new Events.NoEventEntry();
+
+ public Branch() {
+ base (new Events.MasterDirectoryEntry(), Sidebar.Branch.Options.STARTUP_EXPAND_TO_FIRST_CHILD,
+ event_year_comparator);
+
+ // seed the branch
+ foreach (DataObject object in Event.global.get_all())
+ add_event((Event) object);
+
+ show_no_events(Event.global.get_no_event_objects().size > 0);
+
+ // monitor Events for future changes
+ Event.global.contents_altered.connect(on_events_added_removed);
+ Event.global.items_altered.connect(on_events_altered);
+ Event.global.no_event_collection_altered.connect(on_no_event_collection_altered);
+
+ // monitor sorting criteria (see note at sort_ascending about this)
+ Config.Facade.get_instance().events_sort_ascending_changed.connect(on_config_changed);
+ }
+
+ ~Branch() {
+ Event.global.contents_altered.disconnect(on_events_added_removed);
+ Event.global.items_altered.disconnect(on_events_altered);
+ Event.global.no_event_collection_altered.disconnect(on_no_event_collection_altered);
+
+ Config.Facade.get_instance().events_sort_ascending_changed.disconnect(on_config_changed);
+ }
+
+ internal static void init() {
+ open_icon = new ThemedIcon(Resources.ICON_FOLDER_OPEN);
+ closed_icon = new ThemedIcon(Resources.ICON_FOLDER_CLOSED);
+ events_icon = new ThemedIcon(Resources.ICON_EVENTS);
+ single_event_icon = new ThemedIcon(Resources.ICON_ONE_EVENT);
+ no_event_icon = new ThemedIcon(Resources.ICON_NO_EVENT);
+
+ sort_ascending = Config.Facade.get_instance().get_events_sort_ascending();
+ }
+
+ internal static void terminate() {
+ open_icon = null;
+ closed_icon = null;
+ events_icon = null;
+ single_event_icon = null;
+ no_event_icon = null;
+ }
+
+ public Events.MasterDirectoryEntry get_master_entry() {
+ return (Events.MasterDirectoryEntry) get_root();
+ }
+
+ private static int event_year_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ // The Undated and No Event entries should always appear last in the
+ // list, respectively.
+ if (a is Events.UndatedDirectoryEntry) {
+ if (b is Events.NoEventEntry)
+ return -1;
+ return 1;
+ } else if (b is Events.UndatedDirectoryEntry) {
+ if (a is Events.NoEventEntry)
+ return 1;
+ return -1;
+ }
+
+ if (a is Events.NoEventEntry)
+ return 1;
+ else if (b is Events.NoEventEntry)
+ return -1;
+
+ if (!sort_ascending) {
+ Sidebar.Entry swap = a;
+ a = b;
+ b = swap;
+ }
+
+ int result =
+ ((Events.YearDirectoryEntry) a).get_year() - ((Events.YearDirectoryEntry) b).get_year();
+ assert(result != 0);
+
+ return result;
+ }
+
+ private static int event_month_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ if (!sort_ascending) {
+ Sidebar.Entry swap = a;
+ a = b;
+ b = swap;
+ }
+
+ int result =
+ ((Events.MonthDirectoryEntry) a).get_month() - ((Events.MonthDirectoryEntry) b).get_month();
+ assert(result != 0);
+
+ return result;
+ }
+
+ private static int event_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ if (!sort_ascending) {
+ Sidebar.Entry swap = a;
+ a = b;
+ b = swap;
+ }
+
+ int64 result = ((Events.EventEntry) a).get_event().get_start_time()
+ - ((Events.EventEntry) b).get_event().get_start_time();
+
+ // to stabilize sort (events with the same start time are allowed)
+ if (result == 0) {
+ result = ((Events.EventEntry) a).get_event().get_event_id().id
+ - ((Events.EventEntry) b).get_event().get_event_id().id;
+ }
+
+ assert(result != 0);
+
+ return (result < 0) ? -1 : 1;
+ }
+
+ private static int undated_event_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ if (!sort_ascending) {
+ Sidebar.Entry swap = a;
+ a = b;
+ b = swap;
+ }
+
+ int ret = ((Events.EventEntry) a).get_event().get_name().collate(
+ ((Events.EventEntry) b).get_event().get_name());
+
+ if (ret == 0)
+ ret = (int) (((Events.EventEntry) b).get_event().get_instance_id() -
+ ((Events.EventEntry) a).get_event().get_instance_id());
+
+ return ret;
+ }
+
+ public Events.EventEntry? get_entry_for_event(Event event) {
+ return entry_map.get(event);
+ }
+
+ private void on_config_changed() {
+ bool value = Config.Facade.get_instance().get_events_sort_ascending();
+
+ sort_ascending = value;
+ reorder_all();
+ }
+
+ private void on_events_added_removed(Gee.Iterable<DataObject>? added,
+ Gee.Iterable<DataObject>? removed) {
+ if (added != null) {
+ foreach (DataObject object in added)
+ add_event((Event) object);
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed)
+ remove_event((Event) object);
+ }
+ }
+
+ private void on_events_altered(Gee.Map<DataObject, Alteration> altered) {
+ foreach (DataObject object in altered.keys) {
+ Event event = (Event) object;
+ Alteration alteration = altered.get(object);
+
+ if (alteration.has_detail("metadata", "time")) {
+ // can't merely re-sort the event because it might have moved to a new month or
+ // even a new year
+ move_event(event);
+ } else if (alteration.has_detail("metadata", "name")) {
+ Events.EventEntry? entry = entry_map.get(event);
+ assert(entry != null);
+
+ entry.sidebar_name_changed(event.get_name());
+ entry.sidebar_tooltip_changed(event.get_name());
+ }
+ }
+ }
+
+ private void on_no_event_collection_altered() {
+ show_no_events(Event.global.get_no_event_objects().size > 0);
+ }
+
+ private void add_event(Event event) {
+ time_t event_time = event.get_start_time();
+ if (event_time == 0) {
+ add_undated_event(event);
+
+ return;
+ }
+
+ Time event_tm = Time.local(event_time);
+
+ Sidebar.Entry? year;
+ Sidebar.Entry? month = find_event_month(event, event_tm, out year);
+ if (month != null) {
+ graft_event(month, event, event_comparator);
+
+ return;
+ }
+
+ if (year == null) {
+ year = new Events.YearDirectoryEntry(event_tm.format(SubEventsDirectoryPage.YEAR_FORMAT),
+ event_tm);
+ graft(get_root(), year, event_month_comparator);
+ }
+
+ month = new Events.MonthDirectoryEntry(event_tm.format(SubEventsDirectoryPage.MONTH_FORMAT),
+ event_tm);
+ graft(year, month, event_comparator);
+
+ graft_event(month, event, event_comparator);
+ }
+
+ private void move_event(Event event) {
+ time_t event_time = event.get_start_time();
+ if (event_time == 0) {
+ move_to_undated_event(event);
+
+ return;
+ }
+
+ Time event_tm = Time.local(event_time);
+
+ Sidebar.Entry? year;
+ Sidebar.Entry? month = find_event_month(event, event_tm, out year);
+
+ if (year == null) {
+ year = new Events.YearDirectoryEntry(event_tm.format(SubEventsDirectoryPage.YEAR_FORMAT),
+ event_tm);
+ graft(get_root(), year, event_month_comparator);
+ }
+
+ if (month == null) {
+ month = new Events.MonthDirectoryEntry(event_tm.format(SubEventsDirectoryPage.MONTH_FORMAT),
+ event_tm);
+ graft(year, month, event_comparator);
+ }
+
+ reparent_event(event, month);
+ }
+
+ private void remove_event(Event event) {
+ // the following code works for undated events as well as dated (no need for special
+ // case, as in add_event())
+ Sidebar.Entry? entry;
+ bool removed = entry_map.unset(event, out entry);
+ assert(removed);
+
+ Sidebar.Entry? parent = get_parent(entry);
+ assert(parent != null);
+
+ prune(entry);
+
+ // prune up the tree to the root
+ while (get_child_count(parent) == 0 && parent != get_root()) {
+ Sidebar.Entry? grandparent = get_parent(parent);
+ assert(grandparent != null);
+
+ prune(parent);
+
+ parent = grandparent;
+ }
+ }
+
+ private Sidebar.Entry? find_event_month(Event event, Time event_tm, out Sidebar.Entry found_year) {
+ // find the year first
+ found_year = find_event_year(event, event_tm);
+ if (found_year == null)
+ return null;
+
+ int event_month = event_tm.month + 1;
+
+ // found the year, traverse the months
+ return find_first_child(found_year, (entry) => {
+ return ((Events.MonthDirectoryEntry) entry).get_month() == event_month;
+ });
+ }
+
+ private Sidebar.Entry? find_event_year(Event event, Time event_tm) {
+ int event_year = event_tm.year + 1900;
+
+ return find_first_child(get_root(), (entry) => {
+ if ((entry is Events.UndatedDirectoryEntry) || (entry is Events.NoEventEntry))
+ return false;
+ else
+ return ((Events.YearDirectoryEntry) entry).get_year() == event_year;
+ });
+ }
+
+ private void add_undated_event(Event event) {
+ if (!has_entry(undated_entry))
+ graft(get_root(), undated_entry, undated_event_comparator);
+
+ graft_event(undated_entry, event);
+ }
+
+ private void move_to_undated_event(Event event) {
+ if (!has_entry(undated_entry))
+ graft(get_root(), undated_entry);
+
+ reparent_event(event, undated_entry);
+ }
+
+ private void graft_event(Sidebar.Entry parent, Event event,
+ owned CompareDataFunc<Sidebar.Entry>? comparator = null) {
+ Events.EventEntry entry = new Events.EventEntry(event);
+ entry_map.set(event, entry);
+
+ graft(parent, entry, (owned) comparator);
+ }
+
+ private void reparent_event(Event event, Sidebar.Entry new_parent) {
+ Events.EventEntry? entry = entry_map.get(event);
+ assert(entry != null);
+
+ Sidebar.Entry? old_parent = get_parent(entry);
+ assert(old_parent != null);
+
+ reparent(new_parent, entry);
+
+ while (get_child_count(old_parent) == 0 && old_parent != get_root()) {
+ Sidebar.Entry? grandparent = get_parent(old_parent);
+ assert(grandparent != null);
+
+ prune(old_parent);
+
+ old_parent = grandparent;
+ }
+ }
+
+ private void show_no_events(bool show) {
+ if (show && !has_entry(no_event_entry))
+ graft(get_root(), no_event_entry);
+ else if (!show && has_entry(no_event_entry))
+ prune(no_event_entry);
+ }
+}
+
+public abstract class Events.DirectoryEntry : Sidebar.SimplePageEntry, Sidebar.ExpandableEntry {
+ public DirectoryEntry() {
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return null;
+ }
+
+ public virtual Icon? get_sidebar_open_icon() {
+ return Events.Branch.open_icon;
+ }
+
+ public virtual Icon? get_sidebar_closed_icon() {
+ return Events.Branch.closed_icon;
+ }
+
+ public bool expand_on_select() {
+ return true;
+ }
+}
+
+public class Events.MasterDirectoryEntry : Events.DirectoryEntry {
+ public MasterDirectoryEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return MasterEventsDirectoryPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return Events.Branch.events_icon;
+ }
+
+ public override Icon? get_sidebar_open_icon() {
+ return Events.Branch.events_icon;
+ }
+
+ public override Icon? get_sidebar_closed_icon() {
+ return Events.Branch.events_icon;
+ }
+
+ protected override Page create_page() {
+ return new MasterEventsDirectoryPage();
+ }
+}
+
+public class Events.YearDirectoryEntry : Events.DirectoryEntry {
+ private string name;
+ private Time tm;
+
+ public YearDirectoryEntry(string name, Time tm) {
+ this.name = name;
+ this.tm = tm;
+ }
+
+ public override string get_sidebar_name() {
+ return name;
+ }
+
+ public int get_year() {
+ return tm.year + 1900;
+ }
+
+ protected override Page create_page() {
+ return new SubEventsDirectoryPage(SubEventsDirectoryPage.DirectoryType.YEAR, tm);
+ }
+}
+
+public class Events.MonthDirectoryEntry : Events.DirectoryEntry {
+ private string name;
+ private Time tm;
+
+ public MonthDirectoryEntry(string name, Time tm) {
+ this.name = name;
+ this.tm = tm;
+ }
+
+ public override string get_sidebar_name() {
+ return name;
+ }
+
+ public int get_year() {
+ return tm.year + 1900;
+ }
+
+ public int get_month() {
+ return tm.month + 1;
+ }
+
+ protected override Page create_page() {
+ return new SubEventsDirectoryPage(SubEventsDirectoryPage.DirectoryType.MONTH, tm);
+ }
+}
+
+public class Events.UndatedDirectoryEntry : Events.DirectoryEntry {
+ public UndatedDirectoryEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return SubEventsDirectoryPage.UNDATED_PAGE_NAME;
+ }
+
+ protected override Page create_page() {
+ return new SubEventsDirectoryPage(SubEventsDirectoryPage.DirectoryType.UNDATED,
+ Time.local(0));
+ }
+}
+
+public class Events.EventEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
+ Sidebar.InternalDropTargetEntry {
+ private Event event;
+
+ public EventEntry(Event event) {
+ this.event = event;
+ }
+
+ public Event get_event() {
+ return event;
+ }
+
+ public override string get_sidebar_name() {
+ return event.get_name();
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return Events.Branch.single_event_icon;
+ }
+
+ protected override Page create_page() {
+ return new EventPage(event);
+ }
+
+ public void rename(string new_name) {
+ string? prepped = Event.prep_event_name(new_name);
+ if (prepped != null)
+ AppWindow.get_command_manager().execute(new RenameEventCommand(event, prepped));
+ }
+
+ public bool internal_drop_received(Gee.List<MediaSource> media) {
+ // ugh ... some early Commands expected DataViews instead of DataSources (to make life
+ // easier for Pages) and this is one of the prices paid for that
+ Gee.ArrayList<DataView> views = new Gee.ArrayList<DataView>();
+ foreach (MediaSource media_source in media)
+ views.add(new DataView(media_source));
+
+ AppWindow.get_command_manager().execute(new SetEventCommand(views, event));
+
+ return true;
+ }
+
+ public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
+ return false;
+ }
+}
+
+public class Events.NoEventEntry : Sidebar.SimplePageEntry {
+ public NoEventEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return NoEventPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return Events.Branch.no_event_icon;
+ }
+
+ protected override Page create_page() {
+ return new NoEventPage();
+ }
+}
+
diff --git a/src/events/EventDirectoryItem.vala b/src/events/EventDirectoryItem.vala
new file mode 100644
index 0000000..5b2026b
--- /dev/null
+++ b/src/events/EventDirectoryItem.vala
@@ -0,0 +1,189 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+class EventDirectoryItem : CheckerboardItem {
+ private static int CROPPED_SCALE {
+ get {
+ return ThumbnailCache.Size.MEDIUM.get_scale()
+ + ((ThumbnailCache.Size.BIG.get_scale() - ThumbnailCache.Size.MEDIUM.get_scale()) / 2);
+ }
+ }
+
+ public static Scaling squared_scaling = Scaling.to_fill_viewport(Dimensions(CROPPED_SCALE,
+ CROPPED_SCALE));
+
+ public Event event;
+
+ private Gdk.Rectangle paul_lynde = Gdk.Rectangle();
+
+ public EventDirectoryItem(Event event) {
+ base (event, Dimensions(CROPPED_SCALE, CROPPED_SCALE), get_formatted_title(event), event.get_comment(), true,
+ Pango.Alignment.CENTER);
+
+ this.event = event;
+
+ // find the center square
+ paul_lynde = get_paul_lynde_rect(event.get_primary_source());
+
+ // don't display yet, but claim its dimensions
+ clear_image(Dimensions.for_rectangle(paul_lynde));
+
+ // monitor the event for changes
+ Event.global.items_altered.connect(on_events_altered);
+ }
+
+ ~EventDirectoryItem() {
+ Event.global.items_altered.disconnect(on_events_altered);
+ }
+
+ // square the photo's dimensions and locate the pixbuf's center square
+ private static Gdk.Rectangle get_paul_lynde_rect(MediaSource source) {
+ Dimensions scaled = squared_scaling.get_scaled_dimensions(source.get_dimensions());
+
+ Gdk.Rectangle paul_lynde = Gdk.Rectangle();
+ paul_lynde.x = (scaled.width - CROPPED_SCALE).clamp(0, scaled.width) / 2;
+ paul_lynde.y = (scaled.height - CROPPED_SCALE).clamp(0, scaled.height) / 2;
+ paul_lynde.width = CROPPED_SCALE;
+ paul_lynde.height = CROPPED_SCALE;
+
+ return paul_lynde;
+ }
+
+ // scale and crop the center square of the media
+ private static Gdk.Pixbuf get_paul_lynde(MediaSource media, Gdk.Rectangle paul_lynde) throws Error {
+ Gdk.Pixbuf pixbuf = media.get_preview_pixbuf(squared_scaling);
+
+ Dimensions thumbnail_dimensions = Dimensions.for_pixbuf(pixbuf);
+
+ if (thumbnail_dimensions.width > 2 * paul_lynde.width ||
+ thumbnail_dimensions.height > paul_lynde.height * 2 ) {
+ LibraryPhoto photo = (LibraryPhoto) media;
+ pixbuf = photo.get_pixbuf(squared_scaling);
+ thumbnail_dimensions = Dimensions.for_pixbuf(pixbuf);
+ }
+
+ // to catch rounding errors in the two algorithms
+ paul_lynde = clamp_rectangle(paul_lynde, thumbnail_dimensions);
+
+ // crop the center square
+ return new Gdk.Pixbuf.subpixbuf(pixbuf, paul_lynde.x, paul_lynde.y, paul_lynde.width,
+ paul_lynde.height);
+ }
+
+ private static string get_formatted_title(Event event) {
+ bool has_photos = MediaSourceCollection.has_photo(event.get_media());
+ bool has_videos = MediaSourceCollection.has_video(event.get_media());
+
+ int count = event.get_media_count();
+ string count_text = "";
+ if (has_photos && has_videos)
+ count_text = ngettext("%d Photo/Video", "%d Photos/Videos", count).printf(count);
+ else if (has_videos)
+ count_text = ngettext("%d Video", "%d Videos", count).printf(count);
+ else
+ count_text = ngettext("%d Photo", "%d Photos", count).printf(count);
+
+ string? daterange = event.get_formatted_daterange();
+ string name = event.get_name();
+
+ // if we don't have a daterange or if it's the same as name, then don't print it; otherwise
+ // print it beneath the preview photo
+ if (daterange == null || daterange == name)
+ return "<b>%s</b>\n%s".printf(guarded_markup_escape_text(name),
+ guarded_markup_escape_text(count_text));
+ else
+ return "<b>%s</b>\n%s\n%s".printf(guarded_markup_escape_text(name),
+ guarded_markup_escape_text(count_text), guarded_markup_escape_text(daterange));
+ }
+
+ public override void exposed() {
+ if (is_exposed())
+ return;
+
+ try {
+ set_image(get_paul_lynde(event.get_primary_source(), paul_lynde));
+ } catch (Error err) {
+ critical("Unable to fetch preview for %s: %s", event.to_string(), err.message);
+ }
+
+ update_comment();
+
+ base.exposed();
+ }
+
+ public override void unexposed() {
+ if (!is_exposed())
+ return;
+
+ clear_image(Dimensions.for_rectangle(paul_lynde));
+
+ base.unexposed();
+ }
+
+ private void on_events_altered(Gee.Map<DataObject, Alteration> map) {
+ update_comment();
+ if (map.has_key(event))
+ set_title(get_formatted_title(event), true, Pango.Alignment.CENTER);
+ }
+
+ protected override void thumbnail_altered() {
+ MediaSource media = event.get_primary_source();
+
+ // get new center square
+ paul_lynde = get_paul_lynde_rect(media);
+
+ if (is_exposed()) {
+ try {
+ set_image(get_paul_lynde(media, paul_lynde));
+ } catch (Error err) {
+ critical("Unable to fetch preview for %s: %s", event.to_string(), err.message);
+ }
+ } else {
+ clear_image(Dimensions.for_rectangle(paul_lynde));
+ }
+
+ base.thumbnail_altered();
+ }
+
+ protected override void paint_shadow(Cairo.Context ctx, Dimensions dimensions, Gdk.Point origin,
+ int radius, float initial_alpha) {
+ Dimensions altered = Dimensions(dimensions.width - 25, dimensions.height - 25);
+ base.paint_shadow(ctx, altered, origin, 36, initial_alpha);
+ }
+
+ protected override void paint_border(Cairo.Context ctx, Dimensions object_dimensions,
+ Gdk.Point object_origin, int border_width) {
+ Dimensions dimensions = get_border_dimensions(object_dimensions, border_width);
+ Gdk.Point origin = get_border_origin(object_origin, border_width);
+
+ draw_rounded_corners_filled(ctx, dimensions, origin, 6.0);
+ }
+
+ protected override void paint_image(Cairo.Context ctx, Gdk.Pixbuf pixbuf,
+ Gdk.Point origin) {
+ Dimensions dimensions = Dimensions.for_pixbuf(pixbuf);
+
+ if (pixbuf.get_has_alpha())
+ draw_rounded_corners_filled(ctx, dimensions, origin, 6.0);
+
+ // use rounded corners on events
+ context_rounded_corners(ctx, dimensions, origin, 6.0);
+ Gdk.cairo_set_source_pixbuf(ctx, pixbuf, origin.x, origin.y);
+ ctx.paint();
+ }
+
+ private void update_comment(bool init = false) {
+ string comment = event.get_comment();
+ if (is_string_empty(comment))
+ clear_comment();
+ else if (!init)
+ set_comment(comment);
+ else
+ set_comment("");
+ }
+}
+
+
diff --git a/src/events/EventPage.vala b/src/events/EventPage.vala
new file mode 100644
index 0000000..3d23f25
--- /dev/null
+++ b/src/events/EventPage.vala
@@ -0,0 +1,162 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class EventPage : CollectionPage {
+ private Event page_event;
+
+ public EventPage(Event page_event) {
+ base (page_event.get_name());
+
+ this.page_event = page_event;
+ page_event.mirror_photos(get_view(), create_thumbnail);
+
+ init_page_context_menu("/EventContextMenu");
+
+ Event.global.items_altered.connect(on_events_altered);
+ }
+
+ public Event get_event() {
+ return page_event;
+ }
+
+ protected override bool on_app_key_pressed(Gdk.EventKey event) {
+ // If and only if one image is selected, propagate F2 to the rest of
+ // the window, otherwise, consume it here - if we don't do this, it'll
+ // either let us re-title multiple images at the same time or
+ // spuriously highlight the event name in the sidebar for editing...
+ if (Gdk.keyval_name(event.keyval) == "F2") {
+ if (get_view().get_selected_count() != 1) {
+ return true;
+ }
+ }
+
+ return base.on_app_key_pressed(event);
+ }
+
+ ~EventPage() {
+ Event.global.items_altered.disconnect(on_events_altered);
+ get_view().halt_mirroring();
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("event.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] new_actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry make_primary = { "MakePrimary", Resources.MAKE_PRIMARY,
+ TRANSLATABLE, null, TRANSLATABLE, on_make_primary };
+ make_primary.label = Resources.MAKE_KEY_PHOTO_MENU;
+ new_actions += make_primary;
+
+ Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, null, TRANSLATABLE, on_rename };
+ rename.label = Resources.RENAME_EVENT_MENU;
+ new_actions += rename;
+
+ Gtk.ActionEntry comment = { "EditEventComment", null, TRANSLATABLE, null,
+ Resources.EDIT_EVENT_COMMENT_MENU, on_edit_comment};
+ comment.label = Resources.EDIT_EVENT_COMMENT_MENU;
+ new_actions += comment;
+
+ return new_actions;
+ }
+
+ protected override void init_actions(int selected_count, int count) {
+ base.init_actions(selected_count, count);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_sensitive("MakePrimary", selected_count == 1);
+
+ // hide this command in CollectionPage, as it does not apply here
+ set_action_visible("CommonJumpToEvent", false);
+
+ base.update_actions(selected_count, count);
+
+ // this is always valid; if the user has right-clicked in an empty area,
+ // change the comment on the event itself.
+ set_action_sensitive("EditEventComment", true);
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_event_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by);
+ }
+
+ private void on_events_altered(Gee.Map<DataObject, Alteration> map) {
+ if (map.has_key(page_event))
+ set_page_name(page_event.get_name());
+ }
+
+ protected override void on_edit_comment() {
+ if (get_view().get_selected_count() == 0) {
+ EditCommentDialog edit_comment_dialog = new EditCommentDialog(page_event.get_comment(),
+ true);
+ string? new_comment = edit_comment_dialog.execute();
+ if (new_comment == null)
+ return;
+
+ EditEventCommentCommand command = new EditEventCommentCommand(page_event, new_comment);
+ get_command_manager().execute(command);
+ return;
+ }
+
+ base.on_edit_comment();
+ }
+
+ private void on_make_primary() {
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ page_event.set_primary_source((MediaSource) get_view().get_selected_at(0).get_source());
+ }
+
+ private void on_rename() {
+ LibraryWindow.get_app().rename_event_in_sidebar(page_event);
+ }
+}
+
+public class NoEventPage : CollectionPage {
+ public const string NAME = _("No Event");
+
+ // This seems very similar to EventSourceCollection -> ViewManager
+ private class NoEventViewManager : CollectionViewManager {
+ public NoEventViewManager(NoEventPage page) {
+ base (page);
+ }
+
+ // this is not threadsafe
+ public override bool include_in_view(DataSource source) {
+ return (((MediaSource) source).get_event_id().id != EventID.INVALID) ? false :
+ base.include_in_view(source);
+ }
+ }
+
+ private static Alteration no_event_page_alteration = new Alteration("metadata", "event");
+
+ public NoEventPage() {
+ base (NAME);
+
+ ViewManager filter = new NoEventViewManager(this);
+ get_view().monitor_source_collection(LibraryPhoto.global, filter, no_event_page_alteration);
+ get_view().monitor_source_collection(Video.global, filter, no_event_page_alteration);
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_event_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by);
+ }
+}
+
diff --git a/src/events/Events.vala b/src/events/Events.vala
new file mode 100644
index 0000000..dc2b662
--- /dev/null
+++ b/src/events/Events.vala
@@ -0,0 +1,18 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Events {
+
+public void init() throws Error {
+ Events.Branch.init();
+}
+
+public void terminate() {
+ Events.Branch.terminate();
+}
+
+}
+
diff --git a/src/events/EventsDirectoryPage.vala b/src/events/EventsDirectoryPage.vala
new file mode 100644
index 0000000..41a1ac6
--- /dev/null
+++ b/src/events/EventsDirectoryPage.vala
@@ -0,0 +1,313 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public abstract class EventsDirectoryPage : CheckerboardPage {
+ public class EventDirectoryManager : ViewManager {
+ public override DataView create_view(DataSource source) {
+ return new EventDirectoryItem((Event) source);
+ }
+ }
+
+ private class EventsDirectorySearchViewFilter : SearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT;
+ }
+
+ public override bool predicate(DataView view) {
+ assert(view.get_source() is Event);
+ if (is_string_empty(get_search_filter()))
+ return true;
+
+ Event source = (Event) view.get_source();
+ unowned string? event_keywords = source.get_indexable_keywords();
+ if (is_string_empty(event_keywords))
+ return false;
+
+ // Return false if the word isn't found, true otherwise.
+ foreach (unowned string word in get_search_filter_words()) {
+ if (!event_keywords.contains(word))
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ private const int MIN_PHOTOS_FOR_PROGRESS_WINDOW = 50;
+
+ protected ViewManager view_manager;
+
+ private EventsDirectorySearchViewFilter search_filter = new EventsDirectorySearchViewFilter();
+
+ public EventsDirectoryPage(string page_name, ViewManager view_manager,
+ Gee.Collection<Event>? initial_events) {
+ base (page_name);
+
+ // set comparator before monitoring source collection, to prevent a re-sort
+ get_view().set_comparator(get_event_comparator(Config.Facade.get_instance().get_events_sort_ascending()),
+ event_comparator_predicate);
+ get_view().monitor_source_collection(Event.global, view_manager, null, initial_events);
+
+ get_view().set_property(Event.PROP_SHOW_COMMENTS,
+ Config.Facade.get_instance().get_display_event_comments());
+
+ init_item_context_menu("/EventsDirectoryContextMenu");
+
+ this.view_manager = view_manager;
+
+ // set up page's toolbar (used by AppWindow for layout and FullscreenWindow as a popup)
+ Gtk.Toolbar toolbar = get_toolbar();
+
+ // merge tool
+ Gtk.ToolButton merge_button = new Gtk.ToolButton.from_stock(Resources.MERGE);
+ merge_button.set_related_action(get_action("Merge"));
+
+ toolbar.insert(merge_button, -1);
+ }
+
+ ~EventsDirectoryPage() {
+ Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+ assert(action != null);
+ action.changed.disconnect(on_sort_changed);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ ui_filenames.add("events_directory.ui");
+
+ base.init_collect_ui_filenames(ui_filenames);
+ }
+
+ protected static bool event_comparator_predicate(DataObject object, Alteration alteration) {
+ return alteration.has_detail("metadata", "time");
+ }
+
+ private static int64 event_ascending_comparator(void *a, void *b) {
+ time_t start_a = ((EventDirectoryItem *) a)->event.get_start_time();
+ time_t start_b = ((EventDirectoryItem *) b)->event.get_start_time();
+
+ return start_a - start_b;
+ }
+
+ private static int64 event_descending_comparator(void *a, void *b) {
+ return event_ascending_comparator(b, a);
+ }
+
+ private static Comparator get_event_comparator(bool ascending) {
+ if (ascending)
+ return event_ascending_comparator;
+ else
+ return event_descending_comparator;
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, "F2", TRANSLATABLE, on_rename };
+ rename.label = Resources.RENAME_EVENT_MENU;
+ actions += rename;
+
+ Gtk.ActionEntry merge = { "Merge", Resources.MERGE, TRANSLATABLE, null, Resources.MERGE_TOOLTIP,
+ on_merge };
+ merge.label = Resources.MERGE_MENU;
+ actions += merge;
+
+ Gtk.ActionEntry comment = { "EditComment", null, TRANSLATABLE, null, Resources.EDIT_COMMENT_MENU,
+ on_edit_comment };
+ comment.label = Resources.EDIT_COMMENT_MENU;
+ actions += comment;
+
+ return actions;
+ }
+
+ protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
+ Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
+
+ Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
+ TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_event_comments() };
+ comments.label = _("_Comments");
+ comments.tooltip = _("Display the comment of each event");
+ toggle_actions += comments;
+
+ return toggle_actions;
+ }
+
+ protected override void init_actions(int selected_count, int count) {
+ base.init_actions(selected_count, count);
+
+ Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+ assert(action != null);
+ action.changed.connect(on_sort_changed);
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_sensitive("Merge", selected_count > 1);
+ set_action_important("Merge", true);
+ set_action_sensitive("Rename", selected_count == 1);
+ set_action_sensitive("EditComment", selected_count == 1);
+
+ base.update_actions(selected_count, count);
+ }
+
+ protected override string get_view_empty_message() {
+ return _("No events");
+ }
+
+ protected override string get_filter_no_match_message() {
+ return _("No events found");
+ }
+
+ public override void on_item_activated(CheckerboardItem item, CheckerboardPage.Activator
+ activator, CheckerboardPage.KeyboardModifiers modifiers) {
+ EventDirectoryItem event = (EventDirectoryItem) item;
+ LibraryWindow.get_app().switch_to_event(event.event);
+ }
+
+ private void on_sort_changed(Gtk.Action action, Gtk.Action c) {
+ Gtk.RadioAction current = (Gtk.RadioAction) c;
+
+ get_view().set_comparator(
+ get_event_comparator(current.current_value == LibraryWindow.SORT_EVENTS_ORDER_ASCENDING),
+ event_comparator_predicate);
+ }
+
+ private void on_rename() {
+ // only rename one at a time
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ EventDirectoryItem item = (EventDirectoryItem) get_view().get_selected_at(0);
+
+ EventRenameDialog rename_dialog = new EventRenameDialog(item.event.get_raw_name());
+ string? new_name = rename_dialog.execute();
+ if (new_name == null)
+ return;
+
+ RenameEventCommand command = new RenameEventCommand(item.event, new_name);
+ get_command_manager().execute(command);
+ }
+
+ protected void on_edit_comment() {
+ // only edit one at a time
+ if (get_view().get_selected_count() != 1)
+ return;
+
+ EventDirectoryItem item = (EventDirectoryItem) get_view().get_selected_at(0);
+
+ EditCommentDialog edit_comment_dialog = new EditCommentDialog(item.event.get_comment());
+ string? new_comment = edit_comment_dialog.execute();
+ if (new_comment == null)
+ return;
+
+ EditEventCommentCommand command = new EditEventCommentCommand(item.event, new_comment);
+ get_command_manager().execute(command);
+ }
+
+ private void on_merge() {
+ if (get_view().get_selected_count() <= 1)
+ return;
+
+ MergeEventsCommand command = new MergeEventsCommand(get_view().get_selected());
+ get_command_manager().execute(command);
+ }
+
+ private void on_display_comments(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ set_display_comments(display);
+
+ Config.Facade.get_instance().set_display_event_comments(display);
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
+public class MasterEventsDirectoryPage : EventsDirectoryPage {
+ public const string NAME = _("Events");
+
+ public MasterEventsDirectoryPage() {
+ base (NAME, new EventDirectoryManager(), (Gee.Collection<Event>) Event.global.get_all());
+ }
+}
+
+public class SubEventsDirectoryPage : EventsDirectoryPage {
+ public enum DirectoryType {
+ YEAR,
+ MONTH,
+ UNDATED;
+ }
+
+ public const string UNDATED_PAGE_NAME = _("Undated");
+ public const string YEAR_FORMAT = _("%Y");
+ public const string MONTH_FORMAT = _("%B");
+
+ private class SubEventDirectoryManager : EventsDirectoryPage.EventDirectoryManager {
+ private int month = 0;
+ private int year = 0;
+ DirectoryType type;
+
+ public SubEventDirectoryManager(DirectoryType type, Time time) {
+ base();
+
+ if (type == DirectoryType.MONTH)
+ month = time.month;
+ this.type = type;
+ year = time.year;
+ }
+
+ public override bool include_in_view(DataSource source) {
+ if (!base.include_in_view(source))
+ return false;
+
+ EventSource event = (EventSource) source;
+ Time event_time = Time.local(event.get_start_time());
+ if (event_time.year == year) {
+ if (type == DirectoryType.MONTH) {
+ return (event_time.month == month);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public int get_month() {
+ return month;
+ }
+
+ public int get_year() {
+ return year;
+ }
+
+ public DirectoryType get_event_directory_type() {
+ return type;
+ }
+ }
+
+ public SubEventsDirectoryPage(DirectoryType type, Time time) {
+ string page_name;
+ if (type == SubEventsDirectoryPage.DirectoryType.UNDATED) {
+ page_name = UNDATED_PAGE_NAME;
+ } else {
+ page_name = time.format((type == DirectoryType.YEAR) ? YEAR_FORMAT : MONTH_FORMAT);
+ }
+
+ base(page_name, new SubEventDirectoryManager(type, time), null);
+ }
+
+ public int get_month() {
+ return ((SubEventDirectoryManager) view_manager).get_month();
+ }
+
+ public int get_year() {
+ return ((SubEventDirectoryManager) view_manager).get_year();
+ }
+
+ public DirectoryType get_event_directory_type() {
+ return ((SubEventDirectoryManager) view_manager).get_event_directory_type();
+ }
+}
+
diff --git a/src/events/mk/events.mk b/src/events/mk/events.mk
new file mode 100644
index 0000000..d09fc0f
--- /dev/null
+++ b/src/events/mk/events.mk
@@ -0,0 +1,32 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Events
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := events
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ EventsDirectoryPage.vala \
+ EventPage.vala \
+ EventDirectoryItem.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Sidebar
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/folders/Branch.vala b/src/folders/Branch.vala
new file mode 100644
index 0000000..bc5b578
--- /dev/null
+++ b/src/folders/Branch.vala
@@ -0,0 +1,198 @@
+/* Copyright 2012-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Folders.Branch : Sidebar.Branch {
+ private Gee.HashMap<File, Folders.SidebarEntry> entries =
+ new Gee.HashMap<File, Folders.SidebarEntry>(file_hash, file_equal);
+ private File home_dir;
+
+ public class Branch() {
+ base (new Folders.Root(), Sidebar.Branch.Options.STARTUP_OPEN_GROUPING, comparator);
+
+ home_dir = File.new_for_path(Environment.get_home_dir());
+
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all()) {
+ // seed
+ on_media_contents_altered(sources.get_all(), null);
+
+ // monitor
+ sources.contents_altered.connect(on_media_contents_altered);
+ }
+ }
+
+ ~Branch() {
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
+ sources.contents_altered.disconnect(on_media_contents_altered);
+ }
+
+ private static int comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ int coll_key_equality = strcmp(((Folders.SidebarEntry) a).collation,
+ ((Folders.SidebarEntry) b).collation);
+
+ if (coll_key_equality == 0) {
+ // Collation keys were the same, double-check that
+ // these really are the same string...
+ return strcmp(((Folders.SidebarEntry) a).get_sidebar_name(),
+ ((Folders.SidebarEntry) b).get_sidebar_name());
+ }
+
+ return coll_key_equality;
+ }
+
+ private void on_master_source_replaced(MediaSource media_source, File old_file, File new_file) {
+ remove_entry(old_file);
+ add_entry(media_source);
+ }
+
+ private void on_media_contents_altered(Gee.Iterable<DataObject>? added, Gee.Iterable<DataObject>? removed) {
+ if (added != null) {
+ foreach (DataObject object in added) {
+ add_entry((MediaSource) object);
+ ((MediaSource) object).master_replaced.connect(on_master_source_replaced);
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ remove_entry(((MediaSource) object).get_file());
+ ((MediaSource) object).master_replaced.disconnect(on_master_source_replaced);
+ }
+ }
+ }
+
+ void add_entry(MediaSource media) {
+ File file = media.get_file();
+
+ Gee.ArrayList<File> elements = new Gee.ArrayList<File>();
+
+ // add the path elements in reverse order up to home directory
+ File? parent = file.get_parent();
+ while (parent != null) {
+ // don't process paths above the user's home directory
+ if (parent.equal(home_dir.get_parent()))
+ break;
+
+ elements.add(parent);
+
+ parent = parent.get_parent();
+ }
+
+ // walk path elements in order from home directory down, building needed sidebar entries
+ // along the way
+ Folders.SidebarEntry? parent_entry = null;
+ for (int ctr = elements.size - 1; ctr >= 0; ctr--) {
+ File parent_dir = elements[ctr];
+
+ // save current parent, needed if this entry needs to be grafted
+ Folders.SidebarEntry? old_parent_entry = parent_entry;
+
+ parent_entry = entries.get(parent_dir);
+ if (parent_entry == null) {
+ parent_entry = new Folders.SidebarEntry(parent_dir);
+ entries.set(parent_dir, parent_entry);
+
+ graft((old_parent_entry == null) ? get_root() : old_parent_entry, parent_entry);
+ }
+
+ // only increment entry's file count if File is going in this folder
+ if (ctr == 0)
+ parent_entry.count++;
+ }
+ }
+
+ private void remove_entry(File file) {
+ Folders.SidebarEntry? folder_entry = entries.get(file.get_parent());
+ if (folder_entry == null)
+ return;
+
+ assert(folder_entry.count > 0);
+
+ // decrement file count for folder of photo
+ if (--folder_entry.count > 0 || get_child_count(folder_entry) > 0)
+ return;
+
+ // empty folder so prune tree
+ Folders.SidebarEntry? prune_point = folder_entry;
+ assert(prune_point != null);
+
+ for (;;) {
+ bool removed = entries.unset(prune_point.dir);
+ assert(removed);
+
+ Folders.SidebarEntry? parent = get_parent(prune_point) as Folders.SidebarEntry;
+ if (parent == null || parent.count != 0 || get_child_count(parent) > 1)
+ break;
+
+ prune_point = parent;
+ }
+
+ prune(prune_point);
+ }
+}
+
+private class Folders.Root : Sidebar.Grouping {
+ public Root() {
+ base (_("Folders"), Folders.opened_icon, Folders.closed_icon);
+ }
+}
+
+public class Folders.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.ExpandableEntry {
+ public File dir { get; private set; }
+ public string collation { get; private set; }
+
+ private int _count = 0;
+ public int count {
+ get {
+ return _count;
+ }
+
+ set {
+ int prev_count = _count;
+ _count = value;
+
+ // when count change 0->1 and 1->0 may need refresh icon
+ if ((prev_count == 0 && _count == 1) || (prev_count == 1 && _count == 0))
+ sidebar_icon_changed(get_sidebar_icon());
+
+ }
+ }
+
+ public SidebarEntry(File dir) {
+ this.dir = dir;
+ collation = g_utf8_collate_key_for_filename(dir.get_path());
+ }
+
+ public override string get_sidebar_name() {
+ return dir.get_basename();
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return count == 0 ? closed_icon : have_photos_icon;
+ }
+
+ public override string to_string() {
+ return dir.get_path();
+ }
+
+ public Icon? get_sidebar_open_icon() {
+ return count == 0 ? opened_icon : have_photos_icon;
+ }
+
+ public Icon? get_sidebar_closed_icon() {
+ return count == 0 ? closed_icon : have_photos_icon;
+ }
+
+ public bool expand_on_select() {
+ return true;
+ }
+
+ protected override global::Page create_page() {
+ return new Folders.Page(dir);
+ }
+}
diff --git a/src/folders/Folders.vala b/src/folders/Folders.vala
new file mode 100644
index 0000000..1cc14b1
--- /dev/null
+++ b/src/folders/Folders.vala
@@ -0,0 +1,35 @@
+/* Copyright 2012-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Folders unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Folders {
+
+static Icon? opened_icon = null;
+static Icon? closed_icon = null;
+static Icon? have_photos_icon = null;
+
+public void init() throws Error {
+ opened_icon = new ThemedIcon(Resources.ICON_FOLDER_OPEN);
+ closed_icon = new ThemedIcon(Resources.ICON_FOLDER_CLOSED);
+ have_photos_icon = new ThemedIcon(Resources.ICON_FOLDER_DOCUMENTS);
+}
+
+public void terminate() {
+ opened_icon = null;
+ closed_icon = null;
+ have_photos_icon = null;
+}
+
+}
+
diff --git a/src/folders/Page.vala b/src/folders/Page.vala
new file mode 100644
index 0000000..d101e88
--- /dev/null
+++ b/src/folders/Page.vala
@@ -0,0 +1,41 @@
+/* Copyright 2012-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Folders.Page : CollectionPage {
+ private class FolderViewManager : CollectionViewManager {
+ public File dir;
+
+ public FolderViewManager(Folders.Page owner, File dir) {
+ base (owner);
+
+ this.dir = dir;
+ }
+
+ public override bool include_in_view(DataSource source) {
+ return ((MediaSource) source).get_file().has_prefix(dir);
+ }
+ }
+
+ private FolderViewManager view_manager;
+
+ public Page(File dir) {
+ base (dir.get_path());
+
+ view_manager = new FolderViewManager(this, dir);
+
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
+ get_view().monitor_source_collection(sources, view_manager, null);
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_library_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_library_photos_sort(sort_order, sort_by);
+ }
+}
+
diff --git a/src/folders/mk/folders.mk b/src/folders/mk/folders.mk
new file mode 100644
index 0000000..d0023d7
--- /dev/null
+++ b/src/folders/mk/folders.mk
@@ -0,0 +1,31 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Folders
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := folders
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ Page.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Sidebar \
+ Photos
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/library/Branch.vala b/src/library/Branch.vala
new file mode 100644
index 0000000..dc05d60
--- /dev/null
+++ b/src/library/Branch.vala
@@ -0,0 +1,54 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.Branch : Sidebar.RootOnlyBranch {
+ public Branch() {
+ base (new Library.SidebarEntry());
+ }
+
+ public Library.MainPage get_main_page() {
+ return (Library.MainPage) ((Library.SidebarEntry) get_root()).get_page();
+ }
+}
+
+public class Library.SidebarEntry : Sidebar.SimplePageEntry {
+ private Icon icon = new ThemedIcon(Resources.ICON_PHOTOS);
+
+ public SidebarEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return Library.MainPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return icon;
+ }
+
+ protected override Page create_page() {
+ return new Library.MainPage();
+ }
+}
+
+public class Library.MainPage : CollectionPage {
+ public const string NAME = _("Library");
+
+ public MainPage(ProgressMonitor? monitor = null) {
+ base (NAME);
+
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
+ get_view().monitor_source_collection(sources, new CollectionViewManager(this), null, null, monitor);
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_library_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_library_photos_sort(sort_order, sort_by);
+ }
+}
+
diff --git a/src/library/FlaggedBranch.vala b/src/library/FlaggedBranch.vala
new file mode 100644
index 0000000..472d999
--- /dev/null
+++ b/src/library/FlaggedBranch.vala
@@ -0,0 +1,61 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.FlaggedBranch : Sidebar.RootOnlyBranch {
+ public FlaggedBranch() {
+ base (new Library.FlaggedSidebarEntry());
+
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.flagged_contents_altered.connect(on_flagged_contents_altered);
+
+ set_show_branch(get_total_flagged() != 0);
+ }
+
+ ~FlaggedBranch() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.flagged_contents_altered.disconnect(on_flagged_contents_altered);
+ }
+
+ private void on_flagged_contents_altered() {
+ set_show_branch(get_total_flagged() != 0);
+ }
+
+ private int get_total_flagged() {
+ int total = 0;
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ total += media_sources.get_flagged().size;
+
+ return total;
+ }
+}
+
+public class Library.FlaggedSidebarEntry : Sidebar.SimplePageEntry, Sidebar.InternalDropTargetEntry {
+ public FlaggedSidebarEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return FlaggedPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return new ThemedIcon(Resources.ICON_FLAGGED_PAGE);
+ }
+
+ protected override Page create_page() {
+ return new FlaggedPage();
+ }
+
+ public bool internal_drop_received(Gee.List<MediaSource> media) {
+ AppWindow.get_command_manager().execute(new FlagUnflagCommand(media, true));
+
+ return true;
+ }
+
+ public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
+ return false;
+ }
+}
+
diff --git a/src/library/FlaggedPage.vala b/src/library/FlaggedPage.vala
new file mode 100644
index 0000000..28bc57b
--- /dev/null
+++ b/src/library/FlaggedPage.vala
@@ -0,0 +1,54 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class FlaggedPage : CollectionPage {
+ public const string NAME = _("Flagged");
+
+ private class FlaggedViewManager : CollectionViewManager {
+ public FlaggedViewManager(FlaggedPage owner) {
+ base (owner);
+ }
+
+ public override bool include_in_view(DataSource source) {
+ Flaggable? flaggable = source as Flaggable;
+
+ return (flaggable != null) && flaggable.is_flagged();
+ }
+ }
+
+ private class FlaggedSearchViewFilter : CollectionPage.CollectionSearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.MEDIA |
+ SearchFilterCriteria.RATING;
+ }
+ }
+
+ private ViewManager view_manager;
+ private Alteration prereq = new Alteration("metadata", "flagged");
+ private FlaggedSearchViewFilter search_filter = new FlaggedSearchViewFilter();
+
+ public FlaggedPage() {
+ base (NAME);
+
+ view_manager = new FlaggedViewManager(this);
+
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
+ get_view().monitor_source_collection(sources, view_manager, prereq);
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_library_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_library_photos_sort(sort_order, sort_by);
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
diff --git a/src/library/ImportQueueBranch.vala b/src/library/ImportQueueBranch.vala
new file mode 100644
index 0000000..32a3e0d
--- /dev/null
+++ b/src/library/ImportQueueBranch.vala
@@ -0,0 +1,74 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.ImportQueueBranch : Sidebar.RootOnlyBranch {
+ private Library.ImportQueueSidebarEntry entry;
+
+ public ImportQueueBranch() {
+ // can't pass to base() an object that was allocated in declaration; see
+ // https://bugzilla.gnome.org/show_bug.cgi?id=646286
+ base (new Library.ImportQueueSidebarEntry());
+
+ entry = (Library.ImportQueueSidebarEntry) get_root();
+
+ // only attach signals to the page when it's created
+ entry.page_created.connect(on_page_created);
+ entry.destroying_page.connect(on_destroying_page);
+
+ // don't use entry.get_page() or get_queue_page() because (a) we don't want to
+ // create the page during initialization, and (b) we know there's no import activity
+ // at this moment
+ set_show_branch(false);
+ }
+
+ ~ImportQueueBranch() {
+ entry.page_created.disconnect(on_page_created);
+ entry.destroying_page.disconnect(on_destroying_page);
+ }
+
+ public ImportQueuePage get_queue_page() {
+ return (ImportQueuePage) entry.get_page();
+ }
+
+ private void on_page_created() {
+ get_queue_page().batch_added.connect(on_batch_added_or_removed);
+ get_queue_page().batch_removed.connect(on_batch_added_or_removed);
+ }
+
+ private void on_destroying_page() {
+ get_queue_page().batch_added.disconnect(on_batch_added_or_removed);
+ get_queue_page().batch_removed.disconnect(on_batch_added_or_removed);
+ }
+
+ private void on_batch_added_or_removed() {
+ set_show_branch(get_queue_page().get_batch_count() > 0);
+ }
+
+ public void enqueue_and_schedule(BatchImport batch_import, bool allow_user_cancel) {
+ // want to display the branch before passing to the page because this might result in the
+ // page being created, and want it all hooked up in the tree prior to creating the page
+ set_show_branch(true);
+ get_queue_page().enqueue_and_schedule(batch_import, allow_user_cancel);
+ }
+}
+
+public class Library.ImportQueueSidebarEntry : Sidebar.SimplePageEntry {
+ public ImportQueueSidebarEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return ImportQueuePage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return new ThemedIcon(Resources.ICON_IMPORTING);
+ }
+
+ protected override Page create_page() {
+ return new ImportQueuePage();
+ }
+}
+
diff --git a/src/library/ImportQueuePage.vala b/src/library/ImportQueuePage.vala
new file mode 100644
index 0000000..5ace1d8
--- /dev/null
+++ b/src/library/ImportQueuePage.vala
@@ -0,0 +1,208 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class ImportQueuePage : SinglePhotoPage {
+ public const string NAME = _("Importing...");
+
+ private Gee.ArrayList<BatchImport> queue = new Gee.ArrayList<BatchImport>();
+ private Gee.HashSet<BatchImport> cancel_unallowed = new Gee.HashSet<BatchImport>();
+ private BatchImport current_batch = null;
+ private Gtk.ProgressBar progress_bar = new Gtk.ProgressBar();
+ private bool stopped = false;
+
+#if UNITY_SUPPORT
+ UnityProgressBar uniprobar = UnityProgressBar.get_instance();
+#endif
+
+ public signal void batch_added(BatchImport batch_import);
+
+ public signal void batch_removed(BatchImport batch_import);
+
+ public ImportQueuePage() {
+ base (NAME, false);
+
+ // Set up toolbar
+ Gtk.Toolbar toolbar = get_toolbar();
+
+ // Stop button
+ Gtk.ToolButton stop_button = new Gtk.ToolButton.from_stock(Gtk.Stock.STOP);
+ stop_button.set_related_action(get_action("Stop"));
+
+ toolbar.insert(stop_button, -1);
+
+ // separator to force progress bar to right side of toolbar
+ Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
+ separator.set_draw(false);
+
+ toolbar.insert(separator, -1);
+
+ // Progress bar
+ Gtk.ToolItem progress_item = new Gtk.ToolItem();
+ progress_item.set_expand(true);
+ progress_item.add(progress_bar);
+ progress_bar.set_show_text(true);
+
+ toolbar.insert(progress_item, -1);
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw progress bar
+ uniprobar.set_visible(true);
+#endif
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ ui_filenames.add("import_queue.ui");
+
+ base.init_collect_ui_filenames(ui_filenames);
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry stop = { "Stop", Gtk.Stock.STOP, TRANSLATABLE, null, TRANSLATABLE,
+ on_stop };
+ stop.label = _("_Stop Import");
+ stop.tooltip = _("Stop importing photos");
+ actions += stop;
+
+ return actions;
+ }
+
+ public void enqueue_and_schedule(BatchImport batch_import, bool allow_user_cancel) {
+ assert(!queue.contains(batch_import));
+
+ batch_import.starting.connect(on_starting);
+ batch_import.preparing.connect(on_preparing);
+ batch_import.progress.connect(on_progress);
+ batch_import.imported.connect(on_imported);
+ batch_import.import_complete.connect(on_import_complete);
+ batch_import.fatal_error.connect(on_fatal_error);
+
+ if (!allow_user_cancel)
+ cancel_unallowed.add(batch_import);
+
+ queue.add(batch_import);
+ batch_added(batch_import);
+
+ if (queue.size == 1)
+ batch_import.schedule();
+
+ update_stop_action();
+ }
+
+ public int get_batch_count() {
+ return queue.size;
+ }
+
+ private void update_stop_action() {
+ set_action_sensitive("Stop", !cancel_unallowed.contains(current_batch) && queue.size > 0);
+ }
+
+ private void on_stop() {
+ update_stop_action();
+
+ if (queue.size == 0)
+ return;
+
+ AppWindow.get_instance().set_busy_cursor();
+ stopped = true;
+
+ // mark all as halted and let each signal failure
+ foreach (BatchImport batch_import in queue)
+ batch_import.user_halt();
+ }
+
+ private void on_starting(BatchImport batch_import) {
+ update_stop_action();
+ current_batch = batch_import;
+ }
+
+ private void on_preparing() {
+ progress_bar.set_text(_("Preparing to import..."));
+ progress_bar.pulse();
+ }
+
+ private void on_progress(uint64 completed_bytes, uint64 total_bytes) {
+ double pct = (completed_bytes <= total_bytes) ? (double) completed_bytes / (double) total_bytes
+ : 0.0;
+ progress_bar.set_fraction(pct);
+#if UNITY_SUPPORT
+ //UnityProgressBar: set progress
+ uniprobar.set_progress(pct);
+#endif
+ }
+
+ private void on_imported(ThumbnailSource source, Gdk.Pixbuf pixbuf, int to_follow) {
+ // only interested in updating the display for the last of the bunch
+ if (to_follow > 0 || !is_in_view())
+ return;
+
+ set_pixbuf(pixbuf, Dimensions.for_pixbuf(pixbuf));
+
+ // set the singleton collection to this item
+ get_view().clear();
+ (source is LibraryPhoto) ? get_view().add(new PhotoView(source as LibraryPhoto)) :
+ get_view().add(new VideoView(source as Video));
+
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.MIDDLE);
+ progress_bar.set_text(_("Imported %s").printf(source.get_name()));
+ }
+
+ private void on_import_complete(BatchImport batch_import, ImportManifest manifest,
+ BatchImportRoll import_roll) {
+ assert(batch_import == current_batch);
+ current_batch = null;
+
+ assert(queue.size > 0);
+ assert(queue.get(0) == batch_import);
+
+ bool removed = queue.remove(batch_import);
+ assert(removed);
+
+ // fail quietly if cancel was allowed
+ cancel_unallowed.remove(batch_import);
+
+ // strip signal handlers
+ batch_import.starting.disconnect(on_starting);
+ batch_import.preparing.disconnect(on_preparing);
+ batch_import.progress.disconnect(on_progress);
+ batch_import.imported.disconnect(on_imported);
+ batch_import.import_complete.disconnect(on_import_complete);
+ batch_import.fatal_error.disconnect(on_fatal_error);
+
+ // schedule next if available
+ if (queue.size > 0) {
+ queue.get(0).schedule();
+ } else {
+ // reset UI
+ progress_bar.set_ellipsize(Pango.EllipsizeMode.NONE);
+ progress_bar.set_text("");
+ progress_bar.set_fraction(0.0);
+#if UNITY_SUPPORT
+ //UnityProgressBar: reset
+ uniprobar.reset();
+#endif
+
+ // blank the display
+ blank_display();
+
+ // reset cursor if cancelled
+ if (stopped)
+ AppWindow.get_instance().set_normal_cursor();
+
+ stopped = false;
+ }
+
+ update_stop_action();
+
+ // report the batch has been removed from the queue after everything else is set
+ batch_removed(batch_import);
+ }
+
+ private void on_fatal_error(ImportResult result, string message) {
+ AppWindow.error_message(message);
+ }
+}
+
diff --git a/src/library/LastImportBranch.vala b/src/library/LastImportBranch.vala
new file mode 100644
index 0000000..bc03ee5
--- /dev/null
+++ b/src/library/LastImportBranch.vala
@@ -0,0 +1,47 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.LastImportBranch : Sidebar.RootOnlyBranch {
+ public LastImportBranch() {
+ base (new Library.LastImportSidebarEntry());
+
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.import_roll_altered.connect(on_import_rolls_altered);
+
+ set_show_branch(MediaCollectionRegistry.get_instance().get_last_import_id() != null);
+ }
+
+ ~LastImportBranch() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.import_roll_altered.disconnect(on_import_rolls_altered);
+ }
+
+ public Library.LastImportSidebarEntry get_main_entry() {
+ return (Library.LastImportSidebarEntry) get_root();
+ }
+
+ private void on_import_rolls_altered() {
+ set_show_branch(MediaCollectionRegistry.get_instance().get_last_import_id() != null);
+ }
+}
+
+public class Library.LastImportSidebarEntry : Sidebar.SimplePageEntry {
+ public LastImportSidebarEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return LastImportPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return new ThemedIcon(Resources.ICON_LAST_IMPORT);
+ }
+
+ protected override Page create_page() {
+ return new LastImportPage();
+ }
+}
+
diff --git a/src/library/LastImportPage.vala b/src/library/LastImportPage.vala
new file mode 100644
index 0000000..877faa5
--- /dev/null
+++ b/src/library/LastImportPage.vala
@@ -0,0 +1,79 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class LastImportPage : CollectionPage {
+ public const string NAME = _("Last Import");
+
+ private class LastImportViewManager : CollectionViewManager {
+ private ImportID import_id;
+
+ public LastImportViewManager(LastImportPage owner, ImportID import_id) {
+ base (owner);
+
+ this.import_id = import_id;
+ }
+
+ public override bool include_in_view(DataSource source) {
+ return ((MediaSource) source).get_import_id().id == import_id.id;
+ }
+ }
+
+ private ImportID last_import_id = ImportID();
+ private Alteration last_import_alteration = new Alteration("metadata", "import-id");
+
+ public LastImportPage() {
+ base (NAME);
+
+ // be notified when the import rolls change
+ foreach (MediaSourceCollection col in MediaCollectionRegistry.get_instance().get_all()) {
+ col.import_roll_altered.connect(on_import_rolls_altered);
+ }
+
+ // set up view manager for the last import roll
+ on_import_rolls_altered();
+ }
+
+ ~LastImportPage() {
+ foreach (MediaSourceCollection col in MediaCollectionRegistry.get_instance().get_all()) {
+ col.import_roll_altered.disconnect(on_import_rolls_altered);
+ }
+ }
+
+ private void on_import_rolls_altered() {
+ // see if there's a new last ImportID, or no last import at all
+ ImportID? current_last_import_id =
+ MediaCollectionRegistry.get_instance().get_last_import_id();
+
+ if (current_last_import_id == null) {
+ get_view().halt_all_monitoring();
+ get_view().clear();
+
+ return;
+ }
+
+ if (current_last_import_id.id == last_import_id.id)
+ return;
+
+ last_import_id = current_last_import_id;
+
+ get_view().halt_all_monitoring();
+ get_view().clear();
+
+ foreach (MediaSourceCollection col in MediaCollectionRegistry.get_instance().get_all()) {
+ get_view().monitor_source_collection(col, new LastImportViewManager(this,
+ last_import_id), last_import_alteration);
+ }
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_library_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_library_photos_sort(sort_order, sort_by);
+ }
+}
+
diff --git a/src/library/Library.vala b/src/library/Library.vala
new file mode 100644
index 0000000..79a4880
--- /dev/null
+++ b/src/library/Library.vala
@@ -0,0 +1,19 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Library {
+
+public void init() throws Error {
+ Library.TrashSidebarEntry.init();
+ Photo.develop_raw_photos_to_files = true;
+}
+
+public void terminate() {
+ Library.TrashSidebarEntry.terminate();
+}
+
+}
+
diff --git a/src/library/LibraryWindow.vala b/src/library/LibraryWindow.vala
new file mode 100644
index 0000000..dab1f6f
--- /dev/null
+++ b/src/library/LibraryWindow.vala
@@ -0,0 +1,1587 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class LibraryWindow : AppWindow {
+ public const int SIDEBAR_MIN_WIDTH = 224;
+ public const int SIDEBAR_MAX_WIDTH = 320;
+
+ public static int PAGE_MIN_WIDTH {
+ get {
+ return Thumbnail.MAX_SCALE + (CheckerboardLayout.COLUMN_GUTTER_PADDING * 2);
+ }
+ }
+
+ public const int SORT_EVENTS_ORDER_ASCENDING = 0;
+ public const int SORT_EVENTS_ORDER_DESCENDING = 1;
+
+ private const string[] SUPPORTED_MOUNT_SCHEMES = {
+ "gphoto2:",
+ "disk:",
+ "file:"
+ };
+
+ private const int BACKGROUND_PROGRESS_PULSE_MSEC = 250;
+
+ // If we're not operating on at least this many files, don't display the progress
+ // bar at all; otherwise, it'll go by too quickly, giving the appearance of a glitch.
+ const int MIN_PROGRESS_BAR_FILES = 20;
+
+ // these values reflect the priority various background operations have when reporting
+ // progress to the LibraryWindow progress bar ... higher values give priority to those reports
+ private const int STARTUP_SCAN_PROGRESS_PRIORITY = 35;
+ private const int REALTIME_UPDATE_PROGRESS_PRIORITY = 40;
+ private const int REALTIME_IMPORT_PROGRESS_PRIORITY = 50;
+ private const int METADATA_WRITER_PROGRESS_PRIORITY = 30;
+
+ // This lists the order of the toplevel items in the sidebar. New toplevel items should be
+ // added here in the position they should appear in the sidebar. To re-order, simply move
+ // the item in this list to a new position. These numbers should *not* persist anywhere
+ // outside the app.
+ private enum SidebarRootPosition {
+ LIBRARY,
+ FLAGGED,
+ LAST_IMPORTED,
+ CAMERAS,
+ IMPORT_QUEUE,
+ SAVED_SEARCH,
+ EVENTS,
+ FOLDERS,
+ TAGS,
+ TRASH,
+ OFFLINE
+ }
+
+ public enum TargetType {
+ URI_LIST,
+ MEDIA_LIST,
+ TAG_PATH
+ }
+
+ public const string TAG_PATH_MIME_TYPE = "shotwell/tag-path";
+ public const string MEDIA_LIST_MIME_TYPE = "shotwell/media-id-atom";
+
+ public const Gtk.TargetEntry[] DND_TARGET_ENTRIES = {
+ { "text/uri-list", Gtk.TargetFlags.OTHER_APP, TargetType.URI_LIST },
+ { MEDIA_LIST_MIME_TYPE, Gtk.TargetFlags.SAME_APP, TargetType.MEDIA_LIST },
+ { TAG_PATH_MIME_TYPE, Gtk.TargetFlags.SAME_WIDGET, TargetType.TAG_PATH }
+ };
+
+ // In fullscreen mode, want to use LibraryPhotoPage, but fullscreen has different requirements,
+ // esp. regarding when the widget is realized and when it should first try and throw them image
+ // on the page. This handles this without introducing lots of special cases in
+ // LibraryPhotoPage.
+ private class FullscreenPhotoPage : LibraryPhotoPage {
+ private CollectionPage collection;
+ private Photo start;
+ private ViewCollection? view;
+
+ public FullscreenPhotoPage(CollectionPage collection, Photo start, ViewCollection? view) {
+ this.collection = collection;
+ this.start = start;
+ this.view = view;
+ }
+
+ public override void switched_to() {
+ display_for_collection(collection, start, view);
+
+ base.switched_to();
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ // We intentionally don't call the base class here since we don't want the
+ // top-level menu in photo.ui.
+ ui_filenames.add("photo_context.ui");
+ }
+
+ }
+
+ private string import_dir = Environment.get_home_dir();
+
+ private Gtk.Paned sidebar_paned = new Gtk.Paned(Gtk.Orientation.VERTICAL);
+ private Gtk.Paned client_paned = new Gtk.Paned(Gtk.Orientation.HORIZONTAL);
+ private Gtk.Frame bottom_frame = new Gtk.Frame(null);
+
+ private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("LibraryWindowGlobalActionGroup");
+
+ private OneShotScheduler properties_scheduler = null;
+ private bool notify_library_is_home_dir = true;
+
+ // Sidebar tree and roots (ordered by SidebarRootPosition)
+ private Sidebar.Tree sidebar_tree;
+ private Library.Branch library_branch = new Library.Branch();
+ private Tags.Branch tags_branch = new Tags.Branch();
+ private Folders.Branch folders_branch = new Folders.Branch();
+ private Library.TrashBranch trash_branch = new Library.TrashBranch();
+ private Events.Branch events_branch = new Events.Branch();
+ private Library.OfflineBranch offline_branch = new Library.OfflineBranch();
+ private Library.FlaggedBranch flagged_branch = new Library.FlaggedBranch();
+ private Library.LastImportBranch last_import_branch = new Library.LastImportBranch();
+ private Library.ImportQueueBranch import_queue_branch = new Library.ImportQueueBranch();
+ private Camera.Branch camera_branch = new Camera.Branch();
+ private Searches.Branch saved_search_branch = new Searches.Branch();
+ private bool page_switching_enabled = true;
+
+ private Gee.HashMap<Page, Sidebar.Entry> page_map = new Gee.HashMap<Page, Sidebar.Entry>();
+
+ private LibraryPhotoPage photo_page = null;
+
+ // this is to keep track of cameras which initiate the app
+ private static Gee.HashSet<string> initial_camera_uris = new Gee.HashSet<string>();
+
+ private bool is_search_toolbar_visible = false;
+
+ // Want to instantiate this in the constructor rather than here because the search bar has its
+ // own UIManager which will suck up the accelerators, and we want them to be associated with
+ // AppWindows instead.
+ private SearchFilterActions search_actions = new SearchFilterActions();
+ private SearchFilterToolbar search_toolbar;
+
+ private Gtk.Box top_section = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ private Gtk.Frame background_progress_frame = new Gtk.Frame(null);
+ private Gtk.ProgressBar background_progress_bar = new Gtk.ProgressBar();
+ private bool background_progress_displayed = false;
+
+ private BasicProperties basic_properties = new BasicProperties();
+ private ExtendedPropertiesWindow extended_properties;
+
+ private Gtk.Notebook notebook = new Gtk.Notebook();
+ private Gtk.Box layout = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ private Gtk.Box right_vbox;
+
+ private int current_progress_priority = 0;
+ private uint background_progress_pulse_id = 0;
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: init
+ UnityProgressBar uniprobar = UnityProgressBar.get_instance();
+#endif
+
+ public LibraryWindow(ProgressMonitor progress_monitor) {
+ // prep sidebar and add roots
+ sidebar_tree = new Sidebar.Tree(DND_TARGET_ENTRIES, Gdk.DragAction.ASK,
+ external_drop_handler);
+
+ sidebar_tree.page_created.connect(on_page_created);
+ sidebar_tree.destroying_page.connect(on_destroying_page);
+ sidebar_tree.entry_selected.connect(on_sidebar_entry_selected);
+ sidebar_tree.selected_entry_removed.connect(on_sidebar_selected_entry_removed);
+
+ sidebar_tree.graft(library_branch, SidebarRootPosition.LIBRARY);
+ sidebar_tree.graft(tags_branch, SidebarRootPosition.TAGS);
+ sidebar_tree.graft(folders_branch, SidebarRootPosition.FOLDERS);
+ sidebar_tree.graft(trash_branch, SidebarRootPosition.TRASH);
+ sidebar_tree.graft(events_branch, SidebarRootPosition.EVENTS);
+ sidebar_tree.graft(offline_branch, SidebarRootPosition.OFFLINE);
+ sidebar_tree.graft(flagged_branch, SidebarRootPosition.FLAGGED);
+ sidebar_tree.graft(last_import_branch, SidebarRootPosition.LAST_IMPORTED);
+ sidebar_tree.graft(import_queue_branch, SidebarRootPosition.IMPORT_QUEUE);
+ sidebar_tree.graft(camera_branch, SidebarRootPosition.CAMERAS);
+ sidebar_tree.graft(saved_search_branch, SidebarRootPosition.SAVED_SEARCH);
+
+ // create and connect extended properties window
+ extended_properties = new ExtendedPropertiesWindow(this);
+ extended_properties.hide.connect(hide_extended_properties);
+ extended_properties.show.connect(show_extended_properties);
+
+ properties_scheduler = new OneShotScheduler("LibraryWindow properties",
+ on_update_properties_now);
+
+ // setup search bar and add its accelerators to the window
+ search_toolbar = new SearchFilterToolbar(search_actions);
+
+ try {
+ File ui_file = Resources.get_ui("top.ui");
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error e) {
+ error(e.message);
+ }
+
+ Gtk.MenuBar? menubar = ui.get_widget("/MenuBar") as Gtk.MenuBar;
+ layout.add(menubar);
+
+ // We never want to invoke show_all() on the menubar since that will show empty menus,
+ // which should be hidden.
+ menubar.no_show_all = true;
+
+ // create the main layout & start at the Library page
+ create_layout(library_branch.get_main_page());
+
+ // settings that should persist between sessions
+ load_configuration();
+
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all()) {
+ media_sources.trashcan_contents_altered.connect(on_trashcan_contents_altered);
+ media_sources.items_altered.connect(on_media_altered);
+ }
+
+ // set up main window as a drag-and-drop destination (rather than each page; assume
+ // a drag and drop is for general library import, which means it goes to library_page)
+ Gtk.TargetEntry[] main_window_dnd_targets = {
+ DND_TARGET_ENTRIES[TargetType.URI_LIST],
+ DND_TARGET_ENTRIES[TargetType.MEDIA_LIST]
+ /* the main window accepts URI lists and media lists but not tag paths -- yet; we
+ might wish to support dropping tags onto photos at some future point */
+ };
+ Gtk.drag_dest_set(this, Gtk.DestDefaults.ALL, main_window_dnd_targets,
+ Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.ASK);
+
+ MetadataWriter.get_instance().progress.connect(on_metadata_writer_progress);
+
+ LibraryMonitor? monitor = LibraryMonitorPool.get_instance().get_monitor();
+ if (monitor != null)
+ on_library_monitor_installed(monitor);
+
+ LibraryMonitorPool.get_instance().monitor_installed.connect(on_library_monitor_installed);
+ LibraryMonitorPool.get_instance().monitor_destroyed.connect(on_library_monitor_destroyed);
+
+ CameraTable.get_instance().camera_added.connect(on_camera_added);
+
+ background_progress_bar.set_show_text(true);
+
+ }
+
+ ~LibraryWindow() {
+ sidebar_tree.page_created.disconnect(on_page_created);
+ sidebar_tree.destroying_page.disconnect(on_destroying_page);
+ sidebar_tree.entry_selected.disconnect(on_sidebar_entry_selected);
+ sidebar_tree.selected_entry_removed.disconnect(on_sidebar_selected_entry_removed);
+
+ unsubscribe_from_basic_information(get_current_page());
+
+ extended_properties.hide.disconnect(hide_extended_properties);
+ extended_properties.show.disconnect(show_extended_properties);
+
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all()) {
+ media_sources.trashcan_contents_altered.disconnect(on_trashcan_contents_altered);
+ media_sources.items_altered.disconnect(on_media_altered);
+ }
+
+ MetadataWriter.get_instance().progress.disconnect(on_metadata_writer_progress);
+
+ LibraryMonitor? monitor = LibraryMonitorPool.get_instance().get_monitor();
+ if (monitor != null)
+ on_library_monitor_destroyed(monitor);
+
+ LibraryMonitorPool.get_instance().monitor_installed.disconnect(on_library_monitor_installed);
+ LibraryMonitorPool.get_instance().monitor_destroyed.disconnect(on_library_monitor_destroyed);
+
+ CameraTable.get_instance().camera_added.disconnect(on_camera_added);
+ }
+
+ private void on_library_monitor_installed(LibraryMonitor monitor) {
+ debug("on_library_monitor_installed: %s", monitor.get_root().get_path());
+
+ monitor.discovery_started.connect(on_library_monitor_discovery_started);
+ monitor.discovery_completed.connect(on_library_monitor_discovery_completed);
+ monitor.closed.connect(on_library_monitor_discovery_completed);
+ monitor.auto_update_progress.connect(on_library_monitor_auto_update_progress);
+ monitor.auto_import_preparing.connect(on_library_monitor_auto_import_preparing);
+ monitor.auto_import_progress.connect(on_library_monitor_auto_import_progress);
+ }
+
+ private void on_library_monitor_destroyed(LibraryMonitor monitor) {
+ debug("on_library_monitor_destroyed: %s", monitor.get_root().get_path());
+
+ monitor.discovery_started.disconnect(on_library_monitor_discovery_started);
+ monitor.discovery_completed.disconnect(on_library_monitor_discovery_completed);
+ monitor.closed.disconnect(on_library_monitor_discovery_completed);
+ monitor.auto_update_progress.disconnect(on_library_monitor_auto_update_progress);
+ monitor.auto_import_preparing.disconnect(on_library_monitor_auto_import_preparing);
+ monitor.auto_import_progress.disconnect(on_library_monitor_auto_import_progress);
+ }
+
+ private Gtk.ActionEntry[] create_common_actions() {
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry import = { "CommonFileImport", Resources.IMPORT,
+ TRANSLATABLE, "<Ctrl>I", TRANSLATABLE, on_file_import };
+ import.label = _("_Import From Folder...");
+ import.tooltip = _("Import photos from disk to library");
+ actions += import;
+
+ Gtk.ActionEntry import_from_external = {
+ "ExternalLibraryImport", Resources.IMPORT, TRANSLATABLE,
+ null, TRANSLATABLE, on_external_library_import
+ };
+ import_from_external.label = _("Import From _Application...");
+ actions += import_from_external;
+
+ Gtk.ActionEntry sort = { "CommonSortEvents", null, TRANSLATABLE, null, null, null };
+ sort.label = _("Sort _Events");
+ actions += sort;
+
+ Gtk.ActionEntry preferences = { "CommonPreferences", Gtk.Stock.PREFERENCES, TRANSLATABLE,
+ null, TRANSLATABLE, on_preferences };
+ preferences.label = Resources.PREFERENCES_MENU;
+ actions += preferences;
+
+ Gtk.ActionEntry empty = { "CommonEmptyTrash", Gtk.Stock.CLEAR, TRANSLATABLE, null, null,
+ on_empty_trash };
+ empty.label = _("Empty T_rash");
+ empty.tooltip = _("Delete all photos in the trash");
+ actions += empty;
+
+ Gtk.ActionEntry jump_to_event = { "CommonJumpToEvent", null, TRANSLATABLE, null,
+ TRANSLATABLE, on_jump_to_event };
+ jump_to_event.label = _("View Eve_nt for Photo");
+ actions += jump_to_event;
+
+ Gtk.ActionEntry find = { "CommonFind", Gtk.Stock.FIND, TRANSLATABLE, null, null,
+ on_find };
+ find.label = _("_Find");
+ find.tooltip = _("Find photos and videos by search criteria");
+ actions += find;
+
+ // add the common action for the FilterPhotos submenu (the submenu contains items from
+ // SearchFilterActions)
+ Gtk.ActionEntry filter_photos = { "CommonFilterPhotos", null, TRANSLATABLE, null, null, null };
+ filter_photos.label = Resources.FILTER_PHOTOS_MENU;
+ actions += filter_photos;
+
+ Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, "<Ctrl>S", null,
+ on_new_search };
+ new_search.label = _("Ne_w Saved Search...");
+ actions += new_search;
+
+ // top-level menus
+
+ Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
+ file.label = _("_File");
+ actions += file;
+
+ Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
+ edit.label = _("_Edit");
+ actions += edit;
+
+ Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
+ view.label = _("_View");
+ actions += view;
+
+ Gtk.ActionEntry photo = { "PhotoMenu", null, TRANSLATABLE, null, null, null };
+ photo.label = _("_Photo");
+ actions += photo;
+
+ Gtk.ActionEntry photos = { "PhotosMenu", null, TRANSLATABLE, null, null, null };
+ photos.label = _("_Photos");
+ actions += photos;
+
+ Gtk.ActionEntry event = { "EventsMenu", null, TRANSLATABLE, null, null, null };
+ event.label = _("Even_ts");
+ actions += event;
+
+ Gtk.ActionEntry tags = { "TagsMenu", null, TRANSLATABLE, null, null, null };
+ tags.label = _("Ta_gs");
+ actions += tags;
+
+ Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
+ help.label = _("_Help");
+ actions += help;
+
+ return actions;
+ }
+
+ private Gtk.ToggleActionEntry[] create_common_toggle_actions() {
+ Gtk.ToggleActionEntry[] actions = new Gtk.ToggleActionEntry[0];
+
+ Gtk.ToggleActionEntry basic_props = { "CommonDisplayBasicProperties", null,
+ TRANSLATABLE, "<Ctrl><Shift>I", TRANSLATABLE, on_display_basic_properties, false };
+ basic_props.label = _("_Basic Information");
+ basic_props.tooltip = _("Display basic information for the selection");
+ actions += basic_props;
+
+ Gtk.ToggleActionEntry extended_props = { "CommonDisplayExtendedProperties", null,
+ TRANSLATABLE, "<Ctrl><Shift>X", TRANSLATABLE, on_display_extended_properties, false };
+ extended_props.label = _("E_xtended Information");
+ extended_props.tooltip = _("Display extended information for the selection");
+ actions += extended_props;
+
+ Gtk.ToggleActionEntry searchbar = { "CommonDisplaySearchbar", Gtk.Stock.FIND, TRANSLATABLE,
+ "F8", TRANSLATABLE, on_display_searchbar, is_search_toolbar_visible };
+ searchbar.label = _("_Search Bar");
+ searchbar.tooltip = _("Display the search bar");
+ actions += searchbar;
+
+ Gtk.ToggleActionEntry sidebar = { "CommonDisplaySidebar", null, TRANSLATABLE,
+ "F9", TRANSLATABLE, on_display_sidebar, is_sidebar_visible() };
+ sidebar.label = _("S_idebar");
+ sidebar.tooltip = _("Display the sidebar");
+ actions += sidebar;
+
+ return actions;
+ }
+
+ private void add_common_radio_actions(Gtk.ActionGroup group) {
+ Gtk.RadioActionEntry[] actions = new Gtk.RadioActionEntry[0];
+
+ Gtk.RadioActionEntry ascending = { "CommonSortEventsAscending",
+ Gtk.Stock.SORT_ASCENDING, TRANSLATABLE, null, TRANSLATABLE,
+ SORT_EVENTS_ORDER_ASCENDING };
+ ascending.label = _("_Ascending");
+ ascending.tooltip = _("Sort photos in an ascending order");
+ actions += ascending;
+
+ Gtk.RadioActionEntry descending = { "CommonSortEventsDescending",
+ Gtk.Stock.SORT_DESCENDING, TRANSLATABLE, null, TRANSLATABLE,
+ SORT_EVENTS_ORDER_DESCENDING };
+ descending.label = _("D_escending");
+ descending.tooltip = _("Sort photos in a descending order");
+ actions += descending;
+
+ group.add_radio_actions(actions, SORT_EVENTS_ORDER_ASCENDING, on_events_sort_changed);
+ }
+
+ protected override Gtk.ActionGroup[] create_common_action_groups() {
+ Gtk.ActionGroup[] groups = base.create_common_action_groups();
+
+ common_action_group.add_actions(create_common_actions(), this);
+ common_action_group.add_toggle_actions(create_common_toggle_actions(), this);
+ add_common_radio_actions(common_action_group);
+
+ Gtk.Action? action = common_action_group.get_action("CommonDisplaySearchbar");
+ if (action != null) {
+ action.short_label = Resources.FIND_LABEL;
+ action.is_important = true;
+ }
+
+ groups += common_action_group;
+ groups += search_actions.get_action_group();
+
+ return groups;
+ }
+
+ public override void replace_common_placeholders(Gtk.UIManager ui) {
+ base.replace_common_placeholders(ui);
+ }
+
+ protected override void switched_pages(Page? old_page, Page? new_page) {
+ base.switched_pages(old_page, new_page);
+
+ // monitor when the ViewFilter is changed in any page
+ if (old_page != null) {
+ old_page.get_view().view_filter_installed.disconnect(on_view_filter_installed);
+ old_page.get_view().view_filter_removed.disconnect(on_view_filter_removed);
+ }
+
+ if (new_page != null) {
+ new_page.get_view().view_filter_installed.connect(on_view_filter_installed);
+ new_page.get_view().view_filter_removed.connect(on_view_filter_removed);
+ }
+
+ search_actions.monitor_page_contents(old_page, new_page);
+ }
+
+ private void on_view_filter_installed(ViewFilter filter) {
+ filter.refresh.connect(on_view_filter_refreshed);
+ }
+
+ private void on_view_filter_removed(ViewFilter filter) {
+ filter.refresh.disconnect(on_view_filter_refreshed);
+ }
+
+ private void on_view_filter_refreshed() {
+ // if view filter is reset to show all items, do nothing (leave searchbar in current
+ // state)
+ if (!get_current_page().get_view().are_items_filtered_out())
+ return;
+
+ // always show the searchbar when items are filtered
+ Gtk.ToggleAction? display_searchbar = get_common_action("CommonDisplaySearchbar")
+ as Gtk.ToggleAction;
+ if (display_searchbar != null)
+ display_searchbar.active = true;
+ }
+
+ // show_all() may make visible certain items we wish to keep programmatically hidden
+ public override void show_all() {
+ base.show_all();
+
+ Gtk.ToggleAction? basic_properties_action = get_current_page().get_common_action(
+ "CommonDisplayBasicProperties") as Gtk.ToggleAction;
+ assert(basic_properties_action != null);
+
+ if (!basic_properties_action.get_active())
+ bottom_frame.hide();
+
+ Gtk.ToggleAction? searchbar_action = get_current_page().get_common_action(
+ "CommonDisplaySearchbar") as Gtk.ToggleAction;
+ assert(searchbar_action != null);
+
+ // Make sure rejected pictures are not being displayed on startup
+ CheckerboardPage? current_page = get_current_page() as CheckerboardPage;
+ if (current_page != null)
+ init_view_filter(current_page);
+
+ toggle_search_bar(should_show_search_bar(), current_page);
+
+ // Sidebar
+ set_sidebar_visible(is_sidebar_visible());
+ }
+
+ public static LibraryWindow get_app() {
+ assert(instance is LibraryWindow);
+
+ return (LibraryWindow) instance;
+ }
+
+ // This may be called before Debug.init(), so no error logging may be made
+ public static bool is_mount_uri_supported(string uri) {
+ foreach (string scheme in SUPPORTED_MOUNT_SCHEMES) {
+ if (uri.has_prefix(scheme))
+ return true;
+ }
+
+ return false;
+ }
+
+ public override string get_app_role() {
+ return Resources.APP_LIBRARY_ROLE;
+ }
+
+ public void rename_tag_in_sidebar(Tag tag) {
+ Tags.SidebarEntry? entry = tags_branch.get_entry_for_tag(tag);
+ if (entry != null)
+ sidebar_tree.rename_entry_in_place(entry);
+ else
+ debug("No tag entry found for rename");
+ }
+
+ public void rename_event_in_sidebar(Event event) {
+ Events.EventEntry? entry = events_branch.get_entry_for_event(event);
+ if (entry != null)
+ sidebar_tree.rename_entry_in_place(entry);
+ else
+ debug("No event entry found for rename");
+ }
+
+ public void rename_search_in_sidebar(SavedSearch search) {
+ Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
+ if (entry != null)
+ sidebar_tree.rename_entry_in_place(entry);
+ else
+ debug("No search entry found for rename");
+ }
+
+ protected override void on_quit() {
+ Config.Facade.get_instance().set_library_window_state(maximized, dimensions);
+
+ Config.Facade.get_instance().set_sidebar_position(client_paned.position);
+
+ base.on_quit();
+ }
+
+ private Photo? get_start_fullscreen_photo(CollectionPage page) {
+ ViewCollection view = page.get_view();
+
+ // if a selection is present, use the first selected LibraryPhoto, otherwise do
+ // nothing; if no selection present, use the first LibraryPhoto
+ Gee.List<DataSource>? sources = (view.get_selected_count() > 0)
+ ? view.get_selected_sources_of_type(typeof(LibraryPhoto))
+ : view.get_sources_of_type(typeof(LibraryPhoto));
+
+ return (sources != null && sources.size != 0)
+ ? (Photo) sources[0] : null;
+ }
+
+ private bool get_fullscreen_photo(Page page, out CollectionPage collection, out Photo start,
+ out ViewCollection? view_collection = null) {
+ collection = null;
+ start = null;
+ view_collection = null;
+
+ // fullscreen behavior depends on the type of page being looked at
+ if (page is CollectionPage) {
+ collection = (CollectionPage) page;
+ Photo? photo = get_start_fullscreen_photo(collection);
+ if (photo == null)
+ return false;
+
+ start = photo;
+ view_collection = null;
+
+ return true;
+ }
+
+ if (page is EventsDirectoryPage) {
+ ViewCollection view = page.get_view();
+ if (view.get_count() == 0)
+ return false;
+
+ Event? event = (Event?) ((DataView) view.get_at(0)).get_source();
+ if (event == null)
+ return false;
+
+ Events.EventEntry? entry = events_branch.get_entry_for_event(event);
+ if (entry == null)
+ return false;
+
+ collection = (EventPage) entry.get_page();
+ Photo? photo = get_start_fullscreen_photo(collection);
+ if (photo == null)
+ return false;
+
+ start = photo;
+ view_collection = null;
+
+ return true;
+ }
+
+ if (page is LibraryPhotoPage) {
+ LibraryPhotoPage photo_page = (LibraryPhotoPage) page;
+
+ CollectionPage? controller = photo_page.get_controller_page();
+ if (controller == null)
+ return false;
+
+ if (!photo_page.has_photo())
+ return false;
+
+ collection = controller;
+ start = photo_page.get_photo();
+ view_collection = photo_page.get_view();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ protected override void on_fullscreen() {
+ Page? current_page = get_current_page();
+ if (current_page == null)
+ return;
+
+ CollectionPage collection;
+ Photo start;
+ ViewCollection? view = null;
+ if (!get_fullscreen_photo(current_page, out collection, out start, out view))
+ return;
+
+ FullscreenPhotoPage fs_photo = new FullscreenPhotoPage(collection, start, view);
+
+ go_fullscreen(fs_photo);
+ }
+
+ private void on_file_import() {
+ Gtk.FileChooserDialog import_dialog = new Gtk.FileChooserDialog(_("Import From Folder"), null,
+ Gtk.FileChooserAction.SELECT_FOLDER, Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.Stock.OK, Gtk.ResponseType.OK);
+ import_dialog.set_local_only(false);
+ import_dialog.set_select_multiple(true);
+ import_dialog.set_current_folder(import_dir);
+
+ int response = import_dialog.run();
+
+ if (response == Gtk.ResponseType.OK) {
+ // force file linking if directory is inside current library directory
+ Gtk.ResponseType copy_files_response =
+ AppDirs.is_in_import_dir(File.new_for_uri(import_dialog.get_uri()))
+ ? Gtk.ResponseType.REJECT : copy_files_dialog();
+
+ if (copy_files_response != Gtk.ResponseType.CANCEL) {
+ dispatch_import_jobs(import_dialog.get_uris(), "folders",
+ copy_files_response == Gtk.ResponseType.ACCEPT);
+ }
+ }
+
+ import_dir = import_dialog.get_current_folder();
+ import_dialog.destroy();
+ }
+
+ private void on_external_library_import() {
+ Gtk.Dialog import_dialog = DataImportsUI.DataImportsDialog.get_or_create_instance();
+
+ import_dialog.run();
+ }
+
+ protected override void update_common_action_availability(Page? old_page, Page? new_page) {
+ base.update_common_action_availability(old_page, new_page);
+
+ bool is_checkerboard = new_page is CheckerboardPage;
+
+ set_common_action_sensitive("CommonDisplaySearchbar", is_checkerboard);
+ set_common_action_sensitive("CommonFind", is_checkerboard);
+ }
+
+ protected override void update_common_actions(Page page, int selected_count, int count) {
+ // see on_fullscreen for the logic here ... both CollectionPage and EventsDirectoryPage
+ // are CheckerboardPages (but in on_fullscreen have to be handled differently to locate
+ // the view controller)
+ CollectionPage collection;
+ Photo start;
+ bool can_fullscreen = get_fullscreen_photo(page, out collection, out start);
+
+ set_common_action_sensitive("CommonEmptyTrash", can_empty_trash());
+ set_common_action_visible("CommonJumpToEvent", true);
+ set_common_action_sensitive("CommonJumpToEvent", can_jump_to_event());
+ set_common_action_sensitive("CommonFullscreen", can_fullscreen);
+
+ base.update_common_actions(page, selected_count, count);
+ }
+
+ private void on_trashcan_contents_altered() {
+ set_common_action_sensitive("CommonEmptyTrash", can_empty_trash());
+ }
+
+ private bool can_empty_trash() {
+ return (LibraryPhoto.global.get_trashcan_count() > 0) || (Video.global.get_trashcan_count() > 0);
+ }
+
+ private void on_empty_trash() {
+ Gee.ArrayList<MediaSource> to_remove = new Gee.ArrayList<MediaSource>();
+ to_remove.add_all(LibraryPhoto.global.get_trashcan_contents());
+ to_remove.add_all(Video.global.get_trashcan_contents());
+
+ remove_from_app(to_remove, _("Empty Trash"), _("Emptying Trash..."));
+
+ AppWindow.get_command_manager().reset();
+ }
+
+ private void on_new_search() {
+ (new SavedSearchDialog()).show();
+ }
+
+ private bool can_jump_to_event() {
+ ViewCollection view = get_current_page().get_view();
+ if (view.get_selected_count() == 1) {
+ DataSource selected_source = view.get_selected_source_at(0);
+ if (selected_source is Event)
+ return true;
+ else if (selected_source is MediaSource)
+ return ((MediaSource) view.get_selected_source_at(0)).get_event() != null;
+ else
+ return false;
+ } else {
+ return false;
+ }
+ }
+
+ private void on_jump_to_event() {
+ ViewCollection view = get_current_page().get_view();
+
+ if (view.get_selected_count() != 1)
+ return;
+
+ MediaSource? media = view.get_selected_source_at(0) as MediaSource;
+ if (media == null)
+ return;
+
+ if (media.get_event() != null)
+ switch_to_event(media.get_event());
+ }
+
+ private void on_find() {
+ Gtk.ToggleAction action = (Gtk.ToggleAction) get_current_page().get_common_action(
+ "CommonDisplaySearchbar");
+ action.active = true;
+
+ // give it focus (which should move cursor to the text entry control)
+ search_toolbar.take_focus();
+ }
+
+ private void on_media_altered() {
+ set_common_action_sensitive("CommonJumpToEvent", can_jump_to_event());
+ }
+
+ private void on_clear_search() {
+ if (is_search_toolbar_visible)
+ search_actions.reset();
+ }
+
+ public int get_events_sort() {
+ Gtk.RadioAction? action = get_common_action("CommonSortEventsAscending") as Gtk.RadioAction;
+
+ return (action != null) ? action.current_value : SORT_EVENTS_ORDER_DESCENDING;
+ }
+
+ private void on_events_sort_changed(Gtk.Action action, Gtk.Action c) {
+ Gtk.RadioAction current = (Gtk.RadioAction) c;
+
+ Config.Facade.get_instance().set_events_sort_ascending(
+ current.current_value == SORT_EVENTS_ORDER_ASCENDING);
+ }
+
+ private void on_preferences() {
+ PreferencesDialog.show();
+ }
+
+ private void on_display_basic_properties(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ if (display) {
+ basic_properties.update_properties(get_current_page());
+ bottom_frame.show();
+ } else {
+ if (sidebar_paned.get_child2() != null) {
+ bottom_frame.hide();
+ }
+ }
+
+ // sync the setting so it will persist
+ Config.Facade.get_instance().set_display_basic_properties(display);
+ }
+
+ private void on_display_extended_properties(Gtk.Action action) {
+ bool display = ((Gtk.ToggleAction) action).get_active();
+
+ if (display) {
+ extended_properties.update_properties(get_current_page());
+ extended_properties.show_all();
+ } else {
+ extended_properties.hide();
+ }
+ }
+
+ private void on_display_searchbar(Gtk.Action action) {
+ bool is_shown = ((Gtk.ToggleAction) action).get_active();
+ Config.Facade.get_instance().set_display_search_bar(is_shown);
+ show_search_bar(is_shown);
+ }
+
+ public void show_search_bar(bool display) {
+ if (!(get_current_page() is CheckerboardPage))
+ return;
+
+ is_search_toolbar_visible = display;
+ toggle_search_bar(should_show_search_bar(), get_current_page() as CheckerboardPage);
+ if (!display)
+ search_actions.reset();
+ }
+
+ private void on_display_sidebar(Gtk.Action action) {
+ set_sidebar_visible(((Gtk.ToggleAction) action).get_active());
+
+ }
+
+ private void set_sidebar_visible(bool visible) {
+ sidebar_paned.set_visible(visible);
+ Config.Facade.get_instance().set_display_sidebar(visible);
+ }
+
+ private bool is_sidebar_visible() {
+ return Config.Facade.get_instance().get_display_sidebar();
+ }
+
+ private void show_extended_properties() {
+ sync_extended_properties(true);
+ }
+
+ private void hide_extended_properties() {
+ sync_extended_properties(false);
+ }
+
+ private void sync_extended_properties(bool show) {
+ Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
+ as Gtk.ToggleAction;
+ assert(extended_display_action != null);
+ extended_display_action.set_active(show);
+
+ // sync the setting so it will persist
+ Config.Facade.get_instance().set_display_extended_properties(show);
+ }
+
+ public void enqueue_batch_import(BatchImport batch_import, bool allow_user_cancel) {
+ import_queue_branch.enqueue_and_schedule(batch_import, allow_user_cancel);
+ }
+
+ private void import_reporter(ImportManifest manifest) {
+ ImportUI.report_manifest(manifest, true);
+ }
+
+ private void dispatch_import_jobs(GLib.SList<string> uris, string job_name, bool copy_to_library) {
+ if (AppDirs.get_import_dir().get_path() == Environment.get_home_dir() && notify_library_is_home_dir) {
+ Gtk.ResponseType response = AppWindow.affirm_cancel_question(
+ _("Shotwell is configured to import photos to your home directory.\n" +
+ "We recommend changing this in <span weight=\"bold\">Edit %s Preferences</span>.\n" +
+ "Do you want to continue importing photos?").printf("▸"),
+ _("_Import"), _("Library Location"), AppWindow.get_instance());
+
+ if (response == Gtk.ResponseType.CANCEL)
+ return;
+
+ notify_library_is_home_dir = false;
+ }
+
+ Gee.ArrayList<FileImportJob> jobs = new Gee.ArrayList<FileImportJob>();
+ foreach (string uri in uris) {
+ File file_or_dir = File.new_for_uri(uri);
+ if (file_or_dir.get_path() == null) {
+ // TODO: Specify which directory/file.
+ AppWindow.error_message(_("Photos cannot be imported from this directory."));
+
+ continue;
+ }
+
+ jobs.add(new FileImportJob(file_or_dir, copy_to_library));
+ }
+
+ if (jobs.size > 0) {
+ BatchImport batch_import = new BatchImport(jobs, job_name, import_reporter);
+ enqueue_batch_import(batch_import, true);
+ switch_to_import_queue_page();
+ }
+ }
+
+ private Gdk.DragAction get_drag_action() {
+ Gdk.ModifierType mask;
+
+ get_window().get_device_position(Gdk.Display.get_default().get_device_manager()
+ .get_client_pointer(), null, null, out mask);
+
+ bool ctrl = (mask & Gdk.ModifierType.CONTROL_MASK) != 0;
+ bool alt = (mask & Gdk.ModifierType.MOD1_MASK) != 0;
+ bool shift = (mask & Gdk.ModifierType.SHIFT_MASK) != 0;
+
+ if (ctrl && !alt && !shift)
+ return Gdk.DragAction.COPY;
+ else if (!ctrl && alt && !shift)
+ return Gdk.DragAction.ASK;
+ else if (ctrl && !alt && shift)
+ return Gdk.DragAction.LINK;
+ else
+ return Gdk.DragAction.DEFAULT;
+ }
+
+ public override bool drag_motion(Gdk.DragContext context, int x, int y, uint time) {
+ Gdk.Atom target = Gtk.drag_dest_find_target(this, context, Gtk.drag_dest_get_target_list(this));
+ // Want to use GDK_NONE (or, properly bound, Gdk.Atom.NONE) but GTK3 doesn't have it bound
+ // See: https://bugzilla.gnome.org/show_bug.cgi?id=655094
+ if (((int) target) == 0) {
+ debug("drag target is GDK_NONE");
+ Gdk.drag_status(context, 0, time);
+
+ return true;
+ }
+
+ // internal drag
+ if (Gtk.drag_get_source_widget(context) != null) {
+ Gdk.drag_status(context, Gdk.DragAction.PRIVATE, time);
+
+ return true;
+ }
+
+ // since we cannot set a default action, we must set it when we spy a drag motion
+ Gdk.DragAction drag_action = get_drag_action();
+
+ if (drag_action == Gdk.DragAction.DEFAULT)
+ drag_action = Gdk.DragAction.ASK;
+
+ Gdk.drag_status(context, drag_action, time);
+
+ return true;
+ }
+
+ public override void drag_data_received(Gdk.DragContext context, int x, int y,
+ Gtk.SelectionData selection_data, uint info, uint time) {
+ if (selection_data.get_data().length < 0)
+ debug("failed to retrieve SelectionData");
+
+ // If an external drop, piggyback on the sidebar ExternalDropHandler, otherwise it's an
+ // internal drop, which isn't handled by the main window
+ if (Gtk.drag_get_source_widget(context) == null)
+ external_drop_handler(context, null, selection_data, info, time);
+ else
+ Gtk.drag_finish(context, false, false, time);
+ }
+
+ private void external_drop_handler(Gdk.DragContext context, Sidebar.Entry? entry,
+ Gtk.SelectionData data, uint info, uint time) {
+ string[] uris_array = data.get_uris();
+
+ GLib.SList<string> uris = new GLib.SList<string>();
+ foreach (string uri in uris_array)
+ uris.append(uri);
+
+ Gdk.DragAction selected_action = context.get_selected_action();
+ if (selected_action == Gdk.DragAction.ASK) {
+ // Default action is to link, unless one or more URIs are external to the library
+ Gtk.ResponseType result = Gtk.ResponseType.REJECT;
+ foreach (string uri in uris) {
+ if (!AppDirs.is_in_import_dir(File.new_for_uri(uri))) {
+ result = copy_files_dialog();
+
+ break;
+ }
+ }
+
+ switch (result) {
+ case Gtk.ResponseType.ACCEPT:
+ selected_action = Gdk.DragAction.COPY;
+ break;
+
+ case Gtk.ResponseType.REJECT:
+ selected_action = Gdk.DragAction.LINK;
+ break;
+
+ default:
+ // cancelled
+ Gtk.drag_finish(context, false, false, time);
+
+ return;
+ }
+ }
+
+ dispatch_import_jobs(uris, "drag-and-drop", selected_action == Gdk.DragAction.COPY);
+
+ Gtk.drag_finish(context, true, false, time);
+ }
+
+ public void switch_to_library_page() {
+ switch_to_page(library_branch.get_main_page());
+ }
+
+ public void switch_to_event(Event event) {
+ Events.EventEntry? entry = events_branch.get_entry_for_event(event);
+ if (entry != null)
+ switch_to_page(entry.get_page());
+ }
+
+ public void switch_to_tag(Tag tag) {
+ Tags.SidebarEntry? entry = tags_branch.get_entry_for_tag(tag);
+ if (entry != null)
+ switch_to_page(entry.get_page());
+ }
+
+ public void switch_to_saved_search(SavedSearch search) {
+ Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
+ if (entry != null)
+ switch_to_page(entry.get_page());
+ }
+
+ public void switch_to_photo_page(CollectionPage controller, Photo current) {
+ assert(controller.get_view().get_view_for_source(current) != null);
+ if (photo_page == null) {
+ photo_page = new LibraryPhotoPage();
+ add_to_notebook(photo_page);
+
+ // need to do this to allow the event loop a chance to map and realize the page
+ // before switching to it
+ spin_event_loop();
+ }
+
+ photo_page.display_for_collection(controller, current);
+ switch_to_page(photo_page);
+ }
+
+ public void switch_to_import_queue_page() {
+ switch_to_page(import_queue_branch.get_queue_page());
+ }
+
+ private void on_camera_added(DiscoveredCamera camera) {
+ Camera.SidebarEntry? entry = camera_branch.get_entry_for_camera(camera);
+ if (entry == null)
+ return;
+
+ ImportPage page = (ImportPage) entry.get_page();
+ File uri_file = File.new_for_uri(camera.uri);
+
+ // find the VFS mount point
+ Mount mount = null;
+ try {
+ mount = uri_file.find_enclosing_mount(null);
+ } catch (Error err) {
+ // error means not mounted
+ }
+
+ // don't unmount mass storage cameras, as they are then unavailable to gPhoto
+ if (mount != null && !camera.uri.has_prefix("file://")) {
+ if (page.unmount_camera(mount))
+ switch_to_page(page);
+ else
+ error_message("Unable to unmount the camera at this time.");
+ } else {
+ switch_to_page(page);
+ }
+ }
+
+ // This should only be called by LibraryWindow and PageStub.
+ public void add_to_notebook(Page page) {
+ // need to show all before handing over to notebook
+ page.show_all();
+
+ int pos = notebook.append_page(page, null);
+ assert(pos >= 0);
+
+ // need to show_all() after pages are added and removed
+ notebook.show_all();
+ }
+
+ private void remove_from_notebook(Page page) {
+ notebook.remove(page);
+
+ // need to show_all() after pages are added and removed
+ notebook.show_all();
+ }
+
+ // check for settings that should persist between instances
+ private void load_configuration() {
+ Gtk.ToggleAction? basic_display_action = get_common_action("CommonDisplayBasicProperties")
+ as Gtk.ToggleAction;
+ assert(basic_display_action != null);
+ basic_display_action.set_active(Config.Facade.get_instance().get_display_basic_properties());
+
+ Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
+ as Gtk.ToggleAction;
+ assert(extended_display_action != null);
+ extended_display_action.set_active(Config.Facade.get_instance().get_display_extended_properties());
+
+ Gtk.ToggleAction? search_bar_display_action = get_common_action("CommonDisplaySearchbar")
+ as Gtk.ToggleAction;
+ assert(search_bar_display_action != null);
+ search_bar_display_action.set_active(Config.Facade.get_instance().get_display_search_bar());
+
+ Gtk.RadioAction? sort_events_action = get_common_action("CommonSortEventsAscending")
+ as Gtk.RadioAction;
+ assert(sort_events_action != null);
+
+ // Ticket #3321 - Event sorting order wasn't saving on exit.
+ // Instead of calling set_active against one of the toggles, call
+ // set_current_value against the entire radio group...
+ int event_sort_val = Config.Facade.get_instance().get_events_sort_ascending() ? SORT_EVENTS_ORDER_ASCENDING :
+ SORT_EVENTS_ORDER_DESCENDING;
+
+ sort_events_action.set_current_value(event_sort_val);
+ }
+
+ private void start_pulse_background_progress_bar(string label, int priority) {
+ if (priority < current_progress_priority)
+ return;
+
+ stop_pulse_background_progress_bar(priority, false);
+
+ current_progress_priority = priority;
+
+ background_progress_bar.set_text(label);
+ background_progress_bar.pulse();
+ show_background_progress_bar();
+
+ background_progress_pulse_id = Timeout.add(BACKGROUND_PROGRESS_PULSE_MSEC,
+ on_pulse_background_progress_bar);
+ }
+
+ private bool on_pulse_background_progress_bar() {
+ background_progress_bar.pulse();
+
+ return true;
+ }
+
+ private void stop_pulse_background_progress_bar(int priority, bool clear) {
+ if (priority < current_progress_priority)
+ return;
+
+ if (background_progress_pulse_id != 0) {
+ Source.remove(background_progress_pulse_id);
+ background_progress_pulse_id = 0;
+ }
+
+ if (clear)
+ clear_background_progress_bar(priority);
+ }
+
+ private void update_background_progress_bar(string label, int priority, double count,
+ double total) {
+ if (priority < current_progress_priority)
+ return;
+
+ stop_pulse_background_progress_bar(priority, false);
+
+ if (count <= 0.0 || total <= 0.0 || count >= total) {
+ clear_background_progress_bar(priority);
+
+ return;
+ }
+
+ current_progress_priority = priority;
+
+ double fraction = count / total;
+ background_progress_bar.set_fraction(fraction);
+ background_progress_bar.set_text(_("%s (%d%%)").printf(label, (int) (fraction * 100.0)));
+ show_background_progress_bar();
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: try to draw & set progress
+ uniprobar.set_visible(true);
+ uniprobar.set_progress(fraction);
+#endif
+ }
+
+ private void clear_background_progress_bar(int priority) {
+ if (priority < current_progress_priority)
+ return;
+
+ stop_pulse_background_progress_bar(priority, false);
+
+ current_progress_priority = 0;
+
+ background_progress_bar.set_fraction(0.0);
+ background_progress_bar.set_text("");
+ hide_background_progress_bar();
+
+#if UNITY_SUPPORT
+ //UnityProgressBar: reset
+ uniprobar.reset();
+#endif
+ }
+
+ private void show_background_progress_bar() {
+ if (!background_progress_displayed) {
+ top_section.pack_end(background_progress_frame, false, false, 0);
+ background_progress_frame.show_all();
+ background_progress_displayed = true;
+ }
+ }
+
+ private void hide_background_progress_bar() {
+ if (background_progress_displayed) {
+ top_section.remove(background_progress_frame);
+ background_progress_displayed = false;
+ }
+ }
+
+ private void on_library_monitor_discovery_started() {
+ start_pulse_background_progress_bar(_("Updating library..."), STARTUP_SCAN_PROGRESS_PRIORITY);
+ }
+
+ private void on_library_monitor_discovery_completed() {
+ stop_pulse_background_progress_bar(STARTUP_SCAN_PROGRESS_PRIORITY, true);
+ }
+
+ private void on_library_monitor_auto_update_progress(int completed_files, int total_files) {
+ if (total_files < MIN_PROGRESS_BAR_FILES)
+ clear_background_progress_bar(REALTIME_UPDATE_PROGRESS_PRIORITY);
+ else {
+ update_background_progress_bar(_("Updating library..."), REALTIME_UPDATE_PROGRESS_PRIORITY,
+ completed_files, total_files);
+ }
+ }
+
+ private void on_library_monitor_auto_import_preparing() {
+ start_pulse_background_progress_bar(_("Preparing to auto-import photos..."),
+ REALTIME_IMPORT_PROGRESS_PRIORITY);
+ }
+
+ private void on_library_monitor_auto_import_progress(uint64 completed_bytes, uint64 total_bytes) {
+ update_background_progress_bar(_("Auto-importing photos..."),
+ REALTIME_IMPORT_PROGRESS_PRIORITY, completed_bytes, total_bytes);
+ }
+
+ private void on_metadata_writer_progress(uint completed, uint total) {
+ if (total < MIN_PROGRESS_BAR_FILES)
+ clear_background_progress_bar(METADATA_WRITER_PROGRESS_PRIORITY);
+ else {
+ update_background_progress_bar(_("Writing metadata to files..."),
+ METADATA_WRITER_PROGRESS_PRIORITY, completed, total);
+ }
+ }
+
+ private void create_layout(Page start_page) {
+ // use a Notebook to hold all the pages, which are switched when a sidebar child is selected
+ notebook.set_show_tabs(false);
+ notebook.set_show_border(false);
+
+ // put the sidebar in a scrolling window
+ Gtk.ScrolledWindow scrolled_sidebar = new Gtk.ScrolledWindow(null, null);
+ scrolled_sidebar.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
+ scrolled_sidebar.add(sidebar_tree);
+ scrolled_sidebar.get_style_context().add_class(Gtk.STYLE_CLASS_SIDEBAR);
+ scrolled_sidebar.set_shadow_type(Gtk.ShadowType.IN);
+ get_style_context().add_class("sidebar-pane-separator");
+
+ // divy the sidebar up into selection tree list, background progress bar, and properties
+ Gtk.Frame top_frame = new Gtk.Frame(null);
+ top_frame.add(scrolled_sidebar);
+ top_frame.set_shadow_type(Gtk.ShadowType.IN);
+
+ background_progress_frame.add(background_progress_bar);
+ background_progress_frame.set_shadow_type(Gtk.ShadowType.IN);
+
+ // pad the bottom frame (properties)
+ Gtk.Alignment bottom_alignment = new Gtk.Alignment(0, 0.5f, 1, 0);
+
+ Resources.style_widget(scrolled_sidebar, Resources.SCROLL_FRAME_STYLESHEET);
+ Resources.style_widget(bottom_frame, Resources.INSET_FRAME_STYLESHEET);
+
+ bottom_alignment.set_padding(10, 10, 6, 0);
+ bottom_alignment.add(basic_properties);
+
+ bottom_frame.add(bottom_alignment);
+ bottom_frame.set_shadow_type(Gtk.ShadowType.IN);
+
+ // "attach" the progress bar to the sidebar tree, so the movable ridge is to resize the
+ // top two and the basic information pane
+ top_section.pack_start(top_frame, true, true, 0);
+
+ sidebar_paned.pack1(top_section, true, false);
+ sidebar_paned.pack2(bottom_frame, false, false);
+ sidebar_paned.set_position(1000);
+
+ // layout the selection tree to the left of the collection/toolbar box with an adjustable
+ // gutter between them, framed for presentation
+ Gtk.Frame right_frame = new Gtk.Frame(null);
+ right_frame.set_shadow_type(Gtk.ShadowType.IN);
+
+ right_vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ right_frame.add(right_vbox);
+ right_vbox.pack_start(search_toolbar, false, false, 0);
+ right_vbox.pack_start(notebook, true, true, 0);
+
+ client_paned = new Gtk.Paned(Gtk.Orientation.HORIZONTAL);
+ client_paned.pack1(sidebar_paned, false, false);
+ sidebar_tree.set_size_request(SIDEBAR_MIN_WIDTH, -1);
+ client_paned.pack2(right_frame, true, false);
+ client_paned.set_position(Config.Facade.get_instance().get_sidebar_position());
+ // TODO: Calc according to layout's size, to give sidebar a maximum width
+ notebook.set_size_request(PAGE_MIN_WIDTH, -1);
+
+ layout.pack_end(client_paned, true, true, 0);
+
+ add(layout);
+
+ switch_to_page(start_page);
+ start_page.grab_focus();
+ }
+
+ public override void set_current_page(Page page) {
+ // switch_to_page() will call base.set_current_page(), maintain the semantics of this call
+ switch_to_page(page);
+ }
+
+ public void set_page_switching_enabled(bool should_enable) {
+ page_switching_enabled = should_enable;
+ }
+
+ public void switch_to_page(Page page) {
+ if (!page_switching_enabled)
+ return;
+
+ if (page == get_current_page())
+ return;
+
+ Page current_page = get_current_page();
+ if (current_page != null) {
+ Gtk.Toolbar toolbar = current_page.get_toolbar();
+ if (toolbar != null)
+ right_vbox.remove(toolbar);
+
+ current_page.switching_from();
+
+ // see note below about why the sidebar is uneditable while the LibraryPhotoPage is
+ // visible
+ if (current_page is LibraryPhotoPage)
+ sidebar_tree.enable_editing();
+
+ // old page unsubscribes to these signals (new page subscribes below)
+ unsubscribe_from_basic_information(current_page);
+ }
+
+ notebook.set_current_page(notebook.page_num(page));
+
+ // do this prior to changing selection, as the change will fire a cursor-changed event,
+ // which will then call this function again
+ base.set_current_page(page);
+
+ // if the visible page is the LibraryPhotoPage, we need to prevent single-click inline
+ // renaming in the sidebar because a single click while in the LibraryPhotoPage indicates
+ // the user wants to return to the controlling page ... that is, in this special case, the
+ // sidebar cursor is set not to the 'current' page, but the page the user came from
+ if (page is LibraryPhotoPage)
+ sidebar_tree.disable_editing();
+
+ // Update search filter to new page.
+ toggle_search_bar(should_show_search_bar(), page as CheckerboardPage);
+
+ // Not all pages have sidebar entries
+ Sidebar.Entry? entry = page_map.get(page);
+ if (entry != null) {
+ // if the corresponding sidebar entry is an expandable entry and wants to be
+ // expanded when it's selected, then expand it
+ Sidebar.ExpandableEntry expandable_entry = entry as Sidebar.ExpandableEntry;
+ if (expandable_entry != null && expandable_entry.expand_on_select())
+ sidebar_tree.expand_to_entry(entry);
+
+ sidebar_tree.place_cursor(entry, true);
+ }
+
+ on_update_properties();
+
+ if (page is CheckerboardPage)
+ init_view_filter((CheckerboardPage)page);
+
+ page.show_all();
+
+ // subscribe to these signals for each event page so basic properties display will update
+ subscribe_for_basic_information(get_current_page());
+
+ page.switched_to();
+
+ Gtk.Toolbar toolbar = page.get_toolbar();
+ if (toolbar != null) {
+ right_vbox.add(toolbar);
+ toolbar.show_all();
+ }
+
+ page.ready();
+ }
+
+ private void init_view_filter(CheckerboardPage page) {
+ search_toolbar.set_view_filter(page.get_search_view_filter());
+ page.get_view().install_view_filter(page.get_search_view_filter());
+ }
+
+ private bool should_show_search_bar() {
+ return (get_current_page() is CheckerboardPage) ? is_search_toolbar_visible : false;
+ }
+
+ // Turns the search bar on or off. Note that if show is true, page must not be null.
+ private void toggle_search_bar(bool show, CheckerboardPage? page = null) {
+ search_toolbar.visible = show;
+ if (show) {
+ assert(null != page);
+ search_toolbar.set_view_filter(page.get_search_view_filter());
+ page.get_view().install_view_filter(page.get_search_view_filter());
+ } else {
+ if (page != null)
+ page.get_view().install_view_filter(new DisabledViewFilter());
+ }
+ }
+
+ private void on_page_created(Sidebar.PageRepresentative entry, Page page) {
+ assert(!page_map.has_key(page));
+ page_map.set(page, entry);
+
+ add_to_notebook(page);
+ }
+
+ private void on_destroying_page(Sidebar.PageRepresentative entry, Page page) {
+ // if page is the current page, switch to fallback before destroying
+ if (page == get_current_page())
+ switch_to_page(library_branch.get_main_page());
+
+ remove_from_notebook(page);
+
+ bool removed = page_map.unset(page);
+ assert(removed);
+ }
+
+ private void on_sidebar_entry_selected(Sidebar.SelectableEntry selectable) {
+ Sidebar.PageRepresentative? page_rep = selectable as Sidebar.PageRepresentative;
+ if (page_rep != null)
+ switch_to_page(page_rep.get_page());
+ }
+
+ private void on_sidebar_selected_entry_removed(Sidebar.SelectableEntry selectable) {
+ // if the currently selected item is removed, want to jump to fallback page (which
+ // depends on the item that was selected)
+
+ // Importing... -> Last Import (if available)
+ if (selectable is Library.ImportQueueSidebarEntry && last_import_branch.get_show_branch()) {
+ switch_to_page(last_import_branch.get_main_entry().get_page());
+
+ return;
+ }
+
+ // Event page -> Events (master event directory)
+ if (selectable is Events.EventEntry && events_branch.get_show_branch()) {
+ switch_to_page(events_branch.get_master_entry().get_page());
+
+ return;
+ }
+
+ // Any event directory -> Events (master event directory)
+ if (selectable is Events.DirectoryEntry && events_branch.get_show_branch()) {
+ switch_to_page(events_branch.get_master_entry().get_page());
+
+ return;
+ }
+
+ // basic all-around default: jump to the Library page
+ switch_to_page(library_branch.get_main_page());
+ }
+
+ private void subscribe_for_basic_information(Page page) {
+ ViewCollection view = page.get_view();
+
+ view.items_state_changed.connect(on_update_properties);
+ view.items_altered.connect(on_update_properties);
+ view.contents_altered.connect(on_update_properties);
+ view.items_visibility_changed.connect(on_update_properties);
+ }
+
+ private void unsubscribe_from_basic_information(Page page) {
+ ViewCollection view = page.get_view();
+
+ view.items_state_changed.disconnect(on_update_properties);
+ view.items_altered.disconnect(on_update_properties);
+ view.contents_altered.disconnect(on_update_properties);
+ view.items_visibility_changed.disconnect(on_update_properties);
+ }
+
+ private void on_update_properties() {
+ properties_scheduler.at_idle();
+ }
+
+ private void on_update_properties_now() {
+ if (bottom_frame.visible)
+ basic_properties.update_properties(get_current_page());
+
+ if (extended_properties.visible)
+ extended_properties.update_properties(get_current_page());
+ }
+
+ public void mounted_camera_shell_notification(string uri, bool at_startup) {
+ debug("mount point reported: %s", uri);
+
+ // ignore unsupport mount URIs
+ if (!is_mount_uri_supported(uri)) {
+ debug("Unsupported mount scheme: %s", uri);
+
+ return;
+ }
+
+ File uri_file = File.new_for_uri(uri);
+
+ // find the VFS mount point
+ Mount mount = null;
+ try {
+ mount = uri_file.find_enclosing_mount(null);
+ } catch (Error err) {
+ debug("%s", err.message);
+
+ return;
+ }
+
+ // convert file: URIs into gphoto disk: URIs
+ string alt_uri = null;
+ if (uri.has_prefix("file://"))
+ alt_uri = CameraTable.get_port_uri(uri.replace("file://", "disk:"));
+
+ // we only add uris when the notification is called on startup
+ if (at_startup) {
+ if (!is_string_empty(uri))
+ initial_camera_uris.add(uri);
+
+ if (!is_string_empty(alt_uri))
+ initial_camera_uris.add(alt_uri);
+ }
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ if (sidebar_tree.has_focus && sidebar_tree.is_keypress_interpreted(event)
+ && sidebar_tree.key_press_event(event)) {
+ return true;
+ }
+
+ if (base.key_press_event(event))
+ return true;
+
+ if (Gdk.keyval_name(event.keyval) == "Escape") {
+ on_clear_search();
+ return true;
+ }
+
+ return false;
+ }
+}
+
diff --git a/src/library/OfflineBranch.vala b/src/library/OfflineBranch.vala
new file mode 100644
index 0000000..4ed2e49
--- /dev/null
+++ b/src/library/OfflineBranch.vala
@@ -0,0 +1,51 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.OfflineBranch : Sidebar.RootOnlyBranch {
+ public OfflineBranch() {
+ base (new Library.OfflineSidebarEntry());
+
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.offline_contents_altered.connect(on_offline_contents_altered);
+
+ set_show_branch(get_total_offline() != 0);
+ }
+
+ ~OfflineBranch() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.trashcan_contents_altered.disconnect(on_offline_contents_altered);
+ }
+
+ private void on_offline_contents_altered() {
+ set_show_branch(get_total_offline() != 0);
+ }
+
+ private int get_total_offline() {
+ int total = 0;
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ total += media_sources.get_offline_bin_contents().size;
+
+ return total;
+ }
+}
+
+public class Library.OfflineSidebarEntry : Sidebar.SimplePageEntry {
+ public OfflineSidebarEntry() {
+ }
+
+ public override string get_sidebar_name() {
+ return OfflinePage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return new ThemedIcon(Resources.ICON_MISSING_FILES);
+ }
+
+ protected override Page create_page() {
+ return new OfflinePage();
+ }
+}
+
diff --git a/src/library/OfflinePage.vala b/src/library/OfflinePage.vala
new file mode 100644
index 0000000..cb6af2d
--- /dev/null
+++ b/src/library/OfflinePage.vala
@@ -0,0 +1,130 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class OfflinePage : CheckerboardPage {
+ public const string NAME = _("Missing Files");
+
+ private class OfflineView : Thumbnail {
+ public OfflineView(MediaSource source) {
+ base (source);
+
+ assert(source.is_offline());
+ }
+ }
+
+ private class OfflineSearchViewFilter : DefaultSearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.FLAG |
+ SearchFilterCriteria.MEDIA | SearchFilterCriteria.RATING;
+ }
+ }
+
+ private OfflineSearchViewFilter search_filter = new OfflineSearchViewFilter();
+ private MediaViewTracker tracker;
+
+ public OfflinePage() {
+ base (NAME);
+
+ init_item_context_menu("/OfflineContextMenu");
+ init_toolbar("/OfflineToolbar");
+
+ tracker = new MediaViewTracker(get_view());
+
+ // monitor offline and initialize view with all items in it
+ LibraryPhoto.global.offline_contents_altered.connect(on_offline_contents_altered);
+ Video.global.offline_contents_altered.connect(on_offline_contents_altered);
+
+ on_offline_contents_altered(LibraryPhoto.global.get_offline_bin_contents(), null);
+ on_offline_contents_altered(Video.global.get_offline_bin_contents(), null);
+ }
+
+ ~OfflinePage() {
+ LibraryPhoto.global.offline_contents_altered.disconnect(on_offline_contents_altered);
+ Video.global.offline_contents_altered.disconnect(on_offline_contents_altered);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("offline.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry remove = { "RemoveFromLibrary", Gtk.Stock.REMOVE, TRANSLATABLE, "Delete",
+ TRANSLATABLE, on_remove_from_library };
+ remove.label = Resources.REMOVE_FROM_LIBRARY_MENU;
+ remove.tooltip = Resources.DELETE_FROM_LIBRARY_TOOLTIP;
+ actions += remove;
+
+ return actions;
+ }
+
+ public override Core.ViewTracker? get_view_tracker() {
+ return tracker;
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_sensitive("RemoveFromLibrary", selected_count > 0);
+ set_action_important("RemoveFromLibrary", true);
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_offline_contents_altered(Gee.Collection<MediaSource>? added,
+ Gee.Collection<MediaSource>? removed) {
+ if (added != null) {
+ foreach (MediaSource source in added)
+ get_view().add(new OfflineView(source));
+ }
+
+ if (removed != null) {
+ Marker marker = get_view().start_marking();
+ foreach (MediaSource source in removed)
+ marker.mark(get_view().get_view_for_source(source));
+ get_view().remove_marked(marker);
+ }
+ }
+
+ private void on_remove_from_library() {
+ Gee.Collection<MediaSource> sources =
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources();
+ if (sources.size == 0)
+ return;
+
+ if (!remove_offline_dialog(AppWindow.get_instance(), sources.size))
+ return;
+
+ AppWindow.get_instance().set_busy_cursor();
+
+ ProgressDialog progress = null;
+ if (sources.size >= 20)
+ progress = new ProgressDialog(AppWindow.get_instance(), _("Deleting..."));
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media(sources, photos, videos);
+
+ if (progress != null) {
+ LibraryPhoto.global.remove_from_app(photos, false, progress.monitor);
+ Video.global.remove_from_app(videos, false, progress.monitor);
+ } else {
+ LibraryPhoto.global.remove_from_app(photos, false);
+ Video.global.remove_from_app(videos, false);
+ }
+
+ if (progress != null)
+ progress.close();
+
+ AppWindow.get_instance().set_normal_cursor();
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
diff --git a/src/library/TrashBranch.vala b/src/library/TrashBranch.vala
new file mode 100644
index 0000000..5ef8b3c
--- /dev/null
+++ b/src/library/TrashBranch.vala
@@ -0,0 +1,73 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Library.TrashBranch : Sidebar.RootOnlyBranch {
+ public TrashBranch() {
+ base (new Library.TrashSidebarEntry());
+ }
+}
+
+public class Library.TrashSidebarEntry : Sidebar.SimplePageEntry, Sidebar.InternalDropTargetEntry {
+ private static Icon? full_icon = null;
+ private static Icon? empty_icon = null;
+
+ public TrashSidebarEntry() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.trashcan_contents_altered.connect(on_trashcan_contents_altered);
+ }
+
+ ~TrashSidebarEntry() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all())
+ media_sources.trashcan_contents_altered.disconnect(on_trashcan_contents_altered);
+ }
+
+ internal static void init() {
+ full_icon = new ThemedIcon(Resources.ICON_TRASH_FULL);
+ empty_icon = new ThemedIcon(Resources.ICON_TRASH_EMPTY);
+ }
+
+ internal static void terminate() {
+ full_icon = null;
+ empty_icon = null;
+ }
+
+ public override string get_sidebar_name() {
+ return TrashPage.NAME;
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return get_current_icon();
+ }
+
+ private static Icon get_current_icon() {
+ foreach (MediaSourceCollection media_sources in MediaCollectionRegistry.get_instance().get_all()) {
+ if (media_sources.get_trashcan_count() > 0)
+ return full_icon;
+ }
+
+ return empty_icon;
+ }
+
+ public bool internal_drop_received(Gee.List<MediaSource> media) {
+ AppWindow.get_command_manager().execute(new TrashUntrashPhotosCommand(media, true));
+
+ return true;
+ }
+
+ public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
+ return false;
+ }
+
+ protected override Page create_page() {
+ return new TrashPage();
+ }
+
+ private void on_trashcan_contents_altered() {
+ sidebar_icon_changed(get_current_icon());
+ }
+}
+
+
diff --git a/src/library/TrashPage.vala b/src/library/TrashPage.vala
new file mode 100644
index 0000000..2991727
--- /dev/null
+++ b/src/library/TrashPage.vala
@@ -0,0 +1,120 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class TrashPage : CheckerboardPage {
+ public const string NAME = _("Trash");
+
+ private class TrashView : Thumbnail {
+ public TrashView(MediaSource source) {
+ base (source);
+
+ assert(source.is_trashed());
+ }
+ }
+
+ private class TrashSearchViewFilter : DefaultSearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.FLAG |
+ SearchFilterCriteria.MEDIA | SearchFilterCriteria.RATING;
+ }
+ }
+
+ private TrashSearchViewFilter search_filter = new TrashSearchViewFilter();
+ private MediaViewTracker tracker;
+
+ public TrashPage() {
+ base (NAME);
+
+ init_item_context_menu("/TrashContextMenu");
+ init_page_context_menu("/TrashPageMenu");
+ init_toolbar("/TrashToolbar");
+
+ tracker = new MediaViewTracker(get_view());
+
+ // monitor trashcans and initialize view with all items in them
+ LibraryPhoto.global.trashcan_contents_altered.connect(on_trashcan_contents_altered);
+ Video.global.trashcan_contents_altered.connect(on_trashcan_contents_altered);
+ on_trashcan_contents_altered(LibraryPhoto.global.get_trashcan_contents(), null);
+ on_trashcan_contents_altered(Video.global.get_trashcan_contents(), null);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("trash.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry delete_action = { "Delete", Gtk.Stock.DELETE, TRANSLATABLE, "Delete",
+ TRANSLATABLE, on_delete };
+ delete_action.label = Resources.DELETE_PHOTOS_MENU;
+ delete_action.tooltip = Resources.DELETE_FROM_TRASH_TOOLTIP;
+ actions += delete_action;
+
+ Gtk.ActionEntry restore = { "Restore", Gtk.Stock.UNDELETE, TRANSLATABLE, null, TRANSLATABLE,
+ on_restore };
+ restore.label = Resources.RESTORE_PHOTOS_MENU;
+ restore.tooltip = Resources.RESTORE_PHOTOS_TOOLTIP;
+ actions += restore;
+
+ return actions;
+ }
+
+ public override Core.ViewTracker? get_view_tracker() {
+ return tracker;
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ bool has_selected = selected_count > 0;
+
+ set_action_sensitive("Delete", has_selected);
+ set_action_important("Delete", true);
+ set_action_sensitive("Restore", has_selected);
+ set_action_important("Restore", true);
+ set_common_action_important("CommonEmptyTrash", true);
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_trashcan_contents_altered(Gee.Collection<MediaSource>? added,
+ Gee.Collection<MediaSource>? removed) {
+ if (added != null) {
+ foreach (MediaSource source in added)
+ get_view().add(new TrashView(source));
+ }
+
+ if (removed != null) {
+ Marker marker = get_view().start_marking();
+ foreach (MediaSource source in removed)
+ marker.mark(get_view().get_view_for_source(source));
+ get_view().remove_marked(marker);
+ }
+ }
+
+ private void on_restore() {
+ if (get_view().get_selected_count() == 0)
+ return;
+
+ get_command_manager().execute(new TrashUntrashPhotosCommand(
+ (Gee.Collection<LibraryPhoto>) get_view().get_selected_sources(), false));
+ }
+
+ protected override string get_view_empty_message() {
+ return _("Trash is empty");
+ }
+
+ private void on_delete() {
+ remove_from_app((Gee.Collection<MediaSource>) get_view().get_selected_sources(), _("Delete"),
+ (get_view().get_selected_count() == 1) ? ("Deleting a Photo") : _("Deleting Photos"));
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+
diff --git a/src/library/mk/library.mk b/src/library/mk/library.mk
new file mode 100644
index 0000000..b4ab790
--- /dev/null
+++ b/src/library/mk/library.mk
@@ -0,0 +1,54 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Library
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := library
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ LibraryWindow.vala \
+ Branch.vala \
+ TrashBranch.vala \
+ OfflineBranch.vala \
+ FlaggedBranch.vala \
+ LastImportBranch.vala \
+ ImportQueueBranch.vala \
+ FlaggedPage.vala \
+ ImportQueuePage.vala \
+ LastImportPage.vala \
+ OfflinePage.vala \
+ TrashPage.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Util \
+ Threads \
+ Db \
+ Plugins \
+ Slideshow \
+ Photos \
+ Publishing \
+ Core \
+ Sidebar \
+ Events \
+ Tags \
+ Camera \
+ Searches \
+ DataImports \
+ Folders
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/main.vala b/src/main.vala
new file mode 100644
index 0000000..8c045fd
--- /dev/null
+++ b/src/main.vala
@@ -0,0 +1,441 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+enum ShotwellCommand {
+ // user-defined commands must be positive ints
+ MOUNTED_CAMERA = 1
+}
+
+private Timer startup_timer = null;
+private bool was_already_running = false;
+
+void library_exec(string[] mounts) {
+ was_already_running = Application.get_is_remote();
+
+ if (was_already_running) {
+ // Send attached cameras out to the primary instance.
+ // The primary instance will get a 'command-line' signal with mounts[]
+ // as an argument, and an 'activate', which will present the window.
+ //
+ // This will also take care of killing us when it sees that another
+ // instance was already registered.
+ Application.present_primary_instance();
+ Application.send_to_primary_instance(mounts);
+ return;
+ }
+
+ // preconfigure units
+ Db.preconfigure(AppDirs.get_data_subdir("data").get_child("photo.db"));
+
+ // initialize units
+ try {
+ Library.app_init();
+ } catch (Error err) {
+ AppWindow.panic(err.message);
+
+ return;
+ }
+
+ // validate the databases prior to using them
+ message("Verifying database ...");
+ string errormsg = null;
+ string app_version;
+ int schema_version;
+ Db.VerifyResult result = Db.verify_database(out app_version, out schema_version);
+ switch (result) {
+ case Db.VerifyResult.OK:
+ // do nothing; no problems
+ break;
+
+ case Db.VerifyResult.FUTURE_VERSION:
+ errormsg = _("Your photo library is not compatible with this version of Shotwell. It appears it was created by Shotwell %s (schema %d). This version is %s (schema %d). Please use the latest version of Shotwell.").printf(
+ app_version, schema_version, Resources.APP_VERSION, DatabaseTable.SCHEMA_VERSION);
+ break;
+
+ case Db.VerifyResult.UPGRADE_ERROR:
+ errormsg = _("Shotwell was unable to upgrade your photo library from version %s (schema %d) to %s (schema %d). For more information please check the Shotwell Wiki at %s").printf(
+ app_version, schema_version, Resources.APP_VERSION, DatabaseTable.SCHEMA_VERSION,
+ Resources.HOME_URL);
+ break;
+
+ case Db.VerifyResult.NO_UPGRADE_AVAILABLE:
+ errormsg = _("Your photo library is not compatible with this version of Shotwell. It appears it was created by Shotwell %s (schema %d). This version is %s (schema %d). Please clear your library by deleting %s and re-import your photos.").printf(
+ app_version, schema_version, Resources.APP_VERSION, DatabaseTable.SCHEMA_VERSION,
+ AppDirs.get_data_dir().get_path());
+ break;
+
+ default:
+ errormsg = _("Unknown error attempting to verify Shotwell's database: %s").printf(
+ result.to_string());
+ break;
+ }
+
+ if (errormsg != null) {
+ Gtk.MessageDialog dialog = new Gtk.MessageDialog(null, Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "%s", errormsg);
+ dialog.title = Resources.APP_TITLE;
+ dialog.run();
+ dialog.destroy();
+
+ DatabaseTable.terminate();
+
+ return;
+ }
+
+ Upgrades.init();
+
+ ProgressDialog progress_dialog = null;
+ AggregateProgressMonitor aggregate_monitor = null;
+ ProgressMonitor monitor = null;
+
+ if (!CommandlineOptions.no_startup_progress) {
+ // only throw up a startup progress dialog if over a reasonable amount of objects ... multiplying
+ // photos by two because there's two heavy-duty operations on them: creating the LibraryPhoto
+ // objects and then populating the initial page with them.
+ uint64 grand_total = PhotoTable.get_instance().get_row_count()
+ + EventTable.get_instance().get_row_count()
+ + TagTable.get_instance().get_row_count()
+ + VideoTable.get_instance().get_row_count()
+ + Upgrades.get_instance().get_step_count();
+ if (grand_total > 5000) {
+ progress_dialog = new ProgressDialog(null, _("Loading Shotwell"));
+ progress_dialog.update_display_every(100);
+ progress_dialog.set_minimum_on_screen_time_msec(250);
+ try {
+ string icon_path = AppDirs.get_resources_dir().get_child("icons").get_child("shotwell.svg").get_path();
+ progress_dialog.icon = new Gdk.Pixbuf.from_file(icon_path);
+ } catch (Error err) {
+ debug("Warning - could not load application icon for loading window: %s", err.message);
+ }
+
+ aggregate_monitor = new AggregateProgressMonitor(grand_total, progress_dialog.monitor);
+ monitor = aggregate_monitor.monitor;
+ }
+ }
+
+ ThumbnailCache.init();
+ Tombstone.init();
+
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("LibraryPhoto.init");
+ LibraryPhoto.init(monitor);
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("Video.init");
+ Video.init(monitor);
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("Upgrades.execute");
+ Upgrades.get_instance().execute();
+
+ LibraryMonitorPool.init();
+ MediaCollectionRegistry.init();
+ MediaCollectionRegistry registry = MediaCollectionRegistry.get_instance();
+ registry.register_collection(LibraryPhoto.global);
+ registry.register_collection(Video.global);
+
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("Event.init");
+ Event.init(monitor);
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("Tag.init");
+ Tag.init(monitor);
+
+ MetadataWriter.init();
+ DesktopIntegration.init();
+
+ Application.get_instance().init_done();
+
+ // create main library application window
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("LibraryWindow");
+ LibraryWindow library_window = new LibraryWindow(monitor);
+
+ if (aggregate_monitor != null)
+ aggregate_monitor.next_step("done");
+
+ // destroy and tear down everything ... no need for them to stick around the lifetime of the
+ // application
+
+ monitor = null;
+ aggregate_monitor = null;
+ if (progress_dialog != null)
+ progress_dialog.destroy();
+ progress_dialog = null;
+
+ // report mount points
+ foreach (string mount in mounts)
+ library_window.mounted_camera_shell_notification(mount, true);
+
+ library_window.show_all();
+
+ WelcomeServiceEntry[] selected_import_entries = new WelcomeServiceEntry[0];
+ if (Config.Facade.get_instance().get_show_welcome_dialog() &&
+ LibraryPhoto.global.get_count() == 0) {
+ WelcomeDialog welcome = new WelcomeDialog(library_window);
+ Config.Facade.get_instance().set_show_welcome_dialog(welcome.execute(out selected_import_entries,
+ out do_system_pictures_import));
+ } else {
+ Config.Facade.get_instance().set_show_welcome_dialog(false);
+ }
+
+ if (selected_import_entries.length > 0) {
+ do_external_import = true;
+ foreach (WelcomeServiceEntry entry in selected_import_entries)
+ entry.execute();
+ }
+ if (do_system_pictures_import) {
+ /* Do the system import even if other plugins have run as some plugins may not
+ as some plugins may not import pictures from the system folder.
+ */
+ run_system_pictures_import();
+ }
+
+ debug("%lf seconds to Gtk.main()", startup_timer.elapsed());
+
+ Application.get_instance().start();
+
+ DesktopIntegration.terminate();
+ MetadataWriter.terminate();
+ Tag.terminate();
+ Event.terminate();
+ LibraryPhoto.terminate();
+ MediaCollectionRegistry.terminate();
+ LibraryMonitorPool.terminate();
+ Tombstone.terminate();
+ ThumbnailCache.terminate();
+ Video.terminate();
+ Library.app_terminate();
+}
+
+private bool do_system_pictures_import = false;
+private bool do_external_import = false;
+
+public void run_system_pictures_import(ImportManifest? external_exclusion_manifest = null) {
+ if (!do_system_pictures_import)
+ return;
+
+ Gee.ArrayList<FileImportJob> jobs = new Gee.ArrayList<FileImportJob>();
+ jobs.add(new FileImportJob(AppDirs.get_import_dir(), false));
+
+ LibraryWindow library_window = (LibraryWindow) AppWindow.get_instance();
+
+ BatchImport batch_import = new BatchImport(jobs, "startup_import",
+ report_system_pictures_import, null, null, null, null, external_exclusion_manifest);
+ library_window.enqueue_batch_import(batch_import, true);
+
+ library_window.switch_to_import_queue_page();
+}
+
+private void report_system_pictures_import(ImportManifest manifest, BatchImportRoll import_roll) {
+ /* Don't report the manifest to the user if exteral import was done and the entire manifest
+ is empty. An empty manifest in this case results from files that were already imported
+ in the external import phase being skipped. Note that we are testing against manifest.all,
+ not manifest.success; manifest.all is zero when no files were enqueued for import in the
+ first place and the only way this happens is if all files were skipped -- even failed
+ files are counted in manifest.all */
+ if (do_external_import && (manifest.all.size == 0))
+ return;
+
+ ImportUI.report_manifest(manifest, true);
+}
+
+void editing_exec(string filename) {
+ File initial_file = File.new_for_commandline_arg(filename);
+
+ // preconfigure units
+ Direct.preconfigure(initial_file);
+ Db.preconfigure(null);
+
+ // initialize units for direct-edit mode
+ try {
+ Direct.app_init();
+ } catch (Error err) {
+ AppWindow.panic(err.message);
+
+ return;
+ }
+
+ // init modules direct-editing relies on
+ DesktopIntegration.init();
+
+ // TODO: At some point in the future, to support mixed-media in direct-edit mode, we will
+ // refactor DirectPhotoSourceCollection to be a MediaSourceCollection. At that point,
+ // we'll need to register DirectPhoto.global with the MediaCollectionRegistry
+
+ DirectWindow direct_window = new DirectWindow(initial_file);
+ direct_window.show_all();
+
+ debug("%lf seconds to Gtk.main()", startup_timer.elapsed());
+
+ Application.get_instance().start();
+
+ DesktopIntegration.terminate();
+
+ // terminate units for direct-edit mode
+ Direct.app_terminate();
+}
+
+namespace CommandlineOptions {
+
+bool no_startup_progress = false;
+string data_dir = null;
+bool show_version = false;
+bool no_runtime_monitoring = false;
+
+private OptionEntry[]? entries = null;
+
+public OptionEntry[] get_options() {
+ if (entries != null)
+ return entries;
+
+ OptionEntry datadir = { "datadir", 'd', 0, OptionArg.FILENAME, &data_dir,
+ _("Path to Shotwell's private data"), _("DIRECTORY") };
+ entries += datadir;
+
+ OptionEntry no_monitoring = { "no-runtime-monitoring", 0, 0, OptionArg.NONE, &no_runtime_monitoring,
+ _("Do not monitor library directory at runtime for changes"), null };
+ entries += no_monitoring;
+
+ OptionEntry no_startup = { "no-startup-progress", 0, 0, OptionArg.NONE, &no_startup_progress,
+ _("Don't display startup progress meter"), null };
+ entries += no_startup;
+
+ OptionEntry version = { "version", 'V', 0, OptionArg.NONE, &show_version,
+ _("Show the application's version"), null };
+ entries += version;
+
+ OptionEntry terminator = { null, 0, 0, 0, null, null, null };
+ entries += terminator;
+
+ return entries;
+}
+
+}
+
+void main(string[] args) {
+ // Call AppDirs init *before* calling Gtk.init_with_args, as it will strip the
+ // exec file from the array
+ AppDirs.init(args[0]);
+
+ // This has to be done before the AppWindow is created in order to ensure the XMP
+ // parser is initialized in a thread-safe fashion; please see
+ // http://redmine.yorba.org/issues/4120 for details.
+ GExiv2.initialize();
+
+ // following the GIO programming guidelines at http://developer.gnome.org/gio/2.26/ch03.html,
+ // set the GSETTINGS_SCHEMA_DIR environment variable to allow us to load GSettings schemas from
+ // the build directory. this allows us to access local GSettings schemas without having to
+ // muck with the user's XDG_... directories, which is seriously frowned upon
+ if (AppDirs.get_install_dir() == null) {
+ GLib.Environment.set_variable("GSETTINGS_SCHEMA_DIR", AppDirs.get_exec_dir().get_path() +
+ "/misc", true);
+ }
+
+ // init GTK (valac has already called g_threads_init())
+ try {
+ Gtk.init_with_args(ref args, _("[FILE]"), CommandlineOptions.get_options(),
+ Resources.APP_GETTEXT_PACKAGE);
+ } catch (Error e) {
+ print(e.message + "\n");
+ print(_("Run '%s --help' to see a full list of available command line options.\n"), args[0]);
+ AppDirs.terminate();
+ return;
+ }
+
+ if (CommandlineOptions.show_version) {
+ if (Resources.GIT_VERSION != null)
+ print("%s %s (%s)\n", Resources.APP_TITLE, Resources.APP_VERSION, Resources.GIT_VERSION);
+ else
+ print("%s %s\n", Resources.APP_TITLE, Resources.APP_VERSION);
+
+ AppDirs.terminate();
+
+ return;
+ }
+
+ // init debug prior to anything else (except Gtk, which it relies on, and AppDirs, which needs
+ // to be set ASAP) ... since we need to know what mode we're in, examine the command-line
+ // first
+
+ // walk command-line arguments for camera mounts or filename for direct editing ... only one
+ // filename supported for now, so take the first one and drop the rest ... note that URIs for
+ // filenames are currently not permitted, to differentiate between mount points
+ string[] mounts = new string[0];
+ string filename = null;
+
+ for (int ctr = 1; ctr < args.length; ctr++) {
+ string arg = args[ctr];
+
+ if (LibraryWindow.is_mount_uri_supported(arg)) {
+ mounts += arg;
+ } else if (is_string_empty(filename) && !arg.contains("://")) {
+ filename = arg;
+ }
+ }
+
+ Debug.init(is_string_empty(filename) ? Debug.LIBRARY_PREFIX : Debug.VIEWER_PREFIX);
+
+ if (Resources.GIT_VERSION != null)
+ message("Shotwell %s %s (%s)",
+ is_string_empty(filename) ? Resources.APP_LIBRARY_ROLE : Resources.APP_DIRECT_ROLE,
+ Resources.APP_VERSION, Resources.GIT_VERSION);
+ else
+ message("Shotwell %s %s",
+ is_string_empty(filename) ? Resources.APP_LIBRARY_ROLE : Resources.APP_DIRECT_ROLE,
+ Resources.APP_VERSION);
+
+ // Have a filename here? If so, configure ourselves for direct
+ // mode, otherwise, default to library mode.
+ Application.init(!is_string_empty(filename));
+
+ // set custom data directory if it's been supplied
+ if (CommandlineOptions.data_dir != null)
+ AppDirs.set_data_dir(CommandlineOptions.data_dir);
+ else
+ AppDirs.try_migrate_data();
+
+ // Verify the private data directory before continuing
+ AppDirs.verify_data_dir();
+ AppDirs.verify_cache_dir();
+
+ // init internationalization with the default system locale
+ InternationalSupport.init(Resources.APP_GETTEXT_PACKAGE, args);
+
+ startup_timer = new Timer();
+ startup_timer.start();
+
+ // set up GLib environment
+ GLib.Environment.set_application_name(Resources.APP_TITLE);
+
+ // in both the case of running as the library or an editor, Resources is always
+ // initialized
+ Resources.init();
+
+ // since it's possible for a mount name to be passed that's not supported (and hence an empty
+ // mount list), or for nothing to be on the command-line at all, only go to direct editing if a
+ // filename is spec'd
+ if (is_string_empty(filename))
+ library_exec(mounts);
+ else
+ editing_exec(filename);
+
+ // terminate mode-inspecific modules
+ Resources.terminate();
+ Application.terminate();
+ Debug.terminate();
+ AppDirs.terminate();
+
+ // Back up db on successful run so we have something to roll back to if
+ // it gets corrupted in the next session. Don't do this if another shotwell
+ // is open or if we're in direct mode.
+ if (is_string_empty(filename) && !was_already_running) {
+ string orig_path = AppDirs.get_data_subdir("data").get_child("photo.db").get_path();
+ string backup_path = orig_path + ".bak";
+ string cmdline = "cp " + orig_path + " " + backup_path;
+ Posix.system(cmdline);
+ Posix.system("sync");
+ }
+}
+
diff --git a/src/photos/BmpSupport.vala b/src/photos/BmpSupport.vala
new file mode 100644
index 0000000..546bed2
--- /dev/null
+++ b/src/photos/BmpSupport.vala
@@ -0,0 +1,184 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+namespace Photos {
+
+class BmpFileFormatProperties : PhotoFileFormatProperties {
+ private static string[] KNOWN_EXTENSIONS = { "bmp", "dib" };
+ private static string[] KNOWN_MIME_TYPES = { GPhoto.MIME.BMP };
+
+ private static BmpFileFormatProperties instance = null;
+
+ public static void init() {
+ instance = new BmpFileFormatProperties();
+ }
+
+ public static BmpFileFormatProperties get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.BMP;
+ }
+
+ public override PhotoFileFormatFlags get_flags() {
+ return PhotoFileFormatFlags.NONE;
+ }
+
+ public override string get_user_visible_name() {
+ return _("BMP");
+ }
+
+ public override string get_default_extension() {
+ return KNOWN_EXTENSIONS[0];
+ }
+
+ public override string[] get_known_extensions() {
+ return KNOWN_EXTENSIONS;
+ }
+
+ public override string get_default_mime_type() {
+ return KNOWN_MIME_TYPES[0];
+ }
+
+ public override string[] get_mime_types() {
+ return KNOWN_MIME_TYPES;
+ }
+}
+
+public class BmpSniffer : GdkSniffer {
+ private const uint8[] MAGIC_SEQUENCE = { 0x42, 0x4D };
+
+ public BmpSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ private static bool is_bmp_file(File file) throws Error {
+ FileInputStream instream = file.read(null);
+
+ uint8[] file_lead_sequence = new uint8[MAGIC_SEQUENCE.length];
+
+ instream.read(file_lead_sequence, null);
+
+ for (int i = 0; i < MAGIC_SEQUENCE.length; i++) {
+ if (file_lead_sequence[i] != MAGIC_SEQUENCE[i])
+ return false;
+ }
+
+ return true;
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ if (!is_bmp_file(file))
+ return null;
+
+ DetectedPhotoInformation? detected = base.sniff();
+ if (detected == null)
+ return null;
+
+ return (detected.file_format == PhotoFileFormat.BMP) ? detected : null;
+ }
+}
+
+public class BmpReader : GdkReader {
+ public BmpReader(string filepath) {
+ base (filepath, PhotoFileFormat.BMP);
+ }
+
+ public override Gdk.Pixbuf scaled_read(Dimensions full, Dimensions scaled) throws Error {
+ Gdk.Pixbuf result = null;
+ /* if we encounter a situation where there are two orders of magnitude or more of
+ difference between the full image size and the scaled size, and if the full image
+ size has five or more decimal digits of precision, Gdk.Pixbuf.from_file_at_scale( ) can
+ fail due to what appear to be floating-point round-off issues. This isn't surprising,
+ since 32-bit floats only have 6-7 decimal digits of precision in their mantissa. In
+ this case, we prefetch the image at a larger scale and then downsample it to the
+ desired scale as a post-process step. This short-circuits Gdk.Pixbuf's buggy
+ scaling code. */
+ if (((full.width > 9999) || (full.height > 9999)) && ((scaled.width < 100) ||
+ (scaled.height < 100))) {
+ Dimensions prefetch_dimensions = full.get_scaled_by_constraint(1000,
+ ScaleConstraint.DIMENSIONS);
+
+ result = new Gdk.Pixbuf.from_file_at_scale(get_filepath(), prefetch_dimensions.width,
+ prefetch_dimensions.height, false);
+
+ result = result.scale_simple(scaled.width, scaled.height, Gdk.InterpType.HYPER);
+ } else {
+ result = new Gdk.Pixbuf.from_file_at_scale(get_filepath(), scaled.width,
+ scaled.height, false);
+ }
+
+ return result;
+ }
+}
+
+public class BmpWriter : PhotoFileWriter {
+ public BmpWriter(string filepath) {
+ base (filepath, PhotoFileFormat.BMP);
+ }
+
+ public override void write(Gdk.Pixbuf pixbuf, Jpeg.Quality quality) throws Error {
+ pixbuf.save(get_filepath(), "bmp", null);
+ }
+}
+
+public class BmpMetadataWriter : PhotoFileMetadataWriter {
+ public BmpMetadataWriter(string filepath) {
+ base (filepath, PhotoFileFormat.BMP);
+ }
+
+ public override void write_metadata(PhotoMetadata metadata) throws Error {
+ // Metadata writing isn't supported for .BMPs, so this is a no-op.
+ }
+}
+
+public class BmpFileFormatDriver : PhotoFileFormatDriver {
+ private static BmpFileFormatDriver instance = null;
+
+ public static void init() {
+ instance = new BmpFileFormatDriver();
+ BmpFileFormatProperties.init();
+ }
+
+ public static BmpFileFormatDriver get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormatProperties get_properties() {
+ return BmpFileFormatProperties.get_instance();
+ }
+
+ public override PhotoFileReader create_reader(string filepath) {
+ return new BmpReader(filepath);
+ }
+
+ public override bool can_write_image() {
+ return true;
+ }
+
+ public override bool can_write_metadata() {
+ return false;
+ }
+
+ public override PhotoFileWriter? create_writer(string filepath) {
+ return new BmpWriter(filepath);
+ }
+
+ public override PhotoFileMetadataWriter? create_metadata_writer(string filepath) {
+ return new BmpMetadataWriter(filepath);
+ }
+
+ public override PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return new BmpSniffer(file, options);
+ }
+
+ public override PhotoMetadata create_metadata() {
+ return new PhotoMetadata();
+ }
+}
+
+}
diff --git a/src/photos/GRaw.vala b/src/photos/GRaw.vala
new file mode 100644
index 0000000..915a861
--- /dev/null
+++ b/src/photos/GRaw.vala
@@ -0,0 +1,307 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace GRaw {
+
+public const double HD_POWER = 2.222;
+public const double HD_SLOPE = 4.5;
+
+public const double SRGB_POWER = 2.4;
+public const double SRGB_SLOPE = 12.92;
+
+public enum Colorspace {
+ RAW = 0,
+ SRGB = 1,
+ ADOBE = 2,
+ WIDE = 3,
+ PROPHOTO = 4,
+ XYZ = 5
+}
+
+public errordomain Exception {
+ UNSPECIFIED,
+ UNSUPPORTED_FILE,
+ NONEXISTANT_IMAGE,
+ OUT_OF_ORDER_CALL,
+ NO_THUMBNAIL,
+ UNSUPPORTED_THUMBNAIL,
+ OUT_OF_MEMORY,
+ DATA_ERROR,
+ IO_ERROR,
+ CANCELLED_BY_CALLBACK,
+ BAD_CROP,
+ SYSTEM_ERROR
+}
+
+public enum Flip {
+ FROM_SOURCE = -1,
+ NONE = 0,
+ UPSIDE_DOWN = 3,
+ COUNTERCLOCKWISE = 5,
+ CLOCKWISE = 6
+}
+
+public enum FujiRotate {
+ USE = -1,
+ DONT_USE = 0
+}
+
+public enum HighlightMode {
+ CLIP = 0,
+ UNCLIP = 1,
+ BLEND = 2,
+ REBUILD = 3
+}
+
+public enum InterpolationQuality {
+ LINEAR = 0,
+ VNG = 1,
+ PPG = 2,
+ AHD = 3
+}
+
+public class ProcessedImage {
+ private LibRaw.ProcessedImage image;
+ private Gdk.Pixbuf pixbuf = null;
+
+ public ushort width {
+ get {
+ return image.width;
+ }
+ }
+
+ public ushort height {
+ get {
+ return image.height;
+ }
+ }
+
+ public ushort colors {
+ get {
+ return image.colors;
+ }
+ }
+
+ public ushort bits {
+ get {
+ return image.bits;
+ }
+ }
+
+ public uint8* data {
+ get {
+ return image.data;
+ }
+ }
+
+ public uint data_size {
+ get {
+ return image.data_size;
+ }
+ }
+
+ public ProcessedImage(LibRaw.Processor proc) throws Exception {
+ LibRaw.Result result = LibRaw.Result.SUCCESS;
+ image = proc.make_mem_image(ref result);
+ throw_exception("ProcessedImage", result);
+ assert(image != null);
+
+ // A regular mem image comes back with raw RGB data ready for pixbuf (data buffer is shared
+ // between the ProcessedImage and the Gdk.Pixbuf)
+ pixbuf = new Gdk.Pixbuf.with_unowned_data(image.data, Gdk.Colorspace.RGB, false, image.bits,
+ image.width, image.height, image.width * image.colors, null);
+ }
+
+ public ProcessedImage.from_thumb(LibRaw.Processor proc) throws Exception {
+ LibRaw.Result result = LibRaw.Result.SUCCESS;
+ image = proc.make_mem_thumb(ref result);
+ throw_exception("ProcessedImage.from_thumb", result);
+ assert(image != null);
+
+ // A mem thumb comes back as the raw bytes from the data segment in the file -- this needs
+ // to be decoded before being useful. This will throw an error if the format is not
+ // supported
+ try {
+ pixbuf = new Gdk.Pixbuf.from_stream(new MemoryInputStream.from_data(image.data, null),
+ null);
+ } catch (Error err) {
+ throw new Exception.UNSUPPORTED_THUMBNAIL(err.message);
+ }
+
+ // fix up the ProcessedImage fields (which are unset when decoding the thumb)
+ image.width = (ushort) pixbuf.width;
+ image.height = (ushort) pixbuf.height;
+ image.colors = (ushort) pixbuf.n_channels;
+ image.bits = (ushort) pixbuf.bits_per_sample;
+ }
+
+ // This method returns a copy of a pixbuf representing the ProcessedImage.
+ public Gdk.Pixbuf get_pixbuf_copy() {
+ return pixbuf.copy();
+ }
+}
+
+public class Processor {
+ public LibRaw.OutputParams* output_params {
+ get {
+ return &proc.params;
+ }
+ }
+
+ private LibRaw.Processor proc;
+
+ public Processor(LibRaw.Options options = LibRaw.Options.NONE) {
+ proc = new LibRaw.Processor(options);
+ }
+
+ public void adjust_sizes_info_only() throws Exception {
+ throw_exception("adjust_sizes_info_only", proc.adjust_sizes_info_only());
+ }
+
+ public unowned LibRaw.ImageOther get_image_other() {
+ return proc.get_image_other();
+ }
+
+ public unowned LibRaw.ImageParams get_image_params() {
+ return proc.get_image_params();
+ }
+
+ public unowned LibRaw.ImageSizes get_sizes() {
+ return proc.get_sizes();
+ }
+
+ public unowned LibRaw.Thumbnail get_thumbnail() {
+ return proc.get_thumbnail();
+ }
+
+ public ProcessedImage make_mem_image() throws Exception {
+ return new ProcessedImage(proc);
+ }
+
+ public ProcessedImage make_thumb_image() throws Exception {
+ return new ProcessedImage.from_thumb(proc);
+ }
+
+ public void open_buffer(uint8[] buffer) throws Exception {
+ throw_exception("open_buffer", proc.open_buffer(buffer));
+ }
+
+ public void open_file(string filename) throws Exception {
+ throw_exception("open_file", proc.open_file(filename));
+ }
+
+ public void process() throws Exception {
+ throw_exception("process", proc.process());
+ }
+
+ public void ppm_tiff_writer(string filename) throws Exception {
+ throw_exception("ppm_tiff_writer", proc.ppm_tiff_writer(filename));
+ }
+
+ public void thumb_writer(string filename) throws Exception {
+ throw_exception("thumb_writer", proc.thumb_writer(filename));
+ }
+
+ public void recycle() {
+ proc.recycle();
+ }
+
+ public void unpack() throws Exception {
+ throw_exception("unpack", proc.unpack());
+ }
+
+ public void unpack_thumb() throws Exception {
+ throw_exception("unpack_thumb", proc.unpack_thumb());
+ }
+
+ // This configures output_params for reasonable settings for turning a RAW image into an
+ // RGB ProcessedImage suitable for display. Tweaks can occur after this call and before
+ // process().
+ public void configure_for_rgb_display(bool half_size) {
+ // Fields in comments are left to their defaults and/or should be modified by the caller.
+ // These fields are set to reasonable defaults by libraw.
+
+ // greybox
+ output_params->set_chromatic_aberrations(1.0, 1.0);
+ output_params->set_gamma_curve(GRaw.SRGB_POWER, GRaw.SRGB_SLOPE);
+ // user_mul
+ // shot_select
+ // multi_out
+ output_params->bright = 1.0f;
+ // threshold
+ output_params->half_size = half_size;
+ // four_color_rgb
+ output_params->highlight = GRaw.HighlightMode.CLIP;
+ output_params->use_auto_wb = true;
+ output_params->use_camera_wb = true;
+ output_params->use_camera_matrix = true;
+ output_params->output_color = GRaw.Colorspace.SRGB;
+ // output_profile
+ // camera_profile
+ // bad_pixels
+ // dark_frame
+ output_params->output_bps = 8;
+ // output_tiff
+ output_params->user_flip = GRaw.Flip.FROM_SOURCE;
+ output_params->user_qual = GRaw.InterpolationQuality.PPG;
+ // user_black
+ // user_sat
+ // med_passes
+ output_params->no_auto_bright = true;
+ output_params->auto_bright_thr = 0.01f;
+ output_params->use_fuji_rotate = GRaw.FujiRotate.USE;
+ }
+}
+
+private void throw_exception(string caller, LibRaw.Result result) throws Exception {
+ if (result == LibRaw.Result.SUCCESS)
+ return;
+ else if (result > 0)
+ throw new Exception.SYSTEM_ERROR("%s: System error %d: %s", caller, (int) result, strerror(result));
+
+ string msg = "%s: %s".printf(caller, result.to_string());
+
+ switch (result) {
+ case LibRaw.Result.UNSPECIFIED_ERROR:
+ throw new Exception.UNSPECIFIED(msg);
+
+ case LibRaw.Result.FILE_UNSUPPORTED:
+ throw new Exception.UNSUPPORTED_FILE(msg);
+
+ case LibRaw.Result.REQUEST_FOR_NONEXISTENT_IMAGE:
+ throw new Exception.NONEXISTANT_IMAGE(msg);
+
+ case LibRaw.Result.OUT_OF_ORDER_CALL:
+ throw new Exception.OUT_OF_ORDER_CALL(msg);
+
+ case LibRaw.Result.NO_THUMBNAIL:
+ throw new Exception.NO_THUMBNAIL(msg);
+
+ case LibRaw.Result.UNSUPPORTED_THUMBNAIL:
+ throw new Exception.UNSUPPORTED_THUMBNAIL(msg);
+
+ case LibRaw.Result.UNSUFFICIENT_MEMORY:
+ throw new Exception.OUT_OF_MEMORY(msg);
+
+ case LibRaw.Result.DATA_ERROR:
+ throw new Exception.DATA_ERROR(msg);
+
+ case LibRaw.Result.IO_ERROR:
+ throw new Exception.IO_ERROR(msg);
+
+ case LibRaw.Result.CANCELLED_BY_CALLBACK:
+ throw new Exception.CANCELLED_BY_CALLBACK(msg);
+
+ case LibRaw.Result.BAD_CROP:
+ throw new Exception.BAD_CROP(msg);
+
+ default:
+ return;
+ }
+}
+
+}
+
diff --git a/src/photos/GdkSupport.vala b/src/photos/GdkSupport.vala
new file mode 100644
index 0000000..4ca0893
--- /dev/null
+++ b/src/photos/GdkSupport.vala
@@ -0,0 +1,129 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public abstract class GdkReader : PhotoFileReader {
+ public GdkReader(string filepath, PhotoFileFormat file_format) {
+ base (filepath, file_format);
+ }
+
+ public override PhotoMetadata read_metadata() throws Error {
+ PhotoMetadata metadata = new PhotoMetadata();
+ metadata.read_from_file(get_file());
+
+ return metadata;
+ }
+
+ public override Gdk.Pixbuf unscaled_read() throws Error {
+ return new Gdk.Pixbuf.from_file(get_filepath());
+ }
+
+ public override Gdk.Pixbuf scaled_read(Dimensions full, Dimensions scaled) throws Error {
+ return new Gdk.Pixbuf.from_file_at_scale(get_filepath(), scaled.width, scaled.height, false);
+ }
+}
+
+public abstract class GdkSniffer : PhotoFileSniffer {
+ private DetectedPhotoInformation detected = null;
+ private bool size_ready = false;
+ private bool area_prepared = false;
+
+ public GdkSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ detected = new DetectedPhotoInformation();
+
+ Gdk.PixbufLoader pixbuf_loader = new Gdk.PixbufLoader();
+ pixbuf_loader.size_prepared.connect(on_size_prepared);
+ pixbuf_loader.area_prepared.connect(on_area_prepared);
+
+ // valac chokes on the ternary operator here
+ Checksum? md5_checksum = null;
+ if (calc_md5)
+ md5_checksum = new Checksum(ChecksumType.MD5);
+
+ detected.metadata = new PhotoMetadata();
+ try {
+ detected.metadata.read_from_file(file);
+ } catch (Error err) {
+ // no metadata detected
+ detected.metadata = null;
+ }
+
+ if (calc_md5 && detected.metadata != null) {
+ uint8[]? flattened_sans_thumbnail = detected.metadata.flatten_exif(false);
+ if (flattened_sans_thumbnail != null && flattened_sans_thumbnail.length > 0)
+ detected.exif_md5 = md5_binary(flattened_sans_thumbnail, flattened_sans_thumbnail.length);
+
+ uint8[]? flattened_thumbnail = detected.metadata.flatten_exif_preview();
+ if (flattened_thumbnail != null && flattened_thumbnail.length > 0)
+ detected.thumbnail_md5 = md5_binary(flattened_thumbnail, flattened_thumbnail.length);
+ }
+
+ // if no MD5, don't read as much, as the needed info will probably be gleaned
+ // in the first 8K to 16K
+ uint8[] buffer = calc_md5 ? new uint8[64 * 1024] : new uint8[8 * 1024];
+ size_t count = 0;
+
+ // loop through until all conditions we're searching for are met
+ FileInputStream fins = file.read(null);
+ for (;;) {
+ size_t bytes_read = fins.read(buffer, null);
+ if (bytes_read <= 0)
+ break;
+
+ count += bytes_read;
+
+ if (calc_md5)
+ md5_checksum.update(buffer, bytes_read);
+
+ // keep parsing the image until the size is discovered
+ if (!size_ready || !area_prepared)
+ pixbuf_loader.write(buffer[0:bytes_read]);
+
+ // if not searching for anything else, exit
+ if (!calc_md5 && size_ready && area_prepared)
+ break;
+ }
+
+ // PixbufLoader throws an error if you close it with an incomplete image, so trap this
+ try {
+ pixbuf_loader.close();
+ } catch (Error err) {
+ }
+
+ if (fins != null)
+ fins.close(null);
+
+ if (calc_md5)
+ detected.md5 = md5_checksum.get_string();
+
+ return detected;
+ }
+
+ private void on_size_prepared(Gdk.PixbufLoader loader, int width, int height) {
+ detected.image_dim = Dimensions(width, height);
+ size_ready = true;
+ }
+
+ private void on_area_prepared(Gdk.PixbufLoader pixbuf_loader) {
+ Gdk.Pixbuf? pixbuf = pixbuf_loader.get_pixbuf();
+ if (pixbuf == null)
+ return;
+
+ detected.colorspace = pixbuf.get_colorspace();
+ detected.channels = pixbuf.get_n_channels();
+ detected.bits_per_channel = pixbuf.get_bits_per_sample();
+
+ unowned Gdk.PixbufFormat format = pixbuf_loader.get_format();
+ detected.format_name = format.get_name();
+ detected.file_format = PhotoFileFormat.from_pixbuf_name(detected.format_name);
+
+ area_prepared = true;
+ }
+}
+
diff --git a/src/photos/JfifSupport.vala b/src/photos/JfifSupport.vala
new file mode 100644
index 0000000..12ac80a
--- /dev/null
+++ b/src/photos/JfifSupport.vala
@@ -0,0 +1,236 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class JfifFileFormatDriver : PhotoFileFormatDriver {
+ private static JfifFileFormatDriver instance = null;
+
+ public static void init() {
+ instance = new JfifFileFormatDriver();
+ JfifFileFormatProperties.init();
+ }
+
+ public static JfifFileFormatDriver get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormatProperties get_properties() {
+ return JfifFileFormatProperties.get_instance();
+ }
+
+ public override PhotoFileReader create_reader(string filepath) {
+ return new JfifReader(filepath);
+ }
+
+ public override PhotoMetadata create_metadata() {
+ return new PhotoMetadata();
+ }
+
+ public override bool can_write_image() {
+ return true;
+ }
+
+ public override bool can_write_metadata() {
+ return true;
+ }
+
+ public override PhotoFileWriter? create_writer(string filepath) {
+ return new JfifWriter(filepath);
+ }
+
+ public override PhotoFileMetadataWriter? create_metadata_writer(string filepath) {
+ return new JfifMetadataWriter(filepath);
+ }
+
+ public override PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return new JfifSniffer(file, options);
+ }
+}
+
+public class JfifFileFormatProperties : PhotoFileFormatProperties {
+ private static string[] KNOWN_EXTENSIONS = {
+ "jpg", "jpeg", "jpe"
+ };
+
+ private static string[] KNOWN_MIME_TYPES = {
+ "image/jpeg"
+ };
+
+ private static JfifFileFormatProperties instance = null;
+
+ public static void init() {
+ instance = new JfifFileFormatProperties();
+ }
+
+ public static JfifFileFormatProperties get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.JFIF;
+ }
+
+ public override PhotoFileFormatFlags get_flags() {
+ return PhotoFileFormatFlags.NONE;
+ }
+
+ public override string get_default_extension() {
+ return "jpg";
+ }
+
+ public override string get_user_visible_name() {
+ return _("JPEG");
+ }
+
+ public override string[] get_known_extensions() {
+ return KNOWN_EXTENSIONS;
+ }
+
+ public override string get_default_mime_type() {
+ return KNOWN_MIME_TYPES[0];
+ }
+
+ public override string[] get_mime_types() {
+ return KNOWN_MIME_TYPES;
+ }
+}
+
+public class JfifSniffer : GdkSniffer {
+ public JfifSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ if (!Jpeg.is_jpeg(file))
+ return null;
+
+ DetectedPhotoInformation? detected = base.sniff();
+ if (detected == null)
+ return null;
+
+ return (detected.file_format == PhotoFileFormat.JFIF) ? detected : null;
+ }
+}
+
+public class JfifReader : GdkReader {
+ public JfifReader(string filepath) {
+ base (filepath, PhotoFileFormat.JFIF);
+ }
+}
+
+public class JfifWriter : PhotoFileWriter {
+ public JfifWriter(string filepath) {
+ base (filepath, PhotoFileFormat.JFIF);
+ }
+
+ public override void write(Gdk.Pixbuf pixbuf, Jpeg.Quality quality) throws Error {
+ pixbuf.save(get_filepath(), "jpeg", "quality", quality.get_pct_text());
+ }
+}
+
+public class JfifMetadataWriter : PhotoFileMetadataWriter {
+ public JfifMetadataWriter(string filepath) {
+ base (filepath, PhotoFileFormat.JFIF);
+ }
+
+ public override void write_metadata(PhotoMetadata metadata) throws Error {
+ metadata.write_to_file(get_file());
+ }
+}
+
+namespace Jpeg {
+ public const uint8 MARKER_PREFIX = 0xFF;
+
+ public enum Marker {
+ // Could also be 0xFF according to spec
+ INVALID = 0x00,
+
+ SOI = 0xD8,
+ EOI = 0xD9,
+
+ APP0 = 0xE0,
+ APP1 = 0xE1;
+
+ public uint8 get_byte() {
+ return (uint8) this;
+ }
+ }
+
+ public enum Quality {
+ LOW = 50,
+ MEDIUM = 75,
+ HIGH = 90,
+ MAXIMUM = 100;
+
+ public int get_pct() {
+ return (int) this;
+ }
+
+ public string get_pct_text() {
+ return "%d".printf((int) this);
+ }
+
+ public static Quality[] get_all() {
+ return { LOW, MEDIUM, HIGH, MAXIMUM };
+ }
+
+ public string? to_string() {
+ switch (this) {
+ case LOW:
+ return _("Low (%d%%)").printf((int) this);
+
+ case MEDIUM:
+ return _("Medium (%d%%)").printf((int) this);
+
+ case HIGH:
+ return _("High (%d%%)").printf((int) this);
+
+ case MAXIMUM:
+ return _("Maximum (%d%%)").printf((int) this);
+ }
+
+ warn_if_reached();
+
+ return null;
+ }
+ }
+
+ public bool is_jpeg(File file) throws Error {
+ FileInputStream fins = file.read(null);
+
+ Marker marker;
+ int segment_length = read_marker(fins, out marker);
+
+ // for now, merely checking for SOI
+ return (marker == Marker.SOI) && (segment_length == 0);
+ }
+
+ private int read_marker(FileInputStream fins, out Jpeg.Marker marker) throws Error {
+ marker = Jpeg.Marker.INVALID;
+
+ DataInputStream dins = new DataInputStream(fins);
+ dins.set_byte_order(DataStreamByteOrder.BIG_ENDIAN);
+
+ if (dins.read_byte() != Jpeg.MARKER_PREFIX)
+ return -1;
+
+ marker = (Jpeg.Marker) dins.read_byte();
+ if ((marker == Jpeg.Marker.SOI) || (marker == Jpeg.Marker.EOI)) {
+ // no length
+ return 0;
+ }
+
+ uint16 length = dins.read_uint16();
+ if (length < 2) {
+ debug("Invalid length %Xh at ofs %" + int64.FORMAT + "Xh", length, fins.tell() - 2);
+
+ return -1;
+ }
+
+ // account for two length bytes already read
+ return length - 2;
+ }
+}
+
diff --git a/src/photos/PhotoFileAdapter.vala b/src/photos/PhotoFileAdapter.vala
new file mode 100644
index 0000000..38b00ea
--- /dev/null
+++ b/src/photos/PhotoFileAdapter.vala
@@ -0,0 +1,112 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// PhotoFileAdapter
+//
+// PhotoFileAdapter (and its immediate children, PhotoFileReader and PhotoFileWriter) are drivers
+// hiding details of reading and writing image files and their metadata. They should keep
+// minimal state beyond the filename, if any stat at all. In particular, they should avoid caching
+// values, especially the readers, as writers may be created at any time and invalidate that
+// information, unless the readers monitor the file for these changes.
+//
+// PhotoFileAdapters should be entirely thread-safe. They are not, however, responsible for
+// atomicity on the filesystem.
+//
+
+public abstract class PhotoFileAdapter {
+ private string filepath;
+ private PhotoFileFormat file_format;
+ private File file = null;
+
+ public PhotoFileAdapter(string filepath, PhotoFileFormat file_format) {
+ this.filepath = filepath;
+ this.file_format = file_format;
+ }
+
+ public bool file_exists() {
+ return FileUtils.test(filepath, FileTest.IS_REGULAR);
+ }
+
+ public string get_filepath() {
+ return filepath;
+ }
+
+ public File get_file() {
+ File result;
+ lock (file) {
+ if (file == null)
+ file = File.new_for_path(filepath);
+
+ result = file;
+ }
+
+ return result;
+ }
+
+ public PhotoFileFormat get_file_format() {
+ return file_format;
+ }
+}
+
+//
+// PhotoFileReader
+//
+
+public abstract class PhotoFileReader : PhotoFileAdapter {
+ protected PhotoFileReader(string filepath, PhotoFileFormat file_format) {
+ base (filepath, file_format);
+ }
+
+ public PhotoFileWriter create_writer() throws PhotoFormatError {
+ return get_file_format().create_writer(get_filepath());
+ }
+
+ public PhotoFileMetadataWriter create_metadata_writer() throws PhotoFormatError {
+ return get_file_format().create_metadata_writer(get_filepath());
+ }
+
+ public abstract PhotoMetadata read_metadata() throws Error;
+
+ public abstract Gdk.Pixbuf unscaled_read() throws Error;
+
+ public virtual Gdk.Pixbuf scaled_read(Dimensions full, Dimensions scaled) throws Error {
+ return resize_pixbuf(unscaled_read(), scaled, Gdk.InterpType.BILINEAR);
+ }
+}
+
+//
+// PhotoFileWriter
+//
+
+public abstract class PhotoFileWriter : PhotoFileAdapter {
+ protected PhotoFileWriter(string filepath, PhotoFileFormat file_format) {
+ base (filepath, file_format);
+ }
+
+ public PhotoFileReader create_reader() {
+ return get_file_format().create_reader(get_filepath());
+ }
+
+ public abstract void write(Gdk.Pixbuf pixbuf, Jpeg.Quality quality) throws Error;
+}
+
+//
+// PhotoFileMetadataWriter
+//
+
+public abstract class PhotoFileMetadataWriter : PhotoFileAdapter {
+ protected PhotoFileMetadataWriter(string filepath, PhotoFileFormat file_format) {
+ base (filepath, file_format);
+ }
+
+ public PhotoFileReader create_reader() {
+ return get_file_format().create_reader(get_filepath());
+ }
+
+ public abstract void write_metadata(PhotoMetadata metadata) throws Error;
+}
+
diff --git a/src/photos/PhotoFileFormat.vala b/src/photos/PhotoFileFormat.vala
new file mode 100644
index 0000000..926254d
--- /dev/null
+++ b/src/photos/PhotoFileFormat.vala
@@ -0,0 +1,410 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public errordomain PhotoFormatError {
+ READ_ONLY
+}
+
+//
+// PhotoFileFormat
+//
+
+namespace PhotoFileFormatData {
+ private static PhotoFileFormat[] writeable = null;
+ private static PhotoFileFormat[] image_writeable = null;
+ private static PhotoFileFormat[] metadata_writeable = null;
+
+ private delegate bool ApplicableTest(PhotoFileFormat format);
+
+ private PhotoFileFormat[] find_applicable(ApplicableTest test) {
+ PhotoFileFormat[] applicable = new PhotoFileFormat[0];
+ foreach (PhotoFileFormat format in PhotoFileFormat.get_supported()) {
+ if (test(format))
+ applicable += format;
+ }
+
+ return applicable;
+ }
+
+ public PhotoFileFormat[] get_writeable() {
+ if (writeable == null)
+ writeable = find_applicable((format) => { return format.can_write(); });
+
+ return writeable;
+ }
+
+ public static PhotoFileFormat[] get_image_writeable() {
+ if (image_writeable == null)
+ image_writeable = find_applicable((format) => { return format.can_write_image(); });
+
+ return image_writeable;
+ }
+
+ public static PhotoFileFormat[] get_metadata_writeable() {
+ if (metadata_writeable == null)
+ metadata_writeable = find_applicable((format) => { return format.can_write_metadata(); });
+
+ return metadata_writeable;
+ }
+}
+
+public enum PhotoFileFormat {
+ JFIF,
+ RAW,
+ PNG,
+ TIFF,
+ BMP,
+ UNKNOWN;
+
+ // This is currently listed in the order of detection, that is, the file is examined from
+ // left to right. (See PhotoFileInterrogator.)
+ public static PhotoFileFormat[] get_supported() {
+ return { JFIF, RAW, PNG, TIFF, BMP };
+ }
+
+ public static PhotoFileFormat[] get_writeable() {
+ return PhotoFileFormatData.get_writeable();
+ }
+
+ public static PhotoFileFormat[] get_image_writeable() {
+ return PhotoFileFormatData.get_image_writeable();
+ }
+
+ public static PhotoFileFormat[] get_metadata_writeable() {
+ return PhotoFileFormatData.get_metadata_writeable();
+ }
+
+ public static PhotoFileFormat get_by_basename_extension(string basename) {
+ string name, ext;
+ disassemble_filename(basename, out name, out ext);
+
+ if (is_string_empty(ext))
+ return UNKNOWN;
+
+ foreach (PhotoFileFormat file_format in get_supported()) {
+ if (file_format.get_driver().get_properties().is_recognized_extension(ext))
+ return file_format;
+ }
+
+ return UNKNOWN;
+ }
+
+ public static bool is_file_supported(File file) {
+ return is_basename_supported(file.get_basename());
+ }
+
+ public static bool is_basename_supported(string basename) {
+ string name, ext;
+ disassemble_filename(basename, out name, out ext);
+
+ if (is_string_empty(ext))
+ return false;
+
+ foreach (PhotoFileFormat format in get_supported()) {
+ if (format.get_driver().get_properties().is_recognized_extension(ext))
+ return true;
+ }
+
+ return false;
+ }
+
+ // Guaranteed to be writeable.
+ public static PhotoFileFormat get_system_default_format() {
+ return JFIF;
+ }
+
+ public static PhotoFileFormat get_by_file_extension(File file) {
+ return get_by_basename_extension(file.get_basename());
+ }
+
+ // These values are persisted in the database. DO NOT CHANGE THE INTEGER EQUIVALENTS.
+ public int serialize() {
+ switch (this) {
+ case JFIF:
+ return 0;
+
+ case RAW:
+ return 1;
+
+ case PNG:
+ return 2;
+
+ case TIFF:
+ return 3;
+
+ case BMP:
+ return 4;
+
+ case UNKNOWN:
+ default:
+ return -1;
+ }
+ }
+
+ // These values are persisted in the database. DO NOT CHANGE THE INTEGER EQUIVALENTS.
+ public static PhotoFileFormat unserialize(int value) {
+ switch (value) {
+ case 0:
+ return JFIF;
+
+ case 1:
+ return RAW;
+
+ case 2:
+ return PNG;
+
+ case 3:
+ return TIFF;
+
+ case 4:
+ return BMP;
+
+ default:
+ return UNKNOWN;
+ }
+ }
+
+ public static PhotoFileFormat from_gphoto_type(string type) {
+ switch (type) {
+ case GPhoto.MIME.JPEG:
+ return PhotoFileFormat.JFIF;
+
+ case GPhoto.MIME.RAW:
+ case GPhoto.MIME.CRW:
+ return PhotoFileFormat.RAW;
+
+ case GPhoto.MIME.PNG:
+ return PhotoFileFormat.PNG;
+
+ case GPhoto.MIME.TIFF:
+ return PhotoFileFormat.TIFF;
+
+ case GPhoto.MIME.BMP:
+ return PhotoFileFormat.BMP;
+
+ default:
+ // check file extension against those we support
+ return PhotoFileFormat.UNKNOWN;
+ }
+ }
+
+ // Converts GDK's pixbuf library's name to a PhotoFileFormat
+ public static PhotoFileFormat from_pixbuf_name(string name) {
+ switch (name) {
+ case "jpeg":
+ return PhotoFileFormat.JFIF;
+
+ case "png":
+ return PhotoFileFormat.PNG;
+
+ case "tiff":
+ return PhotoFileFormat.TIFF;
+
+ case "bmp":
+ return PhotoFileFormat.BMP;
+
+ default:
+ return PhotoFileFormat.UNKNOWN;
+ }
+ }
+
+ public void init() {
+ switch (this) {
+ case JFIF:
+ JfifFileFormatDriver.init();
+ break;
+
+ case RAW:
+ RawFileFormatDriver.init();
+ break;
+
+ case PNG:
+ PngFileFormatDriver.init();
+ break;
+
+ case TIFF:
+ Photos.TiffFileFormatDriver.init();
+ break;
+
+ case BMP:
+ Photos.BmpFileFormatDriver.init();
+ break;
+
+ default:
+ error("Unsupported file format %s", this.to_string());
+ }
+ }
+
+ private PhotoFileFormatDriver get_driver() {
+ switch (this) {
+ case JFIF:
+ return JfifFileFormatDriver.get_instance();
+
+ case RAW:
+ return RawFileFormatDriver.get_instance();
+
+ case PNG:
+ return PngFileFormatDriver.get_instance();
+
+ case TIFF:
+ return Photos.TiffFileFormatDriver.get_instance();
+
+ case BMP:
+ return Photos.BmpFileFormatDriver.get_instance();
+
+ default:
+ error("Unsupported file format %s", this.to_string());
+ }
+ }
+
+ public PhotoFileFormatProperties get_properties() {
+ return get_driver().get_properties();
+ }
+
+ // Supplied with a name, returns the name with the file format's default extension.
+ public string get_default_basename(string name) {
+ return "%s.%s".printf(name, get_properties().get_default_extension());
+ }
+
+ public PhotoFileReader create_reader(string filepath) {
+ return get_driver().create_reader(filepath);
+ }
+
+ // This means the image and its metadata are writeable.
+ public bool can_write() {
+ return can_write_image() && can_write_metadata();
+ }
+
+ public bool can_write_image() {
+ return get_driver().can_write_image();
+ }
+
+ public bool can_write_metadata() {
+ return get_driver().can_write_metadata();
+ }
+
+ public PhotoFileWriter create_writer(string filepath) throws PhotoFormatError {
+ PhotoFileWriter writer = get_driver().create_writer(filepath);
+ if (writer == null)
+ throw new PhotoFormatError.READ_ONLY("File format %s is read-only", this.to_string());
+
+ return writer;
+ }
+
+ public PhotoFileMetadataWriter create_metadata_writer(string filepath) throws PhotoFormatError {
+ PhotoFileMetadataWriter writer = get_driver().create_metadata_writer(filepath);
+ if (writer == null)
+ throw new PhotoFormatError.READ_ONLY("File format %s metadata is read-only", this.to_string());
+
+ return writer;
+ }
+
+ public PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return get_driver().create_sniffer(file, options);
+ }
+
+ public PhotoMetadata create_metadata() {
+ return get_driver().create_metadata();
+ }
+
+ public string get_default_mime_type() {
+ return get_driver().get_properties().get_default_mime_type();
+ }
+
+ public string[] get_mime_types() {
+ return get_driver().get_properties().get_mime_types();
+ }
+
+ public static string[] get_editable_mime_types() {
+ string[] mime_types = {};
+
+ foreach (PhotoFileFormat file_format in PhotoFileFormat.get_supported()) {
+ foreach (string mime_type in file_format.get_mime_types())
+ mime_types += mime_type;
+ }
+
+ return mime_types;
+ }
+}
+
+//
+// PhotoFileFormatDriver
+//
+// Each supported file format is expected to have a PhotoFileFormatDriver that returns all possible
+// resources that are needed to operate on file of its particular type. It's expected that each
+// format subsystem will only create and cache a single instance of this driver, although it's
+// not required.
+//
+// Like the other elements in the PhotoFileFormat family, this class should be thread-safe.
+//
+
+public abstract class PhotoFileFormatDriver {
+ public abstract PhotoFileFormatProperties get_properties();
+
+ public abstract PhotoFileReader create_reader(string filepath);
+
+ public abstract PhotoMetadata create_metadata();
+
+ public abstract bool can_write_image();
+
+ public abstract bool can_write_metadata();
+
+ public abstract PhotoFileWriter? create_writer(string filepath);
+
+ public abstract PhotoFileMetadataWriter? create_metadata_writer(string filepath);
+
+ public abstract PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options);
+}
+
+//
+// PhotoFileFormatProperties
+//
+// Although each PhotoFileFormatProperties is expected to be largely static and immutable, these
+// classes should be thread-safe.
+//
+
+public enum PhotoFileFormatFlags {
+ NONE = 0x00000000,
+}
+
+public abstract class PhotoFileFormatProperties {
+ public abstract PhotoFileFormat get_file_format();
+
+ public abstract PhotoFileFormatFlags get_flags();
+
+ // Default implementation will search for ext in get_known_extensions(), assuming they are
+ // all stored in lowercase.
+ public virtual bool is_recognized_extension(string ext) {
+ return is_in_ci_array(ext, get_known_extensions());
+ }
+
+ public abstract string get_default_extension();
+
+ public abstract string[] get_known_extensions();
+
+ public abstract string get_default_mime_type();
+
+ public abstract string[] get_mime_types();
+
+ // returns the user-visible name of the file format -- this name is used in user interface
+ // strings whenever the file format needs to named. This name is not the same as the format
+ // enum value converted to a string. The format enum value is meaningful to developers and is
+ // constant across languages (e.g. "JFIF", "TGA") whereas the user-visible name is translatable
+ // and is meaningful to users (e.g. "JPEG", "Truevision TARGA")
+ public abstract string get_user_visible_name();
+
+ // Takes a given file and returns one with the file format's default extension, unless it
+ // already has one of the format's known extensions
+ public File convert_file_extension(File file) {
+ string name, ext;
+ disassemble_filename(file.get_basename(), out name, out ext);
+ if (ext != null && is_recognized_extension(ext))
+ return file;
+
+ return file.get_parent().get_child("%s.%s".printf(name, get_default_extension()));
+ }
+}
+
diff --git a/src/photos/PhotoFileSniffer.vala b/src/photos/PhotoFileSniffer.vala
new file mode 100644
index 0000000..8bd6711
--- /dev/null
+++ b/src/photos/PhotoFileSniffer.vala
@@ -0,0 +1,90 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class DetectedPhotoInformation {
+ public PhotoFileFormat file_format = PhotoFileFormat.UNKNOWN;
+ public PhotoMetadata? metadata = null;
+ public string? md5 = null;
+ public string? exif_md5 = null;
+ public string? thumbnail_md5 = null;
+ public string? format_name = null;
+ public Dimensions image_dim = Dimensions();
+ public Gdk.Colorspace colorspace = Gdk.Colorspace.RGB;
+ public int channels = 0;
+ public int bits_per_channel = 0;
+}
+
+//
+// A PhotoFileSniffer is expected to examine the supplied file as efficiently as humanly possible
+// to detect (a) if it is of a file format supported by the particular sniffer, and (b) fill out
+// a DetectedPhotoInformation record and return it to the caller.
+//
+// The PhotoFileSniffer is not expected to cache information. It should return a fresh
+// DetectedPhotoInformation record each time.
+//
+// PhotoFileSniffer must be thread-safe. Like PhotoFileAdapters, it is not expected to guarantee
+// atomicity with respect to the filesystem.
+//
+
+public abstract class PhotoFileSniffer {
+ public enum Options {
+ GET_ALL = 0x00000000,
+ NO_MD5 = 0x00000001
+ }
+
+ protected File file;
+ protected Options options;
+ protected bool calc_md5;
+
+ public PhotoFileSniffer(File file, Options options) {
+ this.file = file;
+ this.options = options;
+
+ calc_md5 = (options & Options.NO_MD5) == 0;
+ }
+
+ public abstract DetectedPhotoInformation? sniff() throws Error;
+}
+
+//
+// PhotoFileInterrogator
+//
+// A PhotoFileInterrogator is merely an aggregator of PhotoFileSniffers. It will create sniffers
+// for each supported PhotoFileFormat and see if they recognize the file.
+//
+// The PhotoFileInterrogator is not thread-safe.
+//
+
+public class PhotoFileInterrogator {
+ private File file;
+ private PhotoFileSniffer.Options options;
+ private DetectedPhotoInformation? detected = null;
+
+ public PhotoFileInterrogator(File file,
+ PhotoFileSniffer.Options options = PhotoFileSniffer.Options.GET_ALL) {
+ this.file = file;
+ this.options = options;
+ }
+
+ // This should only be called after interrogate(). Will return null every time, otherwise.
+ // If called after interrogate and returns null, that indicates the file is not an image file.
+ public DetectedPhotoInformation? get_detected_photo_information() {
+ return detected;
+ }
+
+ public void interrogate() throws Error {
+ foreach (PhotoFileFormat file_format in PhotoFileFormat.get_supported()) {
+ PhotoFileSniffer sniffer = file_format.create_sniffer(file, options);
+ detected = sniffer.sniff();
+ if (detected != null) {
+ assert(detected.file_format == file_format);
+
+ break;
+ }
+ }
+ }
+}
+
diff --git a/src/photos/PhotoMetadata.vala b/src/photos/PhotoMetadata.vala
new file mode 100644
index 0000000..37804bf
--- /dev/null
+++ b/src/photos/PhotoMetadata.vala
@@ -0,0 +1,1169 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+//
+// PhotoMetadata
+//
+// PhotoMetadata is a wrapper class around gexiv2. The reasoning for this is (a) to facilitiate
+// interface changes to meet Shotwell's requirements without needing modifications of the library
+// itself, and (b) some requirements for this class (i.e. obtaining raw metadata) is not available
+// in gexiv2, and so must be done by hand.
+//
+// Although it's perceived that Exiv2 will remain Shotwell's metadata library of choice, this
+// may change in the future, and so this wrapper helps with that as well.
+//
+// There is no expectation of thread-safety in this class (yet).
+//
+// Tags come from Exiv2's naming scheme:
+// http://www.exiv2.org/metadata.html
+//
+
+public enum MetadataDomain {
+ UNKNOWN,
+ EXIF,
+ XMP,
+ IPTC
+}
+
+public class HierarchicalKeywordField {
+ public string field_name;
+ public string path_separator;
+ public bool wants_leading_separator;
+ public bool is_writeable;
+
+ public HierarchicalKeywordField(string field_name, string path_separator,
+ bool wants_leading_separator, bool is_writeable) {
+ this.field_name = field_name;
+ this.path_separator = path_separator;
+ this.wants_leading_separator = wants_leading_separator;
+ this.is_writeable = is_writeable;
+ }
+}
+
+public abstract class PhotoPreview {
+ private string name;
+ private Dimensions dimensions;
+ private uint32 size;
+ private string mime_type;
+ private string extension;
+
+ public PhotoPreview(string name, Dimensions dimensions, uint32 size, string mime_type, string extension) {
+ this.name = name;
+ this.dimensions = dimensions;
+ this.size = size;
+ this.mime_type = mime_type;
+ this.extension = extension;
+ }
+
+ public string get_name() {
+ return name;
+ }
+
+ public Dimensions get_pixel_dimensions() {
+ return dimensions;
+ }
+
+ public uint32 get_size() {
+ return size;
+ }
+
+ public string get_mime_type() {
+ return mime_type;
+ }
+
+ public string get_extension() {
+ return extension;
+ }
+
+ public abstract uint8[] flatten() throws Error;
+
+ public virtual Gdk.Pixbuf? get_pixbuf() throws Error {
+ uint8[] flattened = flatten();
+
+ // Need to create from stream or file for decode ... catch decode error and return null,
+ // different from an I/O error causing the problem
+ try {
+ return new Gdk.Pixbuf.from_stream(new MemoryInputStream.from_data(flattened, null),
+ null);
+ } catch (Error err) {
+ warning("Unable to decode thumbnail for %s: %s", name, err.message);
+
+ return null;
+ }
+ }
+}
+
+public class PhotoMetadata : MediaMetadata {
+ public enum SetOption {
+ ALL_DOMAINS,
+ ONLY_IF_DOMAIN_PRESENT,
+ AT_LEAST_DEFAULT_DOMAIN
+ }
+
+ private const PrepareInputTextOptions PREPARE_STRING_OPTIONS =
+ PrepareInputTextOptions.INVALID_IS_NULL
+ | PrepareInputTextOptions.EMPTY_IS_NULL
+ | PrepareInputTextOptions.STRIP
+ | PrepareInputTextOptions.STRIP_CRLF
+ | PrepareInputTextOptions.NORMALIZE
+ | PrepareInputTextOptions.VALIDATE;
+
+ private class InternalPhotoPreview : PhotoPreview {
+ public PhotoMetadata owner;
+ public uint number;
+
+ public InternalPhotoPreview(PhotoMetadata owner, string name, uint number,
+ GExiv2.PreviewProperties props) {
+ base (name, Dimensions((int) props.get_width(), (int) props.get_height()),
+ props.get_size(), props.get_mime_type(), props.get_extension());
+
+ this.owner = owner;
+ this.number = number;
+ }
+
+ public override uint8[] flatten() throws Error {
+ unowned GExiv2.PreviewProperties?[] props = owner.exiv2.get_preview_properties();
+ assert(props != null && props.length > number);
+
+ return owner.exiv2.get_preview_image(props[number]).get_data();
+ }
+ }
+
+ private GExiv2.Metadata exiv2 = new GExiv2.Metadata();
+ private Exif.Data? exif = null;
+ string source_name = "<uninitialized>";
+
+ public PhotoMetadata() {
+ }
+
+ public override void read_from_file(File file) throws Error {
+ exiv2 = new GExiv2.Metadata();
+ exif = null;
+
+ exiv2.open_path(file.get_path());
+ exif = Exif.Data.new_from_file(file.get_path());
+ source_name = file.get_basename();
+ }
+
+ public void write_to_file(File file) throws Error {
+ exiv2.save_file(file.get_path());
+ }
+
+ public void read_from_buffer(uint8[] buffer, int length = 0) throws Error {
+ if (length <= 0)
+ length = buffer.length;
+
+ assert(buffer.length >= length);
+
+ exiv2 = new GExiv2.Metadata();
+ exif = null;
+
+ exiv2.open_buf(buffer, length);
+ exif = Exif.Data.new_from_data(buffer, length);
+ source_name = "<memory buffer %d bytes>".printf(length);
+ }
+
+ public void read_from_app1_segment(uint8[] buffer, int length = 0) throws Error {
+ if (length <= 0)
+ length = buffer.length;
+
+ assert(buffer.length >= length);
+
+ exiv2 = new GExiv2.Metadata();
+ exif = null;
+
+ exiv2.from_app1_segment(buffer, length);
+ exif = Exif.Data.new_from_data(buffer, length);
+ source_name = "<app1 segment %d bytes>".printf(length);
+ }
+
+ public static MetadataDomain get_tag_domain(string tag) {
+ if (GExiv2.Metadata.is_exif_tag(tag))
+ return MetadataDomain.EXIF;
+
+ if (GExiv2.Metadata.is_xmp_tag(tag))
+ return MetadataDomain.XMP;
+
+ if (GExiv2.Metadata.is_iptc_tag(tag))
+ return MetadataDomain.IPTC;
+
+ return MetadataDomain.UNKNOWN;
+ }
+
+ public bool has_domain(MetadataDomain domain) {
+ switch (domain) {
+ case MetadataDomain.EXIF:
+ return exiv2.has_exif();
+
+ case MetadataDomain.XMP:
+ return exiv2.has_xmp();
+
+ case MetadataDomain.IPTC:
+ return exiv2.has_iptc();
+
+ case MetadataDomain.UNKNOWN:
+ default:
+ return false;
+ }
+ }
+
+ public bool has_exif() {
+ return has_domain(MetadataDomain.EXIF);
+ }
+
+ public bool has_xmp() {
+ return has_domain(MetadataDomain.XMP);
+ }
+
+ public bool has_iptc() {
+ return has_domain(MetadataDomain.IPTC);
+ }
+
+ public bool can_write_to_domain(MetadataDomain domain) {
+ switch (domain) {
+ case MetadataDomain.EXIF:
+ return exiv2.get_supports_exif();
+
+ case MetadataDomain.XMP:
+ return exiv2.get_supports_xmp();
+
+ case MetadataDomain.IPTC:
+ return exiv2.get_supports_iptc();
+
+ case MetadataDomain.UNKNOWN:
+ default:
+ return false;
+ }
+ }
+
+ public bool can_write_exif() {
+ return can_write_to_domain(MetadataDomain.EXIF);
+ }
+
+ public bool can_write_xmp() {
+ return can_write_to_domain(MetadataDomain.XMP);
+ }
+
+ public bool can_write_iptc() {
+ return can_write_to_domain(MetadataDomain.IPTC);
+ }
+
+ public bool has_tag(string tag) {
+ return exiv2.has_tag(tag);
+ }
+
+ private Gee.Set<string> create_string_set(owned CompareDataFunc<string>? compare_func) {
+ // ternary doesn't work here
+ if (compare_func == null)
+ return new Gee.HashSet<string>();
+ else
+ return new Gee.TreeSet<string>((owned) compare_func);
+ }
+
+ public Gee.Collection<string>? get_tags(MetadataDomain domain,
+ owned CompareDataFunc<string>? compare_func = null) {
+ string[] tags = null;
+ switch (domain) {
+ case MetadataDomain.EXIF:
+ tags = exiv2.get_exif_tags();
+ break;
+
+ case MetadataDomain.XMP:
+ tags = exiv2.get_xmp_tags();
+ break;
+
+ case MetadataDomain.IPTC:
+ tags = exiv2.get_iptc_tags();
+ break;
+ }
+
+ if (tags == null || tags.length == 0)
+ return null;
+
+ Gee.Collection<string> collection = create_string_set((owned) compare_func);
+ foreach (string tag in tags)
+ collection.add(tag);
+
+ return collection;
+ }
+
+ public Gee.Collection<string> get_all_tags(
+ owned CompareDataFunc<string>? compare_func = null) {
+ Gee.Collection<string> all_tags = create_string_set((owned) compare_func);
+
+ Gee.Collection<string>? exif_tags = get_tags(MetadataDomain.EXIF);
+ if (exif_tags != null && exif_tags.size > 0)
+ all_tags.add_all(exif_tags);
+
+ Gee.Collection<string>? xmp_tags = get_tags(MetadataDomain.XMP);
+ if (xmp_tags != null && xmp_tags.size > 0)
+ all_tags.add_all(xmp_tags);
+
+ Gee.Collection<string>? iptc_tags = get_tags(MetadataDomain.IPTC);
+ if (iptc_tags != null && iptc_tags.size > 0)
+ all_tags.add_all(iptc_tags);
+
+ return all_tags.size > 0 ? all_tags : null;
+ }
+
+ public string? get_tag_label(string tag) {
+ return GExiv2.Metadata.get_tag_label(tag);
+ }
+
+ public string? get_tag_description(string tag) {
+ return GExiv2.Metadata.get_tag_description(tag);
+ }
+
+ public string? get_string(string tag, PrepareInputTextOptions options = PREPARE_STRING_OPTIONS) {
+ return prepare_input_text(exiv2.get_tag_string(tag), options, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ }
+
+ public string? get_string_interpreted(string tag, PrepareInputTextOptions options = PREPARE_STRING_OPTIONS) {
+ return prepare_input_text(exiv2.get_tag_interpreted_string(tag), options, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ }
+
+ public string? get_first_string(string[] tags) {
+ foreach (string tag in tags) {
+ string? value = get_string(tag);
+ if (value != null)
+ return value;
+ }
+
+ return null;
+ }
+
+ public string? get_first_string_interpreted(string[] tags) {
+ foreach (string tag in tags) {
+ string? value = get_string_interpreted(tag);
+ if (value != null)
+ return value;
+ }
+
+ return null;
+ }
+
+ // Returns a List that has been filtered through a Set, so no duplicates will be returned.
+ //
+ // NOTE: get_tag_multiple() in gexiv2 currently does not work with EXIF tags (as EXIF can
+ // never return a list of strings). It will quietly return NULL if attempted. Until fixed
+ // (there or here), don't use this function to access EXIF. See:
+ // http://trac.yorba.org/ticket/2966
+ public Gee.List<string>? get_string_multiple(string tag) {
+ string[] values = exiv2.get_tag_multiple(tag);
+ if (values == null || values.length == 0)
+ return null;
+
+ Gee.List<string> list = new Gee.ArrayList<string>();
+
+ Gee.HashSet<string> collection = new Gee.HashSet<string>();
+ foreach (string value in values) {
+ string? prepped = prepare_input_text(value, PREPARE_STRING_OPTIONS,
+ DEFAULT_USER_TEXT_INPUT_LENGTH);
+
+ if (prepped != null && !collection.contains(prepped)) {
+ list.add(prepped);
+ collection.add(prepped);
+ }
+ }
+
+ return list.size > 0 ? list : null;
+ }
+
+ // Returns a List that has been filtered through a Set, so no duplicates will be found.
+ //
+ // NOTE: get_tag_multiple() in gexiv2 currently does not work with EXIF tags (as EXIF can
+ // never return a list of strings). It will quietly return NULL if attempted. Until fixed
+ // (there or here), don't use this function to access EXIF. See:
+ // http://trac.yorba.org/ticket/2966
+ public Gee.List<string>? get_first_string_multiple(string[] tags) {
+ foreach (string tag in tags) {
+ Gee.List<string>? values = get_string_multiple(tag);
+ if (values != null && values.size > 0)
+ return values;
+ }
+
+ return null;
+ }
+
+ public void set_string(string tag, string value, PrepareInputTextOptions options = PREPARE_STRING_OPTIONS) {
+ string? prepped = prepare_input_text(value, options, DEFAULT_USER_TEXT_INPUT_LENGTH);
+ if (prepped == null) {
+ warning("Not setting tag %s to string %s: invalid UTF-8", tag, value);
+
+ return;
+ }
+
+ if (!exiv2.set_tag_string(tag, prepped))
+ warning("Unable to set tag %s to string %s from source %s", tag, value, source_name);
+ }
+
+ private delegate void SetGenericValue(string tag);
+
+ private void set_all_generic(string[] tags, SetOption option, SetGenericValue setter) {
+ bool written = false;
+ foreach (string tag in tags) {
+ if (option == SetOption.ALL_DOMAINS || has_domain(get_tag_domain(tag))) {
+ setter(tag);
+ written = true;
+ }
+ }
+
+ if (option == SetOption.AT_LEAST_DEFAULT_DOMAIN && !written && tags.length > 0) {
+ MetadataDomain default_domain = get_tag_domain(tags[0]);
+
+ // write at least the first one, as it's the default
+ setter(tags[0]);
+
+ // write the remainder, if they are of the same domain
+ for (int ctr = 1; ctr < tags.length; ctr++) {
+ if (get_tag_domain(tags[ctr]) == default_domain)
+ setter(tags[ctr]);
+ }
+ }
+ }
+
+ public void set_all_string(string[] tags, string value, SetOption option) {
+ set_all_generic(tags, option, (tag) => { set_string(tag, value); });
+ }
+
+ public void set_string_multiple(string tag, Gee.Collection<string> collection) {
+ string[] values = new string[0];
+ foreach (string value in collection) {
+ string? prepped = prepare_input_text(value, PREPARE_STRING_OPTIONS,-1);
+ if (prepped != null)
+ values += prepped;
+ else
+ warning("Unable to set string %s to %s: invalid UTF-8", value, tag);
+ }
+
+ if (values.length == 0)
+ return;
+
+ // append a null pointer to the end of the string array -- this is a necessary
+ // workaround for http://trac.yorba.org/ticket/3264. See also
+ // http://trac.yorba.org/ticket/3257, which describes the user-visible behavior
+ // seen in the Flickr Connector as a result of the former bug.
+ values += null;
+
+ if (!exiv2.set_tag_multiple(tag, values))
+ warning("Unable to set %d strings to tag %s from source %s", values.length, tag, source_name);
+ }
+
+ public void set_all_string_multiple(string[] tags, Gee.Collection<string> values, SetOption option) {
+ set_all_generic(tags, option, (tag) => { set_string_multiple(tag, values); });
+ }
+
+ public bool get_long(string tag, out long value) {
+ if (!has_tag(tag)) {
+ value = 0;
+
+ return false;
+ }
+
+ value = exiv2.get_tag_long(tag);
+
+ return true;
+ }
+
+ public bool get_first_long(string[] tags, out long value) {
+ foreach (string tag in tags) {
+ if (get_long(tag, out value))
+ return true;
+ }
+
+ value = 0;
+
+ return false;
+ }
+
+ public void set_long(string tag, long value) {
+ if (!exiv2.set_tag_long(tag, value))
+ warning("Unable to set tag %s to long %ld from source %s", tag, value, source_name);
+ }
+
+ public void set_all_long(string[] tags, long value, SetOption option) {
+ set_all_generic(tags, option, (tag) => { set_long(tag, value); });
+ }
+
+ public bool get_rational(string tag, out MetadataRational rational) {
+ int numerator, denominator;
+ bool result = exiv2.get_exif_tag_rational(tag, out numerator, out denominator);
+
+ rational = MetadataRational(numerator, denominator);
+
+ return result;
+ }
+
+ public bool get_first_rational(string[] tags, out MetadataRational rational) {
+ foreach (string tag in tags) {
+ if (get_rational(tag, out rational))
+ return true;
+ }
+
+ rational = MetadataRational(0, 0);
+
+ return false;
+ }
+
+ public void set_rational(string tag, MetadataRational rational) {
+ if (!exiv2.set_exif_tag_rational(tag, rational.numerator, rational.denominator)) {
+ warning("Unable to set tag %s to rational %s from source %s", tag, rational.to_string(),
+ source_name);
+ }
+ }
+
+ public void set_all_rational(string[] tags, MetadataRational rational, SetOption option) {
+ set_all_generic(tags, option, (tag) => { set_rational(tag, rational); });
+ }
+
+ public MetadataDateTime? get_date_time(string tag) {
+ string? value = get_string(tag);
+ if (value == null)
+ return null;
+
+ try {
+ switch (get_tag_domain(tag)) {
+ case MetadataDomain.XMP:
+ return new MetadataDateTime.from_xmp(value);
+
+ // TODO: IPTC date/time support (which is tricky here, because date/time values
+ // are stored in separate tags)
+ case MetadataDomain.IPTC:
+ return null;
+
+ case MetadataDomain.EXIF:
+ default:
+ return new MetadataDateTime.from_exif(value);
+ }
+ } catch (Error err) {
+ warning("Unable to read date/time %s from source %s: %s", tag, source_name, err.message);
+
+ return null;
+ }
+ }
+
+ public MetadataDateTime? get_first_date_time(string[] tags) {
+ foreach (string tag in tags) {
+ MetadataDateTime? date_time = get_date_time(tag);
+ if (date_time != null)
+ return date_time;
+ }
+
+ return null;
+ }
+
+ public void set_date_time(string tag, MetadataDateTime date_time) {
+ switch (get_tag_domain(tag)) {
+ case MetadataDomain.EXIF:
+ set_string(tag, date_time.get_exif_label());
+ break;
+
+ case MetadataDomain.XMP:
+ set_string(tag, date_time.get_xmp_label());
+ break;
+
+ // TODO: Support IPTC date/time (which are stored in separate tags)
+ case MetadataDomain.IPTC:
+ default:
+ warning("Cannot set date/time for %s from source %s: unsupported metadata domain %s", tag,
+ source_name, get_tag_domain(tag).to_string());
+ break;
+ }
+ }
+
+ public void set_all_date_time(string[] tags, MetadataDateTime date_time, SetOption option) {
+ set_all_generic(tags, option, (tag) => { set_date_time(tag, date_time); });
+ }
+
+ // Returns raw bytes of EXIF metadata, including signature and optionally the preview (if present).
+ public uint8[]? flatten_exif(bool include_preview) {
+ if (exif == null)
+ return null;
+
+ // save thumbnail to strip if no attachments requested (so it can be added back and
+ // deallocated automatically)
+ uchar *thumbnail = exif.data;
+ uint thumbnail_size = exif.size;
+ if (!include_preview) {
+ exif.data = null;
+ exif.size = 0;
+ }
+
+ uint8[]? flattened = null;
+
+ // save the struct to a buffer and copy into a Vala-friendly one
+ uchar *saved_data = null;
+ uint saved_size = 0;
+ exif.save_data(&saved_data, &saved_size);
+ if (saved_size > 0 && saved_data != null) {
+ flattened = new uint8[saved_size];
+ Memory.copy(flattened, saved_data, saved_size);
+
+ Exif.Mem.new_default().free(saved_data);
+ }
+
+ // restore thumbnail (this works in either case)
+ exif.data = thumbnail;
+ exif.size = thumbnail_size;
+
+ return flattened;
+ }
+
+ // Returns raw bytes of EXIF preview, if present
+ public uint8[]? flatten_exif_preview() {
+ uchar[] buffer;
+ return exiv2.get_exif_thumbnail(out buffer) ? buffer : null;
+ }
+
+ public uint get_preview_count() {
+ unowned GExiv2.PreviewProperties?[] props = exiv2.get_preview_properties();
+
+ return (props != null) ? props.length : 0;
+ }
+
+ // Previews are sorted from smallest to largest (width x height)
+ public PhotoPreview? get_preview(uint number) {
+ unowned GExiv2.PreviewProperties?[] props = exiv2.get_preview_properties();
+ if (props == null || props.length <= number)
+ return null;
+
+ return new InternalPhotoPreview(this, source_name, number, props[number]);
+ }
+
+ public void remove_exif_thumbnail() {
+ exiv2.erase_exif_thumbnail();
+ if (exif != null) {
+ Exif.Mem.new_default().free(exif.data);
+ exif.data = null;
+ exif.size = 0;
+ }
+ }
+
+ public void remove_tag(string tag) {
+ exiv2.clear_tag(tag);
+ }
+
+ public void remove_tags(string[] tags) {
+ foreach (string tag in tags)
+ remove_tag(tag);
+ }
+
+ public void clear_domain(MetadataDomain domain) {
+ switch (domain) {
+ case MetadataDomain.EXIF:
+ exiv2.clear_exif();
+ break;
+
+ case MetadataDomain.XMP:
+ exiv2.clear_xmp();
+ break;
+
+ case MetadataDomain.IPTC:
+ exiv2.clear_iptc();
+ break;
+ }
+ }
+
+ public void clear() {
+ exiv2.clear();
+ }
+
+ private static string[] DATE_TIME_TAGS = {
+ "Exif.Image.DateTime",
+ "Xmp.tiff.DateTime",
+ "Xmp.xmp.ModifyDate"
+ };
+
+ public MetadataDateTime? get_modification_date_time() {
+ return get_first_date_time(DATE_TIME_TAGS);
+ }
+
+ public void set_modification_date_time(MetadataDateTime? date_time,
+ SetOption option = SetOption.ALL_DOMAINS) {
+ if (date_time != null)
+ set_all_date_time(DATE_TIME_TAGS, date_time, option);
+ else
+ remove_tags(DATE_TIME_TAGS);
+ }
+
+ private static string[] EXPOSURE_DATE_TIME_TAGS = {
+ "Exif.Photo.DateTimeOriginal",
+ "Xmp.exif.DateTimeOriginal",
+ "Xmp.xmp.CreateDate",
+ "Exif.Photo.DateTimeDigitized",
+ "Xmp.exif.DateTimeDigitized",
+ "Exif.Image.DateTime"
+ };
+
+ public MetadataDateTime? get_exposure_date_time() {
+ return get_first_date_time(EXPOSURE_DATE_TIME_TAGS);
+ }
+
+ public void set_exposure_date_time(MetadataDateTime? date_time,
+ SetOption option = SetOption.ALL_DOMAINS) {
+ if (date_time != null)
+ set_all_date_time(EXPOSURE_DATE_TIME_TAGS, date_time, option);
+ else
+ remove_tags(EXPOSURE_DATE_TIME_TAGS);
+ }
+
+ private static string[] DIGITIZED_DATE_TIME_TAGS = {
+ "Exif.Photo.DateTimeDigitized",
+ "Xmp.exif.DateTimeDigitized"
+ };
+
+ public MetadataDateTime? get_digitized_date_time() {
+ return get_first_date_time(DIGITIZED_DATE_TIME_TAGS);
+ }
+
+ public void set_digitized_date_time(MetadataDateTime? date_time,
+ SetOption option = SetOption.ALL_DOMAINS) {
+ if (date_time != null)
+ set_all_date_time(DIGITIZED_DATE_TIME_TAGS, date_time, option);
+ else
+ remove_tags(DIGITIZED_DATE_TIME_TAGS);
+ }
+
+ public override MetadataDateTime? get_creation_date_time() {
+ MetadataDateTime? creation = get_exposure_date_time();
+ if (creation == null)
+ creation = get_digitized_date_time();
+
+ return creation;
+ }
+
+ private static string[] WIDTH_TAGS = {
+ "Exif.Photo.PixelXDimension",
+ "Xmp.exif.PixelXDimension",
+ "Xmp.tiff.ImageWidth",
+ "Xmp.exif.PixelXDimension"
+ };
+
+ public static string[] HEIGHT_TAGS = {
+ "Exif.Photo.PixelYDimension",
+ "Xmp.exif.PixelYDimension",
+ "Xmp.tiff.ImageHeight",
+ "Xmp.exif.PixelYDimension"
+ };
+
+ public Dimensions? get_pixel_dimensions() {
+ // walk the tag arrays concurrently, returning the dimensions of the first found pair
+ assert(WIDTH_TAGS.length == HEIGHT_TAGS.length);
+ for (int ctr = 0; ctr < WIDTH_TAGS.length; ctr++) {
+ // Can't turn this into a single if statement with an || bailing out due to this bug:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=565385
+ long width;
+ if (!get_long(WIDTH_TAGS[ctr], out width))
+ continue;
+
+ long height;
+ if (!get_long(HEIGHT_TAGS[ctr], out height))
+ continue;
+
+ return Dimensions((int) width, (int) height);
+ }
+
+ return null;
+ }
+
+ public void set_pixel_dimensions(Dimensions? dim, SetOption option = SetOption.ALL_DOMAINS) {
+ if (dim != null) {
+ set_all_long(WIDTH_TAGS, dim.width, option);
+ set_all_long(HEIGHT_TAGS, dim.height, option);
+ } else {
+ remove_tags(WIDTH_TAGS);
+ remove_tags(HEIGHT_TAGS);
+ }
+ }
+
+ //
+ // A note regarding titles and descriptions:
+ //
+ // iPhoto stores its title in Iptc.Application2.ObjectName and its description in
+ // Iptc.Application2.Caption. Most others use .Caption for the title and another
+ // (sometimes) appropriate tag for the description. And there's general confusion about
+ // whether Exif.Image.ImageDescription is a description (which is what the tag name
+ // suggests) or a title (which is what the specification states).
+ // See: http://trac.yorba.org/wiki/PhotoTags
+ //
+ // Hence, the following logic tries to do the right thing in most of these cases. If
+ // the iPhoto title tag is detected, it and the iPhoto description tag are used. Otherwise,
+ // the title/description are searched out from a list of standard tags.
+ //
+ // Exif.Image.ImageDescription seems to be abused, both in that iPhoto uses it as a multiline
+ // description and that some cameras insert their make & model information there (IN ALL CAPS,
+ // to really rub it in). We are ignoring the field until a compelling reason to support it
+ // is found.
+ //
+
+ private const string IPHOTO_TITLE_TAG = "Iptc.Application2.ObjectName";
+
+ private static string[] STANDARD_TITLE_TAGS = {
+ "Iptc.Application2.Caption",
+ "Xmp.dc.title",
+ "Iptc.Application2.Headline",
+ "Xmp.photoshop.Headline"
+ };
+
+ public override string? get_title() {
+ // using get_string_multiple()/get_first_string_multiple() because it's possible for
+ // multiple strings to be specified in XMP for different language codes, and want to
+ // retrieve only the first one (other get_string variants will return ugly strings like
+ //
+ // lang="x-default" Xyzzy
+ //
+ // but get_string_multiple will return a list of titles w/o language information
+ Gee.List<string>? titles = has_tag(IPHOTO_TITLE_TAG)
+ ? get_string_multiple(IPHOTO_TITLE_TAG)
+ : get_first_string_multiple(STANDARD_TITLE_TAGS);
+
+ // use the first string every time (assume it's default)
+ // TODO: We could get a list of all titles by their lang="<iso code>" and attempt to find
+ // the right one for the user's locale, but this does not seem to be a normal use case
+ string? title = (titles != null && titles.size > 0) ? titles[0] : null;
+
+ // strip out leading and trailing whitespace
+ if (title != null)
+ title = title.strip();
+
+ // check for \n and \r to prevent multiline titles, which have been spotted in the wild
+ return (!is_string_empty(title) && !title.contains("\n") && !title.contains("\r")) ?
+ title : null;
+ }
+
+ public void set_title(string? title, SetOption option = SetOption.ALL_DOMAINS) {
+ if (!is_string_empty(title)) {
+ if (has_tag(IPHOTO_TITLE_TAG))
+ set_string(IPHOTO_TITLE_TAG, title);
+ else
+ set_all_string(STANDARD_TITLE_TAGS, title, option);
+ } else {
+ remove_tags(STANDARD_TITLE_TAGS);
+ }
+ }
+
+ public override string? get_comment() {
+ return get_string_interpreted("Exif.Photo.UserComment", PrepareInputTextOptions.DEFAULT & ~PrepareInputTextOptions.STRIP_CRLF);
+ }
+
+ public void set_comment(string? comment) {
+ if (!is_string_empty(comment))
+ set_string("Exif.Photo.UserComment", comment, PrepareInputTextOptions.DEFAULT & ~PrepareInputTextOptions.STRIP_CRLF);
+ else
+ remove_tag("Exif.Photo.UserComment");
+ }
+
+ private static string[] KEYWORD_TAGS = {
+ "Xmp.dc.subject",
+ "Iptc.Application2.Keywords"
+ };
+
+ private static HierarchicalKeywordField[] HIERARCHICAL_KEYWORD_TAGS = {
+ // Xmp.lr.hierarchicalSubject should be writeable but isn't due to this bug
+ // in libexiv2: http://dev.exiv2.org/issues/784
+ new HierarchicalKeywordField("Xmp.lr.hierarchicalSubject", "|", false, false),
+ new HierarchicalKeywordField("Xmp.digiKam.TagsList", "/", false, true),
+ new HierarchicalKeywordField("Xmp.MicrosoftPhoto.LastKeywordXMP", "/", false, true)
+ };
+
+ public Gee.Set<string>? get_keywords(owned CompareDataFunc<string>? compare_func = null) {
+ Gee.Set<string> keywords = null;
+ foreach (string tag in KEYWORD_TAGS) {
+ Gee.Collection<string>? values = get_string_multiple(tag);
+ if (values != null && values.size > 0) {
+ if (keywords == null)
+ keywords = create_string_set((owned) compare_func);
+
+ foreach (string current_value in values)
+ keywords.add(HierarchicalTagUtilities.make_flat_tag_safe(current_value));
+ }
+ }
+
+ return (keywords != null && keywords.size > 0) ? keywords : null;
+ }
+
+ private void internal_set_hierarchical_keywords(HierarchicalTagIndex? index) {
+ foreach (HierarchicalKeywordField current_field in HIERARCHICAL_KEYWORD_TAGS)
+ remove_tag(current_field.field_name);
+
+ if (index == null)
+ return;
+
+ foreach (HierarchicalKeywordField current_field in HIERARCHICAL_KEYWORD_TAGS) {
+ if (!current_field.is_writeable)
+ continue;
+
+ Gee.Set<string> writeable_set = new Gee.TreeSet<string>();
+
+ foreach (string current_path in index.get_all_paths()) {
+ string writeable_path = current_path.replace(Tag.PATH_SEPARATOR_STRING,
+ current_field.path_separator);
+ if (!current_field.wants_leading_separator)
+ writeable_path = writeable_path.substring(1);
+
+ writeable_set.add(writeable_path);
+ }
+
+ set_string_multiple(current_field.field_name, writeable_set);
+ }
+ }
+
+ public void set_keywords(Gee.Collection<string>? keywords, SetOption option = SetOption.ALL_DOMAINS) {
+ HierarchicalTagIndex htag_index = new HierarchicalTagIndex();
+ Gee.Set<string> flat_keywords = new Gee.TreeSet<string>();
+
+ if (keywords != null) {
+ foreach (string keyword in keywords) {
+ if (keyword.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ Gee.Collection<string> path_components =
+ HierarchicalTagUtilities.enumerate_path_components(keyword);
+ foreach (string component in path_components)
+ htag_index.add_path(component, keyword);
+ } else {
+ flat_keywords.add(keyword);
+ }
+ }
+
+ flat_keywords.add_all(htag_index.get_all_tags());
+ }
+
+ if (keywords != null) {
+ set_all_string_multiple(KEYWORD_TAGS, flat_keywords, option);
+ internal_set_hierarchical_keywords(htag_index);
+ } else {
+ remove_tags(KEYWORD_TAGS);
+ internal_set_hierarchical_keywords(null);
+ }
+ }
+
+ public bool has_hierarchical_keywords() {
+ foreach (HierarchicalKeywordField field in HIERARCHICAL_KEYWORD_TAGS) {
+ Gee.Collection<string>? values = get_string_multiple(field.field_name);
+
+ if (values != null && values.size > 0)
+ return true;
+ }
+
+ return false;
+ }
+
+ public Gee.Set<string> get_hierarchical_keywords() {
+ assert(has_hierarchical_keywords());
+
+ Gee.Set<string> h_keywords = create_string_set(null);
+
+ foreach (HierarchicalKeywordField field in HIERARCHICAL_KEYWORD_TAGS) {
+ Gee.Collection<string>? values = get_string_multiple(field.field_name);
+
+ if (values == null || values.size < 1)
+ continue;
+
+ foreach (string current_value in values) {
+ string? canonicalized = HierarchicalTagUtilities.canonicalize(current_value,
+ field.path_separator);
+
+ if (canonicalized != null)
+ h_keywords.add(canonicalized);
+ }
+ }
+
+ return h_keywords;
+ }
+
+ public bool has_orientation() {
+ return exiv2.get_orientation() == GExiv2.Orientation.UNSPECIFIED;
+ }
+
+ // If not present, returns Orientation.TOP_LEFT.
+ public Orientation get_orientation() {
+ // GExiv2.Orientation is the same value-wise as Orientation, with one exception:
+ // GExiv2.Orientation.UNSPECIFIED must be handled
+ GExiv2.Orientation orientation = exiv2.get_orientation();
+ if (orientation == GExiv2.Orientation.UNSPECIFIED || orientation < Orientation.MIN ||
+ orientation > Orientation.MAX)
+ return Orientation.TOP_LEFT;
+ else
+ return (Orientation) orientation;
+ }
+
+ public void set_orientation(Orientation orientation) {
+ // GExiv2.Orientation is the same value-wise as Orientation
+ exiv2.set_orientation((GExiv2.Orientation) orientation);
+ }
+
+ public bool get_gps(out double longitude, out string long_ref, out double latitude, out string lat_ref,
+ out double altitude) {
+ if (!exiv2.get_gps_info(out longitude, out latitude, out altitude)) {
+ long_ref = null;
+ lat_ref = null;
+
+ return false;
+ }
+
+ long_ref = get_string("Exif.GPSInfo.GPSLongitudeRef");
+ lat_ref = get_string("Exif.GPSInfo.GPSLatitudeRef");
+
+ return true;
+ }
+
+ public bool get_exposure(out MetadataRational exposure) {
+ return get_rational("Exif.Photo.ExposureTime", out exposure);
+ }
+
+ public string? get_exposure_string() {
+ MetadataRational exposure_time;
+ if (!get_rational("Exif.Photo.ExposureTime", out exposure_time))
+ return null;
+
+ if (!exposure_time.is_valid())
+ return null;
+
+ return get_string_interpreted("Exif.Photo.ExposureTime");
+ }
+
+ public bool get_iso(out long iso) {
+ bool fetched_ok = get_long("Exif.Photo.ISOSpeedRatings", out iso);
+
+ if (fetched_ok == false)
+ return false;
+
+ // lower boundary is original (ca. 1935) Kodachrome speed, the lowest ISO rated film ever
+ // manufactured; upper boundary is 4 x fastest high-speed digital camera speeds
+ if ((iso < 6) || (iso > 409600))
+ return false;
+
+ return true;
+ }
+
+ public string? get_iso_string() {
+ long iso;
+ if (!get_iso(out iso))
+ return null;
+
+ return get_string_interpreted("Exif.Photo.ISOSpeedRatings");
+ }
+
+ public bool get_aperture(out MetadataRational aperture) {
+ return get_rational("Exif.Photo.FNumber", out aperture);
+ }
+
+ public string? get_aperture_string(bool pango_formatted = false) {
+ MetadataRational aperture;
+ if (!get_aperture(out aperture))
+ return null;
+
+ double aperture_value = ((double) aperture.numerator) / ((double) aperture.denominator);
+ aperture_value = ((int) (aperture_value * 10.0)) / 10.0;
+
+ return (pango_formatted ? "<i>f</i>/" : "f/") +
+ ((aperture_value % 1 == 0) ? "%.0f" : "%.1f").printf(aperture_value);
+ }
+
+ public string? get_camera_make() {
+ return get_string_interpreted("Exif.Image.Make");
+ }
+
+ public string? get_camera_model() {
+ return get_string_interpreted("Exif.Image.Model");
+ }
+
+ public bool get_flash(out long flash) {
+ // Exif.Image.Flash does not work for some reason
+ return get_long("Exif.Photo.Flash", out flash);
+ }
+
+ public string? get_flash_string() {
+ // Exif.Image.Flash does not work for some reason
+ return get_string_interpreted("Exif.Photo.Flash");
+ }
+
+ public bool get_focal_length(out MetadataRational focal_length) {
+ return get_rational("Exif.Photo.FocalLength", out focal_length);
+ }
+
+ public string? get_focal_length_string() {
+ return get_string_interpreted("Exif.Photo.FocalLength");
+ }
+
+ private static string[] ARTIST_TAGS = {
+ "Exif.Image.Artist",
+ "Exif.Canon.OwnerName" // Custom tag used by Canon DSLR cameras
+ };
+
+ public string? get_artist() {
+ return get_first_string_interpreted(ARTIST_TAGS);
+ }
+
+ public string? get_copyright() {
+ return get_string_interpreted("Exif.Image.Copyright");
+ }
+
+ public string? get_software() {
+ return get_string_interpreted("Exif.Image.Software");
+ }
+
+ public void set_software(string software, string version) {
+ // always set this one, even if EXIF not present
+ set_string("Exif.Image.Software", "%s %s".printf(software, version));
+
+ if (has_iptc()) {
+ set_string("Iptc.Application2.Program", software);
+ set_string("Iptc.Application2.ProgramVersion", version);
+ }
+ }
+
+ public void remove_software() {
+ remove_tag("Exif.Image.Software");
+ remove_tag("Iptc.Application2.Program");
+ remove_tag("Iptc.Application2.ProgramVersion");
+ }
+
+ public string? get_exposure_bias() {
+ return get_string_interpreted("Exif.Photo.ExposureBiasValue");
+ }
+
+ private static string[] RATING_TAGS = {
+ "Xmp.xmp.Rating",
+ "Iptc.Application2.Urgency",
+ "Xmp.photoshop.Urgency",
+ "Exif.Image.Rating"
+ };
+
+ public Rating get_rating() {
+ string? rating_string = get_first_string(RATING_TAGS);
+ if(rating_string != null)
+ return Rating.unserialize(int.parse(rating_string));
+
+ rating_string = get_string("Exif.Image.RatingPercent");
+ if(rating_string == null) {
+ return Rating.UNRATED;
+ }
+
+ int int_percent_rating = int.parse(rating_string);
+ for(int i = 5; i >= 0; --i) {
+ if(int_percent_rating >= Resources.rating_thresholds[i])
+ return Rating.unserialize(i);
+ }
+ return Rating.unserialize(-1);
+ }
+
+ // Among photo managers, Xmp.xmp.Rating tends to be the standard way to represent ratings.
+ // Other photo managers, notably F-Spot, take hints from Urgency fields about what the rating
+ // of an imported photo should be, and we have decided to do as well. Xmp.xmp.Rating is the only
+ // field we've seen photo manages export ratings to, while Urgency fields seem to have a fundamentally
+ // different meaning. See http://trac.yorba.org/wiki/PhotoTags#Rating for more information.
+ public void set_rating(Rating rating) {
+ int int_rating = rating.serialize();
+ set_string("Xmp.xmp.Rating", int_rating.to_string());
+ set_string("Exif.Image.Rating", int_rating.to_string());
+
+ if( 0 <= int_rating )
+ set_string("Exif.Image.RatingPercent", Resources.rating_thresholds[int_rating].to_string());
+ else // in this case we _know_ int_rating is -1
+ set_string("Exif.Image.RatingPercent", int_rating.to_string());
+ }
+}
+
diff --git a/src/photos/Photos.vala b/src/photos/Photos.vala
new file mode 100644
index 0000000..3033b92
--- /dev/null
+++ b/src/photos/Photos.vala
@@ -0,0 +1,31 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Photo unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Photos {
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+ foreach (PhotoFileFormat format in PhotoFileFormat.get_supported())
+ format.init();
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/photos/PngSupport.vala b/src/photos/PngSupport.vala
new file mode 100644
index 0000000..ffc7faa
--- /dev/null
+++ b/src/photos/PngSupport.vala
@@ -0,0 +1,181 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+class PngFileFormatProperties : PhotoFileFormatProperties {
+ private static string[] KNOWN_EXTENSIONS = { "png" };
+ private static string[] KNOWN_MIME_TYPES = { "image/png" };
+
+ private static PngFileFormatProperties instance = null;
+
+ public static void init() {
+ instance = new PngFileFormatProperties();
+ }
+
+ public static PngFileFormatProperties get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.PNG;
+ }
+
+ public override PhotoFileFormatFlags get_flags() {
+ return PhotoFileFormatFlags.NONE;
+ }
+
+ public override string get_user_visible_name() {
+ return _("PNG");
+ }
+
+ public override string get_default_extension() {
+ return KNOWN_EXTENSIONS[0];
+ }
+
+ public override string[] get_known_extensions() {
+ return KNOWN_EXTENSIONS;
+ }
+
+ public override string get_default_mime_type() {
+ return KNOWN_MIME_TYPES[0];
+ }
+
+ public override string[] get_mime_types() {
+ return KNOWN_MIME_TYPES;
+ }
+}
+
+public class PngSniffer : GdkSniffer {
+ private const uint8[] MAGIC_SEQUENCE = { 137, 80, 78, 71, 13, 10, 26, 10 };
+
+ public PngSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ private static bool is_png_file(File file) throws Error {
+ FileInputStream instream = file.read(null);
+
+ uint8[] file_lead_sequence = new uint8[MAGIC_SEQUENCE.length];
+
+ instream.read(file_lead_sequence, null);
+
+ for (int i = 0; i < MAGIC_SEQUENCE.length; i++) {
+ if (file_lead_sequence[i] != MAGIC_SEQUENCE[i])
+ return false;
+ }
+
+ return true;
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ if (!is_png_file(file))
+ return null;
+
+ DetectedPhotoInformation? detected = base.sniff();
+ if (detected == null)
+ return null;
+
+ return (detected.file_format == PhotoFileFormat.PNG) ? detected : null;
+ }
+}
+
+public class PngReader : GdkReader {
+ public PngReader(string filepath) {
+ base (filepath, PhotoFileFormat.PNG);
+ }
+
+ public override Gdk.Pixbuf scaled_read(Dimensions full, Dimensions scaled) throws Error {
+ Gdk.Pixbuf result = null;
+ /* if we encounter a situation where there are two orders of magnitude or more of
+ difference between the full image size and the scaled size, and if the full image
+ size has five or more decimal digits of precision, Gdk.Pixbuf.from_file_at_scale( ) can
+ fail due to what appear to be floating-point round-off issues. This isn't surprising,
+ since 32-bit floats only have 6-7 decimal digits of precision in their mantissa. In
+ this case, we prefetch the image at a larger scale and then downsample it to the
+ desired scale as a post-process step. This short-circuits Gdk.Pixbuf's buggy
+ scaling code. */
+ if (((full.width > 9999) || (full.height > 9999)) && ((scaled.width < 100) ||
+ (scaled.height < 100))) {
+ Dimensions prefetch_dimensions = full.get_scaled_by_constraint(1000,
+ ScaleConstraint.DIMENSIONS);
+
+ result = new Gdk.Pixbuf.from_file_at_scale(get_filepath(), prefetch_dimensions.width,
+ prefetch_dimensions.height, false);
+
+ result = result.scale_simple(scaled.width, scaled.height, Gdk.InterpType.HYPER);
+ } else {
+ result = new Gdk.Pixbuf.from_file_at_scale(get_filepath(), scaled.width,
+ scaled.height, false);
+ }
+
+ return result;
+ }
+}
+
+public class PngWriter : PhotoFileWriter {
+ public PngWriter(string filepath) {
+ base (filepath, PhotoFileFormat.PNG);
+ }
+
+ public override void write(Gdk.Pixbuf pixbuf, Jpeg.Quality quality) throws Error {
+ pixbuf.save(get_filepath(), "png", "compression", "9", null);
+ }
+}
+
+public class PngMetadataWriter : PhotoFileMetadataWriter {
+ public PngMetadataWriter(string filepath) {
+ base (filepath, PhotoFileFormat.PNG);
+ }
+
+ public override void write_metadata(PhotoMetadata metadata) throws Error {
+ metadata.write_to_file(get_file());
+ }
+}
+
+public class PngFileFormatDriver : PhotoFileFormatDriver {
+ private static PngFileFormatDriver instance = null;
+
+ public static void init() {
+ instance = new PngFileFormatDriver();
+ PngFileFormatProperties.init();
+ }
+
+ public static PngFileFormatDriver get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormatProperties get_properties() {
+ return PngFileFormatProperties.get_instance();
+ }
+
+ public override PhotoFileReader create_reader(string filepath) {
+ return new PngReader(filepath);
+ }
+
+ public override bool can_write_image() {
+ return true;
+ }
+
+ public override bool can_write_metadata() {
+ return true;
+ }
+
+ public override PhotoFileWriter? create_writer(string filepath) {
+ return new PngWriter(filepath);
+ }
+
+ public override PhotoFileMetadataWriter? create_metadata_writer(string filepath) {
+ return new PngMetadataWriter(filepath);
+ }
+
+ public override PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return new PngSniffer(file, options);
+ }
+
+ public override PhotoMetadata create_metadata() {
+ return new PhotoMetadata();
+ }
+}
+
diff --git a/src/photos/RawSupport.vala b/src/photos/RawSupport.vala
new file mode 100644
index 0000000..bad9572
--- /dev/null
+++ b/src/photos/RawSupport.vala
@@ -0,0 +1,347 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class RawFileFormatDriver : PhotoFileFormatDriver {
+ private static RawFileFormatDriver instance = null;
+
+ public static void init() {
+ instance = new RawFileFormatDriver();
+ RawFileFormatProperties.init();
+ }
+
+ public static RawFileFormatDriver get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormatProperties get_properties() {
+ return RawFileFormatProperties.get_instance();
+ }
+
+ public override PhotoFileReader create_reader(string filepath) {
+ return new RawReader(filepath);
+ }
+
+ public override PhotoMetadata create_metadata() {
+ return new PhotoMetadata();
+ }
+
+ public override bool can_write_image() {
+ return false;
+ }
+
+ public override bool can_write_metadata() {
+ return false;
+ }
+
+ public override PhotoFileWriter? create_writer(string filepath) {
+ return null;
+ }
+
+ public override PhotoFileMetadataWriter? create_metadata_writer(string filepath) {
+ return null;
+ }
+
+ public override PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return new RawSniffer(file, options);
+ }
+}
+
+public class RawFileFormatProperties : PhotoFileFormatProperties {
+ private static string[] KNOWN_EXTENSIONS = {
+ "3fr", "arw", "srf", "sr2", "bay", "crw", "cr2", "cap", "iiq", "eip", "dcs", "dcr", "drf",
+ "k25", "kdc", "dng", "erf", "fff", "mef", "mos", "mrw", "nef", "nrw", "orf", "ptx", "pef",
+ "pxn", "r3d", "raf", "raw", "rw2", "raw", "rwl", "rwz", "x3f", "srw"
+ };
+
+ private static string[] KNOWN_MIME_TYPES = {
+ /* a catch-all MIME type for all formats supported by the dcraw command-line
+ tool (and hence libraw) */
+ "image/x-dcraw",
+
+ /* manufacturer blessed MIME types */
+ "image/x-canon-cr2",
+ "image/x-canon-crw",
+ "image/x-fuji-raf",
+ "image/x-adobe-dng",
+ "image/x-panasonic-raw",
+ "image/x-raw",
+ "image/x-minolta-mrw",
+ "image/x-nikon-nef",
+ "image/x-olympus-orf",
+ "image/x-pentax-pef",
+ "image/x-sony-arw",
+ "image/x-sony-srf",
+ "image/x-sony-sr2",
+ "image/x-samsung-raw",
+
+ /* generic MIME types for file extensions*/
+ "image/x-3fr",
+ "image/x-arw",
+ "image/x-srf",
+ "image/x-sr2",
+ "image/x-bay",
+ "image/x-crw",
+ "image/x-cr2",
+ "image/x-cap",
+ "image/x-iiq",
+ "image/x-eip",
+ "image/x-dcs",
+ "image/x-dcr",
+ "image/x-drf",
+ "image/x-k25",
+ "image/x-kdc",
+ "image/x-dng",
+ "image/x-erf",
+ "image/x-fff",
+ "image/x-mef",
+ "image/x-mos",
+ "image/x-mrw",
+ "image/x-nef",
+ "image/x-nrw",
+ "image/x-orf",
+ "image/x-ptx",
+ "image/x-pef",
+ "image/x-pxn",
+ "image/x-r3d",
+ "image/x-raf",
+ "image/x-raw",
+ "image/x-rw2",
+ "image/x-raw",
+ "image/x-rwl",
+ "image/x-rwz",
+ "image/x-x3f",
+ "image/x-srw"
+ };
+
+ private static RawFileFormatProperties instance = null;
+
+ public static void init() {
+ instance = new RawFileFormatProperties();
+ }
+
+ public static RawFileFormatProperties get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.RAW;
+ }
+
+ public override string get_user_visible_name() {
+ return _("RAW");
+ }
+
+ public override PhotoFileFormatFlags get_flags() {
+ return PhotoFileFormatFlags.NONE;
+ }
+
+ public override string get_default_extension() {
+ // Because RAW is a smorgasbord of file formats and exporting to a RAW file is
+ // not expected, this function should probably never be called. However, need to pick
+ // one, so here it is.
+ return "raw";
+ }
+
+ public override string[] get_known_extensions() {
+ return KNOWN_EXTENSIONS;
+ }
+
+ public override string get_default_mime_type() {
+ return KNOWN_MIME_TYPES[0];
+ }
+
+ public override string[] get_mime_types() {
+ return KNOWN_MIME_TYPES;
+ }
+}
+
+public class RawSniffer : PhotoFileSniffer {
+ public RawSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ DetectedPhotoInformation detected = new DetectedPhotoInformation();
+
+ GRaw.Processor processor = new GRaw.Processor();
+ processor.output_params->user_flip = GRaw.Flip.NONE;
+
+ try {
+ processor.open_file(file.get_path());
+ processor.unpack();
+ processor.adjust_sizes_info_only();
+ } catch (GRaw.Exception exception) {
+ if (exception is GRaw.Exception.UNSUPPORTED_FILE)
+ return null;
+
+ throw exception;
+ }
+
+ detected.image_dim = Dimensions(processor.get_sizes().iwidth, processor.get_sizes().iheight);
+ detected.colorspace = Gdk.Colorspace.RGB;
+ detected.channels = 3;
+ detected.bits_per_channel = 8;
+
+ RawReader reader = new RawReader(file.get_path());
+ try {
+ detected.metadata = reader.read_metadata();
+ } catch (Error err) {
+ // ignored
+ }
+
+ if (detected.metadata != null) {
+ uint8[]? flattened_sans_thumbnail = detected.metadata.flatten_exif(false);
+ if (flattened_sans_thumbnail != null && flattened_sans_thumbnail.length > 0)
+ detected.exif_md5 = md5_binary(flattened_sans_thumbnail, flattened_sans_thumbnail.length);
+
+ uint8[]? flattened_thumbnail = detected.metadata.flatten_exif_preview();
+ if (flattened_thumbnail != null && flattened_thumbnail.length > 0)
+ detected.thumbnail_md5 = md5_binary(flattened_thumbnail, flattened_thumbnail.length);
+ }
+
+ if (calc_md5)
+ detected.md5 = md5_file(file);
+
+ detected.format_name = "raw";
+ detected.file_format = PhotoFileFormat.RAW;
+
+ return detected;
+ }
+}
+
+public class RawReader : PhotoFileReader {
+ public RawReader(string filepath) {
+ base (filepath, PhotoFileFormat.RAW);
+ }
+
+ public override PhotoMetadata read_metadata() throws Error {
+ PhotoMetadata metadata = new PhotoMetadata();
+ metadata.read_from_file(get_file());
+
+ return metadata;
+ }
+
+ public override Gdk.Pixbuf unscaled_read() throws Error {
+ GRaw.Processor processor = new GRaw.Processor();
+ processor.configure_for_rgb_display(false);
+ processor.output_params->user_flip = GRaw.Flip.NONE;
+
+ processor.open_file(get_filepath());
+ processor.unpack();
+ processor.process();
+
+ return processor.make_mem_image().get_pixbuf_copy();
+ }
+
+ public override Gdk.Pixbuf scaled_read(Dimensions full, Dimensions scaled) throws Error {
+ double width_proportion = (double) scaled.width / (double) full.width;
+ double height_proportion = (double) scaled.height / (double) full.height;
+ bool half_size = width_proportion < 0.5 && height_proportion < 0.5;
+
+ GRaw.Processor processor = new GRaw.Processor();
+ processor.configure_for_rgb_display(half_size);
+ processor.output_params->user_flip = GRaw.Flip.NONE;
+
+ processor.open_file(get_filepath());
+ processor.unpack();
+ processor.process();
+
+ GRaw.ProcessedImage image = processor.make_mem_image();
+
+ return resize_pixbuf(image.get_pixbuf_copy(), scaled, Gdk.InterpType.BILINEAR);
+ }
+}
+
+// Development mode of a RAW photo.
+public enum RawDeveloper {
+ SHOTWELL = 0, // Developed internally by Shotwell
+ CAMERA, // JPEG from RAW+JPEG pair (if available)
+ EMBEDDED; // Largest-size
+
+ public static RawDeveloper[] as_array() {
+ return { SHOTWELL, CAMERA, EMBEDDED };
+ }
+
+ public string to_string() {
+ switch (this) {
+ case SHOTWELL:
+ return "SHOTWELL";
+ case CAMERA:
+ return "CAMERA";
+ case EMBEDDED:
+ return "EMBEDDED";
+ default:
+ assert_not_reached();
+ }
+ }
+
+ public static RawDeveloper from_string(string value) {
+ switch (value) {
+ case "SHOTWELL":
+ return SHOTWELL;
+ case "CAMERA":
+ return CAMERA;
+ case "EMBEDDED":
+ return EMBEDDED;
+ default:
+ assert_not_reached();
+ }
+ }
+
+ public string get_label() {
+ switch (this) {
+ case SHOTWELL:
+ return _("Shotwell");
+ case CAMERA:
+ case EMBEDDED:
+ return _("Camera");
+ default:
+ assert_not_reached();
+ }
+ }
+
+ // Determines if two RAW developers are equivalent, treating camera and embedded
+ // as the same.
+ public bool is_equivalent(RawDeveloper d) {
+ if (this == d)
+ return true;
+
+ if ((this == RawDeveloper.CAMERA && d == RawDeveloper.EMBEDDED) ||
+ (this == RawDeveloper.EMBEDDED && d == RawDeveloper.CAMERA))
+ return true;
+
+ return false;
+ }
+
+ // Creates a backing JPEG.
+ // raw_filepath is the full path of the imported RAW file.
+ public BackingPhotoRow create_backing_row_for_development(string raw_filepath,
+ string? camera_development_filename = null) throws Error {
+ BackingPhotoRow ns = new BackingPhotoRow();
+ File master = File.new_for_path(raw_filepath);
+ string name, ext;
+ disassemble_filename(master.get_basename(), out name, out ext);
+
+ string basename;
+
+ // If this image is coming in with an existing development, use its existing
+ // filename instead.
+ if (camera_development_filename == null) {
+ basename = name + "_" + ext +
+ (this != CAMERA ? ("_" + this.to_string().down()) : "") + ".jpg";
+ } else {
+ basename = camera_development_filename;
+ }
+
+ bool c;
+ File? new_back = generate_unique_file(master.get_parent(), basename, out c);
+ claim_file(new_back);
+ ns.file_format = PhotoFileFormat.JFIF;
+ ns.filepath = new_back.get_path();
+
+ return ns;
+ }
+}
diff --git a/src/photos/TiffSupport.vala b/src/photos/TiffSupport.vala
new file mode 100644
index 0000000..decc052
--- /dev/null
+++ b/src/photos/TiffSupport.vala
@@ -0,0 +1,180 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+namespace Photos {
+
+public class TiffFileFormatDriver : PhotoFileFormatDriver {
+ private static TiffFileFormatDriver instance = null;
+
+ public static void init() {
+ instance = new TiffFileFormatDriver();
+ TiffFileFormatProperties.init();
+ }
+
+ public static TiffFileFormatDriver get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormatProperties get_properties() {
+ return TiffFileFormatProperties.get_instance();
+ }
+
+ public override PhotoFileReader create_reader(string filepath) {
+ return new TiffReader(filepath);
+ }
+
+ public override PhotoMetadata create_metadata() {
+ return new PhotoMetadata();
+ }
+
+ public override bool can_write_image() {
+ return true;
+ }
+
+ public override bool can_write_metadata() {
+ return true;
+ }
+
+ public override PhotoFileWriter? create_writer(string filepath) {
+ return new TiffWriter(filepath);
+ }
+
+ public override PhotoFileMetadataWriter? create_metadata_writer(string filepath) {
+ return new TiffMetadataWriter(filepath);
+ }
+
+ public override PhotoFileSniffer create_sniffer(File file, PhotoFileSniffer.Options options) {
+ return new TiffSniffer(file, options);
+ }
+}
+
+private class TiffFileFormatProperties : PhotoFileFormatProperties {
+ private static string[] KNOWN_EXTENSIONS = {
+ "tif", "tiff"
+ };
+
+ private static string[] KNOWN_MIME_TYPES = {
+ "image/tiff"
+ };
+
+ private static TiffFileFormatProperties instance = null;
+
+ public static void init() {
+ instance = new TiffFileFormatProperties();
+ }
+
+ public static TiffFileFormatProperties get_instance() {
+ return instance;
+ }
+
+ public override PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.TIFF;
+ }
+
+ public override PhotoFileFormatFlags get_flags() {
+ return PhotoFileFormatFlags.NONE;
+ }
+
+ public override string get_default_extension() {
+ return "tif";
+ }
+
+ public override string get_user_visible_name() {
+ return _("TIFF");
+ }
+
+ public override string[] get_known_extensions() {
+ return KNOWN_EXTENSIONS;
+ }
+
+ public override string get_default_mime_type() {
+ return KNOWN_MIME_TYPES[0];
+ }
+
+ public override string[] get_mime_types() {
+ return KNOWN_MIME_TYPES;
+ }
+}
+
+private class TiffSniffer : GdkSniffer {
+ public TiffSniffer(File file, PhotoFileSniffer.Options options) {
+ base (file, options);
+ }
+
+ public override DetectedPhotoInformation? sniff() throws Error {
+ if (!is_tiff(file))
+ return null;
+
+ DetectedPhotoInformation? detected = base.sniff();
+ if (detected == null)
+ return null;
+
+ return (detected.file_format == PhotoFileFormat.TIFF) ? detected : null;
+ }
+}
+
+private class TiffReader : GdkReader {
+ public TiffReader(string filepath) {
+ base (filepath, PhotoFileFormat.TIFF);
+ }
+}
+
+private class TiffWriter : PhotoFileWriter {
+ private const string COMPRESSION_NONE = "1";
+ private const string COMPRESSION_HUFFMAN = "2";
+ private const string COMPRESSION_LZW = "5";
+ private const string COMPRESSION_JPEG = "7";
+ private const string COMPRESSION_DEFLATE = "8";
+
+ public TiffWriter(string filepath) {
+ base (filepath, PhotoFileFormat.TIFF);
+ }
+
+ public override void write(Gdk.Pixbuf pixbuf, Jpeg.Quality quality) throws Error {
+ pixbuf.save(get_filepath(), "tiff", "compression", COMPRESSION_LZW);
+ }
+}
+
+private class TiffMetadataWriter : PhotoFileMetadataWriter {
+ public TiffMetadataWriter(string filepath) {
+ base (filepath, PhotoFileFormat.TIFF);
+ }
+
+ public override void write_metadata(PhotoMetadata metadata) throws Error {
+ metadata.write_to_file(get_file());
+ }
+}
+
+public bool is_tiff(File file, Cancellable? cancellable = null) throws Error {
+ DataInputStream dins = new DataInputStream(file.read());
+
+ // first two bytes: "II" (0x4949, for Intel) or "MM" (0x4D4D, for Motorola)
+ DataStreamByteOrder order;
+ switch (dins.read_uint16(cancellable)) {
+ case 0x4949:
+ order = DataStreamByteOrder.LITTLE_ENDIAN;
+ break;
+
+ case 0x4D4D:
+ order = DataStreamByteOrder.BIG_ENDIAN;
+ break;
+
+ default:
+ return false;
+ }
+
+ dins.set_byte_order(order);
+
+ // second two bytes: some random number
+ uint16 lue = dins.read_uint16(cancellable);
+ if (lue != 42)
+ return false;
+
+ // remaining bytes are offset of first IFD, which doesn't matter for our purposes
+ return true;
+}
+
+}
diff --git a/src/photos/mk/photos.mk b/src/photos/mk/photos.mk
new file mode 100644
index 0000000..6be33a4
--- /dev/null
+++ b/src/photos/mk/photos.mk
@@ -0,0 +1,38 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Photos
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := photos
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ PhotoFileAdapter.vala \
+ PhotoFileFormat.vala \
+ PhotoFileSniffer.vala \
+ PhotoMetadata.vala \
+ GRaw.vala \
+ GdkSupport.vala \
+ JfifSupport.vala \
+ BmpSupport.vala \
+ RawSupport.vala \
+ PngSupport.vala \
+ TiffSupport.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/plugins/DataImportsInterfaces.vala b/src/plugins/DataImportsInterfaces.vala
new file mode 100644
index 0000000..154503b
--- /dev/null
+++ b/src/plugins/DataImportsInterfaces.vala
@@ -0,0 +1,489 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Shotwell Pluggable Data Imports API
+ *
+ * The Shotwell Pluggable Data Imports API allows you to write plugins that import
+ * information from other media library databases to help migration to Shotwell.
+ * The Shotwell distribution includes import support for F-Spot.
+ * To enable Shotwell to import from additional libaries, developers like you write
+ * data import plugins, dynamically-loadable shared objects that are linked into the
+ * Shotwell process at runtime. Data import plugins are just one of several kinds of
+ * plugins supported by {@link Spit}, the Shotwell Pluggable Interfaces Technology.
+ */
+namespace Spit.DataImports {
+
+/**
+ * The current version of the Pluggable Data Import API
+ */
+public const int CURRENT_INTERFACE = 0;
+
+/**
+ * The error domain for alien databases
+ */
+public errordomain DataImportError {
+ /**
+ * Indicates that the version of the external database being imported is
+ * not supported by this version of the plugin.
+ *
+ * This occurs for example when trying to import an F-Spot database that
+ * has a version that is more recent than what the current plugin supports.
+ */
+ UNSUPPORTED_VERSION
+}
+
+/**
+ * Represents a module that is able to import data from a specific database format.
+ *
+ * Developers of data import plugins provide a class that implements this interface. At
+ * any given time, only one DataImporter can be running. When a data importer is running, it
+ * has exclusive use of the shared user-interface and
+ * configuration services provided by the {@link PluginHost}. Data importers are created in
+ * a non-running state and do not begin running until start( ) is invoked. Data importers
+ * run until stop( ) is invoked.
+ */
+public interface DataImporter : GLib.Object {
+ /**
+ * Returns a {@link Service} object describing the service to which this connects.
+ */
+ public abstract Service get_service();
+
+ /**
+ * Makes this data importer enter the running state and endows it with exclusive access
+ * to the shared services provided by the {@link PluginHost}. Through the host’s interface,
+ * this data importer can install user interface panes and query configuration information.
+ */
+ public abstract void start();
+
+ /**
+ * Returns true if this data importer is in the running state; false otherwise.
+ */
+ public abstract bool is_running();
+
+ /**
+ * Causes this data importer to enter a non-running state. This data importer should stop all
+ * data access operations and cease use of the shared services provided by the {@link PluginHost}.
+ */
+ public abstract void stop();
+
+ /**
+ * Causes this data importer to enter start the import of a library.
+ */
+ public abstract void on_library_selected(ImportableLibrary library);
+
+ /**
+ * Causes this data importer to enter start the import of a library file.
+ */
+ public abstract void on_file_selected(File file);
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Represents a library of importable media items.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ */
+public interface ImportableLibrary : GLib.Object {
+ public abstract string get_display_name();
+}
+
+/**
+ * Represents an importable media item such as a photo or a video file.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ */
+public interface ImportableMediaItem : GLib.Object {
+ public abstract ImportableTag[] get_tags();
+
+ public abstract ImportableEvent? get_event();
+
+ public abstract ImportableRating get_rating();
+
+ public abstract string? get_title();
+
+ public abstract string get_folder_path();
+
+ public abstract string get_filename();
+}
+
+/**
+ * Represents an importable tag.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ */
+public interface ImportableTag : GLib.Object {
+ public abstract string get_name();
+
+ public abstract ImportableTag? get_parent();
+}
+
+/**
+ * Represents an importable event.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ */
+public interface ImportableEvent : GLib.Object {
+ public abstract string get_name();
+}
+
+/**
+ * Represents an importable rating value.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ * Note that the value returned by the get_value method should be a value between
+ * 1 and 5, unless the rating object is unrated or rejected, in which case the
+ * value is unspecified.
+ */
+public interface ImportableRating : GLib.Object {
+ public abstract bool is_unrated();
+
+ public abstract bool is_rejected();
+
+ public abstract int get_value();
+}
+
+/**
+ * Encapsulates a pane that can be installed in the on-screen import dialog box to
+ * communicate status to and to get information from the user.
+ *
+ */
+public interface DialogPane : GLib.Object {
+
+ /**
+ * Describes how the on-screen publishing dialog box should look and behave when an associated
+ * pane is installed in the on-screen publishing dialog box.
+ */
+ public enum GeometryOptions {
+
+ /**
+ * When the associated pane is installed, the on-screen publishing dialog box will be
+ * sized normally and will not allow the user to change its size.
+ */
+ NONE = 0,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will grow to a larger size.
+ */
+ EXTENDED_SIZE = 1 << 0,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will allow the user to change its size.
+ */
+ RESIZABLE = 1 << 1,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will grow to accommodate a full-width 1024 pixel web page. If both
+ * EXTENDED_SIZE and COLOSSAL_SIZE are set, EXTENDED_SIZE takes precedence.
+ */
+ COLOSSAL_SIZE = 1 << 2;
+ }
+
+ /**
+ * Returns the Gtk.Widget that is this pane's on-screen representation.
+ */
+ public abstract Gtk.Widget get_widget();
+
+ /**
+ * Returns a {@link GeometryOptions} bitfield describing how the on-screen publishing dialog
+ * box should look and behave when this pane is installed.
+ */
+ public abstract GeometryOptions get_preferred_geometry();
+
+ /**
+ * Invoked automatically by Shotwell when this pane has been installed into the on-screen
+ * publishing dialog box and become visible to the user.
+ */
+ public abstract void on_pane_installed();
+
+ /**
+ * Invoked automatically by Shotwell when this pane has been removed from the on-screen
+ * publishing dialog box and is no longer visible to the user.
+ */
+ public abstract void on_pane_uninstalled();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Called by the data imports system at the end of an import batch to report
+ * to the plugin the number of items that were really imported. This enables
+ * the plugin to display a final message to the user. However, the plugin
+ * should not rely on this callback being called in order to clean up.
+ */
+public delegate void ImportedItemsCountCallback(int imported_items_count);
+
+/**
+ * Manages and provides services for data import plugins.
+ *
+ * Implemented inside Shotwell, the PluginHost provides an interface through which the
+ * developers of data import plugins can query and make changes to the import
+ * environment. Plugins can use the services of the PluginHost only when their
+ * {@link DataImporter} is in the running state. This ensures that non-running data importers
+ * don’t destructively interfere with the actively running importer.
+ */
+public interface PluginHost : GLib.Object, Spit.HostInterface {
+
+ /**
+ * Specifies the label text on the push button control that appears in the
+ * lower-right-hand corner of the on-screen publishing dialog box.
+ */
+ public enum ButtonMode {
+ CLOSE = 0,
+ CANCEL = 1
+ }
+
+ /**
+ * Notifies the user that an unrecoverable import error has occurred and halts
+ * the import process.
+ *
+ * @param err An error object that describes the kind of error that occurred.
+ */
+ public abstract void post_error(Error err);
+
+ /**
+ * Notifies the user that an unrecoverable import error has occurred and halts
+ * the import process.
+ *
+ * @param msg A message that describes the kind of error that occurred.
+ */
+ public abstract void post_error_message(string msg);
+
+ /**
+ * Starts the import process.
+ *
+ * Calling this method starts the import activity for this host.
+ */
+ public abstract void start_importing();
+
+ /**
+ * Halts the import process.
+ *
+ * Calling this method stops all import activity and hides the on-screen import
+ * dialog box.
+ */
+ public abstract void stop_importing();
+
+ /**
+ * Returns a reference to the {@link DataImporter} object that this is currently hosting.
+ */
+ public abstract DataImporter get_data_importer();
+
+ /**
+ * Attempts to install a pane in the on-screen data import dialog box, making the pane visible
+ * and allowing it to interact with the user.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param pane the pane to install
+ *
+ * @param mode allows you to set the text displayed on the close/cancel button in the
+ * lower-right-hand corner of the on-screen data import dialog box when pane is installed.
+ * If mode is ButtonMode.CLOSE, the button will have the title "Close." If mode is
+ * ButtonMode.CANCEL, the button will be titled "Cancel." You should set mode depending on
+ * whether a cancellable action is in progress. For example, if your importer is in the
+ * middle of processing 3 of 8 videos, then mode should be ButtonMode.CANCEL. However, if
+ * the processing operation has completed and the success pane is displayed, then mode
+ * should be ButtonMode.CLOSE, because all cancellable actions have already
+ * occurred.
+ */
+ public abstract void install_dialog_pane(Spit.DataImports.DialogPane pane,
+ ButtonMode mode = ButtonMode.CANCEL);
+
+ /**
+ * Attempts to install a pane in the on-screen data import dialog box that contains
+ * static text.
+ *
+ * The text appears centered in the data import dialog box and is drawn in
+ * the system font. This is a convenience method only; similar results could be
+ * achieved by manually constructing a Gtk.Label widget, wrapping it inside a
+ * {@link DialogPane}, and installing it manually with a call to
+ * install_dialog_pane( ). To provide visual consistency across data import services,
+ * however, always use this convenience method instead of constructing label panes when
+ * you need to display static text to the user.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param message the text to show in the pane
+ *
+ * @param mode allows you to set the text displayed on the close/cancel button in the
+ * lower-right-hand corner of the on-screen data import dialog box when pane is installed.
+ * If mode is ButtonMode.CLOSE, the button will have the title "Close." If mode is
+ * ButtonMode.CANCEL, the button will be titled "Cancel." You should set mode depending on
+ * whether a cancellable action is in progress. For example, if your importer is in the
+ * middle of processing 3 of 8 videos, then mode should be ButtonMode.CANCEL. However, if
+ * the processing operation has completed and the success pane is displayed, then mode
+ * should be ButtonMode.CLOSE, because all cancellable actions have already
+ * occurred.
+ */
+ public abstract void install_static_message_pane(string message,
+ ButtonMode mode = ButtonMode.CANCEL);
+
+ /**
+ * Attempts to install a library selection pane that presents a list of
+ * discovered libraries to the user.
+ *
+ * When the user clicks the “OK” button, you’ll be notified of the user’s action through
+ * the 'on_library_selected' callback if a discovered library was selected or through
+ * the 'on_file_selected' callback if a file was selected.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param welcome_message the text to be displayed above the list of discovered
+ * libraries.
+ *
+ * @param discovered_libraries the list of importable libraries that the plugin
+ * has discovered in well known locations.
+ *
+ * @param file_select_label the label to display for the file selection
+ * option. If this label is null, the
+ * user will not be presented with a file selection option.
+ */
+ public abstract void install_library_selection_pane(
+ string welcome_message,
+ ImportableLibrary[] discovered_libraries,
+ string? file_select_label
+ );
+
+ /**
+ * Attempts to install a progress pane that provides the user with feedback
+ * on import preparation.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param message the text to be displayed above the progress bar.
+ */
+ public abstract void install_import_progress_pane(
+ string message
+ );
+
+ /**
+ * Update the progress bar installed by install_import_progress_pane.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param progress a value between 0.0 and 1.0 identifying progress for the
+ * plugin.
+ *
+ * @param progress_label the text to be displayed below the progress bar. If that
+ * parameter is null, the message will be left unchanged.
+ */
+ public abstract void update_import_progress_pane(
+ double progress,
+ string? progress_message = null
+ );
+
+ /**
+ * Sends an importable media item to the host in order to prepare it for import
+ * and update the progress bar installed by install_import_progress_pane.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param item the importable media item to prepare for import.
+ *
+ * @param progress a value between 0.0 and 1.0 identifying progress for the
+ * plugin.
+ *
+ * @param host_progress_delta the amount of progress the host should update
+ * the progress bar during import preparation. Plugins should ensure that
+ * a proportion of progress for each media item is set aside for the host
+ * in oder to ensure a smoother update to the progress bar.
+ *
+ * @param progress_message the text to be displayed below the progress bar. If that
+ * parameter is null, the message will be left unchanged.
+ */
+ public abstract void prepare_media_items_for_import(
+ ImportableMediaItem[] items,
+ double progress,
+ double host_progress_delta = 0.0,
+ string? progress_message = null
+ );
+
+ /**
+ * Finalize the import sequence for the plugin. This tells the host that
+ * all media items have been processed and that the plugin has finished all
+ * import work. Once this method has been called, all resources used by the
+ * plugin for import should be released and the plugin should be back to the
+ * state it had just after running the start method. The host will then display
+ * the final message and show progress as fully complete. In a standard import
+ * scenario, the user is expected to click the Close button to dismiss the
+ * dialog. On first run, the host may call the LibrarySelectedCallback again
+ * to import another library handled by the same plugin.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param finalize_message the text to be displayed below the progress bar. If that
+ * parameter is null, the message will be left unchanged.
+ */
+ public abstract void finalize_import(
+ ImportedItemsCountCallback report_imported_items_count,
+ string? finalize_message = null
+ );
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Describes the features and capabilities of a data import service.
+ *
+ * Developers of data import plugins provide a class that implements this interface.
+ */
+public interface Service : Object, Spit.Pluggable {
+ /**
+ * A factory method that instantiates and returns a new {@link DataImporter} object
+ * that this Service describes.
+ */
+ public abstract Spit.DataImports.DataImporter create_data_importer(Spit.DataImports.PluginHost host);
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+}
+
diff --git a/src/plugins/ManifestWidget.vala b/src/plugins/ManifestWidget.vala
new file mode 100644
index 0000000..54f2e56
--- /dev/null
+++ b/src/plugins/ManifestWidget.vala
@@ -0,0 +1,282 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Plugins {
+
+public class ManifestWidgetMediator {
+ public Gtk.Widget widget {
+ get {
+ return builder.get_object("plugin-manifest") as Gtk.Widget;
+ }
+ }
+
+ private Gtk.Button about_button {
+ get {
+ return builder.get_object("about-plugin-button") as Gtk.Button;
+ }
+ }
+
+ private Gtk.ScrolledWindow list_bin {
+ get {
+ return builder.get_object("plugin-list-scrolled-window") as Gtk.ScrolledWindow;
+ }
+ }
+
+ private Gtk.Builder builder = AppWindow.create_builder();
+ private ManifestListView list = new ManifestListView();
+
+ public ManifestWidgetMediator() {
+ list_bin.add_with_viewport(list);
+
+ about_button.clicked.connect(on_about);
+ list.get_selection().changed.connect(on_selection_changed);
+
+ set_about_button_sensitivity();
+ }
+
+ ~ManifestWidgetMediator() {
+ about_button.clicked.disconnect(on_about);
+ list.get_selection().changed.disconnect(on_selection_changed);
+ }
+
+ private void on_about() {
+ string[] ids = list.get_selected_ids();
+ if (ids.length == 0)
+ return;
+
+ string id = ids[0];
+
+ Spit.PluggableInfo info = Spit.PluggableInfo();
+ if (!get_pluggable_info(id, ref info)) {
+ warning("Unable to retrieve information for plugin %s", id);
+
+ return;
+ }
+
+ // prepare authors names (which are comma-delimited by the plugin) for the about box
+ // (which wants an array of names)
+ string[]? authors = null;
+ if (info.authors != null) {
+ string[] split = info.authors.split(",");
+ for (int ctr = 0; ctr < split.length; ctr++) {
+ string stripped = split[ctr].strip();
+ if (!is_string_empty(stripped)) {
+ if (authors == null)
+ authors = new string[0];
+
+ authors += stripped;
+ }
+ }
+ }
+
+ Gtk.AboutDialog about_dialog = new Gtk.AboutDialog();
+ about_dialog.authors = authors;
+ about_dialog.comments = info.brief_description;
+ about_dialog.copyright = info.copyright;
+ about_dialog.license = info.license;
+ about_dialog.wrap_license = info.is_license_wordwrapped;
+ about_dialog.logo = (info.icons != null && info.icons.length > 0) ? info.icons[0] :
+ Resources.get_icon(Resources.ICON_GENERIC_PLUGIN);
+ about_dialog.program_name = get_pluggable_name(id);
+ about_dialog.translator_credits = info.translators;
+ about_dialog.version = info.version;
+ about_dialog.website = info.website_url;
+ about_dialog.website_label = info.website_name;
+
+ about_dialog.run();
+
+ about_dialog.destroy();
+ }
+
+ private void on_selection_changed() {
+ set_about_button_sensitivity();
+ }
+
+ private void set_about_button_sensitivity() {
+ // have to get the array and then get its length rather than do so in one call due to a
+ // bug in Vala 0.10:
+ // list.get_selected_ids().length -> uninitialized value
+ // this appears to be fixed in Vala 0.11
+ string[] ids = list.get_selected_ids();
+ about_button.sensitive = (ids.length == 1);
+ }
+}
+
+private class ManifestListView : Gtk.TreeView {
+ private const int ICON_SIZE = 24;
+ private const int ICON_X_PADDING = 6;
+ private const int ICON_Y_PADDING = 2;
+
+ private enum Column {
+ ENABLED,
+ CAN_ENABLE,
+ ICON,
+ NAME,
+ ID,
+ N_COLUMNS
+ }
+
+ private Gtk.TreeStore store = new Gtk.TreeStore(Column.N_COLUMNS,
+ typeof(bool), // ENABLED
+ typeof(bool), // CAN_ENABLE
+ typeof(Gdk.Pixbuf), // ICON
+ typeof(string), // NAME
+ typeof(string) // ID
+ );
+
+ public ManifestListView() {
+ set_model(store);
+
+ Gtk.CellRendererToggle checkbox_renderer = new Gtk.CellRendererToggle();
+ checkbox_renderer.radio = false;
+ checkbox_renderer.activatable = true;
+
+ Gtk.CellRendererPixbuf icon_renderer = new Gtk.CellRendererPixbuf();
+ icon_renderer.stock_size = Gtk.IconSize.MENU;
+ icon_renderer.xpad = ICON_X_PADDING;
+ icon_renderer.ypad = ICON_Y_PADDING;
+
+ Gtk.CellRendererText text_renderer = new Gtk.CellRendererText();
+
+ Gtk.TreeViewColumn column = new Gtk.TreeViewColumn();
+ column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE);
+ column.pack_start(checkbox_renderer, false);
+ column.pack_start(icon_renderer, false);
+ column.pack_end(text_renderer, true);
+
+ column.add_attribute(checkbox_renderer, "active", Column.ENABLED);
+ column.add_attribute(checkbox_renderer, "visible", Column.CAN_ENABLE);
+ column.add_attribute(icon_renderer, "pixbuf", Column.ICON);
+ column.add_attribute(text_renderer, "text", Column.NAME);
+
+ append_column(column);
+
+ set_headers_visible(false);
+ set_enable_search(false);
+ set_rules_hint(true);
+ set_show_expanders(true);
+ set_reorderable(false);
+ set_enable_tree_lines(false);
+ set_grid_lines(Gtk.TreeViewGridLines.NONE);
+ get_selection().set_mode(Gtk.SelectionMode.BROWSE);
+
+ Gtk.IconTheme icon_theme = Resources.get_icon_theme_engine();
+
+ // create a list of plugins (sorted by name) that are separated by extension points (sorted
+ // by name)
+ foreach (ExtensionPoint extension_point in get_extension_points(compare_extension_point_names)) {
+ Gtk.TreeIter category_iter;
+ store.append(out category_iter, null);
+
+ Gdk.Pixbuf? icon = null;
+ if (extension_point.icon_name != null) {
+ Gtk.IconInfo? icon_info = icon_theme.lookup_by_gicon(
+ new ThemedIcon(extension_point.icon_name), ICON_SIZE, 0);
+ if (icon_info != null) {
+ try {
+ icon = icon_info.load_icon();
+ } catch (Error err) {
+ warning("Unable to load icon %s: %s", extension_point.icon_name, err.message);
+ }
+ }
+ }
+
+ store.set(category_iter, Column.NAME, extension_point.name, Column.CAN_ENABLE, false,
+ Column.ICON, icon);
+
+ Gee.Collection<Spit.Pluggable> pluggables = get_pluggables_for_type(
+ extension_point.pluggable_type, compare_pluggable_names, true);
+ foreach (Spit.Pluggable pluggable in pluggables) {
+ bool enabled;
+ if (!get_pluggable_enabled(pluggable.get_id(), out enabled))
+ continue;
+
+ Spit.PluggableInfo info = Spit.PluggableInfo();
+ pluggable.get_info(ref info);
+
+ icon = (info.icons != null && info.icons.length > 0)
+ ? info.icons[0]
+ : Resources.get_icon(Resources.ICON_GENERIC_PLUGIN, ICON_SIZE);
+
+ Gtk.TreeIter plugin_iter;
+ store.append(out plugin_iter, category_iter);
+
+ store.set(plugin_iter, Column.ENABLED, enabled, Column.NAME, pluggable.get_pluggable_name(),
+ Column.ID, pluggable.get_id(), Column.CAN_ENABLE, true, Column.ICON, icon);
+ }
+ }
+
+ expand_all();
+ }
+
+ public string[] get_selected_ids() {
+ string[] ids = new string[0];
+
+ List<Gtk.TreePath> selected = get_selection().get_selected_rows(null);
+ foreach (Gtk.TreePath path in selected) {
+ Gtk.TreeIter iter;
+ string? id = get_id_at_path(path, out iter);
+ if (id != null)
+ ids += id;
+ }
+
+ return ids;
+ }
+
+ private string? get_id_at_path(Gtk.TreePath path, out Gtk.TreeIter iter) {
+ if (!store.get_iter(out iter, path))
+ return null;
+
+ unowned string id;
+ store.get(iter, Column.ID, out id);
+
+ return id;
+ }
+
+ // Because we want each row to left-align and not for each column to line up in a grid
+ // (otherwise the checkboxes -- hidden or not -- would cause the rest of the row to line up
+ // along the icon's left edge), we put all the renderers into a single column. However, the
+ // checkbox renderer then triggers its "toggle" signal any time the row is single-clicked,
+ // whether or not the actual checkbox hit-tests.
+ //
+ // The only way found to work around this is to capture the button-down event and do our own
+ // hit-testing.
+ public override bool button_press_event(Gdk.EventButton event) {
+ Gtk.TreePath path;
+ Gtk.TreeViewColumn col;
+ int cellx;
+ int celly;
+ if (!get_path_at_pos((int) event.x, (int) event.y, out path, out col, out cellx,
+ out celly))
+ return base.button_press_event(event);
+
+ // Perform custom hit testing as described above. The first cell in the column is offset
+ // from the left edge by whatever size the group description icon is allocated (including
+ // padding).
+ if (cellx < (ICON_SIZE + ICON_X_PADDING) || cellx > (2 * (ICON_X_PADDING + ICON_SIZE)))
+ return base.button_press_event(event);
+
+ Gtk.TreeIter iter;
+ string? id = get_id_at_path(path, out iter);
+ if (id == null)
+ return base.button_press_event(event);
+
+ bool enabled;
+ if (!get_pluggable_enabled(id, out enabled))
+ return base.button_press_event(event);
+
+ // toggle and set
+ enabled = !enabled;
+ set_pluggable_enabled(id, enabled);
+
+ store.set(iter, Column.ENABLED, enabled);
+
+ return true;
+ }
+}
+
+}
+
diff --git a/src/plugins/Plugins.vala b/src/plugins/Plugins.vala
new file mode 100644
index 0000000..d0f9185
--- /dev/null
+++ b/src/plugins/Plugins.vala
@@ -0,0 +1,436 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Plugins {
+
+// GModule doesn't have a truly generic way to determine if a file is a shared library by extension,
+// so these are hard-coded
+private const string[] SHARED_LIB_EXTS = { "so", "la" };
+
+// Although not expecting this system to last very long, these ranges declare what versions of this
+// interface are supported by the current implementation.
+private const int MIN_SPIT_INTERFACE = 0;
+private const int MAX_SPIT_INTERFACE = 0;
+
+public class ExtensionPoint {
+ public GLib.Type pluggable_type { get; private set; }
+ // name is user-visible
+ public string name { get; private set; }
+ public string? icon_name { get; private set; }
+ public string[]? core_ids { get; private set; }
+
+ public ExtensionPoint(Type pluggable_type, string name, string? icon_name, string[]? core_ids) {
+ this.pluggable_type = pluggable_type;
+ this.name = name;
+ this.icon_name = icon_name;
+ this.core_ids = core_ids;
+ }
+}
+
+private class ModuleRep {
+ public File file;
+ public Module? module;
+ public Spit.Module? spit_module = null;
+ public int spit_interface = Spit.UNSUPPORTED_INTERFACE;
+ public string? id = null;
+
+ private ModuleRep(File file) {
+ this.file = file;
+
+ module = Module.open(file.get_path(), ModuleFlags.BIND_LAZY);
+ }
+
+ ~ModuleRep() {
+ // ensure that the Spit.Module is destroyed before the GLib.Module
+ spit_module = null;
+ }
+
+ // Have to use this funky static factory because GModule is a compact class and has no copy
+ // constructor. The handle must be kept open for the lifetime of the application (or until
+ // the module is ready to be discarded), as dropping the reference will unload the binary.
+ public static ModuleRep? open(File file) {
+ ModuleRep module_rep = new ModuleRep(file);
+
+ return (module_rep.module != null) ? module_rep : null;
+ }
+}
+
+private class PluggableRep {
+ public Spit.Pluggable pluggable { get; private set; }
+ public string id { get; private set; }
+ public bool is_core { get; private set; default = false; }
+ public bool activated { get; private set; default = false; }
+
+ private bool enabled = false;
+
+ // Note that creating a PluggableRep does not activate it.
+ public PluggableRep(Spit.Pluggable pluggable) {
+ this.pluggable = pluggable;
+ id = pluggable.get_id();
+ }
+
+ public void activate() {
+ // determine if a core pluggable (which is only known after all the extension points
+ // register themselves)
+ is_core = is_core_pluggable(pluggable);
+
+ FuzzyPropertyState saved_state = Config.Facade.get_instance().is_plugin_enabled(id);
+ enabled = ((is_core && (saved_state != FuzzyPropertyState.DISABLED)) ||
+ (!is_core && (saved_state == FuzzyPropertyState.ENABLED)));
+
+ // inform the plugin of its activation state
+ pluggable.activation(enabled);
+
+ activated = true;
+ }
+
+ public bool is_enabled() {
+ return enabled;
+ }
+
+ // Returns true if value changed, false otherwise
+ public bool set_enabled(bool enabled) {
+ if (enabled == this.enabled)
+ return false;
+
+ this.enabled = enabled;
+ Config.Facade.get_instance().set_plugin_enabled(id, enabled);
+ pluggable.activation(enabled);
+
+ return true;
+ }
+}
+
+private File[] search_dirs;
+private Gee.HashMap<string, ModuleRep> module_table;
+private Gee.HashMap<string, PluggableRep> pluggable_table;
+private Gee.HashMap<Type, ExtensionPoint> extension_points;
+private Gee.HashSet<string> core_ids;
+
+public void init() throws Error {
+ search_dirs = new File[0];
+ search_dirs += AppDirs.get_user_plugins_dir();
+ search_dirs += AppDirs.get_system_plugins_dir();
+
+ module_table = new Gee.HashMap<string, ModuleRep>();
+ pluggable_table = new Gee.HashMap<string, PluggableRep>();
+ extension_points = new Gee.HashMap<Type, ExtensionPoint>();
+ core_ids = new Gee.HashSet<string>();
+
+ // do this after constructing member variables so accessors don't blow up if GModule isn't
+ // supported
+ if (!Module.supported()) {
+ warning("Plugins not support: GModule not supported on this platform.");
+
+ return;
+ }
+
+ foreach (File dir in search_dirs) {
+ try {
+ search_for_plugins(dir);
+ } catch (Error err) {
+ debug("Unable to search directory %s for plugins: %s", dir.get_path(), err.message);
+ }
+ }
+}
+
+public void terminate() {
+ search_dirs = null;
+ pluggable_table = null;
+ module_table = null;
+ extension_points = null;
+ core_ids = null;
+}
+
+public class Notifier {
+ private static Notifier? instance = null;
+
+ public signal void pluggable_activation(Spit.Pluggable pluggable, bool enabled);
+
+ private Notifier() {
+ }
+
+ public static Notifier get_instance() {
+ if (instance == null)
+ instance = new Notifier();
+
+ return instance;
+ }
+}
+
+public void register_extension_point(Type type, string name, string? icon_name, string[]? core_ids) {
+ // if this assertion triggers, it means this extension point has already registered
+ assert(!extension_points.has_key(type));
+
+ extension_points.set(type, new ExtensionPoint(type, name, icon_name, core_ids));
+
+ // add core IDs to master list
+ if (core_ids != null) {
+ foreach (string core_id in core_ids)
+ Plugins.core_ids.add(core_id);
+ }
+
+ // activate all the pluggables for this extension point
+ foreach (PluggableRep pluggable_rep in pluggable_table.values) {
+ if (!pluggable_rep.pluggable.get_type().is_a(type))
+ continue;
+
+ pluggable_rep.activate();
+ Notifier.get_instance().pluggable_activation(pluggable_rep.pluggable, pluggable_rep.is_enabled());
+ }
+}
+
+public Gee.Collection<Spit.Pluggable> get_pluggables(bool include_disabled = false) {
+ Gee.Collection<Spit.Pluggable> all = new Gee.HashSet<Spit.Pluggable>();
+ foreach (PluggableRep pluggable_rep in pluggable_table.values) {
+ if (pluggable_rep.activated && (include_disabled || pluggable_rep.is_enabled()))
+ all.add(pluggable_rep.pluggable);
+ }
+
+ return all;
+}
+
+public bool is_core_pluggable(Spit.Pluggable pluggable) {
+ return core_ids.contains(pluggable.get_id());
+}
+
+private ModuleRep? get_module_for_pluggable(Spit.Pluggable needle) {
+ foreach (ModuleRep module_rep in module_table.values) {
+ Spit.Pluggable[]? pluggables = module_rep.spit_module.get_pluggables();
+ if (pluggables != null) {
+ foreach (Spit.Pluggable pluggable in pluggables) {
+ if (pluggable == needle)
+ return module_rep;
+ }
+ }
+ }
+
+ return null;
+}
+
+public string? get_pluggable_module_id(Spit.Pluggable needle) {
+ ModuleRep? module_rep = get_module_for_pluggable(needle);
+
+ return (module_rep != null) ? module_rep.spit_module.get_id() : null;
+}
+
+public Gee.Collection<ExtensionPoint> get_extension_points(owned CompareDataFunc? compare_func = null) {
+ Gee.Collection<ExtensionPoint> sorted = new Gee.TreeSet<ExtensionPoint>((owned) compare_func);
+ sorted.add_all(extension_points.values);
+
+ return sorted;
+}
+
+public Gee.Collection<Spit.Pluggable> get_pluggables_for_type(Type type,
+ owned CompareDataFunc? compare_func = null, bool include_disabled = false) {
+ // if this triggers it means the extension point didn't register itself at init() time
+ assert(extension_points.has_key(type));
+
+ Gee.Collection<Spit.Pluggable> for_type = new Gee.TreeSet<Spit.Pluggable>((owned) compare_func);
+ foreach (PluggableRep pluggable_rep in pluggable_table.values) {
+ if (pluggable_rep.activated
+ && pluggable_rep.pluggable.get_type().is_a(type)
+ && (include_disabled || pluggable_rep.is_enabled())) {
+ for_type.add(pluggable_rep.pluggable);
+ }
+ }
+
+ return for_type;
+}
+
+public string? get_pluggable_name(string id) {
+ PluggableRep? pluggable_rep = pluggable_table.get(id);
+
+ return (pluggable_rep != null && pluggable_rep.activated)
+ ? pluggable_rep.pluggable.get_pluggable_name() : null;
+}
+
+public bool get_pluggable_info(string id, ref Spit.PluggableInfo info) {
+ PluggableRep? pluggable_rep = pluggable_table.get(id);
+ if (pluggable_rep == null || !pluggable_rep.activated)
+ return false;
+
+ pluggable_rep.pluggable.get_info(ref info);
+
+ return true;
+}
+
+public bool get_pluggable_enabled(string id, out bool enabled) {
+ PluggableRep? pluggable_rep = pluggable_table.get(id);
+ if (pluggable_rep == null || !pluggable_rep.activated) {
+ enabled = false;
+
+ return false;
+ }
+
+ enabled = pluggable_rep.is_enabled();
+
+ return true;
+}
+
+public void set_pluggable_enabled(string id, bool enabled) {
+ PluggableRep? pluggable_rep = pluggable_table.get(id);
+ if (pluggable_rep == null || !pluggable_rep.activated)
+ return;
+
+ if (pluggable_rep.set_enabled(enabled))
+ Notifier.get_instance().pluggable_activation(pluggable_rep.pluggable, enabled);
+}
+
+public File get_pluggable_module_file(Spit.Pluggable pluggable) {
+ ModuleRep? module_rep = get_module_for_pluggable(pluggable);
+
+ return (module_rep != null) ? module_rep.file : null;
+}
+
+public int compare_pluggable_names(void *a, void *b) {
+ Spit.Pluggable *apluggable = (Spit.Pluggable *) a;
+ Spit.Pluggable *bpluggable = (Spit.Pluggable *) b;
+
+ return apluggable->get_pluggable_name().collate(bpluggable->get_pluggable_name());
+}
+
+public int compare_extension_point_names(void *a, void *b) {
+ ExtensionPoint *apoint = (ExtensionPoint *) a;
+ ExtensionPoint *bpoint = (ExtensionPoint *) b;
+
+ return apoint->name.collate(bpoint->name);
+}
+
+private bool is_shared_library(File file) {
+ string name, ext;
+ disassemble_filename(file.get_basename(), out name, out ext);
+
+ foreach (string shared_ext in SHARED_LIB_EXTS) {
+ if (ext == shared_ext)
+ return true;
+ }
+
+ return false;
+}
+
+private void search_for_plugins(File dir) throws Error {
+ debug("Searching %s for plugins ...", dir.get_path());
+
+ // build a set of module names sans file extension ... this is to deal with the question of
+ // .so vs. .la existing in the same directory (and letting GModule deal with the problem)
+ FileEnumerator enumerator = dir.enumerate_children(Util.FILE_ATTRIBUTES,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ for (;;) {
+ FileInfo? info = enumerator.next_file(null);
+ if (info == null)
+ break;
+
+ if (info.get_is_hidden())
+ continue;
+
+ File file = dir.get_child(info.get_name());
+
+ switch (info.get_file_type()) {
+ case FileType.DIRECTORY:
+ try {
+ search_for_plugins(file);
+ } catch (Error err) {
+ warning("Unable to search directory %s for plugins: %s", file.get_path(), err.message);
+ }
+ break;
+
+ case FileType.REGULAR:
+ if (is_shared_library(file))
+ load_module(file);
+ break;
+
+ default:
+ // ignored
+ break;
+ }
+ }
+}
+
+private void load_module(File file) {
+ ModuleRep? module_rep = ModuleRep.open(file);
+ if (module_rep == null) {
+ critical("Unable to load module %s: %s", file.get_path(), Module.error());
+
+ return;
+ }
+
+ // look for the well-known entry point
+ void *entry;
+ if (!module_rep.module.symbol(Spit.ENTRY_POINT_NAME, out entry)) {
+ critical("Unable to load module %s: well-known entry point %s not found", file.get_path(),
+ Spit.ENTRY_POINT_NAME);
+
+ return;
+ }
+
+ Spit.EntryPoint spit_entry_point = (Spit.EntryPoint) entry;
+
+ assert(MIN_SPIT_INTERFACE <= Spit.CURRENT_INTERFACE && Spit.CURRENT_INTERFACE <= MAX_SPIT_INTERFACE);
+ Spit.EntryPointParams params = Spit.EntryPointParams();
+ params.host_min_spit_interface = MIN_SPIT_INTERFACE;
+ params.host_max_spit_interface = MAX_SPIT_INTERFACE;
+ params.module_spit_interface = Spit.UNSUPPORTED_INTERFACE;
+ params.module_file = file;
+
+ module_rep.spit_module = spit_entry_point(&params);
+ if (params.module_spit_interface == Spit.UNSUPPORTED_INTERFACE) {
+ critical("Unable to load module %s: module reports no support for SPIT interfaces %d to %d",
+ file.get_path(), MIN_SPIT_INTERFACE, MAX_SPIT_INTERFACE);
+
+ return;
+ }
+
+ if (params.module_spit_interface < MIN_SPIT_INTERFACE || params.module_spit_interface > MAX_SPIT_INTERFACE) {
+ critical("Unable to load module %s: module reports unsupported SPIT version %d (out of range %d to %d)",
+ file.get_path(), module_rep.spit_interface, MIN_SPIT_INTERFACE, MAX_SPIT_INTERFACE);
+
+ return;
+ }
+
+ module_rep.spit_interface = params.module_spit_interface;
+
+ // verify type (as best as possible; still potential to segfault inside GType here)
+ if (!(module_rep.spit_module is Spit.Module))
+ module_rep.spit_module = null;
+
+ if (module_rep.spit_module == null) {
+ critical("Unable to load module %s (SPIT %d): no spit module returned", file.get_path(),
+ module_rep.spit_interface);
+
+ return;
+ }
+
+ // if module has already been loaded, drop this one (search path is set up to load user-installed
+ // binaries prior to system binaries)
+ module_rep.id = prepare_input_text(module_rep.spit_module.get_id(), PrepareInputTextOptions.DEFAULT, -1);
+ if (module_rep.id == null) {
+ critical("Unable to load module %s (SPIT %d): invalid or empty module name",
+ file.get_path(), module_rep.spit_interface);
+
+ return;
+ }
+
+ if (module_table.has_key(module_rep.id)) {
+ critical("Not loading module %s (SPIT %d): module with name \"%s\" already loaded",
+ file.get_path(), module_rep.spit_interface, module_rep.id);
+
+ return;
+ }
+
+ debug("Loaded SPIT module \"%s %s\" (%s) [%s]", module_rep.spit_module.get_module_name(),
+ module_rep.spit_module.get_version(), module_rep.id, file.get_path());
+
+ // stash in module table by their ID
+ module_table.set(module_rep.id, module_rep);
+
+ // stash pluggables in pluggable table by their ID
+ foreach (Spit.Pluggable pluggable in module_rep.spit_module.get_pluggables())
+ pluggable_table.set(pluggable.get_id(), new PluggableRep(pluggable));
+}
+
+}
+
diff --git a/src/plugins/PublishingInterfaces.vala b/src/plugins/PublishingInterfaces.vala
new file mode 100644
index 0000000..ca74597
--- /dev/null
+++ b/src/plugins/PublishingInterfaces.vala
@@ -0,0 +1,605 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Shotwell Pluggable Publishing API
+ *
+ * The Shotwell Pluggable Publishing API allows you to write plugins that upload
+ * photos and videos to web services. The Shotwell distribution includes publishing
+ * support for four core services: Facebook, Flickr, Picasa Web Albums, and YouTube.
+ * To enable Shotwell to connect to additional services, developers like you write
+ * publishing plugins, dynamically-loadable shared objects that are linked into the
+ * Shotwell process at runtime. Publishing plugins are just one of several kinds of
+ * plugins supported by {@link Spit}, the Shotwell Pluggable Interfaces Technology.
+ */
+namespace Spit.Publishing {
+
+/**
+ * The current version of the Pluggable Publishing API
+ */
+public const int CURRENT_INTERFACE = 0;
+
+/**
+ * Defines different kinds of errors that can occur during publishing.
+ */
+public errordomain PublishingError {
+ /**
+ * Indicates that no communications channel could be opened to the remote host.
+ *
+ * This error occurs, for example, when no network connection is available or
+ * when a DNS lookup fails.
+ */
+ NO_ANSWER,
+
+ /**
+ * Indicates that a communications channel to the remote host was previously opened, but
+ * the remote host can no longer be reached.
+ *
+ * This error occurs, for example, when the network is disconnected during a publishing
+ * interaction.
+ */
+ COMMUNICATION_FAILED,
+
+ /**
+ * Indicates that a communications channel to the remote host was opened and
+ * is active, but that messages sent to or from the remote host can't be understood.
+ *
+ * This error occurs, for example, when attempting to interact with a RESTful host
+ * via XML-RPC.
+ */
+ PROTOCOL_ERROR,
+
+ /**
+ * Indicates that the remote host has received a well-formed message that has caused
+ * a server-side error.
+ *
+ * This error occurs, for example, when the remote host receives a message that should
+ * be signed but isn't.
+ */
+ SERVICE_ERROR,
+
+ /**
+ * Indicates that the remote host has sent the local client back a well-formed response,
+ * but the response can't be understood.
+ *
+ * This error occurs, for example, when the remote host sends a response in an XML grammar
+ * different from that expected by the local client.
+ */
+ MALFORMED_RESPONSE,
+
+ /**
+ * Indicates that the local client can't access a file or files in local storage.
+ *
+ * This error occurs, for example, when the local client attempts to read binary data
+ * out of a photo or video file that doesn't exist.
+ */
+ LOCAL_FILE_ERROR,
+
+ /**
+ * Indicates that the remote host has rejected the session identifier used by the local
+ * client as out-of-date. The local client should acquire a new session identifier.
+ */
+ EXPIRED_SESSION
+}
+
+/**
+ * Represents a connection to a publishing service.
+ *
+ * Developers of publishing plugins provide a class that implements this interface. At
+ * any given time, only one Publisher can be running. When a publisher is running, it is
+ * allowed to access the network and has exclusive use of the shared user-interface and
+ * configuration services provided by the {@link PluginHost}. Publishers are created in
+ * a non-running state and do not begin running until start( ) is invoked. Publishers
+ * run until stop( ) is invoked.
+ */
+public interface Publisher : GLib.Object {
+ /**
+ * Describes the kinds of media a publishing service supports.
+ *
+ * Values can be masked together, for example: {{{(MediaType.PHOTO | MediaType.VIDEO)}}}
+ * indicates that a publishing service supports the upload of both photos and videos.
+ */
+ public enum MediaType {
+ NONE = 0,
+ PHOTO = 1 << 0,
+ VIDEO = 1 << 1
+ }
+
+ /**
+ * Returns a {@link Service} object describing the service to which this connects.
+ */
+ public abstract Service get_service();
+
+ /**
+ * Makes this publisher enter the running state and endows it with exclusive access
+ * to the shared services provided by the {@link PluginHost}. Through the host’s interface,
+ * this publisher can install user interface panes and query configuration information.
+ * Only running services should perform network operations.
+ */
+ public abstract void start();
+
+ /**
+ * Returns true if this publisher is in the running state; false otherwise.
+ */
+ public abstract bool is_running();
+
+ /**
+ * Causes this publisher to enter a non-running state. This publisher should stop all
+ * network operations and cease use of the shared services provided by the {@link PluginHost}.
+ */
+ public abstract void stop();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Encapsulates a pane that can be installed in the on-screen publishing dialog box to
+ * communicate status to and to get information from the user.
+ *
+ */
+public interface DialogPane : GLib.Object {
+
+ /**
+ * Describes how the on-screen publishing dialog box should look and behave when an associated
+ * pane is installed in the on-screen publishing dialog box.
+ */
+ public enum GeometryOptions {
+
+ /**
+ * When the associated pane is installed, the on-screen publishing dialog box will be
+ * sized normally and will not allow the user to change its size.
+ */
+ NONE = 0,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will grow to a larger size.
+ */
+ EXTENDED_SIZE = 1 << 0,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will allow the user to change its size.
+ */
+ RESIZABLE = 1 << 1,
+
+ /**
+ * If this bit is set, when the associated pane is installed, the on-screen publishing
+ * dialog box will grow to accommodate a full-width 1024 pixel web page. If both
+ * EXTENDED_SIZE and COLOSSAL_SIZE are set, EXTENDED_SIZE takes precedence.
+ */
+ COLOSSAL_SIZE = 1 << 2;
+ }
+
+ /**
+ * Returns the Gtk.Widget that is this pane's on-screen representation.
+ */
+ public abstract Gtk.Widget get_widget();
+
+ /**
+ * Returns a {@link GeometryOptions} bitfield describing how the on-screen publishing dialog
+ * box should look and behave when this pane is installed.
+ */
+ public abstract GeometryOptions get_preferred_geometry();
+
+ /**
+ * Invoked automatically by Shotwell when this pane has been installed into the on-screen
+ * publishing dialog box and become visible to the user.
+ */
+ public abstract void on_pane_installed();
+
+ /**
+ * Invoked automatically by Shotwell when this pane has been removed from the on-screen
+ * publishing dialog box and is no longer visible to the user.
+ */
+ public abstract void on_pane_uninstalled();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Enables its caller to report to the user on the progress of a publishing operation.
+ *
+ * @param file_number the sequence number of media item that the publishing system is currently
+ * working with, starting at 1. For example, if the user chooses to publish
+ * 4 photos, these photos would have sequence numbers 1, 2, 3, and 4.
+ *
+ * @param fraction_complete the fraction of the current publishing operation that has been
+ * completed, from 0.0 to 1.0, inclusive.
+ */
+public delegate void ProgressCallback(int file_number, double fraction_complete);
+
+/**
+ * Called by the publishing system when the user clicks the 'Login' button in a service welcome
+ * pane.
+ */
+public delegate void LoginCallback();
+
+/**
+ * Manages and provides services for publishing plugins.
+ *
+ * Implemented inside Shotwell, the PluginHost provides an interface through which the
+ * developers of publishing plugins can query and make changes to the publishing
+ * environment. For example, through the PluginHost, plugins can get a list of the photos
+ * and videos to be published, install and remove user-interface panes in the publishing
+ * dialog box, and request that the items to be uploaded be serialized to a temporary
+ * directory on disk. Plugins can use the services of the PluginHost only when their
+ * {@link Publisher} is in the running state. This ensures that non-running publishers
+ * don’t destructively interfere with the actively running publisher.
+ */
+public interface PluginHost : GLib.Object, Spit.HostInterface {
+
+ /**
+ * Specifies the label text on the push button control that appears in the
+ * lower-right-hand corner of the on-screen publishing dialog box.
+ */
+ public enum ButtonMode {
+ CLOSE = 0,
+ CANCEL = 1
+ }
+
+ /**
+ * Notifies the user that an unrecoverable publishing error has occurred and halts
+ * the publishing process.
+ *
+ * @param err An error object that describes the kind of error that occurred.
+ */
+ public abstract void post_error(Error err);
+
+ /**
+ * Halts the publishing process.
+ *
+ * Calling this method stops all network activity and hides the on-screen publishing
+ * dialog box.
+ */
+ public abstract void stop_publishing();
+
+ /**
+ * Returns a reference to the {@link Publisher} object that this is currently hosting.
+ */
+ public abstract Publisher get_publisher();
+
+ /**
+ * Attempts to install a pane in the on-screen publishing dialog box, making the pane visible
+ * and allowing it to interact with the user.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param pane the pane to install
+ *
+ * @param mode allows you to set the text displayed on the close/cancel button in the
+ * lower-right-hand corner of the on-screen publishing dialog box when pane is installed.
+ * If mode is ButtonMode.CLOSE, the button will have the title "Close." If mode is
+ * ButtonMode.CANCEL, the button will be titled "Cancel." You should set mode depending on
+ * whether a cancellable action is in progress. For example, if your publisher is in the
+ * middle of uploading 3 of 8 videos, then mode should be ButtonMode.CANCEL. However, if
+ * the publishing operation has completed and the success pane is displayed, then mode
+ * should be ButtonMode.CLOSE, because all cancellable publishing actions have already
+ * occurred.
+ */
+ public abstract void install_dialog_pane(Spit.Publishing.DialogPane pane,
+ ButtonMode mode = ButtonMode.CANCEL);
+
+ /**
+ * Attempts to install a pane in the on-screen publishing dialog box that contains
+ * static text.
+ *
+ * The text appears centered in the publishing dialog box and is drawn in
+ * the system font. This is a convenience method only; similar results could be
+ * achieved by manually constructing a Gtk.Label widget, wrapping it inside a
+ * {@link DialogPane}, and installing it manually with a call to
+ * install_dialog_pane( ). To provide visual consistency across publishing services,
+ * however, always use this convenience method instead of constructing label panes when
+ * you need to display static text to the user.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param message the text to show in the pane
+ *
+ * @param mode allows you to set the text displayed on the close/cancel button in the
+ * lower-right-hand corner of the on-screen publishing dialog box when pane is installed.
+ * If mode is ButtonMode.CLOSE, the button will have the title "Close." If mode is
+ * ButtonMode.CANCEL, the button will be titled "Cancel." You should set mode depending on
+ * whether a cancellable action is in progress. For example, if your publisher is in the
+ * middle of uploading 3 of 8 videos, then mode should be ButtonMode.CANCEL. However, if
+ * the publishing operation has completed and the success pane is displayed, then mode
+ * should be ButtonMode.CLOSE, because all cancellable publishing actions have already
+ * occurred.
+ */
+ public abstract void install_static_message_pane(string message,
+ ButtonMode mode = ButtonMode.CANCEL);
+
+ /**
+ * Works just like {@link install_static_message_pane} but allows markup to contain
+ * Pango text formatting tags as well as unstyled text.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param markup the text to show in the pane, marked up with Pango formatting tags.
+ *
+ * @param mode allows you to set the text displayed on the close/cancel button in the
+ * lower-right-hand corner of the on-screen publishing dialog box when pane is installed.
+ * If mode is ButtonMode.CLOSE, the button will have the title "Close." If mode is
+ * ButtonMode.CANCEL, the button will be titled "Cancel." You should set mode depending on
+ * whether a cancellable action is in progress. For example, if your publisher is in the
+ * middle of uploading 3 of 8 videos, then mode should be ButtonMode.CANCEL. However, if
+ * the publishing operation has completed and the success pane is displayed, then mode
+ * should be ButtonMode.CLOSE, because all cancellable publishing actions have already
+ * occurred.
+ */
+ public abstract void install_pango_message_pane(string markup,
+ ButtonMode mode = ButtonMode.CANCEL);
+
+ /**
+ * Attempts to install a pane in the on-screen publishing dialog box notifying the user
+ * that his or her publishing operation completed successfully.
+ *
+ * The text displayed depends on the type of media the current publishing service
+ * supports. To provide visual consistency across publishing services and to allow
+ * Shotwell to handle internationalization, always use this convenience method; don’t
+ * contruct and install success panes manually.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor
+ * this request.
+ */
+ public abstract void install_success_pane();
+
+ /**
+ * Attempts to install a pane displaying the static text “Fetching account information...”
+ * in the on-screen publishing dialog box, making it visible to the user.
+ *
+ * This is a convenience method only; similar results could be achieved by calling
+ * {@link install_static_message_pane} with an appropriate text argument. To provide
+ * visual consistency across publishing services and to allow Shotwell to handle
+ * internationalization, however, you should always use this convenience method whenever
+ * you need to tell the user that you’re querying account information over the network.
+ * Queries such as this are almost always performed immediately after the user has logged
+ * in to the remote service.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ */
+ public abstract void install_account_fetch_wait_pane();
+
+
+ /**
+ * Works just like {@link install_account_fetch_wait_pane} but displays the static text
+ * “Logging in...“
+ *
+ * As with {@link install_account_fetch_wait_pane}, this is a convenience method, but
+ * you should you use it provide to visual consistency and to let Shotwell handle
+ * internationalization. See the description of {@link install_account_fetch_wait_pane}
+ * for more information.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ */
+ public abstract void install_login_wait_pane();
+
+ /**
+ * Attempts to install a pane displaying the text 'welcome_message' above a push
+ * button labeled “Login” in the on-screen publishing dialog box, making it visible to the
+ * user.
+ *
+ * When the user clicks the “Login” button, you’ll be notified of the user’s action through
+ * the callback 'on_login_clicked'. Every Publisher should provide a welcome pane to
+ * introduce the service and explain service-specific features or restrictions. To provide
+ * visual consistency across publishing services and to allow Shotwell to handle
+ * internationalization, always use this convenience method; don’t contruct and install
+ * welcome panes manually.
+ *
+ * If an error has posted, the {@link PluginHost} will not honor this request.
+ *
+ * @param welcome_message the text to be displayed above a push button labeled “Login”
+ * in the on-screen publishing dialog box.
+ *
+ * @param on_login_clicked specifies the callback that is invoked when the user clicks
+ * the “Login” button.
+ */
+ public abstract void install_welcome_pane(string welcome_message,
+ LoginCallback on_login_clicked);
+
+ /**
+ * Toggles whether the service selector combo box in the upper-right-hand corner of the
+ * on-screen publishing dialog box is sensitive to input.
+ *
+ * Publishers should make the service selector box insensitive to input when they are performing
+ * non-interruptible file or network operations, since switching to another publishing
+ * service will halt whatever service is currently running. Under certain circumstances,
+ * the {@link PluginHost} may not honor this request.
+ *
+ * @param is_locked when is_locked is true, the service selector combo box is made insensitive.
+ * It appears greyed out and the user is prevented from switching to another publishing service.
+ * When is_locked is false, the combo box is sensitive, allowing the user to freely switch
+ * from the current service to another service.
+ */
+ public abstract void set_service_locked(bool is_locked);
+
+ /**
+ * Makes the designated widget the default widget for the publishing dialog.
+ *
+ * After a call to this method, the designated widget will be activated whenever the user
+ * presses the [ENTER] key anywhere in the on-screen publishing dialog box. Under certain
+ * circumstances, the {@link PluginHost} may not honor this request.
+ *
+ * @param widget a reference to the widget to designate as the default widget for the
+ * publishing dialog.
+ */
+ public abstract void set_dialog_default_widget(Gtk.Widget widget);
+
+ /**
+ * Returns an array of the publishable media items that the user has selected for upload to the
+ * remote service.
+ */
+ public abstract Publishable[] get_publishables();
+
+ /**
+ * Writes all of the publishable media items that the user has selected for upload to the
+ * remote service to a temporary directory on a local disk.
+ *
+ * You should call this method immediately before sending the publishable media items to the
+ * remote service over the network. Because serializing several megabytes of data is a
+ * potentially lengthy operation, calling this method installs an activity status pane in
+ * the on-screen publishing dialog box. The activity status pane displays a progress bar along
+ * with a string of informational text.
+ *
+ * Because sending items over the network to the remote service is also a potentially lengthy
+ * operation, you should leave the activity status pane installed in the on-screen publishing
+ * dialog box until this task is finished. Periodically during the sending process, you should
+ * report to the user on the progress of his or her upload. You can do this by invoking the
+ * returned {@link ProgressCallback} delegate.
+ *
+ * After calling this method, the activity status pane that this method installs remains
+ * displayed in the on-screen publishing dialog box until you install a new pane.
+ *
+ * @param content_major_axis when serializing publishable media items that are photos,
+ * ensure that neither the width nor the height of the serialized
+ * photo is greater than content_major_axis pixels. The value of
+ * this parameter has no effect on video publishables.
+ *
+ * @param strip_metadata when serializing publishable media items that are photos, if
+ * strip_metadata is true, all EXIF, IPTC, and XMP metadata will be
+ * removed from the serialized file. If strip_metadata is false, all
+ * metadata will be left intact. The value of this parameter has no
+ * effect on video publishables.
+ */
+ public abstract ProgressCallback? serialize_publishables(int content_major_axis,
+ bool strip_metadata = false);
+
+ /**
+ * Returns a {@link Publisher.MediaType} bitfield describing which kinds of media are present
+ * in the set of publishable media items that the user has selected for upload to the remote
+ * service.
+ */
+ public abstract Spit.Publishing.Publisher.MediaType get_publishable_media_type();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Describes an underlying media item (such as a photo or a video) that your plugin
+ * uploads to a remote publishing service.
+ */
+public interface Publishable : GLib.Object {
+
+ public static const string PARAM_STRING_BASENAME = "basename";
+ public static const string PARAM_STRING_TITLE = "title";
+ public static const string PARAM_STRING_COMMENT = "comment";
+ public static const string PARAM_STRING_EVENTCOMMENT= "eventcomment";
+
+ /**
+ * Returns a handle to the file on disk to which this publishable's data has been
+ * serialized.
+ *
+ * You should use this file handle to read into memory the binary data you will send over
+ * the network to the remote publishing service when this publishable is uploaded.
+ */
+ public abstract GLib.File? get_serialized_file();
+
+ /**
+ * Returns a name that can be used to identify this publishable to the remote service.
+ * If the publishing host cannot derive a sensible name, this method will
+ * return an empty string. Plugins should be able to handle that situation
+ * and provide a fallback value. One possible option for a fallback is:
+ * get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME)
+ */
+ public abstract string get_publishing_name();
+
+ /**
+ * Returns a string value from the publishable corresponding with the parameter name
+ * provided, or null if there is no value for this name.
+ */
+ public abstract string? get_param_string(string name);
+
+ /**
+ * Returns an array of strings that should be used to tag or mark this publishable on the
+ * remote service, or null if this publishable has no tags or markings.
+ */
+ public abstract string[] get_publishing_keywords();
+
+ /**
+ * Returns the kind of media item this publishable encapsulates.
+ */
+ public abstract Spit.Publishing.Publisher.MediaType get_media_type();
+
+ /**
+ * Returns the creation timestamp on the file.
+ */
+ public abstract GLib.DateTime get_exposure_date_time();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Describes the features and capabilities of a remote publishing service.
+ *
+ * Developers of publishing plugins provide a class that implements this interface.
+ */
+public interface Service : Object, Spit.Pluggable {
+ /**
+ * A factory method that instantiates and returns a new {@link Publisher} object that
+ * encapsulates a connection to the remote publishing service that this Service describes.
+ */
+ public abstract Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host);
+
+ /**
+ * Returns the kinds of media that this service can work with.
+ */
+ public abstract Spit.Publishing.Publisher.MediaType get_supported_media();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+}
+
diff --git a/src/plugins/SpitInterfaces.vala b/src/plugins/SpitInterfaces.vala
new file mode 100644
index 0000000..f2fce6f
--- /dev/null
+++ b/src/plugins/SpitInterfaces.vala
@@ -0,0 +1,367 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Shotwell Pluggable Interface Technology (SPIT)
+ *
+ * This is the front-end interface for all modules (i.e. .so/.la files) that allows for Shotwell
+ * to query them for information and to get a list of all plug-ins stored in the module. This
+ * is named Shotwell Pluggable Interface Technology (SPIT). This is intended only to last long
+ * enough for another generic plug-in library (most likely Peas) to be used later.
+ *
+ * The Spit namespace is used for all interfaces and code that are made available to plugins or
+ * are exposed by plugins.
+ *
+ * More information can be found at [[https://wiki.gnome.org/Apps/Shotwell/Architecture/WritingPlugins]]
+ */
+namespace Spit {
+
+/**
+ * Reserved interface value denoting an unsupported interface version.
+ *
+ * All interface versions should be zero-based and incrementing.
+ */
+public const int UNSUPPORTED_INTERFACE = -1;
+
+/**
+ * Current version of the SPIT interface.
+ */
+public const int CURRENT_INTERFACE = 0;
+
+/**
+ * A utility function for checking host interfaces against one's own and returning the right value.
+ *
+ * Note that this only works if the caller operates on only one interface version (and cannot mutate
+ * between multiple ones).
+ *
+ * @param min_host_interface The minimum supported host interface version.
+ * @param max_host_interface The maximum supported host interface version.
+ * @param plugin_interface The interface version supported by the Pluggable.
+ *
+ * @return The plugin's interface version if supported, {@link UNSUPPORTED_INTERFACE} otherwise.
+ */
+public int negotiate_interfaces(int min_host_interface, int max_host_interface, int plugin_interface) {
+ return (min_host_interface > plugin_interface || max_host_interface < plugin_interface)
+ ? UNSUPPORTED_INTERFACE : plugin_interface;
+}
+
+/**
+ * SPIT entry point parameters.
+ *
+ * The host application passes a pointer to this structure for the module's information.
+ * The pointer should //not// be held, as it may be freed or reused by the host application
+ * after calling the entry point. The module should copy any information it may need (or hold
+ * a GObject reference) in its own memory space.
+ *
+ * Note that the module //must// fill in the module_spit_interface field with the SPIT interface
+ * version it understands prior to returning control.
+ */
+public struct EntryPointParams {
+ /**
+ * The host's minimum supported interface version.
+ */
+ public int host_min_spit_interface;
+ /**
+ * The host's maximum supported interface version.
+ */
+ public int host_max_spit_interface;
+ /**
+ * The module returns here the interface version of SPIT it supports,
+ * {@link UNSUPPORTED_INTERFACE} otherwise.
+ */
+ public int module_spit_interface;
+ /**
+ * A File object representing the library file (.so/la.) that the plugin was loaded from.
+ */
+ public File module_file;
+}
+
+/**
+ * SPIT API entry point.
+ *
+ * Host application passes in the minimum and maximum version of the SPIT
+ * interface it supports (values are inclusive) in the {@link EntryPointParams} struct.
+ * The module returns the version it wishes to use and a pointer to a {@link Spit.Module} (which
+ * will remain ref'ed by the host as long as the module is loaded in memory). The module should
+ * return {@link UNSUPPORTED_INTERFACE} if the min/max are out of its range and null for its
+ * Spit.Module. ({@link negotiate_interfaces} is good for dealing with this.)
+ *
+ * @return A {@link Spit.Module} if the interface negotiation is acceptable, null otherwise.
+ */
+[CCode (has_target = false)]
+public delegate Module? EntryPoint(EntryPointParams *params);
+
+/**
+ * SPIT entry point name, which matches {@link EntryPoint}'s interface
+ */
+public const string ENTRY_POINT_NAME = "spit_entry_point";
+
+/**
+ * A Module represents the resources of an entire dynamically-linked module (i.e. a .so/.la).
+ *
+ * A module holds zero or more Shotwell plugins ({@link Pluggable}). Once the module has been
+ * loaded into process space this object is retrieved by Shotwell. All calls to the module and
+ * its plugins are resolved through this interface.
+ *
+ * Note: The module is responsible for holding the reference to the Module object, of which there
+ * should be only one in the library file. The module should implement a g_module_unload method
+ * and drop the reference there.
+ */
+public interface Module : Object {
+ /**
+ * Returns a user-visible string describing the module.
+ */
+ public abstract unowned string get_module_name();
+
+ /**
+ * Returns a user-visible string describing the module version.
+ *
+ * Note that this may be programmatically interpreted at some point, so use a widespread
+ * versioning scheme.
+ */
+ public abstract unowned string get_version();
+
+ /**
+ * Returns a unique identifier for this module.
+ *
+ * This is used to differentiate between multiple
+ * installed versions and to determine which one should be used (i.e. if a module is available
+ * in a system directory and a user directory). This name is case-sensitive.
+ *
+ * Best practice: use a reverse-DNS-order scheme, a la Java's packages
+ * (i.e. "org.yorba.shotwell.frotz").
+ */
+ public abstract unowned string get_id();
+
+ /**
+ * Returns an array of {@link Pluggable} that represent each plugin available in the module.
+ *
+ * May return NULL or an empty array.
+ */
+ public abstract unowned Pluggable[]? get_pluggables();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * A structure holding an assortment of information about a {@link Pluggable}.
+ */
+public struct PluggableInfo {
+ public string? version;
+ public string? brief_description;
+ /**
+ * A comma-delimited list of the authors of this {@link Pluggable}.
+ */
+ public string? authors;
+ public string? copyright;
+ public string? license;
+ public bool is_license_wordwrapped;
+ public string? website_url;
+ public string? website_name;
+ public string? translators;
+ /**
+ * An icon representing this plugin at one or more sizes. Shotwell may select an icon
+ * according to the size that closest fits the control its being drawn in.
+ */
+ public Gdk.Pixbuf[]? icons;
+}
+
+/**
+ * A generic interface to all Shotwell plugins.
+ *
+ * Each plugin in a module needs to implement this interface at a minimum. Extension
+ * points may have (and probably will have) specific interface requirements as well.
+ */
+public interface Pluggable : Object {
+ /**
+ * Pluggable interface version negotiation.
+ *
+ * Like the {@link EntryPoint}, this mechanism allows for the host to negotiate with the Pluggable
+ * for its interface version. If the pluggable does not support an interface between the
+ * two ranges (inclusive), it should return {@link UNSUPPORTED_INTERFACE}.
+ *
+ * Note that this is ''not'' a negotiation of the SPIT interface versions (which is the
+ * responsibility of {@link EntryPoint}. Rather, each extension point is expected to version
+ * its own cluster of interfaces. It is that interface version that is being negotiated here.
+ *
+ * {@link negotiate_interfaces} can be used to implement this method.
+ *
+ * @param min_host_interface The host's minimum supported interface version number
+ * //for this Pluggable's intended extension point//.
+ * @param max_host_interface The host's maximum supported interface version number
+ * //for this Pluggable's intended extension point//.
+ *
+ * @return The version number supported by the host and the Pluggable or
+ * {@link UNSUPPORTED_INTERFACE}.
+ */
+ public abstract int get_pluggable_interface(int min_host_interface, int max_host_interface);
+
+ /**
+ * Returns a unique identifier for this Pluggable.
+ *
+ * Like {@link Module.get_id}, best practice is to use a reverse-DNS-order scheme to avoid
+ * conflicts.
+ */
+ public abstract unowned string get_id();
+
+ /**
+ * Returns a user-visible name for the Pluggable.
+ */
+ public abstract unowned string get_pluggable_name();
+
+ /**
+ * Returns extra information about the Pluggable that is used to identify it to the user.
+ */
+ public abstract void get_info(ref PluggableInfo info);
+
+ /**
+ * Called when the Pluggable is enabled (activated) or disabled (deactivated).
+ *
+ * activation will be called at the start of the program if the user previously
+ * enabled/disabled it as well as during program execution if the user changes its state. Note
+ * that disabling a Pluggable does not require destroying existing resources or objects
+ * the Pluggable has previously handed off to the host.
+ *
+ * This is purely informational. The Pluggable should acquire any long-term resources
+ * it may be holding onto here, or wait until an extension-specific call is made to it.
+ *
+ * @param enabled ``true`` if the Pluggable has been enabled, ``false`` otherwise.
+ */
+ public abstract void activation(bool enabled);
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * An interface to common services supplied by the host (Shotwell).
+ *
+ * Each {@link Pluggable} is offered a HostInterface for needs common to most plugins.
+ *
+ * Note that
+ * a HostInterface is not explicitly handed to the Pluggable through the SPIT interface, but is expected
+ * to be offered to the Pluggable through an interface applicable to the extension point. This
+ * also allows the extension point to extend HostInterface to offer other services applicable to the
+ * type of plugin.
+ */
+public interface HostInterface : Object {
+ /**
+ * Returns a File object representing the library file (.so/la.) that the plugin was loaded
+ * from.
+ */
+ public abstract File get_module_file();
+
+ /**
+ * Get a boolean from a persistent configuration store.
+ *
+ * @param key The name of the value to be retrieved.
+ * @param def The default value (returned if the key has not been previously set).
+ *
+ * @return The value associated with key, def if not set.
+ */
+ public abstract bool get_config_bool(string key, bool def);
+
+ /**
+ * Store a boolean in a persistent configuration store.
+ *
+ * @param key The name of the value to be stored.
+ * @param val The value to be stored.
+ */
+ public abstract void set_config_bool(string key, bool val);
+
+ /**
+ * Get an integer from a persistent configuration store.
+ *
+ * @param key The name of the value to be retrieved.
+ * @param def The default value (returned if the key has not been previously set).
+ *
+ * @return The value associated with key, def if not set.
+ */
+ public abstract int get_config_int(string key, int def);
+
+ /**
+ * Store an integer in a persistent configuration store.
+ *
+ * @param key The name of the value to be stored.
+ * @param val The value to be stored.
+ */
+ public abstract void set_config_int(string key, int val);
+
+ /**
+ * Get a string from a persistent configuration store.
+ *
+ * @param key The name of the value to be retrieved.
+ * @param def The default value (returned if the key has not been previously set).
+ *
+ * @return The value associated with key, def if not set.
+ */
+ public abstract string? get_config_string(string key, string? def);
+
+ /**
+ * Store a string in a persistent configuration store.
+ *
+ * @param key The name of the value to be stored.
+ * @param val The value to be stored.
+ */
+ public abstract void set_config_string(string key, string? val);
+
+ /**
+ * Get a double from a persistent configuration store.
+ *
+ * @param key The name of the value to be retrieved.
+ * @param def The default value (returned if the key has not been previously set).
+ *
+ * @return The value associated with key, def if not set.
+ */
+ public abstract double get_config_double(string key, double def);
+
+ /**
+ * Store a double in a persistent configuration store.
+ *
+ * @param key The name of the value to be stored.
+ * @param val The value to be stored.
+ */
+ public abstract void set_config_double(string key, double val);
+
+ /**
+ * Delete the value from the persistent configuration store.
+ */
+ public abstract void unset_config_key(string key);
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+}
+
diff --git a/src/plugins/StandardHostInterface.vala b/src/plugins/StandardHostInterface.vala
new file mode 100644
index 0000000..9bfc0aa
--- /dev/null
+++ b/src/plugins/StandardHostInterface.vala
@@ -0,0 +1,84 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Plugins {
+
+public class StandardHostInterface : Object, Spit.HostInterface {
+ private string config_domain;
+ private string config_id;
+ private File module_file;
+ private Spit.PluggableInfo info;
+
+ public StandardHostInterface(Spit.Pluggable pluggable, string config_domain) {
+ this.config_domain = config_domain;
+ config_id = parse_key(pluggable.get_id());
+ module_file = get_pluggable_module_file(pluggable);
+ pluggable.get_info(ref info);
+ }
+
+ private static string parse_key(string id) {
+ // special case: legacy plugins (Web publishers moved into SPIT) have special names
+ // new plugins will use their full ID
+ switch (id) {
+ case "org.yorba.shotwell.publishing.facebook":
+ return "facebook";
+
+ case "org.yorba.shotwell.publishing.picasa":
+ return "picasa";
+
+ case "org.yorba.shotwell.publishing.flickr":
+ return "flickr";
+
+ case "org.yorba.shotwell.publishing.youtube":
+ return "youtube";
+
+ default:
+ return id;
+ }
+ }
+
+ public File get_module_file() {
+ return module_file;
+ }
+
+ public bool get_config_bool(string key, bool def) {
+ return Config.Facade.get_instance().get_plugin_bool(config_domain, config_id, key, def);
+ }
+
+ public void set_config_bool(string key, bool val) {
+ Config.Facade.get_instance().set_plugin_bool(config_domain, config_id, key, val);
+ }
+
+ public int get_config_int(string key, int def) {
+ return Config.Facade.get_instance().get_plugin_int(config_domain, config_id, key, def);
+ }
+
+ public void set_config_int(string key, int val) {
+ Config.Facade.get_instance().set_plugin_int(config_domain, config_id, key, val);
+ }
+
+ public string? get_config_string(string key, string? def) {
+ return Config.Facade.get_instance().get_plugin_string(config_domain, config_id, key, def);
+ }
+
+ public void set_config_string(string key, string? val) {
+ Config.Facade.get_instance().set_plugin_string(config_domain, config_id, key, val);
+ }
+
+ public double get_config_double(string key, double def) {
+ return Config.Facade.get_instance().get_plugin_double(config_domain, config_id, key, def);
+ }
+
+ public void set_config_double(string key, double val) {
+ Config.Facade.get_instance().set_plugin_double(config_domain, config_id, key, val);
+ }
+
+ public void unset_config_key(string key) {
+ Config.Facade.get_instance().unset_plugin_key(config_domain, config_id, key);
+ }
+}
+
+}
diff --git a/src/plugins/TransitionsInterfaces.vala b/src/plugins/TransitionsInterfaces.vala
new file mode 100644
index 0000000..eae76cf
--- /dev/null
+++ b/src/plugins/TransitionsInterfaces.vala
@@ -0,0 +1,300 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/**
+ * Transitions are used in Shotwell for interstitial effects in slideshow mode. They may
+ * also be used elsewhere in future releases.
+ *
+ * Plugin writers should start by implementing a {@link Descriptor} which in turn Shotwell uses
+ * to instantiate an {@link Effect}.
+ */
+namespace Spit.Transitions {
+
+/**
+ * The current version of the Transitions plugin interface.
+ */
+public const int CURRENT_INTERFACE = 0;
+
+/**
+ * Direction indicates what direction (animated motion) the {@link Effect} should simulate the
+ * images are moving, if appropriate.
+ *
+ * The direction indicates from what side or corner of the screen the new image should come in from.
+ * Thus, a LEFT slide means the current image exits via the left-hand edge of the screen and the
+ * new image moves into place from the right-hand edge.
+ *
+ * UP, DOWN, and diagonals may be added at some point.
+ */
+public enum Direction {
+ LEFT = 0,
+ RIGHT = 1,
+
+ /**
+ * Convenience definition (for LTR readers).
+ */
+ FORWARD = LEFT,
+
+ /**
+ * Convenience definition (for LTR readers).
+ */
+ BACKWARD = RIGHT
+}
+
+/**
+ * Visuals contains the pertinent drawing information for the transition that must occur.
+ *
+ * A Visuals object is supplied to {@link Effect} at the start of the transition and during each
+ * call to paint to the screen.
+ *
+ * Note that if starting with a blank screen, from_pixbuf will be null and from_pos will be
+ * zeroed. The transition should be considered to start from a blank screen of the supplied
+ * background color.
+ *
+ * Also note that if transitioning to a blank screen, to_pixbuf will be null and to_pos will be
+ * zeroed. Like the prior case, the transition should move toward a blank screen of the background
+ * color.
+ */
+public class Visuals : Object {
+ /**
+ * Returns the starting pixbuf (the pixbuf currently on the display).
+ *
+ * If transitioning from a blank screen, this will return null.
+ */
+ public Gdk.Pixbuf? from_pixbuf { get; private set; }
+
+ /**
+ * Returns the position of the starting pixbuf on the display.
+ *
+ * If transitioning from a blank screen, this will be zeroed.
+ */
+ public Gdk.Rectangle from_pos { get; private set; }
+
+ /**
+ * Returns the ending pixbuf (the pixbuf that the transition should result in).
+ *
+ * If transitioning to a blank screen, this will return null.
+ */
+ public Gdk.Pixbuf? to_pixbuf { get; private set; }
+
+ /**
+ * Returns the position of the ending pixbuf on the display.
+ *
+ * If transitioning to a blank screen, this will be zeroed.
+ */
+ public Gdk.Rectangle to_pos { get; private set; }
+
+ /**
+ * Returns the background color of the viewport.
+ */
+ public Gdk.RGBA bg_color { get; private set; }
+
+ public Visuals(Gdk.Pixbuf? from_pixbuf, Gdk.Rectangle from_pos, Gdk.Pixbuf? to_pixbuf,
+ Gdk.Rectangle to_pos, Gdk.RGBA bg_color) {
+ this.from_pixbuf = from_pixbuf;
+ this.from_pos = from_pos;
+ this.to_pixbuf = to_pixbuf;
+ this.to_pos = to_pos;
+ this.bg_color = bg_color;
+ }
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * Motion contains all the pertinent information regarding the animation of the transition.
+ *
+ * Some of Motion's information may not apply to a transition effect (such as Direction for a
+ * fade effect).
+ */
+public class Motion : Object {
+ /**
+ * Returns the direction the transition should occur in (if pertinent to the {@link Effect}.
+ */
+ public Direction direction { get; private set; }
+
+ /**
+ * Returns the frames per second of the {@link Effect}.
+ */
+ public int fps { get; private set; }
+
+ /**
+ * Returns the amount of time the transition should take (in milliseconds).
+ */
+ public int duration_msec { get; private set; }
+
+ /**
+ * Returns the number of frames that should be required to perform the transition in the
+ * expected {@link duration_msec}.
+ */
+ public int total_frames {
+ get {
+ return (int) ((double) fps * ((double) duration_msec / 1000.0));
+ }
+ }
+
+ /**
+ * Returns the approximate time between each frame draw (in milliseconds).
+ */
+ public int tick_msec {
+ get {
+ return (int) (1000.0 / (double) fps);
+ }
+ }
+
+ public Motion(Direction direction, int fps, int duration_msec) {
+ this.direction = direction;
+ this.fps = fps;
+ this.duration_msec = duration_msec;
+ }
+
+ /**
+ * Returns a value from 0.0 to 1.0 that represents the percentage of the transition's completion
+ * for the specified frame.
+ */
+ public double get_alpha(int frame_number) {
+ return (double) frame_number / (double) total_frames;
+ }
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * A Descriptor offers a factory method for creating {@link Effect} instances.
+ */
+public interface Descriptor : Object, Spit.Pluggable {
+ /**
+ * Returns an instance of the {@link Effect} this descriptor represents.
+ */
+ public abstract Effect create(Spit.HostInterface host);
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+/**
+ * An Effect represents an interstitial effect that is used to transition the display from one
+ * image to another.
+ *
+ * An Effect must hold state so that it knows what it should be drawn at any call to {@link paint}
+ * (which is called regularly during a transition). That is, it should be able to draw any frame of
+ * the transition at any time. The same frame may need to be drawn multiple times, or the host
+ * may skip ahead and ask for a frame well ahead of the last requested one.
+ *
+ * ''Frame numbers are one-based throughout this interface''. This is because the initial state (the
+ * blank viewport or the starting pixbuf) is frame zero. The Effect is never called to paint this
+ * frame. The Effect is also not called to paint the final frame (a blank viewport or the ending
+ * pixbuf).
+ *
+ * If the Effect uses background threads for its work, it should use the appropriate primitives
+ * for critical sections. All calls to this interface will be from the context of the main UI
+ * thread. ''None of these calls should block.''
+ *
+ * If the Details object needs to be held by the Effect, its reference to it should be dropped at
+ * the end of the cycle (or shortly thereafter).
+ *
+ * An instance may be reused and should be prepared for restarts.
+ */
+public interface Effect : Object {
+ /**
+ * Returns frames per second (FPS) information for this effect.
+ *
+ * If the min_fps is not met, the Effect may be cancelled or the host will skip ahead.
+ *
+ * @param desired_fps The desired FPS of the transition. Return zero if no
+ * transition is to occur (instantaneous or null transition).
+ * @param min_fps The minimum FPS before the effect is consider "ruined".
+ * Return zero if any FPS is acceptable.
+ */
+ public abstract void get_fps(out int desired_fps, out int min_fps);
+
+ /**
+ * Called when the effect is starting.
+ *
+ * All state should be reset. The frame number, which is not supplied, is one.
+ */
+ public abstract void start(Visuals visuals, Motion motion);
+
+ /**
+ * Return true if the Effect needs the background cleared prior to calling {@link paint}.
+ */
+ public abstract bool needs_clear_background();
+
+ /**
+ * Called when the effect needs to paint (i.e. an expose or draw event has occurred).
+ *
+ * This call should ''not'' advance the state of the effect (i.e. it may be called more than
+ * once for the same frame).
+ *
+ * @param ctx The Cairo context the Effect should use to paint the transition.
+ * @param width The width (in pixels) of the Cairo surface.
+ * @param height The height (in pixels) of the Cairo surface.
+ * @param frame_number The ''one-based'' frame being drawn.
+ */
+ public abstract void paint(Visuals visuals, Motion motion, Cairo.Context ctx, int width,
+ int height, int frame_number);
+
+ /**
+ * Called to notify the effect that the state of the transition should advance to the specified
+ * frame number.
+ *
+ * Note: There is no guarantee frame numbers will be consecutive between calls
+ * to next, especially if the transition clock is attempting to catch up.
+ *
+ * @param frame_number The ''one-based'' frame being advanced to.
+ */
+ public abstract void advance(Visuals visuals, Motion motion, int frame_number);
+
+ /**
+ * Called if the Effect should halt the transition.
+ *
+ * It only needs to reset state if {@link start} is called again.
+ */
+ public abstract void cancel();
+
+ //
+ // For future expansion.
+ //
+ protected virtual void reserved0() {}
+ protected virtual void reserved1() {}
+ protected virtual void reserved2() {}
+ protected virtual void reserved3() {}
+ protected virtual void reserved4() {}
+ protected virtual void reserved5() {}
+ protected virtual void reserved6() {}
+ protected virtual void reserved7() {}
+}
+
+}
+
diff --git a/src/plugins/mk/interfaces.mk b/src/plugins/mk/interfaces.mk
new file mode 100644
index 0000000..34be1eb
--- /dev/null
+++ b/src/plugins/mk/interfaces.mk
@@ -0,0 +1,29 @@
+
+PLUGIN_INTERFACES := \
+ src/plugins/SpitInterfaces.vala \
+ src/plugins/TransitionsInterfaces.vala \
+ src/plugins/PublishingInterfaces.vala \
+ src/plugins/DataImportsInterfaces.vala
+
+PLUGIN_PKG_REQS := \
+ gobject-2.0 \
+ glib-2.0 \
+ gdk-3.0 \
+ gtk+-3.0 \
+ gee-0.8
+
+PLUGIN_VAPI := plugins/shotwell-plugin-dev-1.0.vapi
+PLUGIN_HEADER := $(PLUGIN_VAPI:.vapi=.h)
+PLUGIN_DEPS := $(PLUGIN_VAPI:.vapi=.deps)
+
+$(PLUGIN_DEPS): src/plugins/mk/interfaces.mk
+ rm -f $@
+ $(foreach pkg,$(PLUGIN_PKG_REQS),`echo $(pkg) >> $@`)
+
+$(PLUGIN_HEADER): $(PLUGIN_VAPI)
+
+$(PLUGIN_VAPI): $(PLUGIN_INTERFACES) src/plugins/mk/interfaces.mk
+ $(call check_valac_version)
+ $(VALAC) -c $(VALAFLAGS) -X -DGETTEXT_PACKAGE='"shotwell"' -X -I. $(foreach pkg,$(PLUGIN_PKG_REQS),--pkg=$(pkg)) --includedir=plugins --vapi=$@ --header=$(basename $@).h $(PLUGIN_INTERFACES)
+ $(foreach src,$(PLUGIN_INTERFACES),`rm $(notdir $(src)).o`)
+
diff --git a/src/plugins/mk/plugins.mk b/src/plugins/mk/plugins.mk
new file mode 100644
index 0000000..903dd8e
--- /dev/null
+++ b/src/plugins/mk/plugins.mk
@@ -0,0 +1,35 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Plugins
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := plugins
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ PublishingInterfaces.vala \
+ SpitInterfaces.vala \
+ TransitionsInterfaces.vala \
+ StandardHostInterface.vala \
+ ManifestWidget.vala \
+ DataImportsInterfaces.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Util
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC := \
+ mk/interfaces.mk
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/publishing/APIGlue.vala b/src/publishing/APIGlue.vala
new file mode 100644
index 0000000..f282c1f
--- /dev/null
+++ b/src/publishing/APIGlue.vala
@@ -0,0 +1,133 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+namespace Publishing.Glue {
+
+public class MediaSourcePublishableWrapper : Spit.Publishing.Publishable, GLib.Object {
+ private static int name_ticker = 0;
+
+ private MediaSource wrapped;
+ private GLib.File? serialized_file = null;
+ private Gee.Map<string, string> param_string = new Gee.HashMap<string, string>();
+
+ public MediaSourcePublishableWrapper(MediaSource to_wrap) {
+ wrapped = to_wrap;
+ setup_parameters();
+ }
+
+ public void clean_up() {
+ if (serialized_file == null)
+ return;
+
+ debug("cleaning up temporary publishing file '%s'.", serialized_file.get_path());
+
+ try {
+ serialized_file.delete(null);
+ } catch (Error err) {
+ warning("couldn't delete temporary publishing file '%s'.", serialized_file.get_path());
+ }
+
+ serialized_file = null;
+ }
+
+ private void setup_parameters() {
+ param_string.set(PARAM_STRING_BASENAME, wrapped.get_basename());
+ param_string.set(PARAM_STRING_TITLE, wrapped.get_title());
+ param_string.set(PARAM_STRING_COMMENT, wrapped.get_comment());
+
+ if (wrapped.get_event() != null)
+ param_string.set(PARAM_STRING_EVENTCOMMENT, wrapped.get_event().get_comment());
+ else
+ param_string.set(PARAM_STRING_EVENTCOMMENT, "");
+ }
+
+ public GLib.File serialize_for_publishing(int content_major_axis,
+ bool strip_metadata = false) throws Spit.Publishing.PublishingError {
+
+ if (wrapped is LibraryPhoto) {
+ LibraryPhoto photo = (LibraryPhoto) wrapped;
+
+ GLib.File to_file =
+ AppDirs.get_temp_dir().get_child("publishing-%d.jpg".printf(name_ticker++));
+
+ debug("writing photo '%s' to temporary file '%s' for publishing.",
+ photo.get_source_id(), to_file.get_path());
+ try {
+ Scaling scaling = (content_major_axis > 0) ?
+ Scaling.for_best_fit(content_major_axis, false) : Scaling.for_original();
+ photo.export(to_file, scaling, Jpeg.Quality.HIGH, PhotoFileFormat.JFIF, false, !strip_metadata);
+ } catch (Error err) {
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ "unable to serialize photo '%s' for publishing.", photo.get_name());
+ }
+
+ serialized_file = to_file;
+ } else if (wrapped is Video) {
+ Video video = (Video) wrapped;
+
+ string basename;
+ string extension;
+ disassemble_filename(video.get_file().get_basename(), out basename, out extension);
+
+ GLib.File to_file =
+ GLib.File.new_for_path("publishing-%d.%s".printf(name_ticker++, extension));
+
+ debug("writing video '%s' to temporary file '%s' for publishing.",
+ video.get_source_id(), to_file.get_path());
+ try {
+ video.export(to_file);
+ } catch (Error err) {
+ throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR(
+ "unable to serialize video '%s' for publishing.", video.get_name());
+ }
+
+ serialized_file = to_file;
+ } else {
+ error("MediaSourcePublishableWrapper.serialize_for_publishing( ): unknown media type.");
+ }
+
+ return serialized_file;
+ }
+
+ public string get_publishing_name() {
+ return wrapped.get_title() != null ? wrapped.get_title() : "";
+ }
+
+ public string? get_param_string(string name) {
+ return param_string.get(name);
+ }
+
+ public string[] get_publishing_keywords() {
+ string[] result = new string[0];
+
+ Gee.Collection<Tag>? tagset = Tag.global.fetch_sorted_for_source(wrapped);
+ if (tagset != null) {
+ foreach (Tag tag in tagset) {
+ result += tag.get_name();
+ }
+ }
+
+ return (result.length > 0) ? result : null;
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_media_type() {
+ if (wrapped is LibraryPhoto)
+ return Spit.Publishing.Publisher.MediaType.PHOTO;
+ else if (wrapped is Video)
+ return Spit.Publishing.Publisher.MediaType.VIDEO;
+ else
+ return Spit.Publishing.Publisher.MediaType.NONE;
+ }
+
+ public GLib.File? get_serialized_file() {
+ return serialized_file;
+ }
+
+ public GLib.DateTime get_exposure_date_time() {
+ return new GLib.DateTime.from_unix_local(wrapped.get_exposure_time());
+ }
+}
+
+}
diff --git a/src/publishing/Publishing.vala b/src/publishing/Publishing.vala
new file mode 100644
index 0000000..fb04eab
--- /dev/null
+++ b/src/publishing/Publishing.vala
@@ -0,0 +1,24 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Publishing {
+
+public void init() throws Error {
+ string[] core_ids = new string[0];
+ core_ids += "org.yorba.shotwell.publishing.facebook";
+ core_ids += "org.yorba.shotwell.publishing.picasa";
+ core_ids += "org.yorba.shotwell.publishing.flickr";
+ core_ids += "org.yorba.shotwell.publishing.youtube";
+
+ Plugins.register_extension_point(typeof(Spit.Publishing.Service), _("Publishing"),
+ Resources.PUBLISH, core_ids);
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/publishing/PublishingPluginHost.vala b/src/publishing/PublishingPluginHost.vala
new file mode 100644
index 0000000..1a5ed86
--- /dev/null
+++ b/src/publishing/PublishingPluginHost.vala
@@ -0,0 +1,238 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Spit.Publishing {
+
+public class ConcretePublishingHost : Plugins.StandardHostInterface,
+ Spit.Publishing.PluginHost {
+ private const string PREPARE_STATUS_DESCRIPTION = _("Preparing for upload");
+ private const string UPLOAD_STATUS_DESCRIPTION = _("Uploading %d of %d");
+ private const double STATUS_PREPARATION_FRACTION = 0.3;
+ private const double STATUS_UPLOAD_FRACTION = 0.7;
+
+ private weak PublishingUI.PublishingDialog dialog = null;
+ private Spit.Publishing.Publisher active_publisher = null;
+ private Publishable[] publishables = null;
+ private unowned LoginCallback current_login_callback = null;
+ private bool publishing_halted = false;
+ private Spit.Publishing.Publisher.MediaType media_type =
+ Spit.Publishing.Publisher.MediaType.NONE;
+
+ public ConcretePublishingHost(Service service, PublishingUI.PublishingDialog dialog,
+ Publishable[] publishables) {
+ base(service, "sharing");
+ this.dialog = dialog;
+ this.publishables = publishables;
+
+ foreach (Publishable curr_publishable in publishables)
+ this.media_type |= curr_publishable.get_media_type();
+
+ this.active_publisher = service.create_publisher(this);
+ }
+
+ private void on_login_clicked() {
+ if (current_login_callback != null)
+ current_login_callback();
+ }
+
+ private void clean_up() {
+ foreach (Publishable publishable in publishables)
+ ((global::Publishing.Glue.MediaSourcePublishableWrapper) publishable).clean_up();
+ }
+
+ private void report_plugin_upload_progress(int file_number, double fraction_complete) {
+ // if the currently installed pane isn't the progress pane, do nothing
+ if (!(dialog.get_active_pane() is PublishingUI.ProgressPane))
+ return;
+
+ PublishingUI.ProgressPane pane = (PublishingUI.ProgressPane) dialog.get_active_pane();
+
+ string status_string = UPLOAD_STATUS_DESCRIPTION.printf(file_number,
+ publishables.length);
+ double status_fraction = STATUS_PREPARATION_FRACTION + (STATUS_UPLOAD_FRACTION *
+ fraction_complete);
+
+ pane.set_status(status_string, status_fraction);
+ }
+
+ private void install_progress_pane() {
+ PublishingUI.ProgressPane progress_pane = new PublishingUI.ProgressPane();
+
+ dialog.install_pane(progress_pane);
+ set_button_mode(Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+ }
+
+ public void install_dialog_pane(Spit.Publishing.DialogPane pane,
+ Spit.Publishing.PluginHost.ButtonMode button_mode) {
+ debug("Publishing.PluginHost: install_dialog_pane( ): invoked.");
+
+ if (active_publisher == null || (!active_publisher.is_running()))
+ return;
+
+ dialog.install_pane(pane);
+
+ set_button_mode(button_mode);
+ }
+
+ public void post_error(Error err) {
+ string msg = _("Publishing to %s can't continue because an error occurred:").printf(
+ active_publisher.get_service().get_pluggable_name());
+ msg += GLib.Markup.printf_escaped("\n\n<i>%s</i>\n\n", err.message);
+ msg += _("To try publishing to another service, select one from the above menu.");
+
+ dialog.install_pane(new PublishingUI.StaticMessagePane(msg, true));
+ dialog.set_close_button_mode();
+ dialog.unlock_service();
+
+ active_publisher.stop();
+
+ // post_error( ) tells the active_publisher to stop publishing and displays a
+ // non-removable error pane that effectively ends the publishing interaction,
+ // so no problem calling clean_up( ) here.
+ clean_up();
+ }
+
+ public void stop_publishing() {
+ debug("ConcretePublishingHost.stop_publishing( ): invoked.");
+
+ if (active_publisher.is_running())
+ active_publisher.stop();
+
+ clean_up();
+
+ publishing_halted = true;
+ }
+
+ public void start_publishing() {
+ if (active_publisher.is_running())
+ return;
+
+ debug("ConcretePublishingHost.start_publishing( ): invoked.");
+
+ active_publisher.start();
+ }
+
+ public Publisher get_publisher() {
+ return active_publisher;
+ }
+
+ public void install_static_message_pane(string message,
+ Spit.Publishing.PluginHost.ButtonMode button_mode) {
+
+ set_button_mode(button_mode);
+
+ dialog.install_pane(new PublishingUI.StaticMessagePane(message));
+ }
+
+ public void install_pango_message_pane(string markup,
+ Spit.Publishing.PluginHost.ButtonMode button_mode) {
+ set_button_mode(button_mode);
+
+ dialog.install_pane(new PublishingUI.StaticMessagePane(markup, true));
+ }
+
+ public void install_success_pane() {
+ dialog.install_pane(new PublishingUI.SuccessPane(get_publishable_media_type(),
+ publishables.length));
+ dialog.set_close_button_mode();
+
+ // the success pane is a terminal pane; once it's installed, the publishing
+ // interaction is considered over, so clean up
+ clean_up();
+ }
+
+ public void install_account_fetch_wait_pane() {
+ dialog.install_pane(new PublishingUI.AccountFetchWaitPane());
+ set_button_mode(Spit.Publishing.PluginHost.ButtonMode.CANCEL);
+ }
+
+ public void install_login_wait_pane() {
+ dialog.install_pane(new PublishingUI.LoginWaitPane());
+ }
+
+ public void install_welcome_pane(string welcome_message, LoginCallback login_clicked_callback) {
+ PublishingUI.LoginWelcomePane login_pane =
+ new PublishingUI.LoginWelcomePane(welcome_message);
+ current_login_callback = login_clicked_callback;
+ login_pane.login_requested.connect(on_login_clicked);
+
+ set_button_mode(Spit.Publishing.PluginHost.ButtonMode.CLOSE);
+
+ dialog.install_pane(login_pane);
+ }
+
+ public void set_service_locked(bool locked) {
+ if (locked)
+ dialog.lock_service();
+ else
+ dialog.unlock_service();
+ }
+
+ public void set_button_mode(Spit.Publishing.PluginHost.ButtonMode mode) {
+ if (mode == Spit.Publishing.PluginHost.ButtonMode.CLOSE)
+ dialog.set_close_button_mode();
+ else if (mode == Spit.Publishing.PluginHost.ButtonMode.CANCEL)
+ dialog.set_cancel_button_mode();
+ else
+ error("unrecognized button mode enumeration value");
+ }
+
+ public void set_dialog_default_widget(Gtk.Widget widget) {
+ widget.can_default = true;
+ dialog.set_default(widget);
+ }
+
+ public Spit.Publishing.Publisher.MediaType get_publishable_media_type() {
+ return media_type;
+ }
+
+ public Publishable[] get_publishables() {
+ return publishables;
+ }
+
+ public Spit.Publishing.ProgressCallback? serialize_publishables(int content_major_axis,
+ bool strip_metadata = false) {
+ install_progress_pane();
+ PublishingUI.ProgressPane progress_pane =
+ (PublishingUI.ProgressPane) dialog.get_active_pane();
+
+ // spin the event loop right after installing the progress_pane so that the progress_pane
+ // will appear and let the user know that something is going on while file serialization
+ // takes place
+ spin_event_loop();
+
+ int i = 0;
+ foreach (Spit.Publishing.Publishable publishable in publishables) {
+ if (publishing_halted || !active_publisher.is_running())
+ return null;
+
+ try {
+ global::Publishing.Glue.MediaSourcePublishableWrapper wrapper =
+ (global::Publishing.Glue.MediaSourcePublishableWrapper) publishable;
+ wrapper.serialize_for_publishing(content_major_axis, strip_metadata);
+ } catch (Spit.Publishing.PublishingError err) {
+ post_error(err);
+ return null;
+ }
+
+ double phase_fraction_complete = ((double) (i + 1)) / ((double) publishables.length);
+ double fraction_complete = phase_fraction_complete * STATUS_PREPARATION_FRACTION;
+
+ debug("serialize_publishables( ): fraction_complete = %f.", fraction_complete);
+
+ progress_pane.set_status(PREPARE_STATUS_DESCRIPTION, fraction_complete);
+
+ spin_event_loop();
+
+ i++;
+ }
+
+ return report_plugin_upload_progress;
+ }
+}
+
+}
+
diff --git a/src/publishing/PublishingUI.vala b/src/publishing/PublishingUI.vala
new file mode 100644
index 0000000..4f63f55
--- /dev/null
+++ b/src/publishing/PublishingUI.vala
@@ -0,0 +1,552 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace PublishingUI {
+
+public class ConcreteDialogPane : Spit.Publishing.DialogPane, GLib.Object {
+ protected Gtk.Box pane_widget = null;
+ protected Gtk.Builder builder = null;
+
+ public ConcreteDialogPane() {
+ builder = AppWindow.create_builder();
+ }
+
+ public Gtk.Widget get_widget() {
+ return pane_widget;
+ }
+
+ public Spit.Publishing.DialogPane.GeometryOptions get_preferred_geometry() {
+ return Spit.Publishing.DialogPane.GeometryOptions.NONE;
+ }
+
+ public void on_pane_installed() {
+ }
+
+ public void on_pane_uninstalled() {
+ }
+}
+
+public class StaticMessagePane : ConcreteDialogPane {
+ private Gtk.Label msg_label = null;
+
+ public StaticMessagePane(string message_string, bool enable_markup = false) {
+ base();
+ msg_label = builder.get_object("static_msg_label") as Gtk.Label;
+ pane_widget = builder.get_object("static_msg_pane_widget") as Gtk.Box;
+
+ if (enable_markup) {
+ msg_label.set_markup(message_string);
+ msg_label.set_line_wrap(true);
+ msg_label.set_use_markup(true);
+ } else {
+ msg_label.set_label(message_string);
+ }
+ }
+}
+
+public class LoginWelcomePane : ConcreteDialogPane {
+ private Gtk.Button login_button = null;
+ private Gtk.Label not_logged_in_label = null;
+
+ public signal void login_requested();
+
+ public LoginWelcomePane(string service_welcome_message) {
+ base();
+ pane_widget = builder.get_object("welcome_pane_widget") as Gtk.Box;
+ login_button = builder.get_object("login_button") as Gtk.Button;
+ not_logged_in_label = builder.get_object("not_logged_in_label") as Gtk.Label;
+
+ login_button.clicked.connect(on_login_clicked);
+ not_logged_in_label.set_use_markup(true);
+ not_logged_in_label.set_markup(service_welcome_message);
+ }
+
+ private void on_login_clicked() {
+ login_requested();
+ }
+}
+
+public class ProgressPane : ConcreteDialogPane {
+ private Gtk.ProgressBar progress_bar = null;
+
+ public ProgressPane() {
+ base();
+ pane_widget = (Gtk.Box) builder.get_object("progress_pane_widget");
+ progress_bar = (Gtk.ProgressBar) builder.get_object("publishing_progress_bar");
+ }
+
+ public void set_text(string text) {
+ progress_bar.set_text(text);
+ }
+
+ public void set_progress(double progress) {
+ progress_bar.set_fraction(progress);
+ }
+
+ public void set_status(string status_text, double progress) {
+ if (status_text != progress_bar.get_text())
+ progress_bar.set_text(status_text);
+
+ set_progress(progress);
+ }
+}
+
+public class SuccessPane : StaticMessagePane {
+ public SuccessPane(Spit.Publishing.Publisher.MediaType published_media, int num_uploaded = 1) {
+ string? message_string = null;
+
+ // Here, we check whether more than one item is being uploaded, and if so, display
+ // an alternate message.
+ if(num_uploaded > 1) {
+ if (published_media == (Spit.Publishing.Publisher.MediaType.PHOTO | Spit.Publishing.Publisher.MediaType.VIDEO))
+ message_string = _("The selected photos/videos were successfully published.");
+ else if (published_media == Spit.Publishing.Publisher.MediaType.VIDEO)
+ message_string = _("The selected videos were successfully published.");
+ else
+ message_string = _("The selected photos were successfully published.");
+ } else {
+ if (published_media == Spit.Publishing.Publisher.MediaType.VIDEO)
+ message_string = _("The selected video was successfully published.");
+ else
+ message_string = _("The selected photo was successfully published.");
+ }
+ base(message_string);
+ }
+}
+
+public class AccountFetchWaitPane : StaticMessagePane {
+ public AccountFetchWaitPane() {
+ base(_("Fetching account information..."));
+ }
+}
+
+public class LoginWaitPane : StaticMessagePane {
+ public LoginWaitPane() {
+ base(_("Logging in..."));
+ }
+}
+
+public class PublishingDialog : Gtk.Dialog {
+ private const int LARGE_WINDOW_WIDTH = 860;
+ private const int LARGE_WINDOW_HEIGHT = 688;
+ private const int COLOSSAL_WINDOW_WIDTH = 1024;
+ private const int COLOSSAL_WINDOW_HEIGHT = 688;
+ private const int STANDARD_WINDOW_WIDTH = 632;
+ private const int STANDARD_WINDOW_HEIGHT = 540;
+ private const int BORDER_REGION_WIDTH = 16;
+ private const int BORDER_REGION_HEIGHT = 100;
+
+ public const int STANDARD_CONTENT_LABEL_WIDTH = 500;
+ public const int STANDARD_ACTION_BUTTON_WIDTH = 128;
+
+ private static PublishingDialog active_instance = null;
+
+ private Gtk.ListStore service_selector_box_model;
+ private Gtk.ComboBox service_selector_box;
+ private Gtk.Label service_selector_box_label;
+ private Gtk.Box central_area_layouter;
+ private Gtk.Button close_cancel_button;
+ private Spit.Publishing.DialogPane active_pane;
+ private Spit.Publishing.Publishable[] publishables;
+ private Spit.Publishing.ConcretePublishingHost host;
+ private Spit.PluggableInfo info;
+
+ protected PublishingDialog(Gee.Collection<MediaSource> to_publish) {
+ assert(to_publish.size > 0);
+
+ resizable = false;
+ delete_event.connect(on_window_close);
+
+ publishables = new Spit.Publishing.Publishable[0];
+ bool has_photos = false;
+ bool has_videos = false;
+ foreach (MediaSource media in to_publish) {
+ Spit.Publishing.Publishable publishable =
+ new Publishing.Glue.MediaSourcePublishableWrapper(media);
+ if (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.PHOTO)
+ has_photos = true;
+ else if (publishable.get_media_type() == Spit.Publishing.Publisher.MediaType.VIDEO)
+ has_videos = true;
+ else
+ assert_not_reached();
+
+ publishables += publishable;
+ }
+
+ string title = null;
+ string label = null;
+
+ if (has_photos && !has_videos) {
+ title = null;_("Publish Photos");
+ label = _("Publish photos _to:");
+ } else if (!has_photos && has_videos) {
+ title = _("Publish Videos");
+ label = _("Publish videos _to");
+ } else {
+ title = _("Publish Photos and Videos");
+ label = _("Publish photos and videos _to");
+ }
+ set_title(title);
+
+ service_selector_box_model = new Gtk.ListStore(2, typeof(Gdk.Pixbuf), typeof(string));
+ service_selector_box = new Gtk.ComboBox.with_model(service_selector_box_model);
+
+ Gtk.CellRendererPixbuf renderer_pix = new Gtk.CellRendererPixbuf();
+ service_selector_box.pack_start(renderer_pix,true);
+ service_selector_box.add_attribute(renderer_pix, "pixbuf", 0);
+
+ Gtk.CellRendererText renderer_text = new Gtk.CellRendererText();
+ service_selector_box.pack_start(renderer_text,true);
+ service_selector_box.add_attribute(renderer_text, "text", 1);
+
+ service_selector_box.set_active(0);
+
+ service_selector_box_label = new Gtk.Label.with_mnemonic(label);
+ service_selector_box_label.set_mnemonic_widget(service_selector_box);
+ service_selector_box_label.set_alignment(0.0f, 0.5f);
+
+ // get the name of the service the user last used
+ string? last_used_service = Config.Facade.get_instance().get_last_used_service();
+
+ Spit.Publishing.Service[] loaded_services = load_services(has_photos, has_videos);
+
+ Gtk.TreeIter iter;
+
+ foreach (Spit.Publishing.Service service in loaded_services) {
+ service_selector_box_model.append(out iter);
+
+ string curr_service_id = service.get_id();
+
+ service.get_info(ref info);
+
+ if (null != info.icons && 0 < info.icons.length) {
+ // check if the icons object is set -- if set use that icon
+ service_selector_box_model.set(iter, 0, info.icons[0], 1,
+ service.get_pluggable_name());
+
+ // in case the icons object is not set on the next iteration
+ info.icons[0] = Resources.get_icon(Resources.ICON_GENERIC_PLUGIN);
+ } else {
+ // if icons object is null or zero length use a generic icon
+ service_selector_box_model.set(iter, 0, Resources.get_icon(
+ Resources.ICON_GENERIC_PLUGIN), 1, service.get_pluggable_name());
+ }
+
+ if (last_used_service == null) {
+ service_selector_box.set_active_iter(iter);
+ last_used_service = service.get_id();
+ } else if (last_used_service == curr_service_id) {
+ service_selector_box.set_active_iter(iter);
+ }
+ }
+
+ service_selector_box.changed.connect(on_service_changed);
+
+ /* the wrapper is not an extraneous widget -- it's necessary to prevent the service
+ selection box from growing and shrinking whenever its parent's size changes.
+ When wrapped inside a Gtk.Alignment, the Alignment grows and shrinks instead of
+ the service selection box. */
+ Gtk.Alignment service_selector_box_wrapper = new Gtk.Alignment(1.0f, 0.5f, 0.0f, 0.0f);
+ service_selector_box_wrapper.add(service_selector_box);
+
+ Gtk.Box service_selector_layouter = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ service_selector_layouter.set_border_width(12);
+ service_selector_layouter.add(service_selector_box_label);
+ service_selector_layouter.pack_start(service_selector_box_wrapper, true, true, 0);
+
+ /* 'service area' is the selector assembly plus the horizontal rule dividing it from the
+ rest of the dialog */
+ Gtk.Box service_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ service_area_layouter.add(service_selector_layouter);
+ service_area_layouter.add(new Gtk.Separator(Gtk.Orientation.HORIZONTAL));
+
+ Gtk.Alignment service_area_wrapper = new Gtk.Alignment(0.0f, 0.0f, 1.0f, 0.0f);
+ service_area_wrapper.add(service_area_layouter);
+
+ central_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+
+ get_content_area().pack_start(service_area_wrapper, false, false, 0);
+ get_content_area().pack_start(central_area_layouter, true, true, 0);
+
+ close_cancel_button = new Gtk.Button.with_mnemonic("_Cancel");
+ close_cancel_button.set_can_default(true);
+ close_cancel_button.clicked.connect(on_close_cancel_clicked);
+ ((Gtk.Container) get_action_area()).add(close_cancel_button);
+
+ set_standard_window_mode();
+
+ show_all();
+ }
+
+ private static Spit.Publishing.Service[] load_all_services() {
+ Spit.Publishing.Service[] loaded_services = new Spit.Publishing.Service[0];
+
+ // load publishing services from plug-ins
+ Gee.Collection<Spit.Pluggable> pluggables = Plugins.get_pluggables_for_type(
+ typeof(Spit.Publishing.Service));
+
+ debug("PublisingDialog: discovered %d pluggable publishing services.", pluggables.size);
+
+ foreach (Spit.Pluggable pluggable in pluggables) {
+ int pluggable_interface = pluggable.get_pluggable_interface(
+ Spit.Publishing.CURRENT_INTERFACE, Spit.Publishing.CURRENT_INTERFACE);
+ if (pluggable_interface != Spit.Publishing.CURRENT_INTERFACE) {
+ warning("Unable to load publisher %s: reported interface %d.",
+ Plugins.get_pluggable_module_id(pluggable), pluggable_interface);
+
+ continue;
+ }
+
+ Spit.Publishing.Service service =
+ (Spit.Publishing.Service) pluggable;
+
+ debug("PublishingDialog: discovered pluggable publishing service '%s'.",
+ service.get_pluggable_name());
+
+ loaded_services += service;
+ }
+
+ // Sort publishing services by name.
+ Posix.qsort(loaded_services, loaded_services.length, sizeof(Spit.Publishing.Service),
+ (a, b) => {return utf8_cs_compare((*((Spit.Publishing.Service**) a))->get_pluggable_name(),
+ (*((Spit.Publishing.Service**) b))->get_pluggable_name());
+ });
+
+ return loaded_services;
+ }
+
+ private static Spit.Publishing.Service[] load_services(bool has_photos, bool has_videos) {
+ assert (has_photos || has_videos);
+
+ Spit.Publishing.Service[] filtered_services = new Spit.Publishing.Service[0];
+ Spit.Publishing.Service[] all_services = load_all_services();
+
+ foreach (Spit.Publishing.Service service in all_services) {
+
+ if (has_photos && !has_videos) {
+ if ((service.get_supported_media() & Spit.Publishing.Publisher.MediaType.PHOTO) != 0)
+ filtered_services += service;
+ } else if (!has_photos && has_videos) {
+ if ((service.get_supported_media() & Spit.Publishing.Publisher.MediaType.VIDEO) != 0)
+ filtered_services += service;
+ } else {
+ if (((service.get_supported_media() & Spit.Publishing.Publisher.MediaType.PHOTO) != 0) &&
+ ((service.get_supported_media() & Spit.Publishing.Publisher.MediaType.VIDEO) != 0))
+ filtered_services += service;
+ }
+ }
+
+ return filtered_services;
+ }
+
+ // Because of this bug: http://trac.yorba.org/ticket/3623, we use some extreme measures. The
+ // bug occurs because, in some cases, when publishing is started asynchronous network
+ // transactions are performed. The mechanism inside libsoup that we use to perform asynchronous
+ // network transactions isn't based on threads but is instead based on the GLib event loop. So
+ // whenever we run a network transaction, the GLib event loop gets spun. One consequence of
+ // this is that PublishingDialog.go( ) can be called multiple times. Note that since events
+ // are processed sequentially, PublishingDialog.go( ) is never called re-entrantly. It just
+ // gets called twice back-to-back in quick succession. So use a timer to do a short circuit
+ // return if this call to go( ) follows immediately on the heels of another call to go( ).
+ private static Timer since_last_start = null;
+ private static bool elapsed_is_valid = false;
+ public static void go(Gee.Collection<MediaSource> to_publish) {
+ if (active_instance != null)
+ return;
+
+ if (since_last_start == null) {
+ // GLib.Timers start themselves automatically when they're created, so stop our
+ // new timer and reset it to zero 'til were ready to start timing.
+ since_last_start = new Timer();
+ since_last_start.stop();
+ since_last_start.reset();
+ elapsed_is_valid = false;
+ } else {
+ double elapsed = since_last_start.elapsed();
+ if ((elapsed < 0.05) && (elapsed_is_valid))
+ return;
+ }
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media(to_publish, photos, videos);
+
+ Spit.Publishing.Service[] avail_services =
+ load_services((photos.size > 0), (videos.size > 0));
+
+ if (avail_services.length == 0) {
+ // There are no enabled publishing services that accept this media type,
+ // warn the user.
+ AppWindow.error_message_with_title(_("Unable to publish"),
+ _("Shotwell cannot publish the selected items because you do not have a compatible publishing plugin enabled. To correct this, choose <b>Edit %s Preferences</b> and enable one or more of the publishing plugins on the <b>Plugins</b> tab.").printf("▸"),
+ null, false);
+
+ return;
+ }
+
+ // If we get down here, it means that at least one publishing service
+ // was found that could accept this type of media, so continue normally.
+
+ debug("PublishingDialog.go( )");
+
+ active_instance = new PublishingDialog(to_publish);
+
+ active_instance.run();
+
+ active_instance = null;
+
+ // start timing just before we return
+ since_last_start.start();
+ elapsed_is_valid = true;
+ }
+
+ private bool on_window_close(Gdk.EventAny evt) {
+ host.stop_publishing();
+ host = null;
+ hide();
+ destroy();
+
+ return true;
+ }
+
+ private void on_service_changed() {
+ Gtk.TreeIter iter;
+ bool have_active_iter = false;
+ have_active_iter = service_selector_box.get_active_iter(out iter);
+
+ // this occurs when the user removes the last active publisher
+ if (!have_active_iter) {
+ // default to the first in the list (as good as any)
+ service_selector_box.set_active(0);
+
+ // and get active again
+ service_selector_box.get_active_iter(out iter);
+ }
+
+ Value service_name_val;
+ service_selector_box_model.get_value(iter, 1, out service_name_val);
+
+ string service_name = (string) service_name_val;
+
+ Spit.Publishing.Service? selected_service = null;
+ Spit.Publishing.Service[] services = load_all_services();
+ foreach (Spit.Publishing.Service service in services) {
+ if (service.get_pluggable_name() == service_name) {
+ selected_service = service;
+ break;
+ }
+ }
+ assert(selected_service != null);
+
+ Config.Facade.get_instance().set_last_used_service(selected_service.get_id());
+
+ host = new Spit.Publishing.ConcretePublishingHost(selected_service, this, publishables);
+ host.start_publishing();
+ }
+
+ private void on_close_cancel_clicked() {
+ debug("PublishingDialog: on_close_cancel_clicked( ): invoked.");
+
+ host.stop_publishing();
+ host = null;
+ hide();
+ destroy();
+ }
+
+ private void set_large_window_mode() {
+ set_size_request(LARGE_WINDOW_WIDTH, LARGE_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(LARGE_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ LARGE_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_colossal_window_mode() {
+ set_size_request(COLOSSAL_WINDOW_WIDTH, COLOSSAL_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(COLOSSAL_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ COLOSSAL_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_standard_window_mode() {
+ set_size_request(STANDARD_WINDOW_WIDTH, STANDARD_WINDOW_HEIGHT);
+ central_area_layouter.set_size_request(STANDARD_WINDOW_WIDTH - BORDER_REGION_WIDTH,
+ STANDARD_WINDOW_HEIGHT - BORDER_REGION_HEIGHT);
+ resizable = false;
+ }
+
+ private void set_free_sizable_window_mode() {
+ resizable = true;
+ }
+
+ private void clear_free_sizable_window_mode() {
+ resizable = false;
+ }
+
+ public Spit.Publishing.DialogPane get_active_pane() {
+ return active_pane;
+ }
+
+ public void set_close_button_mode() {
+ close_cancel_button.set_label(_("_Close"));
+ set_default(close_cancel_button);
+ }
+
+ public void set_cancel_button_mode() {
+ close_cancel_button.set_label(_("_Cancel"));
+ }
+
+ public void lock_service() {
+ service_selector_box.set_sensitive(false);
+ }
+
+ public void unlock_service() {
+ service_selector_box.set_sensitive(true);
+ }
+
+ public void install_pane(Spit.Publishing.DialogPane pane) {
+ debug("PublishingDialog: install_pane( ): invoked.");
+
+ if (active_pane != null) {
+ debug("PublishingDialog: install_pane( ): a pane is already installed; removing it.");
+
+ active_pane.on_pane_uninstalled();
+ central_area_layouter.remove(active_pane.get_widget());
+ }
+
+ central_area_layouter.pack_start(pane.get_widget(), true, true, 0);
+ show_all();
+
+ Spit.Publishing.DialogPane.GeometryOptions geometry_options =
+ pane.get_preferred_geometry();
+ if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.EXTENDED_SIZE) != 0)
+ set_large_window_mode();
+ else if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.COLOSSAL_SIZE) != 0)
+ set_colossal_window_mode();
+ else
+ set_standard_window_mode();
+
+ if ((geometry_options & Spit.Publishing.DialogPane.GeometryOptions.RESIZABLE) != 0)
+ set_free_sizable_window_mode();
+ else
+ clear_free_sizable_window_mode();
+
+ active_pane = pane;
+ pane.on_pane_installed();
+ }
+
+ public new int run() {
+ on_service_changed();
+
+ int result = base.run();
+
+ host = null;
+
+ return result;
+ }
+}
+
+}
+
diff --git a/src/publishing/mk/publishing.mk b/src/publishing/mk/publishing.mk
new file mode 100644
index 0000000..fd31b81
--- /dev/null
+++ b/src/publishing/mk/publishing.mk
@@ -0,0 +1,31 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Publishing
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := publishing
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ PublishingUI.vala \
+ PublishingPluginHost.vala \
+ APIGlue.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Plugins
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/searches/Branch.vala b/src/searches/Branch.vala
new file mode 100644
index 0000000..229c710
--- /dev/null
+++ b/src/searches/Branch.vala
@@ -0,0 +1,150 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class Searches.Branch : Sidebar.Branch {
+ private Gee.HashMap<SavedSearch, Searches.SidebarEntry> entry_map =
+ new Gee.HashMap<SavedSearch, Searches.SidebarEntry>();
+
+ public Branch() {
+ base (new Searches.Grouping(),
+ Sidebar.Branch.Options.HIDE_IF_EMPTY
+ | Sidebar.Branch.Options.AUTO_OPEN_ON_NEW_CHILD
+ | Sidebar.Branch.Options.STARTUP_EXPAND_TO_FIRST_CHILD,
+ comparator);
+
+ // seed the branch with existing searches
+ foreach (SavedSearch search in SavedSearchTable.get_instance().get_all())
+ on_saved_search_added(search);
+
+ // monitor collection for future events
+ SavedSearchTable.get_instance().search_added.connect(on_saved_search_added);
+ SavedSearchTable.get_instance().search_removed.connect(on_saved_search_removed);
+ }
+
+ ~Branch() {
+ SavedSearchTable.get_instance().search_added.disconnect(on_saved_search_added);
+ SavedSearchTable.get_instance().search_removed.disconnect(on_saved_search_removed);
+ }
+
+ public Searches.SidebarEntry? get_entry_for_saved_search(SavedSearch search) {
+ return entry_map.get(search);
+ }
+
+ private static int comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ return SavedSearch.compare_names(((Searches.SidebarEntry) a).for_saved_search(),
+ ((Searches.SidebarEntry) b).for_saved_search());
+ }
+
+ private void on_saved_search_added(SavedSearch search) {
+ debug("search added");
+ Searches.SidebarEntry entry = new Searches.SidebarEntry(search);
+ entry_map.set(search, entry);
+ graft(get_root(), entry);
+ }
+
+ private void on_saved_search_removed(SavedSearch search) {
+ debug("search removed");
+ Searches.SidebarEntry? entry = entry_map.get(search);
+ assert(entry != null);
+
+ bool is_removed = entry_map.unset(search);
+ assert(is_removed);
+
+ prune(entry);
+ }
+}
+
+public class Searches.Grouping : Sidebar.Grouping, Sidebar.Contextable {
+ private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.Menu? context_menu = null;
+
+ public Grouping() {
+ base (_("Saved Searches"), new ThemedIcon(Gtk.Stock.FIND));
+ setup_context_menu();
+ }
+
+ private void setup_context_menu() {
+ Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
+ new_search.label = _("Ne_w Saved Search...");
+ actions += new_search;
+
+ group.add_actions(actions, this);
+ ui.insert_action_group(group, 0);
+
+ File ui_file = Resources.get_ui("search_sidebar_context.ui");
+ try {
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ AppWindow.error_message("Error loading UI file %s: %s".printf(
+ ui_file.get_path(), err.message));
+ Application.get_instance().panic();
+ }
+ context_menu = (Gtk.Menu) ui.get_widget("/SidebarSearchContextMenu");
+
+ ui.ensure_update();
+ }
+
+ public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
+ return context_menu;
+ }
+
+ private void on_new_search() {
+ (new SavedSearchDialog()).show();
+ }
+}
+
+public class Searches.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
+ Sidebar.DestroyableEntry {
+ private static Icon single_search_icon;
+
+ private SavedSearch search;
+
+ public SidebarEntry(SavedSearch search) {
+ this.search = search;
+ }
+
+ internal static void init() {
+ single_search_icon = new ThemedIcon(Gtk.Stock.FIND);
+ }
+
+ internal static void terminate() {
+ single_search_icon = null;
+ }
+
+ public SavedSearch for_saved_search() {
+ return search;
+ }
+
+ public override string get_sidebar_name() {
+ return search.get_name();
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return single_search_icon;
+ }
+
+ protected override Page create_page() {
+ return new SavedSearchPage(search);
+ }
+
+ public void rename(string new_name) {
+ if (!SavedSearchTable.get_instance().exists(new_name))
+ AppWindow.get_command_manager().execute(new RenameSavedSearchCommand(search, new_name));
+ else if (new_name != search.get_name())
+ AppWindow.error_message(Resources.rename_search_exists_message(new_name));
+ }
+
+ public void destroy_source() {
+ if (Dialogs.confirm_delete_saved_search(search))
+ AppWindow.get_command_manager().execute(new DeleteSavedSearchCommand(search));
+ }
+}
diff --git a/src/searches/SavedSearchDialog.vala b/src/searches/SavedSearchDialog.vala
new file mode 100644
index 0000000..b425cfb
--- /dev/null
+++ b/src/searches/SavedSearchDialog.vala
@@ -0,0 +1,829 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// This dialog displays a boolean search configuration.
+public class SavedSearchDialog {
+
+ // Conatins a search row, with a type selector and remove button.
+ private class SearchRowContainer {
+ public signal void remove(SearchRowContainer this_row);
+ public signal void changed(SearchRowContainer this_row);
+
+ private Gtk.ComboBoxText type_combo;
+ private Gtk.Box box;
+ private Gtk.Alignment align;
+ private Gtk.Button remove_button;
+ private SearchCondition.SearchType[] search_types;
+ private Gee.HashMap<SearchCondition.SearchType, int> search_types_index;
+
+ private SearchRow? my_row = null;
+
+ public SearchRowContainer() {
+ setup_gui();
+ set_type(SearchCondition.SearchType.ANY_TEXT);
+ }
+
+ public SearchRowContainer.edit_existing(SearchCondition sc) {
+ setup_gui();
+ set_type(sc.search_type);
+ set_type_combo_box(sc.search_type);
+ my_row.populate(sc);
+ }
+
+ // Creates the GUI for this row.
+ private void setup_gui() {
+ search_types = SearchCondition.SearchType.as_array();
+ search_types_index = new Gee.HashMap<SearchCondition.SearchType, int>();
+ SearchCondition.SearchType.sort_array(ref search_types);
+
+ type_combo = new Gtk.ComboBoxText();
+ for (int i = 0; i < search_types.length; i++) {
+ SearchCondition.SearchType st = search_types[i];
+ search_types_index.set(st, i);
+ type_combo.append_text(st.display_text());
+ }
+ set_type_combo_box(SearchCondition.SearchType.ANY_TEXT); // Sets default.
+ type_combo.changed.connect(on_type_changed);
+
+ remove_button = new Gtk.Button();
+ remove_button.set_label(" – ");
+ remove_button.button_press_event.connect(on_removed);
+
+ align = new Gtk.Alignment(0,0,0,0);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(type_combo, false, false, 0);
+ box.pack_start(align, false, false, 0);
+ box.pack_start(new Gtk.Alignment(0,0,0,0), true, true, 0); // Fill space.
+ box.pack_start(remove_button, false, false, 0);
+ box.show_all();
+ }
+
+ private void on_type_changed() {
+ set_type(get_search_type());
+ changed(this);
+ }
+
+ private void set_type_combo_box(SearchCondition.SearchType st) {
+ type_combo.set_active(search_types_index.get(st));
+ }
+
+ private void set_type(SearchCondition.SearchType type) {
+ if (my_row != null)
+ align.remove(my_row.get_widget());
+
+ switch (type) {
+ case SearchCondition.SearchType.ANY_TEXT:
+ case SearchCondition.SearchType.EVENT_NAME:
+ case SearchCondition.SearchType.FILE_NAME:
+ case SearchCondition.SearchType.TAG:
+ case SearchCondition.SearchType.COMMENT:
+ case SearchCondition.SearchType.TITLE:
+ my_row = new SearchRowText(this);
+ break;
+
+ case SearchCondition.SearchType.MEDIA_TYPE:
+ my_row = new SearchRowMediaType(this);
+ break;
+
+ case SearchCondition.SearchType.FLAG_STATE:
+ my_row = new SearchRowFlagged(this);
+ break;
+
+ case SearchCondition.SearchType.MODIFIED_STATE:
+ my_row = new SearchRowModified(this);
+ break;
+
+ case SearchCondition.SearchType.RATING:
+ my_row = new SearchRowRating(this);
+ break;
+
+ case SearchCondition.SearchType.DATE:
+ my_row = new SearchRowDate(this);
+ break;
+
+ default:
+ assert(false);
+ break;
+ }
+
+ align.add(my_row.get_widget());
+ }
+
+ public SearchCondition.SearchType get_search_type() {
+ return search_types[type_combo.get_active()];
+ }
+
+ private bool on_removed(Gdk.EventButton event) {
+ remove(this);
+ return false;
+ }
+
+ public void allow_removal(bool allow) {
+ remove_button.sensitive = allow;
+ }
+
+ public Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public SearchCondition get_search_condition() {
+ return my_row.get_search_condition();
+ }
+
+ public bool is_complete() {
+ return my_row.is_complete();
+ }
+ }
+
+ // Represents a row-type.
+ private abstract class SearchRow {
+ // Returns the GUI widget for this row.
+ public abstract Gtk.Widget get_widget();
+
+ // Returns the search condition for this row.
+ public abstract SearchCondition get_search_condition();
+
+ // Fills out the fields in this row based on an existing search condition (for edit mode.)
+ public abstract void populate(SearchCondition sc);
+
+ // Returns true if the row is valid and complete.
+ public abstract bool is_complete();
+ }
+
+ private class SearchRowText : SearchRow {
+ private Gtk.Box box;
+ private Gtk.ComboBoxText text_context;
+ private Gtk.Entry entry;
+
+ private SearchRowContainer parent;
+
+ public SearchRowText(SearchRowContainer parent) {
+ this.parent = parent;
+
+ // Ordering must correspond with SearchConditionText.Context
+ text_context = new Gtk.ComboBoxText();
+ text_context.append_text(_("contains"));
+ text_context.append_text(_("is exactly"));
+ text_context.append_text(_("starts with"));
+ text_context.append_text(_("ends with"));
+ text_context.append_text(_("does not contain"));
+ text_context.append_text(_("is not set"));
+ text_context.set_active(0);
+ text_context.changed.connect(on_changed);
+
+ entry = new Gtk.Entry();
+ entry.set_width_chars(25);
+ entry.set_activates_default(true);
+ entry.changed.connect(on_changed);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(text_context, false, false, 0);
+ box.pack_start(entry, false, false, 0);
+ box.show_all();
+ }
+
+ ~SearchRowText() {
+ text_context.changed.disconnect(on_changed);
+ entry.changed.disconnect(on_changed);
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType type = parent.get_search_type();
+ string text = entry.get_text();
+ SearchConditionText.Context context = get_text_context();
+ SearchConditionText c = new SearchConditionText(type, text, context);
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionText? text = sc as SearchConditionText;
+ assert(text != null);
+ text_context.set_active(text.context);
+ entry.set_text(text.text);
+ on_changed();
+ }
+
+ public override bool is_complete() {
+ return entry.text.chomp() != "" || get_text_context() == SearchConditionText.Context.IS_NOT_SET;
+ }
+
+ private SearchConditionText.Context get_text_context() {
+ return (SearchConditionText.Context) text_context.get_active();
+ }
+
+ private void on_changed() {
+ if (get_text_context() == SearchConditionText.Context.IS_NOT_SET) {
+ entry.hide();
+ } else {
+ entry.show();
+ }
+
+ parent.changed(parent);
+ }
+ }
+
+ private class SearchRowMediaType : SearchRow {
+ private Gtk.Box box;
+ private Gtk.ComboBoxText media_context;
+ private Gtk.ComboBoxText media_type;
+
+ private SearchRowContainer parent;
+
+ public SearchRowMediaType(SearchRowContainer parent) {
+ this.parent = parent;
+
+ // Ordering must correspond with SearchConditionMediaType.Context
+ media_context = new Gtk.ComboBoxText();
+ media_context.append_text(_("is"));
+ media_context.append_text(_("is not"));
+ media_context.set_active(0);
+ media_context.changed.connect(on_changed);
+
+ // Ordering must correspond with SearchConditionMediaType.MediaType
+ media_type = new Gtk.ComboBoxText();
+ media_type.append_text(_("any photo"));
+ media_type.append_text(_("a raw photo"));
+ media_type.append_text(_("a video"));
+ media_type.set_active(0);
+ media_type.changed.connect(on_changed);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(media_context, false, false, 0);
+ box.pack_start(media_type, false, false, 0);
+ box.show_all();
+ }
+
+ ~SearchRowMediaType() {
+ media_context.changed.disconnect(on_changed);
+ media_type.changed.disconnect(on_changed);
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType search_type = parent.get_search_type();
+ SearchConditionMediaType.Context context = (SearchConditionMediaType.Context) media_context.get_active();
+ SearchConditionMediaType.MediaType type = (SearchConditionMediaType.MediaType) media_type.get_active();
+ SearchConditionMediaType c = new SearchConditionMediaType(search_type, context, type);
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionMediaType? media = sc as SearchConditionMediaType;
+ assert(media != null);
+ media_context.set_active(media.context);
+ media_type.set_active(media.media_type);
+ }
+
+ public override bool is_complete() {
+ return true;
+ }
+
+ private void on_changed() {
+ parent.changed(parent);
+ }
+ }
+
+ private class SearchRowModified : SearchRow {
+ private Gtk.Box box;
+ private Gtk.ComboBoxText modified_context;
+ private Gtk.ComboBoxText modified_state;
+
+ private SearchRowContainer parent;
+
+ public SearchRowModified(SearchRowContainer parent) {
+ this.parent = parent;
+
+ modified_context = new Gtk.ComboBoxText();
+ modified_context.append_text(_("has"));
+ modified_context.append_text(_("has no"));
+ modified_context.set_active(0);
+ modified_context.changed.connect(on_changed);
+
+ modified_state = new Gtk.ComboBoxText();
+ modified_state.append_text(_("modifications"));
+ modified_state.append_text(_("internal modifications"));
+ modified_state.append_text(_("external modifications"));
+ modified_state.set_active(0);
+ modified_state.changed.connect(on_changed);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(modified_context, false, false, 0);
+ box.pack_start(modified_state, false, false, 0);
+ box.show_all();
+ }
+
+ ~SearchRowModified() {
+ modified_state.changed.disconnect(on_changed);
+ modified_context.changed.disconnect(on_changed);
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType search_type = parent.get_search_type();
+ SearchConditionModified.Context context = (SearchConditionModified.Context) modified_context.get_active();
+ SearchConditionModified.State state = (SearchConditionModified.State) modified_state.get_active();
+ SearchConditionModified c = new SearchConditionModified(search_type, context, state);
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionModified? scm = sc as SearchConditionModified;
+ assert(scm != null);
+ modified_state.set_active(scm.state);
+ modified_context.set_active(scm.context);
+ }
+
+ public override bool is_complete() {
+ return true;
+ }
+
+ private void on_changed() {
+ parent.changed(parent);
+ }
+ }
+
+ private class SearchRowFlagged : SearchRow {
+ private Gtk.Box box;
+ private Gtk.ComboBoxText flagged_state;
+
+ private SearchRowContainer parent;
+
+ public SearchRowFlagged(SearchRowContainer parent) {
+ this.parent = parent;
+
+ // Ordering must correspond with SearchConditionFlagged.State
+ flagged_state = new Gtk.ComboBoxText();
+ flagged_state.append_text(_("flagged"));
+ flagged_state.append_text(_("not flagged"));
+ flagged_state.set_active(0);
+ flagged_state.changed.connect(on_changed);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(new Gtk.Label(_("is")), false, false, 0);
+ box.pack_start(flagged_state, false, false, 0);
+ box.show_all();
+ }
+
+ ~SearchRowFlagged() {
+ flagged_state.changed.disconnect(on_changed);
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType search_type = parent.get_search_type();
+ SearchConditionFlagged.State state = (SearchConditionFlagged.State) flagged_state.get_active();
+ SearchConditionFlagged c = new SearchConditionFlagged(search_type, state);
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionFlagged? f = sc as SearchConditionFlagged;
+ assert(f != null);
+ flagged_state.set_active(f.state);
+ }
+
+ public override bool is_complete() {
+ return true;
+ }
+
+ private void on_changed() {
+ parent.changed(parent);
+ }
+ }
+
+ private class SearchRowRating : SearchRow {
+ private Gtk.Box box;
+ private Gtk.ComboBoxText rating;
+ private Gtk.ComboBoxText context;
+
+ private SearchRowContainer parent;
+
+ public SearchRowRating(SearchRowContainer parent) {
+ this.parent = parent;
+
+ // Ordering must correspond with Rating
+ rating = new Gtk.ComboBoxText();
+ rating.append_text(Resources.rating_combo_box(Rating.REJECTED));
+ rating.append_text(Resources.rating_combo_box(Rating.UNRATED));
+ rating.append_text(Resources.rating_combo_box(Rating.ONE));
+ rating.append_text(Resources.rating_combo_box(Rating.TWO));
+ rating.append_text(Resources.rating_combo_box(Rating.THREE));
+ rating.append_text(Resources.rating_combo_box(Rating.FOUR));
+ rating.append_text(Resources.rating_combo_box(Rating.FIVE));
+ rating.set_active(0);
+ rating.changed.connect(on_changed);
+
+ context = new Gtk.ComboBoxText();
+ context.append_text(_("and higher"));
+ context.append_text(_("only"));
+ context.append_text(_("and lower"));
+ context.set_active(0);
+ context.changed.connect(on_changed);
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(new Gtk.Label(_("is")), false, false, 0);
+ box.pack_start(rating, false, false, 0);
+ box.pack_start(context, false, false, 0);
+ box.show_all();
+ }
+
+ ~SearchRowRating() {
+ rating.changed.disconnect(on_changed);
+ context.changed.disconnect(on_changed);
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType search_type = parent.get_search_type();
+ Rating search_rating = (Rating) rating.get_active() + Rating.REJECTED;
+ SearchConditionRating.Context search_context = (SearchConditionRating.Context) context.get_active();
+ SearchConditionRating c = new SearchConditionRating(search_type, search_rating, search_context);
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionRating? r = sc as SearchConditionRating;
+ assert(r != null);
+ context.set_active(r.context);
+ rating.set_active(r.rating - Rating.REJECTED);
+ }
+
+ public override bool is_complete() {
+ return true;
+ }
+
+ private void on_changed() {
+ parent.changed(parent);
+ }
+ }
+
+ private class SearchRowDate : SearchRow {
+ private const string DATE_FORMAT = "%x";
+ private Gtk.Box box;
+ private Gtk.ComboBoxText context;
+ private Gtk.Button label_one;
+ private Gtk.Button label_two;
+ private Gtk.Calendar cal_one;
+ private Gtk.Calendar cal_two;
+ private Gtk.Label and;
+
+ private SearchRowContainer parent;
+
+ public SearchRowDate(SearchRowContainer parent) {
+ this.parent = parent;
+
+ // Ordering must correspond with Context
+ context = new Gtk.ComboBoxText();
+ context.append_text(_("is exactly"));
+ context.append_text(_("is after"));
+ context.append_text(_("is before"));
+ context.append_text(_("is between"));
+ context.append_text(_("is not set"));
+ context.set_active(0);
+ context.changed.connect(on_changed);
+
+ cal_one = new Gtk.Calendar();
+ cal_two = new Gtk.Calendar();
+
+ label_one = new Gtk.Button();
+ label_one.clicked.connect(on_one_clicked);
+ label_two = new Gtk.Button();
+ label_two.clicked.connect(on_two_clicked);
+
+ and = new Gtk.Label(_("and"));
+
+ box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
+ box.pack_start(context, false, false, 0);
+ box.pack_start(label_one, false, false, 0);
+ box.pack_start(and, false, false, 0);
+ box.pack_start(label_two, false, false, 0);
+
+ box.show_all();
+ update_date_labels();
+ }
+
+ ~SearchRowRating() {
+ context.changed.disconnect(on_changed);
+ }
+
+ private void update_date_labels() {
+ SearchConditionDate.Context c = (SearchConditionDate.Context) context.get_active();
+
+ // Only show "and" and 2nd date label for between mode.
+ if (c == SearchConditionDate.Context.BETWEEN) {
+ label_one.show();
+ and.show();
+ label_two.show();
+ } else if (c == SearchConditionDate.Context.IS_NOT_SET) {
+ label_one.hide();
+ and.hide();
+ label_two.hide();
+ } else {
+ label_one.show();
+ and.hide();
+ label_two.hide();
+ }
+
+ // Set label text to date.
+ label_one.label = get_date_one().format(DATE_FORMAT);
+ label_two.label = get_date_two().format(DATE_FORMAT);;
+ }
+
+ public override Gtk.Widget get_widget() {
+ return box;
+ }
+
+ private DateTime get_date_one() {
+ return new DateTime.local(cal_one.year, cal_one.month + 1, cal_one.day, 0, 0, 0.0);
+ }
+
+ private DateTime get_date_two() {
+ return new DateTime.local(cal_two.year, cal_two.month + 1, cal_two.day, 0, 0, 0.0);
+ }
+
+ private void set_date_one(DateTime date) {
+ cal_one.day = date.get_day_of_month();
+ cal_one.month = date.get_month() - 1;
+ cal_one.year = date.get_year();
+ }
+
+ private void set_date_two(DateTime date) {
+ cal_two.day = date.get_day_of_month();
+ cal_two.month = date.get_month() - 1;
+ cal_two.year = date.get_year();
+ }
+
+ public override SearchCondition get_search_condition() {
+ SearchCondition.SearchType search_type = parent.get_search_type();
+ SearchConditionDate.Context search_context = (SearchConditionDate.Context) context.get_active();
+ SearchConditionDate c = new SearchConditionDate(search_type, search_context, get_date_one(),
+ get_date_two());
+ return c;
+ }
+
+ public override void populate(SearchCondition sc) {
+ SearchConditionDate? cond = sc as SearchConditionDate;
+ assert(cond != null);
+ context.set_active(cond.context);
+ set_date_one(cond.date_one);
+ set_date_two(cond.date_two);
+ update_date_labels();
+ }
+
+ public override bool is_complete() {
+ return true;
+ }
+
+ private void on_changed() {
+ parent.changed(parent);
+ update_date_labels();
+ }
+
+ private void popup_calendar(Gtk.Calendar cal) {
+ int orig_day = cal.day;
+ int orig_month = cal.month;
+ int orig_year = cal.year;
+ Gtk.Dialog d = new Gtk.Dialog.with_buttons(null, null,
+ Gtk.DialogFlags.MODAL, Gtk.Stock.CANCEL, Gtk.ResponseType.REJECT,
+ Gtk.Stock.OK, Gtk.ResponseType.ACCEPT);
+ d.set_modal(true);
+ d.set_resizable(false);
+ d.set_decorated(false);
+ ((Gtk.Box) d.get_content_area()).add(cal);
+ ulong id_1 = cal.day_selected.connect(()=>{update_date_labels();});
+ ulong id_2 = cal.day_selected_double_click.connect(()=>{d.close();});
+ d.show_all();
+ int res = d.run();
+ if (res != Gtk.ResponseType.ACCEPT) {
+ // User hit cancel, restore original date.
+ cal.day = orig_day;
+ cal.month = orig_month;
+ cal.year = orig_year;
+ }
+ cal.disconnect(id_1);
+ cal.disconnect(id_2);
+ d.destroy();
+ update_date_labels();
+ }
+
+ private void on_one_clicked() {
+ popup_calendar(cal_one);
+ }
+
+ private void on_two_clicked() {
+ popup_calendar(cal_two);
+ }
+ }
+
+ private Gtk.Builder builder;
+ private Gtk.Dialog dialog;
+ private Gtk.Button add_criteria;
+ private Gtk.ComboBoxText operator;
+ private Gtk.Box row_box;
+ private Gtk.Entry search_title;
+ private Gee.ArrayList<SearchRowContainer> row_list = new Gee.ArrayList<SearchRowContainer>();
+ private bool edit_mode = false;
+ private SavedSearch? previous_search = null;
+ private bool valid = false;
+
+ public SavedSearchDialog() {
+ setup_dialog();
+
+ // Default name.
+ search_title.set_text(SavedSearchTable.get_instance().generate_unique_name());
+ search_title.select_region(0, -1); // select all
+
+ // Default is text search.
+ add_text_search();
+ row_list.get(0).allow_removal(false);
+
+ // Add buttons for new search.
+ dialog.add_action_widget(new Gtk.Button.from_stock(Gtk.Stock.CANCEL), Gtk.ResponseType.CANCEL);
+ Gtk.Button ok_button = new Gtk.Button.from_stock(Gtk.Stock.OK);
+ ok_button.can_default = true;
+ dialog.add_action_widget(ok_button, Gtk.ResponseType.OK);
+ dialog.set_default_response(Gtk.ResponseType.OK);
+
+ dialog.show_all();
+ set_valid(false);
+ }
+
+ public SavedSearchDialog.edit_existing(SavedSearch saved_search) {
+ previous_search = saved_search;
+ edit_mode = true;
+ setup_dialog();
+
+ // Add close button.
+ Gtk.Button close_button = new Gtk.Button.from_stock(Gtk.Stock.CLOSE);
+ close_button.can_default = true;
+ dialog.add_action_widget(close_button, Gtk.ResponseType.OK);
+ dialog.set_default_response(Gtk.ResponseType.OK);
+
+ dialog.show_all();
+
+ // Load existing search into dialog.
+ operator.set_active((SearchOperator) saved_search.get_operator());
+ search_title.set_text(saved_search.get_name());
+ foreach (SearchCondition sc in saved_search.get_conditions()) {
+ add_row(new SearchRowContainer.edit_existing(sc));
+ }
+
+ if (row_list.size == 1)
+ row_list.get(0).allow_removal(false);
+
+ set_valid(true);
+ }
+
+ ~SavedSearchDialog() {
+ search_title.changed.disconnect(on_title_changed);
+ }
+
+ // Builds the dialog UI. Doesn't add buttons to the dialog or call dialog.show().
+ private void setup_dialog() {
+ builder = AppWindow.create_builder();
+
+ dialog = builder.get_object("Search criteria") as Gtk.Dialog;
+ dialog.set_parent_window(AppWindow.get_instance().get_parent_window());
+ dialog.set_transient_for(AppWindow.get_instance());
+ dialog.response.connect(on_response);
+
+ add_criteria = builder.get_object("Add search button") as Gtk.Button;
+ add_criteria.button_press_event.connect(on_add_criteria);
+
+ search_title = builder.get_object("Search title") as Gtk.Entry;
+ search_title.set_activates_default(true);
+ search_title.changed.connect(on_title_changed);
+
+ row_box = builder.get_object("row_box") as Gtk.Box;
+
+ operator = builder.get_object("Type of search criteria") as Gtk.ComboBoxText;
+ operator.append_text(_("any"));
+ operator.append_text(_("all"));
+ operator.append_text(_("none"));
+ operator.set_active(0);
+ }
+
+ // Displays the dialog.
+ public void show() {
+ dialog.run();
+ dialog.destroy();
+ }
+
+ // Adds a row of search criteria.
+ private bool on_add_criteria(Gdk.EventButton event) {
+ add_text_search();
+ return false;
+ }
+
+ private void add_text_search() {
+ SearchRowContainer text = new SearchRowContainer();
+ add_row(text);
+ }
+
+ // Appends a row of search criteria to the list and table.
+ private void add_row(SearchRowContainer row) {
+ if (row_list.size == 1)
+ row_list.get(0).allow_removal(true);
+ row_box.add(row.get_widget());
+ row_list.add(row);
+ row.remove.connect(on_remove_row);
+ row.changed.connect(on_row_changed);
+ set_valid(row.is_complete());
+ }
+
+ // Removes a row of search criteria.
+ private void on_remove_row(SearchRowContainer row) {
+ row.remove.disconnect(on_remove_row);
+ row.changed.disconnect(on_row_changed);
+ row_box.remove(row.get_widget());
+ row_list.remove(row);
+ if (row_list.size == 1)
+ row_list.get(0).allow_removal(false);
+ set_valid(true); // try setting to "true" since we removed a row
+ }
+
+ private void on_response(int response_id) {
+ if (response_id == Gtk.ResponseType.OK) {
+ if (SavedSearchTable.get_instance().exists(search_title.get_text()) &&
+ !(edit_mode && previous_search.get_name() == search_title.get_text())) {
+ AppWindow.error_message(Resources.rename_search_exists_message(search_title.get_text()));
+ return;
+ }
+
+ if (edit_mode) {
+ // Remove previous search.
+ SavedSearchTable.get_instance().remove(previous_search);
+ }
+
+ // Build the condition list from the search rows, and add our new saved search to the table.
+ Gee.ArrayList<SearchCondition> conditions = new Gee.ArrayList<SearchCondition>();
+ foreach (SearchRowContainer c in row_list) {
+ conditions.add(c.get_search_condition());
+ }
+
+ // Create the object. It will be added to the DB and SearchTable automatically.
+ SearchOperator search_operator = (SearchOperator)operator.get_active();
+ SavedSearchTable.get_instance().create(search_title.get_text(), search_operator, conditions);
+ }
+ }
+
+ private void on_row_changed(SearchRowContainer row) {
+ set_valid(row.is_complete());
+ }
+
+ private void on_title_changed() {
+ set_valid(is_title_valid());
+ }
+
+ private bool is_title_valid() {
+ if (edit_mode && previous_search != null &&
+ previous_search.get_name() == search_title.get_text())
+ return true; // Title hasn't changed.
+ if (search_title.get_text().chomp() == "")
+ return false;
+ if (SavedSearchTable.get_instance().exists(search_title.get_text()))
+ return false;
+ return true;
+ }
+
+ // Call this with your new value for validity whenever a row or the title changes.
+ private void set_valid(bool v) {
+ if (!v) {
+ valid = false;
+ } else if (v != valid) {
+ if (is_title_valid()) {
+ // Go through rows to check validity.
+ int valid_rows = 0;
+ foreach (SearchRowContainer c in row_list) {
+ if (c.is_complete())
+ valid_rows++;
+ }
+ valid = (valid_rows == row_list.size);
+ } else {
+ valid = false; // title was invalid
+ }
+ }
+
+ dialog.set_response_sensitive(Gtk.ResponseType.OK, valid);
+ }
+}
diff --git a/src/searches/SavedSearchPage.vala b/src/searches/SavedSearchPage.vala
new file mode 100644
index 0000000..8e6672e
--- /dev/null
+++ b/src/searches/SavedSearchPage.vala
@@ -0,0 +1,92 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Source monitoring for saved searches.
+private class SavedSearchManager : CollectionViewManager {
+ SavedSearch search;
+ public SavedSearchManager(SavedSearchPage owner, SavedSearch search) {
+ base (owner);
+ this.search = search;
+ }
+
+ public override bool include_in_view(DataSource source) {
+ return search.predicate((MediaSource) source);
+ }
+}
+
+// Page for displaying saved searches.
+public class SavedSearchPage : CollectionPage {
+
+ // The search logic and parameters are contained in the SavedSearch.
+ private SavedSearch search;
+
+ public SavedSearchPage(SavedSearch search) {
+ base (search.get_name());
+ this.search = search;
+
+
+ foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
+ get_view().monitor_source_collection(sources, new SavedSearchManager(this, search), null);
+
+ init_page_context_menu("/SearchContextMenu");
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_library_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_library_photos_sort(sort_order, sort_by);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+ ui_filenames.add("savedsearch.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry rename_search = { "RenameSearch", null, TRANSLATABLE, null, null, on_rename_search };
+ actions += rename_search;
+
+ Gtk.ActionEntry edit_search = { "EditSearch", null, TRANSLATABLE, null, null, on_edit_search };
+ actions += edit_search;
+
+ Gtk.ActionEntry delete_search = { "DeleteSearch", null, TRANSLATABLE, null, null, on_delete_search };
+ actions += delete_search;
+
+ return actions;
+ }
+
+ private void on_delete_search() {
+ if (Dialogs.confirm_delete_saved_search(search))
+ AppWindow.get_command_manager().execute(new DeleteSavedSearchCommand(search));
+ }
+
+ private void on_rename_search() {
+ LibraryWindow.get_app().rename_search_in_sidebar(search);
+ }
+
+ private void on_edit_search() {
+ SavedSearchDialog ssd = new SavedSearchDialog.edit_existing(search);
+ ssd.show();
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_details("RenameSearch",
+ Resources.RENAME_SEARCH_MENU,
+ null, true);
+ set_action_details("EditSearch",
+ Resources.EDIT_SEARCH_MENU,
+ null, true);
+ set_action_details("DeleteSearch",
+ Resources.DELETE_SEARCH_MENU,
+ null, true);
+ base.update_actions(selected_count, count);
+ }
+}
+
diff --git a/src/searches/SearchBoolean.vala b/src/searches/SearchBoolean.vala
new file mode 100644
index 0000000..431e398
--- /dev/null
+++ b/src/searches/SearchBoolean.vala
@@ -0,0 +1,971 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// For specifying whether a search should be ORed (any) or ANDed (all).
+public enum SearchOperator {
+ ANY = 0,
+ ALL,
+ NONE;
+
+ public string to_string() {
+ switch (this) {
+ case SearchOperator.ANY:
+ return "ANY";
+
+ case SearchOperator.ALL:
+ return "ALL";
+
+ case SearchOperator.NONE:
+ return "NONE";
+
+ default:
+ error("unrecognized search operator enumeration value");
+ }
+ }
+
+ public static SearchOperator from_string(string str) {
+ if (str == "ANY")
+ return SearchOperator.ANY;
+
+ else if (str == "ALL")
+ return SearchOperator.ALL;
+
+ else if (str == "NONE")
+ return SearchOperator.NONE;
+
+ else
+ error("unrecognized search operator name: %s", str);
+ }
+}
+
+// Important note: if you are adding, removing, or otherwise changing
+// this table, you're going to have to modify SavedSearchDBTable.vala
+// as well.
+public abstract class SearchCondition {
+ // Type of search condition.
+ public enum SearchType {
+ ANY_TEXT = 0,
+ TITLE,
+ TAG,
+ EVENT_NAME,
+ FILE_NAME,
+ MEDIA_TYPE,
+ FLAG_STATE,
+ MODIFIED_STATE,
+ RATING,
+ COMMENT,
+ DATE;
+ // Note: when adding new types, be sure to update all functions below.
+
+ public static SearchType[] as_array() {
+ return { ANY_TEXT, TITLE, TAG, COMMENT, EVENT_NAME, FILE_NAME,
+ MEDIA_TYPE, FLAG_STATE, MODIFIED_STATE, RATING, DATE };
+ }
+
+ // Sorts an array alphabetically by display name.
+ public static void sort_array(ref SearchType[] array) {
+ Posix.qsort(array, array.length, sizeof(SearchType), (a, b) => {
+ return utf8_cs_compare(((*(SearchType*) a)).display_text(),
+ ((*(SearchType*) b)).display_text());
+ });
+ }
+
+ public string to_string() {
+ switch (this) {
+ case SearchType.ANY_TEXT:
+ return "ANY_TEXT";
+
+ case SearchType.TITLE:
+ return "TITLE";
+
+ case SearchType.TAG:
+ return "TAG";
+
+ case SearchType.COMMENT:
+ return "COMMENT";
+
+ case SearchType.EVENT_NAME:
+ return "EVENT_NAME";
+
+ case SearchType.FILE_NAME:
+ return "FILE_NAME";
+
+ case SearchType.MEDIA_TYPE:
+ return "MEDIA_TYPE";
+
+ case SearchType.FLAG_STATE:
+ return "FLAG_STATE";
+
+ case SearchType.MODIFIED_STATE:
+ return "MODIFIED_STATE";
+
+ case SearchType.RATING:
+ return "RATING";
+
+ case SearchType.DATE:
+ return "DATE";
+
+ default:
+ error("unrecognized search type enumeration value");
+ }
+ }
+
+ public static SearchType from_string(string str) {
+ if (str == "ANY_TEXT")
+ return SearchType.ANY_TEXT;
+
+ else if (str == "TITLE")
+ return SearchType.TITLE;
+
+ else if (str == "TAG")
+ return SearchType.TAG;
+
+ else if (str == "COMMENT")
+ return SearchType.COMMENT;
+
+ else if (str == "EVENT_NAME")
+ return SearchType.EVENT_NAME;
+
+ else if (str == "FILE_NAME")
+ return SearchType.FILE_NAME;
+
+ else if (str == "MEDIA_TYPE")
+ return SearchType.MEDIA_TYPE;
+
+ else if (str == "FLAG_STATE")
+ return SearchType.FLAG_STATE;
+
+ else if (str == "MODIFIED_STATE")
+ return SearchType.MODIFIED_STATE;
+
+ else if (str == "RATING")
+ return SearchType.RATING;
+
+ else if (str == "DATE")
+ return SearchType.DATE;
+
+ else
+ error("unrecognized search type name: %s", str);
+ }
+
+ public string display_text() {
+ switch (this) {
+ case SearchType.ANY_TEXT:
+ return _("Any text");
+
+ case SearchType.TITLE:
+ return _("Title");
+
+ case SearchType.TAG:
+ return _("Tag");
+
+ case SearchType.COMMENT:
+ return _("Comment");
+
+ case SearchType.EVENT_NAME:
+ return _("Event name");
+
+ case SearchType.FILE_NAME:
+ return _("File name");
+
+ case SearchType.MEDIA_TYPE:
+ return _("Media type");
+
+ case SearchType.FLAG_STATE:
+ return _("Flag state");
+
+ case SearchType.MODIFIED_STATE:
+ return _("Photo state");
+
+ case SearchType.RATING:
+ return _("Rating");
+
+ case SearchType.DATE:
+ return _("Date");
+
+ default:
+ error("unrecognized search type enumeration value");
+ }
+ }
+ }
+
+ public SearchType search_type { get; protected set; }
+
+ // Determines whether the source is included.
+ public abstract bool predicate(MediaSource source);
+}
+
+// Condition for text matching.
+public class SearchConditionText : SearchCondition {
+ public enum Context {
+ CONTAINS = 0,
+ IS_EXACTLY,
+ STARTS_WITH,
+ ENDS_WITH,
+ DOES_NOT_CONTAIN,
+ IS_NOT_SET;
+
+ public string to_string() {
+ switch (this) {
+ case Context.CONTAINS:
+ return "CONTAINS";
+
+ case Context.IS_EXACTLY:
+ return "IS_EXACTLY";
+
+ case Context.STARTS_WITH:
+ return "STARTS_WITH";
+
+ case Context.ENDS_WITH:
+ return "ENDS_WITH";
+
+ case Context.DOES_NOT_CONTAIN:
+ return "DOES_NOT_CONTAIN";
+
+ case Context.IS_NOT_SET:
+ return "IS_NOT_SET";
+
+ default:
+ error("unrecognized text search context enumeration value");
+ }
+ }
+
+ public static Context from_string(string str) {
+ if (str == "CONTAINS")
+ return Context.CONTAINS;
+
+ else if (str == "IS_EXACTLY")
+ return Context.IS_EXACTLY;
+
+ else if (str == "STARTS_WITH")
+ return Context.STARTS_WITH;
+
+ else if (str == "ENDS_WITH")
+ return Context.ENDS_WITH;
+
+ else if (str == "DOES_NOT_CONTAIN")
+ return Context.DOES_NOT_CONTAIN;
+
+ else if (str == "IS_NOT_SET")
+ return Context.IS_NOT_SET;
+
+ else
+ error("unrecognized text search context name: %s", str);
+ }
+ }
+
+ // What to search for.
+ public string text { get; private set; }
+
+ // How to match.
+ public Context context { get; private set; }
+
+ public SearchConditionText(SearchCondition.SearchType search_type, string? text, Context context) {
+ this.search_type = search_type;
+ this.text = (text != null) ? String.remove_diacritics(text.down()) : "";
+ this.context = context;
+ }
+
+ // Match string by context.
+ private bool string_match(string needle, string? haystack) {
+ switch (context) {
+ case Context.CONTAINS:
+ case Context.DOES_NOT_CONTAIN:
+ return !is_string_empty(haystack) && haystack.contains(needle);
+
+ case Context.IS_EXACTLY:
+ return !is_string_empty(haystack) && haystack == needle;
+
+ case Context.STARTS_WITH:
+ return !is_string_empty(haystack) && haystack.has_prefix(needle);
+
+ case Context.ENDS_WITH:
+ return !is_string_empty(haystack) && haystack.has_suffix(needle);
+
+ case Context.IS_NOT_SET:
+ return (is_string_empty(haystack));
+ }
+
+ return false;
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ bool ret = false;
+
+ // title
+ if (SearchType.ANY_TEXT == search_type || SearchType.TITLE == search_type) {
+ string title = source.get_title();
+ if(title != null){
+ ret |= string_match(text, String.remove_diacritics(title.down()));
+ }
+ }
+
+ // tags
+ if (SearchType.ANY_TEXT == search_type || SearchType.TAG == search_type) {
+ Gee.List<Tag>? tag_list = Tag.global.fetch_for_source(source);
+ if (null != tag_list) {
+ string itag;
+ foreach (Tag tag in tag_list) {
+ itag = tag.get_searchable_name().down(); // get_searchable already remove diacritics
+ ret |= string_match(text, itag);
+ }
+ } else {
+ ret |= string_match(text, null); // for IS_NOT_SET
+ }
+ }
+
+ // event name
+ if (SearchType.ANY_TEXT == search_type || SearchType.EVENT_NAME == search_type) {
+ string? event_name = (null != source.get_event()) ?
+ String.remove_diacritics(source.get_event().get_name().down()) : null;
+ ret |= string_match(text, event_name);
+ }
+
+ // comment
+ if (SearchType.ANY_TEXT == search_type || SearchType.COMMENT == search_type) {
+ string? comment = source.get_comment();
+ if(null != comment)
+ ret |= string_match(text, String.remove_diacritics(comment.down()));
+ }
+
+ // file name
+ if (SearchType.ANY_TEXT == search_type || SearchType.FILE_NAME == search_type) {
+ ret |= string_match(text, String.remove_diacritics(source.get_basename().down()));
+ }
+
+ return (context == Context.DOES_NOT_CONTAIN) ? !ret : ret;
+ }
+}
+
+// Condition for media type matching.
+public class SearchConditionMediaType : SearchCondition {
+ public enum Context {
+ IS = 0,
+ IS_NOT;
+
+ public string to_string() {
+ switch (this) {
+ case Context.IS:
+ return "IS";
+
+ case Context.IS_NOT:
+ return "IS_NOT";
+
+ default:
+ error("unrecognized media search context enumeration value");
+ }
+ }
+
+ public static Context from_string(string str) {
+ if (str == "IS")
+ return Context.IS;
+
+ else if (str == "IS_NOT")
+ return Context.IS_NOT;
+
+ else
+ error("unrecognized media search context name: %s", str);
+ }
+ }
+
+ public enum MediaType {
+ PHOTO_ALL = 0,
+ PHOTO_RAW,
+ VIDEO;
+
+ public string to_string() {
+ switch (this) {
+ case MediaType.PHOTO_ALL:
+ return "PHOTO_ALL";
+
+ case MediaType.PHOTO_RAW:
+ return "PHOTO_RAW";
+
+ case MediaType.VIDEO:
+ return "VIDEO";
+
+ default:
+ error("unrecognized media search type enumeration value");
+ }
+ }
+
+ public static MediaType from_string(string str) {
+ if (str == "PHOTO_ALL")
+ return MediaType.PHOTO_ALL;
+
+ else if (str == "PHOTO_RAW")
+ return MediaType.PHOTO_RAW;
+
+ else if (str == "VIDEO")
+ return MediaType.VIDEO;
+
+ else
+ error("unrecognized media search type name: %s", str);
+ }
+ }
+
+ // What to search for.
+ public MediaType media_type { get; private set; }
+
+ // How to match.
+ public Context context { get; private set; }
+
+ public SearchConditionMediaType(SearchCondition.SearchType search_type, Context context, MediaType media_type) {
+ this.search_type = search_type;
+ this.context = context;
+ this.media_type = media_type;
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ // For the given type, check it against the MediaSource type
+ // and the given search context.
+ switch (media_type) {
+ case MediaType.PHOTO_ALL:
+ if (source is Photo)
+ return context == Context.IS;
+ else
+ return context == Context.IS_NOT;
+
+ case MediaType.PHOTO_RAW:
+ if (source is Photo && ((Photo) source).get_master_file_format() == PhotoFileFormat.RAW)
+ return context == Context.IS;
+ else
+ return context == Context.IS_NOT;
+
+ case MediaType.VIDEO:
+ if (source is VideoSource)
+ return context == Context.IS;
+ else
+ return context == Context.IS_NOT;
+
+ default:
+ error("unrecognized media search type enumeration value");
+ }
+ }
+}
+
+// Condition for flag state matching.
+public class SearchConditionFlagged : SearchCondition {
+ public enum State {
+ FLAGGED = 0,
+ UNFLAGGED;
+
+ public string to_string() {
+ switch (this) {
+ case State.FLAGGED:
+ return "FLAGGED";
+
+ case State.UNFLAGGED:
+ return "UNFLAGGED";
+
+ default:
+ error("unrecognized flagged search state enumeration value");
+ }
+ }
+
+ public static State from_string(string str) {
+ if (str == "FLAGGED")
+ return State.FLAGGED;
+
+ else if (str == "UNFLAGGED")
+ return State.UNFLAGGED;
+
+ else
+ error("unrecognized flagged search state name: %s", str);
+ }
+ }
+
+ // What to match.
+ public State state { get; private set; }
+
+ public SearchConditionFlagged(SearchCondition.SearchType search_type, State state) {
+ this.search_type = search_type;
+ this.state = state;
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ if (state == State.FLAGGED) {
+ return ((Flaggable) source).is_flagged();
+ } else if (state == State.UNFLAGGED) {
+ return !((Flaggable) source).is_flagged();
+ } else {
+ error("unrecognized flagged search state");
+ }
+ }
+}
+
+// Condition for modified state matching.
+public class SearchConditionModified : SearchCondition {
+
+ public enum Context {
+ HAS = 0,
+ HAS_NO;
+
+ public string to_string() {
+ switch (this) {
+ case Context.HAS:
+ return "HAS";
+
+ case Context.HAS_NO:
+ return "HAS_NO";
+
+ default:
+ error("unrecognized modified search context enumeration value");
+ }
+ }
+
+ public static Context from_string(string str) {
+ if (str == "HAS")
+ return Context.HAS;
+
+ else if (str == "HAS_NO")
+ return Context.HAS_NO;
+
+ else
+ error("unrecognized modified search context name: %s", str);
+ }
+ }
+
+ public enum State {
+ MODIFIED = 0,
+ INTERNAL_CHANGES,
+ EXTERNAL_CHANGES;
+
+ public string to_string() {
+ switch (this) {
+ case State.MODIFIED:
+ return "MODIFIED";
+
+ case State.INTERNAL_CHANGES:
+ return "INTERNAL_CHANGES";
+
+ case State.EXTERNAL_CHANGES:
+ return "EXTERNAL_CHANGES";
+
+ default:
+ error("unrecognized modified search state enumeration value");
+ }
+ }
+
+ public static State from_string(string str) {
+ if (str == "MODIFIED")
+ return State.MODIFIED;
+
+ else if (str == "INTERNAL_CHANGES")
+ return State.INTERNAL_CHANGES;
+
+ else if (str == "EXTERNAL_CHANGES")
+ return State.EXTERNAL_CHANGES;
+
+ else
+ error("unrecognized modified search state name: %s", str);
+ }
+ }
+
+ // What to match.
+ public State state { get; private set; }
+
+ // How to match.
+ public Context context { get; private set; }
+
+ public SearchConditionModified(SearchCondition.SearchType search_type, Context context, State state) {
+ this.search_type = search_type;
+ this.context = context;
+ this.state = state;
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ // check against state and the given search context.
+ Photo? photo = source as Photo;
+ if (photo == null)
+ return false;
+
+ bool match;
+ if (state == State.MODIFIED)
+ match = photo.has_transformations() || photo.has_editable();
+ else if (state == State.INTERNAL_CHANGES)
+ match = photo.has_transformations();
+ else if (state == State.EXTERNAL_CHANGES)
+ match = photo.has_editable();
+ else
+ error("unrecognized modified search state");
+
+ if (match)
+ return context == Context.HAS;
+ else
+ return context == Context.HAS_NO;
+ }
+}
+
+
+// Condition for rating matching.
+public class SearchConditionRating : SearchCondition {
+ public enum Context {
+ AND_HIGHER = 0,
+ ONLY,
+ AND_LOWER;
+
+ public string to_string() {
+ switch (this) {
+ case Context.AND_HIGHER:
+ return "AND_HIGHER";
+
+ case Context.ONLY:
+ return "ONLY";
+
+ case Context.AND_LOWER:
+ return "AND_LOWER";
+
+ default:
+ error("unrecognized rating search context enumeration value");
+ }
+ }
+
+ public static Context from_string(string str) {
+ if (str == "AND_HIGHER")
+ return Context.AND_HIGHER;
+
+ else if (str == "ONLY")
+ return Context.ONLY;
+
+ else if (str == "AND_LOWER")
+ return Context.AND_LOWER;
+
+ else
+ error("unrecognized rating search context name: %s", str);
+ }
+ }
+
+ // Rating to check against.
+ public Rating rating { get; private set; }
+
+ // How to match.
+ public Context context { get; private set; }
+
+ public SearchConditionRating(SearchCondition.SearchType search_type, Rating rating, Context context) {
+ this.search_type = search_type;
+ this.rating = rating;
+ this.context = context;
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ Rating source_rating = source.get_rating();
+ if (context == Context.AND_HIGHER)
+ return source_rating >= rating;
+ else if (context == Context.ONLY)
+ return source_rating == rating;
+ else if (context == Context.AND_LOWER)
+ return source_rating <= rating;
+ else
+ error("unknown rating search context");
+ }
+}
+
+
+// Condition for date range.
+public class SearchConditionDate : SearchCondition {
+ public enum Context {
+ EXACT = 0,
+ AFTER,
+ BEFORE,
+ BETWEEN,
+ IS_NOT_SET;
+
+ public string to_string() {
+ switch (this) {
+ case Context.EXACT:
+ return "EXACT";
+
+ case Context.AFTER:
+ return "AFTER";
+
+ case Context.BEFORE:
+ return "BEFORE";
+
+ case Context.BETWEEN:
+ return "BETWEEN";
+
+ case Context.IS_NOT_SET:
+ return "IS_NOT_SET";
+
+ default:
+ error("unrecognized date search context enumeration value");
+ }
+ }
+
+ public static Context from_string(string str) {
+ if (str == "EXACT")
+ return Context.EXACT;
+
+ if (str == "AFTER")
+ return Context.AFTER;
+
+ else if (str == "BEFORE")
+ return Context.BEFORE;
+
+ else if (str == "BETWEEN")
+ return Context.BETWEEN;
+
+ else if (str == "IS_NOT_SET")
+ return Context.IS_NOT_SET;
+
+ else
+ error("unrecognized date search context name: %s", str);
+ }
+ }
+
+ // Date to check against. Second date only used for between searches.
+ public DateTime date_one { get; private set; }
+ public DateTime date_two { get; private set; }
+
+ // How to match.
+ public Context context { get; private set; }
+
+ public SearchConditionDate(SearchCondition.SearchType search_type, Context context,
+ DateTime date_one, DateTime date_two) {
+ this.search_type = search_type;
+ this.context = context;
+ if (context != Context.BETWEEN || date_two.compare(date_one) >= 1) {
+ this.date_one = date_one;
+ this.date_two = date_two;
+ } else {
+ this.date_one = date_two;
+ this.date_two = date_one;
+ }
+
+ }
+
+ // Determines whether the source is included.
+ public override bool predicate(MediaSource source) {
+ time_t exposure_time = source.get_exposure_time();
+ if (exposure_time == 0)
+ return context == Context.IS_NOT_SET;
+
+ DateTime dt = new DateTime.from_unix_local(exposure_time);
+ switch (context) {
+ case Context.EXACT:
+ DateTime second = date_one.add_days(1);
+ return (dt.compare(date_one) >= 0 && dt.compare(second) < 0);
+
+ case Context.AFTER:
+ return (dt.compare(date_one) >= 0);
+
+ case Context.BEFORE:
+ return (dt.compare(date_one) <= 0);
+
+ case Context.BETWEEN:
+ DateTime second = date_two.add_days(1);
+ return (dt.compare(date_one) >= 0 && dt.compare(second) < 0);
+
+ case Context.IS_NOT_SET:
+ return false; // Already checked above.
+
+ default:
+ error("unrecognized date search context enumeration value");
+ }
+ }
+}
+
+// Contains the logic of a search.
+// A saved search requires a name, an AND/OR (all/any) operator, as well as a list of one or more conditions.
+public class SavedSearch : DataSource {
+ public const string TYPENAME = "saved_search";
+
+ // Row from the database.
+ private SavedSearchRow row;
+
+ public SavedSearch(SavedSearchRow row, int64 object_id = INVALID_OBJECT_ID) {
+ base (object_id);
+
+ this.row = row;
+ }
+
+ public override string get_name() {
+ return row.name;
+ }
+
+ public override string to_string() {
+ return "SavedSearch " + get_name();
+ }
+
+ public override string get_typename() {
+ return TYPENAME;
+ }
+
+ public SavedSearchID get_saved_search_id() {
+ return row.search_id;
+ }
+
+ public override int64 get_instance_id() {
+ return get_saved_search_id().id;
+ }
+
+ public static int compare_names(void *a, void *b) {
+ SavedSearch *asearch = (SavedSearch *) a;
+ SavedSearch *bsearch = (SavedSearch *) b;
+
+ return String.collated_compare(asearch->get_name(), bsearch->get_name());
+ }
+
+ public bool predicate(MediaSource source) {
+ bool ret;
+ if (SearchOperator.ALL == row.operator || SearchOperator.NONE == row.operator)
+ ret = true;
+ else
+ ret = false; // assumes conditions.size() > 0
+
+ foreach (SearchCondition c in row.conditions) {
+ if (SearchOperator.ALL == row.operator)
+ ret &= c.predicate(source);
+ else if (SearchOperator.ANY == row.operator)
+ ret |= c.predicate(source);
+ else if (SearchOperator.NONE == row.operator)
+ ret &= !c.predicate(source);
+ }
+ return ret;
+ }
+
+ public void reconstitute() {
+ try {
+ row.search_id = SavedSearchDBTable.get_instance().create_from_row(row);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ SavedSearchTable.get_instance().add_to_map(this);
+ debug("Reconstituted %s", to_string());
+ }
+
+ // Returns false if the name already exists or a bad name.
+ public bool rename(string new_name) {
+ if (is_string_empty(new_name))
+ return false;
+
+ if (SavedSearchTable.get_instance().exists(new_name))
+ return false;
+
+ try {
+ SavedSearchDBTable.get_instance().rename(row.search_id, new_name);
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ return false;
+ }
+
+ SavedSearchTable.get_instance().remove_from_map(this);
+ row.name = new_name;
+ SavedSearchTable.get_instance().add_to_map(this);
+
+ LibraryWindow.get_app().switch_to_saved_search(this);
+ return true;
+ }
+
+ public Gee.List<SearchCondition> get_conditions() {
+ return row.conditions.read_only_view;
+ }
+
+ public SearchOperator get_operator() {
+ return row.operator;
+ }
+}
+
+// This table contains every saved search. It's the preferred way to add and destroy a saved
+// search as well, since this table's create/destroy methods are tied to the database.
+public class SavedSearchTable {
+ private static SavedSearchTable? instance = null;
+ private Gee.HashMap<string, SavedSearch> search_map = new Gee.HashMap<string, SavedSearch>();
+
+ public signal void search_added(SavedSearch search);
+ public signal void search_removed(SavedSearch search);
+
+ private SavedSearchTable() {
+ // Load existing searches from DB.
+ try {
+ foreach(SavedSearchRow row in SavedSearchDBTable.get_instance().get_all_rows())
+ add_to_map(new SavedSearch(row));
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ }
+
+ public static SavedSearchTable get_instance() {
+ if (instance == null)
+ instance = new SavedSearchTable();
+
+ return instance;
+ }
+
+ public Gee.Collection<SavedSearch> get_all() {
+ return search_map.values;
+ }
+
+ // Creates a saved search with the given name, operator, and conditions. The saved search is
+ // added to the database and to this table.
+ public SavedSearch create(string name, SearchOperator operator,
+ Gee.ArrayList<SearchCondition> conditions) {
+ SavedSearch? search = null;
+ // Create a new SavedSearch in the database.
+ try {
+ search = new SavedSearch(SavedSearchDBTable.get_instance().add(name, operator, conditions));
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ // Add search to table.
+ add_to_map(search);
+ LibraryWindow.get_app().switch_to_saved_search(search);
+ return search;
+ }
+
+ // Removes a saved search, both from here and from the table.
+ public void remove(SavedSearch search) {
+ try {
+ SavedSearchDBTable.get_instance().remove(search.get_saved_search_id());
+ } catch (DatabaseError err) {
+ AppWindow.database_error(err);
+ }
+
+ remove_from_map(search);
+ }
+
+ public void add_to_map(SavedSearch search) {
+ search_map.set(search.get_name(), search);
+ search_added(search);
+ }
+
+ public void remove_from_map(SavedSearch search) {
+ search_map.unset(search.get_name());
+ search_removed(search);
+ }
+
+ public Gee.Iterable<SavedSearch> get_saved_searches() {
+ return search_map.values;
+ }
+
+ public int get_count() {
+ return search_map.size;
+ }
+
+ public bool exists(string search_name) {
+ return search_map.has_key(search_name);
+ }
+
+ // Generate a unique search name (not thread safe)
+ public string generate_unique_name() {
+ for (int ctr = 1; ctr < int.MAX; ctr++) {
+ string name = "%s %d".printf(Resources.DEFAULT_SAVED_SEARCH_NAME, ctr);
+
+ if (!exists(name))
+ return name;
+ }
+ return ""; // If all names are used (unlikely!)
+ }
+}
diff --git a/src/searches/Searches.vala b/src/searches/Searches.vala
new file mode 100644
index 0000000..478de86
--- /dev/null
+++ b/src/searches/Searches.vala
@@ -0,0 +1,31 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the Searches unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace Searches {
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+ Searches.SidebarEntry.init();
+}
+
+public void terminate() {
+ Searches.SidebarEntry.terminate();
+}
+
+}
+
diff --git a/src/searches/mk/searches.mk b/src/searches/mk/searches.mk
new file mode 100644
index 0000000..6df4b5d
--- /dev/null
+++ b/src/searches/mk/searches.mk
@@ -0,0 +1,31 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Searches
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := searches
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ SearchBoolean.vala \
+ SavedSearchPage.vala \
+ SavedSearchDialog.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/sidebar/Branch.vala b/src/sidebar/Branch.vala
new file mode 100644
index 0000000..23badda
--- /dev/null
+++ b/src/sidebar/Branch.vala
@@ -0,0 +1,450 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public delegate bool Locator<G>(G item);
+
+public class Sidebar.Branch : Object {
+ [Flags]
+ public enum Options {
+ NONE = 0,
+ HIDE_IF_EMPTY,
+ AUTO_OPEN_ON_NEW_CHILD,
+ STARTUP_EXPAND_TO_FIRST_CHILD,
+ STARTUP_OPEN_GROUPING;
+
+ public bool is_hide_if_empty() {
+ return (this & HIDE_IF_EMPTY) != 0;
+ }
+
+ public bool is_auto_open_on_new_child() {
+ return (this & AUTO_OPEN_ON_NEW_CHILD) != 0;
+ }
+
+ public bool is_startup_expand_to_first_child() {
+ return (this & STARTUP_EXPAND_TO_FIRST_CHILD) != 0;
+ }
+
+ public bool is_startup_open_grouping() {
+ return (this & STARTUP_OPEN_GROUPING) != 0;
+ }
+ }
+
+ private class Node {
+ public delegate void PruneCallback(Node node);
+
+ public delegate void ChildrenReorderedCallback(Node node);
+
+ public Sidebar.Entry entry;
+ public weak Node? parent;
+ public CompareDataFunc<Sidebar.Entry> comparator;
+ public Gee.SortedSet<Node>? children = null;
+
+ public Node(Sidebar.Entry entry, Node? parent,
+ owned CompareDataFunc<Sidebar.Entry> comparator) {
+ this.entry = entry;
+ this.parent = parent;
+ this.comparator = (owned) comparator;
+ }
+
+ private static int comparator_wrapper(Node? a, Node? b) {
+ if (a == b)
+ return 0;
+
+ assert(a.parent == b.parent);
+
+ return a.parent.comparator(a.entry, b.entry);
+ }
+
+ public bool has_children() {
+ return (children != null && children.size > 0);
+ }
+
+ public void add_child(Node child) {
+ child.parent = this;
+
+ if (children == null)
+ children = new Gee.TreeSet<Node>(comparator_wrapper);
+
+ bool added = children.add(child);
+ assert(added);
+ }
+
+ public void remove_child(Node child) {
+ assert(children != null);
+
+ Gee.SortedSet<Node> new_children = new Gee.TreeSet<Node>(comparator_wrapper);
+
+ // For similar reasons as in reorder_child(), can't rely on Gee.TreeSet to locate this
+ // node because we need reference equality.
+ bool found = false;
+ foreach (Node c in children) {
+ if (c != child)
+ new_children.add(c);
+ else
+ found = true;
+ }
+
+ assert(found);
+
+ if (new_children.size != 0)
+ children = new_children;
+ else
+ children = null;
+
+ child.parent = null;
+ }
+
+ public void prune_children(PruneCallback cb) {
+ if (children == null)
+ return;
+
+ foreach (Node child in children)
+ child.prune_children(cb);
+
+ Gee.SortedSet<Node> old_children = children;
+ children = null;
+
+ // Although this could've been done in the prior loop, it means notifying that
+ // a child has been removed prior to it being removed; this can cause problem
+ // if a signal handler calls back into the Tree to examine/add/remove nodes.
+ foreach (Node child in old_children)
+ cb(child);
+ }
+
+ // This returns the index of the Node purely by reference equality, making it useful if
+ // the criteria the Node is sorted upon has changed.
+ public int index_of_by_reference(Node child) {
+ if (children == null)
+ return -1;
+
+ int index = 0;
+ foreach (Node c in children) {
+ if (child == c)
+ return index;
+
+ index++;
+ }
+
+ return -1;
+ }
+
+ // Returns true if child moved when reordered.
+ public bool reorder_child(Node child) {
+ assert(children != null);
+
+ int old_index = index_of_by_reference(child);
+ assert(old_index >= 0);
+
+ // Because Gee.SortedSet uses the comparator for equality, if the Node's entry state
+ // has changed in such a way that the item is no longer sorted properly, the SortedSet's
+ // search and remove methods are useless. Makes no difference if children.remove() is
+ // called or the set is manually iterated over and removed via the Iterator -- a
+ // tree search is performed and the child will not be found. Only easy solution is
+ // to rebuild a new SortedSet and see if the child has moved.
+ Gee.SortedSet<Node> new_children = new Gee.TreeSet<Node>(comparator_wrapper);
+ bool added = new_children.add_all(children);
+ assert(added);
+
+ children = new_children;
+
+ int new_index = index_of_by_reference(child);
+ assert(new_index >= 0);
+
+ return (old_index != new_index);
+ }
+
+ public void reorder_children(bool recursive, ChildrenReorderedCallback cb) {
+ if (children == null)
+ return;
+
+ Gee.SortedSet<Node> reordered = new Gee.TreeSet<Node>(comparator_wrapper);
+ reordered.add_all(children);
+ children = reordered;
+
+ if (recursive) {
+ foreach (Node child in children)
+ child.reorder_children(true, cb);
+ }
+
+ cb(this);
+ }
+
+ public void change_comparator(owned CompareDataFunc<Sidebar.Entry> comparator, bool recursive,
+ ChildrenReorderedCallback cb) {
+ this.comparator = (owned) comparator;
+
+ // reorder children, but need to do manual recursion to set comparator
+ reorder_children(false, cb);
+
+ if (recursive) {
+ foreach (Node child in children)
+ child.change_comparator((owned) comparator, true, cb);
+ }
+ }
+ }
+
+ private Node root;
+ private Options options;
+ private bool shown = true;
+ private CompareDataFunc<Sidebar.Entry> default_comparator;
+ private Gee.HashMap<Sidebar.Entry, Node> map = new Gee.HashMap<Sidebar.Entry, Node>();
+
+ public signal void entry_added(Sidebar.Entry entry);
+
+ public signal void entry_removed(Sidebar.Entry entry);
+
+ public signal void entry_moved(Sidebar.Entry entry);
+
+ public signal void entry_reparented(Sidebar.Entry entry, Sidebar.Entry old_parent);
+
+ public signal void children_reordered(Sidebar.Entry entry);
+
+ public signal void show_branch(bool show);
+
+ public Branch(Sidebar.Entry root, Options options,
+ owned CompareDataFunc<Sidebar.Entry> default_comparator,
+ owned CompareDataFunc<Sidebar.Entry>? root_comparator = null) {
+ this.default_comparator = (owned) default_comparator;
+
+ CompareDataFunc<Sidebar.Entry>? broken_ternary_workaround;
+
+ if (root_comparator != null)
+ broken_ternary_workaround = (owned) root_comparator;
+ else
+ broken_ternary_workaround = (owned) default_comparator;
+
+ this.root = new Node(root, null, (owned) broken_ternary_workaround);
+ this.options = options;
+
+ map.set(root, this.root);
+
+ if (options.is_hide_if_empty())
+ set_show_branch(false);
+ }
+
+ public Sidebar.Entry get_root() {
+ return root.entry;
+ }
+
+ public void set_show_branch(bool shown) {
+ if (this.shown == shown)
+ return;
+
+ this.shown = shown;
+ show_branch(shown);
+ }
+
+ public bool get_show_branch() {
+ return shown;
+ }
+
+ public bool is_auto_open_on_new_child() {
+ return options.is_auto_open_on_new_child();
+ }
+
+ public bool is_startup_expand_to_first_child() {
+ return options.is_startup_expand_to_first_child();
+ }
+
+ public bool is_startup_open_grouping() {
+ return options.is_startup_open_grouping();
+ }
+
+ public void graft(Sidebar.Entry parent, Sidebar.Entry entry,
+ owned CompareDataFunc<Sidebar.Entry>? comparator = null) {
+ assert(map.has_key(parent));
+ assert(!map.has_key(entry));
+
+ if (options.is_hide_if_empty())
+ set_show_branch(true);
+
+ Node parent_node = map.get(parent);
+
+ CompareDataFunc<Sidebar.Entry>? broken_ternary_workaround;
+
+ if (comparator != null)
+ broken_ternary_workaround = (owned) comparator;
+ else
+ broken_ternary_workaround = (owned) default_comparator;
+
+ Node entry_node = new Node(entry, parent_node, (owned) broken_ternary_workaround);
+
+ parent_node.add_child(entry_node);
+ map.set(entry, entry_node);
+
+ entry_added(entry);
+ }
+
+ // Cannot prune the root. The Branch should simply be removed from the Tree.
+ public void prune(Sidebar.Entry entry) {
+ assert(entry != root.entry);
+ assert(map.has_key(entry));
+
+ Node entry_node = map.get(entry);
+
+ entry_node.prune_children(prune_callback);
+
+ assert(entry_node.parent != null);
+ entry_node.parent.remove_child(entry_node);
+
+ bool removed = map.unset(entry);
+ assert(removed);
+
+ entry_removed(entry);
+
+ if (options.is_hide_if_empty() && !root.has_children())
+ set_show_branch(false);
+ }
+
+ // Cannot reparent the root.
+ public void reparent(Sidebar.Entry new_parent, Sidebar.Entry entry) {
+ assert(entry != root.entry);
+ assert(map.has_key(entry));
+ assert(map.has_key(new_parent));
+
+ Node entry_node = map.get(entry);
+ Node new_parent_node = map.get(new_parent);
+
+ assert(entry_node.parent != null);
+ Sidebar.Entry old_parent = entry_node.parent.entry;
+
+ entry_node.parent.remove_child(entry_node);
+ new_parent_node.add_child(entry_node);
+
+ entry_reparented(entry, old_parent);
+ }
+
+ public bool has_entry(Sidebar.Entry entry) {
+ return (root.entry == entry || map.has_key(entry));
+ }
+
+ // Call when a value related to the comparison of this entry has changed. The root cannot be
+ // reordered.
+ public void reorder(Sidebar.Entry entry) {
+ assert(entry != root.entry);
+
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+
+ assert(entry_node.parent != null);
+ if (entry_node.parent.reorder_child(entry_node))
+ entry_moved(entry);
+ }
+
+ // Call when the entire tree needs to be reordered.
+ public void reorder_all() {
+ root.reorder_children(true, children_reordered_callback);
+ }
+
+ // Call when the children of the entry need to be reordered.
+ public void reorder_children(Sidebar.Entry entry, bool recursive) {
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+
+ entry_node.reorder_children(recursive, children_reordered_callback);
+ }
+
+ public void change_all_comparators(owned CompareDataFunc<Sidebar.Entry>? comparator) {
+ root.change_comparator((owned) comparator, true, children_reordered_callback);
+ }
+
+ public void change_comparator(Sidebar.Entry entry, bool recursive,
+ owned CompareDataFunc<Sidebar.Entry>? comparator) {
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+
+ entry_node.change_comparator((owned) comparator, recursive, children_reordered_callback);
+ }
+
+ public int get_child_count(Sidebar.Entry parent) {
+ Node? parent_node = map.get(parent);
+ assert(parent_node != null);
+
+ return (parent_node.children != null) ? parent_node.children.size : 0;
+ }
+
+ // Gets a snapshot of the children of the entry; this list will not be changed as the
+ // branch is updated.
+ public Gee.List<Sidebar.Entry>? get_children(Sidebar.Entry parent) {
+ assert(map.has_key(parent));
+
+ Node parent_node = map.get(parent);
+ if (parent_node.children == null)
+ return null;
+
+ Gee.List<Sidebar.Entry> child_entries = new Gee.ArrayList<Sidebar.Entry>();
+ foreach (Node child in parent_node.children)
+ child_entries.add(child.entry);
+
+ return child_entries;
+ }
+
+ public Sidebar.Entry? find_first_child(Sidebar.Entry parent, Locator<Sidebar.Entry> locator) {
+ Node? parent_node = map.get(parent);
+ assert(parent_node != null);
+
+ if (parent_node.children == null)
+ return null;
+
+ foreach (Node child in parent_node.children) {
+ if (locator(child.entry))
+ return child.entry;
+ }
+
+ return null;
+ }
+
+ // Returns null if entry is root;
+ public Sidebar.Entry? get_parent(Sidebar.Entry entry) {
+ if (entry == root.entry)
+ return null;
+
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+ assert(entry_node.parent != null);
+
+ return entry_node.parent.entry;
+ }
+
+ // Returns null if entry is root;
+ public Sidebar.Entry? get_previous_sibling(Sidebar.Entry entry) {
+ if (entry == root.entry)
+ return null;
+
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+ assert(entry_node.parent != null);
+ assert(entry_node.parent.children != null);
+
+ Node? sibling = entry_node.parent.children.lower(entry_node);
+
+ return (sibling != null) ? sibling.entry : null;
+ }
+
+ // Returns null if entry is root;
+ public Sidebar.Entry? get_next_sibling(Sidebar.Entry entry) {
+ if (entry == root.entry)
+ return null;
+
+ Node? entry_node = map.get(entry);
+ assert(entry_node != null);
+ assert(entry_node.parent != null);
+ assert(entry_node.parent.children != null);
+
+ Node? sibling = entry_node.parent.children.higher(entry_node);
+
+ return (sibling != null) ? sibling.entry : null;
+ }
+
+ private void prune_callback(Node node) {
+ entry_removed(node.entry);
+ }
+
+ private void children_reordered_callback(Node node) {
+ children_reordered(node.entry);
+ }
+}
+
diff --git a/src/sidebar/Entry.vala b/src/sidebar/Entry.vala
new file mode 100644
index 0000000..4162f21
--- /dev/null
+++ b/src/sidebar/Entry.vala
@@ -0,0 +1,70 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public interface Sidebar.Entry : Object {
+ public signal void sidebar_tooltip_changed(string? tooltip);
+
+ public signal void sidebar_icon_changed(Icon? icon);
+
+ public abstract string get_sidebar_name();
+
+ public abstract string? get_sidebar_tooltip();
+
+ public abstract Icon? get_sidebar_icon();
+
+ public abstract string to_string();
+
+ internal virtual void grafted(Sidebar.Tree tree) {
+ }
+
+ internal virtual void pruned(Sidebar.Tree tree) {
+ }
+}
+
+public interface Sidebar.ExpandableEntry : Sidebar.Entry {
+ public signal void sidebar_open_closed_icons_changed(Icon? open, Icon? closed);
+
+ public abstract Icon? get_sidebar_open_icon();
+
+ public abstract Icon? get_sidebar_closed_icon();
+
+ public abstract bool expand_on_select();
+}
+
+public interface Sidebar.SelectableEntry : Sidebar.Entry {
+}
+
+public interface Sidebar.PageRepresentative : Sidebar.Entry, Sidebar.SelectableEntry {
+ // Fired after the page has been created
+ public signal void page_created(Page page);
+
+ // Fired before the page is destroyed.
+ public signal void destroying_page(Page page);
+
+ public abstract bool has_page();
+
+ public abstract Page get_page();
+}
+
+public interface Sidebar.RenameableEntry : Sidebar.Entry {
+ public signal void sidebar_name_changed(string name);
+
+ public abstract void rename(string new_name);
+}
+
+public interface Sidebar.DestroyableEntry : Sidebar.Entry {
+ public abstract void destroy_source();
+}
+
+public interface Sidebar.InternalDropTargetEntry : Sidebar.Entry {
+ // Returns true if drop was successful
+ public abstract bool internal_drop_received(Gee.List<MediaSource> sources);
+ public abstract bool internal_drop_received_arbitrary(Gtk.SelectionData data);
+}
+
+public interface Sidebar.InternalDragSourceEntry : Sidebar.Entry {
+ public abstract void prepare_selection_data(Gtk.SelectionData data);
+}
diff --git a/src/sidebar/Sidebar.vala b/src/sidebar/Sidebar.vala
new file mode 100644
index 0000000..8f6904b
--- /dev/null
+++ b/src/sidebar/Sidebar.vala
@@ -0,0 +1,16 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Sidebar {
+
+public void init() throws Error {
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/sidebar/Tree.vala b/src/sidebar/Tree.vala
new file mode 100644
index 0000000..37da7e0
--- /dev/null
+++ b/src/sidebar/Tree.vala
@@ -0,0 +1,1175 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Sidebar.Tree : Gtk.TreeView {
+ public const int ICON_SIZE = 16;
+
+ // Only one ExternalDropHandler can be registered with the Tree; it's responsible for completing
+ // the "drag-data-received" signal properly.
+ public delegate void ExternalDropHandler(Gdk.DragContext context, Sidebar.Entry? entry,
+ Gtk.SelectionData data, uint info, uint time);
+
+ private class EntryWrapper : Object {
+ public Sidebar.Entry entry;
+ public Gtk.TreeRowReference row;
+
+ public EntryWrapper(Gtk.TreeModel model, Sidebar.Entry entry, Gtk.TreePath path) {
+ this.entry = entry;
+ this.row = new Gtk.TreeRowReference(model, path);
+ }
+
+ public Gtk.TreePath get_path() {
+ return row.get_path();
+ }
+
+ public Gtk.TreeIter get_iter() {
+ Gtk.TreeIter iter;
+ bool valid = row.get_model().get_iter(out iter, get_path());
+ assert(valid);
+
+ return iter;
+ }
+ }
+
+ private class RootWrapper : EntryWrapper {
+ public int root_position;
+
+ public RootWrapper(Gtk.TreeModel model, Sidebar.Entry entry, Gtk.TreePath path, int root_position)
+ requires (root_position >= 0) {
+ base (model, entry, path);
+
+ this.root_position = root_position;
+ }
+ }
+
+ private enum Columns {
+ NAME,
+ TOOLTIP,
+ WRAPPER,
+ PIXBUF,
+ CLOSED_PIXBUF,
+ OPEN_PIXBUF,
+ N_COLUMNS
+ }
+
+ private Gtk.TreeStore store = new Gtk.TreeStore(Columns.N_COLUMNS,
+ typeof (string), // NAME
+ typeof (string?), // TOOLTIP
+ typeof (EntryWrapper), // WRAPPER
+ typeof (Gdk.Pixbuf?), // PIXBUF
+ typeof (Gdk.Pixbuf?), // CLOSED_PIXBUF
+ typeof (Gdk.Pixbuf?) // OPEN_PIXBUF
+ );
+
+ private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.IconTheme icon_theme;
+ private Gtk.CellRendererText text_renderer;
+ private unowned ExternalDropHandler drop_handler;
+ private Gtk.Entry? text_entry = null;
+ private Gee.HashMap<string, Gdk.Pixbuf> icon_cache = new Gee.HashMap<string, Gdk.Pixbuf>();
+ private Gee.HashMap<Sidebar.Entry, EntryWrapper> entry_map =
+ new Gee.HashMap<Sidebar.Entry, EntryWrapper>();
+ private Gee.HashMap<Sidebar.Branch, int> branches = new Gee.HashMap<Sidebar.Branch, int>();
+ private int editing_disabled = 0;
+ private bool mask_entry_selected_signal = false;
+ private weak EntryWrapper? selected_wrapper = null;
+ private Gtk.Menu? default_context_menu = null;
+ private bool is_internal_drag_in_progress = false;
+ private Sidebar.Entry? internal_drag_source_entry = null;
+
+ public signal void entry_selected(Sidebar.SelectableEntry selectable);
+
+ public signal void selected_entry_removed(Sidebar.SelectableEntry removed);
+
+ public signal void branch_added(Sidebar.Branch branch);
+
+ public signal void branch_removed(Sidebar.Branch branch);
+
+ public signal void branch_shown(Sidebar.Branch branch, bool shown);
+
+ public signal void page_created(Sidebar.PageRepresentative entry, Page page);
+
+ public signal void destroying_page(Sidebar.PageRepresentative entry, Page page);
+
+ public Tree(Gtk.TargetEntry[] target_entries, Gdk.DragAction actions,
+ ExternalDropHandler drop_handler) {
+ set_model(store);
+
+ Gtk.TreeViewColumn text_column = new Gtk.TreeViewColumn();
+ text_column.set_sizing(Gtk.TreeViewColumnSizing.FIXED);
+ Gtk.CellRendererPixbuf icon_renderer = new Gtk.CellRendererPixbuf();
+ text_column.pack_start(icon_renderer, false);
+ text_column.add_attribute(icon_renderer, "pixbuf", Columns.PIXBUF);
+ text_column.add_attribute(icon_renderer, "pixbuf_expander_closed", Columns.CLOSED_PIXBUF);
+ text_column.add_attribute(icon_renderer, "pixbuf_expander_open", Columns.OPEN_PIXBUF);
+ text_renderer = new Gtk.CellRendererText();
+ text_renderer.editing_canceled.connect(on_editing_canceled);
+ text_renderer.editing_started.connect(on_editing_started);
+ text_column.pack_start(text_renderer, true);
+ text_column.add_attribute(text_renderer, "markup", Columns.NAME);
+ append_column(text_column);
+
+ Gtk.CellRendererText invisitext = new Gtk.CellRendererText();
+ Gtk.TreeViewColumn page_holder = new Gtk.TreeViewColumn();
+ page_holder.pack_start(invisitext, true);
+ page_holder.visible = false;
+ append_column(page_holder);
+
+ set_headers_visible(false);
+ set_enable_search(false);
+ set_rules_hint(false);
+ set_show_expanders(true);
+ set_reorderable(false);
+ set_enable_tree_lines(false);
+ set_grid_lines(Gtk.TreeViewGridLines.NONE);
+ set_tooltip_column(Columns.TOOLTIP);
+
+ Gtk.TreeSelection selection = get_selection();
+ selection.set_mode(Gtk.SelectionMode.BROWSE);
+ selection.set_select_function(on_selection);
+
+ // It Would Be Nice if the target entries and actions were gleaned by querying each
+ // Sidebar.Entry as it was added, but that's a tad too complicated for our needs
+ // currently
+ enable_model_drag_dest(target_entries, actions);
+
+ Gtk.TargetEntry[] source_entries = new Gtk.TargetEntry[0];
+ source_entries += target_entries[LibraryWindow.TargetType.TAG_PATH];
+ enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, source_entries,
+ Gdk.DragAction.COPY);
+
+ this.drop_handler = drop_handler;
+
+ popup_menu.connect(on_context_menu_keypress);
+
+ icon_theme = Resources.get_icon_theme_engine();
+ icon_theme.changed.connect(on_theme_change);
+
+ setup_default_context_menu();
+
+ drag_begin.connect(on_drag_begin);
+ drag_end.connect(on_drag_end);
+ drag_motion.connect(on_drag_motion);
+ }
+
+ ~Tree() {
+ text_renderer.editing_canceled.disconnect(on_editing_canceled);
+ text_renderer.editing_started.disconnect(on_editing_started);
+ icon_theme.changed.disconnect(on_theme_change);
+ }
+
+ private void on_drag_begin(Gdk.DragContext ctx) {
+ is_internal_drag_in_progress = true;
+ }
+
+ private void on_drag_end(Gdk.DragContext ctx) {
+ is_internal_drag_in_progress = false;
+ internal_drag_source_entry = null;
+ }
+
+ private bool on_drag_motion (Gdk.DragContext context, int x, int y, uint time_) {
+ if (is_internal_drag_in_progress && internal_drag_source_entry == null) {
+ Gtk.TreePath? path;
+ Gtk.TreeViewDropPosition position;
+ get_dest_row_at_pos(x, y, out path, out position);
+
+ if (path != null) {
+ EntryWrapper wrapper = get_wrapper_at_path(path);
+ if (wrapper != null)
+ internal_drag_source_entry = wrapper.entry;
+ }
+ }
+
+ return false;
+ }
+
+ private void setup_default_context_menu() {
+ Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
+ new_search.label = _("Ne_w Saved Search...");
+ actions += new_search;
+
+ Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
+ new_tag.label = _("New _Tag...");
+ actions += new_tag;
+
+ group.add_actions(actions, this);
+ ui.insert_action_group(group, 0);
+
+ File ui_file = Resources.get_ui("sidebar_default_context.ui");
+ try {
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ AppWindow.error_message("Error loading UI file %s: %s".printf(
+ ui_file.get_path(), err.message));
+ Application.get_instance().panic();
+ }
+ default_context_menu = (Gtk.Menu) ui.get_widget("/SidebarDefaultContextMenu");
+
+ ui.ensure_update();
+ }
+
+ private bool has_wrapper(Sidebar.Entry entry) {
+ return entry_map.has_key(entry);
+ }
+
+ private EntryWrapper? get_wrapper(Sidebar.Entry entry) {
+ EntryWrapper? wrapper = entry_map.get(entry);
+ if (wrapper == null)
+ warning("Entry %s not found in sidebar", entry.to_string());
+
+ return wrapper;
+ }
+
+ private EntryWrapper? get_wrapper_at_iter(Gtk.TreeIter iter) {
+ Value val;
+ store.get_value(iter, Columns.WRAPPER, out val);
+
+ EntryWrapper? wrapper = (EntryWrapper?) val;
+ if (wrapper == null)
+ message("No entry found in sidebar at %s", store.get_path(iter).to_string());
+
+ return wrapper;
+ }
+
+ private EntryWrapper? get_wrapper_at_path(Gtk.TreePath path) {
+ Gtk.TreeIter iter;
+ if (!store.get_iter(out iter, path)) {
+ message("No entry found in sidebar at %s", path.to_string());
+
+ return null;
+ }
+
+ return get_wrapper_at_iter(iter);
+ }
+
+ // Note that this method will result in the "entry-selected" signal to fire if mask_signal
+ // is set to false.
+ public bool place_cursor(Sidebar.Entry entry, bool mask_signal) {
+ if (!expand_to_entry(entry))
+ return false;
+
+ EntryWrapper? wrapper = get_wrapper(entry);
+ if (wrapper == null)
+ return false;
+
+ get_selection().select_path(wrapper.get_path());
+
+ mask_entry_selected_signal = mask_signal;
+ set_cursor(wrapper.get_path(), null, false);
+ mask_entry_selected_signal = false;
+
+ return scroll_to_entry(entry);
+ }
+
+ public bool is_selected(Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+
+ return (wrapper != null) ? get_selection().path_is_selected(wrapper.get_path()) : false;
+ }
+
+ public bool is_any_selected() {
+ return get_selection().count_selected_rows() != 0;
+ }
+
+ private Gtk.TreePath? get_selected_path() {
+ Gtk.TreeModel model;
+ GLib.List<Gtk.TreePath> rows = get_selection().get_selected_rows(out model);
+ assert(rows.length() == 0 || rows.length() == 1);
+
+ return rows.length() != 0 ? rows.nth_data(0) : null;
+ }
+
+ public override void cursor_changed() {
+ Gtk.TreePath? path = get_selected_path();
+ if (path == null) {
+ if (base.cursor_changed != null)
+ base.cursor_changed();
+
+ return;
+ }
+
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+
+ selected_wrapper = wrapper;
+
+ if (editing_disabled == 0 && wrapper != null)
+ text_renderer.editable = wrapper.entry is Sidebar.RenameableEntry;
+
+ if (wrapper != null && !mask_entry_selected_signal) {
+ Sidebar.SelectableEntry? selectable = wrapper.entry as Sidebar.SelectableEntry;
+ if (selectable != null)
+ entry_selected(selectable);
+ }
+
+ if (base.cursor_changed != null)
+ base.cursor_changed();
+ }
+
+ public void disable_editing() {
+ if (editing_disabled++ == 0)
+ text_renderer.editable = false;
+ }
+
+ public void enable_editing() {
+ Gtk.TreePath? path = get_selected_path();
+ if (path != null && editing_disabled > 0 && --editing_disabled == 0) {
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+ text_renderer.editable = (wrapper != null && (wrapper.entry is Sidebar.RenameableEntry));
+ }
+ }
+
+ public void toggle_branch_expansion(Gtk.TreePath path, bool expand_all) {
+ if (is_row_expanded(path))
+ collapse_row(path);
+ else
+ expand_row(path, expand_all);
+ }
+
+ public bool expand_to_entry(Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ if (wrapper == null)
+ return false;
+
+ expand_to_path(wrapper.get_path());
+
+ return true;
+ }
+
+ public void expand_to_first_child(Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ if (wrapper == null)
+ return;
+
+ Gtk.TreePath path = wrapper.get_path();
+
+ Gtk.TreeIter iter;
+ while (store.get_iter(out iter, path)) {
+ if (!store.iter_has_child(iter))
+ break;
+
+ path.down();
+ }
+
+ expand_to_path(path);
+ }
+
+ public void graft(Sidebar.Branch branch, int position) requires (position >= 0) {
+ assert(!branches.has_key(branch));
+
+ branches.set(branch, position);
+
+ if (branch.get_show_branch()) {
+ associate_branch(branch);
+
+ if (branch.is_startup_expand_to_first_child())
+ expand_to_first_child(branch.get_root());
+
+ if (branch.is_startup_open_grouping())
+ expand_to_entry(branch.get_root());
+ }
+
+ branch.entry_added.connect(on_branch_entry_added);
+ branch.entry_removed.connect(on_branch_entry_removed);
+ branch.entry_moved.connect(on_branch_entry_moved);
+ branch.entry_reparented.connect(on_branch_entry_reparented);
+ branch.children_reordered.connect(on_branch_children_reordered);
+ branch.show_branch.connect(on_show_branch);
+
+ branch_added(branch);
+ }
+
+ // This is used to associate a known branch with the TreeView.
+ private void associate_branch(Sidebar.Branch branch) {
+ assert(branches.has_key(branch));
+
+ int position = branches.get(branch);
+
+ Gtk.TreeIter? insertion_iter = null;
+
+ // search current roots for insertion point
+ Gtk.TreeIter iter;
+ bool found = store.get_iter_first(out iter);
+ while (found) {
+ RootWrapper? root_wrapper = get_wrapper_at_iter(iter) as RootWrapper;
+ assert(root_wrapper != null);
+
+ if (position < root_wrapper.root_position) {
+ store.insert_before(out insertion_iter, null, iter);
+
+ break;
+ }
+
+ found = store.iter_next(ref iter);
+ }
+
+ // if not found, append
+ if (insertion_iter == null)
+ store.append(out insertion_iter, null);
+
+ associate_wrapper(insertion_iter,
+ new RootWrapper(store, branch.get_root(), store.get_path(insertion_iter), position));
+
+ // mirror the branch's initial contents from below the root down, let the signals handle
+ // future work
+ associate_children(branch, branch.get_root(), insertion_iter);
+ }
+
+ private void associate_children(Sidebar.Branch branch, Sidebar.Entry parent,
+ Gtk.TreeIter parent_iter) {
+ Gee.List<Sidebar.Entry>? children = branch.get_children(parent);
+ if (children == null)
+ return;
+
+ foreach (Sidebar.Entry child in children) {
+ Gtk.TreeIter append_iter;
+ store.append(out append_iter, parent_iter);
+
+ associate_entry(append_iter, child);
+ associate_children(branch, child, append_iter);
+ }
+ }
+
+ private void associate_entry(Gtk.TreeIter assoc_iter, Sidebar.Entry entry) {
+ associate_wrapper(assoc_iter, new EntryWrapper(store, entry, store.get_path(assoc_iter)));
+ }
+
+ private void associate_wrapper(Gtk.TreeIter assoc_iter, EntryWrapper wrapper) {
+ Sidebar.Entry entry = wrapper.entry;
+
+ assert(!entry_map.has_key(entry));
+ entry_map.set(entry, wrapper);
+
+ store.set(assoc_iter, Columns.NAME, guarded_markup_escape_text(entry.get_sidebar_name()));
+ store.set(assoc_iter, Columns.TOOLTIP, guarded_markup_escape_text(entry.get_sidebar_tooltip()));
+ store.set(assoc_iter, Columns.WRAPPER, wrapper);
+ load_entry_icons(assoc_iter);
+
+ entry.sidebar_tooltip_changed.connect(on_sidebar_tooltip_changed);
+ entry.sidebar_icon_changed.connect(on_sidebar_icon_changed);
+
+ Sidebar.PageRepresentative? pageable = entry as Sidebar.PageRepresentative;
+ if (pageable != null) {
+ pageable.page_created.connect(on_sidebar_page_created);
+ pageable.destroying_page.connect(on_sidebar_destroying_page);
+ }
+
+ Sidebar.RenameableEntry? renameable = entry as Sidebar.RenameableEntry;
+ if (renameable != null)
+ renameable.sidebar_name_changed.connect(on_sidebar_name_changed);
+
+ Sidebar.ExpandableEntry? expandable = entry as Sidebar.ExpandableEntry;
+ if (expandable != null)
+ expandable.sidebar_open_closed_icons_changed.connect(on_sidebar_open_closed_icons_changed);
+
+ entry.grafted(this);
+ }
+
+ private EntryWrapper reparent_wrapper(Gtk.TreeIter new_iter, EntryWrapper current_wrapper) {
+ Sidebar.Entry entry = current_wrapper.entry;
+
+ bool removed = entry_map.unset(entry);
+ assert(removed);
+
+ EntryWrapper new_wrapper = new EntryWrapper(store, entry, store.get_path(new_iter));
+ entry_map.set(entry, new_wrapper);
+
+ store.set(new_iter, Columns.NAME, guarded_markup_escape_text(entry.get_sidebar_name()));
+ store.set(new_iter, Columns.TOOLTIP, guarded_markup_escape_text(entry.get_sidebar_tooltip()));
+ store.set(new_iter, Columns.WRAPPER, new_wrapper);
+ load_entry_icons(new_iter);
+
+ return new_wrapper;
+ }
+
+ public void prune(Sidebar.Branch branch) {
+ assert(branches.has_key(branch));
+
+ if (has_wrapper(branch.get_root()))
+ disassociate_branch(branch);
+
+ branch.entry_added.disconnect(on_branch_entry_added);
+ branch.entry_removed.disconnect(on_branch_entry_removed);
+ branch.entry_moved.disconnect(on_branch_entry_moved);
+ branch.entry_reparented.disconnect(on_branch_entry_reparented);
+ branch.children_reordered.disconnect(on_branch_children_reordered);
+ branch.show_branch.disconnect(on_show_branch);
+
+ bool removed = branches.unset(branch);
+ assert(removed);
+
+ branch_removed(branch);
+ }
+
+ private void disassociate_branch(Sidebar.Branch branch) {
+ RootWrapper? root_wrapper = get_wrapper(branch.get_root()) as RootWrapper;
+ assert(root_wrapper != null);
+
+ disassociate_wrapper_and_signal(root_wrapper, false);
+ }
+
+ // A wrapper for disassociate_wrapper() (?!?) that fires the "selected-entry-removed" signal if
+ // condition exists
+ private void disassociate_wrapper_and_signal(EntryWrapper wrapper, bool only_children) {
+ bool selected = is_selected(wrapper.entry);
+
+ disassociate_wrapper(wrapper, only_children);
+
+ if (selected) {
+ Sidebar.SelectableEntry? selectable = wrapper.entry as Sidebar.SelectableEntry;
+ assert(selectable != null);
+
+ selected_entry_removed(selectable);
+ }
+ }
+
+ private void disassociate_wrapper(EntryWrapper wrapper, bool only_children) {
+ Gee.ArrayList<EntryWrapper> children = new Gee.ArrayList<EntryWrapper>();
+
+ Gtk.TreeIter child_iter;
+ bool found = store.iter_children(out child_iter, wrapper.get_iter());
+ while (found) {
+ EntryWrapper? child_wrapper = get_wrapper_at_iter(child_iter);
+ assert(child_wrapper != null);
+
+ children.add(child_wrapper);
+
+ found = store.iter_next(ref child_iter);
+ }
+
+ foreach (EntryWrapper child_wrapper in children)
+ disassociate_wrapper(child_wrapper, false);
+
+ if (only_children)
+ return;
+
+ Gtk.TreeIter iter = wrapper.get_iter();
+ store.remove(ref iter);
+
+ if (selected_wrapper == wrapper)
+ selected_wrapper = null;
+
+ Sidebar.Entry entry = wrapper.entry;
+
+ entry.pruned(this);
+
+ entry.sidebar_tooltip_changed.disconnect(on_sidebar_tooltip_changed);
+ entry.sidebar_icon_changed.disconnect(on_sidebar_icon_changed);
+
+ Sidebar.PageRepresentative? pageable = entry as Sidebar.PageRepresentative;
+ if (pageable != null) {
+ pageable.page_created.disconnect(on_sidebar_page_created);
+ pageable.destroying_page.disconnect(on_sidebar_destroying_page);
+ }
+
+ Sidebar.RenameableEntry? renameable = entry as Sidebar.RenameableEntry;
+ if (renameable != null)
+ renameable.sidebar_name_changed.disconnect(on_sidebar_name_changed);
+
+ Sidebar.ExpandableEntry? expandable = entry as Sidebar.ExpandableEntry;
+ if (expandable != null)
+ expandable.sidebar_open_closed_icons_changed.disconnect(on_sidebar_open_closed_icons_changed);
+
+ bool removed = entry_map.unset(entry);
+ assert(removed);
+ }
+
+ private void on_branch_entry_added(Sidebar.Branch branch, Sidebar.Entry entry) {
+ Sidebar.Entry? parent = branch.get_parent(entry);
+ assert(parent != null);
+
+ EntryWrapper? parent_wrapper = get_wrapper(parent);
+ assert(parent_wrapper != null);
+
+ Gtk.TreeIter insertion_iter;
+ Sidebar.Entry? next = branch.get_next_sibling(entry);
+ if (next != null) {
+ EntryWrapper next_wrapper = get_wrapper(next);
+
+ // insert before the next sibling in this branch level
+ store.insert_before(out insertion_iter, parent_wrapper.get_iter(), next_wrapper.get_iter());
+ } else {
+ // append to the bottom of this branch level
+ store.append(out insertion_iter, parent_wrapper.get_iter());
+ }
+
+ associate_entry(insertion_iter, entry);
+ associate_children(branch, entry, insertion_iter);
+
+ if (branch.is_auto_open_on_new_child())
+ expand_to_entry(entry);
+ }
+
+ private void on_branch_entry_removed(Sidebar.Branch branch, Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+ assert(!(wrapper is RootWrapper));
+
+ disassociate_wrapper_and_signal(wrapper, false);
+ }
+
+ private void on_branch_entry_moved(Sidebar.Branch branch, Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+ assert(!(wrapper is RootWrapper));
+
+ // null means entry is now at the top of the sibling list
+ Gtk.TreeIter? prev_iter = null;
+ Sidebar.Entry? prev = branch.get_previous_sibling(entry);
+ if (prev != null) {
+ EntryWrapper? prev_wrapper = get_wrapper(prev);
+ assert(prev_wrapper != null);
+
+ prev_iter = prev_wrapper.get_iter();
+ }
+
+ Gtk.TreeIter entry_iter = wrapper.get_iter();
+ store.move_after(ref entry_iter, prev_iter);
+ }
+
+ private void on_branch_entry_reparented(Sidebar.Branch branch, Sidebar.Entry entry,
+ Sidebar.Entry old_parent) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+ assert(!(wrapper is RootWrapper));
+
+ bool selected = (get_current_path().compare(wrapper.get_path()) == 0);
+
+ // remove from current position in tree
+ Gtk.TreeIter iter = wrapper.get_iter();
+ store.remove(ref iter);
+
+ Sidebar.Entry? parent = branch.get_parent(entry);
+ assert(parent != null);
+
+ EntryWrapper? parent_wrapper = get_wrapper(parent);
+ assert(parent_wrapper != null);
+
+ // null means entry is now at the top of the sibling list
+ Gtk.TreeIter? prev_iter = null;
+ Sidebar.Entry? prev = branch.get_previous_sibling(entry);
+ if (prev != null) {
+ EntryWrapper? prev_wrapper = get_wrapper(prev);
+ assert(prev_wrapper != null);
+
+ prev_iter = prev_wrapper.get_iter();
+ }
+
+ Gtk.TreeIter new_iter;
+ store.insert_after(out new_iter, parent_wrapper.get_iter(), prev_iter);
+
+ EntryWrapper new_wrapper = reparent_wrapper(new_iter, wrapper);
+
+ if (selected) {
+ expand_to_entry(new_wrapper.entry);
+ place_cursor(new_wrapper.entry, false);
+ }
+ }
+
+ private void on_branch_children_reordered(Sidebar.Branch branch, Sidebar.Entry entry) {
+ Gee.List<Sidebar.Entry>? children = branch.get_children(entry);
+ if (children == null)
+ return;
+
+ // This works by moving the entries to the bottom of the tree's list in the order they
+ // are presented in the Sidebar.Branch list.
+ foreach (Sidebar.Entry child in children) {
+ EntryWrapper? child_wrapper = get_wrapper(child);
+ assert(child_wrapper != null);
+
+ Gtk.TreeIter child_iter = child_wrapper.get_iter();
+ store.move_before(ref child_iter, null);
+ }
+ }
+
+ private void on_show_branch(Sidebar.Branch branch, bool shown) {
+ if (shown)
+ associate_branch(branch);
+ else
+ disassociate_branch(branch);
+
+ branch_shown(branch, shown);
+ }
+
+ private void on_sidebar_tooltip_changed(Sidebar.Entry entry, string? tooltip) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+
+ store.set(wrapper.get_iter(), Columns.TOOLTIP, guarded_markup_escape_text(tooltip));
+ }
+
+ private void on_sidebar_icon_changed(Sidebar.Entry entry, Icon? icon) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+
+ store.set(wrapper.get_iter(), Columns.PIXBUF, fetch_icon_pixbuf(icon));
+ }
+
+ private void on_sidebar_page_created(Sidebar.PageRepresentative entry, Page page) {
+ page_created(entry, page);
+ }
+
+ private void on_sidebar_destroying_page(Sidebar.PageRepresentative entry, Page page) {
+ destroying_page(entry, page);
+ }
+
+ private void on_sidebar_open_closed_icons_changed(Sidebar.ExpandableEntry entry, Icon? open,
+ Icon? closed) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+
+ store.set(wrapper.get_iter(), Columns.OPEN_PIXBUF, fetch_icon_pixbuf(open));
+ store.set(wrapper.get_iter(), Columns.CLOSED_PIXBUF, fetch_icon_pixbuf(closed));
+ }
+
+ private void on_sidebar_name_changed(Sidebar.RenameableEntry entry, string name) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ assert(wrapper != null);
+
+ store.set(wrapper.get_iter(), Columns.NAME, guarded_markup_escape_text(name));
+ }
+
+ private Gdk.Pixbuf? fetch_icon_pixbuf(GLib.Icon? gicon) {
+ if (gicon == null)
+ return null;
+
+ try {
+ Gdk.Pixbuf? icon = icon_cache.get(gicon.to_string());
+ if (icon != null)
+ return icon;
+
+ Gtk.IconInfo? info = icon_theme.lookup_by_gicon(gicon, ICON_SIZE, 0);
+ if (info == null)
+ return null;
+
+ icon = info.load_icon();
+ if (icon == null)
+ return null;
+
+ icon_cache.set(gicon.to_string(), icon);
+
+ return icon;
+ } catch (Error err) {
+ warning("Unable to load icon %s: %s", gicon.to_string(), err.message);
+
+ return null;
+ }
+ }
+
+ private void load_entry_icons(Gtk.TreeIter iter) {
+ EntryWrapper? wrapper = get_wrapper_at_iter(iter);
+ if (wrapper == null)
+ return;
+
+ Icon? icon = wrapper.entry.get_sidebar_icon();
+ Icon? open = null;
+ Icon? closed = null;
+
+ Sidebar.ExpandableEntry? expandable = wrapper.entry as Sidebar.ExpandableEntry;
+ if (expandable != null) {
+ open = expandable.get_sidebar_open_icon();
+ closed = expandable.get_sidebar_closed_icon();
+ }
+
+ if (open == null)
+ open = icon;
+
+ if (closed == null)
+ closed = icon;
+
+ store.set(iter, Columns.PIXBUF, fetch_icon_pixbuf(icon));
+ store.set(iter, Columns.OPEN_PIXBUF, fetch_icon_pixbuf(open));
+ store.set(iter, Columns.CLOSED_PIXBUF, fetch_icon_pixbuf(closed));
+ }
+
+ private void load_branch_icons(Gtk.TreeIter iter) {
+ load_entry_icons(iter);
+
+ Gtk.TreeIter child_iter;
+ if (store.iter_children(out child_iter, iter)) {
+ do {
+ load_branch_icons(child_iter);
+ } while (store.iter_next(ref child_iter));
+ }
+ }
+
+ private void on_theme_change() {
+ Gtk.TreeIter iter;
+ if (store.get_iter_first(out iter)) {
+ do {
+ load_branch_icons(iter);
+ } while (store.iter_next(ref iter));
+ }
+ }
+
+ private bool on_selection(Gtk.TreeSelection selection, Gtk.TreeModel model, Gtk.TreePath path,
+ bool path_currently_selected) {
+ // only allow selection if a page is selectable
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+
+ return (wrapper != null) ? (wrapper.entry is Sidebar.SelectableEntry) : false;
+ }
+
+ private Gtk.TreePath? get_path_from_event(Gdk.EventButton event) {
+ int x, y;
+ Gdk.ModifierType mask;
+ event.window.get_device_position(Gdk.Display.get_default().get_device_manager().
+ get_client_pointer(), out x, out y, out mask);
+
+ int cell_x, cell_y;
+ Gtk.TreePath path;
+ return get_path_at_pos(x, y, out path, null, out cell_x, out cell_y) ? path : null;
+ }
+
+ private Gtk.TreePath? get_current_path() {
+ Gtk.TreeModel model;
+ GLib.List<Gtk.TreePath> rows = get_selection().get_selected_rows(out model);
+ assert(rows.length() == 0 || rows.length() == 1);
+
+ return rows.length() != 0 ? rows.nth_data(0) : null;
+ }
+
+ private bool on_context_menu_keypress() {
+ GLib.List<Gtk.TreePath> rows = get_selection().get_selected_rows(null);
+ if (rows == null)
+ return false;
+
+ Gtk.TreePath? path = rows.data;
+ if (path == null)
+ return false;
+
+ scroll_to_cell(path, null, false, 0, 0);
+
+ return popup_context_menu(path);
+ }
+
+ private bool popup_context_menu(Gtk.TreePath path, Gdk.EventButton? event = null) {
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+ if (wrapper == null)
+ return false;
+
+ Sidebar.Contextable? contextable = wrapper.entry as Sidebar.Contextable;
+ if (contextable == null)
+ return false;
+
+ // First select the sidebar item so that its context menu will be available.
+ Sidebar.SelectableEntry? selectable = wrapper.entry as Sidebar.SelectableEntry;
+ if (selectable != null)
+ entry_selected(selectable);
+
+ Gtk.Menu? context_menu = contextable.get_sidebar_context_menu(event);
+ if (context_menu == null)
+ return false;
+
+ if (event != null)
+ context_menu.popup(null, null, null, event.button, event.time);
+ else
+ context_menu.popup(null, null, null, 0, Gtk.get_current_event_time());
+
+ return true;
+ }
+
+ private bool popup_default_context_menu(Gdk.EventButton event) {
+ default_context_menu.popup(null, null, null, event.button, event.time);
+ return true;
+ }
+
+ public override bool button_press_event(Gdk.EventButton event) {
+ Gtk.TreePath? path = get_path_from_event(event);
+
+ // user clicked on empty area, but isn't trying to spawn a context menu?
+ if ((path == null) && (event.button != 3)) {
+ return true;
+ }
+
+ if (event.button == 3 && event.type == Gdk.EventType.BUTTON_PRESS) {
+ // single right click
+ if (path != null)
+ popup_context_menu(path, event);
+ else
+ popup_default_context_menu(event);
+ } else if (event.button == 1 && event.type == Gdk.EventType.2BUTTON_PRESS) {
+ // double left click
+ if (path != null) {
+ toggle_branch_expansion(path, false);
+
+ if (can_rename_path(path))
+ return false;
+ }
+ } else if (event.button == 1 && event.type == Gdk.EventType.BUTTON_PRESS) {
+ // Is this a click on an already-highlighted tree item?
+ Gtk.TreePath? cursor_path = null;
+ get_cursor(out cursor_path, null);
+ if ((cursor_path != null) && (cursor_path.compare(path) == 0)) {
+ // yes, don't allow single-click editing, but
+ // pass the event on for dragging.
+ text_renderer.editable = false;
+ return base.button_press_event(event);
+ }
+
+ // Got click on different tree item, make sure it is editable
+ // if it needs to be.
+ if (path != null && get_wrapper_at_path(path).entry is Sidebar.RenameableEntry) {
+ text_renderer.editable = true;
+ }
+ }
+
+ return base.button_press_event(event);
+ }
+
+ public bool is_keypress_interpreted(Gdk.EventKey event) {
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "F2":
+ case "Delete":
+ case "Return":
+ case "KP_Enter":
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ public override bool key_press_event(Gdk.EventKey event) {
+ switch (Gdk.keyval_name(event.keyval)) {
+ case "Return":
+ case "KP_Enter":
+ Gtk.TreePath? path = get_current_path();
+ if (path != null)
+ toggle_branch_expansion(path, false);
+
+ return true;
+
+ case "F2":
+ return rename_in_place();
+
+ case "Delete":
+ Gtk.TreePath? path = get_current_path();
+
+ return (path != null) ? destroy_path(path) : false;
+ }
+
+ return base.key_press_event(event);
+ }
+
+ public bool rename_entry_in_place(Sidebar.Entry entry) {
+ if (!expand_to_entry(entry))
+ return false;
+
+ if (!place_cursor(entry, false))
+ return false;
+
+ return rename_in_place();
+ }
+
+ private bool rename_in_place() {
+ Gtk.TreePath? cursor_path;
+ Gtk.TreeViewColumn? cursor_column;
+ get_cursor(out cursor_path, out cursor_column);
+
+ if (can_rename_path(cursor_path)) {
+ set_cursor(cursor_path, cursor_column, true);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool scroll_to_entry(Sidebar.Entry entry) {
+ EntryWrapper? wrapper = get_wrapper(entry);
+ if (wrapper == null)
+ return false;
+
+ scroll_to_cell(wrapper.get_path(), null, false, 0, 0);
+
+ return true;
+ }
+
+ public override void drag_data_get(Gdk.DragContext context, Gtk.SelectionData selection_data,
+ uint info, uint time) {
+ InternalDragSourceEntry? drag_source = null;
+
+ if (internal_drag_source_entry != null) {
+ Sidebar.SelectableEntry selectable =
+ internal_drag_source_entry as Sidebar.SelectableEntry;
+ if (selectable == null) {
+ drag_source = internal_drag_source_entry as InternalDragSourceEntry;
+ }
+ }
+
+ if (drag_source == null) {
+ Gtk.TreePath? selected_path = get_selected_path();
+ if (selected_path == null)
+ return;
+
+ EntryWrapper? wrapper = get_wrapper_at_path(selected_path);
+ if (wrapper == null)
+ return;
+
+ drag_source = wrapper.entry as InternalDragSourceEntry;
+ if (drag_source == null)
+ return;
+ }
+
+ drag_source.prepare_selection_data(selection_data);
+ }
+
+ public override void drag_data_received(Gdk.DragContext context, int x, int y,
+ Gtk.SelectionData selection_data, uint info, uint time) {
+
+ Gtk.TreePath path;
+ Gtk.TreeViewDropPosition pos;
+ if (!get_dest_row_at_pos(x, y, out path, out pos)) {
+ // If an external drop, hand it off to the handler
+ if (Gtk.drag_get_source_widget(context) == null)
+ drop_handler(context, null, selection_data, info, time);
+ else
+ Gtk.drag_finish(context, false, false, time);
+
+ return;
+ }
+
+ // Note that a drop outside a sidebar entry is legal if an external drop.
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+
+ // If an external drop, hand it off to the handler
+ if (Gtk.drag_get_source_widget(context) == null) {
+ drop_handler(context, (wrapper != null) ? wrapper.entry : null, selection_data,
+ info, time);
+
+ return;
+ }
+
+ // An internal drop only applies to DropTargetEntry's
+ if (wrapper == null) {
+ Gtk.drag_finish(context, false, false, time);
+
+ return;
+ }
+
+ Sidebar.InternalDropTargetEntry? targetable = wrapper.entry as Sidebar.InternalDropTargetEntry;
+ if (targetable == null) {
+ Gtk.drag_finish(context, false, false, time);
+
+ return;
+ }
+
+ bool success = false;
+
+ if (selection_data.get_data_type().name() == LibraryWindow.TAG_PATH_MIME_TYPE) {
+ success = targetable.internal_drop_received_arbitrary(selection_data);
+ } else {
+ Gee.List<MediaSource>? media = unserialize_media_sources(selection_data.get_data(),
+ selection_data.get_length());
+ if (media != null && media.size > 0)
+ success = targetable.internal_drop_received(media);
+ }
+
+ Gtk.drag_finish(context, success, false, time);
+ }
+
+ public override bool drag_motion(Gdk.DragContext context, int x, int y, uint time) {
+ // call the base signal to get rows with children to spring open
+ base.drag_motion(context, x, y, time);
+
+ Gtk.TreePath path;
+ Gtk.TreeViewDropPosition pos;
+ bool has_dest = get_dest_row_at_pos(x, y, out path, out pos);
+
+ // we don't want to insert between rows, only select the rows themselves
+ if (!has_dest || pos == Gtk.TreeViewDropPosition.BEFORE)
+ set_drag_dest_row(path, Gtk.TreeViewDropPosition.INTO_OR_BEFORE);
+ else if (pos == Gtk.TreeViewDropPosition.AFTER)
+ set_drag_dest_row(path, Gtk.TreeViewDropPosition.INTO_OR_AFTER);
+
+ Gdk.drag_status(context, context.get_suggested_action(), time);
+
+ return has_dest;
+ }
+
+ // Returns true if path is renameable, and selects the path as well.
+ private bool can_rename_path(Gtk.TreePath path) {
+ if (editing_disabled > 0)
+ return false;
+
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+ if (wrapper == null)
+ return false;
+
+ Sidebar.RenameableEntry? renameable = wrapper.entry as Sidebar.RenameableEntry;
+ if (renameable == null)
+ return false;
+
+ get_selection().select_path(path);
+
+ return true;
+ }
+
+ private bool destroy_path(Gtk.TreePath path) {
+ EntryWrapper? wrapper = get_wrapper_at_path(path);
+ if (wrapper == null)
+ return false;
+
+ Sidebar.DestroyableEntry? destroyable = wrapper.entry as Sidebar.DestroyableEntry;
+ if (destroyable == null)
+ return false;
+
+ destroyable.destroy_source();
+
+ return true;
+ }
+
+ private void on_editing_started(Gtk.CellEditable editable, string path) {
+ if (editable is Gtk.Entry) {
+ text_entry = (Gtk.Entry) editable;
+ text_entry.editing_done.connect(on_editing_done);
+ text_entry.focus_out_event.connect(on_editing_focus_out);
+ text_entry.editable = true;
+ }
+ }
+
+ private void on_editing_canceled() {
+ text_entry.editable = false;
+
+ text_entry.editing_done.disconnect(on_editing_done);
+ text_entry.focus_out_event.disconnect(on_editing_focus_out);
+ }
+
+ private void on_editing_done() {
+ text_entry.editable = false;
+
+ EntryWrapper? wrapper = get_wrapper_at_path(get_current_path());
+ if (wrapper != null) {
+ Sidebar.RenameableEntry? renameable = wrapper.entry as Sidebar.RenameableEntry;
+ if (renameable != null)
+ renameable.rename(text_entry.get_text());
+ }
+
+ text_entry.editing_done.disconnect(on_editing_done);
+ text_entry.focus_out_event.disconnect(on_editing_focus_out);
+ }
+
+ private bool on_editing_focus_out(Gdk.EventFocus event) {
+ // We'll return false here, in case other parts of the app
+ // want to know if the button press event that caused
+ // us to lose focus have been fully handled.
+ return false;
+ }
+
+ private void on_new_search() {
+ (new SavedSearchDialog()).show();
+ }
+
+ private void on_new_tag() {
+ NewRootTagCommand creation_command = new NewRootTagCommand();
+ AppWindow.get_command_manager().execute(creation_command);
+ LibraryWindow.get_app().rename_tag_in_sidebar(creation_command.get_created_tag());
+ }
+}
+
diff --git a/src/sidebar/common.vala b/src/sidebar/common.vala
new file mode 100644
index 0000000..36adfff
--- /dev/null
+++ b/src/sidebar/common.vala
@@ -0,0 +1,114 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// A simple grouping Entry that is only expandable
+public class Sidebar.Grouping : Object, Sidebar.Entry, Sidebar.ExpandableEntry {
+ private string name;
+ private Icon? open_icon;
+ private Icon? closed_icon;
+
+ public Grouping(string name, Icon? open_icon, Icon? closed_icon = null) {
+ this.name = name;
+ this.open_icon = open_icon;
+ this.closed_icon = closed_icon ?? open_icon;
+ }
+
+ public string get_sidebar_name() {
+ return name;
+ }
+
+ public string? get_sidebar_tooltip() {
+ return name;
+ }
+
+ public Icon? get_sidebar_icon() {
+ return null;
+ }
+
+ public Icon? get_sidebar_open_icon() {
+ return open_icon;
+ }
+
+ public Icon? get_sidebar_closed_icon() {
+ return closed_icon;
+ }
+
+ public string to_string() {
+ return name;
+ }
+
+ public bool expand_on_select() {
+ return true;
+ }
+}
+
+// An end-node on the sidebar that represents a Page with its page context menu. Additional
+// interfaces can be added if additional functionality is required (such as a drop target).
+// This class also handles the bookwork of creating the Page on-demand and maintaining it in memory.
+public abstract class Sidebar.SimplePageEntry : Object, Sidebar.Entry, Sidebar.SelectableEntry,
+ Sidebar.PageRepresentative, Sidebar.Contextable {
+ private Page? page = null;
+
+ public SimplePageEntry() {
+ }
+
+ public abstract string get_sidebar_name();
+
+ public virtual string? get_sidebar_tooltip() {
+ return get_sidebar_name();
+ }
+
+ public abstract Icon? get_sidebar_icon();
+
+ public virtual string to_string() {
+ return get_sidebar_name();
+ }
+
+ protected abstract Page create_page();
+
+ public bool has_page() {
+ return page != null;
+ }
+
+ protected Page get_page() {
+ if (page == null) {
+ page = create_page();
+ page_created(page);
+ }
+
+ return page;
+ }
+
+ internal void pruned(Sidebar.Tree tree) {
+ if (page == null)
+ return;
+
+ destroying_page(page);
+ page.destroy();
+ page = null;
+ }
+
+ public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
+ return get_page().get_page_context_menu();
+ }
+}
+
+// A simple Sidebar.Branch where the root node is the branch in entirety.
+public class Sidebar.RootOnlyBranch : Sidebar.Branch {
+ public RootOnlyBranch(Sidebar.Entry root) {
+ base (root, Sidebar.Branch.Options.NONE, null_comparator);
+ }
+
+ private static int null_comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ return (a != b) ? -1 : 0;
+ }
+}
+
+public interface Sidebar.Contextable : Object {
+ // Return null if the context menu should not be invoked for this event
+ public abstract Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event);
+}
+
diff --git a/src/sidebar/mk/sidebar.mk b/src/sidebar/mk/sidebar.mk
new file mode 100644
index 0000000..2a6c67d
--- /dev/null
+++ b/src/sidebar/mk/sidebar.mk
@@ -0,0 +1,31 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Sidebar
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := sidebar
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ Entry.vala \
+ Tree.vala \
+ common.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/slideshow/Slideshow.vala b/src/slideshow/Slideshow.vala
new file mode 100644
index 0000000..d55e3d6
--- /dev/null
+++ b/src/slideshow/Slideshow.vala
@@ -0,0 +1,32 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Slideshow {
+
+public void init() throws Error {
+ string[] core_ids = new string[0];
+ core_ids += "org.yorba.shotwell.transitions.crumble";
+ core_ids += "org.yorba.shotwell.transitions.fade";
+ core_ids += "org.yorba.shotwell.transitions.slide";
+ core_ids += "org.yorba.shotwell.transitions.blinds";
+ core_ids += "org.yorba.shotwell.transitions.circle";
+ core_ids += "org.yorba.shotwell.transitions.circles";
+ core_ids += "org.yorba.shotwell.transitions.clock";
+ core_ids += "org.yorba.shotwell.transitions.stripes";
+ core_ids += "org.yorba.shotwell.transitions.squares";
+ core_ids += "org.yorba.shotwell.transitions.chess";
+
+ Plugins.register_extension_point(typeof(Spit.Transitions.Descriptor), _("Slideshow Transitions"),
+ Resources.ICON_SLIDESHOW_EXTENSION_POINT, core_ids);
+ TransitionEffectsManager.init();
+}
+
+public void terminate() {
+ TransitionEffectsManager.terminate();
+}
+
+}
+
diff --git a/src/slideshow/TransitionEffects.vala b/src/slideshow/TransitionEffects.vala
new file mode 100644
index 0000000..7b10543
--- /dev/null
+++ b/src/slideshow/TransitionEffects.vala
@@ -0,0 +1,351 @@
+/* Copyright 2010 Maxim Kartashev
+ * Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class TransitionEffectsManager {
+ public const string NULL_EFFECT_ID = NullTransitionDescriptor.EFFECT_ID;
+ public const string RANDOM_EFFECT_ID = RandomEffectDescriptor.EFFECT_ID;
+ private static TransitionEffectsManager? instance = null;
+
+ // effects are stored by effect ID
+ private Gee.Map<string, Spit.Transitions.Descriptor> effects = new Gee.HashMap<
+ string, Spit.Transitions.Descriptor>();
+ private Spit.Transitions.Descriptor null_descriptor = new NullTransitionDescriptor();
+ private Spit.Transitions.Descriptor random_descriptor = new RandomEffectDescriptor();
+
+ private TransitionEffectsManager() {
+ load_transitions();
+ Plugins.Notifier.get_instance().pluggable_activation.connect(load_transitions);
+ }
+
+ ~TransitionEffectsManager() {
+ Plugins.Notifier.get_instance().pluggable_activation.disconnect(load_transitions);
+ }
+
+ private void load_transitions() {
+ effects.clear();
+
+ // add null and random effect first
+ effects.set(null_descriptor.get_id(), null_descriptor);
+ effects.set(random_descriptor.get_id(),random_descriptor);
+
+ // load effects from plug-ins
+ Gee.Collection<Spit.Pluggable> pluggables = Plugins.get_pluggables_for_type(
+ typeof(Spit.Transitions.Descriptor));
+ foreach (Spit.Pluggable pluggable in pluggables) {
+ int pluggable_interface = pluggable.get_pluggable_interface(Spit.Transitions.CURRENT_INTERFACE,
+ Spit.Transitions.CURRENT_INTERFACE);
+ if (pluggable_interface != Spit.Transitions.CURRENT_INTERFACE) {
+ warning("Unable to load transitions plug-in %s: reported interface %d",
+ Plugins.get_pluggable_module_id(pluggable), pluggable_interface);
+
+ continue;
+ }
+
+ Spit.Transitions.Descriptor desc = (Spit.Transitions.Descriptor) pluggable;
+ if (effects.has_key(desc.get_id()))
+ warning("Multiple transitions loaded with same effect ID %s", desc.get_id());
+ else
+ effects.set(desc.get_id(), desc);
+ }
+ }
+
+ public static void init() {
+ instance = new TransitionEffectsManager();
+ }
+
+ public static void terminate() {
+ instance = null;
+ }
+
+ public static TransitionEffectsManager get_instance() {
+ assert(instance != null);
+
+ return instance;
+ }
+
+ public Gee.Collection<string> get_effect_ids() {
+ return effects.keys;
+ }
+
+ public Gee.Collection<string> get_effect_names(owned CompareDataFunc? comparator = null) {
+ Gee.Collection<string> effect_names = new Gee.TreeSet<string>((owned) comparator);
+ foreach (Spit.Transitions.Descriptor desc in effects.values)
+ effect_names.add(desc.get_pluggable_name());
+
+ return effect_names;
+ }
+
+ public string? get_id_for_effect_name(string effect_name) {
+ foreach (Spit.Transitions.Descriptor desc in effects.values) {
+ if (desc.get_pluggable_name() == effect_name)
+ return desc.get_id();
+ }
+
+ return null;
+ }
+
+ public Spit.Transitions.Descriptor? get_effect_descriptor(string effect_id) {
+ return effects.get(effect_id);
+ }
+
+ public string get_effect_name(string effect_id) {
+ Spit.Transitions.Descriptor? desc = get_effect_descriptor(effect_id);
+
+ return (desc != null) ? desc.get_pluggable_name() : _("(None)");
+ }
+
+ public Spit.Transitions.Descriptor get_null_descriptor() {
+ return null_descriptor;
+ }
+
+ public TransitionClock? create_transition_clock(string effect_id) {
+ Spit.Transitions.Descriptor? desc = get_effect_descriptor(effect_id);
+
+ return (desc != null) ? new TransitionClock(desc) : null;
+ }
+
+ public TransitionClock create_null_transition_clock() {
+ return new TransitionClock(null_descriptor);
+ }
+}
+
+public class TransitionClock {
+ // This method is called by TransitionClock to indicate that it's time for the transition to be
+ // repainted. The callback should call TransitionClock.paint() with the appropriate Drawable
+ // either immediately or quite soon (in an expose event).
+ public delegate void RepaintCallback();
+
+ private Spit.Transitions.Descriptor desc;
+ private Spit.Transitions.Effect effect;
+ private int desired_fps;
+ private int min_fps;
+ private int current_fps = 0;
+ private OpTimer paint_timer;
+ private Spit.Transitions.Visuals? visuals = null;
+ private Spit.Transitions.Motion? motion = null;
+ private unowned RepaintCallback? repaint = null;
+ private uint timer_id = 0;
+ private ulong time_started = 0;
+ private int frame_number = 0;
+ private bool cancelled = false;
+
+ public TransitionClock(Spit.Transitions.Descriptor desc) {
+ this.desc = desc;
+
+ effect = desc.create(new Plugins.StandardHostInterface(desc, "transitions"));
+ effect.get_fps(out desired_fps, out min_fps);
+
+ paint_timer = new OpTimer(desc.get_pluggable_name());
+ }
+
+ ~TransitionClock() {
+ cancel_timer();
+ debug("%s tick_msec=%d min/desired/current fps=%d/%d/%d", paint_timer.to_string(),
+ (motion != null) ? motion.tick_msec : 0, min_fps, desired_fps, current_fps);
+ }
+
+ public bool is_in_progress() {
+ return (!cancelled && motion != null) ? frame_number < motion.total_frames : false;
+ }
+
+ public void start(Spit.Transitions.Visuals visuals, Spit.Transitions.Direction direction,
+ int duration_msec, RepaintCallback repaint) {
+ reset();
+
+ // if no desired FPS, this is a no-op transition
+ if (desired_fps == 0)
+ return;
+
+ this.visuals = visuals;
+ this.repaint = repaint;
+ motion = new Spit.Transitions.Motion(direction, desired_fps, duration_msec);
+
+ effect.start(visuals, motion);
+
+ // start the timer
+ // TODO: It may be smarter to not use Timeout naively, as it does not attempt to catch up
+ // when tick() is called late.
+ time_started = now_ms();
+ timer_id = Timeout.add_full(Priority.HIGH, motion.tick_msec, tick);
+ }
+
+ // This resets all state for the clock. No check is done if the clock is running.
+ private void reset() {
+ visuals = null;
+ motion = null;
+ repaint = null;
+ cancel_timer();
+ time_started = 0;
+ frame_number = 1;
+ current_fps = 0;
+ cancelled = false;
+ }
+
+ private void cancel_timer() {
+ if (timer_id != 0) {
+ Source.remove(timer_id);
+ timer_id = 0;
+ }
+ }
+
+ // Calculate current FPS rate and returns true if it's above minimum
+ private bool is_fps_ok() {
+ assert(time_started > 0);
+
+ if (frame_number <= 3)
+ return true; // don't bother measuring if statistical data are too small
+
+ double elapsed_msec = (double) (now_ms() - time_started);
+ if (elapsed_msec <= 0.0)
+ return true;
+
+ current_fps = (int) ((frame_number * 1000.0) / elapsed_msec);
+ if (current_fps < min_fps) {
+ debug("Transition rate of %dfps below minimum of %dfps (elapsed=%lf frames=%d)",
+ current_fps, min_fps, elapsed_msec, frame_number);
+ }
+
+ return (current_fps >= min_fps);
+ }
+
+ // Cancels current transition.
+ public void cancel() {
+ cancelled = true;
+ cancel_timer();
+ effect.cancel();
+
+ // repaint to complete the transition
+ repaint();
+ }
+
+ // Call this whenever using a TransitionClock in the expose event. Returns false if the
+ // transition has completed, in which case the caller should paint the final result.
+ public bool paint(Cairo.Context ctx, int width, int height) {
+ if (!is_in_progress())
+ return false;
+
+ paint_timer.start();
+
+ ctx.save();
+
+ if (effect.needs_clear_background()) {
+ ctx.set_source_rgba(visuals.bg_color.red, visuals.bg_color.green, visuals.bg_color.blue,
+ visuals.bg_color.alpha);
+ ctx.rectangle(0, 0, width, height);
+ ctx.fill();
+ }
+
+ effect.paint(visuals, motion, ctx, width, height, frame_number);
+
+ ctx.restore();
+
+ paint_timer.stop();
+
+ return true;
+ }
+
+ private bool tick() {
+ if (!is_fps_ok()) {
+ debug("Cancelling transition: below minimum fps");
+ cancel();
+ }
+
+ // repaint always; this timer tick will go away when the frames have exhausted (and
+ // guarantees the first frame is painted before advancing the counter)
+ repaint();
+
+ if (!is_in_progress()) {
+ cancel_timer();
+
+ return false;
+ }
+
+ // advance to the next frame
+ if (frame_number < motion.total_frames)
+ effect.advance(visuals, motion, ++frame_number);
+
+ return true;
+ }
+}
+
+public class NullTransitionDescriptor : Object, Spit.Pluggable, Spit.Transitions.Descriptor {
+ public const string EFFECT_ID = "org.yorba.shotwell.transitions.null";
+
+ public int get_pluggable_interface(int min_host_version, int max_host_version) {
+ return Spit.Transitions.CURRENT_INTERFACE;
+ }
+
+ public unowned string get_id() {
+ return EFFECT_ID;
+ }
+
+ public unowned string get_pluggable_name() {
+ return _("None");
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Transitions.Effect create(Spit.HostInterface host) {
+ return new NullEffect();
+ }
+}
+
+public class NullEffect : Object, Spit.Transitions.Effect {
+ public NullEffect() {
+ }
+
+ public void get_fps(out int desired_fps, out int min_fps) {
+ desired_fps = 0;
+ min_fps = 0;
+ }
+
+ public void start(Spit.Transitions.Visuals visuals, Spit.Transitions.Motion motion) {
+ }
+
+ public bool needs_clear_background() {
+ return false;
+ }
+
+ public void paint(Spit.Transitions.Visuals visuals, Spit.Transitions.Motion motion, Cairo.Context ctx,
+ int width, int height, int frame_number) {
+ }
+
+ public void advance(Spit.Transitions.Visuals visuals, Spit.Transitions.Motion motion, int frame_number) {
+ }
+
+ public void cancel() {
+ }
+}
+public class RandomEffectDescriptor : Object, Spit.Pluggable, Spit.Transitions.Descriptor {
+ public const string EFFECT_ID = "org.yorba.shotwell.transitions.random";
+
+ public int get_pluggable_interface(int min_host_version, int max_host_version) {
+ return Spit.Transitions.CURRENT_INTERFACE;
+ }
+
+ public unowned string get_id() {
+ return EFFECT_ID;
+ }
+
+ public unowned string get_pluggable_name() {
+ return _("Random");
+ }
+
+ public void get_info(ref Spit.PluggableInfo info) {
+ }
+
+ public void activation(bool enabled) {
+ }
+
+ public Spit.Transitions.Effect create(Spit.HostInterface host) {
+ return new NullEffect();
+ }
+}
diff --git a/src/slideshow/mk/slideshow.mk b/src/slideshow/mk/slideshow.mk
new file mode 100644
index 0000000..0a62e8d
--- /dev/null
+++ b/src/slideshow/mk/slideshow.mk
@@ -0,0 +1,29 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Slideshow
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := slideshow
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. Slideshow.vala.
+UNIT_FILES := \
+ TransitionEffects.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Plugins
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/tags/Branch.vala b/src/tags/Branch.vala
new file mode 100644
index 0000000..71bf424
--- /dev/null
+++ b/src/tags/Branch.vala
@@ -0,0 +1,310 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class Tags.Branch : Sidebar.Branch {
+ private Gee.HashMap<Tag, Tags.SidebarEntry> entry_map = new Gee.HashMap<Tag, Tags.SidebarEntry>();
+
+ public Branch() {
+ base (new Tags.Grouping(),
+ Sidebar.Branch.Options.HIDE_IF_EMPTY
+ | Sidebar.Branch.Options.AUTO_OPEN_ON_NEW_CHILD
+ | Sidebar.Branch.Options.STARTUP_OPEN_GROUPING,
+ comparator);
+
+ // seed the branch with existing tags
+ on_tags_added_removed(Tag.global.get_all(), null);
+
+ // monitor collection for future events
+ Tag.global.contents_altered.connect(on_tags_added_removed);
+ Tag.global.items_altered.connect(on_tags_altered);
+ }
+
+ ~Branch() {
+ Tag.global.contents_altered.disconnect(on_tags_added_removed);
+ Tag.global.items_altered.disconnect(on_tags_altered);
+ }
+
+ public Tags.SidebarEntry? get_entry_for_tag(Tag tag) {
+ return entry_map.get(tag);
+ }
+
+ private static int comparator(Sidebar.Entry a, Sidebar.Entry b) {
+ if (a == b)
+ return 0;
+
+ return Tag.compare_names(((Tags.SidebarEntry) a).for_tag(),
+ ((Tags.SidebarEntry) b).for_tag());
+ }
+
+ private void on_tags_added_removed(Gee.Iterable<DataObject>? added_raw, Gee.Iterable<DataObject>? removed) {
+ // Store the tag whose page we'll eventually want to go to,
+ // since this is lost when a tag is reparented (pruning a currently-
+ // highlighted entry from the tree causes the highlight to go to the library,
+ // and reparenting requires pruning the old location (along with adding the new one)).
+ Tag? restore_point = null;
+
+ if (added_raw != null) {
+ // prepare a collection of tags guaranteed to be sorted; this is critical for
+ // hierarchical tags since it ensures that parent tags must be encountered
+ // before their children
+ Gee.SortedSet<Tag> added = new Gee.TreeSet<Tag>(Tag.compare_names);
+ foreach (DataObject object in added_raw) {
+ Tag tag = (Tag) object;
+ added.add(tag);
+ }
+
+ foreach (Tag tag in added) {
+ // ensure that all parent tags of this tag (if any) already have sidebar
+ // entries
+ Tag? parent_tag = tag.get_hierarchical_parent();
+ while (parent_tag != null) {
+ if (!entry_map.has_key(parent_tag)) {
+ Tags.SidebarEntry parent_entry = new Tags.SidebarEntry(parent_tag);
+ entry_map.set(parent_tag, parent_entry);
+ }
+
+ parent_tag = parent_tag.get_hierarchical_parent();
+
+ }
+
+ Tags.SidebarEntry entry = new Tags.SidebarEntry(tag);
+ entry_map.set(tag, entry);
+
+ parent_tag = tag.get_hierarchical_parent();
+ if (parent_tag != null) {
+ Tags.SidebarEntry parent_entry = entry_map.get(parent_tag);
+ graft(parent_entry, entry);
+ } else {
+ graft(get_root(), entry);
+ }
+
+ // Save the most-recently-processed on tag. During a reparenting,
+ // this will be the only tag processed.
+ restore_point = tag;
+ }
+ }
+
+ if (removed != null) {
+ foreach (DataObject object in removed) {
+ Tag tag = (Tag) object;
+
+ Tags.SidebarEntry? entry = entry_map.get(tag);
+ assert(entry != null);
+
+ bool is_removed = entry_map.unset(tag);
+ assert(is_removed);
+
+ prune(entry);
+ }
+ }
+ }
+
+ private void on_tags_altered(Gee.Map<DataObject, Alteration> altered) {
+ foreach (DataObject object in altered.keys) {
+ if (!altered.get(object).has_detail("metadata", "name"))
+ continue;
+
+ Tag tag = (Tag) object;
+ Tags.SidebarEntry? entry = entry_map.get(tag);
+ assert(entry != null);
+
+ entry.sidebar_name_changed(tag.get_user_visible_name());
+ entry.sidebar_tooltip_changed(tag.get_user_visible_name());
+ reorder(entry);
+ }
+ }
+}
+
+public class Tags.Grouping : Sidebar.Grouping, Sidebar.InternalDropTargetEntry,
+ Sidebar.InternalDragSourceEntry, Sidebar.Contextable {
+ private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.Menu? context_menu = null;
+
+ public Grouping() {
+ base (_("Tags"), new ThemedIcon(Resources.ICON_TAGS));
+ setup_context_menu();
+ }
+
+ private void setup_context_menu() {
+ Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
+ Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
+
+ Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
+ new_tag.label = Resources.NEW_CHILD_TAG_SIDEBAR_MENU;
+ actions += new_tag;
+
+ group.add_actions(actions, this);
+ ui.insert_action_group(group, 0);
+
+ File ui_file = Resources.get_ui("tag_sidebar_context.ui");
+ try {
+ ui.add_ui_from_file(ui_file.get_path());
+ } catch (Error err) {
+ AppWindow.error_message("Error loading UI file %s: %s".printf(
+ ui_file.get_path(), err.message));
+ Application.get_instance().panic();
+ }
+ context_menu = (Gtk.Menu) ui.get_widget("/SidebarTagContextMenu");
+
+ ui.ensure_update();
+ }
+
+ public bool internal_drop_received(Gee.List<MediaSource> media) {
+ AddTagsDialog dialog = new AddTagsDialog();
+ string[]? names = dialog.execute();
+ if (names == null || names.length == 0)
+ return false;
+
+ AppWindow.get_command_manager().execute(new AddTagsCommand(names, media));
+
+ return true;
+ }
+
+ public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
+ if (data.get_data_type().name() == LibraryWindow.TAG_PATH_MIME_TYPE) {
+ string old_tag_path = (string) data.get_data();
+ assert (Tag.global.exists(old_tag_path));
+
+ // if this is already a top-level tag, do a short-circuit return
+ if (HierarchicalTagUtilities.enumerate_path_components(old_tag_path).size < 2)
+ return true;
+
+ AppWindow.get_command_manager().execute(
+ new ReparentTagCommand(Tag.for_path(old_tag_path), "/"));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public void prepare_selection_data(Gtk.SelectionData data) {
+ ;
+ }
+
+ public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
+ return context_menu;
+ }
+
+ private void on_new_tag() {
+ NewRootTagCommand creation_command = new NewRootTagCommand();
+ AppWindow.get_command_manager().execute(creation_command);
+ LibraryWindow.get_app().rename_tag_in_sidebar(creation_command.get_created_tag());
+ }
+}
+
+public class Tags.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
+ Sidebar.DestroyableEntry, Sidebar.InternalDropTargetEntry, Sidebar.ExpandableEntry,
+ Sidebar.InternalDragSourceEntry {
+ private static Icon single_tag_icon;
+
+ private Tag tag;
+
+ public SidebarEntry(Tag tag) {
+ this.tag = tag;
+ }
+
+ internal static void init() {
+ single_tag_icon = new ThemedIcon(Resources.ICON_ONE_TAG);
+ }
+
+ internal static void terminate() {
+ single_tag_icon = null;
+ }
+
+ public Tag for_tag() {
+ return tag;
+ }
+
+ public override string get_sidebar_name() {
+ return tag.get_user_visible_name();
+ }
+
+ public override Icon? get_sidebar_icon() {
+ return single_tag_icon;
+ }
+
+ protected override Page create_page() {
+ return new TagPage(tag);
+ }
+
+ public void rename(string new_name) {
+ string? prepped = Tag.prep_tag_name(new_name);
+ if (prepped == null)
+ return;
+
+ prepped = prepped.replace("/", "");
+
+ if (prepped == tag.get_user_visible_name())
+ return;
+
+ if (prepped == "")
+ return;
+
+ AppWindow.get_command_manager().execute(new RenameTagCommand(tag, prepped));
+ }
+
+ public void destroy_source() {
+ if (Dialogs.confirm_delete_tag(tag))
+ AppWindow.get_command_manager().execute(new DeleteTagCommand(tag));
+ }
+
+ public bool internal_drop_received(Gee.List<MediaSource> media) {
+ AppWindow.get_command_manager().execute(new TagUntagPhotosCommand(tag, media, media.size,
+ true));
+
+ return true;
+ }
+
+ public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
+ if (data.get_data_type().name() == LibraryWindow.TAG_PATH_MIME_TYPE) {
+ string old_tag_path = (string) data.get_data();
+
+ // if we're dragging onto ourself, it's a no-op
+ if (old_tag_path == tag.get_path())
+ return true;
+
+ // if we're dragging onto one of our children, it's a no-op
+ foreach (string parent_path in HierarchicalTagUtilities.enumerate_parent_paths(tag.get_path())) {
+ if (parent_path == old_tag_path)
+ return true;
+ }
+
+ assert (Tag.global.exists(old_tag_path));
+
+ // if we're dragging onto our parent, it's a no-op
+ Tag old_tag = Tag.for_path(old_tag_path);
+ Tag old_tag_parent = old_tag.get_hierarchical_parent();
+ if (old_tag_parent != null && old_tag_parent.get_path() == tag.get_path())
+ return true;
+
+ AppWindow.get_command_manager().execute(
+ new ReparentTagCommand(old_tag, tag.get_path()));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public Icon? get_sidebar_open_icon() {
+ return single_tag_icon;
+ }
+
+ public Icon? get_sidebar_closed_icon() {
+ return single_tag_icon;
+ }
+
+ public bool expand_on_select() {
+ return false;
+ }
+
+ public void prepare_selection_data(Gtk.SelectionData data) {
+ data.set(Gdk.Atom.intern_static_string(LibraryWindow.TAG_PATH_MIME_TYPE), 0,
+ tag.get_path().data);
+ }
+}
+
diff --git a/src/tags/HierarchicalTagIndex.vala b/src/tags/HierarchicalTagIndex.vala
new file mode 100644
index 0000000..58b5f89
--- /dev/null
+++ b/src/tags/HierarchicalTagIndex.vala
@@ -0,0 +1,90 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public class HierarchicalTagIndex {
+ private Gee.Map<string, Gee.Collection<string>> tag_table;
+ private Gee.SortedSet<string> known_paths;
+
+ public HierarchicalTagIndex( ) {
+ this.tag_table = new Gee.HashMap<string, Gee.ArrayList<string>>();
+ this.known_paths = new Gee.TreeSet<string>();
+ }
+
+ public static HierarchicalTagIndex from_paths(Gee.Collection<string> client_paths) {
+ Gee.Collection<string> paths = client_paths.read_only_view;
+
+ HierarchicalTagIndex result = new HierarchicalTagIndex();
+
+ foreach (string path in paths) {
+ if (path.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ Gee.Collection<string> components =
+ HierarchicalTagUtilities.enumerate_path_components(path);
+
+ foreach (string component in components)
+ result.add_path(component, path);
+ } else {
+ result.add_path(path, path);
+ }
+ }
+
+ return result;
+ }
+
+ public static HierarchicalTagIndex get_global_index() {
+ return HierarchicalTagIndex.from_paths(Tag.global.get_all_names());
+ }
+
+ public void add_path(string tag, string path) {
+ if (!tag_table.has_key(tag)) {
+ tag_table.set(tag, new Gee.ArrayList<string>());
+ }
+
+ tag_table.get(tag).add(path);
+ known_paths.add(path);
+ }
+
+ public Gee.Collection<string> get_all_paths() {
+ return known_paths.read_only_view;
+ }
+
+ public bool is_tag_in_index(string tag) {
+ return tag_table.has_key(tag);
+ }
+
+ public Gee.Collection<string> get_all_tags() {
+ return tag_table.keys;
+ }
+
+ public bool is_path_known(string path) {
+ return known_paths.contains(path);
+ }
+
+ public string get_path_for_name(string name) {
+ if (!is_tag_in_index(name))
+ return name;
+
+ Gee.Collection<string> paths = tag_table.get(name);
+ foreach (string path in paths) {
+ Gee.List<string> components = HierarchicalTagUtilities.enumerate_path_components(path);
+ if (components.get(components.size - 1) == name) {
+ return path;
+ }
+ }
+
+ assert_not_reached();
+ }
+
+ public string[] get_paths_for_names_array(string[] names) {
+ string[] result = new string[0];
+
+ foreach (string name in names)
+ result += get_path_for_name(name);
+
+ return result;
+ }
+
+}
+
diff --git a/src/tags/HierarchicalTagUtilities.vala b/src/tags/HierarchicalTagUtilities.vala
new file mode 100644
index 0000000..985491d
--- /dev/null
+++ b/src/tags/HierarchicalTagUtilities.vala
@@ -0,0 +1,184 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+class HierarchicalTagUtilities {
+
+ /**
+ * converts a flat tag name 'name' (e.g., "Animals") to a tag path compatible with the
+ * hierarchical tag data model (e.g., "/Animals"). if 'name' is already a path compatible with
+ * the hierarchical data model, 'name' is returned untouched
+ */
+ public static string flat_to_hierarchical(string name) {
+ if (!name.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ return Tag.PATH_SEPARATOR_STRING + name;
+ else
+ return name;
+ }
+
+ /**
+ * converts a hierarchical tag path 'path' (e.g., "/Animals") to a flat tag name
+ * (e.g., "Animals"); if 'path' is already a flat tag name, 'path' is returned untouched; note
+ * that 'path' must be a top-level path (i.e., "/Animals" not "/Animals/Mammals/...") with
+ * only one path component; invoking this method with a 'path' argument other than a top-level
+ * path will cause an assertion failure.
+ */
+ public static string hierarchical_to_flat(string path) {
+ if (path.has_prefix(Tag.PATH_SEPARATOR_STRING)) {
+ assert(enumerate_path_components(path).size == 1);
+
+ return path.substring(1);
+ } else {
+ return path;
+ }
+ }
+
+ /**
+ * given a path 'path', generate all parent paths of 'path' and return them in sorted order,
+ * from most basic to most derived. For example, if 'path' == "/Animals/Mammals/Elephant",
+ * the list { "/Animals", "/Animals/Mammals" } is returned
+ */
+ public static Gee.List<string> enumerate_parent_paths(string in_path) {
+ string path = flat_to_hierarchical(in_path);
+
+ Gee.List<string> result = new Gee.ArrayList<string>();
+
+ string accumulator = "";
+ foreach (string component in enumerate_path_components(path)) {
+ accumulator += (Tag.PATH_SEPARATOR_STRING + component);
+ if (accumulator != path)
+ result.add(accumulator);
+ }
+
+ return result;
+ }
+
+ /**
+ * given a path 'path', enumerate all of the components of 'path' and return them in
+ * order, excluding the path component separator. For example if
+ * 'path' == "/Animals/Mammals/Elephant" the list { "Animals", "Mammals", "Elephant" } will
+ * be returned
+ */
+ public static Gee.List<string> enumerate_path_components(string in_path) {
+ string path = flat_to_hierarchical(in_path);
+
+ Gee.ArrayList<string> components = new Gee.ArrayList<string>();
+
+ string[] raw_components = path.split(Tag.PATH_SEPARATOR_STRING);
+
+ foreach (string component in raw_components) {
+ if (component != "")
+ components.add(component);
+ }
+
+ assert(components.size > 0);
+
+ return components;
+ }
+
+ /**
+ * given a list of path elements, create a fully qualified path string.
+ * For example if 'path_elements' is the list { "Animals", "Mammals", "Elephant" }
+ * the path "/Animals/Mammals/Elephant" will be returned
+ */
+ public static string? join_path_components(string[] path_components) {
+ if (path_components.length <= 0)
+ return null;
+ string tmp = string.joinv(Tag.PATH_SEPARATOR_STRING, path_components);
+ return string.joinv(Tag.PATH_SEPARATOR_STRING, { "", tmp });
+ }
+
+ public static string get_basename(string in_path) {
+ string path = flat_to_hierarchical(in_path);
+
+ Gee.List<string> components = enumerate_path_components(path);
+
+ string basename = components.get(components.size - 1);
+
+ return basename;
+ }
+
+ public static string? canonicalize(string in_tag, string foreign_separator) {
+ string result = in_tag.replace(foreign_separator, Tag.PATH_SEPARATOR_STRING);
+
+ if (!result.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ result = Tag.PATH_SEPARATOR_STRING + result;
+
+ // ensure the result has text other than separators in it
+ bool is_valid = false;
+ for (int i = 0; i < result.length; i++) {
+ if (result[i] != Tag.PATH_SEPARATOR_STRING[0]) {
+ is_valid = true;
+ break;
+ }
+ }
+
+ return (is_valid) ? result : null;
+ }
+
+ public static string make_flat_tag_safe(string in_tag) {
+ return in_tag.replace(Tag.PATH_SEPARATOR_STRING, "-");
+ }
+
+ public static HierarchicalTagIndex process_hierarchical_import_keywords(Gee.Collection<string> h_keywords) {
+ HierarchicalTagIndex index = new HierarchicalTagIndex();
+
+ foreach (string keyword in h_keywords) {
+ Gee.List<string> parent_paths =
+ HierarchicalTagUtilities.enumerate_parent_paths(keyword);
+ Gee.List<string> path_components =
+ HierarchicalTagUtilities.enumerate_path_components(keyword);
+
+ assert(parent_paths.size <= path_components.size);
+
+ for (int i = 0; i < parent_paths.size; i++) {
+ if (!index.is_path_known(path_components[i]))
+ index.add_path(path_components[i], parent_paths[i]);
+ }
+
+ index.add_path(HierarchicalTagUtilities.get_basename(keyword), keyword);
+ }
+
+ return index;
+ }
+
+ public static string? get_root_path_form(string? client_path) {
+ if (client_path == null)
+ return null;
+
+ if (HierarchicalTagUtilities.enumerate_parent_paths(client_path).size != 0)
+ return client_path;
+
+ string path = client_path;
+
+ if (!Tag.global.exists(path)) {
+ if (path.has_prefix(Tag.PATH_SEPARATOR_STRING))
+ path = HierarchicalTagUtilities.hierarchical_to_flat(path);
+ else
+ path = HierarchicalTagUtilities.flat_to_hierarchical(path);
+ }
+
+ return (Tag.global.exists(path)) ? path : null;
+ }
+
+ public static void cleanup_root_path(string path) {
+ Gee.List<string> paths = HierarchicalTagUtilities.enumerate_parent_paths(path);
+
+ if (paths.size == 0) {
+ string? actual_path = HierarchicalTagUtilities.get_root_path_form(path);
+
+ if (actual_path == null)
+ return;
+
+ Tag? t = null;
+ if (Tag.global.exists(actual_path));
+ t = Tag.for_path(actual_path);
+
+ if (t != null && t.get_hierarchical_children().size == 0)
+ t.flatten();
+ }
+ }
+}
+
diff --git a/src/tags/TagPage.vala b/src/tags/TagPage.vala
new file mode 100644
index 0000000..f3ef237
--- /dev/null
+++ b/src/tags/TagPage.vala
@@ -0,0 +1,125 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class TagPage : CollectionPage {
+ private Tag tag;
+
+ public TagPage(Tag tag) {
+ base (tag.get_name());
+
+ this.tag = tag;
+
+ Tag.global.items_altered.connect(on_tags_altered);
+ tag.mirror_sources(get_view(), create_thumbnail);
+
+ init_page_context_menu("/TagsContextMenu");
+ }
+
+ ~TagPage() {
+ get_view().halt_mirroring();
+ Tag.global.items_altered.disconnect(on_tags_altered);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+ ui_filenames.add("tags.ui");
+ }
+
+ public Tag get_tag() {
+ return tag;
+ }
+
+ protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
+ Config.Facade.get_instance().get_event_photos_sort(out sort_order, out sort_by);
+ }
+
+ protected override void set_config_photos_sort(bool sort_order, int sort_by) {
+ Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by);
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry delete_tag = { "DeleteTag", null, TRANSLATABLE, null, null, on_delete_tag };
+ // label and tooltip are assigned when the menu is displayed
+ actions += delete_tag;
+
+ Gtk.ActionEntry rename_tag = { "RenameTag", null, TRANSLATABLE, null, null, on_rename_tag };
+ // label and tooltip are assigned when the menu is displayed
+ actions += rename_tag;
+
+ Gtk.ActionEntry remove_tag = { "RemoveTagFromPhotos", null, TRANSLATABLE, null, null,
+ on_remove_tag_from_photos };
+ // label and tooltip are assigned when the menu is displayed
+ actions += remove_tag;
+
+ Gtk.ActionEntry delete_tag_sidebar = { "DeleteTagSidebar", null, Resources.DELETE_TAG_SIDEBAR_MENU,
+ null, null, on_delete_tag };
+ actions += delete_tag_sidebar;
+
+ Gtk.ActionEntry rename_tag_sidebar = { "RenameTagSidebar", null, Resources.RENAME_TAG_SIDEBAR_MENU,
+ null, null, on_rename_tag };
+ actions += rename_tag_sidebar;
+
+ Gtk.ActionEntry new_child_tag_sidebar = { "NewChildTagSidebar", null, Resources.NEW_CHILD_TAG_SIDEBAR_MENU,
+ null, null, on_new_child_tag_sidebar };
+ actions += new_child_tag_sidebar;
+
+ return actions;
+ }
+
+ private void on_tags_altered(Gee.Map<DataObject, Alteration> map) {
+ if (map.has_key(tag)) {
+ set_page_name(tag.get_name());
+ update_actions(get_view().get_selected_count(), get_view().get_count());
+ }
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_details("DeleteTag",
+ Resources.delete_tag_menu(tag.get_user_visible_name()),
+ null,
+ true);
+
+ set_action_details("RenameTag",
+ Resources.rename_tag_menu(tag.get_user_visible_name()),
+ null,
+ true);
+
+ set_action_details("RemoveTagFromPhotos",
+ Resources.untag_photos_menu(tag.get_user_visible_name(), selected_count),
+ null,
+ selected_count > 0);
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_new_child_tag_sidebar() {
+ NewChildTagCommand creation_command = new NewChildTagCommand(tag);
+
+ AppWindow.get_command_manager().execute(creation_command);
+
+ LibraryWindow.get_app().rename_tag_in_sidebar(creation_command.get_created_child());
+ }
+
+ private void on_rename_tag() {
+ LibraryWindow.get_app().rename_tag_in_sidebar(tag);
+ }
+
+ private void on_delete_tag() {
+ if (Dialogs.confirm_delete_tag(tag))
+ AppWindow.get_command_manager().execute(new DeleteTagCommand(tag));
+ }
+
+ private void on_remove_tag_from_photos() {
+ if (get_view().get_selected_count() > 0) {
+ get_command_manager().execute(new TagUntagPhotosCommand(tag,
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources(),
+ get_view().get_selected_count(), false));
+ }
+ }
+}
+
diff --git a/src/tags/Tags.vala b/src/tags/Tags.vala
new file mode 100644
index 0000000..7d02a2f
--- /dev/null
+++ b/src/tags/Tags.vala
@@ -0,0 +1,18 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Tags {
+
+public void init() throws Error {
+ Tags.SidebarEntry.init();
+}
+
+public void terminate() {
+ Tags.SidebarEntry.terminate();
+}
+
+}
+
diff --git a/src/tags/mk/tags.mk b/src/tags/mk/tags.mk
new file mode 100644
index 0000000..6b2e193
--- /dev/null
+++ b/src/tags/mk/tags.mk
@@ -0,0 +1,32 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Tags
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := tags
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Branch.vala \
+ TagPage.vala \
+ HierarchicalTagIndex.vala \
+ HierarchicalTagUtilities.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES := \
+ Sidebar
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/threads/BackgroundJob.vala b/src/threads/BackgroundJob.vala
new file mode 100644
index 0000000..178211e
--- /dev/null
+++ b/src/threads/BackgroundJob.vala
@@ -0,0 +1,243 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// This callback is executed when an associated BackgroundJob completes. It is called from within
+// the Gtk event loop, *not* the background thread's context.
+public delegate void CompletionCallback(BackgroundJob job);
+
+// This callback is executed when an associated BackgroundJob has been cancelled (via its
+// Cancellable). Note that it's *possible* the BackgroundJob performed some or all of its work
+// prior to executing this delegate.
+public delegate void CancellationCallback(BackgroundJob job);
+
+// This callback is executed by the BackgroundJob when a unit of work is completed, but not the
+// entire job. It is called from within the Gtk event loop, *not* the background thread's
+// context.
+//
+// Note that there does not seem to be any guarantees of order in the Idle queue documentation,
+// and this it's possible (and, depending on assigned priorities, likely) that notifications could
+// arrive in different orders, and even after the CompletionCallback. Thus, no guarantee of
+// ordering is made here.
+//
+// NOTE: Would like Value to be nullable, but can't due to this bug:
+// https://bugzilla.gnome.org/show_bug.cgi?id=607098
+//
+// NOTE: There will be a memory leak using NotificationCallbacks due to this bug:
+// https://bugzilla.gnome.org/show_bug.cgi?id=571264
+//
+// NOTE: Because of these two bugs, using an abstract base class rather than Value. When both are
+// fixed (at least the second), may consider going back to Value.
+
+public abstract class NotificationObject {
+}
+
+public abstract class InterlockedNotificationObject : NotificationObject {
+ private Semaphore semaphore = new Semaphore();
+
+ // Only called by BackgroundJob; no need for users or subclasses to use
+ public void internal_wait_for_completion() {
+ semaphore.wait();
+ }
+
+ // Only called by BackgroundJob; no need for users or subclasses to use
+ public void internal_completed() {
+ semaphore.notify();
+ }
+}
+
+public delegate void NotificationCallback(BackgroundJob job, NotificationObject? user);
+
+// This abstract class represents a unit of work that can be executed within a background thread's
+// context. If specified, the job may be cancellable (which can be checked by execute() and the
+// worker thread prior to calling execute()). The BackgroundJob may also specify a
+// CompletionCallback and/or a CancellationCallback to be executed within Gtk's event loop.
+// A BackgroundJob may also emit NotificationCallbacks, all of which are also executed within
+// Gtk's event loop.
+//
+// The BackgroundJob may be constructed with a reference to its "owner". This is not used directly
+// by BackgroundJob or Worker, but merely exists to hold a reference to the Object that is receiving
+// the various callbacks from BackgroundJob. Without this, it's possible for the object creating
+// BackgroundJobs to be freed before all the callbacks have been received, or even during a callback,
+// which is an unstable situation.
+public abstract class BackgroundJob {
+ public enum JobPriority {
+ HIGHEST = 100,
+ HIGH = 75,
+ NORMAL = 50,
+ LOW = 25,
+ LOWEST = 0;
+
+ // Returns negative if this is higher, zero if equal, positive if this is lower
+ public int compare(JobPriority other) {
+ return (int) other - (int) this;
+ }
+
+ public static int compare_func(void *a, void *b) {
+ return (int) b - (int) a;
+ }
+ }
+
+ private class NotificationJob {
+ public unowned NotificationCallback callback;
+ public BackgroundJob background_job;
+ public NotificationObject? user;
+
+ public NotificationJob(NotificationCallback callback, BackgroundJob background_job,
+ NotificationObject? user) {
+ this.callback = callback;
+ this.background_job = background_job;
+ this.user = user;
+ }
+ }
+
+ private static Gee.ArrayList<NotificationJob> notify_queue = new Gee.ArrayList<NotificationJob>();
+
+ private Object owner;
+ private unowned CompletionCallback callback;
+ private Cancellable cancellable;
+ private unowned CancellationCallback cancellation;
+ private BackgroundJob self = null;
+ private AbstractSemaphore semaphore = null;
+
+ // The thinking here is that there is exactly one CompletionCallback per job, and the caller
+ // probably wants to know that to set off UI and other events in response. There are several
+ // (possibly hundreds or thousands) or notifications, and thus should arrive in a more
+ // controlled way (to avoid locking up the UI, for example). This has ramifications about
+ // the order in which completion and notifications arrive (see above note).
+ private int completion_priority = Priority.HIGH;
+ private int notification_priority = Priority.DEFAULT_IDLE;
+
+ public BackgroundJob(Object? owner = null, CompletionCallback? callback = null,
+ Cancellable? cancellable = null, CancellationCallback? cancellation = null,
+ AbstractSemaphore? completion_semaphore = null) {
+ this.owner = owner;
+ this.callback = callback;
+ this.cancellable = cancellable;
+ this.cancellation = cancellation;
+ this.semaphore = completion_semaphore;
+ }
+
+ public abstract void execute();
+
+ public virtual JobPriority get_priority() {
+ return JobPriority.NORMAL;
+ }
+
+ // For the CompareFunc delegate, according to JobPriority.
+ public static int priority_compare_func(BackgroundJob a, BackgroundJob b) {
+ return a.get_priority().compare(b.get_priority());
+ }
+
+ // For the Comparator delegate, according to JobPriority.
+ public static int64 priority_comparator(void *a, void *b) {
+ return priority_compare_func((BackgroundJob) a, (BackgroundJob) b);
+ }
+
+ // This method is not thread-safe. Best to set priority before the job is enqueued.
+ public void set_completion_priority(int priority) {
+ completion_priority = priority;
+ }
+
+ // This method is not thread-safe. Best to set priority before the job is enqueued.
+ public void set_notification_priority(int priority) {
+ notification_priority = priority;
+ }
+
+ // This method is thread-safe, but only waits if a completion semaphore has been set, otherwise
+ // exits immediately. Note that blocking for a semaphore does NOT spin the event loop, so a
+ // thread relying on it to continue should not use this.
+ public void wait_for_completion() {
+ if (semaphore != null)
+ semaphore.wait();
+ }
+
+ public Cancellable? get_cancellable() {
+ return cancellable;
+ }
+
+ public bool is_cancelled() {
+ return (cancellable != null) ? cancellable.is_cancelled() : false;
+ }
+
+ public void cancel() {
+ if (cancellable != null)
+ cancellable.cancel();
+ }
+
+ // This should only be called by Workers. Beware to all who fail to heed.
+ public void internal_notify_completion() {
+ if (semaphore != null)
+ semaphore.notify();
+
+ if (callback == null && cancellation == null)
+ return;
+
+ if (is_cancelled() && cancellation == null)
+ return;
+
+ // Because Idle doesn't maintain a ref count of the job, and it's going to be dropped by
+ // the worker thread soon, need to maintain a ref until the completion callback is made
+ self = this;
+
+ Idle.add_full(completion_priority, on_notify_completion);
+ }
+
+ private bool on_notify_completion() {
+ // it's still possible the caller cancelled this operation during or after the execute()
+ // method was called ... since the completion work can be costly for a job that was
+ // already cancelled, and the caller might've dropped all references to the job by now,
+ // only notify completion in this context if not cancelled
+ if (is_cancelled()) {
+ if (cancellation != null)
+ cancellation(this);
+ } else {
+ if (callback != null)
+ callback(this);
+ }
+
+ // drop the ref so this object can be freed ... must not touch "this" after this point
+ self = null;
+
+ return false;
+ }
+
+ // This call may be executed by the child class during execute() to inform of a unit of
+ // work being completed
+ protected void notify(NotificationCallback callback, NotificationObject? user) {
+ lock (notify_queue) {
+ notify_queue.add(new NotificationJob(callback, this, user));
+ }
+
+ Idle.add_full(notification_priority, on_notification_ready);
+
+ // If an interlocked notification, block until the main thread completes the notification
+ // callback
+ InterlockedNotificationObject? interlocked = user as InterlockedNotificationObject;
+ if (interlocked != null)
+ interlocked.internal_wait_for_completion();
+ }
+
+ private bool on_notification_ready() {
+ // this is called once for every notification added, so there should always be something
+ // waiting for us
+ NotificationJob? notification_job = null;
+ lock (notify_queue) {
+ if (notify_queue.size > 0)
+ notification_job = notify_queue.remove_at(0);
+ }
+ assert(notification_job != null);
+
+ notification_job.callback(notification_job.background_job, notification_job.user);
+
+ // Release the blocked thread waiting for this notification to complete
+ InterlockedNotificationObject? interlocked = notification_job.user as InterlockedNotificationObject;
+ if (interlocked != null)
+ interlocked.internal_completed();
+
+ return false;
+ }
+}
+
diff --git a/src/threads/Semaphore.vala b/src/threads/Semaphore.vala
new file mode 100644
index 0000000..dfb0a2f
--- /dev/null
+++ b/src/threads/Semaphore.vala
@@ -0,0 +1,160 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Semaphores may be used to be notified when a job is completed. This provides an alternate
+// mechanism (essentially, a blocking mechanism) to the system of callbacks that BackgroundJob
+// offers. They can also be used for other job-dependent notification mechanisms.
+public abstract class AbstractSemaphore {
+ public enum Type {
+ SERIAL,
+ BROADCAST
+ }
+
+ protected enum NotifyAction {
+ NONE,
+ SIGNAL
+ }
+
+ protected enum WaitAction {
+ SLEEP,
+ READY
+ }
+
+ private Type type;
+ private Mutex mutex = Mutex();
+ private Cond monitor = Cond();
+
+ public AbstractSemaphore(Type type) {
+ assert(type == Type.SERIAL || type == Type.BROADCAST);
+
+ this.type = type;
+ }
+
+ private void trigger() {
+ if (type == Type.SERIAL)
+ monitor.signal();
+ else
+ monitor.broadcast();
+ }
+
+ public void notify() {
+ mutex.lock();
+
+ NotifyAction action = do_notify();
+ switch (action) {
+ case NotifyAction.NONE:
+ // do nothing
+ break;
+
+ case NotifyAction.SIGNAL:
+ trigger();
+ break;
+
+ default:
+ error("Unknown semaphore action: %s", action.to_string());
+ }
+
+ mutex.unlock();
+ }
+
+ // This method is called by notify() with the semaphore's mutex locked.
+ protected abstract NotifyAction do_notify();
+
+ public void wait() {
+ mutex.lock();
+
+ while (do_wait() == WaitAction.SLEEP)
+ monitor.wait(mutex);
+
+ mutex.unlock();
+ }
+
+ // This method is called by wait() with the semaphore's mutex locked.
+ protected abstract WaitAction do_wait();
+
+ // Returns true if the semaphore is reset, false otherwise.
+ public bool reset() {
+ mutex.lock();
+ bool is_reset = do_reset();
+ mutex.unlock();
+
+ return is_reset;
+ }
+
+ // This method is called by reset() with the semaphore's mutex locked. Returns true if reset,
+ // false if not supported.
+ protected virtual bool do_reset() {
+ return false;
+ }
+}
+
+public class Semaphore : AbstractSemaphore {
+ bool passed = false;
+
+ public Semaphore() {
+ base (AbstractSemaphore.Type.BROADCAST);
+ }
+
+ protected override AbstractSemaphore.NotifyAction do_notify() {
+ if (passed)
+ return NotifyAction.NONE;
+
+ passed = true;
+
+ return NotifyAction.SIGNAL;
+ }
+
+ protected override AbstractSemaphore.WaitAction do_wait() {
+ return passed ? WaitAction.READY : WaitAction.SLEEP;
+ }
+}
+
+public class CountdownSemaphore : AbstractSemaphore {
+ private int total;
+ private int passed = 0;
+
+ public CountdownSemaphore(int total) {
+ base (AbstractSemaphore.Type.BROADCAST);
+
+ this.total = total;
+ }
+
+ protected override AbstractSemaphore.NotifyAction do_notify() {
+ if (passed >= total)
+ critical("CountdownSemaphore overrun: %d/%d", passed + 1, total);
+
+ return (++passed >= total) ? NotifyAction.SIGNAL : NotifyAction.NONE;
+ }
+
+ protected override AbstractSemaphore.WaitAction do_wait() {
+ return (passed < total) ? WaitAction.SLEEP : WaitAction.READY;
+ }
+}
+
+public class EventSemaphore : AbstractSemaphore {
+ bool fired = false;
+
+ public EventSemaphore() {
+ base (AbstractSemaphore.Type.BROADCAST);
+ }
+
+ protected override AbstractSemaphore.NotifyAction do_notify() {
+ fired = true;
+
+ return NotifyAction.SIGNAL;
+ }
+
+ protected override AbstractSemaphore.WaitAction do_wait() {
+ return fired ? WaitAction.READY : WaitAction.SLEEP;
+ }
+
+ protected override bool do_reset() {
+ fired = false;
+
+ return true;
+ }
+}
+
diff --git a/src/threads/Threads.vala b/src/threads/Threads.vala
new file mode 100644
index 0000000..0e1b1ec
--- /dev/null
+++ b/src/threads/Threads.vala
@@ -0,0 +1,14 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Threads {
+ public void init() throws Error {
+ }
+
+ public void terminate() {
+ }
+}
+
diff --git a/src/threads/Workers.vala b/src/threads/Workers.vala
new file mode 100644
index 0000000..756eb01
--- /dev/null
+++ b/src/threads/Workers.vala
@@ -0,0 +1,104 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+
+public class BackgroundJobBatch : SortedList<BackgroundJob> {
+ public BackgroundJobBatch() {
+ base (BackgroundJob.priority_comparator);
+ }
+}
+
+// Workers wraps some of ThreadPool's oddities up into an interface that emphasizes BackgroundJobs.
+public class Workers {
+ public const int UNLIMITED_THREADS = -1;
+
+ private ThreadPool<void *> thread_pool;
+ private AsyncQueue<BackgroundJob> queue = new AsyncQueue<BackgroundJob>();
+ private EventSemaphore empty_event = new EventSemaphore();
+ private int enqueued = 0;
+
+ public Workers(int max_threads, bool exclusive) {
+ if (max_threads <= 0 && max_threads != UNLIMITED_THREADS)
+ max_threads = 1;
+
+ // event starts as set because queue is empty
+ empty_event.notify();
+
+ try {
+ thread_pool = new ThreadPool<void *>.with_owned_data(thread_start, max_threads, exclusive);
+ } catch (ThreadError err) {
+ error("Unable to create thread pool: %s", err.message);
+ }
+ }
+
+ public static int threads_per_cpu(int per = 1, int max = -1) requires (per > 0) ensures (result > 0) {
+ int count = number_of_processors() * per;
+
+ return (max < 0) ? count : count.clamp(0, max);
+ }
+
+ // This is useful when the intent is for the worker threads to use all the CPUs minus one for
+ // the main/UI thread. (No guarantees, of course.)
+ public static int thread_per_cpu_minus_one() ensures (result > 0) {
+ return (number_of_processors() - 1).clamp(1, int.MAX);
+ }
+
+ // Enqueues a BackgroundJob for work in a thread context. BackgroundJob.execute() is called
+ // within the thread's context, while its CompletionCallback is called within the Gtk event loop.
+ public void enqueue(BackgroundJob job) {
+ empty_event.reset();
+
+ lock (queue) {
+ queue.push_sorted(job, BackgroundJob.priority_compare_func);
+ enqueued++;
+ }
+
+ try {
+ thread_pool.add(job);
+ } catch (ThreadError err) {
+ // error should only occur when a thread could not be created, in which case, the
+ // BackgroundJob is queued up
+ warning("Unable to create worker thread: %s", err.message);
+ }
+ }
+
+ public void enqueue_many(BackgroundJobBatch batch) {
+ foreach (BackgroundJob job in batch)
+ enqueue(job);
+ }
+
+ public void wait_for_empty_queue() {
+ empty_event.wait();
+ }
+
+ // Returns the number of BackgroundJobs on the queue, not including active jobs.
+ public int get_pending_job_count() {
+ lock (queue) {
+ return enqueued;
+ }
+ }
+
+ private void thread_start(void *ignored) {
+ BackgroundJob? job;
+ bool empty;
+ lock (queue) {
+ job = queue.try_pop();
+ assert(job != null);
+
+ assert(enqueued > 0);
+ empty = (--enqueued == 0);
+ }
+
+ if (!job.is_cancelled())
+ job.execute();
+
+ job.internal_notify_completion();
+
+ if (empty)
+ empty_event.notify();
+ }
+}
+
diff --git a/src/threads/mk/threads.mk b/src/threads/mk/threads.mk
new file mode 100644
index 0000000..83afc47
--- /dev/null
+++ b/src/threads/mk/threads.mk
@@ -0,0 +1,30 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Threads
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := threads
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ Workers.vala \
+ BackgroundJob.vala \
+ Semaphore.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/unit/Unit.vala b/src/unit/Unit.vala
new file mode 100644
index 0000000..f297974
--- /dev/null
+++ b/src/unit/Unit.vala
@@ -0,0 +1,14 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Unit {
+ public void init() throws Error {
+ }
+
+ public void terminate() {
+ }
+}
+
diff --git a/src/unit/mk/unit.mk b/src/unit/mk/unit.mk
new file mode 100644
index 0000000..618ebca
--- /dev/null
+++ b/src/unit/mk/unit.mk
@@ -0,0 +1,32 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Unit
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := unit
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES :=
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC := \
+ rc/UnitInternals.m4 \
+ rc/Unit.m4 \
+ rc/template.mk \
+ rc/unitize_entry.m4 \
+ rc/template.vala
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/unit/rc/Unit.m4 b/src/unit/rc/Unit.m4
new file mode 100644
index 0000000..13ef6a7
--- /dev/null
+++ b/src/unit/rc/Unit.m4
@@ -0,0 +1,29 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+/* This file is the master unit file for the _UNIT_NAME_ unit. It should be edited to include
+ * whatever code is deemed necessary.
+ *
+ * The init() and terminate() methods are mandatory.
+ *
+ * If the unit needs to be configured prior to initialization, add the proper parameters to
+ * the preconfigure() method, implement it, and ensure in init() that it's been called.
+ */
+
+namespace _UNIT_NAME_ {
+
+// preconfigure may be deleted if not used.
+public void preconfigure() {
+}
+
+public void init() throws Error {
+}
+
+public void terminate() {
+}
+
+}
+
diff --git a/src/unit/rc/UnitInternals.m4 b/src/unit/rc/UnitInternals.m4
new file mode 100644
index 0000000..4fe3153
--- /dev/null
+++ b/src/unit/rc/UnitInternals.m4
@@ -0,0 +1,32 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ *
+ * Auto-generated file. Do not modify!
+ */
+
+namespace _UNIT_NAME_ {
+
+private int _unit_init_count = 0;
+
+public void init_entry() throws Error {
+ if (_unit_init_count++ != 0)
+ return;
+
+ _UNIT_USES_INITS_
+
+ _UNIT_NAME_.init();
+}
+
+public void terminate_entry() {
+ if (_unit_init_count == 0 || --_unit_init_count != 0)
+ return;
+
+ _UNIT_NAME_.terminate();
+
+ _UNIT_USES_TERMINATORS_
+}
+
+}
+
diff --git a/src/unit/rc/template.mk b/src/unit/rc/template.mk
new file mode 100644
index 0000000..34873d3
--- /dev/null
+++ b/src/unit/rc/template.mk
@@ -0,0 +1,27 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := _UNIT_NAME_
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := _UNIT_DIR_
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES :=
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/unit/rc/template.vala b/src/unit/rc/template.vala
new file mode 100644
index 0000000..4869700
--- /dev/null
+++ b/src/unit/rc/template.vala
@@ -0,0 +1,7 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+
diff --git a/src/unit/rc/unitize_entry.m4 b/src/unit/rc/unitize_entry.m4
new file mode 100644
index 0000000..34407e4
--- /dev/null
+++ b/src/unit/rc/unitize_entry.m4
@@ -0,0 +1,19 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ *
+ * Auto-generated file. Do not modify!
+ */
+
+namespace _APP_UNIT_ {
+
+public void app_init() throws Error {
+ _APP_UNIT_.init_entry();
+}
+
+public void app_terminate() {
+ _APP_UNIT_.terminate_entry();
+}
+
+}
diff --git a/src/util/KeyValueMap.vala b/src/util/KeyValueMap.vala
new file mode 100644
index 0000000..c1f5a55
--- /dev/null
+++ b/src/util/KeyValueMap.vala
@@ -0,0 +1,118 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public class KeyValueMap {
+ private string group;
+ private Gee.HashMap<string, string> map = new Gee.HashMap<string, string>();
+
+ public KeyValueMap(string group) {
+ this.group = group;
+ }
+
+ public KeyValueMap copy() {
+ KeyValueMap clone = new KeyValueMap(group);
+ foreach (string key in map.keys)
+ clone.map.set(key, map.get(key));
+
+ return clone;
+ }
+
+ public string get_group() {
+ return group;
+ }
+
+ public Gee.Set<string> get_keys() {
+ return map.keys;
+ }
+
+ public bool has_key(string key) {
+ return map.has_key(key);
+ }
+
+ public void set_string(string key, string value) {
+ assert(key != null);
+
+ map.set(key, value);
+ }
+
+ public void set_int(string key, int value) {
+ assert(key != null);
+
+ map.set(key, value.to_string());
+ }
+
+ public void set_double(string key, double value) {
+ assert(key != null);
+
+ map.set(key, value.to_string());
+ }
+
+ public void set_float(string key, float value) {
+ assert(key != null);
+
+ map.set(key, value.to_string());
+ }
+
+ public void set_bool(string key, bool value) {
+ assert(key != null);
+
+ map.set(key, value.to_string());
+ }
+
+ public string get_string(string key, string? def) {
+ string value = map.get(key);
+
+ return (value != null) ? value : def;
+ }
+
+ public int get_int(string key, int def) {
+ string value = map.get(key);
+
+ return (value != null) ? int.parse(value) : def;
+ }
+
+ public double get_double(string key, double def) {
+ string value = map.get(key);
+
+ return (value != null) ? double.parse(value) : def;
+ }
+
+ public float get_float(string key, float def) {
+ string value = map.get(key);
+
+ return (value != null) ? (float) double.parse(value) : def;
+ }
+
+ public bool get_bool(string key, bool def) {
+ string value = map.get(key);
+
+ return (value != null) ? bool.parse(value) : def;
+ }
+
+ // REDEYE: redeye reduction operates on circular regions defined by
+ // (Gdk.Point, int) pairs, where the Gdk.Point specifies the
+ // bounding circle's center and the the int specifies the circle's
+ // radius so, get_point( ) and set_point( ) functions have been
+ // added here to easily encode/decode Gdk.Points as strings.
+ public Gdk.Point get_point(string key, Gdk.Point def) {
+ string value = map.get(key);
+
+ if (value == null) {
+ return def;
+ } else {
+ Gdk.Point result = {0};
+ if (value.scanf("(%d, %d)", &result.x, &result.y) == 2)
+ return result;
+ else
+ return def;
+ }
+ }
+
+ public void set_point(string key, Gdk.Point point) {
+ map.set(key, "(%d, %d)".printf(point.x, point.y));
+ }
+}
+
diff --git a/src/util/Util.vala b/src/util/Util.vala
new file mode 100644
index 0000000..c754ff8
--- /dev/null
+++ b/src/util/Util.vala
@@ -0,0 +1,17 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Util {
+ // Use these file attributes when loading file information for a complete FileInfo objects
+ public const string FILE_ATTRIBUTES = "standard::*,time::*,id::file,id::filesystem,etag::value";
+
+ public void init() throws Error {
+ }
+
+ public void terminate() {
+ }
+}
+
diff --git a/src/util/file.vala b/src/util/file.vala
new file mode 100644
index 0000000..1b6bb6c
--- /dev/null
+++ b/src/util/file.vala
@@ -0,0 +1,241 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+// Returns true if the file is claimed, false if it exists, and throws an Error otherwise. The file
+// will be created when the function exits and should be overwritten. Note that the file is not
+// held open; claiming a file is merely based on its existence.
+//
+// This function is thread-safe.
+public bool claim_file(File file) throws Error {
+ try {
+ file.create(FileCreateFlags.NONE, null);
+
+ // created; success
+ return true;
+ } catch (Error err) {
+ // check for file-exists error
+ if (!(err is IOError.EXISTS)) {
+ warning("claim_file %s: %s", file.get_path(), err.message);
+
+ throw err;
+ }
+
+ return false;
+ }
+}
+
+// This function "claims" a file on the filesystem in the directory specified with a basename the
+// same or similar as what has been requested (adds numerals to the end of the name until a unique
+// one has been found). The file may exist when this function returns, and it should be
+// overwritten. It does *not* attempt to create the parent directory, however.
+//
+// This function is thread-safe.
+public File? generate_unique_file(File dir, string basename, out bool collision) throws Error {
+ // create the file to atomically "claim" it
+ File file = dir.get_child(basename);
+ if (claim_file(file)) {
+ collision = false;
+
+ return file;
+ }
+
+ // file exists, note collision and keep searching
+ collision = true;
+
+ string name, ext;
+ disassemble_filename(basename, out name, out ext);
+
+ // generate a unique filename
+ for (int ctr = 1; ctr < int.MAX; ctr++) {
+ string new_name = (ext != null) ? "%s_%d.%s".printf(name, ctr, ext) : "%s_%d".printf(name, ctr);
+
+ file = dir.get_child(new_name);
+ if (claim_file(file))
+ return file;
+ }
+
+ warning("generate_unique_filename %s for %s: unable to claim file", dir.get_path(), basename);
+
+ return null;
+}
+
+public void disassemble_filename(string basename, out string name, out string ext) {
+ long offset = find_last_offset(basename, '.');
+ if (offset <= 0) {
+ name = basename;
+ ext = null;
+ } else {
+ name = basename.substring(0, offset);
+ ext = basename.substring(offset + 1, -1);
+ }
+}
+
+// This function is thread-safe.
+public uint64 query_total_file_size(File file_or_dir, Cancellable? cancellable = null) throws Error {
+ FileType type = file_or_dir.query_file_type(FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ if (type == FileType.REGULAR) {
+ FileInfo info = null;
+ try {
+ info = file_or_dir.query_info(FileAttribute.STANDARD_SIZE,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, cancellable);
+ } catch (Error err) {
+ if (err is IOError.CANCELLED)
+ throw err;
+
+ debug("Unable to query filesize for %s: %s", file_or_dir.get_path(), err.message);
+
+ return 0;
+ }
+
+ return info.get_size();
+ } else if (type != FileType.DIRECTORY) {
+ return 0;
+ }
+
+ FileEnumerator enumerator;
+ try {
+ enumerator = file_or_dir.enumerate_children(FileAttribute.STANDARD_NAME,
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, cancellable);
+ if (enumerator == null)
+ return 0;
+ } catch (Error err) {
+ // Don't treat a permissions failure as a hard failure, just skip the directory
+ if (err is FileError.PERM || err is IOError.PERMISSION_DENIED)
+ return 0;
+
+ throw err;
+ }
+
+ uint64 total_bytes = 0;
+
+ FileInfo info = null;
+ while ((info = enumerator.next_file(cancellable)) != null)
+ total_bytes += query_total_file_size(file_or_dir.get_child(info.get_name()), cancellable);
+
+ return total_bytes;
+}
+
+// Does not currently recurse. Could be modified to do so. Does not error out on first file that
+// does not delete, but logs a warning and continues.
+// Note: if supplying a progress monitor, a file count is also required. The count_files_in_directory()
+// function below should do the trick.
+public void delete_all_files(File dir, Gee.Set<string>? exceptions = null, ProgressMonitor? monitor = null,
+ uint64 file_count = 0, Cancellable? cancellable = null) throws Error {
+ FileType type = dir.query_file_type(FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ if (type != FileType.DIRECTORY)
+ throw new IOError.NOT_DIRECTORY("%s is not a directory".printf(dir.get_path()));
+
+ FileEnumerator enumerator = dir.enumerate_children("standard::name,standard::type",
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, cancellable);
+ FileInfo info = null;
+ uint64 i = 0;
+ while ((info = enumerator.next_file(cancellable)) != null) {
+ if (info.get_file_type() != FileType.REGULAR)
+ continue;
+
+ if (exceptions != null && exceptions.contains(info.get_name()))
+ continue;
+
+ File file = dir.get_child(info.get_name());
+ try {
+ file.delete(cancellable);
+ } catch (Error err) {
+ warning("Unable to delete file %s: %s", file.get_path(), err.message);
+ }
+
+ if (monitor != null && file_count > 0)
+ monitor(file_count, ++i);
+ }
+}
+
+public time_t query_file_modified(File file) throws Error {
+ FileInfo info = file.query_info(FileAttribute.TIME_MODIFIED, FileQueryInfoFlags.NOFOLLOW_SYMLINKS,
+ null);
+
+ return info.get_modification_time().tv_sec;
+}
+
+public bool query_is_directory(File file) {
+ return file.query_file_type(FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null) == FileType.DIRECTORY;
+}
+
+public bool query_is_directory_empty(File dir) throws Error {
+ if (dir.query_file_type(FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null) != FileType.DIRECTORY)
+ return false;
+
+ FileEnumerator enumerator = dir.enumerate_children("standard::name",
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+ if (enumerator == null)
+ return false;
+
+ return enumerator.next_file(null) == null;
+}
+
+public string get_display_pathname(File file) {
+ // attempt to replace home path with tilde in a user-pleasable way
+ string path = file.get_parse_name();
+ string home = Environment.get_home_dir();
+
+ if (path == home)
+ return "~";
+
+ if (path.has_prefix(home))
+ return "~%s".printf(path.substring(home.length));
+
+ return path;
+}
+
+public string strip_pretty_path(string path) {
+ if (!path.has_prefix("~"))
+ return path;
+
+ return Environment.get_home_dir() + path.substring(1);
+}
+
+public string? get_file_info_id(FileInfo info) {
+ return info.get_attribute_string(FileAttribute.ID_FILE);
+}
+
+// Breaks a uint64 skip amount into several smaller skips.
+public void skip_uint64(InputStream input, uint64 skip_amount) throws GLib.Error {
+ while (skip_amount > 0) {
+ // skip() throws an error if the amount is too large, so check against ssize_t.MAX
+ if (skip_amount >= ssize_t.MAX) {
+ input.skip(ssize_t.MAX);
+ skip_amount -= ssize_t.MAX;
+ } else {
+ input.skip((size_t) skip_amount);
+ skip_amount = 0;
+ }
+ }
+}
+
+// Returns the number of files (and/or directories) within a directory.
+public uint64 count_files_in_directory(File dir) throws GLib.Error {
+ if (!query_is_directory(dir))
+ return 0;
+
+ uint64 count = 0;
+ FileEnumerator enumerator = dir.enumerate_children("standard::*",
+ FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
+
+ FileInfo info = null;
+ while ((info = enumerator.next_file()) != null)
+ count++;
+
+ return count;
+}
+
+// Replacement for deprecated Gio.file_equal
+public bool file_equal(File? a, File? b) {
+ return (a != null && b != null) ? a.equal(b) : false;
+}
+
+// Replacement for deprecated Gio.file_hash
+public uint file_hash(File? file) {
+ return file != null ? file.hash() : 0;
+}
+
diff --git a/src/util/image.vala b/src/util/image.vala
new file mode 100644
index 0000000..e8f93ba
--- /dev/null
+++ b/src/util/image.vala
@@ -0,0 +1,364 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+bool is_color_parsable(string spec) {
+ Gdk.Color color;
+ return Gdk.Color.parse(spec, out color);
+}
+
+Gdk.RGBA parse_color(string spec) {
+ return fetch_color(spec);
+}
+
+Gdk.RGBA fetch_color(string spec) {
+ Gdk.RGBA rgba = Gdk.RGBA();
+ if (!rgba.parse(spec))
+ error("Can't parse color %s", spec);
+
+ return rgba;
+}
+
+void set_source_color_from_string(Cairo.Context ctx, string spec) {
+ Gdk.RGBA rgba = fetch_color(spec);
+ ctx.set_source_rgba(rgba.red, rgba.green, rgba.blue, rgba.alpha);
+}
+
+private const int MIN_SCALED_WIDTH = 10;
+private const int MIN_SCALED_HEIGHT = 10;
+
+Gdk.Pixbuf scale_pixbuf(Gdk.Pixbuf pixbuf, int scale, Gdk.InterpType interp, bool scale_up) {
+ Dimensions original = Dimensions.for_pixbuf(pixbuf);
+ Dimensions scaled = original.get_scaled(scale, scale_up);
+ if ((original.width == scaled.width) && (original.height == scaled.height))
+ return pixbuf;
+
+ // use sane minimums ... scale_simple will hang if this is too low
+ scaled = scaled.with_min(MIN_SCALED_WIDTH, MIN_SCALED_HEIGHT);
+
+ return pixbuf.scale_simple(scaled.width, scaled.height, interp);
+}
+
+Gdk.Pixbuf resize_pixbuf(Gdk.Pixbuf pixbuf, Dimensions resized, Gdk.InterpType interp) {
+ Dimensions original = Dimensions.for_pixbuf(pixbuf);
+ if (original.width == resized.width && original.height == resized.height)
+ return pixbuf;
+
+ // use sane minimums ... scale_simple will hang if this is too low
+ resized = resized.with_min(MIN_SCALED_WIDTH, MIN_SCALED_HEIGHT);
+
+ return pixbuf.scale_simple(resized.width, resized.height, interp);
+}
+
+private const double DEGREE = Math.PI / 180.0;
+
+void draw_rounded_corners_filled(Cairo.Context ctx, Dimensions dim, Gdk.Point origin,
+ double radius_proportion) {
+ context_rounded_corners(ctx, dim, origin, radius_proportion);
+ ctx.paint();
+}
+
+void context_rounded_corners(Cairo.Context cx, Dimensions dim, Gdk.Point origin,
+ double radius_proportion) {
+ // establish a reasonable range
+ radius_proportion = radius_proportion.clamp(2.0, 100.0);
+
+ double left = origin.x;
+ double top = origin.y;
+ double right = origin.x + dim.width;
+ double bottom = origin.y + dim.height;
+
+ // the radius of the corners is proportional to the distance of the minor axis
+ double radius = ((double) dim.minor_axis()) / radius_proportion;
+
+ // create context and clipping region, starting from the top right arc and working around
+ // clockwise
+ cx.move_to(left, top);
+ cx.arc(right - radius, top + radius, radius, -90 * DEGREE, 0 * DEGREE);
+ cx.arc(right - radius, bottom - radius, radius, 0 * DEGREE, 90 * DEGREE);
+ cx.arc(left + radius, bottom - radius, radius, 90 * DEGREE, 180 * DEGREE);
+ cx.arc(left + radius, top + radius, radius, 180 * DEGREE, 270 * DEGREE);
+ cx.clip();
+}
+
+inline uchar shift_color_byte(int b, int shift) {
+ return (uchar) (b + shift).clamp(0, 255);
+}
+
+public void shift_colors(Gdk.Pixbuf pixbuf, int red, int green, int blue, int alpha) {
+ assert(red >= -255 && red <= 255);
+ assert(green >= -255 && green <= 255);
+ assert(blue >= -255 && blue <= 255);
+ assert(alpha >= -255 && alpha <= 255);
+
+ int width = pixbuf.get_width();
+ int height = pixbuf.get_height();
+ int rowstride = pixbuf.get_rowstride();
+ int channels = pixbuf.get_n_channels();
+ uchar *pixels = pixbuf.get_pixels();
+
+ assert(channels >= 3);
+ assert(pixbuf.get_colorspace() == Gdk.Colorspace.RGB);
+ assert(pixbuf.get_bits_per_sample() == 8);
+
+ for (int y = 0; y < height; y++) {
+ int y_offset = y * rowstride;
+
+ for (int x = 0; x < width; x++) {
+ int offset = y_offset + (x * channels);
+
+ if (red != 0)
+ pixels[offset] = shift_color_byte(pixels[offset], red);
+
+ if (green != 0)
+ pixels[offset + 1] = shift_color_byte(pixels[offset + 1], green);
+
+ if (blue != 0)
+ pixels[offset + 2] = shift_color_byte(pixels[offset + 2], blue);
+
+ if (alpha != 0 && channels >= 4)
+ pixels[offset + 3] = shift_color_byte(pixels[offset + 3], alpha);
+ }
+ }
+}
+
+public void dim_pixbuf(Gdk.Pixbuf pixbuf) {
+ PixelTransformer transformer = new PixelTransformer();
+ SaturationTransformation sat = new SaturationTransformation(SaturationTransformation.MIN_PARAMETER);
+ transformer.attach_transformation(sat);
+ transformer.transform_pixbuf(pixbuf);
+ shift_colors(pixbuf, 0, 0, 0, -100);
+}
+
+bool coord_in_rectangle(int x, int y, Gdk.Rectangle rect) {
+ return (x >= rect.x && x < (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height));
+}
+
+public bool rectangles_equal(Gdk.Rectangle a, Gdk.Rectangle b) {
+ return (a.x == b.x) && (a.y == b.y) && (a.width == b.width) && (a.height == b.height);
+}
+
+public string rectangle_to_string(Gdk.Rectangle rect) {
+ return "%d,%d %dx%d".printf(rect.x, rect.y, rect.width, rect.height);
+}
+
+public Gdk.Rectangle clamp_rectangle(Gdk.Rectangle original, Dimensions max) {
+ Gdk.Rectangle rect = Gdk.Rectangle();
+ rect.x = original.x.clamp(0, max.width);
+ rect.y = original.y.clamp(0, max.height);
+ rect.width = original.width.clamp(0, max.width);
+ rect.height = original.height.clamp(0, max.height);
+
+ return rect;
+}
+
+public Gdk.Point scale_point(Gdk.Point p, double factor) {
+ Gdk.Point result = {0};
+ result.x = (int) (factor * p.x + 0.5);
+ result.y = (int) (factor * p.y + 0.5);
+
+ return result;
+}
+
+public Gdk.Point add_points(Gdk.Point p1, Gdk.Point p2) {
+ Gdk.Point result = {0};
+ result.x = p1.x + p2.x;
+ result.y = p1.y + p2.y;
+
+ return result;
+}
+
+public Gdk.Point subtract_points(Gdk.Point p1, Gdk.Point p2) {
+ Gdk.Point result = {0};
+ result.x = p1.x - p2.x;
+ result.y = p1.y - p2.y;
+
+ return result;
+}
+
+// Converts XRGB/ARGB (Cairo)-formatted pixels to RGBA (GDK).
+void fix_cairo_pixbuf(Gdk.Pixbuf pixbuf) {
+ uchar *gdk_pixels = pixbuf.pixels;
+ for (int j = 0 ; j < pixbuf.height; ++j) {
+ uchar *p = gdk_pixels;
+ uchar *end = p + 4 * pixbuf.width;
+
+ while (p < end) {
+ uchar tmp = p[0];
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+ p[0] = p[2];
+ p[2] = tmp;
+#else
+ p[0] = p[1];
+ p[1] = p[2];
+ p[2] = p[3];
+ p[3] = tmp;
+#endif
+ p += 4;
+ }
+
+ gdk_pixels += pixbuf.rowstride;
+ }
+}
+
+/**
+ * Finds the size of the smallest axially-aligned rectangle that could contain
+ * a rectangle src_width by src_height, rotated by angle.
+ *
+ * @param src_width The width of the incoming rectangle.
+ * @param src_height The height of the incoming rectangle.
+ * @param angle The amount to rotate by, given in degrees.
+ * @param dest_width The width of the computed rectangle.
+ * @param dest_height The height of the computed rectangle.
+ */
+void compute_arb_rotated_size(double src_width, double src_height, double angle,
+ out double dest_width, out double dest_height) {
+
+ angle = Math.fabs(degrees_to_radians(angle));
+ assert(angle <= Math.PI_2);
+ dest_width = src_width * Math.cos(angle) + src_height * Math.sin(angle);
+ dest_height = src_height * Math.cos(angle) + src_width * Math.sin(angle);
+}
+
+/**
+ * @brief Rotates a pixbuf to an arbitrary angle, given in degrees, and returns the rotated pixbuf.
+ *
+ * @param source_pixbuf The source image that needs to be angled.
+ * @param angle The angle the source image should be rotated by.
+ */
+Gdk.Pixbuf rotate_arb(Gdk.Pixbuf source_pixbuf, double angle) {
+ // if the straightening angle has been reset
+ // or was never set in the first place, nothing
+ // needs to be done to the source image.
+ if (angle == 0.0) {
+ return source_pixbuf;
+ }
+
+ // Compute how much the corners of the source image will
+ // move by to determine how big the dest pixbuf should be.
+
+ double x_tmp, y_tmp;
+ compute_arb_rotated_size(source_pixbuf.width, source_pixbuf.height, angle,
+ out x_tmp, out y_tmp);
+
+ Gdk.Pixbuf dest_pixbuf = new Gdk.Pixbuf(
+ Gdk.Colorspace.RGB, true, 8, (int) Math.round(x_tmp), (int) Math.round(y_tmp));
+
+ Cairo.ImageSurface surface = new Cairo.ImageSurface.for_data(
+ (uchar []) dest_pixbuf.pixels,
+ source_pixbuf.has_alpha ? Cairo.Format.ARGB32 : Cairo.Format.RGB24,
+ dest_pixbuf.width, dest_pixbuf.height, dest_pixbuf.rowstride);
+
+ Cairo.Context context = new Cairo.Context(surface);
+
+ context.set_source_rgb(0, 0, 0);
+ context.rectangle(0, 0, dest_pixbuf.width, dest_pixbuf.height);
+ context.fill();
+
+ context.translate(dest_pixbuf.width / 2, dest_pixbuf.height / 2);
+ context.rotate(degrees_to_radians(angle));
+ context.translate(- source_pixbuf.width / 2, - source_pixbuf.height / 2);
+
+ Gdk.cairo_set_source_pixbuf(context, source_pixbuf, 0, 0);
+ context.get_source().set_filter(Cairo.Filter.BEST);
+ context.paint();
+
+ // prepare the newly-drawn image for use by
+ // the rest of the pipeline.
+ fix_cairo_pixbuf(dest_pixbuf);
+
+ return dest_pixbuf;
+}
+
+/**
+ * @brief Rotates a point around the upper left corner of an image to an arbitrary angle,
+ * given in degrees, and returns the rotated point, translated such that it, along with its attendant
+ * image, are in positive x, positive y.
+ *
+ * @note May be subject to slight inaccuracy as Gdk points' coordinates may only be in whole pixels,
+ * so the fractional component is lost.
+ *
+ * @param source_point The point to be rotated and scaled.
+ * @param img_w The width of the source image (unrotated).
+ * @param img_h The height of the source image (unrotated).
+ * @param angle The angle the source image is to be rotated by to straighten it.
+ */
+Gdk.Point rotate_point_arb(Gdk.Point source_point, int img_w, int img_h, double angle,
+ bool invert = false) {
+ // angle of 0 degrees or angle was never set?
+ if (angle == 0.0) {
+ // nothing needs to be done.
+ return source_point;
+ }
+
+ double dest_width;
+ double dest_height;
+ compute_arb_rotated_size(img_w, img_h, angle, out dest_width, out dest_height);
+
+ Cairo.Matrix matrix = Cairo.Matrix.identity();
+ matrix.translate(dest_width / 2, dest_height / 2);
+ matrix.rotate(degrees_to_radians(angle));
+ matrix.translate(- img_w / 2, - img_h / 2);
+ if (invert)
+ assert(matrix.invert() == Cairo.Status.SUCCESS);
+
+ double dest_x = source_point.x;
+ double dest_y = source_point.y;
+ matrix.transform_point(ref dest_x, ref dest_y);
+
+ return { (int) dest_x, (int) dest_y };
+}
+
+/**
+ * @brief <u>De</u>rotates a point around the upper left corner of an image from an arbitrary angle,
+ * given in degrees, and returns the de-rotated point, taking into account any translation necessary
+ * to make sure all of the rotated image stays in positive x, positive y.
+ *
+ * @note May be subject to slight inaccuracy as Gdk points' coordinates may only be in whole pixels,
+ * so the fractional component is lost.
+ *
+ * @param source_point The point to be de-rotated.
+ * @param img_w The width of the source image (unrotated).
+ * @param img_h The height of the source image (unrotated).
+ * @param angle The angle the source image is to be rotated by to straighten it.
+ */
+Gdk.Point derotate_point_arb(Gdk.Point source_point, int img_w, int img_h, double angle) {
+ return rotate_point_arb(source_point, img_w, img_h, angle, true);
+}
+
+
+// Force an axially-aligned box to be inside a rotated rectangle.
+Box clamp_inside_rotated_image(Box src, int img_w, int img_h, double angle_deg,
+ bool preserve_geom) {
+
+ Gdk.Point top_left = derotate_point_arb({src.left, src.top}, img_w, img_h, angle_deg);
+ Gdk.Point top_right = derotate_point_arb({src.right, src.top}, img_w, img_h, angle_deg);
+ Gdk.Point bottom_left = derotate_point_arb({src.left, src.bottom}, img_w, img_h, angle_deg);
+ Gdk.Point bottom_right = derotate_point_arb({src.right, src.bottom}, img_w, img_h, angle_deg);
+
+ double angle = degrees_to_radians(angle_deg);
+ int top_offset = 0, bottom_offset = 0, left_offset = 0, right_offset = 0;
+
+ int top = int.min(top_left.y, top_right.y);
+ if (top < 0)
+ top_offset = (int) ((0 - top) * Math.cos(angle));
+
+ int bottom = int.max(bottom_left.y, bottom_right.y);
+ if (bottom > img_h)
+ bottom_offset = (int) ((img_h - bottom) * Math.cos(angle));
+
+ int left = int.min(top_left.x, bottom_left.x);
+ if (left < 0)
+ left_offset = (int) ((0 - left) * Math.cos(angle));
+
+ int right = int.max(top_right.x, bottom_right.x);
+ if (right > img_w)
+ right_offset = (int) ((img_w - right) * Math.cos(angle));
+
+ return preserve_geom ? src.get_offset(left_offset + right_offset, top_offset + bottom_offset)
+ : Box(src.left + left_offset, src.top + top_offset,
+ src.right + right_offset, src.bottom + bottom_offset);
+}
+
diff --git a/src/util/misc.vala b/src/util/misc.vala
new file mode 100644
index 0000000..73ce428
--- /dev/null
+++ b/src/util/misc.vala
@@ -0,0 +1,377 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+public uint int64_hash(int64? n) {
+ // Rotating XOR hash
+ uint8 *u8 = (uint8 *) n;
+ uint hash = 0;
+ for (int ctr = 0; ctr < (sizeof(int64) / sizeof(uint8)); ctr++) {
+ hash = (hash << 4) ^ (hash >> 28) ^ (*u8++);
+ }
+
+ return hash;
+}
+
+public bool int64_equal(int64? a, int64? b) {
+ int64 *bia = (int64 *) a;
+ int64 *bib = (int64 *) b;
+
+ return (*bia) == (*bib);
+}
+
+public int int64_compare(int64? a, int64? b) {
+ int64 diff = *((int64 *) a) - *((int64 *) b);
+ if (diff < 0)
+ return -1;
+ else if (diff > 0)
+ return 1;
+ else
+ return 0;
+}
+
+public int uint64_compare(uint64? a, uint64? b) {
+ uint64 a64 = *((uint64 *) a);
+ uint64 b64 = *((uint64 *) b);
+
+ if (a64 < b64)
+ return -1;
+ else if (a64 > b64)
+ return 1;
+ else
+ return 0;
+}
+
+public delegate bool ValueEqualFunc(Value a, Value b);
+
+public bool bool_value_equals(Value a, Value b) {
+ return (bool) a == (bool) b;
+}
+
+public bool int_value_equals(Value a, Value b) {
+ return (int) a == (int) b;
+}
+
+public ulong timeval_to_ms(TimeVal time_val) {
+ return (((ulong) time_val.tv_sec) * 1000) + (((ulong) time_val.tv_usec) / 1000);
+}
+
+public ulong now_ms() {
+ return timeval_to_ms(TimeVal());
+}
+
+public ulong now_sec() {
+ TimeVal time_val = TimeVal();
+
+ return time_val.tv_sec;
+}
+
+public inline time_t now_time_t() {
+ return (time_t) now_sec();
+}
+
+public string md5_binary(uint8 *buffer, size_t length) {
+ assert(length != 0);
+
+ Checksum md5 = new Checksum(ChecksumType.MD5);
+ md5.update((uchar []) buffer, length);
+
+ return md5.get_string();
+}
+
+public string md5_file(File file) throws Error {
+ Checksum md5 = new Checksum(ChecksumType.MD5);
+ uint8[] buffer = new uint8[64 * 1024];
+
+ FileInputStream fins = file.read(null);
+ for (;;) {
+ size_t bytes_read = fins.read(buffer, null);
+ if (bytes_read <= 0)
+ break;
+
+ md5.update((uchar[]) buffer, bytes_read);
+ }
+
+ try {
+ fins.close(null);
+ } catch (Error err) {
+ warning("Unable to close MD5 input stream for %s: %s", file.get_path(), err.message);
+ }
+
+ return md5.get_string();
+}
+
+// Once generic functions are available in Vala, this could be genericized.
+public bool equal_sets(Gee.Set<string>? a, Gee.Set<string>? b) {
+ if ((a != null && a.size == 0) && (b == null))
+ return true;
+
+ if ((a == null) && (b != null && b.size == 0))
+ return true;
+
+ if ((a == null && b != null) || (a != null && b == null))
+ return false;
+
+ if (a == null && b == null)
+ return true;
+
+ if (a.size != b.size)
+ return false;
+
+ // because they're sets and the same size, only need to iterate over one set to know
+ // it is equal to the other
+ foreach (string element in a) {
+ if (!b.contains(element))
+ return false;
+ }
+
+ return true;
+}
+
+// Once generic functions are available in Vala, this could be genericized.
+public Gee.Set<string>? intersection_of_sets(Gee.Set<string>? a, Gee.Set<string>? b,
+ Gee.Set<string>? excluded) {
+ if (a != null && b == null) {
+ if (excluded != null)
+ excluded.add_all(a);
+
+ return null;
+ }
+
+ if (a == null && b != null) {
+ if (excluded != null)
+ excluded.add_all(b);
+
+ return null;
+ }
+
+ Gee.Set<string> intersection = new Gee.HashSet<string>();
+
+ foreach (string element in a) {
+ if (b.contains(element))
+ intersection.add(element);
+ else if (excluded != null)
+ excluded.add(element);
+ }
+
+ foreach (string element in b) {
+ if (a.contains(element))
+ intersection.add(element);
+ else if (excluded != null)
+ excluded.add(element);
+ }
+
+ return intersection.size > 0 ? intersection : null;
+}
+
+public uchar[] serialize_photo_ids(Gee.Collection<Photo> photos) {
+ int64[] ids = new int64[photos.size];
+ int ctr = 0;
+ foreach (Photo photo in photos)
+ ids[ctr++] = photo.get_photo_id().id;
+
+ size_t bytes = photos.size * sizeof(int64);
+ uchar[] serialized = new uchar[bytes];
+ Memory.copy(serialized, ids, bytes);
+
+ return serialized;
+}
+
+public Gee.List<PhotoID?>? unserialize_photo_ids(uchar* serialized, int size) {
+ size_t count = (size / sizeof(int64));
+ if (count <= 0 || serialized == null)
+ return null;
+
+ int64[] ids = new int64[count];
+ Memory.copy(ids, serialized, size);
+
+ Gee.ArrayList<PhotoID?> list = new Gee.ArrayList<PhotoID?>();
+ foreach (int64 id in ids)
+ list.add(PhotoID(id));
+
+ return list;
+}
+
+public uchar[] serialize_media_sources(Gee.Collection<MediaSource> media) {
+ Gdk.Atom[] atoms = new Gdk.Atom[media.size];
+ int ctr = 0;
+ foreach (MediaSource current_media in media)
+ atoms[ctr++] = Gdk.Atom.intern(current_media.get_source_id(), false);
+
+ size_t bytes = media.size * sizeof(Gdk.Atom);
+ uchar[] serialized = new uchar[bytes];
+ Memory.copy(serialized, atoms, bytes);
+
+ return serialized;
+}
+
+public Gee.List<MediaSource>? unserialize_media_sources(uchar* serialized, int size) {
+ size_t count = (size / sizeof(Gdk.Atom));
+ if (count <= 0 || serialized == null)
+ return null;
+
+ Gdk.Atom[] atoms = new Gdk.Atom[count];
+ Memory.copy(atoms, serialized, size);
+
+ Gee.ArrayList<MediaSource> list = new Gee.ArrayList<MediaSource>();
+ foreach (Gdk.Atom current_atom in atoms) {
+ MediaSource media = MediaCollectionRegistry.get_instance().fetch_media(current_atom.name());
+ assert(media != null);
+ list.add(media);
+ }
+
+ return list;
+}
+
+public string format_local_datespan(Time from_date, Time to_date) {
+ string from_format, to_format;
+
+ // Ticket #3240 - Change the way date ranges are pretty-
+ // printed if the start and end date occur on consecutive days.
+ if (from_date.year == to_date.year) {
+ // are these consecutive dates?
+ if ((from_date.month == to_date.month) && (from_date.day == (to_date.day - 1))) {
+ // Yes; display like so: Sat, July 4 - 5, 20X6
+ from_format = Resources.get_start_multiday_span_format_string();
+ to_format = Resources.get_end_multiday_span_format_string();
+ } else {
+ // No, but they're in the same year; display in shortened
+ // form: Sat, July 4 - Mon, July 6, 20X6
+ from_format = Resources.get_start_multimonth_span_format_string();
+ to_format = Resources.get_end_multimonth_span_format_string();
+ }
+ } else {
+ // Span crosses a year boundary, use long form dates
+ // for both start and end date.
+ from_format = Resources.get_long_date_format_string();
+ to_format = Resources.get_long_date_format_string();
+ }
+
+ return String.strip_leading_zeroes("%s - %s".printf(from_date.format(from_format),
+ to_date.format(to_format)));
+}
+
+public string format_local_date(Time date) {
+ return String.strip_leading_zeroes(date.format(Resources.get_long_date_format_string()));
+}
+
+public delegate void OneShotCallback();
+
+public class OneShotScheduler {
+ private string name;
+ private unowned OneShotCallback callback;
+ private uint scheduled = 0;
+
+ public OneShotScheduler(string name, OneShotCallback callback) {
+ this.name = name;
+ this.callback = callback;
+ }
+
+ ~OneShotScheduler() {
+#if TRACE_DTORS
+ debug("DTOR: OneShotScheduler for %s", name);
+#endif
+
+ cancel();
+ }
+
+ public bool is_scheduled() {
+ return scheduled != 0;
+ }
+
+ public void at_idle() {
+ at_priority_idle(Priority.DEFAULT_IDLE);
+ }
+
+ public void at_priority_idle(int priority) {
+ if (scheduled == 0)
+ scheduled = Idle.add_full(priority, callback_wrapper);
+ }
+
+ public void after_timeout(uint msec, bool reschedule) {
+ priority_after_timeout(Priority.DEFAULT, msec, reschedule);
+ }
+
+ public void priority_after_timeout(int priority, uint msec, bool reschedule) {
+ if (scheduled != 0 && !reschedule)
+ return;
+
+ if (scheduled != 0)
+ Source.remove(scheduled);
+
+ scheduled = Timeout.add_full(priority, msec, callback_wrapper);
+ }
+
+ public void cancel() {
+ if (scheduled == 0)
+ return;
+
+ Source.remove(scheduled);
+ scheduled = 0;
+ }
+
+ private bool callback_wrapper() {
+ scheduled = 0;
+ callback();
+
+ return false;
+ }
+}
+
+public class OpTimer {
+ private string name;
+ private Timer timer = new Timer();
+ private long count = 0;
+ private double elapsed = 0;
+ private double shortest = double.MAX;
+ private double longest = double.MIN;
+
+ public OpTimer(string name) {
+ this.name = name;
+ }
+
+ public void start() {
+ timer.start();
+ }
+
+ public void stop() {
+ double time = timer.elapsed();
+
+ elapsed += time;
+
+ if (time < shortest)
+ shortest = time;
+
+ if (time > longest)
+ longest = time;
+
+ count++;
+ }
+
+ public string to_string() {
+ if (count > 0) {
+ return "%s: count=%ld elapsed=%.03lfs min/avg/max=%.03lf/%.03lf/%.03lf".printf(name,
+ count, elapsed, shortest, elapsed / (double) count, longest);
+ } else {
+ return "%s: no operations".printf(name);
+ }
+ }
+}
+
+// Dummy function for suppressing 'could not stat file' errors
+// generated when saving into a previously non-existent file -
+// please see https://bugzilla.gnome.org/show_bug.cgi?id=662814
+// and to work around a spurious warning given by GDK when a
+// key press event is passed from a child class' event handler
+// to a parent's; (gnome bug pending, but see https://bugzilla.redhat.com/show_bug.cgi?id=665568).
+public void suppress_warnings(string? log_domain, LogLevelFlags log_levels, string message) {
+ // do nothing.
+}
+
+public bool is_twentyfour_hr_time_system() {
+ // if no AM/PM designation is found, the location is set to use a 24 hr time system
+ return is_string_empty(Time.local(0).format("%p"));
+}
+
diff --git a/src/util/mk/util.mk b/src/util/mk/util.mk
new file mode 100644
index 0000000..86a8bd5
--- /dev/null
+++ b/src/util/mk/util.mk
@@ -0,0 +1,34 @@
+
+# UNIT_NAME is the Vala namespace. A file named UNIT_NAME.vala must be in this directory with
+# a init() and terminate() function declared in the namespace.
+UNIT_NAME := Util
+
+# UNIT_DIR should match the subdirectory the files are located in. Generally UNIT_NAME in all
+# lowercase. The name of this file should be UNIT_DIR.mk.
+UNIT_DIR := util
+
+# All Vala files in the unit should be listed here with no subdirectory prefix.
+#
+# NOTE: Do *not* include the unit's master file, i.e. UNIT_NAME.vala.
+UNIT_FILES := \
+ file.vala \
+ image.vala \
+ misc.vala \
+ string.vala \
+ system.vala \
+ KeyValueMap.vala \
+ ui.vala
+
+# Any unit this unit relies upon (and should be initialized before it's initialized) should
+# be listed here using its Vala namespace.
+#
+# NOTE: All units are assumed to rely upon the unit-unit. Do not include that here.
+UNIT_USES :=
+
+# List any additional files that are used in the build process as a part of this unit that should
+# be packaged in the tarball. File names should be relative to the unit's home directory.
+UNIT_RC :=
+
+# unitize.mk must be called at the end of each UNIT_DIR.mk file.
+include unitize.mk
+
diff --git a/src/util/string.vala b/src/util/string.vala
new file mode 100644
index 0000000..9fda007
--- /dev/null
+++ b/src/util/string.vala
@@ -0,0 +1,268 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+extern int64 g_ascii_strtoll(string str, out char *endptr, uint num_base);
+
+public const int DEFAULT_USER_TEXT_INPUT_LENGTH = 1024;
+
+public inline bool is_string_empty(string? s) {
+ return (s == null || s[0] == '\0');
+}
+
+// utf8 case sensitive compare
+public int utf8_cs_compare(void *a, void *b) {
+ return ((string) a).collate((string) b);
+}
+
+// utf8 case insensitive compare
+public int utf8_ci_compare(void *a, void *b) {
+ return ((string) a).down().collate(((string) b).down());
+}
+
+// utf8 array to string
+public string uchar_array_to_string(uchar[] data, int length = -1) {
+ if (length < 0)
+ length = data.length;
+
+ StringBuilder builder = new StringBuilder();
+ for (int ctr = 0; ctr < length; ctr++) {
+ if (data[ctr] != '\0')
+ builder.append_c((char) data[ctr]);
+ else
+ break;
+ }
+
+ return builder.str;
+}
+
+// string to uchar array
+public uchar[] string_to_uchar_array(string str) {
+ uchar[] data = new uchar[0];
+ for (int ctr = 0; ctr < str.length; ctr++)
+ data += (uchar) str[ctr];
+
+ return data;
+}
+
+// Markup.escape_text() will crash if the UTF-8 text is not valid; it relies on a call to
+// g_utf8_next_char(), which demands that the string be validated before use, which escape_text()
+// does not do. This handles this problem by kicking back an empty string if the text is not
+// valid. Text should be validated upon entry to the system as well to guard against this
+// problem.
+//
+// Null strings are accepted; they will result in an empty string returned.
+public inline string guarded_markup_escape_text(string? plain) {
+ return (!is_string_empty(plain) && plain.validate()) ? Markup.escape_text(plain) : "";
+}
+
+public long find_last_offset(string str, char c) {
+ long offset = str.length;
+ while (--offset >= 0) {
+ if (str[offset] == c)
+ return offset;
+ }
+
+ return -1;
+}
+
+// Helper function for searching an array of case-insensitive strings. The array should be
+// all lowercase.
+public bool is_in_ci_array(string str, string[] strings) {
+ string strdown = str.down();
+ foreach (string str_element in strings) {
+ if (strdown == str_element)
+ return true;
+ }
+
+ return false;
+}
+
+[Flags]
+public enum PrepareInputTextOptions {
+ EMPTY_IS_NULL,
+ VALIDATE,
+ INVALID_IS_NULL,
+ STRIP,
+ STRIP_CRLF,
+ NORMALIZE,
+ DEFAULT = EMPTY_IS_NULL | VALIDATE | INVALID_IS_NULL | STRIP_CRLF | STRIP | NORMALIZE;
+}
+
+public string? prepare_input_text(string? text, PrepareInputTextOptions options, int dest_length) {
+ if (text == null)
+ return null;
+
+ if ((options & PrepareInputTextOptions.VALIDATE) != 0 && !text.validate())
+ return (options & PrepareInputTextOptions.INVALID_IS_NULL) != 0 ? null : "";
+
+ string prepped = text;
+
+ // Using composed form rather than GLib's default (decomposed) as NFC is the preferred form in
+ // Linux and WWW. More importantly, Pango seems to have serious problems displaying decomposed
+ // forms of Korean language glyphs (and perhaps others). See:
+ // http://trac.yorba.org/ticket/2952
+ if ((options & PrepareInputTextOptions.NORMALIZE) != 0)
+ prepped = prepped.normalize(-1, NormalizeMode.NFC);
+
+ if ((options & PrepareInputTextOptions.STRIP) != 0)
+ prepped = prepped.strip();
+
+ // Ticket #3245 - Prevent carriage return mayhem
+ // in image titles, tag names, etc.
+ if ((options & PrepareInputTextOptions.STRIP_CRLF) != 0)
+ prepped = prepped.delimit("\n\r", ' ');
+
+ if ((options & PrepareInputTextOptions.EMPTY_IS_NULL) != 0 && is_string_empty(prepped))
+ return null;
+
+ // Ticket #3196 - Allow calling functions to limit the length of the
+ // string we return to them. Passing any negative value is interpreted
+ // as 'do not truncate'.
+ if (dest_length >= 0) {
+ StringBuilder sb = new StringBuilder(prepped);
+ sb.truncate(dest_length);
+ return sb.str;
+ }
+
+ // otherwise, return normally.
+ return prepped;
+}
+
+public int64 parse_int64(string str, int num_base) {
+ return g_ascii_strtoll(str, null, num_base);
+}
+
+namespace String {
+
+public inline bool contains_char(string haystack, unichar needle) {
+ return haystack.index_of_char(needle) >= 0;
+}
+
+public inline bool contains_str(string haystack, string needle) {
+ return haystack.index_of(needle) >= 0;
+}
+
+public inline string? sliced_at(string str, int index) {
+ return (index >= 0) ? str[index:str.length] : null;
+}
+
+public inline string? sliced_at_first_str(string haystack, string needle, int start_index = 0) {
+ return sliced_at(haystack, haystack.index_of(needle, start_index));
+}
+
+public inline string? sliced_at_last_str(string haystack, string needle, int start_index = 0) {
+ return sliced_at(haystack, haystack.last_index_of(needle, start_index));
+}
+
+public inline string? sliced_at_first_char(string haystack, unichar ch, int start_index = 0) {
+ return sliced_at(haystack, haystack.index_of_char(ch, start_index));
+}
+
+public inline string? sliced_at_last_char(string haystack, unichar ch, int start_index = 0) {
+ return sliced_at(haystack, haystack.last_index_of_char(ch, start_index));
+}
+
+// Note that this method currently turns a word of all zeros into empty space ("000" -> "")
+public string strip_leading_zeroes(string str) {
+ StringBuilder stripped = new StringBuilder();
+ bool prev_is_space = true;
+ for (unowned string iter = str; iter.get_char() != 0; iter = iter.next_char()) {
+ unichar ch = iter.get_char();
+
+ if (!prev_is_space || ch != '0') {
+ stripped.append_unichar(ch);
+ prev_is_space = ch.isspace();
+ }
+ }
+
+ return stripped.str;
+}
+
+public string remove_diacritics(string istring) {
+ var builder = new StringBuilder ();
+ unichar ch;
+ int i = 0;
+ while(istring.normalize().get_next_char(ref i, out ch)) {
+ switch(ch.type()) {
+ case UnicodeType.CONTROL:
+ case UnicodeType.FORMAT:
+ case UnicodeType.UNASSIGNED:
+ case UnicodeType.NON_SPACING_MARK:
+ case UnicodeType.COMBINING_MARK:
+ case UnicodeType.ENCLOSING_MARK:
+ // Ignore those
+ continue;
+ }
+ builder.append_unichar(ch);
+ }
+ return builder.str;
+}
+
+public string to_hex_string(string str) {
+ StringBuilder builder = new StringBuilder();
+
+ uint8 *data = (uint8 *) str;
+ while (*data != 0)
+ builder.append_printf("%02Xh%s", *data++, (*data != 0) ? " " : "");
+
+ return builder.str;
+}
+
+// A note on the collated_* and precollated_* methods:
+//
+// A bug report (http://trac.yorba.org/ticket/3152) indicated that two different Hirigana characters
+// as Tag names would trigger an assertion. Investigation showed that the characters' collation
+// keys computed as equal when the locale was set to anything but the default locale (C) or
+// Japanese. A related bug was that another hash table was using str_equal, which does not use
+// collation, meaning that in one table the strings were seen as the same and in another as
+// different.
+//
+// The solution we arrived at is to use collation whenever possible, but if two strings have the
+// same collation, then fall back on strcmp(), which looks for byte-for-byte comparisons. Note
+// that this technique requires that both strings have been properly composed (use
+// prepare_input_text() for that task) so that equal UTF-8 strings are byte-for-byte equal as
+// well.
+
+// See note above.
+public uint collated_hash(void *ptr) {
+ string str = (string) ptr;
+
+ return str_hash(str.collate_key());
+}
+
+// See note above.
+public uint precollated_hash(void *ptr) {
+ return str_hash((string) ptr);
+}
+
+// See note above.
+public int collated_compare(void *a, void *b) {
+ string astr = (string) a;
+ string bstr = (string) b;
+
+ int result = astr.collate(bstr);
+
+ return (result != 0) ? result : strcmp(astr, bstr);
+}
+
+// See note above.
+public int precollated_compare(string astr, string akey, string bstr, string bkey) {
+ int result = strcmp(akey, bkey);
+
+ return (result != 0) ? result : strcmp(astr, bstr);
+}
+
+// See note above.
+public bool collated_equals(void *a, void *b) {
+ return collated_compare(a, b) == 0;
+}
+
+// See note above.
+public bool precollated_equals(string astr, string akey, string bstr, string bkey) {
+ return precollated_compare(astr, akey, bstr, bkey) == 0;
+}
+
+}
diff --git a/src/util/system.vala b/src/util/system.vala
new file mode 100644
index 0000000..9407405
--- /dev/null
+++ b/src/util/system.vala
@@ -0,0 +1,40 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+int number_of_processors() {
+ int n = (int) ExtendedPosix.sysconf(ExtendedPosix.ConfName._SC_NPROCESSORS_ONLN);
+ return n <= 0 ? 1 : n;
+}
+
+// Return the directory in which Shotwell is installed, or null if uninstalled.
+File? get_sys_install_dir(File exec_dir) {
+ // guard against exec_dir being a symlink
+ File exec_dir1 = exec_dir;
+ try {
+ exec_dir1 = File.new_for_path(
+ FileUtils.read_link("/" + FileUtils.read_link(exec_dir.get_path())));
+ } catch (FileError e) {
+ // exec_dir is not a symlink
+ }
+ File prefix_dir = File.new_for_path(Resources.PREFIX);
+ return exec_dir1.has_prefix(prefix_dir) ? prefix_dir : null;
+}
+
+string get_nautilus_install_location() {
+ return Environment.find_program_in_path("nautilus");
+}
+
+void sys_show_uri(Gdk.Screen screen, string uri) throws Error {
+ Gtk.show_uri(screen, uri, Gdk.CURRENT_TIME);
+}
+
+void show_file_in_nautilus(string filename) throws Error {
+ GLib.Process.spawn_command_line_async(get_nautilus_install_location() + " " + filename);
+}
+
+int posix_wexitstatus(int status) {
+ return (((status) & 0xff00) >> 8);
+}
diff --git a/src/util/ui.vala b/src/util/ui.vala
new file mode 100644
index 0000000..9f66de8
--- /dev/null
+++ b/src/util/ui.vala
@@ -0,0 +1,98 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public enum AdjustmentRelation {
+ BELOW,
+ IN_RANGE,
+ ABOVE
+}
+
+public enum CompassPoint {
+ NORTH,
+ SOUTH,
+ EAST,
+ WEST
+}
+
+public enum Direction {
+ FORWARD,
+ BACKWARD;
+
+ public Spit.Transitions.Direction to_transition_direction() {
+ switch (this) {
+ case FORWARD:
+ return Spit.Transitions.Direction.FORWARD;
+
+ case BACKWARD:
+ return Spit.Transitions.Direction.BACKWARD;
+
+ default:
+ error("Unknown Direction %s", this.to_string());
+ }
+ }
+}
+
+public void spin_event_loop() {
+ while (Gtk.events_pending())
+ Gtk.main_iteration();
+}
+
+public AdjustmentRelation get_adjustment_relation(Gtk.Adjustment adjustment, int value) {
+ if (value < (int) adjustment.get_value())
+ return AdjustmentRelation.BELOW;
+ else if (value > (int) (adjustment.get_value() + adjustment.get_page_size()))
+ return AdjustmentRelation.ABOVE;
+ else
+ return AdjustmentRelation.IN_RANGE;
+}
+
+public Gdk.Rectangle get_adjustment_page(Gtk.Adjustment hadj, Gtk.Adjustment vadj) {
+ Gdk.Rectangle rect = Gdk.Rectangle();
+ rect.x = (int) hadj.get_value();
+ rect.y = (int) vadj.get_value();
+ rect.width = (int) hadj.get_page_size();
+ rect.height = (int) vadj.get_page_size();
+
+ return rect;
+}
+
+// Verifies that only the mask bits are set in the modifier field, disregarding mouse and
+// key modifers that are not normally of concern (i.e. Num Lock, Caps Lock, etc.). Mask can be
+// one or more bits set, but should only consist of these values:
+// * Gdk.ModifierType.SHIFT_MASK
+// * Gdk.ModifierType.CONTROL_MASK
+// * Gdk.ModifierType.MOD1_MASK (Alt)
+// * Gdk.ModifierType.MOD3_MASK
+// * Gdk.ModifierType.MOD4_MASK
+// * Gdk.ModifierType.MOD5_MASK
+// * Gdk.ModifierType.SUPER_MASK
+// * Gdk.ModifierType.HYPER_MASK
+// * Gdk.ModifierType.META_MASK
+//
+// (Note: MOD2 seems to be Num Lock in GDK.)
+public bool has_only_key_modifier(Gdk.ModifierType field, Gdk.ModifierType mask) {
+ return (field
+ & (Gdk.ModifierType.SHIFT_MASK
+ | Gdk.ModifierType.CONTROL_MASK
+ | Gdk.ModifierType.MOD1_MASK
+ | Gdk.ModifierType.MOD3_MASK
+ | Gdk.ModifierType.MOD4_MASK
+ | Gdk.ModifierType.MOD5_MASK
+ | Gdk.ModifierType.SUPER_MASK
+ | Gdk.ModifierType.HYPER_MASK
+ | Gdk.ModifierType.META_MASK)) == mask;
+}
+
+public string build_dummy_ui_string(Gtk.ActionGroup[] groups) {
+ string ui_string = "<ui>";
+ foreach (Gtk.ActionGroup group in groups) {
+ foreach (Gtk.Action action in group.list_actions())
+ ui_string += "<accelerator name=\"%s\" action=\"%s\" />".printf(action.name, action.name);
+ }
+ ui_string += "</ui>";
+
+ return ui_string;
+}
diff --git a/thumbnailer/shotwell-video-thumbnailer.vala b/thumbnailer/shotwell-video-thumbnailer.vala
new file mode 100644
index 0000000..5b8b89a
--- /dev/null
+++ b/thumbnailer/shotwell-video-thumbnailer.vala
@@ -0,0 +1,133 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This is a Vala-rewrite of GStreamer snapshot example. Adapted from earlier
+ * work from Wim Taymans.
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+// Shotwell Thumbnailer takes in a video file and returns a thumbnail to stdout. This is
+// a replacement for totem-video-thumbnailer
+class ShotwellThumbnailer {
+ const string caps_string = """video/x-raw,format=RGB,pixel-aspect-ratio=1/1""";
+
+ public static int main(string[] args) {
+ Gst.Element pipeline, sink;
+ int width, height;
+ Gst.Sample sample;
+ string descr;
+ Gdk.Pixbuf pixbuf;
+ int64 duration, position;
+ Gst.StateChangeReturn ret;
+ bool res;
+
+ Gst.init(ref args);
+
+ if (args.length != 2) {
+ stdout.printf("usage: %s [filename]\n Writes video thumbnail to stdout\n", args[0]);
+ return 1;
+ }
+
+ descr = "filesrc location=\"%s\" ! decodebin ! videoconvert ! videoscale ! ".printf(args[1]) +
+ "appsink name=sink caps=\"%s\"".printf(caps_string);
+
+ try {
+ // Create new pipeline.
+ pipeline = Gst.parse_launch(descr);
+
+ // Get sink.
+ sink = ((Gst.Bin) pipeline).get_by_name("sink");
+
+ // Set to PAUSED to make the first frame arrive in the sink.
+ ret = pipeline.set_state(Gst.State.PAUSED);
+ if (ret == Gst.StateChangeReturn.FAILURE) {
+ stderr.printf("Failed to play the file: couldn't set state\n");
+ return 3;
+ } else if (ret == Gst.StateChangeReturn.NO_PREROLL) {
+ stderr.printf("Live sources not supported yet.\n");
+ return 4;
+ }
+
+ // This can block for up to 5 seconds. If your machine is really overloaded,
+ // it might time out before the pipeline prerolled and we generate an error. A
+ // better way is to run a mainloop and catch errors there.
+ ret = pipeline.get_state(null, null, 5 * Gst.SECOND);
+ if (ret == Gst.StateChangeReturn.FAILURE) {
+ stderr.printf("Failed to play the file: couldn't get state.\n");
+ return 3;
+ }
+
+ /* get the duration */
+ pipeline.query_duration (Gst.Format.TIME, out duration);
+
+ position = 1 * Gst.SECOND;
+
+ /* seek to the a position in the file. Most files have a black first frame so
+ * by seeking to somewhere else we have a bigger chance of getting something
+ * more interesting. An optimisation would be to detect black images and then
+ * seek a little more */
+ pipeline.seek_simple (Gst.Format.TIME, Gst.SeekFlags.KEY_UNIT | Gst.SeekFlags.FLUSH, position);
+
+ /* get the preroll buffer from appsink, this block untils appsink really
+ * prerolls */
+ GLib.Signal.emit_by_name (sink, "pull-preroll", out sample, null);
+
+ // if we have a buffer now, convert it to a pixbuf. It's possible that we
+ // don't have a buffer because we went EOS right away or had an error.
+ if (sample != null) {
+ Gst.Buffer buffer;
+ Gst.Caps caps;
+ unowned Gst.Structure s;
+ Gst.MapInfo mapinfo;
+ uint8[]? pngdata;
+
+ // Get the snapshot buffer format now. We set the caps on the appsink so
+ // that it can only be an rgb buffer. The only thing we have not specified
+ // on the caps is the height, which is dependent on the pixel-aspect-ratio
+ // of the source material.
+ caps = sample.get_caps();
+ if (caps == null) {
+ stderr.printf("could not get snapshot format\n");
+ return 5;
+ }
+
+ s = caps.get_structure(0);
+
+ // We need to get the final caps on the buffer to get the size.
+ res = s.get_int("width", out width);
+ res |= s.get_int("height", out height);
+ if (!res) {
+ stderr.printf("Could not get snapshot dimension\n");
+ return 6;
+ }
+
+ buffer = sample.get_buffer();
+ buffer.map(out mapinfo, Gst.MapFlags.READ);
+
+ // Create pixmap from buffer and save, gstreamer video buffers have a stride
+ // that is rounded up to the nearest multiple of 4.
+ pixbuf = new Gdk.Pixbuf.from_data(mapinfo.data, Gdk.Colorspace.RGB, false, 8,
+ width, height, (((width * 3)+3)&~3), null);
+
+ // Save the pixbuf.
+ pixbuf.save_to_buffer(out pngdata, "png");
+ stdout.write(pngdata);
+ buffer.unmap(mapinfo);
+ } else {
+ stderr.printf("Could not make snapshot\n");
+ return 10;
+ }
+
+ // cleanup and exit.
+ pipeline.set_state(Gst.State.NULL);
+
+ } catch (Error e) {
+ stderr.printf(e.message);
+ return 2;
+ }
+
+ return 0;
+ }
+}
+
diff --git a/ui/collection.ui b/ui/collection.ui
new file mode 100644
index 0000000..d832ea6
--- /dev/null
+++ b/ui/collection.ui
@@ -0,0 +1,51 @@
+<ui>
+ <popup name="CollectionContextMenu">
+ <menuitem name="ContextEnhance" action="Enhance" />
+ <menuitem name="ContextRevert" action="Revert" />
+ <separator />
+ <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
+ <menuitem name="ContextModifyTags" action="ModifyTags" />
+ <placeholder name="ContextTagsPlaceholder" />
+ <separator />
+ <placeholder name="ContextFacesPlaceholder" />
+ <separator />
+ <menuitem name="ContextFlag" action="Flag" />
+ <menu name="Rate" action="Rate">
+ <menuitem name="RateFive" action="RateFive" />
+ <menuitem name="RateFour" action="RateFour" />
+ <menuitem name="RateThree" action="RateThree" />
+ <menuitem name="RateTwo" action="RateTwo" />
+ <menuitem name="RateOne" action="RateOne" />
+ <menuitem name="RateUnrated" action="RateUnrated" />
+ <menuitem name="RateRejected" action="RateRejected" />
+ <separator />
+ <menuitem name="IncreaseRating" action="IncreaseRating" />
+ <menuitem name="DecreaseRating" action="DecreaseRating" />
+ </menu>
+ <menu name="RawDeveloper" action="RawDeveloper">
+ <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
+ <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
+ </menu>
+ <separator />
+ <menuitem name="ContextEditTitle" action="EditTitle" />
+ <menuitem name="ContextEditComment" action="EditComment" />
+ <menuitem name="ContextExternalEdit" action="ExternalEdit" />
+ <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
+ <separator />
+ <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
+ <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
+ <menuitem name="ContextSendTo" action="SendToContextMenu" />
+ <separator />
+ <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
+ </popup>
+
+ <toolbar name="CollectionToolbar">
+ <toolitem name="ToolRotate" action="RotateClockwise" />
+ <toolitem name="ToolEnhance" action="Enhance" />
+ <separator />
+ <toolitem name="ToolPublish" action="Publish" />
+ <separator />
+ <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
+ </toolbar>
+</ui>
+
diff --git a/ui/direct.ui b/ui/direct.ui
new file mode 100644
index 0000000..ac6a4a9
--- /dev/null
+++ b/ui/direct.ui
@@ -0,0 +1,70 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Save" action="Save" />
+ <menuitem name="SaveAs" action="SaveAs" />
+ <separator />
+ <placeholder name="PrintPlaceholder"/>
+ <separator />
+ <menuitem name="SendTo" action="SendTo" />
+ <placeholder name="SetBackgroundPlaceholder" />
+ <separator />
+ <menuitem name="JumpToFile" action="CommonJumpToFile" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="Fullscreen" action="CommonFullscreen" />
+ <separator />
+ <menuitem name="IncreaseSize" action="IncreaseSize" />
+ <menuitem name="DecreaseSize" action="DecreaseSize" />
+ <separator />
+ <menuitem name="ZoomFit" action="ZoomFit" />
+ <menuitem name="Zoom100" action="Zoom100" />
+ <menuitem name="Zoom200" action="Zoom200" />
+ </menu>
+
+ <menu name="PhotoMenu" action="PhotoMenu">
+ <menuitem name="PrevPhoto" action="PrevPhoto" />
+ <menuitem name="NextPhoto" action="NextPhoto" />
+ <separator />
+ <menuitem name="RotateClockwise" action="RotateClockwise" />
+ <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
+ <menuitem name="FlipHorizontally" action="FlipHorizontally" />
+ <menuitem name="FlipVertically" action="FlipVertically" />
+ <separator />
+ <menu name="Tools" action="Tools">
+ <menuitem name="Enhance" action="Enhance" />
+ <menuitem name="Crop" action="Crop" />
+ <menuitem name="Straighten" action="Straighten" />
+ <menuitem name="RedEye" action="RedEye" />
+ <menuitem name="Adjust" action="Adjust" />
+ </menu>
+ <menuitem name="Revert" action="Revert" />
+ <separator />
+ <menuitem name="AdjustDateTime" action="AdjustDateTime" />
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="DirectContextMenu">
+ <placeholder name="ContextJumpPlaceholder">
+ <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
+ </placeholder>
+ </popup>
+
+</ui>
diff --git a/ui/direct_context.ui b/ui/direct_context.ui
new file mode 100644
index 0000000..7b0d564
--- /dev/null
+++ b/ui/direct_context.ui
@@ -0,0 +1,10 @@
+<ui>
+ <popup name="DirectContextMenu">
+ <menuitem name="ContextEnhance" action="Enhance" />
+ <menuitem name="ContextRevert" action="Revert" />
+ <separator />
+ <placeholder name="ContextJumpPlaceholder" />
+ <menuitem name="ContextSendTo" action="SendTo" />
+ </popup>
+</ui>
+
diff --git a/ui/event.ui b/ui/event.ui
new file mode 100644
index 0000000..dcb1d95
--- /dev/null
+++ b/ui/event.ui
@@ -0,0 +1,25 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="PhotosMenu" action="PhotosMenu">
+ <separator />
+ <menuitem name="MakePrimary" action="MakePrimary" />
+ </menu>
+ <menu name="EventsMenu" action="EventsMenu">
+ <menuitem name="EventRename" action="Rename" />
+ <menuitem name="EditComment" action="EditComment" />
+ </menu>
+ </menubar>
+
+ <popup name="CollectionContextMenu">
+ <separator />
+ <menuitem name="ContextMakePrimary" action="MakePrimary" />
+ </popup>
+
+ <popup name="EventContextMenu">
+ <menuitem name="ContextRename" action="Rename" />
+ <menuitem name="EditEventComment" action="EditEventComment" />
+ </popup>
+
+</ui>
+
diff --git a/ui/events_directory.ui b/ui/events_directory.ui
new file mode 100644
index 0000000..a0041e2
--- /dev/null
+++ b/ui/events_directory.ui
@@ -0,0 +1,63 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="Find" action="CommonFind" />
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <separator />
+ <menuitem name="SelectAll" action="CommonSelectAll" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menuitem name="ViewComment" action="ViewComment" />
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ <separator />
+ <menuitem name="Fullscreen" action="CommonFullscreen" />
+ </menu>
+
+ <menu name="EventsMenu" action="EventsMenu">
+ <menuitem name="EventMerge" action="Merge" />
+ <menuitem name="EventRename" action="Rename" />
+ <menuitem name="EditComment" action="EditComment" />
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="EventsDirectoryContextMenu">
+ <menuitem name="ContextMerge" action="Merge" />
+ <menuitem name="ContextRename" action="Rename" />
+ <menuitem name="ContextEditComment" action="EditComment" />
+ </popup>
+
+</ui>
+
diff --git a/ui/fullscreen.ui b/ui/fullscreen.ui
new file mode 100644
index 0000000..6112a52
--- /dev/null
+++ b/ui/fullscreen.ui
@@ -0,0 +1,6 @@
+<ui>
+
+ <accelerator name="LeaveFullscreen" action="LeaveFullscreen" />
+
+</ui>
+
diff --git a/ui/import.ui b/ui/import.ui
new file mode 100644
index 0000000..600ae09
--- /dev/null
+++ b/ui/import.ui
@@ -0,0 +1,65 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportSelected" action="ImportSelected" />
+ <menuitem name="ImportAll" action="ImportAll" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="Find" action="CommonFind" />
+ <separator />
+ <menuitem name="SelectAll" action="CommonSelectAll" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menuitem name="ViewTitle" action="ViewTitle" />
+ <separator />
+ <menu name="FilterPhotos" action="CommonFilterPhotos">
+ <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
+ <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
+ <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
+ <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
+ <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
+ <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
+ <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
+ <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
+ </menu>
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="ImportContextMenu">
+ <menuitem name="ContextImportSelected" action="ImportSelected" />
+ <menuitem name="ContextImportAll" action="ImportAll" />
+ </popup>
+
+</ui>
diff --git a/ui/import_queue.ui b/ui/import_queue.ui
new file mode 100644
index 0000000..b8233ab
--- /dev/null
+++ b/ui/import_queue.ui
@@ -0,0 +1,34 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Stop" action="Stop" />
+ <separator />
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+</ui>
+
diff --git a/ui/media.ui b/ui/media.ui
new file mode 100644
index 0000000..52489ef
--- /dev/null
+++ b/ui/media.ui
@@ -0,0 +1,125 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <menuitem name="Export" action="Export" />
+ <separator />
+ <placeholder name="FileExtrasPlaceholder" />
+ <separator />
+ <menuitem name="JumpToFile" action="CommonJumpToFile" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="Find" action="CommonFind" />
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <separator />
+ <placeholder name="EditExtrasPlaceholder" />
+ <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
+ <menuitem name="MoveToTrash" action="MoveToTrash" />
+ <separator />
+ <menuitem name="SelectAll" action="CommonSelectAll" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menuitem name="ViewTitle" action="ViewTitle" />
+ <menuitem name="ViewComment" action="ViewComment" />
+ <menuitem name="ViewTags" action="ViewTags" />
+ <menuitem name="ViewRatings" action="ViewRatings" />
+ <separator />
+ <menu name="FilterPhotos" action="CommonFilterPhotos">
+ <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
+ <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
+ <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
+ <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
+ <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
+ <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
+ <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
+ <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
+ </menu>
+ <separator />
+ <menu name="SortPhotos" action="SortPhotos">
+ <menuitem name="SortByTitle" action="SortByTitle" />
+ <menuitem name="SortByExposureDate" action="SortByExposureDate" />
+ <menuitem name="SortByRating" action="SortByRating" />
+ <separator />
+ <menuitem name="SortAscending" action="SortAscending" />
+ <menuitem name="SortDescending" action="SortDescending" />
+ </menu>
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ <separator />
+ <menuitem name="IncreaseSize" action="IncreaseSize" />
+ <menuitem name="DecreaseSize" action="DecreaseSize" />
+ <separator />
+ <placeholder name="ViewExtrasFullscreenSlideshowPlaceholder" />
+ </menu>
+
+ <menu name="PhotosMenu" action="PhotosMenu">
+ <placeholder name="PhotosExtrasEditsPlaceholder" />
+ <separator />
+ <menuitem name="Flag" action="Flag" />
+ <menu name="Rate" action="Rate">
+ <menuitem name="RateFive" action="RateFive" />
+ <menuitem name="RateFour" action="RateFour" />
+ <menuitem name="RateThree" action="RateThree" />
+ <menuitem name="RateTwo" action="RateTwo" />
+ <menuitem name="RateOne" action="RateOne" />
+ <menuitem name="RateUnrated" action="RateUnrated" />
+ <menuitem name="RateRejected" action="RateRejected" />
+ <separator />
+ <menuitem name="IncreaseRating" action="IncreaseRating" />
+ <menuitem name="DecreaseRating" action="DecreaseRating" />
+ </menu>
+ <separator />
+ <menuitem name="EditTitle" action="EditTitle" />
+ <menuitem name="EditComment" action="EditComment" />
+ <placeholder name="PhotosExtrasDateTimePlaceholder" />
+ <separator />
+ <menu name="RawDeveloper" action="RawDeveloper">
+ <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
+ <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
+ </menu>
+ <separator />
+ <placeholder name="PhotosExtrasExternalsPlaceholder" />
+ </menu>
+
+ <menu name="EventsMenu" action="EventsMenu">
+ <menuitem name="NewEvent" action="NewEvent" />
+ <menuitem name="CommonJumpToEvent" action="CommonJumpToEvent" />
+ </menu>
+
+ <menu name="TagsMenu" action="TagsMenu">
+ <menuitem name="AddTags" action="AddTags" />
+ <menuitem name="ModifyTags" action="ModifyTags" />
+ </menu>
+
+ <placeholder name="FacesMenuPlaceholder" />
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+</ui>
+
diff --git a/ui/offline.ui b/ui/offline.ui
new file mode 100644
index 0000000..b5b41ef
--- /dev/null
+++ b/ui/offline.ui
@@ -0,0 +1,69 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="Find" action="CommonFind" />
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <separator />
+ <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
+ <separator />
+ <menuitem name="SelectAll" action="CommonSelectAll" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menu name="FilterPhotos" action="CommonFilterPhotos">
+ <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
+ <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
+ <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
+ <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
+ <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
+ <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
+ <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
+ <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
+ </menu>
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="OfflineContextMenu">
+ <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
+ </popup>
+
+ <toolbar name="OfflineToolbar">
+ <toolitem name="ToolRemoveFromLibrary" action="RemoveFromLibrary" />
+ <separator />
+ <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
+ </toolbar>
+
+</ui>
diff --git a/ui/photo.ui b/ui/photo.ui
new file mode 100644
index 0000000..f11a25b
--- /dev/null
+++ b/ui/photo.ui
@@ -0,0 +1,128 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <menuitem name="Export" action="Export" />
+ <separator />
+ <placeholder name="PrintPlaceholder" />
+ <separator />
+ <placeholder name="PublishPlaceholder" />
+ <menuitem name="SendTo" action="SendTo" />
+ <placeholder name="SetBackgroundPlaceholder" />
+ <separator />
+ <menuitem name="JumpToFile" action="CommonJumpToFile" />
+ <separator />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <separator />
+ <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
+ <menuitem name="MoveToTrash" action="MoveToTrash" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menuitem name="ViewRatings" action="ViewRatings" />
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ <separator />
+ <menuitem name="IncreaseSize" action="IncreaseSize" />
+ <menuitem name="DecreaseSize" action="DecreaseSize" />
+ <separator />
+ <menuitem name="ZoomFit" action="ZoomFit" />
+ <menuitem name="Zoom100" action="Zoom100" />
+ <menuitem name="Zoom200" action="Zoom200" />
+ <separator />
+ <menuitem name="Fullscreen" action="CommonFullscreen" />
+ <separator />
+ <menuitem name="Slideshow" action="Slideshow" />
+ </menu>
+
+ <menu name="PhotoMenu" action="PhotoMenu">
+ <menuitem name="PrevPhoto" action="PrevPhoto" />
+ <menuitem name="NextPhoto" action="NextPhoto" />
+ <separator />
+ <menuitem name="RotateClockwise" action="RotateClockwise" />
+ <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
+ <menuitem name="FlipHorizontally" action="FlipHorizontally" />
+ <menuitem name="FlipVertically" action="FlipVertically" />
+ <separator />
+ <menu name="Tools" action="Tools">
+ <menuitem name="Enhance" action="Enhance" />
+ <menuitem name="Crop" action="Crop" />
+ <menuitem name="Straighten" action="Straighten" />
+ <menuitem name="RedEye" action="RedEye" />
+ <menuitem name="Adjust" action="Adjust" />
+ </menu>
+ <menuitem name="Revert" action="Revert" />
+ <separator />
+ <menuitem name="CopyColorAdjustments" action="CopyColorAdjustments" />
+ <menuitem name="PasteColorAdjustments" action="PasteColorAdjustments" />
+ <separator/>
+ <menuitem name="Flag" action="Flag" />
+ <menu name="Rate" action="Rate">
+ <menuitem name="RateFive" action="RateFive" />
+ <menuitem name="RateFour" action="RateFour" />
+ <menuitem name="RateThree" action="RateThree" />
+ <menuitem name="RateTwo" action="RateTwo" />
+ <menuitem name="RateOne" action="RateOne" />
+ <menuitem name="RateUnrated" action="RateUnrated" />
+ <menuitem name="RateRejected" action="RateRejected" />
+ <separator />
+ <menuitem name="IncreaseRating" action="IncreaseRating" />
+ <menuitem name="DecreaseRating" action="DecreaseRating" />
+ </menu>
+ <separator />
+ <menuitem name="EditTitle" action="EditTitle" />
+ <menuitem name="EditComment" action="EditComment" />
+ <menuitem name="AdjustDateTime" action="AdjustDateTime" />
+ <separator />
+ <menu name="RawDeveloper" action="RawDeveloper">
+ <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
+ <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
+ </menu>
+ <separator />
+ <menuitem name="ExternalEdit" action="ExternalEdit" />
+ <menuitem name="ExternalEditRAW" action="ExternalEditRAW" />
+ </menu>
+
+ <menu name="TagsMenu" action="TagsMenu">
+ <menuitem name="AddTags" action="AddTags" />
+ <menuitem name="ModifyTags" action="ModifyTags" />
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="PhotoContextMenu">
+ <placeholder name="ContextJumpPlaceholder">
+ <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
+ <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
+ </placeholder>
+ </popup>
+
+</ui>
+
diff --git a/ui/photo_context.ui b/ui/photo_context.ui
new file mode 100644
index 0000000..f897022
--- /dev/null
+++ b/ui/photo_context.ui
@@ -0,0 +1,39 @@
+<ui>
+ <popup name="PhotoContextMenu">
+ <menuitem name="ContextEnhance" action="Enhance" />
+ <menuitem name="ContextRevert" action="Revert" />
+ <separator />
+ <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
+ <menuitem name="ContextModifyTags" action="ModifyTags" />
+ <placeholder name="ContextTagsPlaceholder" />
+ <separator />
+ <menuitem name="ContextFlag" action="Flag" />
+ <menu name="Rate" action="Rate">
+ <menuitem name="RateFive" action="RateFive" />
+ <menuitem name="RateFour" action="RateFour" />
+ <menuitem name="RateThree" action="RateThree" />
+ <menuitem name="RateTwo" action="RateTwo" />
+ <menuitem name="RateOne" action="RateOne" />
+ <menuitem name="RateUnrated" action="RateUnrated" />
+ <menuitem name="RateRejected" action="RateRejected" />
+ <separator />
+ <menuitem name="IncreaseRating" action="IncreaseRating" />
+ <menuitem name="DecreaseRating" action="DecreaseRating" />
+ </menu>
+ <menu name="RawDeveloper" action="RawDeveloper">
+ <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
+ <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
+ </menu>
+ <separator />
+ <menuitem name="ContextEditTitle" action="EditTitle" />
+ <menuitem name="ContextEditComment" action="EditComment" />
+ <menuitem name="ContextExternalEdit" action="ExternalEdit" />
+ <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
+ <separator />
+ <placeholder name="ContextJumpPlaceholder" />
+ <menuitem name="ContextSendTo" action="SendToContextMenu" />
+ <separator />
+ <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
+ </popup>
+
+</ui>
diff --git a/ui/savedsearch.ui b/ui/savedsearch.ui
new file mode 100644
index 0000000..4217cbc
--- /dev/null
+++ b/ui/savedsearch.ui
@@ -0,0 +1,8 @@
+<ui>
+ <popup name="SearchContextMenu">
+ <menuitem name="ContextRenameSearch" action="RenameSearch" />
+ <menuitem name="ContextEditSearch" action="EditSearch" />
+ <menuitem name="ContextDeleteSearch" action="DeleteSearch" />
+ </popup>
+
+</ui>
diff --git a/ui/search_bar.ui b/ui/search_bar.ui
new file mode 100644
index 0000000..957c8b3
--- /dev/null
+++ b/ui/search_bar.ui
@@ -0,0 +1,12 @@
+<ui>
+ <popup name="FilterPopupMenu" action="CommonFilterPhotos">
+ <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
+ <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
+ <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
+ <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
+ <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
+ <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
+ <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
+ <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
+ </popup>
+</ui>
diff --git a/ui/search_sidebar_context.ui b/ui/search_sidebar_context.ui
new file mode 100644
index 0000000..9db976e
--- /dev/null
+++ b/ui/search_sidebar_context.ui
@@ -0,0 +1,6 @@
+<ui>
+ <popup name="SidebarSearchContextMenu">
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ </popup>
+</ui>
+
diff --git a/ui/set_background_dialog.glade b/ui/set_background_dialog.glade
new file mode 100644
index 0000000..d96509f
--- /dev/null
+++ b/ui/set_background_dialog.glade
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">100</property>
+ <property name="step_increment">10</property>
+ <property name="page_increment">10</property>
+ <property name="page_size">10</property>
+ </object>
+ <object class="GtkDialog" id="dialog1">
+ <property name="width_request">400</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Set as Desktop Slideshow</property>
+ <property name="type_hint">normal</property>
+ <property name="skip_taskbar_hint">True</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="label">gtk-cancel</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="label">gtk-ok</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip_text" translatable="yes">Generate desktop background slideshow</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Show each photo for</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="delay_value_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">period of time</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="delay_scale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">How long each photo is shown on the desktop background</property>
+ <property name="adjustment">adjustment1</property>
+ <property name="draw_value">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
diff --git a/ui/shotwell.glade b/ui/shotwell.glade
new file mode 100644
index 0000000..435152d
--- /dev/null
+++ b/ui/shotwell.glade
@@ -0,0 +1,1714 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkDialog" id="Search criteria">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Search</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="search dialog buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="title_aln">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="Name of search:">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Name of search:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">Search title</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="Search title">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="width_chars">20</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="Match">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Match</property>
+ <property name="use_underline">True</property>
+ <property name="justify">right</property>
+ <property name="mnemonic_widget">Type of search criteria</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="Type of search criteria">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">1</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="of the following:">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="ypad">3</property>
+ <property name="label" translatable="yes">of the following:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkButton" id="Add search button">
+ <property name="label"> + </property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">8</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="row_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkAdjustment" id="bg_color_adjustment">
+ <property name="upper">65535</property>
+ <property name="step_increment">1000</property>
+ <property name="page_increment">1000</property>
+ <property name="page_size">1000</property>
+ </object>
+ <object class="GtkBox" id="box_ImgSettingsPane">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="lbl_PrintedImageSize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">4</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Printed Image Size&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_top">2</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_UseStandardSize">
+ <property name="label" translatable="yes">Use a _standard size:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radio_UseCustomSize</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_StdSizes">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">20</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_top">2</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_UseCustomSize">
+ <property name="label" translatable="yes">Use a c_ustom size:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">19</property>
+ <child>
+ <object class="GtkEntry" id="entry_CustomWidth">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_right">3</property>
+ <property name="invisible_char">●</property>
+ <property name="width_chars">10</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_MultSymbol">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">×</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_CustomHeight">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_left">3</property>
+ <property name="invisible_char">●</property>
+ <property name="width_chars">10</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="combo_Units">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">14</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="check_MatchAspectRatio">
+ <property name="label" translatable="yes">_Match photo aspect ratio</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="margin_left">210</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_top">2</property>
+ <property name="margin_bottom">12</property>
+ <child>
+ <object class="GtkRadioButton" id="radio_Autosize">
+ <property name="label" translatable="yes">_Autosize:</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">radio_UseCustomSize</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combo_Autosize">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">95</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_Titles">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Titles&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_top">2</property>
+ <child>
+ <object class="GtkCheckButton" id="check_PrintImageTitle">
+ <property name="label" translatable="yes">Print image _title</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFontButton" id="fntbn_TitleFont">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="margin_left">49</property>
+ <property name="font">Sans Bold 12</property>
+ <property name="preview_text"/>
+ <property name="show_preview_entry">False</property>
+ <property name="font_name">Sans Bold 12</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_PixelResolution">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Pixel Resolution&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">24</property>
+ <property name="margin_top">2</property>
+ <child>
+ <object class="GtkLabel" id="lbl_OutputPhotoAt">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Output photo at:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">entry_PixelsPerInch</property>
+ <property name="ellipsize">start</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">65</property>
+ <child>
+ <object class="GtkEntry" id="entry_PixelsPerInch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_right">8</property>
+ <property name="invisible_char">●</property>
+ <property name="width_chars">13</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lbl_PixelsPerInch">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">pixels per inch</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">8</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">4</property>
+ <property name="label" translatable="yes">label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_left">7</property>
+ <property name="margin_right">7</property>
+ <property name="margin_bottom">2</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">1</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <object class="GtkBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">4</property>
+ <property name="label" translatable="yes">label</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="textview1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_left">7</property>
+ <property name="margin_right">7</property>
+ <property name="margin_bottom">2</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="border_width">1</property>
+ <property name="wrap_mode">word</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <object class="GtkBox" id="plugin-manifest">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkAlignment" id="plugin-list-alignment">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="plugin-list-scrolled-window">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">etched-in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="about-plugin-button">
+ <property name="label">gtk-about</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">6</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkDialog" id="preferences_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Shotwell Preferences</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="close_button">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="notebook1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">14</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <object class="GtkFileChooserButton" id="library_dir_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="action">select-folder</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="slider container">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">white</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="bg_color_slider">
+ <property name="width_request">150</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="adjustment">bg_color_adjustment</property>
+ <property name="draw_value">False</property>
+ <property name="value_pos">left</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">black</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">14</property>
+ <property name="bottom_padding">3</property>
+ <child>
+ <object class="GtkLabel" id="library location">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Library Location</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="autoimport">
+ <property name="label" translatable="yes">_Watch library directory for new files</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.5</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: metadata">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">14</property>
+ <property name="bottom_padding">3</property>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Metadata</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">10</property>
+ <property name="bottom_attach">11</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: metadate write">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="write_metadata">
+ <property name="label" translatable="yes">Write tags, titles, and other _metadata to photo files</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.5</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">11</property>
+ <property name="bottom_attach">12</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: display">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="bottom_padding">3</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Display</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: import to">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Import photos to:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">library_dir_button</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: background">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="bg_color_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">_Background:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">bg_color_slider</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: importing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">14</property>
+ <property name="bottom_padding">3</property>
+ <child>
+ <object class="GtkLabel" id="importing">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Importing</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: directory structure">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkLabel" id="dir_structure_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Directory structure:</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="dir choser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: patern">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">34</property>
+ <child>
+ <object class="GtkBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="patern">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Pattern:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">dir_pattern_entry</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="pattern_help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <attributes>
+ <attribute name="underline" value="True"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="entry: pattern">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEntry" id="dir_pattern_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: dynamic example">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="dynamic example">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: example">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">34</property>
+ <child>
+ <object class="GtkLabel" id="example">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Example:</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">8</property>
+ <property name="bottom_attach">9</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="checkbox: lowercase">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">2</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkCheckButton" id="lowercase">
+ <property name="label" translatable="yes">R_ename imported files to lowercase</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0.5</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">9</property>
+ <property name="bottom_attach">10</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="label: developer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">14</property>
+ <property name="bottom_padding">3</property>
+ <child>
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">RAW Developer</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">12</property>
+ <property name="bottom_attach">13</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="default_raw_developer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">13</property>
+ <property name="bottom_attach">14</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">10</property>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">De_fault:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">default_raw_developer</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="top_attach">13</property>
+ <property name="bottom_attach">14</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="library-tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Library</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">6</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <object class="GtkBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkAlignment" id="labels: external editors">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">6</property>
+ <child>
+ <object class="GtkBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">4</property>
+ <property name="label" translatable="yes">E_xternal photo editor:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">external_photo_editor_combo</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">4</property>
+ <property name="label" translatable="yes">External _RAW editor:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">external_raw_editor_combo</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkComboBox" id="external_photo_editor_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="external_raw_editor_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="external-editors-tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">External Editors</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="plugin-manifest-bin">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="top_padding">12</property>
+ <property name="bottom_padding">12</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="plugins-tab">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Plugins</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child type="tab">
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-5">close_button</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkBox" id="progress_pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkProgressBar" id="publishing_progress_bar">
+ <property name="height_request">64</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">32</property>
+ <property name="margin_right">32</property>
+ <property name="margin_top">108</property>
+ <property name="show_text">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">32</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkBox" id="slideshow_settings_pane">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="dialog-vbox7">
+ <property name="can_focus">False</property>
+ <property name="margin_left">8</property>
+ <property name="margin_right">8</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">4</property>
+ <property name="column_spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="delay_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Delay:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">delay_hscale</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="transition_effect_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0.95999997854232788</property>
+ <property name="label" translatable="yes">_Transition effect:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">transition_effect_selector</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="transition_delay_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Transition d_elay:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_title_button">
+ <property name="label" translatable="yes">Show t_itle</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">4</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="transition_effect_selector">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="delay_hscale">
+ <property name="width_request">150</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="fill_level">300</property>
+ <property name="draw_value">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="transition_effect_hscale">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="draw_value">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="delay_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="transition_effect_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="digits">1</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="seconds_label_3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">seconds</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="seconds_label_4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">seconds</property>
+ </object>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">4</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkBox" id="static_msg_pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="static_msg_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">16</property>
+ <property name="margin_right">16</property>
+ <property name="margin_top">97</property>
+ <property name="margin_bottom">24</property>
+ <property name="label" comments="This is a placeholder string and may be ignored.">This is populated from within the code;
+changes made here will not display.</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">70</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkBox" id="welcome_pane_widget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="not_logged_in_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">16</property>
+ <property name="margin_right">16</property>
+ <property name="margin_top">97</property>
+ <property name="margin_bottom">24</property>
+ <property name="label" comments="This is a placeholder string and may be ignored.">This is populated from within the code;
+changes made here will not display.</property>
+ <property name="wrap">True</property>
+ <property name="max_width_chars">70</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">_Login</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="margin_left">256</property>
+ <property name="margin_right">240</property>
+ <property name="margin_top">80</property>
+ <property name="margin_bottom">16</property>
+ <property name="use_underline">True</property>
+ <property name="image_position">top</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/ui/shotwell.xml b/ui/shotwell.xml
new file mode 100644
index 0000000..3a4a5cb
--- /dev/null
+++ b/ui/shotwell.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<glade-catalog name="Shotwell" library="libshotwell.so" depends="gtk+">
+ <glade-widget-classes>
+ <glade-widget-class name="TextEntryDialog" generic-name="text_entry_dialog" title="TextEntryDialog" />
+ </glade-widget-classes>
+
+ <glade-widget-group name="ShotwellObjects" title="Shotwell Objects">
+ <glade-widget-class-ref name="TextEntryDialog"/>
+ </glade-widget-group>
+</glade-catalog>
diff --git a/ui/sidebar_default_context.ui b/ui/sidebar_default_context.ui
new file mode 100644
index 0000000..2e5ed87
--- /dev/null
+++ b/ui/sidebar_default_context.ui
@@ -0,0 +1,7 @@
+<ui>
+ <popup name="SidebarDefaultContextMenu">
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <menuitem name="NewTag" action="CommonNewTag" />
+ </popup>
+</ui>
+
diff --git a/ui/tag_sidebar_context.ui b/ui/tag_sidebar_context.ui
new file mode 100644
index 0000000..4a3d049
--- /dev/null
+++ b/ui/tag_sidebar_context.ui
@@ -0,0 +1,6 @@
+<ui>
+ <popup name="SidebarTagContextMenu">
+ <menuitem name="NewTag" action="CommonNewTag" />
+ </popup>
+</ui>
+
diff --git a/ui/tags.ui b/ui/tags.ui
new file mode 100644
index 0000000..d0373d6
--- /dev/null
+++ b/ui/tags.ui
@@ -0,0 +1,25 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="TagsMenu" action="TagsMenu">
+ <menuitem name="RemoveTagFromPhotos" action="RemoveTagFromPhotos" />
+ <separator />
+ <menuitem name="RenameTag" action="RenameTag" />
+ <menuitem name="DeleteTag" action="DeleteTag" />
+ </menu>
+ </menubar>
+
+ <popup name="CollectionContextMenu">
+ <placeholder name="ContextTagsPlaceholder">
+ <menuitem name="ContextRemoveTagFromPhotos" action="RemoveTagFromPhotos" />
+ </placeholder>
+ </popup>
+
+ <popup name="TagsContextMenu">
+ <menuitem name="ContextNewChildTag" action="NewChildTagSidebar" />
+ <separator />
+ <menuitem name="ContextDeleteTag" action="RenameTagSidebar" />
+ <menuitem name="ContextRenameTag" action="DeleteTagSidebar" />
+ </popup>
+
+</ui>
diff --git a/ui/top.ui b/ui/top.ui
new file mode 100644
index 0000000..81d1006
--- /dev/null
+++ b/ui/top.ui
@@ -0,0 +1,12 @@
+<ui>
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu" />
+ <menu name="EditMenu" action="EditMenu" />
+ <menu name="ViewMenu" action="ViewMenu" />
+ <menu name="PhotoMenu" action="PhotoMenu" />
+ <menu name="PhotosMenu" action="PhotosMenu" />
+ <menu name="EventsMenu" action="EventsMenu" />
+ <menu name="TagsMenu" action="TagsMenu" />
+ <menu name="HelpMenu" action="HelpMenu" />
+ </menubar>
+</ui>
diff --git a/ui/trash.ui b/ui/trash.ui
new file mode 100644
index 0000000..7615512
--- /dev/null
+++ b/ui/trash.ui
@@ -0,0 +1,82 @@
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="FileMenu">
+ <menuitem name="Import" action="CommonFileImport" />
+ <menuitem name="ImportExternal" action="ExternalLibraryImport" />
+ <separator />
+ <menuitem name="JumpToFile" action="CommonJumpToFile" />
+ <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <menuitem name="Quit" action="CommonQuit" />
+ </menu>
+
+ <menu name="EditMenu" action="EditMenu">
+ <menuitem name="Undo" action="CommonUndo" />
+ <menuitem name="Redo" action="CommonRedo" />
+ <separator />
+ <menuitem name="Find" action="CommonFind" />
+ <menuitem name="NewSearch" action="CommonNewSearch" />
+ <separator />
+ <menuitem name="Delete" action="Delete" />
+ <menuitem name="Restore" action="Restore" />
+ <separator />
+ <menuitem name="SelectAll" action="CommonSelectAll" />
+ <separator />
+ <menuitem name="Preferences" action="CommonPreferences" />
+ </menu>
+
+ <menu name="ViewMenu" action="ViewMenu">
+ <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
+ <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
+ <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
+ <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
+ <separator />
+ <menu name="FilterPhotos" action="CommonFilterPhotos">
+ <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
+ <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
+ <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
+ <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
+ <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
+ <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
+ <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
+ <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
+ </menu>
+ <separator />
+ <menu name="SortEvents" action="CommonSortEvents">
+ <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
+ <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
+ </menu>
+ </menu>
+
+ <menu name="HelpMenu" action="HelpMenu">
+ <menuitem name="Contents" action="CommonHelpContents" />
+ <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
+ <menuitem name="Report a Problem..." action="CommonHelpReportProblem" />
+ <separator />
+ <menuitem name="About" action="CommonAbout" />
+ </menu>
+ </menubar>
+
+ <popup name="TrashContextMenu">
+ <menuitem name="ContextDelete" action="Delete" />
+ <menuitem name="ContextRestore" action="Restore" />
+ <separator />
+ <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
+ <separator />
+ <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
+ </popup>
+
+ <popup name="TrashPageMenu">
+ <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
+ </popup>
+
+ <toolbar name="TrashToolbar">
+ <toolitem name="ToolDelete" action="Delete" />
+ <toolitem name="ToolRestore" action="Restore" />
+ <toolitem name="ToolEmptyTrash" action="CommonEmptyTrash" />
+ <separator />
+ <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
+ </toolbar>
+
+</ui>
diff --git a/unitize.mk b/unitize.mk
new file mode 100644
index 0000000..6aaa7a0
--- /dev/null
+++ b/unitize.mk
@@ -0,0 +1,29 @@
+# unitize.mk
+#
+# Post-processes each unit's .mk file to properly add its requirements to the master Makefile.
+
+# append files to SRC_FILES (*don't* use +=, that's a recursive append)
+UNITIZED_SRC_FILES := $(UNITIZED_SRC_FILES) src/$(UNIT_DIR)/$(UNIT_NAME).vala $(foreach file,$(UNIT_FILES),src/$(UNIT_DIR)/$(file))
+
+# append unit namespace to master list
+UNIT_NAMESPACES := $(UNIT_NAMESPACES) $(UNIT_NAME)
+
+# append unit resources to master list
+UNIT_RESOURCES := $(UNIT_RESOURCES) $(foreach rc,$(UNIT_RC),src/$(UNIT_DIR)/$(rc))
+
+# create custom uses lists for this unit; note that the unit-unit is automatically included
+# (unless the unit is the unit-unit)
+ifneq ($(UNIT_NAME),Unit)
+$(UNIT_NAME)_USES := Unit $(UNIT_USES)
+else
+$(UNIT_NAME)_USES := $(UNIT_USES)
+endif
+$(UNIT_NAME)_USES_INITS := $(foreach uses,$($(UNIT_NAME)_USES),$(uses).init_entry();)
+$(UNIT_NAME)_USES_TERMINATORS := $(foreach uses,$($(UNIT_NAME)_USES),$(uses).terminate_entry();)
+
+# clear unit variables so they are not appended to by the next unit
+UNIT_NAME=
+UNIT_DIR=
+UNIT_FILES=
+UNIT_USES=
+UNIT_RC=
diff --git a/units.mk b/units.mk
new file mode 100644
index 0000000..a03ec19
--- /dev/null
+++ b/units.mk
@@ -0,0 +1,35 @@
+
+# List of all units in the system. Use directory name rather than namespace.
+#
+# This list is primarily used at compile time to build the executable.
+#
+# NOTE: The unit-unit must be first. Units may follow in any order thereafter.
+#
+# NOTE: Be sure to add the unit to the appropriate APP_UNITS .mk file.
+UNITS = \
+ unit \
+ util \
+ threads \
+ db \
+ editing_tools \
+ plugins \
+ slideshow \
+ photos \
+ publishing \
+ library \
+ direct \
+ core \
+ sidebar \
+ events \
+ tags \
+ camera \
+ searches \
+ config \
+ data_imports \
+ folders
+
+# Name(s) of units that represent application entry points. These units will have init and
+# termination entry points generated: Name.unitize_init() and Name.unitize_terminate(). These
+# methods should be called in main(). They will initialize the named unit and all is prerequisite
+# units, thereby initializing the entire application.
+APP_UNITS = Library Direct
diff --git a/vapi/ExtendedPosix.vapi b/vapi/ExtendedPosix.vapi
new file mode 100644
index 0000000..2eaeffe
--- /dev/null
+++ b/vapi/ExtendedPosix.vapi
@@ -0,0 +1,18 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+[CCode (cprefix="", lower_case_cprefix="")]
+namespace ExtendedPosix {
+ [CCode (cheader_filename="unistd.h")]
+ public long sysconf(int name);
+
+ [CCode (cprefix="", lower_case_cprefix="")]
+ enum ConfName {
+ _SC_NPROCESSORS_CONF,
+ _SC_NPROCESSORS_ONLN
+ }
+}
+
diff --git a/vapi/LConv.vapi b/vapi/LConv.vapi
new file mode 100644
index 0000000..35de9f5
--- /dev/null
+++ b/vapi/LConv.vapi
@@ -0,0 +1,45 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+namespace GLib {
+ [Compact]
+ [CCode (cheader_filename = "locale.h", cname = "struct lconv")]
+ public class LConv {
+ public string decimal_point;
+ public string thousands_sep;
+ public string grouping;
+
+ public string int_curr_symbol;
+ public string currency_symbol;
+ public string mon_decimal_point;
+ public string mon_thousands_sep;
+ public string mon_grouping;
+ public string positive_sign;
+ public string negative_sign;
+ public char int_frac_digits;
+ public char frac_digits;
+
+ public char p_cs_precedes;
+ public char p_sep_by_space;
+ public char n_cs_precedes;
+ public char n_sep_by_space;
+
+ public char p_sign_posn;
+ public char n_sign_posn;
+
+ public char int_p_cs_precedes;
+ public char int_p_sep_by_space;
+ public char int_n_cs_precedes;
+ public char int_n_sep_by_space;
+ public char int_p_sign_posn;
+ public char int_n_sign_posn;
+ }
+
+ namespace Intl {
+ [CCode (cname = "localeconv", cheader_filename = "locale.h")]
+ public static unowned LConv localeconv();
+ }
+}
+
diff --git a/vapi/gphoto-2.4/libgphoto2.vapi b/vapi/gphoto-2.4/libgphoto2.vapi
new file mode 100644
index 0000000..e90e094
--- /dev/null
+++ b/vapi/gphoto-2.4/libgphoto2.vapi
@@ -0,0 +1,487 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+[CCode (
+ cprefix="GP",
+ lower_case_cprefix="gp_"
+)]
+namespace GPhoto {
+ [SimpleType]
+ [CCode (
+ cname="CameraAbilities",
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h"
+ )]
+ public struct CameraAbilities {
+ public string model;
+ public int status;
+ public PortType port;
+ public string speed;
+ public CameraOperation operations;
+ public CameraFileOperation file_operations;
+ public CameraFolderOperation folder_operations;
+ public int usb_vendor;
+ public int usb_product;
+ public int usb_class;
+ public int usb_protocol;
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraAbilitiesList",
+ cprefix="gp_abilities_list_",
+ free_function="gp_abilities_list_free",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h"
+ )]
+ public class CameraAbilitiesList {
+ [CCode (cname="gp_abilities_list_new")]
+ public static Result create(out CameraAbilitiesList abilitiesList);
+ public Result load(Context context);
+ public Result reset();
+ public Result detect(PortInfoList portList, CameraList cameraList, Context context);
+ public int count();
+ public int lookup_model(string model);
+ public Result get_abilities(int index, out CameraAbilities abilities);
+ }
+
+ [Compact]
+ [CCode (
+ cname="Camera",
+ ref_function="GPHOTO_REF_CAMERA",
+ unref_function="gp_camera_unref",
+ free_function="gp_camera_free",
+ cheader_filename="gphoto2/gphoto2-camera.h,gphoto.h"
+ )]
+ public class Camera {
+ [CCode (cname="gp_camera_new")]
+ public static Result create(out Camera camera);
+ public Result init(Context context);
+ public Result exit(Context context);
+ public Result get_port_info(out PortInfo info);
+ public Result set_port_info(PortInfo info);
+ public Result get_abilities(out CameraAbilities abilities);
+ public Result set_abilities(CameraAbilities abilities);
+ public Result get_storageinfo(CameraStorageInformation **sifs, out int count, Context context);
+
+ // Folders
+ [CCode (cname="gp_camera_folder_list_folders")]
+ public Result list_folders(string folder, CameraList list, Context context);
+ [CCode (cname="gp_camera_folder_list_files")]
+ public Result list_files(string folder, CameraList list, Context context);
+ [CCode (cname="gp_camera_folder_delete_all")]
+ public Result delete_all_files(string folder, Context context);
+ [CCode (cname="gp_camera_folder_put_file")]
+ public Result put_file(string folder, CameraFile file, Context context);
+ [CCode (cname="gp_camera_folder_make_dir")]
+ public Result make_dir(string folder, string name, Context context);
+ [CCode (cname="gp_camera_folder_remove_dir")]
+ public Result remove_dir(string folder, string name, Context context);
+
+ // Files
+ [CCode (cname="gp_camera_file_get_info")]
+ public Result get_file_info(string folder, string file, out CameraFileInfo info, Context context);
+ [CCode (cname="gp_camera_file_set_info")]
+ public Result set_file_info(string folder, string file, CameraFileInfo info, Context context);
+ [CCode (cname="gp_camera_file_get")]
+ public Result get_file(string folder, string filename, CameraFileType type, CameraFile file,
+ Context context);
+ [CCode (cname="gp_camera_file_delete")]
+ public Result delete_file(string folder, string filename, Context context);
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraFile",
+ cprefix="gp_file_",
+ ref_function="GPHOTO_REF_FILE",
+ unref_function="gp_file_unref",
+ free_function="gp_file_free",
+ cheader_filename="gphoto2/gphoto2-file.h,gphoto.h"
+ )]
+ public class CameraFile {
+ [CCode (cname="gp_file_new")]
+ public static Result create(out CameraFile file);
+ public Result get_data_and_size(out uint8 *data, out ulong data_len);
+ public Result save(string filename);
+ public Result slurp(uint8[] data, out size_t readlen);
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfo",
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfo {
+ public CameraFileInfoPreview preview;
+ public CameraFileInfoFile file;
+ public CameraFileInfoAudio audio;
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoAudio",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoAudio {
+ }
+
+ [CCode (
+ cname="CameraFileInfoFields",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_INFO_"
+ )]
+ [Flags]
+ public enum CameraFileInfoFields {
+ NONE,
+ TYPE,
+ NAME,
+ SIZE,
+ WIDTH,
+ HEIGHT,
+ PERMISSIONS,
+ STATUS,
+ MTIME,
+ ALL
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoFile",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoFile {
+ public CameraFileInfoFields fields;
+ public CameraFileStatus status;
+ public ulong size;
+ public string type;
+ public uint width;
+ public uint height;
+ public string name;
+ public CameraFilePermissions permissions;
+ public time_t mtime;
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoPreview",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoPreview {
+ public CameraFileInfoFields fields;
+ public CameraFileStatus status;
+ public ulong size;
+ public string type;
+ public uint width;
+ public uint height;
+ public string name;
+ public CameraFilePermissions permissions;
+ public time_t mtime;
+ }
+
+ [CCode (
+ cname="CameraFileOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_FILE_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraFileOperation {
+ NONE,
+ DELETE,
+ PREVIEW,
+ RAW,
+ AUDIO,
+ EXIF
+ }
+
+ [CCode (
+ cname="CameraFilePermissions",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_PERM_"
+ )]
+ [Flags]
+ public enum CameraFilePermissions {
+ NONE,
+ READ,
+ DELETE,
+ ALL
+ }
+
+ [CCode (
+ cname="CameraFileStatus",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_STATUS_"
+ )]
+ public enum CameraFileStatus {
+ NOT_DOWNLOADED,
+ DOWNLOADED
+ }
+
+ [CCode (
+ cname="CameraFileType",
+ cheader_filename="gphoto2/gphoto2-file.h",
+ cprefix="GP_FILE_TYPE_"
+ )]
+ public enum CameraFileType {
+ PREVIEW,
+ NORMAL,
+ RAW,
+ AUDIO,
+ EXIF,
+ METADATA
+ }
+
+ [CCode (
+ cname="CameraFolderOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_FOLDER_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraFolderOperation {
+ NONE,
+ DELETE_ALL,
+ PUT_FILE,
+ MAKE_DIR,
+ REMOVE_DIR
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraList",
+ cprefix="gp_list_",
+ ref_function="GPHOTO_REF_LIST",
+ unref_function="gp_list_unref",
+ free_function="gp_list_free",
+ cheader_filename="gphoto2/gphoto2-list.h,gphoto.h"
+ )]
+ public class CameraList {
+ [CCode (cname="gp_list_new")]
+ public static Result create(out CameraList list);
+ public int count();
+ public Result append(string name, string value);
+ public Result reset();
+ public Result sort();
+ public Result find_by_name(out int? index, string name);
+ public Result get_name(int index, out unowned string name);
+ public Result get_value(int index, out unowned string value);
+ public Result set_name(int index, string name);
+ public Result set_value(int index, string value);
+ public Result populate(string format, int count);
+ }
+
+ [CCode (
+ cname="CameraOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraOperation {
+ NONE,
+ CAPTURE_IMAGE,
+ CAPTURE_VIDEO,
+ CAPTURE_AUDIO,
+ CAPTURE_PREVIEW,
+ CONFIG
+ }
+
+ [CCode (
+ cname="CameraStorageInfoFields",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_STORAGEINFO_"
+ )]
+ [Flags]
+ public enum CameraStorageInfoFields {
+ BASE,
+ LABEL,
+ DESCRIPTION,
+ ACCESS,
+ STORAGETYPE,
+ FILESYSTEMTYPE,
+ MAXCAPACITY,
+ FREESPACEKBYTES,
+ FREESPACEIMAGES
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraStorageInformation",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraStorageInformation {
+ public CameraStorageInfoFields fields;
+ public string basedir;
+ public string label;
+ public string description;
+ public int type;
+ public int fstype;
+ public int access;
+ public ulong capacitykbytes;
+ public ulong freekbytes;
+ public ulong freeimages;
+ }
+
+ [Compact]
+ [CCode (
+ ref_function="GPHOTO_REF_CONTEXT",
+ unref_function="gp_context_unref",
+ cheader_filename="gphoto2/gphoto2-context.h,gphoto.h"
+ )]
+ public class Context {
+ [CCode (cname="gp_context_new")]
+ public Context();
+ public void set_idle_func(ContextIdleFunc func);
+ public void set_progress_funcs(
+ [CCode (delegate_target_pos=3.1)] ContextProgressStartFunc startFunc,
+ [CCode (delegate_target_pos=3.1)] ContextProgressUpdateFunc updateFunc,
+ [CCode (delegate_target_pos=3.1)] ContextProgressStopFunc stopFunc);
+ public void set_error_func([CCode (delegate_target_pos=3.1)] ContextErrorFunc errorFunc);
+ public void set_status_func([CCode (delegate_target_pos=3.1)] ContextStatusFunc statusFunc);
+ public void set_message_func([CCode (delegate_target_pos=3.1)] ContextMessageFunc messageFunc);
+ }
+
+ public delegate void ContextIdleFunc(Context context);
+
+ public delegate void ContextErrorFunc(Context context, string format, void *va_list);
+
+ public delegate void ContextStatusFunc(Context context, string format, void *va_list);
+
+ public delegate void ContextMessageFunc(Context context, string format, void *va_list);
+
+ // TODO: Support for va_args in Vala, esp. for delegates?
+ public delegate uint ContextProgressStartFunc(Context context, float target, string format, void *va_list);
+
+ public delegate void ContextProgressUpdateFunc(Context context, uint id, float current);
+
+ public delegate void ContextProgressStopFunc(Context context, uint id);
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-file.h",
+ cprefix="GP_MIME_"
+ )]
+ namespace MIME {
+ public const string WAV;
+ public const string RAW;
+ public const string PNG;
+ public const string PGM;
+ public const string PPM;
+ public const string PNM;
+ public const string JPEG;
+ public const string TIFF;
+ public const string BMP;
+ public const string QUICKTIME;
+ public const string AVI;
+ public const string CRW;
+ public const string UNKNOWN;
+ public const string EXIF;
+ public const string MP3;
+ public const string OGG;
+ public const string WMA;
+ public const string ASF;
+ public const string MPEG;
+ }
+
+ [SimpleType]
+ [CCode (
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-port-info-list.h"
+ )]
+ public struct PortInfo {
+ public PortType type;
+ public string name;
+ public string path;
+ public string library_filename;
+ }
+
+ [Compact]
+ [CCode (
+ free_function="gp_port_info_list_free",
+ cheader_filename="gphoto2/gphoto2-port-info-list.h"
+ )]
+ public class PortInfoList {
+ [CCode (cname="gp_port_info_list_new")]
+ public static Result create(out PortInfoList list);
+ public Result load();
+ public int count();
+ public int lookup_name(string name);
+ public int lookup_path(string name);
+ public Result get_info(int index, out PortInfo info);
+ }
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-port-info-list.h",
+ cprefix="GP_PORT_"
+ )]
+ [Flags]
+ public enum PortType {
+ NONE,
+ SERIAL,
+ USB,
+ DISK,
+ PTPIP
+ }
+
+ [CCode (
+ cname="int",
+ cheader_filename="gphoto2/gphoto2-result.h,gphoto2/gphoto2-port-result.h",
+ cprefix="GP_ERROR_"
+ )]
+ public enum Result {
+ [CCode (cname="GP_OK")]
+ OK,
+ [CCode (cname="GP_ERROR")]
+ ERROR,
+ BAD_PARAMETERS,
+ NO_MEMORY,
+ LIBRARY,
+ UNKNOWN_PORT,
+ NOT_SUPPORTED,
+ IO,
+ FIXED_LIMIT_EXCEEDED,
+ TIMEOUT,
+ IO_SUPPORTED_SERIAL,
+ IO_SUPPORTED_USB,
+ IO_INIT,
+ IO_READ,
+ IO_WRITE,
+ IO_UPDATE,
+ IO_SERIAL_SPEED,
+ IO_USB_CLEAR_HALT,
+ IO_USB_FIND,
+ IO_USB_CLAIM,
+ IO_LOCK,
+ HAL,
+ CORRUPTED_DATA,
+ FILE_EXISTS,
+ MODEL_NOT_FOUND,
+ DIRECTORY_NOT_FOUND,
+ FILE_NOT_FOUND,
+ DIRECTORY_EXISTS,
+ CAMERA_BUSY,
+ PATH_NOT_ABSOLUTE,
+ CANCEL,
+ CAMERA_ERROR,
+ OS_FAILURE;
+
+ [CCode (cname="gp_port_result_as_string")]
+ public unowned string as_string();
+
+ public string to_full_string() {
+ return "%s (%d)".printf(as_string(), this);
+ }
+ }
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-version.h",
+ cprefix="GP_VERSION"
+ )]
+ public enum VersionVerbosity {
+ SHORT,
+ VERBOSE
+ }
+
+ public unowned string library_version(VersionVerbosity verbosity);
+}
+
diff --git a/vapi/gphoto-2.5/libgphoto2.vapi b/vapi/gphoto-2.5/libgphoto2.vapi
new file mode 100644
index 0000000..89aa548
--- /dev/null
+++ b/vapi/gphoto-2.5/libgphoto2.vapi
@@ -0,0 +1,495 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+[CCode (
+ cprefix="GP",
+ lower_case_cprefix="gp_"
+)]
+namespace GPhoto {
+ [SimpleType]
+ [CCode (
+ cname="CameraAbilities",
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h"
+ )]
+ public struct CameraAbilities {
+ public string model;
+ public int status;
+ public PortType port;
+ public string speed;
+ public CameraOperation operations;
+ public CameraFileOperation file_operations;
+ public CameraFolderOperation folder_operations;
+ public int usb_vendor;
+ public int usb_product;
+ public int usb_class;
+ public int usb_protocol;
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraAbilitiesList",
+ cprefix="gp_abilities_list_",
+ free_function="gp_abilities_list_free",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h"
+ )]
+ public class CameraAbilitiesList {
+ [CCode (cname="gp_abilities_list_new")]
+ public static Result create(out CameraAbilitiesList abilitiesList);
+ public Result load(Context context);
+ public Result reset();
+ public Result detect(PortInfoList portList, CameraList cameraList, Context context);
+ public int count();
+ public int lookup_model(string model);
+ public Result get_abilities(int index, out CameraAbilities abilities);
+ }
+
+ [Compact]
+ [CCode (
+ cname="Camera",
+ ref_function="GPHOTO_REF_CAMERA",
+ unref_function="gp_camera_unref",
+ free_function="gp_camera_free",
+ cheader_filename="gphoto2/gphoto2-camera.h,gphoto.h"
+ )]
+ public class Camera {
+ [CCode (cname="gp_camera_new")]
+ public static Result create(out Camera camera);
+ public Result init(Context context);
+ public Result exit(Context context);
+ public Result get_port_info(out PortInfo info);
+ public Result set_port_info(PortInfo info);
+ public Result get_abilities(out CameraAbilities abilities);
+ public Result set_abilities(CameraAbilities abilities);
+ public Result get_storageinfo(CameraStorageInformation **sifs, out int count, Context context);
+
+ // Folders
+ [CCode (cname="gp_camera_folder_list_folders")]
+ public Result list_folders(string folder, CameraList list, Context context);
+ [CCode (cname="gp_camera_folder_list_files")]
+ public Result list_files(string folder, CameraList list, Context context);
+ [CCode (cname="gp_camera_folder_delete_all")]
+ public Result delete_all_files(string folder, Context context);
+ [CCode (cname="gp_camera_folder_put_file")]
+ public Result put_file(string folder, CameraFile file, Context context);
+ [CCode (cname="gp_camera_folder_make_dir")]
+ public Result make_dir(string folder, string name, Context context);
+ [CCode (cname="gp_camera_folder_remove_dir")]
+ public Result remove_dir(string folder, string name, Context context);
+
+ // Files
+ [CCode (cname="gp_camera_file_get_info")]
+ public Result get_file_info(string folder, string file, out CameraFileInfo info, Context context);
+ [CCode (cname="gp_camera_file_set_info")]
+ public Result set_file_info(string folder, string file, CameraFileInfo info, Context context);
+ [CCode (cname="gp_camera_file_get")]
+ public Result get_file(string folder, string filename, CameraFileType type, CameraFile file,
+ Context context);
+ [CCode (cname="gp_camera_file_delete")]
+ public Result delete_file(string folder, string filename, Context context);
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraFile",
+ cprefix="gp_file_",
+ ref_function="GPHOTO_REF_FILE",
+ unref_function="gp_file_unref",
+ free_function="gp_file_free",
+ cheader_filename="gphoto2/gphoto2-file.h,gphoto.h"
+ )]
+ public class CameraFile {
+ [CCode (cname="gp_file_new")]
+ public static Result create(out CameraFile file);
+ public Result get_data_and_size(out uint8 *data, out ulong data_len);
+ public Result save(string filename);
+ public Result slurp(uint8[] data, out size_t readlen);
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfo",
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfo {
+ public CameraFileInfoPreview preview;
+ public CameraFileInfoFile file;
+ public CameraFileInfoAudio audio;
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoAudio",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoAudio {
+ }
+
+ [CCode (
+ cname="CameraFileInfoFields",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_INFO_"
+ )]
+ [Flags]
+ public enum CameraFileInfoFields {
+ NONE,
+ TYPE,
+ NAME,
+ SIZE,
+ WIDTH,
+ HEIGHT,
+ PERMISSIONS,
+ STATUS,
+ MTIME,
+ ALL
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoFile",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoFile {
+ public CameraFileInfoFields fields;
+ public CameraFileStatus status;
+ public ulong size;
+ public string type;
+ public uint width;
+ public uint height;
+ public string name;
+ public CameraFilePermissions permissions;
+ public time_t mtime;
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraFileInfoPreview",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraFileInfoPreview {
+ public CameraFileInfoFields fields;
+ public CameraFileStatus status;
+ public ulong size;
+ public string type;
+ public uint width;
+ public uint height;
+ public string name;
+ public CameraFilePermissions permissions;
+ public time_t mtime;
+ }
+
+ [CCode (
+ cname="CameraFileOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_FILE_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraFileOperation {
+ NONE,
+ DELETE,
+ PREVIEW,
+ RAW,
+ AUDIO,
+ EXIF
+ }
+
+ [CCode (
+ cname="CameraFilePermissions",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_PERM_"
+ )]
+ [Flags]
+ public enum CameraFilePermissions {
+ NONE,
+ READ,
+ DELETE,
+ ALL
+ }
+
+ [CCode (
+ cname="CameraFileStatus",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_FILE_STATUS_"
+ )]
+ public enum CameraFileStatus {
+ NOT_DOWNLOADED,
+ DOWNLOADED
+ }
+
+ [CCode (
+ cname="CameraFileType",
+ cheader_filename="gphoto2/gphoto2-file.h",
+ cprefix="GP_FILE_TYPE_"
+ )]
+ public enum CameraFileType {
+ PREVIEW,
+ NORMAL,
+ RAW,
+ AUDIO,
+ EXIF,
+ METADATA
+ }
+
+ [CCode (
+ cname="CameraFolderOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_FOLDER_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraFolderOperation {
+ NONE,
+ DELETE_ALL,
+ PUT_FILE,
+ MAKE_DIR,
+ REMOVE_DIR
+ }
+
+ [Compact]
+ [CCode (
+ cname="CameraList",
+ cprefix="gp_list_",
+ ref_function="GPHOTO_REF_LIST",
+ unref_function="gp_list_unref",
+ free_function="gp_list_free",
+ cheader_filename="gphoto2/gphoto2-list.h,gphoto.h"
+ )]
+ public class CameraList {
+ [CCode (cname="gp_list_new")]
+ public static Result create(out CameraList list);
+ public int count();
+ public Result append(string name, string value);
+ public Result reset();
+ public Result sort();
+ public Result find_by_name(out int? index, string name);
+ public Result get_name(int index, out unowned string name);
+ public Result get_value(int index, out unowned string value);
+ public Result set_name(int index, string name);
+ public Result set_value(int index, string value);
+ public Result populate(string format, int count);
+ }
+
+ [CCode (
+ cname="CameraOperation",
+ cheader_filename="gphoto2/gphoto2-abilities-list.h",
+ cprefix="GP_OPERATION_"
+ )]
+ [Flags]
+ public enum CameraOperation {
+ NONE,
+ CAPTURE_IMAGE,
+ CAPTURE_VIDEO,
+ CAPTURE_AUDIO,
+ CAPTURE_PREVIEW,
+ CONFIG
+ }
+
+ [CCode (
+ cname="CameraStorageInfoFields",
+ cheader_filename="gphoto2/gphoto2-filesys.h",
+ cprefix="GP_STORAGEINFO_"
+ )]
+ [Flags]
+ public enum CameraStorageInfoFields {
+ BASE,
+ LABEL,
+ DESCRIPTION,
+ ACCESS,
+ STORAGETYPE,
+ FILESYSTEMTYPE,
+ MAXCAPACITY,
+ FREESPACEKBYTES,
+ FREESPACEIMAGES
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="CameraStorageInformation",
+ cheader_filename="gphoto2/gphoto2-filesys.h"
+ )]
+ public struct CameraStorageInformation {
+ public CameraStorageInfoFields fields;
+ public string basedir;
+ public string label;
+ public string description;
+ public int type;
+ public int fstype;
+ public int access;
+ public ulong capacitykbytes;
+ public ulong freekbytes;
+ public ulong freeimages;
+ }
+
+ [Compact]
+ [CCode (
+ ref_function="GPHOTO_REF_CONTEXT",
+ unref_function="gp_context_unref",
+ cheader_filename="gphoto2/gphoto2-context.h,gphoto.h"
+ )]
+ public class Context {
+ [CCode (cname="gp_context_new")]
+ public Context();
+ public void set_idle_func(ContextIdleFunc func);
+ public void set_progress_funcs(
+ [CCode (delegate_target_pos=3.1)] ContextProgressStartFunc startFunc,
+ [CCode (delegate_target_pos=3.1)] ContextProgressUpdateFunc updateFunc,
+ [CCode (delegate_target_pos=3.1)] ContextProgressStopFunc stopFunc);
+ public void set_error_func([CCode (delegate_target_pos=3.1)] ContextErrorFunc errorFunc);
+ public void set_status_func([CCode (delegate_target_pos=3.1)] ContextStatusFunc statusFunc);
+ public void set_message_func([CCode (delegate_target_pos=3.1)] ContextMessageFunc messageFunc);
+ }
+
+ public delegate void ContextIdleFunc(Context context);
+
+ public delegate void ContextErrorFunc(Context context, string text);
+
+ public delegate void ContextStatusFunc(Context context, string text);
+
+ public delegate void ContextMessageFunc(Context context, string text);
+
+ // TODO: Support for va_args in Vala, esp. for delegates?
+ public delegate uint ContextProgressStartFunc(Context context, float target, string text);
+
+ public delegate void ContextProgressUpdateFunc(Context context, uint id, float current);
+
+ public delegate void ContextProgressStopFunc(Context context, uint id);
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-file.h",
+ cprefix="GP_MIME_"
+ )]
+ namespace MIME {
+ public const string WAV;
+ public const string RAW;
+ public const string PNG;
+ public const string PGM;
+ public const string PPM;
+ public const string PNM;
+ public const string JPEG;
+ public const string TIFF;
+ public const string BMP;
+ public const string QUICKTIME;
+ public const string AVI;
+ public const string CRW;
+ public const string UNKNOWN;
+ public const string EXIF;
+ public const string MP3;
+ public const string OGG;
+ public const string WMA;
+ public const string ASF;
+ public const string MPEG;
+ }
+
+ [SimpleType]
+ [CCode (
+ destroy_function="",
+ cheader_filename="gphoto2/gphoto2-port-info-list.h"
+ )]
+ public struct PortInfo {
+ [CCode (cname="gp_port_info_get_path")]
+ public int get_path(out unowned string path);
+ [CCode (cname="gp_port_info_set_path")]
+ public int set_path(string path);
+ [CCode (cname="gp_port_info_get_name")]
+ public int get_name(out unowned string name);
+ [CCode (cname="gp_port_info_set_name")]
+ public int set_name(string path);
+ [CCode (cname="gp_port_info_get_library_filename")]
+ public int get_library_filename(out unowned string lib);
+ [CCode (cname="gp_port_info_set_library_filename")]
+ public int set_library_filename(string lib);
+ }
+
+ [Compact]
+ [CCode (
+ free_function="gp_port_info_list_free",
+ cheader_filename="gphoto2/gphoto2-port-info-list.h"
+ )]
+ public class PortInfoList {
+ [CCode (cname="gp_port_info_list_new")]
+ public static Result create(out PortInfoList list);
+ public Result load();
+ public int count();
+ public int lookup_name(string name);
+ public int lookup_path(string name);
+ public Result get_info(int index, out PortInfo info);
+ }
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-port-info-list.h",
+ cprefix="GP_PORT_"
+ )]
+ [Flags]
+ public enum PortType {
+ NONE,
+ SERIAL,
+ USB,
+ DISK,
+ PTPIP
+ }
+
+ [CCode (
+ cname="int",
+ cheader_filename="gphoto2/gphoto2-result.h,gphoto2/gphoto2-port-result.h",
+ cprefix="GP_ERROR_"
+ )]
+ public enum Result {
+ [CCode (cname="GP_OK")]
+ OK,
+ [CCode (cname="GP_ERROR")]
+ ERROR,
+ BAD_PARAMETERS,
+ NO_MEMORY,
+ LIBRARY,
+ UNKNOWN_PORT,
+ NOT_SUPPORTED,
+ IO,
+ FIXED_LIMIT_EXCEEDED,
+ TIMEOUT,
+ IO_SUPPORTED_SERIAL,
+ IO_SUPPORTED_USB,
+ IO_INIT,
+ IO_READ,
+ IO_WRITE,
+ IO_UPDATE,
+ IO_SERIAL_SPEED,
+ IO_USB_CLEAR_HALT,
+ IO_USB_FIND,
+ IO_USB_CLAIM,
+ IO_LOCK,
+ HAL,
+ CORRUPTED_DATA,
+ FILE_EXISTS,
+ MODEL_NOT_FOUND,
+ DIRECTORY_NOT_FOUND,
+ FILE_NOT_FOUND,
+ DIRECTORY_EXISTS,
+ CAMERA_BUSY,
+ PATH_NOT_ABSOLUTE,
+ CANCEL,
+ CAMERA_ERROR,
+ OS_FAILURE;
+
+ [CCode (cname="gp_port_result_as_string")]
+ public unowned string as_string();
+
+ public string to_full_string() {
+ return "%s (%d)".printf(as_string(), this);
+ }
+ }
+
+ [CCode (
+ cheader_filename="gphoto2/gphoto2-version.h",
+ cprefix="GP_VERSION"
+ )]
+ public enum VersionVerbosity {
+ SHORT,
+ VERBOSE
+ }
+
+ public unowned string library_version(VersionVerbosity verbosity);
+}
+
diff --git a/vapi/gphoto.h b/vapi/gphoto.h
new file mode 100644
index 0000000..f40b84c
--- /dev/null
+++ b/vapi/gphoto.h
@@ -0,0 +1,18 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+#ifndef GPHOTO_H
+#define GPHOTO_H
+
+#define GPHOTO_REF_CAMERA(c) (gp_camera_ref(c) == GP_OK ? c : NULL)
+
+#define GPHOTO_REF_FILE(c) (gp_file_ref(c) == GP_OK ? c : NULL)
+
+#define GPHOTO_REF_LIST(c) (gp_list_ref(c) == GP_OK ? c : NULL)
+
+#define GPHOTO_REF_CONTEXT(c) (gp_context_ref(c) == GP_OK ? c : NULL)
+
+#endif /* GPHOTO_H */
diff --git a/vapi/libexif.vapi b/vapi/libexif.vapi
new file mode 100644
index 0000000..ff29a76
--- /dev/null
+++ b/vapi/libexif.vapi
@@ -0,0 +1,340 @@
+/* Copyright 2009-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU LGPL (version 2.1 or later).
+ * See the COPYING file in this distribution.
+ */
+
+[CCode (
+ cprefix = "Exif",
+ lower_case_cprefix="exif_"
+)]
+namespace Exif {
+ [CCode (
+ cname="ExifByteOrder",
+ cheader_filename="libexif/exif-byte-order.h",
+ cprefix="EXIF_BYTE_ORDER_"
+ )]
+ public enum ByteOrder {
+ INTEL,
+ MOTOROLA;
+
+ public unowned string get_name();
+ }
+
+ [Compact]
+ [CCode (
+ cname="ExifContent",
+ cheader_filename="libexif/exif-content.h",
+ ref_function="exif_content_ref",
+ ref_function_void=true,
+ unref_function="exif_content_unref",
+ free_function="exif_content_free"
+ )]
+ public class Content {
+ [CCode (cname="exif_content_new")]
+ public Content();
+ public void add_entry(Entry entry);
+ public void remove_entry(Entry entry);
+ public void dump(uint indent = 4);
+ public void foreach_entry(ForeachEntryFunc cb, void *user);
+ public unowned Entry get_entry(Tag tag);
+ public void fix();
+ public Ifd get_ifd();
+
+ public Entry **entries;
+ public int count;
+ public Data parent;
+ }
+
+ [CCode (
+ cheader_filename="libexif/exif-utils.h",
+ cprefix="exif_",
+ lower_case_cprefix="exif_"
+ )]
+ namespace Convert {
+ public static uint16 get_short(uchar *buffer, ByteOrder byteOrder);
+ public static int16 get_sshort(uchar *buffer, ByteOrder byteOrder);
+ public static uint32 get_long(uchar *buffer, ByteOrder byteOrder);
+ public static int32 get_slong(uchar *buffer, ByteOrder byteOrder);
+ public static Rational get_rational(uchar *buffer, ByteOrder byteOrder);
+ public static void set_short(uchar *buffer, ByteOrder byteOrder, uint16 val);
+ public static void set_sshort(uchar *buffer, ByteOrder byteOrder, int16 val);
+ public static void set_long(uchar *buffer, ByteOrder byteOrder, uint32 val);
+ public static void set_slong(uchar *buffer, ByteOrder byteOrder, int32 val);
+ }
+
+ [CCode (cheader_filename="libexif/exif-content.h", has_target=false)]
+ public delegate void ForeachEntryFunc(Entry e, void *user);
+
+ [Compact]
+ [CCode (
+ cname="ExifData",
+ cheader_filename="libexif/exif-data.h",
+ ref_function="exif_data_ref",
+ ref_function_void=true,
+ unref_function="exif_data_unref",
+ free_function="exif_data_free"
+ )]
+ public class Data {
+ [CCode (cname="exif_data_new")]
+ public Data();
+ public static Data? new_from_file(string path);
+ public static Data? new_from_data(uint8 *data, size_t count);
+ public void dump();
+ public void fix();
+ public void foreach_content(ForeachContentFunc cb, void *user = null);
+ public ByteOrder get_byte_order();
+ public DataType get_data_type();
+ public void load_data(uchar *buffer, uint size);
+ public void set_option(DataOption option);
+ public void unset_option(DataOption option);
+ public void save_data(uchar **buffer, uint *size);
+ public void set_data_type(DataType data_type);
+
+ // length is Exif.IFD_COUNT
+ public Content[] ifd;
+ public uchar *data;
+ public uint size;
+ }
+
+ [CCode (cheader_filename="libexif/exif-data.h", has_target=false)]
+ public delegate void ForeachContentFunc(Content c, void *user);
+
+ [CCode (
+ cname="ExifDataOption",
+ cheader_filename="libexif/exif-data.h",
+ cprefix="EXIF_DATA_OPTION_"
+ )]
+ public enum DataOption {
+ IGNORE_UNKNOWN_TAGS,
+ FOLLOW_SPECIFICATION,
+ DONT_CHANGE_MAKER_NOTE;
+
+ public unowned string get_name();
+ public unowned string get_description();
+ }
+
+ [CCode (
+ cname="ExifDataType",
+ cheader_filename="libexif/exif-data-type.h",
+ cprefix="EXIF_DATA_TYPE_"
+ )]
+ public enum DataType {
+ UNCOMPRESSED_CHUNKY,
+ UNCOMPRESSED_PLANAR,
+ UNCOMPRESSED_YCC,
+ COMPRESSED;
+
+ public bool is_valid() {
+ switch (this) {
+ case UNCOMPRESSED_CHUNKY:
+ case UNCOMPRESSED_PLANAR:
+ case UNCOMPRESSED_YCC:
+ case COMPRESSED:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+ }
+
+ [CCode (cname="EXIF_DATA_TYPE_COUNT")]
+ public const int DATA_TYPE_COUNT;
+
+ [Compact]
+ [CCode (
+ cname="ExifEntry",
+ cheader_filename="libexif/exif-entry.h",
+ ref_function="exif_entry_ref",
+ ref_function_void=true,
+ unref_function="exif_entry_unref"
+ )]
+ public class Entry {
+ [CCode (cname="exif_entry_new")]
+ public Entry();
+ public void dump(uint indent = 4);
+ public void initialize(Tag tag);
+ public void fix();
+ public unowned char* get_value(char *val, uint maxlen);
+ public string get_string() {
+ char[] buffer = new char[256];
+ get_value(buffer, 256);
+
+ GLib.StringBuilder builder = new GLib.StringBuilder();
+ foreach (char c in buffer)
+ builder.append_c(c);
+
+ return builder.str;
+ }
+
+ public Tag tag;
+ public Format format;
+ public ulong components;
+ public uchar *data;
+ public uint size;
+ public Content *parent;
+ }
+
+ [CCode (
+ cname="ExifFormat",
+ cheader_filename="libexif/exif-format.h",
+ cprefix="EXIF_FORMAT_"
+ )]
+ public enum Format {
+ BYTE,
+ ASCII,
+ SHORT,
+ LONG,
+ RATIONAL,
+ SBYTE,
+ UNDEFINED,
+ SSHORT,
+ SLONG,
+ SRATIONAL,
+ FLOAT,
+ DOUBLE;
+
+ public unowned string get_name();
+ public unowned uchar get_size();
+ }
+
+ [CCode (
+ cname="ExifIfd",
+ cheader_filename="libexif/exif-ifd.h",
+ cprefix="EXIF_IFD_"
+ )]
+ public enum Ifd {
+ [CCode (cname="EXIF_IFD_0")]
+ ZERO,
+ [CCode (cname="EXIF_IFD_1")]
+ ONE,
+ EXIF,
+ GPS,
+ INTEROPERABILITY;
+
+ public unowned string get_name();
+ }
+
+ [CCode (cname="EXIF_IFD_COUNT")]
+ public const int IFD_COUNT;
+
+ [Compact]
+ [CCode (
+ cname="ExifLoader",
+ cheader_filename="libexif/exif-loader.h",
+ ref_function="exif_loader_ref",
+ ref_function_void=true,
+ unref_function="exif_loader_unref",
+ free_function="exif_loader_free"
+ )]
+ public class Loader {
+ [CCode (cname="exif_loader_new")]
+ public Loader();
+ public void write_file(string fname);
+ public void reset();
+ public Data get_data();
+ }
+
+ // TODO: Flesh out Log functionality
+ [Compact]
+ [CCode (
+ cname="ExifLog",
+ cheader_filename="libexif/exif-loader.h",
+ ref_function="exif_log_ref",
+ ref_function_void=true,
+ unref_function="exif_log_unref",
+ free_function="exif_log_free"
+ )]
+ public class Log {
+ [CCode (cname="exif_log_new")]
+ public Log();
+ }
+
+ [CCode (
+ cname="ExifLogCode",
+ cheader_filename="libexif/exif-log.h",
+ cprefix="EXIF_LOG_CODE_"
+ )]
+ public enum LogCode {
+ NONE,
+ DEBUG,
+ NO_MEMORY,
+ CORRUPT_DATA;
+
+ public unowned string get_title();
+ public unowned string get_message();
+ }
+
+ [Compact]
+ [CCode (
+ cname="ExifMem",
+ cheader_filename="libexif/exif-mem.h",
+ ref_function="exif_mem_ref",
+ ref_function_void=true,
+ unref_function="exif_mem_unref"
+ )]
+ public class Mem {
+ public void *alloc(uint32 size);
+ public void *realloc(void *ptr, uint32 size);
+ public void free(void *ptr);
+ public static Mem new_default();
+ }
+
+ [SimpleType]
+ [CCode (
+ cname="ExifRational",
+ cheader_filename="libexif/exif-utils.h"
+ )]
+ public struct Rational {
+ uint32 numerator;
+ uint32 denominator;
+ }
+
+ [CCode (
+ cname="ExifSupportLevel",
+ cheader_filename="libexif/exif-tag.h",
+ cprefix="EXIF_SUPPORT_LEVEL_"
+ )]
+ public enum SupportLevel {
+ UNKNOWN,
+ NOT_RECORDED,
+ MANDATORY,
+ OPTIONAL
+ }
+
+ [CCode (
+ cname="ExifTag",
+ cheader_filename="libexif/exif-tag.h",
+ cprefix="EXIF_TAG_"
+ )]
+ public enum Tag {
+ PIXEL_X_DIMENSION,
+ PIXEL_Y_DIMENSION,
+ BITS_PER_SAMPLE,
+ DATE_TIME_ORIGINAL,
+ ORIENTATION,
+ RELATED_IMAGE_WIDTH,
+ RELATED_IMAGE_LENGTH,
+ EXPOSURE_TIME,
+ FNUMBER,
+ ISO_SPEED_RATINGS,
+ MAKE,
+ MODEL,
+ FLASH,
+ FOCAL_LENGTH,
+ GPS_LATITUDE,
+ GPS_LATITUDE_REF,
+ GPS_LONGITUDE,
+ GPS_LONGITUDE_REF,
+ ARTIST,
+ COPYRIGHT,
+ SOFTWARE,
+ IMAGE_DESCRIPTION;
+
+ public unowned string get_name_in_ifd(Ifd ifd);
+ public unowned string get_title_in_ifd(Ifd ifd);
+ public unowned string get_description_in_ifd(Ifd ifd);
+ public SupportLevel get_support_level_in_ifd(Ifd ifd, DataType data_type);
+ }
+}
diff --git a/vapi/libraw.vapi b/vapi/libraw.vapi
new file mode 100644
index 0000000..53f2461
--- /dev/null
+++ b/vapi/libraw.vapi
@@ -0,0 +1,268 @@
+/* Copyright 2010-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+[CCode (cprefix="libraw_", cheader_filename="libraw/libraw.h")]
+namespace LibRaw {
+
+[CCode (cname="LIBRAW_CHECK_VERSION")]
+public bool check_version(int major, int minor, int patch);
+
+public unowned string version();
+
+public unowned string versionNumber();
+
+[SimpleType]
+[CCode (cname="libraw_imgother_t")]
+public struct ImageOther {
+ public float iso_speed;
+ public float shutter;
+ public float aperture;
+ public float focal_len;
+ public time_t timestamp;
+ public uint shot_order;
+ public uint gpsdata[32];
+ public char desc[512];
+ public char artist[64];
+}
+
+[SimpleType]
+[CCode (cname="libraw_iparams_t")]
+public struct ImageParams {
+ public uint raw_count;
+ public uint dng_version;
+ public bool is_foveon;
+ public int colors;
+ public uint filters;
+
+ private char *make;
+ private char *model;
+ private char *cdesc;
+
+ public string get_make() {
+ return build_string(make, 64);
+ }
+
+ public string get_model() {
+ return build_string(model, 64);
+ }
+
+ public string get_cdesc() {
+ return build_string(cdesc, 5);
+ }
+
+ private static string build_string(char *array, int len) {
+ GLib.StringBuilder builder = new GLib.StringBuilder();
+ for (int ctr = 0; ctr < len; ctr++) {
+ if (array[ctr] != '\0')
+ builder.append_c(array[ctr]);
+ else
+ break;
+ }
+
+ return builder.str;
+ }
+}
+
+[SimpleType]
+[CCode (cname="libraw_image_sizes_t")]
+public struct ImageSizes {
+ public ushort raw_height;
+ public ushort raw_width;
+ public ushort height;
+ public ushort width;
+ public ushort top_margin;
+ public ushort left_margin;
+ public ushort iheight;
+ public ushort iwidth;
+ public double pixel_aspect;
+ public int flip;
+ public ushort right_margin;
+ public ushort bottom_margin;
+}
+
+[CCode (cname="enum LibRaw_constructor_flags", cprefix="LIBRAW_OPIONS_")]
+public enum Options {
+ [CCode (cname="LIBRAW_OPTIONS_NONE")]
+ NONE,
+ NO_MEMERR_CALLBACK,
+ NO_DATAERR_CALLBACK
+}
+
+[SimpleType]
+[CCode (cname="libraw_output_params_t")]
+public struct OutputParams {
+ public uint greybox[4];
+ public double aber[4];
+ public double gamm[6];
+ public float user_mul[4];
+ public uint shot_select;
+ public uint multi_out;
+ public float bright;
+ public float threshold;
+ public bool half_size;
+ public bool four_color_rgb;
+ public int highlight;
+ public bool use_auto_wb;
+ public bool use_camera_wb;
+ public bool use_camera_matrix;
+ public int output_color;
+ public int output_bps;
+ public bool output_tiff;
+ public int user_flip;
+ public int user_qual;
+ public int user_black;
+ public int user_sat;
+ public int med_passes;
+ public bool no_auto_bright;
+ public float auto_bright_thr;
+ public int use_fuji_rotate;
+ public int green_matching;
+
+ /* DCB parameters */
+ public int dcb_iterations;
+ public int dcb_enhance_fl;
+ public int fbdd_noiserd;
+
+ /* VCD parameters */
+ public int eeci_refine;
+ public int es_med_passes;
+ /* AMaZE*/
+ public int ca_correc;
+ public float cared;
+ public float cablue;
+ public int cfaline;
+ public float linenoise;
+ public int cfa_clean;
+ public float lclean;
+ public float cclean;
+ public int cfa_green;
+ public float green_thresh;
+ public int exp_correc;
+ public float exp_shift;
+ public float exp_preser;
+
+ public void set_chromatic_aberrations(double red_multiplier, double green_multiplier) {
+ aber[0] = red_multiplier;
+ aber[2] = green_multiplier;
+ }
+
+ public void set_gamma_curve(double power, double slope) {
+ gamm[0] = power;
+ gamm[1] = slope;
+ }
+}
+
+[Compact]
+[CCode (cname="libraw_processed_image_t", free_function="free")]
+public class ProcessedImage {
+ public ushort height;
+ public ushort width;
+ public ushort colors;
+ public ushort bits;
+ public uint data_size;
+ [CCode (array_length=false)]
+ public uint8[] data;
+}
+
+[Compact]
+[CCode (cname="libraw_data_t", cprefix="libraw_", free_function="libraw_close")]
+public class Processor {
+ public OutputParams params;
+
+ private Progress progress_flags;
+ private Warnings process_warnings;
+ private ImageParams idata;
+ private ImageSizes sizes;
+ private ImageOther other;
+ private Thumbnail thumbnail;
+
+ [CCode (cname="libraw_init")]
+ public Processor(Options flags = Options.NONE);
+
+ public Result adjust_sizes_info_only();
+ [CCode (cname="libraw_dcraw_document_mode_processing")]
+ public Result document_mode_processing();
+ public unowned ImageOther get_image_other() { return other; }
+ public unowned ImageParams get_image_params() { return idata; }
+ public Progress get_progress_flags() { return progress_flags; }
+ public Warnings get_process_warnings() { return process_warnings; }
+ public unowned ImageSizes get_sizes() { return sizes; }
+ public unowned Thumbnail get_thumbnail() { return thumbnail; }
+ [CCode (cname="libraw_dcraw_make_mem_image")]
+ public ProcessedImage make_mem_image(ref Result result);
+ [CCode (cname="libraw_dcraw_make_mem_thumb")]
+ public ProcessedImage make_mem_thumb(ref Result result);
+ public Result open_buffer(uint8[] buffer);
+ public Result open_file(string filename);
+ [CCode (cname="libraw_dcraw_process")]
+ public Result process();
+ [CCode (cname="libraw_dcraw_ppm_tiff_writer")]
+ public Result ppm_tiff_writer(string outfile);
+ public void recycle();
+ public Result rotate_fuji_raw();
+ [CCode (cname="libraw_dcraw_thumb_writer")]
+ public Result thumb_writer(string outfile);
+ public Result unpack();
+ public Result unpack_thumb();
+}
+
+[CCode (cname="enum LibRaw_progress", cprefix="LIBRAW_PROGRESS_")]
+public enum Progress {
+ START;
+
+ [CCode (cname="libraw_strprogress")]
+ public unowned string to_string();
+}
+
+[CCode (cname="enum LibRaw_errors", cprefix="LIBRAW_")]
+public enum Result {
+ SUCCESS,
+ UNSPECIFIED_ERROR,
+ FILE_UNSUPPORTED,
+ REQUEST_FOR_NONEXISTENT_IMAGE,
+ OUT_OF_ORDER_CALL,
+ NO_THUMBNAIL,
+ UNSUPPORTED_THUMBNAIL,
+ UNSUFFICIENT_MEMORY,
+ DATA_ERROR,
+ IO_ERROR,
+ CANCELLED_BY_CALLBACK,
+ BAD_CROP;
+
+ [CCode (cname="LIBRAW_FATAL_ERROR")]
+ public bool is_fatal_error();
+
+ [CCode (cname="libraw_strerror")]
+ public unowned string to_string();
+}
+
+[SimpleType]
+[CCode (cname="libraw_thumbnail_t")]
+public struct Thumbnail {
+ public ThumbnailFormat tformat;
+ public ushort twidth;
+ public ushort theight;
+ public uint tlength;
+ public int tcolors;
+ public int8 *thumb;
+}
+
+[CCode (cname="enum LibRaw_thumbnail_formats", cprefix="LIBRAW_THUMBNAIL_")]
+public enum ThumbnailFormat {
+ UNKNOWN,
+ JPEG,
+ BITMAP,
+ LAYER,
+ ROLLEI;
+}
+
+[CCode (cname="enum LibRaw_warnings", cprefix="LIBRAW_WARN_")]
+public enum Warnings {
+ NONE
+}
+
+}
+
diff --git a/vapi/unique-3.0.deps b/vapi/unique-3.0.deps
new file mode 100644
index 0000000..e762c58
--- /dev/null
+++ b/vapi/unique-3.0.deps
@@ -0,0 +1,8 @@
+gio-2.0
+cairo
+atk
+pango
+gdk-3.0
+gdk-pixbuf-2.0
+gtk+-3.0
+
diff --git a/vapi/unique-3.0.vapi b/vapi/unique-3.0.vapi
new file mode 100644
index 0000000..79f67c5
--- /dev/null
+++ b/vapi/unique-3.0.vapi
@@ -0,0 +1,94 @@
+/* unique-3.0.vapi generated by vapigen, do not modify. */
+/* Pulled from http://permalink.gmane.org/gmane.linux.redhat.fedora.devel/147876 */
+
+[CCode (cprefix = "Unique", lower_case_cprefix = "unique_")]
+namespace Unique {
+ [CCode (cheader_filename = "unique/uniqueapp.h")]
+ public class App : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public App (string name, string? startup_id);
+ public void add_command (string command_name, int command_id);
+ public bool is_running ();
+ public Unique.Response send_message (int command_id, Unique.MessageData? message_data);
+ public void watch_window (Gtk.Window window);
+ [CCode (has_construct_function = false)]
+ public App.with_commands (string name, string startup_id, ...);
+ [NoAccessorMethod]
+ public string name { owned get; construct; }
+ [NoAccessorMethod]
+ public Gdk.Screen screen { owned get; set construct; }
+ [NoAccessorMethod]
+ public string startup_id { owned get; construct; }
+ public virtual signal Unique.Response message_received (int command, Unique.MessageData message_data, uint time_);
+ }
+ [CCode (cheader_filename = "unique/uniquebackend.h")]
+ public class Backend : GLib.Object {
+ public weak string name;
+ public weak Unique.App parent;
+ public weak Gdk.Screen screen;
+ public weak string startup_id;
+ public uint workspace;
+ [CCode (has_construct_function = false)]
+ protected Backend ();
+ public static unowned Unique.Backend create ();
+ public unowned string get_name ();
+ public unowned Gdk.Screen get_screen ();
+ public unowned string get_startup_id ();
+ public uint get_workspace ();
+ public virtual bool request_name ();
+ public virtual Unique.Response send_message (int command_id, Unique.MessageData message_data, uint time_);
+ public void set_name (string name);
+ public void set_screen (Gdk.Screen screen);
+ public void set_startup_id (string startup_id);
+ }
+ [Compact]
+ [CCode (copy_function = "unique_message_data_copy", type_id = "UNIQUE_TYPE_MESSAGE_DATA", cheader_filename = "unique/uniquemessage.h")]
+ public class MessageData {
+ [CCode (has_construct_function = false)]
+ public MessageData ();
+ public unowned Unique.MessageData copy ();
+ public unowned uchar[] @get (size_t length);
+ public unowned string get_filename ();
+ public unowned Gdk.Screen get_screen ();
+ public unowned string get_startup_id ();
+ public unowned string get_text ();
+ public unowned string get_uris ();
+ public uint get_workspace ();
+ public void @set (uchar[] data, ssize_t length);
+ public void set_filename (string filename);
+ public bool set_text (string str, ssize_t length);
+ public bool set_uris (string uris);
+ }
+ [CCode (cprefix = "UNIQUE_", cheader_filename = "unique/uniqueenumtypes.h")]
+ public enum Command {
+ INVALID,
+ ACTIVATE,
+ NEW,
+ OPEN,
+ CLOSE
+ }
+ [CCode (cprefix = "UNIQUE_RESPONSE_", cheader_filename = "unique/uniqueenumtypes.h")]
+ public enum Response {
+ INVALID,
+ OK,
+ CANCEL,
+ FAIL,
+ PASSTHROUGH
+ }
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const string API_VERSION_S;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const string DEFAULT_BACKEND_S;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const int MAJOR_VERSION;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const int MICRO_VERSION;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const int MINOR_VERSION;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const string PROTOCOL_VERSION_S;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const int VERSION_HEX;
+ [CCode (cheader_filename = "unique/uniqueversion.h")]
+ public const string VERSION_S;
+}
diff --git a/vapi/unity.deps b/vapi/unity.deps
new file mode 100644
index 0000000..82127ef
--- /dev/null
+++ b/vapi/unity.deps
@@ -0,0 +1,6 @@
+glib-2.0
+gobject-2.0
+gio-2.0
+gio-unix-2.0
+dee-1.0
+Dbusmenu-0.4
diff --git a/vapi/unity.vapi b/vapi/unity.vapi
new file mode 100644
index 0000000..45147fb
--- /dev/null
+++ b/vapi/unity.vapi
@@ -0,0 +1,438 @@
+/* unity.vapi generated by valac 0.18.0, do not modify. */
+
+namespace Unity {
+ namespace IO {
+ [CCode (cheader_filename = "unity.h")]
+ public static string[] get_system_data_dirs ();
+ [CCode (cheader_filename = "unity.h")]
+ public static async GLib.FileInputStream? open_from_data_dirs (string filename) throws GLib.Error;
+ [CCode (cheader_filename = "unity.h")]
+ public static async GLib.FileInputStream? open_from_dirs (string filename, string[] dirs) throws GLib.Error;
+ [CCode (cheader_filename = "unity.h")]
+ public static async void read_stream_async (GLib.InputStream input, int io_priority = GLib.Priority.LOW, GLib.Cancellable? cancellable = null, out uint8[] data, out size_t size) throws GLib.IOError;
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class ActivationResponse : GLib.InitiallyUnowned {
+ public ActivationResponse (Unity.HandledType handled, string goto_uri = "");
+ public ActivationResponse.with_preview (Unity.Preview preview);
+ public string goto_uri { get; set construct; }
+ public Unity.HandledType handled { get; construct; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class AnnotatedIcon : GLib.Object {
+ public AnnotatedIcon (GLib.Icon base_icon);
+ public string to_string ();
+ public Unity.CategoryType category { get; set; }
+ public GLib.Icon icon { get; set; }
+ public string ribbon { get; set; }
+ public Unity.IconSizeHint size_hint { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class AppInfoManager : GLib.Object {
+ public void clear ();
+ public unowned string[]? get_categories (string id);
+ public static Unity.AppInfoManager get_default ();
+ [Deprecated (replacement = "AppInfoManager.get_default")]
+ public static Unity.AppInfoManager get_instance ();
+ public unowned string[]? get_keywords (string id);
+ public string? get_path (string id);
+ public GLib.AppInfo? lookup (string id);
+ public async GLib.AppInfo? lookup_async (string id) throws GLib.Error;
+ public signal void changed (string id, GLib.AppInfo? new_appinfo);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class ApplicationPreview : Unity.Preview {
+ public ApplicationPreview (string title, string subtitle, string description, GLib.Icon? icon, GLib.Icon? screenshot);
+ public void set_rating (float rating, uint num_ratings);
+ public GLib.Icon app_icon { get; set; }
+ public string copyright { get; set; }
+ public string last_update { get; set; }
+ public string license { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class AsyncPreview : Unity.Preview {
+ public AsyncPreview ();
+ [CCode (name = "unity_async_preview_preview_ready")]
+ public void emit_preview_ready (Unity.Preview? preview);
+ public AsyncPreview.with_cancellable (GLib.Cancellable cancellable);
+ public GLib.Cancellable cancellable { get; set construct; }
+ public signal void preview_ready (Unity.Preview? preview);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class Category : GLib.Object {
+ public Category (string name, GLib.Icon icon_hint, Unity.CategoryRenderer renderer = CategoryRenderer.VERTICAL_TILE);
+ public Unity.CategoryRenderer default_renderer { get; construct; }
+ public GLib.Icon? icon_hint { get; construct; }
+ public string name { get; construct; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class CheckOptionFilter : Unity.OptionsFilter {
+ public CheckOptionFilter (string id, string display_name, GLib.Icon? icon_hint = null, bool collapsed = false);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class CheckOptionFilterCompact : Unity.OptionsFilter {
+ public CheckOptionFilterCompact (string id, string display_name, GLib.Icon? icon_hint = null, bool collapsed = false);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public abstract class Filter : GLib.Object {
+ public Filter ();
+ public bool collapsed { get; construct; }
+ public string display_name { get; internal set construct; }
+ public bool filtering { get; internal set construct; }
+ public GLib.Icon? icon_hint { get; construct; }
+ public string id { get; construct; }
+ public Unity.FilterRenderer renderer { get; construct; }
+ public bool visible { get; set construct; }
+ public signal void changed ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class FilterOption : GLib.Object {
+ public FilterOption (string id, string display_name, GLib.Icon? icon_hint = null, bool active = false);
+ public bool active { get; internal set construct; }
+ public string display_name { get; construct; }
+ public GLib.Icon icon_hint { get; construct; }
+ public string id { get; construct; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class GenericPreview : Unity.Preview {
+ public GenericPreview (string title, string description, GLib.Icon? image);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class InfoHint : GLib.InitiallyUnowned {
+ public InfoHint (string id, string display_name, GLib.Icon? icon_hint, string data);
+ public InfoHint.with_variant (string id, string display_name, GLib.Icon? icon_hint, GLib.Variant data);
+ public GLib.Variant data { get; construct; }
+ public string display_name { get; construct; }
+ public GLib.Icon? icon_hint { get; construct; }
+ public string id { get; construct; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class Inspector : GLib.Object {
+ public static unowned Unity.Inspector get_default ();
+ public string? unity_bus_name { get; }
+ public bool unity_running { get; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class LauncherEntry : Dee.Serializable, GLib.Object {
+ public static Unity.LauncherEntry get_for_app_uri (string app_uri);
+ public static Unity.LauncherEntry get_for_desktop_file (string desktop_file);
+ public static Unity.LauncherEntry get_for_desktop_id (string desktop_id);
+ public string app_uri { get; set construct; }
+ public int64 count { get; set; }
+ public bool count_visible { get; set; }
+ public double progress { get; set; }
+ public bool progress_visible { get; set; }
+ public Dbusmenu.Menuitem? quicklist { get; set; }
+ public bool urgent { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class LauncherFavorites : GLib.Object {
+ public GLib.AppInfo[] enumerate_app_infos ();
+ public string[] enumerate_ids ();
+ public static unowned Unity.LauncherFavorites get_default ();
+ public bool has_app_id (string app_id);
+ public bool has_app_info (GLib.AppInfo appinfo);
+ public GLib.AppInfo? lookup (string app_id);
+ public signal void changed ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class Lens : GLib.Object {
+ public Lens (string dbus_path_, string id_);
+ public void add_local_scope (Unity.Scope scope);
+ public void export () throws GLib.IOError;
+ public bool active { get; private set; }
+ public GLib.List<Unity.Category> categories { get; set; }
+ public string dbus_path { get; construct; }
+ public bool exported { get; private set; }
+ public GLib.List<Unity.Filter> filters { get; set; }
+ public Unity.MergeStrategy global_merge_strategy { get; set; }
+ public string home_lens_default_name { get; set; }
+ public string id { get; construct; }
+ public Unity.MergeStrategy merge_strategy { get; set; }
+ public string search_hint { get; set; }
+ public bool search_in_global { get; set; }
+ public bool searching { get; private set; }
+ public string sources_display_name { get; set construct; }
+ public bool visible { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class LensSearch : GLib.InitiallyUnowned {
+ public LensSearch (string search_string, GLib.HashTable<string,GLib.Variant> hints, Dee.SerializableModel results_model);
+ [CCode (cname = "unity_lens_search_finished")]
+ public void emit_finished ();
+ public bool equals (Unity.LensSearch? other);
+ public void set_reply_hint (string key, GLib.Variant variant);
+ public GLib.HashTable<string,GLib.Variant> hints { get; construct; }
+ public Dee.SerializableModel results_model { get; construct; }
+ public string search_string { get; construct; }
+ [Signal (action = true)]
+ public signal void finished ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class MoviePreview : Unity.Preview {
+ public MoviePreview (string title, string subtitle, string description, GLib.Icon? image);
+ public void set_rating (float rating, uint num_ratings);
+ public string year { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class MultiRangeFilter : Unity.OptionsFilter {
+ public MultiRangeFilter (string id, string display_name, GLib.Icon? icon_hint = null, bool collapsed = false);
+ public Unity.FilterOption? get_first_active ();
+ public Unity.FilterOption? get_last_active ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class MusicPlayer : GLib.Object {
+ public MusicPlayer (string desktop);
+ public bool add_playlist (Unity.Playlist p);
+ public void edit_playlist_name (string id, string name);
+ public void export ();
+ public Unity.Playlist[] get_playlists ();
+ public bool remove_playlist (Unity.Playlist p);
+ public void unexport ();
+ public GLib.AppInfo app_info { get; construct; }
+ public bool can_go_next { get; set; }
+ public bool can_go_previous { get; set; }
+ public bool can_pause { get; set; }
+ public bool can_play { get; set; }
+ public Unity.Playlist current_playlist { get; set; }
+ public Unity.TrackMetadata current_track { get; set; }
+ public string desktop_file_name { get; construct; }
+ public bool is_blacklisted { get; set; }
+ public Unity.PlaybackState playback_state { get; set; }
+ public Dbusmenu.Menuitem? player_menu { get; set; }
+ public string title { get; set; }
+ public Dbusmenu.Menuitem? track_menu { get; set; }
+ public signal void activate_playlist (GLib.ObjectPath playlist_id);
+ public signal void next ();
+ public signal void play_pause ();
+ public signal void previous ();
+ public signal void raise ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class MusicPreview : Unity.Preview {
+ public enum TrackState {
+ STOPPED,
+ PLAYING,
+ PAUSED
+ }
+ public MusicPreview (string title, string subtitle, GLib.Icon? image);
+ public void add_track (Unity.TrackMetadata track);
+ public float current_progress { get; set; }
+ public Unity.MusicPreview.TrackState current_track_state { get; set; }
+ public string current_track_uri { get; set; }
+ public signal void pause (string uri);
+ public signal void play (string uri);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class OptionsFilter : Unity.Filter {
+ public enum SortType {
+ MANUAL,
+ DISPLAY_NAME,
+ ID
+ }
+ public GLib.List<Unity.FilterOption> options;
+ public OptionsFilter ();
+ public Unity.FilterOption add_option (string id, string display_name, GLib.Icon? icon_hint = null);
+ public Unity.FilterOption? get_option (string id);
+ public bool remove_option (string id);
+ public Unity.OptionsFilter.SortType sort_type { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class Playlist : GLib.Object {
+ public Playlist (string id);
+ public GLib.DateTime creation_date { get; set; }
+ public GLib.Icon icon { get; set; }
+ public string id { get; construct; }
+ public GLib.DateTime last_play_date { get; set; }
+ public GLib.DateTime modification_date { get; set; }
+ public string name { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class PreferencesManager : GLib.Object {
+ public enum RemoteContent {
+ ALL,
+ NONE
+ }
+ public static Unity.PreferencesManager get_default ();
+ public Unity.PreferencesManager.RemoteContent remote_content_search { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public abstract class Preview : GLib.Object, Dee.Serializable {
+ public Preview ();
+ public void add_action (Unity.PreviewAction action);
+ public void add_info (Unity.InfoHint info_hint);
+ public string description_markup { get; set; }
+ public GLib.Icon? image { get; set; }
+ public string image_source_uri { get; set; }
+ public string subtitle { get; set; }
+ public string title { get; set; }
+ public signal void closed ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class PreviewAction : GLib.Object, Dee.Serializable {
+ public PreviewAction (string id, string display_name, GLib.Icon? icon_hint);
+ public PreviewAction.with_layout_hint (string id, string display_name, GLib.Icon? icon_hint, Unity.LayoutHint layout);
+ public string display_name { get; construct; }
+ public string extra_text { get; set; }
+ public GLib.HashTable<string,GLib.Variant>? hints { get; }
+ public GLib.Icon? icon_hint { get; construct; }
+ public string id { get; construct; }
+ public Unity.LayoutHint layout_hint { get; construct; }
+ public signal Unity.ActivationResponse activated (string uri);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class RadioOptionFilter : Unity.OptionsFilter {
+ public RadioOptionFilter (string id, string display_name, GLib.Icon? icon_hint = null, bool collapsed = false);
+ public Unity.FilterOption? get_active_option ();
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class RatingsFilter : Unity.Filter {
+ public RatingsFilter (string id, string display_name, GLib.Icon? icon_hint = null, bool collapsed = false);
+ public float rating { get; internal set construct; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class Scope : GLib.Object {
+ public Scope (string dbus_path_);
+ public void export () throws GLib.IOError;
+ public Unity.Filter? get_filter (string id);
+ public void invalidate_search (Unity.SearchType search_type);
+ public void queue_search_changed (Unity.SearchType search_type);
+ public bool active { get; set; }
+ public string dbus_path { get; construct; }
+ public bool exported { get; private set; }
+ public GLib.List<Unity.Filter> filters { get; }
+ public Dee.SerializableModel global_results_model { get; }
+ public bool provides_personal_content { get; set; }
+ public Dee.SerializableModel results_model { get; }
+ public bool search_in_global { get; set; }
+ public Unity.OptionsFilter sources { get; internal set; }
+ public signal Unity.ActivationResponse? activate_uri (string uri);
+ public signal void active_sources_changed (string[] active_ids);
+ public signal void filters_changed ();
+ [Signal (detailed = true)]
+ public signal string generate_search_key (Unity.LensSearch search);
+ public signal Unity.Preview? preview_uri (string uri);
+ public signal void search_changed (Unity.LensSearch search, Unity.SearchType search_type, GLib.Cancellable cancellable);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class SocialPreview : Unity.Preview {
+ public class Comment : GLib.InitiallyUnowned {
+ public Comment (string id, string name, string text, string time);
+ public string id { get; construct; }
+ public string name { get; construct; }
+ public string text { get; construct; }
+ public string time { get; construct; }
+ }
+ public SocialPreview (string sender, string subtitle, string content, GLib.Icon? avatar);
+ public void add_comment (Unity.SocialPreview.Comment comment);
+ public GLib.Icon avatar { get; set; }
+ public string content { get; set; }
+ public string sender { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public class TrackMetadata : GLib.Object {
+ public TrackMetadata ();
+ public TrackMetadata.full (string uri, int track_no, string title, string artist, string album, uint length);
+ public string album { get; set; }
+ public GLib.Icon art_icon { get; set; }
+ public GLib.File art_location { get; set; }
+ public string artist { get; set; }
+ public uint length { get; set; }
+ public string title { get; set; }
+ public int track_no { get; set; }
+ public string uri { get; set; }
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public interface MergeStrategy : GLib.Object {
+ public abstract unowned Dee.ModelIter? merge_result (Dee.Model target, GLib.Variant[] row);
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public struct ActivePlaylistContainer {
+ public bool valid;
+ public Unity.PlaylistDetails details;
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public struct PlaylistDetails {
+ public GLib.ObjectPath id;
+ public string name;
+ public string icon_name;
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum CategoryRenderer {
+ VERTICAL_TILE,
+ HORIZONTAL_TILE,
+ LIST_TILE,
+ FLOW
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum CategoryType {
+ NONE,
+ APPLICATION,
+ BOOK,
+ MUSIC,
+ MOVIE,
+ GAMES,
+ ELECTRONICS,
+ COMPUTERS,
+ OFFICE,
+ HOME,
+ GARDEN,
+ PETS,
+ TOYS,
+ CHILDREN,
+ BABY,
+ CLOTHES,
+ SHOES,
+ WATCHES,
+ SPORTS,
+ OUTDOORS,
+ GROCERY,
+ HEALTH,
+ BEAUTY,
+ DIY,
+ TOOLS,
+ CAR,
+ N_CATEGORIES
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum FilterRenderer {
+ CHECK_OPTIONS,
+ RADIO_OPTIONS,
+ MULTIRANGE,
+ RATINGS,
+ CHECK_OPTIONS_COMPACT
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum HandledType {
+ NOT_HANDLED,
+ SHOW_DASH,
+ HIDE_DASH,
+ GOTO_DASH_URI,
+ SHOW_PREVIEW
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum IconSizeHint {
+ DEFAULT,
+ SMALL,
+ LARGE
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum LayoutHint {
+ NONE,
+ LEFT,
+ RIGHT,
+ TOP,
+ BOTTOM
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum PlaybackState {
+ PLAYING,
+ PAUSED
+ }
+ [CCode (cheader_filename = "unity.h")]
+ public enum SearchType {
+ DEFAULT,
+ GLOBAL,
+ N_TYPES
+ }
+}
diff --git a/vapi/webkitgtk-3.0.deps b/vapi/webkitgtk-3.0.deps
new file mode 100644
index 0000000..91b1dfe
--- /dev/null
+++ b/vapi/webkitgtk-3.0.deps
@@ -0,0 +1,8 @@
+atk
+gio-2.0
+cairo
+pango
+gdk-pixbuf-2.0
+gdk-3.0
+gtk+-3.0
+libsoup-2.4
diff --git a/vapi/webkitgtk-3.0.vapi b/vapi/webkitgtk-3.0.vapi
new file mode 100644
index 0000000..9e0d347
--- /dev/null
+++ b/vapi/webkitgtk-3.0.vapi
@@ -0,0 +1,653 @@
+/* webkit-1.0.vapi generated by vapigen, do not modify. */
+
+[CCode (cprefix = "WebKit", lower_case_cprefix = "webkit_")]
+namespace WebKit {
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class Download : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public Download (WebKit.NetworkRequest request);
+ public void cancel ();
+ public uint64 get_current_size ();
+ public unowned string get_destination_uri ();
+ public double get_elapsed_time ();
+ public unowned WebKit.NetworkRequest get_network_request ();
+ public unowned WebKit.NetworkResponse get_network_response ();
+ public double get_progress ();
+ public WebKit.DownloadStatus get_status ();
+ public unowned string get_suggested_filename ();
+ public uint64 get_total_size ();
+ public unowned string get_uri ();
+ public void set_destination_uri (string destination_uri);
+ public void start ();
+ public uint64 current_size { get; }
+ public string destination_uri { get; set; }
+ public WebKit.NetworkRequest network_request { get; construct; }
+ public WebKit.NetworkResponse network_response { get; construct; }
+ public double progress { get; }
+ public WebKit.DownloadStatus status { get; }
+ public string suggested_filename { get; }
+ public uint64 total_size { get; }
+ public virtual signal bool error (int p0, int p1, string p2);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class GeolocationPolicyDecision : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected GeolocationPolicyDecision ();
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class HitTestResult : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected HitTestResult ();
+ [NoAccessorMethod]
+ public WebKit.HitTestResultContext context { get; construct; }
+ [NoAccessorMethod]
+ public string image_uri { owned get; construct; }
+ [NoAccessorMethod]
+ public string link_uri { owned get; construct; }
+ [NoAccessorMethod]
+ public string media_uri { owned get; construct; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class NetworkRequest : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public NetworkRequest (string uri);
+ public unowned Soup.Message get_message ();
+ public unowned string get_uri ();
+ public void set_uri (string uri);
+ public Soup.Message message { get; construct; }
+ public string uri { get; set; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class NetworkResponse : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public NetworkResponse (string uri);
+ public unowned Soup.Message get_message ();
+ public unowned string get_uri ();
+ public void set_uri (string uri);
+ public Soup.Message message { get; construct; }
+ public string uri { get; set; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class SecurityOrigin : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected SecurityOrigin ();
+ public unowned GLib.List<WebKit.WebDatabase> get_all_web_databases ();
+ public unowned string get_host ();
+ public uint get_port ();
+ public unowned string get_protocol ();
+ public uint64 get_web_database_quota ();
+ public uint64 get_web_database_usage ();
+ public void set_web_database_quota (uint64 quota);
+ public string host { get; }
+ public uint port { get; }
+ public string protocol { get; }
+ public uint64 web_database_quota { get; set; }
+ public uint64 web_database_usage { get; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class SoupAuthDialog : GLib.Object, Soup.SessionFeature {
+ [CCode (has_construct_function = false)]
+ protected SoupAuthDialog ();
+ public virtual signal unowned Gtk.Widget current_toplevel (Soup.Message message);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebBackForwardList : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected WebBackForwardList ();
+ public void add_item (WebKit.WebHistoryItem history_item);
+ public void clear ();
+ public bool contains_item (WebKit.WebHistoryItem history_item);
+ public unowned WebKit.WebHistoryItem get_back_item ();
+ public int get_back_length ();
+ public unowned GLib.List<WebKit.WebHistoryItem> get_back_list_with_limit (int limit);
+ public unowned WebKit.WebHistoryItem get_current_item ();
+ public unowned WebKit.WebHistoryItem get_forward_item ();
+ public int get_forward_length ();
+ public unowned GLib.List<WebKit.WebHistoryItem> get_forward_list_with_limit (int limit);
+ public int get_limit ();
+ public unowned WebKit.WebHistoryItem get_nth_item (int index);
+ public void go_back ();
+ public void go_forward ();
+ public void go_to_item (WebKit.WebHistoryItem history_item);
+ public void set_limit (int limit);
+ [CCode (has_construct_function = false)]
+ public WebBackForwardList.with_web_view (WebKit.WebView web_view);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebDataSource : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebDataSource ();
+ public unowned GLib.StringBuilder get_data ();
+ public unowned string get_encoding ();
+ public unowned WebKit.NetworkRequest get_initial_request ();
+ public unowned WebKit.WebResource get_main_resource ();
+ public unowned WebKit.NetworkRequest get_request ();
+ public unowned GLib.List<WebKit.WebResource> get_subresources ();
+ public unowned string get_unreachable_uri ();
+ public unowned WebKit.WebFrame get_web_frame ();
+ public bool is_loading ();
+ [CCode (has_construct_function = false)]
+ public WebDataSource.with_request (WebKit.NetworkRequest request);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebDatabase : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected WebDatabase ();
+ public unowned string get_display_name ();
+ public uint64 get_expected_size ();
+ public unowned string get_filename ();
+ public unowned string get_name ();
+ public unowned WebKit.SecurityOrigin get_security_origin ();
+ public uint64 get_size ();
+ public void remove ();
+ public string display_name { get; }
+ public uint64 expected_size { get; }
+ public string filename { get; }
+ public string name { get; construct; }
+ public WebKit.SecurityOrigin security_origin { get; construct; }
+ public uint64 size { get; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebFrame : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebFrame (WebKit.WebView web_view);
+ public unowned WebKit.WebFrame find_frame (string name);
+ public unowned WebKit.WebDataSource get_data_source ();
+ public Gtk.PolicyType get_horizontal_scrollbar_policy ();
+ public WebKit.LoadStatus get_load_status ();
+ public unowned string get_name ();
+ public unowned WebKit.NetworkResponse get_network_response ();
+ public unowned WebKit.WebFrame get_parent ();
+ public unowned WebKit.WebDataSource get_provisional_data_source ();
+ public unowned WebKit.SecurityOrigin get_security_origin ();
+ public unowned string get_title ();
+ public unowned string get_uri ();
+ public Gtk.PolicyType get_vertical_scrollbar_policy ();
+ public unowned WebKit.WebView get_web_view ();
+ public void load_alternate_string (string content, string base_url, string unreachable_url);
+ public void load_request (WebKit.NetworkRequest request);
+ public void load_string (string content, string mime_type, string encoding, string base_uri);
+ public void load_uri (string uri);
+ public void print ();
+ public Gtk.PrintOperationResult print_full (Gtk.PrintOperation operation, Gtk.PrintOperationAction action) throws GLib.Error;
+ public void reload ();
+ public void stop_loading ();
+ public Gtk.PolicyType horizontal_scrollbar_policy { get; }
+ public WebKit.LoadStatus load_status { get; }
+ public string name { get; }
+ public string title { get; }
+ public string uri { get; }
+ public Gtk.PolicyType vertical_scrollbar_policy { get; }
+ public virtual signal void cleared ();
+ public virtual signal void hovering_over_link (string p0, string p1);
+ public virtual signal void load_committed ();
+ public virtual signal void load_done (bool p0);
+ public virtual signal bool scrollbars_policy_changed ();
+ public virtual signal void title_changed (string p0);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebHistoryItem : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebHistoryItem ();
+ public unowned WebKit.WebHistoryItem copy ();
+ public unowned string get_alternate_title ();
+ public double get_last_visited_time ();
+ public unowned string get_original_uri ();
+ public unowned string get_title ();
+ public unowned string get_uri ();
+ public void set_alternate_title (string title);
+ [CCode (has_construct_function = false)]
+ public WebHistoryItem.with_data (string uri, string title);
+ public string alternate_title { get; set; }
+ public double last_visited_time { get; }
+ public string original_uri { get; }
+ public string title { get; }
+ public string uri { get; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebInspector : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected WebInspector ();
+ public void close ();
+ public unowned string get_inspected_uri ();
+ public unowned WebKit.WebView get_web_view ();
+ public void inspect_coordinates (double x, double y);
+ public void show ();
+ public string inspected_uri { get; }
+ [NoAccessorMethod]
+ public bool javascript_profiling_enabled { get; set; }
+ [NoAccessorMethod]
+ public bool timeline_profiling_enabled { get; set; }
+ public WebKit.WebView web_view { get; }
+ public virtual signal bool attach_window ();
+ public virtual signal bool close_window ();
+ public virtual signal bool detach_window ();
+ public virtual signal void finished ();
+ public virtual signal unowned WebKit.WebView inspect_web_view (WebKit.WebView p0);
+ public virtual signal bool show_window ();
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebNavigationAction : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected WebNavigationAction ();
+ public int get_button ();
+ public int get_modifier_state ();
+ public unowned string get_original_uri ();
+ public WebKit.WebNavigationReason get_reason ();
+ public unowned string get_target_frame ();
+ public void set_original_uri (string originalUri);
+ public void set_reason (WebKit.WebNavigationReason reason);
+ public int button { get; construct; }
+ public int modifier_state { get; construct; }
+ public string original_uri { get; set construct; }
+ public WebKit.WebNavigationReason reason { get; set construct; }
+ public string target_frame { get; construct; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebPolicyDecision : GLib.Object {
+ [CCode (has_construct_function = false)]
+ protected WebPolicyDecision ();
+ public void download ();
+ public void ignore ();
+ public void use ();
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebResource : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebResource (string data, ssize_t size, string uri, string mime_type, string encoding, string frame_name);
+ public unowned GLib.StringBuilder get_data ();
+ public unowned string get_encoding ();
+ public unowned string get_frame_name ();
+ public unowned string get_mime_type ();
+ public unowned string get_uri ();
+ public string encoding { get; }
+ public string frame_name { get; }
+ public string mime_type { get; }
+ public string uri { get; construct; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebSettings : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebSettings ();
+ public WebKit.WebSettings copy ();
+ public unowned string get_user_agent ();
+ [NoAccessorMethod]
+ public bool auto_load_images { get; set construct; }
+ [NoAccessorMethod]
+ public bool auto_resize_window { get; set construct; }
+ [NoAccessorMethod]
+ public bool auto_shrink_images { get; set construct; }
+ [NoAccessorMethod]
+ public string cursive_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public string default_encoding { owned get; set construct; }
+ [NoAccessorMethod]
+ public string default_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public int default_font_size { get; set construct; }
+ [NoAccessorMethod]
+ public int default_monospace_font_size { get; set construct; }
+ [NoAccessorMethod]
+ public WebKit.EditingBehavior editing_behavior { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_caret_browsing { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_default_context_menu { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_developer_extras { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_dom_paste { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_file_access_from_file_uris { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_html5_database { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_html5_local_storage { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_java_applet { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_offline_web_application_cache { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_page_cache { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_plugins { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_private_browsing { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_scripts { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_site_specific_quirks { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_spatial_navigation { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_spell_checking { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_universal_access_from_file_uris { get; set construct; }
+ [NoAccessorMethod]
+ public bool enable_xss_auditor { get; set construct; }
+ [NoAccessorMethod]
+ public bool enforce_96_dpi { get; set construct; }
+ [NoAccessorMethod]
+ public string fantasy_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public bool javascript_can_access_clipboard { get; set construct; }
+ [NoAccessorMethod]
+ public bool javascript_can_open_windows_automatically { get; set construct; }
+ [NoAccessorMethod]
+ public int minimum_font_size { get; set construct; }
+ [NoAccessorMethod]
+ public int minimum_logical_font_size { get; set construct; }
+ [NoAccessorMethod]
+ public string monospace_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public bool print_backgrounds { get; set construct; }
+ [NoAccessorMethod]
+ public bool resizable_text_areas { get; set construct; }
+ [NoAccessorMethod]
+ public string sans_serif_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public string serif_font_family { owned get; set construct; }
+ [NoAccessorMethod]
+ public string spell_checking_languages { owned get; set construct; }
+ [NoAccessorMethod]
+ public bool tab_key_cycles_through_elements { get; set construct; }
+ [NoAccessorMethod]
+ public string user_agent { owned get; set construct; }
+ [NoAccessorMethod]
+ public string user_stylesheet_uri { owned get; set construct; }
+ [NoAccessorMethod]
+ public float zoom_step { get; set construct; }
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebView : Gtk.Container, Atk.Implementor, Gtk.Buildable {
+ [CCode (type = "GtkWidget*", has_construct_function = false)]
+ public WebView ();
+ public bool can_copy_clipboard ();
+ public bool can_cut_clipboard ();
+ public bool can_go_back ();
+ public bool can_go_back_or_forward (int steps);
+ public bool can_go_forward ();
+ public bool can_paste_clipboard ();
+ public bool can_redo ();
+ public bool can_show_mime_type (string mime_type);
+ public bool can_undo ();
+ [NoWrapper]
+ public virtual unowned string choose_file (WebKit.WebFrame frame, string old_file);
+ public void delete_selection ();
+ public void execute_script (string script);
+ public unowned WebKit.WebBackForwardList get_back_forward_list ();
+ public unowned Gtk.TargetList get_copy_target_list ();
+ public unowned string get_custom_encoding ();
+ public bool get_editable ();
+ public unowned string get_encoding ();
+ public unowned WebKit.WebFrame get_focused_frame ();
+ public bool get_full_content_zoom ();
+ public unowned WebKit.HitTestResult get_hit_test_result (Gdk.EventButton event);
+ public unowned string get_icon_uri ();
+ public unowned WebKit.WebInspector get_inspector ();
+ public WebKit.LoadStatus get_load_status ();
+ public unowned WebKit.WebFrame get_main_frame ();
+ public unowned Gtk.TargetList get_paste_target_list ();
+ public double get_progress ();
+ public unowned WebKit.WebSettings get_settings ();
+ public unowned string get_title ();
+ public bool get_transparent ();
+ public unowned string get_uri ();
+ public bool get_view_source_mode ();
+ public unowned WebKit.WebWindowFeatures get_window_features ();
+ public float get_zoom_level ();
+ public void go_back ();
+ public void go_back_or_forward (int steps);
+ public void go_forward ();
+ public bool go_to_back_forward_item (WebKit.WebHistoryItem item);
+ public bool has_selection ();
+ public void load_html_string (string content, string base_uri);
+ public void load_request (WebKit.NetworkRequest request);
+ public void load_string (string content, string mime_type, string encoding, string base_uri);
+ public void load_uri (string uri);
+ public uint mark_text_matches (string str, bool case_sensitive, uint limit);
+ public void open (string uri);
+ public void reload ();
+ public void reload_bypass_cache ();
+ public bool search_text (string text, bool case_sensitive, bool forward, bool wrap);
+ public void set_custom_encoding (string encoding);
+ public void set_editable (bool flag);
+ public void set_full_content_zoom (bool full_content_zoom);
+ public void set_highlight_text_matches (bool highlight);
+ public void set_maintains_back_forward_list (bool flag);
+ public void set_settings (WebKit.WebSettings settings);
+ public void set_transparent (bool flag);
+ public void set_view_source_mode (bool view_source_mode);
+ public void set_zoom_level (float zoom_level);
+ public void stop_loading ();
+ public void unmark_text_matches ();
+ public void zoom_in ();
+ public void zoom_out ();
+ public Gtk.TargetList copy_target_list { get; }
+ public string custom_encoding { get; set; }
+ public bool editable { get; set; }
+ public string encoding { get; }
+ public bool full_content_zoom { get; set; }
+ public string icon_uri { get; }
+ [NoAccessorMethod]
+ public Gtk.IMContext im_context { owned get; }
+ public WebKit.LoadStatus load_status { get; }
+ public Gtk.TargetList paste_target_list { get; }
+ public double progress { get; }
+ public WebKit.WebSettings settings { get; set; }
+ public string title { get; }
+ public bool transparent { get; set; }
+ public string uri { get; }
+ [NoAccessorMethod]
+ public WebKit.WebInspector web_inspector { owned get; }
+ [NoAccessorMethod]
+ public WebKit.WebWindowFeatures window_features { owned get; set; }
+ public float zoom_level { get; set; }
+ public virtual signal bool close_web_view ();
+ public virtual signal bool console_message (string message, int line_number, string source_id);
+ [HasEmitter]
+ public virtual signal void copy_clipboard ();
+ public virtual signal unowned Gtk.Widget create_plugin_widget (string p0, string p1, GLib.HashTable p2);
+ public virtual signal WebKit.WebView create_web_view (WebKit.WebFrame web_frame);
+ [HasEmitter]
+ public virtual signal void cut_clipboard ();
+ public virtual signal void database_quota_exceeded (GLib.Object p0, GLib.Object p1);
+ public virtual signal void document_load_finished (WebKit.WebFrame p0);
+ public virtual signal bool download_requested (GLib.Object p0);
+ public virtual signal void geolocation_policy_decision_cancelled (WebKit.WebFrame p0);
+ public virtual signal bool geolocation_policy_decision_requested (WebKit.WebFrame p0, WebKit.GeolocationPolicyDecision p1);
+ public virtual signal void hovering_over_link (string? p0, string p1);
+ public virtual signal void icon_loaded (string p0);
+ public virtual signal void load_committed (WebKit.WebFrame p0);
+ public virtual signal bool load_error (WebKit.WebFrame p0, string p1, GLib.Error p2);
+ public virtual signal void load_finished (WebKit.WebFrame p0);
+ public virtual signal void load_progress_changed (int p0);
+ public virtual signal void load_started (WebKit.WebFrame p0);
+ public virtual signal bool mime_type_policy_decision_requested (WebKit.WebFrame p0, WebKit.NetworkRequest p1, string p2, WebKit.WebPolicyDecision p3);
+ [HasEmitter]
+ public virtual signal bool move_cursor (Gtk.MovementStep step, int count);
+ public virtual signal bool navigation_policy_decision_requested (WebKit.WebFrame p0, WebKit.NetworkRequest p1, WebKit.WebNavigationAction p2, WebKit.WebPolicyDecision p3);
+ public virtual signal WebKit.NavigationResponse navigation_requested (WebKit.WebFrame frame, WebKit.NetworkRequest request);
+ public virtual signal bool new_window_policy_decision_requested (WebKit.WebFrame p0, WebKit.NetworkRequest p1, WebKit.WebNavigationAction p2, WebKit.WebPolicyDecision p3);
+ [HasEmitter]
+ public virtual signal void paste_clipboard ();
+ public virtual signal void populate_popup (Gtk.Menu p0);
+ public virtual signal bool print_requested (WebKit.WebFrame p0);
+ [HasEmitter]
+ public virtual signal void redo ();
+ public virtual signal void resource_request_starting (WebKit.WebFrame p0, WebKit.WebResource p1, WebKit.NetworkRequest p2, WebKit.NetworkResponse p3);
+ public virtual signal bool script_alert (WebKit.WebFrame frame, string alert_message);
+ public virtual signal bool script_confirm (WebKit.WebFrame frame, string confirm_message, void* did_confirm);
+ public virtual signal bool script_prompt (WebKit.WebFrame frame, string message, string default_value, void* value);
+ [HasEmitter]
+ public virtual signal void select_all ();
+ public virtual signal void selection_changed ();
+ public virtual signal void set_scroll_adjustments (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment);
+ public virtual signal void status_bar_text_changed (string p0);
+ public virtual signal void title_changed (WebKit.WebFrame p0, string p1);
+ [HasEmitter]
+ public virtual signal void undo ();
+ public virtual signal bool web_view_ready ();
+ public virtual signal void window_object_cleared (WebKit.WebFrame frame, void* context, void* window_object);
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public class WebWindowFeatures : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public WebWindowFeatures ();
+ public bool equal (WebKit.WebWindowFeatures features2);
+ [NoAccessorMethod]
+ public bool fullscreen { get; set construct; }
+ [NoAccessorMethod]
+ public int height { get; set construct; }
+ [NoAccessorMethod]
+ public bool locationbar_visible { get; set construct; }
+ [NoAccessorMethod]
+ public bool menubar_visible { get; set construct; }
+ [NoAccessorMethod]
+ public bool scrollbar_visible { get; set construct; }
+ [NoAccessorMethod]
+ public bool statusbar_visible { get; set construct; }
+ [NoAccessorMethod]
+ public bool toolbar_visible { get; set construct; }
+ [NoAccessorMethod]
+ public int width { get; set construct; }
+ [NoAccessorMethod]
+ public int x { get; set construct; }
+ [NoAccessorMethod]
+ public int y { get; set construct; }
+ }
+ [CCode (cprefix = "WEBKIT_CACHE_MODEL_", cheader_filename = "webkit/webkit.h")]
+ public enum CacheModel {
+ DOCUMENT_VIEWER,
+ WEB_BROWSER
+ }
+ [CCode (cprefix = "WEBKIT_DOWNLOAD_ERROR_", cheader_filename = "webkit/webkit.h")]
+ public enum DownloadError {
+ CANCELLED_BY_USER,
+ DESTINATION,
+ NETWORK
+ }
+ [CCode (cprefix = "WEBKIT_DOWNLOAD_STATUS_", cheader_filename = "webkit/webkit.h")]
+ public enum DownloadStatus {
+ ERROR,
+ CREATED,
+ STARTED,
+ CANCELLED,
+ FINISHED
+ }
+ [CCode (cprefix = "WEBKIT_EDITING_BEHAVIOR_", cheader_filename = "webkit/webkit.h")]
+ public enum EditingBehavior {
+ MAC,
+ WINDOWS
+ }
+ [CCode (cprefix = "WEBKIT_HIT_TEST_RESULT_CONTEXT_", cheader_filename = "webkit/webkit.h")]
+ [Flags]
+ public enum HitTestResultContext {
+ DOCUMENT,
+ LINK,
+ IMAGE,
+ MEDIA,
+ SELECTION,
+ EDITABLE
+ }
+ [CCode (cprefix = "WEBKIT_LOAD_", cheader_filename = "webkit/webkit.h")]
+ public enum LoadStatus {
+ PROVISIONAL,
+ COMMITTED,
+ FINISHED,
+ FIRST_VISUALLY_NON_EMPTY_LAYOUT,
+ FAILED
+ }
+ [CCode (cprefix = "WEBKIT_NAVIGATION_RESPONSE_", cheader_filename = "webkit/webkit.h")]
+ public enum NavigationResponse {
+ ACCEPT,
+ IGNORE,
+ DOWNLOAD
+ }
+ [CCode (cprefix = "WEBKIT_NETWORK_ERROR_", cheader_filename = "webkit/webkit.h")]
+ public enum NetworkError {
+ FAILED,
+ TRANSPORT,
+ UNKNOWN_PROTOCOL,
+ CANCELLED,
+ FILE_DOES_NOT_EXIST
+ }
+ [CCode (cprefix = "WEBKIT_PLUGIN_ERROR_", cheader_filename = "webkit/webkit.h")]
+ public enum PluginError {
+ FAILED,
+ CANNOT_FIND_PLUGIN,
+ CANNOT_LOAD_PLUGIN,
+ JAVA_UNAVAILABLE,
+ CONNECTION_CANCELLED,
+ WILL_HANDLE_LOAD
+ }
+ [CCode (cprefix = "WEBKIT_POLICY_ERROR_", cheader_filename = "webkit/webkit.h")]
+ public enum PolicyError {
+ FAILED,
+ CANNOT_SHOW_MIME_TYPE,
+ CANNOT_SHOW_URL,
+ FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE,
+ CANNOT_USE_RESTRICTED_PORT
+ }
+ [CCode (cprefix = "WEBKIT_WEB_NAVIGATION_REASON_", cheader_filename = "webkit/webkit.h")]
+ public enum WebNavigationReason {
+ LINK_CLICKED,
+ FORM_SUBMITTED,
+ BACK_FORWARD,
+ RELOAD,
+ FORM_RESUBMITTED,
+ OTHER
+ }
+ [CCode (cprefix = "WEBKIT_WEB_VIEW_TARGET_INFO_", cheader_filename = "webkit/webkit.h")]
+ public enum WebViewTargetInfo {
+ HTML,
+ TEXT,
+ IMAGE,
+ URI_LIST,
+ NETSCAPE_URL
+ }
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public const int MAJOR_VERSION;
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public const int MICRO_VERSION;
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public const int MINOR_VERSION;
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public const int USER_AGENT_MAJOR_VERSION;
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public const int USER_AGENT_MINOR_VERSION;
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static bool check_version (uint major, uint minor, uint micro);
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void geolocation_policy_allow (WebKit.GeolocationPolicyDecision decision);
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void geolocation_policy_deny (WebKit.GeolocationPolicyDecision decision);
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static WebKit.CacheModel get_cache_model ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static unowned Soup.Session get_default_session ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static uint64 get_default_web_database_quota ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static unowned string get_web_database_directory_path ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static uint major_version ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static uint micro_version ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static uint minor_version ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static GLib.Quark network_error_quark ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static GLib.Quark plugin_error_quark ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static GLib.Quark policy_error_quark ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void remove_all_web_databases ();
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void set_cache_model (WebKit.CacheModel cache_model);
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void set_default_web_database_quota (uint64 defaultQuota);
+ [CCode (cheader_filename = "webkit/webkit.h")]
+ public static void set_web_database_directory_path (string path);
+}